1#ifndef CPPAD_CG_SOLVER_INCLUDED
2#define CPPAD_CG_SOLVER_INCLUDED
18#include <cppad/cg/evaluator/evaluator_solve.hpp>
19#include <cppad/cg/lang/dot/dot.hpp>
33 size_t bifurcations = (std::numeric_limits<size_t>::max)();
35 std::vector<SourceCodePath>
paths;
40 CPPADCG_ASSERT_UNKNOWN(
root !=
nullptr);
49 std::cerr <<
"Missing variable " <<
var << std::endl;
51 throw CGException(
"The provided variable ",
var.getName() !=
nullptr ? (
"(" + *
var.getName() +
")") :
"",
" is not present in the expression");
58 throw CGException(
"The provided variable is not present in the expression");
60 }
else if (
paths.size() == 1) {
61 CPPADCG_ASSERT_UNKNOWN(
paths[0][0].node ==
root);
62 CPPADCG_ASSERT_UNKNOWN(
paths[0].back().node == &
var);
64 return solveFor(
paths[0]);
67 CPPADCG_ASSERT_UNKNOWN(
paths.size() >= 1);
68 CPPADCG_ASSERT_UNKNOWN(
paths[0].back().node == &
var);
72 if (
root ==
nullptr) {
73 throw CGException(
"It is not possible to solve the expression for the requested variable: the variable disappears after symbolic manipulations (e.g., y=x-x).");
78 CPPADCG_ASSERT_UNKNOWN(
paths.size() == 1);
79 return solveFor(
paths[0]);
87 for (
size_t n = 0;
n <
path.size() - 1; ++
n) {
90 const std::vector<Argument<Base> >&
args =
pnodeOp.node->getArguments();
92 CGOpCode
op =
pnodeOp.node->getOperationType();
110 case CGOpCode::UnMinus:
119 case CGOpCode::Alias:
142 if (
exponent.getParameter() !=
nullptr && *
exponent.getParameter() == Base(0.0)) {
144 }
else if (
exponent.getParameter() !=
nullptr && *
exponent.getParameter() == Base(1.0)) {
203 return isSolvable(
paths[0]);
210 }
catch(
const CGException&
e) {
217inline bool CodeHandler<Base>::isSolvable(
const SourceCodePath&
path)
const {
218 for (
size_t n = 0;
n <
path.size() - 1; ++
n) {
220 size_t argIndex =
path[
n].argIndex;
221 const std::vector<Argument<Base> >&
args =
pnodeOp.node->getArguments();
223 CGOpCode
op =
pnodeOp.node->getOperationType();
227 case CGOpCode::UnMinus:
229 case CGOpCode::Alias:
243 if (
exponent.getParameter() !=
nullptr && *
exponent.getParameter() == Base(0.0)) {
245 }
else if (
exponent.getParameter() !=
nullptr && *
exponent.getParameter() == Base(1.0)) {
CGB solveFor(Node &expression, Node &var)
bool GreaterThanZero(const cg::CG< Base > &x)