Teuchos - Trilinos Tools Package Version of the Day
Loading...
Searching...
No Matches
Teuchos_ParameterList.cpp
1// @HEADER
2// *****************************************************************************
3// Teuchos: Common Tools Package
4//
5// Copyright 2004 NTESS and the Teuchos contributors.
6// SPDX-License-Identifier: BSD-3-Clause
7// *****************************************************************************
8// @HEADER
9
10//#define TEUCHOS_PARAMETER_LIST_SHOW_TRACE
11#include <deque>
12#include <functional>
14#include "Teuchos_FancyOStream.hpp"
15#include "Teuchos_StrUtils.hpp"
16#include "Teuchos_VerboseObject.hpp"
17
18
19namespace {
20
21
22std::string filterValueToString(const Teuchos::ParameterEntry& entry )
23{
24 return ( entry.isList() ? std::string("...") : toString(entry.getAny()) );
25}
26
27
28struct ListPlusValidList {
30 Teuchos::ParameterList *validList;
31 ListPlusValidList(
33 ,Teuchos::ParameterList *_validList
34 )
35 :list(_list),validList(_validList)
36 {}
37};
38
39
40} // namespace
41
42
43namespace Teuchos {
44
45
46// Constructors/Destructor/Info
47
48
53
54
56{
57 name_ = source.name_;
58 params_ = source.params_;
59 disableRecursiveValidation_ = source.disableRecursiveValidation_;
60 disableRecursiveModification_= source.disableRecursiveModification_;
61 disableRecursiveReconciliation_ = source.disableRecursiveReconciliation_;
62 modifier_ = source.modifier_;
63}
64
65
68
69
71{
72 return params_.numObjects();
73}
74
75
77{
78 if (&source == this)
79 return *this;
80 name_ = source.name_;
81 params_ = source.params_;
82 disableRecursiveValidation_ = source.disableRecursiveValidation_;
83 disableRecursiveModification_= source.disableRecursiveModification_;
84 disableRecursiveReconciliation_ = source.disableRecursiveReconciliation_;
85 modifier_ = source.modifier_;
86 return *this;
87}
88
89
90void ParameterList::setModifier(
92{
93 modifier_ = modifier_in;
94}
95
96
98{
99 for (ConstIterator i = source.begin(); i != source.end(); ++i) {
100 const std::string &name_i = this->name(i);
101 const ParameterEntry &entry_i = this->entry(i);
102 if (entry_i.isList()) {
104 ParameterList &this_pl = this->sublist(name_i, false, entry_i.docString());
105 this_pl.setParameters(pl);
106 this_pl.setModifier(pl.getModifier());
107 } else {
108 this->setEntry(name_i, entry_i);
109 }
110 }
111 this->updateSubListNames();
112 return *this;
113}
114
115
117 const ParameterList& source
118 )
119{
120 for (ConstIterator i = source.begin(); i != source.end(); ++i) {
121 const std::string &name_i = this->name(i);
122 const ParameterEntry &entry_i = this->entry(i);
123 if (entry_i.isList()) {
125 if (this->isSublist(name_i)){
126 this->sublist(name_i, true).setParametersNotAlreadySet(pl);
127 } else{
128 this->sublist(name_i, pl.getModifier(), entry_i.docString())
130 }
131 } else {
132 const ParameterEntry *thisEntryPtr = this->getEntryPtr(name_i);
133 // If the entry does not already exist, then set it. Otherwise, leave the
134 // existing entry alone.
135 if (!thisEntryPtr)
136 this->setEntry(name_i, entry_i);
137 }
138 }
139 this->updateSubListNames();
140 return *this;
141}
142
143
145{
146 disableRecursiveValidation_ = true;
147 return *this;
148}
149
150
152{
153 disableRecursiveModification_ = true;
154 return *this;
155}
156
157
159{
160 disableRecursiveReconciliation_ = true;
161 return *this;
162}
163
164
172
173
174void ParameterList::unused(std::ostream& os) const
175{
176 for (ConstIterator i = this->begin(); i != this->end(); ++i) {
177 if (!(entry(i).isUsed())) {
178 os << "WARNING: Parameter \"" << name(i) << "\" " << entry(i)
179 << " is unused" << std::endl;
180 }
181 }
182}
183
184
186{
187 std::ostringstream oss;
188 oss << " {\n";
190 int i;
191 for( itr = this->begin(), i = 0; itr != this->end(); ++itr, ++i ) {
192 const std::string &entryName = this->name(itr);
193 const ParameterEntry &theEntry = this->entry(itr);
194 oss
195 << " \""<<entryName<<"\" : "<<theEntry.getAny().typeName()
196 <<" = "<<filterValueToString(theEntry) << "\n";
197 }
198 oss << " }\n";
199 return oss.str();
200}
201
202
203bool ParameterList::isSublist(const std::string& name_in) const
204{
206 const Ordinal param_idx = params_.getObjOrdinalIndex(name_in);
207 if (param_idx != SIOVOCB::getInvalidOrdinal()) {
208 return params_.getObjPtr(param_idx)->isList();
209 }
210 return false;
211}
212
213
214bool ParameterList::isParameter(const std::string& name_in) const
215{
217 const Ordinal param_idx = params_.getObjOrdinalIndex(name_in);
218 if (param_idx != SIOVOCB::getInvalidOrdinal()) {
219 return true;
220 }
221 return false;
222}
223
224
226 std::string const& name_in, bool throwIfNotExists
227 )
228{
230 const Ordinal param_idx = params_.getObjOrdinalIndex(name_in);
231 if (param_idx != SIOVOCB::getInvalidOrdinal()) {
232 // Parameter exists
233 params_.removeObj(param_idx);
234 return true;
235 }
236 // Parameter does not exist
237 if (throwIfNotExists) {
238 validateEntryExists("get", name_in, 0); // Will throw
239 }
240 return false; // Param does not exist but that is okay
241}
242
243
245 const std::string& name_in, bool mustAlreadyExist,
246 const std::string& docString
247 )
248{
250
251 const Ordinal param_idx = params_.getObjOrdinalIndex(name_in);
252
254
255 if (param_idx != SIOVOCB::getInvalidOrdinal()) {
256 // Sublist parameter exists
258 validateEntryIsList(name_in, *sublist_entry_ptr);
259 }
260 else {
261 // Sublist does not exist so we need to create a new one
262 validateMissingSublistMustExist(this->name(), name_in, mustAlreadyExist);
263 const Ordinal new_param_idx =
264 params_.setObj(
265 name_in,
267 ParameterList(this->name()+std::string("->")+name_in),
268 false,
269 true,
270 docString
271 )
272 );
274 }
275
276 return any_cast<ParameterList>(sublist_entry_ptr->getAny(false));
277}
278
279
281 const std::string& name_in, RCP<const ParameterListModifier> const& modifier_in,
282 const std::string& docString
283 )
284{
285 bool alreadyExists = this->isParameter(name_in);
288 ,"The parameter "<<this->name()<<"->\""<<name_in<<"\" already exists."
289 );
290 ParameterList &subpl = this->sublist(name_in, false, docString);
291 subpl.setModifier(modifier_in);
292 return subpl;
293}
294
295
296const ParameterList& ParameterList::sublist(const std::string& name_in) const
297{
299
300 const Ordinal param_idx = params_.getObjOrdinalIndex(name_in);
301 if (param_idx == SIOVOCB::getInvalidOrdinal()) {
302 validateMissingSublistMustExist(this->name(), name_in, true);
303 }
304
306 validateEntryIsList(name_in, *sublist_entry_ptr);
307
308 return any_cast<ParameterList>(sublist_entry_ptr->getAny(false));
309}
310
311
316
317
318std::ostream& ParameterList::print(std::ostream& os, const PrintOptions &printOptions ) const
319{
320 const int indent = printOptions.indent();
321 const bool showTypes = printOptions.showTypes();
322 const bool showFlags = printOptions.showFlags();
323 const bool showDoc = printOptions.showDoc();
324 const bool showDefault = printOptions.showDefault();
325 const std::string linePrefix(indent,' ');
327 out = getFancyOStream(rcp(&os,false));
328 OSTab tab(out,indent);
329 if (this->begin() == this->end()) {
330 *out <<"[empty list]" << std::endl;
331 }
332 else {
333 // Print parameters first
334 for (ConstIterator i = this->begin(); i != this->end(); ++i)
335 {
336 const std::string &name_i = this->name(i);
337 const ParameterEntry &entry_i = entry(i);
339 validator = entry_i.validator();
340 if(entry_i.isList())
341 continue;
342 if(!showDefault && entry_i.isDefault())
343 continue;
344 *out << name_i;
345 const std::string &docString = entry_i.docString();
346 if(showTypes)
347 *out << " : " << entry_i.getAny(false).typeName();
348 *out << " = "; entry_i.leftshift(os,showFlags); *out << std::endl;
349 if (showDoc) {
350 if (nonnull(validator)) {
351 validator->printDoc(docString,OSTab(os).o());
352 }
353 else if (docString.length()) {
354 StrUtils::printLines(OSTab(out).o(),"# ",docString);
355 }
356 }
357 }
358 // Print sublists second
359 for (ConstIterator i = this->begin(); i != this->end(); ++i)
360 {
361 const ParameterEntry &entry_i = entry(i);
362 if(!entry_i.isList())
363 continue;
364 const std::string &docString = entry_i.docString();
365 const std::string &name_i = this->name(i);
366 *out << name_i << " -> " << std::endl;
367 if( docString.length() && showDoc ) {
368 StrUtils::printLines(OSTab(out).o(),"# ",docString);
369 }
370 getValue<ParameterList>(entry_i).print(OSTab(out).o(), printOptions.copy().indent(0));
371 }
372 }
373 return os;
374}
375
376
377std::ostream& ParameterList::print(std::ostream& os, int indent, bool showTypes, bool showFlags, bool showDefault) const
378{
379 return this->print(os,PrintOptions().indent(indent).showTypes(showTypes).showFlags(showFlags).showDefault(showDefault));
380}
381
382
385 int const depth,
388 ) const
389{
390 typedef std::deque<ListPlusValidList> sublist_list_t;
391#ifdef TEUCHOS_PARAMETER_LIST_SHOW_TRACE
393 OSTab tab(out);
394 *out << "\n*** Entering ParameterList::validateParameters(...) for "
395 "this->name()=\""<<this->name()<<"\"...\n";
396#endif
397 //
398 // First loop through and validate the parameters at this level.
399 //
400 // Here we generate a list of sublists that we will search next
401 //
402 sublist_list_t sublist_list;
404 for (itr = this->begin(); itr != this->end(); ++itr) {
405 const std::string &entryName = this->name(itr);
406 const ParameterEntry &theEntry = this->entry(itr);
407#ifdef TEUCHOS_PARAMETER_LIST_SHOW_TRACE
408 OSTab tab(out);
409 *out << "\nentryName=\""<<entryName<<"\"\n";
410#endif
411 if(
413 ||
415 )
416 {
417 continue;
418 }
422 ,"Error, the parameter {name=\""<<entryName<<"\","
423 "type=\""<<theEntry.getAny(false).typeName()<<"\""
424 ",value=\""<<filterValueToString(theEntry)<<"\"}"
425 "\nin the parameter (sub)list \""<<this->name()<<"\""
426 "\nwas not found in the list of valid parameters!"
427 "\n\nThe valid parameters and types are:\n"
428 <<validParamList.currentParametersString()
429 );
431 if (nonnull(validator=validEntry->validator())) {
432 validator->validate(theEntry, entryName, this->name());
433 }
434 else {
435 const bool validType =
437 ? theEntry.getAny(false).type() == validEntry->getAny(false).type()
438 : false
439 );
442 ,"Error, the parameter {name=\""<<entryName<<"\","
443 "type=\""<<theEntry.getAny(false).typeName()<<"\""
444 ",value=\""<<filterValueToString(theEntry)<<"\"}"
445 "\nin the parameter (sub)list \""<<this->name()<<"\""
446 "\nexists in the list of valid parameters but has the wrong type."
447 "\n\nThe correct type is \""
448 << validEntry->getAny(false).typeName() << "\"."
449 );
450 }
451 if( theEntry.isList() && depth > 0 ) {
452 sublist_list.push_back(
453 ListPlusValidList(
455 )
456 );
457 }
458 }
459 //
460 // Now loop through the sublists and validate their parameters
461 //
462 for(
463 sublist_list_t::const_iterator sl_itr = sublist_list.begin();
464 sl_itr != sublist_list.end();
465 ++sl_itr
466 )
467 {
468 if (!sl_itr->validList->disableRecursiveValidation_) {
469 sl_itr->list->validateParameters(
470 *sl_itr->validList
471 ,depth-1
474 );
475 }
476 }
477#ifdef TEUCHOS_PARAMETER_LIST_SHOW_TRACE
478 *out << "\n*** Existing ParameterList::validateParameters(...) for "
479 "this->name()=\""<<this->name()<<"\"...\n";
480#endif
481}
482
483
485 int const depth)
486{
488 if (nonnull(modifier = valid_pl.getModifier())) {
489 modifier->modify(*this, valid_pl);
490 this->setModifier(modifier);
491 }
493 for (itr = valid_pl.begin(); itr != valid_pl.end(); ++itr){
494 const std::string &entry_name = itr->first;
495 const ParameterEntry &cur_entry = itr->second;
496 if (cur_entry.isList() && depth > 0){
498 if(!valid_pl_sublist.disableRecursiveModification_){
499 const ParameterEntry *validEntry = this->getEntryPtr(entry_name);
502 ,"Error, the parameter {name=\""<<entry_name<<"\","
503 "type=\""<<cur_entry.getAny(false).typeName()<<"\""
504 ",value=\""<<filterValueToString(cur_entry)<<"\"}"
505 "\nin the parameter (sub)list \""<<this->name()<<"\""
506 "\nwas not found in the list of parameters during modification."
507 "\n\nThe parameters and types are:\n"
509 );
510 ParameterList &pl_sublist = this->sublist(entry_name, true);
511 pl_sublist.modifyParameterList(valid_pl_sublist, depth-1);
512 }
513 }
514 }
515}
516
517
519 const bool left_to_right)
520{
521 // We do a breadth-first traversal of `valid_pl` and store references to all of the sublists
522 // in `valid_pl` in a deque with a matching deque for `this`.
523 std::deque<std::reference_wrapper<ParameterList>> refs, valid_refs, tmp, valid_tmp;
524 tmp.push_back(*this);
525 valid_tmp.push_back(valid_pl);
526 while (!valid_tmp.empty()){
527 ParameterList &cur_node = tmp.front();
529 tmp.pop_front();
530 valid_tmp.pop_front();
531 refs.push_back(cur_node);
532 valid_refs.push_back(valid_cur_node);
533 // Look for all sublists in valid_tmp
534 for (auto itr = valid_cur_node.begin(); itr != valid_cur_node.end(); ++itr){
535 const std::string &entry_name = itr->first;
536 if (valid_cur_node.isSublist(entry_name)){
537 const ParameterEntry &cur_entry = itr->second;
539 if (!valid_cur_node_sublist.disableRecursiveReconciliation_){
542 ,"Error, the parameter {name=\"" << entry_name <<"\","
543 "type=\"" << cur_entry.getAny(false).typeName() << "\""
544 ",value=\"" << filterValueToString(cur_entry) << "\"}"
545 "\nin the parameter (sub)list \"" <<cur_node.name() << "\""
546 "\nwas not found in the list of parameters during reconciliation."
547 "\n\nThe parameters and types are:\n"
548 <<cur_node.currentParametersString()
549 );
550 if (left_to_right){
552 tmp.push_back(cur_node.sublist(entry_name));
553 } else{
555 tmp.push_front(cur_node.sublist(entry_name));
556 }
557 }
558 }
559 }
560 }
561 // We now apply the reconciliation from the bottom to the top of the parameter lists by
562 // traversing the deques from the back to the front.
564 std::deque<std::reference_wrapper<ParameterList>>::reverse_iterator ref, valid_ref;
565 for(ref = refs.rbegin(), valid_ref = valid_refs.rbegin();
566 ref != refs.rend() && valid_ref != valid_refs.rend();
567 ++ref, ++valid_ref){
568 if (nonnull(modifier = valid_ref->get().getModifier())) {
569 modifier->reconcile(ref->get());
570 }
571 }
572}
573
574
577 int const depth
578 )
579{
580 typedef std::deque<ListPlusValidList> sublist_list_t;
581#ifdef TEUCHOS_PARAMETER_LIST_SHOW_TRACE
583 OSTab tab(out);
584 *out << "\n*** Entering ParameterList::validateParametersAndSetDefaults(...) "
585 "for this->name()=\""<<this->name()<<"\"...\n";
586#endif
587 //
588 // A) loop through and validate the parameters at this level.
589 //
590 // Here we generate a list of sublists that we will search next
591 //
592 sublist_list_t sublist_list;
593 {
594 Iterator itr;
595 for (itr = this->nonconstBegin(); itr != this->nonconstEnd(); ++itr) {
596 const std::string &entryName = this->name(itr);
597 ParameterEntry &theEntry = this->nonconstEntry(itr);
598#ifdef TEUCHOS_PARAMETER_LIST_SHOW_TRACE
599 OSTab tab(out);
600 *out << "\nentryName=\""<<entryName<<"\"\n";
601#endif
605 ,"Error, the parameter {name=\""<<entryName<<"\","
606 "type=\""<<theEntry.getAny(false).typeName()<<"\""
607 ",value=\""<<filterValueToString(theEntry)<<"\"}"
608 "\nin the parameter (sub)list \""<<this->name()<<"\""
609 "\nwas not found in the list of valid parameters!"
610 "\n\nThe valid parameters and types are:\n"
611 <<validParamList.currentParametersString()
612 );
614 if (nonnull(validator=validEntry->validator())) {
615 validator->validateAndModify(entryName, this->name(), &theEntry);
616 theEntry.setValidator(validator);
617 }
618 else {
619 const bool validType =
621 ? theEntry.getAny(false).type() == validEntry->getAny(false).type()
622 : false
623 );
626 ,"Error, the parameter {name=\""<<entryName<<"\","
627 "type=\""<<theEntry.getAny(false).typeName()<<"\""
628 ",value=\""<<filterValueToString(theEntry)<<"\"}"
629 "\nin the parameter (sub)list \""<<this->name()<<"\""
630 "\nexists in the list of valid parameters but has the wrong type."
631 "\n\nThe correct type is \""
632 << validEntry->getAny(false).typeName() << "\"."
633 );
634 // Note: If there is no validator for this item, then we can not
635 // validate the value of the parameter, only its type!
636 }
637 if( theEntry.isList() && depth > 0 ) {
638 sublist_list.push_back(
639 ListPlusValidList(
642 )
643 );
644 }
645 }
646 }
647 //
648 // B) Loop through the valid parameters at this level that are not set in
649 // *this, and set their defaults.
650 //
651 {
653 for (itr = validParamList.begin(); itr != validParamList.end(); ++itr) {
654 const std::string &validEntryName = validParamList.name(itr);
656 const ParameterEntry *theEntry = this->getEntryPtr(validEntryName);
657 if (!theEntry) {
658 // This entry does not exist, so add it. Here we will only set the
659 // value of the entry and its validator and and leave off the
660 // documentation. The reason that the validator is set is so that it
661 // can be used to extract and validate entries in the transformed list
662 // *this without having to refer back to the valid parameter list.
664 newEntry.setAnyValue(
665 validEntry.getAny(),
666 true // isDefault
667 );
669 if (nonnull(validator=validEntry.validator())) {
670#if defined(HAVE_TEUCHOS_MODIFY_DEFAULTS_DURING_VALIDATION)
671 validEntry.validator()->validateAndModify(this->name(itr), validEntryName, &newEntry);
672 // validateAndModify changes the default status so we reset it
673 newEntry.setAnyValue(newEntry.getAny(), true);
674#endif
675 newEntry.setValidator(validator);
676 }
677 this->setEntry(validEntryName,newEntry);
678 }
679 }
680 }
681 //
682 // C) Loop through the sublists and validate their parameters and set their
683 // defaults!
684 //
685 for (
686 sublist_list_t::iterator sl_itr = sublist_list.begin();
687 sl_itr != sublist_list.end();
688 ++sl_itr
689 )
690 {
691 if (!sl_itr->validList->disableRecursiveValidation_) {
692 sl_itr->list->validateParametersAndSetDefaults(*sl_itr->validList,depth-1);
693 }
694 }
695#ifdef TEUCHOS_PARAMETER_LIST_SHOW_TRACE
696 *out << "\n*** Existing ParameterList::validateParametersAndSetDefaults(...) "
697 "for this->name()=\""<<this->name()<<"\"...\n";
698#endif
699}
700
701
702// private
703
704
705void ParameterList::updateSubListNames(int depth)
706{
707 const std::string this_name = this->name();
708 Iterator itr;
709 for( itr = this->nonconstBegin(); itr != this->nonconstEnd(); ++itr ) {
710 const std::string &entryName = this->name(itr);
711 const ParameterEntry &theEntry = this->entry(itr);
712 if(theEntry.isList()) {
714 sublistEntry.setName(this_name+std::string("->")+entryName);
715 if(depth > 0)
716 sublistEntry.updateSubListNames(depth-1);
717 }
718 }
719}
720
721
722void ParameterList::validateEntryExists(
723 const std::string & /*funcName*/, const std::string &name_in,
724 const ParameterEntry *entry_in
725 ) const
726{
728 entry_in==NULL, Exceptions::InvalidParameterName
729 ,"Error! The parameter \""<<name_in<<"\" does not exist"\
730 "\nin the parameter (sub)list \""<<this->name()<<"\"."
731 "\n\nThe current parameters set in (sub)list \""<<this->name()<<"\" are:\n\n"
732 << this->currentParametersString()
733 );
734}
735
736
737void ParameterList::validateEntryIsList(
738 const std::string &name_in, const ParameterEntry &entry_in
739 ) const
740{
742 !entry_in.isList(), Exceptions::InvalidParameterType
743 ,"Error, the parameter \"" << name_in << "\" is not a list, it is of type \""
744 <<entry_in.getAny(false).typeName()<<"\"!" );
745}
746
747
748void ParameterList::validateMissingSublistMustExist(const std::string &baselist_name,
749 const std::string &sublist_name, const bool mustAlreadyExist) const
750{
752 mustAlreadyExist, Exceptions::InvalidParameterName
753 ,"The sublist "<<baselist_name<<"->\""<<sublist_name<<"\" does not exist!"
754 );
755}
756
757
758} // namespace Teuchos
759
760
761bool Teuchos::operator==( const ParameterList& list1, const ParameterList& list2 )
762{
763 // Check that the top-level names of the two parameter lists are the same
764 //const std::string &paramListName1 = list1.name();
765 //const std::string &paramListName2 = list2.name();
766 //if ( paramListName1 != paramListName2 ) {
767 // return false;
768 //}
769 if (!Teuchos::haveSameModifiers(list1, list2)){
770 return false;
771 }
772 ParameterList::ConstIterator itr1, itr2;
773 for(
774 itr1 = list1.begin(), itr2 = list2.begin();
775 itr1 != list1.end() && itr2 != list2.end();
776 ++itr1, ++itr2
777 )
778 {
779 const std::string &entryName1 = list1.name(itr1);
780 const std::string &entryName2 = list2.name(itr2);
781 const ParameterEntry &entry1 = list1.entry(itr1);
782 const ParameterEntry &entry2 = list2.entry(itr2);
783 if( entryName1 != entryName2 ) {
784 return false;
785 }
786 else if( entry1 != entry2 ) {
787 return false;
788 }
789 // Note that the above statement automatically recursively compares the
790 // sublists since ParameterList objects are stored in the 'any' variable
791 // held by the ParameterEntry object and this same comparison operator will
792 // be used.
793 }
794 // Check that the two parameter lists are the same length:
795 if ((itr1 != list1.end()) || (itr2 != list2.end())) {
796 return false;
797 }
798 return true;
799}
800
801
802bool Teuchos::haveSameModifiers(const ParameterList &list1, const ParameterList &list2) {
803 // Check that the modifiers are the same
804 const RCP<const ParameterListModifier> &modifier1 = list1.getModifier();
805 const RCP<const ParameterListModifier> &modifier2 = list2.getModifier();
806 // Compare the modifiers.
807 const bool modifier1_is_null = is_null(modifier1);
808 const bool modifier2_is_null = is_null(modifier2);
809 if( modifier1_is_null || modifier2_is_null ){
810 if ( modifier1_is_null != modifier2_is_null ){
811 return false;
812 }
813 } else if ( *modifier1 != *modifier2 ){
814 return false;
815 }
816 // Now look for more sublists
817 ParameterList::ConstIterator itr1, itr2;
818 for(
819 itr1 = list1.begin(), itr2 = list2.begin();
820 itr1 != list1.end() && itr2 != list2.end();
821 ++itr1, ++itr2
822 )
823 {
824 // Check the modifiers in each sublist.
825 const ParameterEntry &entry1 = itr1->second;
826 const ParameterEntry &entry2 = itr2->second;
827 if (entry1.isList() && entry2.isList()){
828 if ( !haveSameModifiers( Teuchos::getValue<ParameterList>(entry1),
830 return false;
831 }
832 }
833 }
834 return true;
835}
836
837
838bool Teuchos::haveSameValues( const ParameterList& list1, const ParameterList& list2, bool verbose )
839{
840 // Check that the top-level names of the two parameter lists are the same
841 //const std::string &paramListName1 = list1.name();
842 //const std::string &paramListName2 = list2.name();
843 //if ( paramListName1 != paramListName2 ) {
844 // return false;
845 //}
846 ParameterList::ConstIterator itr1, itr2;
847 for(
848 itr1 = list1.begin(), itr2 = list2.begin();
849 itr1 != list1.end() && itr2 != list2.end();
850 ++itr1, ++itr2
851 )
852 {
853 const std::string &entryName1 = list1.name(itr1);
854 const std::string &entryName2 = list2.name(itr2);
855 const ParameterEntry &entry1 = list1.entry(itr1);
856 const ParameterEntry &entry2 = list2.entry(itr2);
857 if( entryName1 != entryName2 ) {
858 if (verbose) std::cerr << "entryName1 \"" << entryName1 << "\" != entryName2 \"" << entryName2 << "\"\n";
859 return false;
860 }
861 if( entry1.isList() && entry2.isList() ) {
862 if (
863 !haveSameValues(
864 getValue<ParameterList>(entry1),
865 getValue<ParameterList>(entry2),
866 verbose)
867 )
868 {
869 // Note: Above we cast to a non-const ParameterList even through we
870 // only need a const ParameterList. We have to do this since a
871 // non-const ParameterList is always added initially which determines
872 // the value.
873 if (verbose) std::cerr << "sublists \"" << entryName1 << "\" differ\n";
874 return false;
875 }
876 }
877 else {
878 if( entry1.getAny() != entry2.getAny() ) {
879 if (verbose) std::cerr << "for key \"" << entryName1 << "\", value \"" << entry1.getAny() << "\" != \"" << entry2.getAny() << "\"\n";
880 return false;
881 }
882 }
883 }
884 // Check that the two parameter lists are the same length:
885 if ((itr1 != list1.end()) || (itr2 != list2.end())) {
886 if (verbose) std::cerr << "lists are not the same size\n";
887 return false;
888 }
889 return true;
890}
891
892
893bool Teuchos::haveSameValuesSorted( const ParameterList& list1, const ParameterList& list2, bool verbose )
894{
895 // Check that the top-level names of the two parameter lists are the same
896 //const std::string &paramListName1 = list1.name();
897 //const std::string &paramListName2 = list2.name();
898 //if ( paramListName1 != paramListName2 ) {
899 // return false;
900 //}
901 ParameterList::ConstIterator itr1, itr2;
902 Array<std::string> arr1, arr2;
903 for(itr1 = list1.begin(); itr1 != list1.end(); ++itr1){
904 arr1.push_back(list1.name(itr1));
905 }
906 for(itr2 = list2.begin(); itr2 != list2.end(); ++itr2){
907 arr2.push_back(list2.name(itr2));
908 }
909 // Check that the two parameter lists are the same length:
910 if (arr1.size() != arr2.size()) {
911 if (verbose) std::cerr << "lists are not the same size\n";
912 return false;
913 }
914 std::sort(arr1.begin(), arr1.end());
915 std::sort(arr2.begin(), arr2.end());
916 Array<std::string>::iterator iarr1, iarr2;
917 for(
918 iarr1 = arr1.begin(), iarr2 = arr2.begin();
919 iarr1 != arr1.end() && iarr2 != arr2.end();
920 ++iarr1, ++iarr2
921 )
922 {
923 const std::string &entryName1 = *iarr1;
924 const std::string &entryName2 = *iarr2;
925 const ParameterEntry &entry1 = list1.getEntry(entryName1);
926 const ParameterEntry &entry2 = list2.getEntry(entryName2);
927 if( entryName1 != entryName2 ) {
928 if (verbose) std::cerr << "entryName1 \"" << entryName1 << "\" != entryName2 \"" << entryName2 << "\"\n";
929 return false;
930 }
931 if( entry1.isList() && entry2.isList() ) {
932 if (
933 !haveSameValuesSorted(
934 getValue<ParameterList>(entry1),
935 getValue<ParameterList>(entry2),
936 verbose)
937 )
938 {
939 // Note: Above we cast to a non-const ParameterList even through we
940 // only need a const ParameterList. We have to do this since a
941 // non-const ParameterList is always added initially which determines
942 // the value.
943 if (verbose) std::cerr << "sublists \"" << entryName1 << "\" differ\n";
944 return false;
945 }
946 }
947 else {
948 if( entry1.getAny() != entry2.getAny() ) {
949 if (verbose) std::cerr << "for key \"" << entryName1 << "\", value \"" << entry1.getAny() << "\" != \"" << entry2.getAny() << "\"\n";
950 return false;
951 }
952 }
953 }
954 return true;
955}
Templated Parameter List class.
A std::string utilities class for Teuchos.
This object is held as the "value" in the Teuchos::ParameterList std::map.
any & getAny(bool activeQry=true)
Direct access to the Teuchos::any data value underlying this object. The bool argument activeQry (def...
bool isList() const
Return whether or not the value itself is a list.
Utility class for setting and passing in print options.
A list of parameters of arbitrary type.
void reconcileParameterList(ParameterList &validParamList, const bool left_to_right=true)
Reconcile a parameter list after validation.
ParameterList & setEntry(const std::string &name, U &&entry)
Set a parameter directly as a ParameterEntry.
ParameterList & setParameters(const ParameterList &source)
const ParameterEntry & entry(ConstIterator i) const
Access to ParameterEntry (i.e., returns i->second)
ConstIterator end() const
An iterator pointing beyond the last entry.
virtual ~ParameterList()
Destructor.
Ordinal numParams() const
Get the number of stored parameters.
ParameterList & setParametersNotAlreadySet(const ParameterList &source)
void validateParameters(ParameterList const &validParamList, int const depth=1000, EValidateUsed const validateUsed=VALIDATE_USED_ENABLED, EValidateDefaults const validateDefaults=VALIDATE_DEFAULTS_ENABLED) const
Validate the parameters in this list given valid selections in the input list.
void unused(std::ostream &os) const
Print out unused parameters in the ParameterList.
void validateParametersAndSetDefaults(ParameterList const &validParamList, int const depth=1000)
Validate the parameters in this list given valid selections in the input list and set defaults for th...
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,...
void print() const
Print function to use in debugging in a debugger.
const std::string & name() const
The name of this ParameterList.
ParameterList()=default
Constructor.
void modifyParameterList(ParameterList &validParamList, int const depth=1000)
Modify the valid parameter list prior to validation.
bool isSublist(const std::string &name) const
Whether the given sublist exists in this list.
ParameterList & disableRecursiveValidation()
ParameterList & disableRecursiveReconciliation()
ParameterList & operator=(const ParameterList &source)
Replace the current parameter list with source.
ParameterEntry * getEntryPtr(const std::string &name)
Retrieves the pointer for an entry with the name name if it exists.
params_t::ConstIterator ConstIterator
Parameter container const iterator typedef.
ConstIterator begin() const
An iterator pointing to the first entry.
ParameterList & disableRecursiveModification()
std::string currentParametersString() const
Create a single formated std::string of all of the zero-level parameters in this list.
bool isParameter(const std::string &name) const
Whether the given parameter exists in this list.
ParameterList & disableRecursiveAll()
bool remove(std::string const &name, bool throwIfNotExists=true)
Remove a parameter (does not depend on the type of the parameter).
EValidateDefaults
Validation defaults enum.
EValidateUsed
Validation used enum.
Smart reference counting pointer class for automatic garbage collection.
T * get() const
Get the raw C++ pointer to the underlying object.
static std::ostream & printLines(std::ostream &os, const std::string &linePrefix, const std::string &lines)
Print lines with prefix first.
Ordinal setObj(const std::string &key, U &&obj)
Set (or reset) object by value and return its ordinal index.
Ordinal getObjOrdinalIndex(const std::string &key) const
Get the ordinal index given the string key.
void removeObj(const Ordinal &idx)
Remove an object given its ordinal index.
Ptr< ObjType > getNonconstObjPtr(const Ordinal &idx)
Get a nonconst semi-persisting association with the stored object indexed by ordinal.
Ptr< const ObjType > getObjPtr(const Ordinal &idx) const
Get a const semi-persisting association with the stored object indexed by ordinal.
static RCP< FancyOStream > getDefaultOStream()
Get the default output stream object.
std::string typeName() const
Return the name of the type.
Tabbing class for helping to create formated, indented output for a basic_FancyOStream object.
#define TEUCHOS_TEST_FOR_EXCEPTION_PURE_MSG(throw_exception_test, Exception, msg)
Macro for throwing an exception with breakpointing to ease debugging.
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Macro for throwing an exception with breakpointing to ease debugging.
bool nonnull(const std::shared_ptr< T > &p)
Returns true if p.get()!=NULL.
basic_OSTab< char > OSTab
The Teuchos namespace contains all of the classes, structs and enums used by Teuchos,...
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Deprecated.