Dear Roberto, In my program I need to assign a variable, say x, a new value, say y+k, in a polyhedron. As far as I understand, to do this i need to free x, i.e. romove constraints on x, and after that intersect with the constraint x==y+k. Using functions from the library, a can first remove dimension x, then add a new dimension and add a constraint. After that the representation of the polyhedron when it is printed changes, i.e. if A represented x before, now it would represent y. How to avoid this problem? Is there a better way of freeing a variable than removing the dimension and adding it again? Best regards, Elena
fersman@lsv.ens-cachan.fr wrote:
In my program I need to assign a variable, say x, a new value, say y+k, in a polyhedron. As far as I understand, to do this i need to free x, i.e. romove constraints on x, and after that intersect with the constraint x==y+k. Using functions from the library, a can first remove dimension x, then add a new dimension and add a constraint. After that the representation of the polyhedron when it is printed changes, i.e. if A represented x before, now it would represent y. How to avoid this problem? Is there a better way of freeing a variable than removing the dimension and adding it again?
Dear Elena, if I understand correctly you want to model the destructive assignment of a linear expression to one variable. If this is the case, what you want is the method Polyhedron::affine_image() For instance, if you want to update a polyhedron ph so as to reflect the assignment of y+k to x, all you have to do is ph.affine_image(x, y+k) You can play with the small test program under the signature so as to familiarize with that method. The program now prints ph before: -x >= -3, y >= 0, x - y >= 0 ph after ph.affine_image(x, y-7): x - y = -7, -y >= -3, y >= 0 I may have misunderstood your question, of course. Please, don't hesitate to come back to us if that is the case. All the best, Roberto -- Prof. Roberto Bagnara Computer Science Group Department of Mathematics, University of Parma, Italy http://www.cs.unipr.it/~bagnara/ mailto:bagnara@cs.unipr.it #include <ppl.hh> using namespace std; using namespace Parma_Polyhedra_Library; using namespace Parma_Polyhedra_Library::IO_Operators; void my_output_function(ostream& s, const Variable& v) { s << char('x' + v.id()); } int main() { // Install the alternate output function. Variable::set_output_function(my_output_function); Variable x(0); Variable y(1); C_Polyhedron ph(2); ph.add_constraint(x >= y); ph.add_constraint(y >= 0); ph.add_constraint(x <= 3); cout << "ph before: " << endl << ph << endl; ph.affine_image(x, y-7); cout << "ph after ph.affine_image(x, y-7): " << endl << ph << endl; }
I am sorry about the previous mail. I realized that I just need to use affine_image. Best regards, Elena
Dear Roberto,
In my program I need to assign a variable, say x, a new value, say y+k, in a polyhedron. As far as I understand, to do this i need to free x, i.e. romove constraints on x, and after that intersect with the constraint x==y+k. Using functions from the library, a can first remove dimension x, then add a new dimension and add a constraint. After that the representation of the polyhedron when it is printed changes, i.e. if A represented x before, now it would represent y. How to avoid this problem? Is there a better way of freeing a variable than removing the dimension and adding it again?
Best regards, Elena
participants (2)
-
fersman@lsv.ens-cachan.fr -
Roberto Bagnara