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'); } } }
Bool logobj(LinearFunctionPtr lf, CGraphPtr nlf) { UInt numvars = lf->getNumTerms(); // VariableSet vars; // lf->getVars(&vars); VariableGroup::const_iterator it; VariableGroup::const_iterator begin = lf->termsBegin(); VariableGroup::const_iterator end = lf->termsEnd(); // Variable nodes. std::map<UInt,CNode*> varnodes; std::map<CNode*, CNode*> lognodes; std::map<UInt, CNode*> logidnodes; std::map<CNode*, CNode*> numnodes; std::map<UInt, CNode*> numidnodes; std::map<CNode*, CNode*> mulnodes; std::map<UInt, CNode*> mulidnodes; std::set<CNode*> multnodes; std::map<UInt, CNode*> multidnodes; CNode** multnodesvec = new CNode*[numvars]; // Iterate through variables. CNode* tempnode; CNode* lognode; CNode* numnode; CNode* mulnode; CNode* onenode; CNode* sumnode; // Create numnode for one. UInt index = 0; for(it=begin; it!=end; ++it) { VariablePtr var = it->first; Double varlb = var->getLb(); if (varlb >= 0) { UInt varid = var->getId(); Double coeff = it->second; // Create variable node and add it to a set. tempnode = nlf->newNode(var); varnodes.insert(std::pair<UInt,CNode*>(varid,tempnode)); onenode = nlf->newNode(1.0); // Create sumnode. sumnode = nlf->newNode(OpPlus, onenode, tempnode); // Create log nodes. lognode = nlf->newNode(OpLog, &sumnode, 1); lognodes.insert(std::pair<CNode* , CNode*>(tempnode, lognode)); logidnodes.insert(std::pair<UInt, CNode*>(varid, lognode)); // Create num nodes. numnode = nlf->newNode(coeff); numnodes.insert(std::pair<CNode*, CNode*>(tempnode, numnode)); numidnodes.insert(std::pair<UInt, CNode*>(varid, numnode)); // Create mul nodes. mulnode = nlf->newNode(OpMult, numnode, lognode); multnodes.insert(mulnode); multidnodes.insert(std::pair<UInt, CNode*>(varid,mulnode)); multnodesvec[index] = mulnode; index++; } } // This is the root node. CNode* sumlistnode = nlf->newNode(OpSumList, multnodesvec, index); nlf->setOut(sumlistnode); nlf->finalize(); return true; }