1#ifndef CPPAD_CG_BIPARTITE_NODES_INCLUDED
2#define CPPAD_CG_BIPARTITE_NODES_INCLUDED
42 inline void color(std::ostream&
out = std::cout,
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 =
"") :
122 inline Enode(
size_t index,
132 inline virtual ~Enode() {
135 inline const std::vector<Vnode<Base>*>& variables()
const {
139 inline const std::vector<Vnode<Base>*>& originalVariables()
const {
146 if (!
j->isDeleted()) {
148 j->addEquation(
this);
173 inline Enode<Base>* originalEquation() {
187 inline void setDerivative(Enode<Base>*
difEq) {
191 virtual const std::string& name()
const {
195 virtual std::string nodeType() {
201inline 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() <<
")";
212const std::string Enode<Base>::TYPE =
"Equation";
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 {
342 inline bool isDeleted()
const {
346 inline void makeParameter(std::ostream&
out = std::cout,
352 inline bool isParameter()
const {
356 inline void deleteNode(std::ostream&
out = std::cout,
359 out <<
"Deleting " << *
this <<
"\n";
368 inline Enode<Base>* assignmentEquation()
const {
372 inline void setAssignmentEquation(Enode<Base>&
i,
373 std::ostream&
out = std::cout,
376 out <<
" Assigning " << *
this <<
" to " <<
i <<
"\n";
379 i.setAssigmentVariable(*
this);
382 virtual std::string nodeType() {
390 unsigned int order()
const {
400 inline void addEquation(Enode<Base>*
i) {
407 friend class Enode<Base>;
411inline 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();
421const std::string Vnode<Base>::TYPE =
"Variable";
std::vector< Vnode< Base > * > vnodes_
Enode< Base > * differentiation_
Enode< Base > * derivative() const
std::vector< Vnode< Base > * > vnodes_orig_
Enode< Base > * differentiationOf_
Vnode< Base > *const antiDerivative_
Vnode< Base > * derivative() const
Vnode< Base > * antiDerivative() const
std::vector< Enode< Base > * > enodes_
Vnode< Base > * derivative_
bool GreaterThanZero(const cg::CG< Base > &x)