/** * Free all ressources. */ Constraint::~Constraint(void) { Factor *fact = facts; while(fact) { Factor *next = fact->next(); delete fact; fact = next; } sys->removeConstraint(this); }
// Overload double Constraint::coefficient(ilp::Var *var) const { ASSERT(var); Var *lvar = sys->getVar(var); ASSERT(lvar); for(Factor *fact = facts; fact; fact = fact->next()) if(fact->variable() == lvar) return fact->coefficient(); ASSERT(false); }
/** * Dump the constraint to the given output. * @param out Used output. */ void Constraint::dump(elm::io::Output& out) { bool first = true; for(Factor *fact = facts; fact; fact = fact->next()) { if(first) first = false; else out << " + "; out << (int)fact->coefficient() << " "; if(fact->variable()->variable()->name()) out << fact->variable()->variable()->name(); else out << "_" << fact->variable()->column(); } }
/* !!NOTE!! * Collection of factors would be more fast if they was stored in a dynamic * vector. Not done now for debugging purpose but should be performed. * Another interesting optimization should be to remove factor whose coefficient * become null. */ void Constraint::add(double coef, ilp::Var *var) { if(var == 0) cst -= coef; else { Var *lvar = sys->getVar(var); ASSERT(lvar); for(Factor *fact = facts; fact; fact = fact->next()) if(fact->variable() == lvar) { fact->add(coef); return; } facts = new Factor(coef, lvar, facts, var); } }
/** * Reset the value used in the given row by the current constraint. * @param row Row to reset. */ void Constraint::resetRow(double *row) { ASSERT(row); for(Factor *fact = facts; fact; fact = fact->next()) row[fact->variable()->column()] = 0; }
/** * Fill a row of the lp_solve matrice with the current constraint. * @param row Row to fill. */ void Constraint::fillRow(double *row) { ASSERT(row); for(Factor *fact = facts; fact; fact = fact->next()) row[fact->variable()->column()] = fact->coefficient(); }