Teuchos - Trilinos Tools Package Version of the Day
Loading...
Searching...
No Matches
Teuchos_ParameterListModifier.cpp
1// @HEADER
2// ***********************************************************************
3//
4// Teuchos: Common Tools Package
5// Copyright (2004) Sandia Corporation
6//
7// Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
8// license for use of this work by or on behalf of the U.S. Government.
9//
10// Redistribution and use in source and binary forms, with or without
11// modification, are permitted provided that the following conditions are
12// met:
13//
14// 1. Redistributions of source code must retain the above copyright
15// notice, this list of conditions and the following disclaimer.
16//
17// 2. Redistributions in binary form must reproduce the above copyright
18// notice, this list of conditions and the following disclaimer in the
19// documentation and/or other materials provided with the distribution.
20//
21// 3. Neither the name of the Corporation nor the names of the
22// contributors may be used to endorse or promote products derived from
23// this software without specific prior written permission.
24//
25// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
26// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
29// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36//
37// Questions? Contact Michael A. Heroux (maherou@sandia.gov)
38//
39// ***********************************************************************
40// @HEADER
41
42
45#include "Teuchos_StrUtils.hpp"
46
47namespace Teuchos {
48
49
50// Constructors and/or destructors
52 :name_(name_in)
53{}
54
56{}
57
58
59void ParameterListModifier::printDoc(std::string const& docString, std::ostream &out) const
60{
61 StrUtils::printLines(out,"# ",docString);
62 out << "# Modifier Used: " << name_ << std::endl;
63}
64
65
67 const std::string &base_name, const bool &find_parameters, const bool &find_sublists) const
68{
69 Array<std::string> matches(0);
71 for (itr = pl.begin(); itr != pl.end(); ++itr) {
72 const std::string &name = pl.name(itr);
73 std::size_t found = name.find(base_name);
74 if (found == 0){
75 if (pl.isSublist(name)){
76 if (find_sublists){
77 matches.push_back(name);
78 }
79 } else{
80 if (find_parameters){
81 matches.push_back(name);
82 }
83 }
84 }
85 }
86 return matches;
87}
88
89
91 const std::string &param_template_name, ParameterList &pl, ParameterList &valid_pl,
92 const Array<std::string> &exclude_parameters) const
93{
94 int replacements = 0;
95 auto ignore_names = exclude_parameters;
96 std::sort(ignore_names.begin(), ignore_names.end());
98 if (valid_pl.isParameter(param_template_name)){
99 ParameterEntry &valid_pl_entry = valid_pl.getEntry(param_template_name);
100 for (itr = pl.begin(); itr != pl.end(); ++itr) {
101 const std::string &param_name = pl.name(itr);
102 if (!pl.isSublist(param_name)){
103 if (!std::binary_search(ignore_names.begin(), ignore_names.end(), param_name)){
104 valid_pl.setEntry(param_name, valid_pl_entry);
105 replacements += 1;
106 }
107 }
108 }
109 valid_pl.remove(param_template_name);
110 }
111 return replacements;
112}
113
114
116 const std::string &sublist_template_name, ParameterList &pl, ParameterList &valid_pl,
117 const Array<std::string> &exclude_sublists) const
118{
119 int replacements = 0;
120 auto ignore_names = exclude_sublists;
121 std::sort(ignore_names.begin(), ignore_names.end());
123 if (valid_pl.isSublist(sublist_template_name)){
124 ParameterList &valid_pl_sublist = valid_pl.get<ParameterList>(sublist_template_name);
125 for (itr = pl.begin(); itr != pl.end(); ++itr) {
126 const std::string &subname = pl.name(itr);
127 if (pl.isSublist(subname)){
128 if (!std::binary_search(ignore_names.begin(), ignore_names.end(), subname)){
129 valid_pl.set(subname, valid_pl_sublist);
130 replacements += 1;
131 }
132 }
133 }
134 valid_pl.remove(sublist_template_name);
135 }
136 return replacements;
137}
138
139
141 const std::string &base_name, ParameterList &pl, ParameterList &valid_pl,
142 const bool &allow_base_name) const
143{
144 int replacements = 0;
145 bool delete_base_name = true;
146 if (valid_pl.isSublist(base_name)){
147 if (pl.isSublist(base_name)){
148 TEUCHOS_TEST_FOR_EXCEPTION(!allow_base_name, std::logic_error,
149 "Sublist can't have the same name as the parameter template name "
150 "without `allow_base_name=true`.");
151 delete_base_name = false;
152 }
153 Array<std::string> matches = findMatchingBaseNames(pl, base_name, false, true);
154 replacements = matches.length();
155 for (const std::string &match_name : matches){
156 valid_pl.set(match_name, valid_pl.get<ParameterList>(base_name));
157 }
158 if (delete_base_name){
159 valid_pl.remove(base_name);
160 }
161 }
162 return replacements;
163}
164
165
166int ParameterListModifier::setDefaultsInSublists(const std::string &param_name,
167 ParameterList &pl, const Array<std::string> &sublist_names,
168 const bool remove_param) const
169{
170 int num_defaults = 0;
171 if (pl.isParameter(param_name)){
172 for (const std::string &sublist_name : sublist_names){
173 if (pl.isSublist(sublist_name)){
174 ParameterList &sublist = pl.sublist(sublist_name);
175 if (!sublist.isParameter(param_name)){
176 ParameterEntry &pl_entry = pl.getEntry(param_name);
177 sublist.setEntry(param_name, pl_entry);
178 }
179 }
180 }
181 if (remove_param){
182 pl.remove(param_name);
183 }
184 }
185 return num_defaults;
186}
187
188
189} // namespace Teuchos
Parameter List Modifier class.
Templated Parameter List class.
A std::string utilities class for Teuchos.
Replacement for std::vector that is compatible with the Teuchos Memory Management classes.
int length() const
Return number of elements in the array.
void push_back(const value_type &x)
This object is held as the "value" in the Teuchos::ParameterList std::map.
int expandSublistsUsingBaseName(const std::string &baseName, ParameterList &paramList, ParameterList &validParamList, const bool &allowBaseName=true) const
Create sublists in the valid parameter list using a base name and the corresponding sublists in the p...
int expandParameters(const std::string &paramTemplateName, ParameterList &paramList, ParameterList &validParamList, const Array< std::string > &excludeParameters=Array< std::string >()) const
Create parameters in the valid parameter list using a template parameter from the valid parameter lis...
ParameterListModifier()=default
Constructor.
void printDoc(std::string const &docString, std::ostream &out) const
Print documentation for this parameter list modifier.
int setDefaultsInSublists(const std::string &paramName, ParameterList &paramList, const Array< std::string > &sublistNames, const bool removeParam=true) const
Copy a parameter into desired sublists.
Array< std::string > findMatchingBaseNames(const ParameterList &paramList, const std::string &baseName, const bool &findParameters=true, const bool &findSublists=true) const
Find the parameters and/or sublists with matching base names.
int expandSublists(const std::string &sublistTemplateName, ParameterList &paramList, ParameterList &validParamList, const Array< std::string > &excludeSublists=Array< std::string >()) const
Create sublists in the valid parameter list using a template parameter from the valid parameter list ...
A list of parameters of arbitrary type.
ConstIterator end() const
An iterator pointing beyond the last entry.
ParameterList & sublist(const std::string &name, bool mustAlreadyExist=false, const std::string &docString="")
Creates an empty sublist and returns a reference to the sublist name. If the list already exists,...
ParameterList & set(std::string const &name, T const &value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
Set a parameter whose value has type T.
const std::string & name() const
The name of this ParameterList.
bool isSublist(const std::string &name) const
Whether the given sublist exists in this list.
params_t::ConstIterator ConstIterator
Parameter container const iterator typedef.
ConstIterator begin() const
An iterator pointing to the first entry.
ParameterEntry & getEntry(const std::string &name)
Retrieves an entry with the name name.
ParameterList & setEntry(const std::string &name, const ParameterEntry &entry)
Set a parameter directly as a ParameterEntry.
bool isParameter(const std::string &name) const
Whether the given parameter exists in this list.
T & get(const std::string &name, T def_value)
Return the parameter's value, or the default value if it is not there.
bool remove(std::string const &name, bool throwIfNotExists=true)
Remove a parameter (does not depend on the type of the parameter).
static std::ostream & printLines(std::ostream &os, const std::string &linePrefix, const std::string &lines)
Print lines with prefix first.
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Macro for throwing an exception with breakpointing to ease debugging.
The Teuchos namespace contains all of the classes, structs and enums used by Teuchos,...