Esempio n. 1
0
 LinExpr
 operator -(const BoolVar& x) {
   if (x.assigned())
     return LinExpr(-x.val());
   else
     return LinExpr(x,LinExpr::NT_SUB,0);
 }
Esempio n. 2
0
 LinExpr
 operator *(int a, const LinExpr& e) {
   if (a == 0)
     return LinExpr(0.0);
   else
     return LinExpr(a,e);
 }
Esempio n. 3
0
 LinExpr
 operator -(const BoolVar& x, int c) {
   if (x.assigned() && Int::Limits::valid(x.val()-static_cast<double>(c)))
     return LinExpr(x.val()-static_cast<double>(c));
   else
     return LinExpr(x,LinExpr::NT_ADD,-c);
 }
Esempio n. 4
0
 LinExpr
 operator -(int c, const BoolVar& x) {
   if (x.assigned() && Int::Limits::valid(static_cast<double>(c)-x.val()))
     return LinExpr(static_cast<double>(c)-x.val());
   else
     return LinExpr(x,LinExpr::NT_SUB,c);
 }
Esempio n. 5
0
 LinExpr
 operator +(const IntVar& x, int c) {
   if (x.assigned() && Int::Limits::valid(static_cast<double>(c)+x.val()))
     return LinExpr(static_cast<double>(c)+x.val());
   else
     return LinExpr(x,LinExpr::NT_ADD,c);
 }
Esempio n. 6
0
 LinExpr
 operator *(const BoolVar& x, int a) {
   if (a == 0)
     return LinExpr(0.0);
   else if (x.assigned() && 
            Int::Limits::valid(static_cast<double>(a)*x.val()))
     return LinExpr(static_cast<double>(a)*x.val());
   else
     return LinExpr(x,a);
 }
Esempio n. 7
0
 LinExpr
 operator -(const LinExpr& e, const BoolVar& x) {
   if (x.assigned())
     return e - x.val();
   else
     return LinExpr(e,LinExpr::NT_SUB,x);
 }
Esempio n. 8
0
 LinExpr
 operator +(const LinExpr& e, const BoolVar& x) {
   if (x.assigned())
     return e + x.val();
   else
     return LinExpr(e,LinExpr::NT_ADD,x);
 }
Esempio n. 9
0
 LinExpr
 operator +(const BoolVar& x, const LinExpr& e) {
   if (x.assigned())
     return x.val() + e;
   else
     return LinExpr(x,LinExpr::NT_ADD,e);
 }
Esempio n. 10
0
 LinExpr
 operator -(const BoolVar& x, const LinExpr& e) {
   if (x.assigned())
     return x.val() - e;
   else
     return LinExpr(x,LinExpr::NT_SUB,e);
 }
Esempio n. 11
0
 LinExpr
 operator +(const BoolVar& x, const BoolVar& y) {
   if (x.assigned())
     return x.val() + y;
   else if (y.assigned())
     return x + y.val();
   else
     return LinExpr(x,LinExpr::NT_ADD,y);
 }
Esempio n. 12
0
 LinExpr
 operator -(const BoolVar& x, const BoolVar& y) {
   if (x.assigned())
     return x.val() - y;
   else if (y.assigned())
     return x - y.val();
   else
     return LinExpr(x,LinExpr::NT_SUB,y);
 }
Esempio n. 13
0
 LinExpr
 sum(const BoolVarArgs& x) {
   return LinExpr(x);
 }
Esempio n. 14
0
 LinExpr
 operator +(const LinExpr& e1, const LinExpr& e2) {
   return LinExpr(e1,LinExpr::NT_ADD,e2);
 }
Esempio n. 15
0
 LinExpr
 sum(const IntVarArgs& x) {
   return LinExpr(x);
 }
Esempio n. 16
0
 LinExpr
 operator -(int c, const LinExpr& e) {
   return LinExpr(e,LinExpr::NT_SUB,c);
 }
Esempio n. 17
0
 LinExpr
 operator -(const LinExpr& e) {
   return LinExpr(e,LinExpr::NT_SUB,0);
 }
Esempio n. 18
0
 LinExpr
 operator -(const LinExpr& e, int c) {
   return LinExpr(e,LinExpr::NT_ADD,-c);
 }
