1 #ifndef CPPAD_CG_SOARES_SECCHI_HPP 2 #define CPPAD_CG_SOARES_SECCHI_HPP 19 #include <cppad/cg/dae_index_reduction/dae_structural_index_reduction.hpp> 20 #include <cppad/cg/dae_index_reduction/augment_path_depth_lookahead.hpp> 21 #include <cppad/cg/dae_index_reduction/augment_path_depth_lookahead_a.hpp> 64 const std::vector<DaeVarInfo>& varInfo,
65 const std::vector<std::string>& eqName,
66 const std::vector<Base>& x) :
70 augmentPath_(&defaultAugmentPath_),
71 augmentPathA_(&defaultAugmentPathA_){
96 graph_.setPreserveNames(p);
105 return graph_.isPreserveNames();
118 inline std::unique_ptr<ADFun<CG<Base>>>
reduceIndex(std::vector<DaeVarInfo>& newVarInfo,
119 std::vector<DaeEquationInfo>& equationInfo)
override {
121 throw CGException(
"reduceIndex() can only be called once!");
123 if (this->verbosity_ >= Verbosity::High)
124 log() <<
"######## Soares Secchi method ########\n";
126 augmentPath_->setLogger(*
this);
127 augmentPathA_->setLogger(*
this);
139 if (this->verbosity_ >= Verbosity::Low) {
140 graph_.printResultInfo(
"Soares Secchi");
142 log() <<
"Structural index: " << graph_.getStructuralIndex() << std::endl;
145 std::unique_ptr<ADFun<CGBase>> reducedFun(graph_.generateNewModel(newVarInfo, equationInfo, x_));
158 return graph_.getStructuralIndex();
167 inline void detectSubset2Dif() {
168 auto& vnodes = graph_.variables();
169 auto& enodes = graph_.equations();
171 std::set<Enode<Base>*> marked;
172 std::set<Enode<Base>*> lastMarked;
174 if (this->verbosity_ >= Verbosity::High)
175 graph_.printDot(this->log());
179 for (
size_t k = 0; k < enodes.size(); k++) {
182 if (this->verbosity_ >= Verbosity::High)
183 log() <<
"Outer loop: equation k = " << *i <<
"\n";
185 if (i->assignmentVariable() !=
nullptr) {
194 if (ii->isColored() && ii->derivative() ==
nullptr) {
207 for (
auto* jj: vnodes)
211 for (
auto* ii: enodes)
221 graph_.createDerivate(*i,
false);
224 if (this->verbosity_ >= Verbosity::High)
225 graph_.printDot(this->log());
227 lastMarked.swap(marked);
233 lastAddEq_.insert(i->derivative());
std::set< Enode< Base > * > lastAddEq_
void setPreserveNames(bool p)
size_t getStructuralIndex() const
SoaresSecchi(ADFun< CG< Base > > &fun, const std::vector< DaeVarInfo > &varInfo, const std::vector< std::string > &eqName, const std::vector< Base > &x)
std::unique_ptr< ADFun< CG< Base > > > reduceIndex(std::vector< DaeVarInfo > &newVarInfo, std::vector< DaeEquationInfo > &equationInfo) override
bool isPreserveNames() const
virtual bool augmentPath(Enode< Base > &i)=0