PolynomialFunction::PolynomialFunction(CGraphPtr cg) : cb_(0), cg_(cg), // NULL eTol_(1e-10), terms_(0) { if (cg->getOut()) { recCG_(cg->getOut(), &cb_, &terms_); } }
void YEqUCGs::insert(VariablePtr auxvar, CGraphPtr cg) { VariablePtr x; assert(auxvar && cg); x = *(cg->varsBegin()); op_.push_back(cg->getOut()->getOp()); hash_.push_back(evalHash_(cg->getOut(), 1)); y_.push_back(auxvar); x_.push_back(x); cg_.push_back(cg); }
VariablePtr YEqUCGs::findY(CGraphPtr cg) { double hash = evalHash_(cg->getOut(), 1); OpCode op = cg->getOut()->getOp(); VariablePtr x = *(cg->varsBegin()); for (UInt i=0; i<y_.size(); ++i) { if (fabs(hash-hash_[i])<1e-10 && op == op_[i] && x == x_[i] && cg->isIdenticalTo(cg_[i])) { return y_[i]; } } return VariablePtr(); }
void YEqCGs::insert(VariablePtr auxvar, CGraphPtr cg) { assert(auxvar && cg); hash_.push_back(evalHash_(cg->getOut(), 1)); y_.push_back(auxvar); cg_.push_back(cg); }
VariablePtr Transformer::newVar_(CGraphPtr cg, ProblemPtr newp) { VariablePtr iv; VariablePtr ov = VariablePtr(); // NULL FunctionPtr f; LinearFunctionPtr lf; ConstraintPtr cnew; assert(cg); if (OpSumList!=cg->getOut()->getOp()) { ov = yUniExprs_->findY(cg); } if (!ov) { ov = newp->newVariable(VarTran); lf = (LinearFunctionPtr) new LinearFunction(); lf->addTerm(ov, -1.0); f = (FunctionPtr) new Function(lf, cg); cnew = newp->newConstraint(f, 0.0, 0.0); #if SPEW logger_->msgStream(LogDebug) << me_ << "added new constraint " << std::endl; cnew->write(logger_->msgStream(LogDebug)); #endif assignHandler_(cg, cnew); yUniExprs_->insert(ov, cg); } return ov; }
VariablePtr YEqCGs::findY(CGraphPtr cg) { double hash = evalHash_(cg->getOut(), 1); for (UInt i=0; i<y_.size(); ++i) { if (fabs(hash-hash_[i])<1e-10 && cg->isIdenticalTo(cg_[i])) { return y_[i]; } } return VariablePtr(); }
void Transformer::assignHandler_(CGraphPtr cg, ConstraintPtr c) { switch (cg->getOut()->getOp()) { case OpMult: case OpSqr: qHandler_->addConstraint(c); break; default: { VariablePtr iv; VariablePtr ov = VariablePtr(); LinearFunctionPtr lf = c->getFunction()->getLinearFunction(); if (lf) { assert(lf->getNumTerms()==1); ov = lf->termsBegin()->first; } iv = *(c->getFunction()->getNonlinearFunction()->varsBegin()); uHandler_->addConstraint(c, iv, ov, 'E'); } } }