[PPL-devel] Re: Help with alias analysis framework
Roberto Bagnara
bagnara at cs.unipr.it
Thu Aug 19 00:49:30 CEST 2004
Ber Past wrote:
> Looking at the library documentation, it seems it fits exactly my needs.
> I have only one question (probably stupid, but my knowledge of the
> library is not yet very good): is there any operator/function that
> allows to calculate the complement of a Polyhedron?
>
> Thanks for your help.
Dear Ber,
I am not sure I understand what you need, so I will give
you two alternatives.
Our library (PPL) provides an operation called "poly-difference"
that yields the smallest convex polyhedron containing
the set-theoretic difference of its two arguments.
Computing the poly-difference of the universe polyhedron
and a polyhedron ph gives an upper approximation of the
complement. This approximation can of course be extremely
coarse unless your application generates only a very
restricted class of polyhedra.
Alternatively, the PPL can represent the genuine complement
of a given convex polyhedron by a (finite) set of convex
polyhedra. Sets of polyhedra are fully supported by
version 0.6 of the library, which has just been released.
Here is a small program to give you an idea of what you
can do:
-------------------------------- %< %< %< --------------------------------
#include <ppl.hh>
using namespace std;
using namespace Parma_Polyhedra_Library;
using namespace Parma_Polyhedra_Library::IO_Operators;
template <typename PH>
Polyhedra_PowerSet<NNC_Polyhedron>
complement(const PH& ph) {
pair<PH, Polyhedra_PowerSet<NNC_Polyhedron> > partition
= linear_partition(ph, PH(ph.space_dimension(), Polyhedron::UNIVERSE));
return partition.second;
}
int main() {
Variable x(0);
Variable y(1);
C_Polyhedron p(2, Polyhedron::EMPTY);
p.add_generator(point(x));
p.add_generator(point(y));
p.add_generator(point(-x));
p.add_generator(point(-y));
cout << "p = " << p << endl;
Polyhedra_PowerSet<NNC_Polyhedron> p_c = complement(p);
cout << "complement(p) = " << p_c << endl;
C_Polyhedron q(2);
q.add_constraint(x >= -1);
q.add_constraint(x <= 1);
q.add_constraint(y >= 1);
q.add_constraint(y <= 3);
cout << "q = " << q << endl;
Polyhedra_PowerSet<NNC_Polyhedron> q_c = complement(q);
cout << "complement(q) = " << q_c << endl;
return 0;
}
-------------------------------- %< %< %< --------------------------------
And here is the output of the program (newlines added for readability):
p = -A - B >= -1, -A + B >= -1, A - B >= -1, A + B >= -1
complement(p) = { { A + B > 1 }, { -A - B >= -1, A - B > 1 },
{ -A - B >= -1, -A + B > 1 },
{ -A - B > 1, -A + B >= -1, A - B >= -1 } }
q = -A >= -1, -B >= -3, B >= 1, A >= -1
complement(q) = { { A > 1 }, { -A >= -1, B > 3 },
{ -A >= -1, -B > -1 }, { -A > 1, -B >= -3, B >= 1 } }
Notice that, in general, there are several possible representations
of the complement of a polyhedron as a set of polyhedra. This
implementation guarantees that the resulting set is a partition
of the complement of the given polyhedron (i.e., that the members
of the set are pairwise disjoint). It should also be possible
to prove that the partition returned has a reasonable number
of elements (such as the number of facets of the argument).
I hope this helps. Please do not hesitate to come back to us
in case it doesn't.
All the best,
Roberto
>> From: Roberto Bagnara <bagnara at cs.unipr.it>
>> To: BerPast <berpast at hotmail.com>
>> Subject: Re: Help with alias analysis framework
>> Date: Sat, 14 Aug 2004 09:30:12 +0200
>>
>> BerPast wrote:
>>
>>> In the paper "Interprocedural may-alias analysis for pointers: beyond
>>> k-limiting", the author presents a parametric framework for the
>>> analysis of pointer aliases.
>>> The framework is parametrised by a numeric lattice V#.
>>> The lattice has to have some abstract operators; the 4th are 5th are
>>> for me the most complex:
>>> 4) resolution of a linear system: given a system S, I need to compute
>>> a member of the lattice which is an upper approximation of the integer
>>> solutions to S;
>>> 5) intersection with a linear system: if S is a system of linear
>>> equations and K is a member of the lattice, I need to compute an upper
>>> approximation of the solutions to S that are also in K (no empty
>>> intersection with K I guess).
>>>
>>> I need to implement the lattice operators, but I have no idea of how
>>> to do this. Probably using Fourier-Motzkin projection I can solve the
>>> problem for the lattice obtained by the smash product of the interval
>>> lattice (any other, more efficient method?), but how can this problem
>>> be solved for a generic lattice?
>>> Can someone point out to me some documentation and (if available code
>>> implemenation) explaining how to solve this problem for a generic
>>> lattice?
>>
>>
>> I am not sure I understand what you mean by "[solving] this problem [...]
>> for a generic lattice." All the numerical abstractions provided by the
>> Parma Polyhedra Library (http://www.cs.unipr.it/ppl/) come with the
>> operations that a numeric lattice must possess in Alain Deutsch's
>> framework.
>> All the best,
>>
>> Roberto Bagnara
>>
>> --
>> Prof. Roberto Bagnara
>> Computer Science Group
>> Department of Mathematics, University of Parma, Italy
>> http://www.cs.unipr.it/~bagnara/
>> mailto:bagnara at cs.unipr.it
--
Prof. Roberto Bagnara
Computer Science Group
Department of Mathematics, University of Parma, Italy
http://www.cs.unipr.it/~bagnara/
mailto:bagnara at cs.unipr.it
More information about the PPL-devel
mailing list