1 #ifndef CPPAD_CG_BIPARTITE_NODES_INCLUDED
2 #define CPPAD_CG_BIPARTITE_NODES_INCLUDED
42 inline void color(std::ostream& out = std::cout,
43 Verbosity verbosity = Verbosity::None) {
46 if (verbosity >= Verbosity::High)
47 out <<
" Colored " << nodeType() <<
" " << name() <<
"\n";
50 inline void uncolor() {
54 inline bool isColored()
const {
58 inline size_t index()
const {
62 inline void setIndex(
size_t index) {
66 virtual const std::string& name()
const = 0;
68 virtual std::string nodeType() = 0;
83 static const std::string TYPE;
113 inline Enode(
size_t index,
114 const std::string& name =
"") :
119 name_(name.empty()? (
"Eq" + std::to_string(index)) : name) {
122 inline Enode(
size_t index,
128 name_(
"Diff(" + differentiationOf->name() +
")") {
132 inline virtual ~Enode() {
135 inline const std::vector<Vnode<Base>*>& variables()
const {
139 inline const std::vector<Vnode<Base>*>& originalVariables()
const {
143 inline void addVariable(Vnode<Base>* j) {
146 if (!j->isDeleted()) {
148 j->addEquation(
this);
153 inline Vnode<Base>* assignmentVariable()
const {
157 inline void setAssigmentVariable(Vnode<Base>& j) {
173 inline Enode<Base>* originalEquation() {
181 inline void deleteNode(Vnode<Base>* j) {
187 inline void setDerivative(Enode<Base>* difEq) {
191 virtual const std::string& name()
const {
195 virtual std::string nodeType() {
201 inline std::ostream& operator <<(std::ostream& os,
const Enode<Base>& i) {
202 if (i.derivativeOf() !=
nullptr) {
203 os <<
"Diff(" << *i.derivativeOf() <<
")";
205 os <<
"Equation " << i.name() <<
" (" << i.index() <<
")";
212 const std::string Enode<Base>::TYPE =
"Equation";
218 class Vnode :
public BiPGraphNode<Base> {
220 static const std::string TYPE;
258 inline Vnode(
size_t index,
260 const std::string& name) :
272 inline Vnode(
size_t index,
275 const std::string& name =
"") :
283 name_(name.empty() ?
"d" + derivativeOf->name() +
"dt" : name) {
289 inline virtual ~Vnode() {
292 inline virtual const std::string& name()
const {
296 inline size_t tapeIndex()
const {
300 inline void setTapeIndex(
size_t tapeIndex) {
304 inline std::vector<Enode<Base>*>& equations() {
308 inline const std::vector<Enode<Base>*>& equations()
const {
334 inline Vnode<Base>* originalVariable(
size_t origVarSize) {
342 inline bool isDeleted()
const {
346 inline void makeParameter(std::ostream& out = std::cout,
347 Verbosity verbosity = Verbosity::None) {
349 deleteNode(out, verbosity);
352 inline bool isParameter()
const {
356 inline void deleteNode(std::ostream& out = std::cout,
357 Verbosity verbosity = Verbosity::None) {
358 if (verbosity >= Verbosity::High)
359 out <<
"Deleting " << *
this <<
"\n";
362 for (Enode<Base>* i :
enodes_) {
368 inline Enode<Base>* assignmentEquation()
const {
372 inline void setAssignmentEquation(Enode<Base>& i,
373 std::ostream& out = std::cout,
374 Verbosity verbosity = Verbosity::None) {
375 if (verbosity >= Verbosity::High)
376 out <<
" Assigning " << *
this <<
" to " << i <<
"\n";
379 i.setAssigmentVariable(*
this);
382 virtual std::string nodeType() {
386 inline void setDerivative(Vnode<Base>* div) {
390 unsigned int order()
const {
400 inline void addEquation(Enode<Base>* i) {
407 friend class Enode<Base>;
411 inline std::ostream& operator <<(std::ostream& os,
const Vnode<Base>& j) {
412 if (j.antiDerivative() !=
nullptr) {
413 os <<
"Diff(" << *j.antiDerivative() <<
")";
415 os <<
"Variable " << j.name();
421 const std::string Vnode<Base>::TYPE =
"Variable";