Esempio n. 19
0
 LinExpr
 operator -(const LinExpr& e1, const LinExpr& e2) {
   return LinExpr(e1,LinExpr::NT_SUB,e2);
 }
Esempio n. 20
0
 LinExpr
 sum(const IntArgs& a, const BoolVarArgs& x) {
   return LinExpr(a,x);
 }
Esempio n. 21
0
// rebuild a Gecode space with the current variable and constraints
void
Solver::updateState()
{
	if (_space)
	{
		delete _space;
		_space = NULL;
	}

	_space = new CustomSpace();

	// create gecode variables
	for (map<int, IntegerVariable*>::iterator q = _integerVariablesMap->begin(); q != _integerVariablesMap->end(); q++)
	{
		IntegerVariable *v = q->second;

		if ((_suggest) && (_maxModification != NO_MAX_MODIFICATION)) {
			v->adjustMinMax(_suggest, _maxModification);
		} else {
			v->adjustMinMax(_suggest);
		}


		v->setIndex(_space->addVariable(v->getVal(), v->getVal()));
		v->setPosDeltaIndex(_space->addVariable(0, v->getMax() - v->getVal() + 1));
		v->setNegDeltaIndex(_space->addVariable(0, v->getVal() - v->getMin() + 1));
		v->setTotalIndex(_space->addVariable(v->getMin(), v->getMax()));
	}

	// add constraints to space
	for (map<int, LinearConstraint*>::iterator p = _constraintsMap->begin(); p != _constraintsMap->end(); p++)
	{
		(p->second)->addToSpace();
	}

	LinExpr expr;
	bool init=false;

	// construct the linear combination of delta variables balanced by the weight associated with their type
	for (map<int, IntegerVariable*>::iterator q = _integerVariablesMap->begin(); q != _integerVariablesMap->end(); q++)
	{
		IntegerVariable *currVar = q->second;

		// add a delta variable for each beginning or length
		int multiplier = 1;

		bool isStrong = false;

		// give more weight to the edited variables
		if (_suggest)
		{
			for (unsigned int i=0; i<_strongVars->size(); i++)
				if (_strongVars->at(i) == q->first)
				{
					isStrong = true;
					//multiplier = 10;
					break;
				}
		}

		IntVarArgs vars(4);
		IntArgs coeffs(4);

		if (isStrong) {
			vars[0] = _space->getIntVar(currVar->getTotalIndex());
			vars[1] = _space->getIntVar(currVar->getIndex());
			vars[2] = _space->getIntVar(currVar->getTotalIndex());
			vars[3] = _space->getIntVar(currVar->getIndex());

			coeffs[0] = -1;
			coeffs[1] = 1;
			coeffs[2] = -1;
			coeffs[3] = 1;
		} else {
			// constraint : <initial or wanted value> + <positive delta> - <negative delta> = <optimal value>
			vars[0] = _space->getIntVar(currVar->getNegDeltaIndex());
			vars[1] = _space->getIntVar(currVar->getPosDeltaIndex());
			vars[2] = _space->getIntVar(currVar->getTotalIndex());
			vars[3] = _space->getIntVar(currVar->getIndex());
			coeffs[0] = -1;
			coeffs[1] = 1;
			coeffs[2] = 1;
			coeffs[3] = -1;
		}

		linear(*_space, coeffs, vars, IRT_EQ, 0);

		// construction of the objective function
		if (!init)
		{
			expr = LinExpr(vars[0], currVar->getWeight()*multiplier);

			init = true;

			LinExpr tmp(vars[1], currVar->getWeight()*multiplier);

			expr = LinExpr(expr, Gecode::LinExpr::NT_ADD, tmp);
		}
		else
		{
			LinExpr tmp(vars[0], currVar->getWeight()*multiplier);

			expr = LinExpr(expr, Gecode::LinExpr::NT_ADD, tmp);

			tmp = LinExpr(vars[1], currVar->getWeight()*multiplier);

			expr = LinExpr(expr, Gecode::LinExpr::NT_ADD, tmp);
		}
	}

	// the objective function is a linear combination of the delta variables (lengths are more important than beginnings)
	_space->setObjFunc(Gecode::expr(*_space, expr));
}
Esempio n. 22
0
 LinExpr
 operator +(int c, const LinExpr& e) {
   return LinExpr(e,LinExpr::NT_ADD,c);
 }