From 7f60c3d845f3035ce675bfe4cc0d2d01456013c6 Mon Sep 17 00:00:00 2001 From: Vivien Maisonneuve Date: Wed, 2 Jul 2014 23:04:15 +0200 Subject: [PATCH] Implementation of Domain.fromsympy(), tosympy() --- pypol/domains.py | 19 +++++++++++++++++-- pypol/polyhedra.py | 34 ++++------------------------------ 2 files changed, 21 insertions(+), 32 deletions(-) diff --git a/pypol/domains.py b/pypol/domains.py index abc2d91..74351fc 100644 --- a/pypol/domains.py +++ b/pypol/domains.py @@ -335,10 +335,25 @@ class Domain: @classmethod def fromsympy(cls, expr): - raise NotImplementedError + import sympy + from .polyhedra import Lt, Le, Eq, Ne, Ge, Gt + funcmap = { + sympy.And: And, sympy.Or: Or, sympy.Not: Not, + sympy.Lt: Lt, sympy.Le: Le, + sympy.Eq: Eq, sympy.Ne: Ne, + sympy.Ge: Ge, sympy.Gt: Gt, + } + if expr.func in funcmap: + args = [Domain.fromsympy(arg) for arg in expr.args] + return funcmap[expr.func](*args) + elif isinstance(expr, sympy.Expr): + return Expression.fromsympy(expr) + raise ValueError('non-domain expression: {!r}'.format(expr)) def tosympy(self): - raise NotImplementedError + import sympy + polyhedra = [polyhedron.tosympy() for polyhedron in polyhedra] + return sympy.Or(*polyhedra) def And(*domains): diff --git a/pypol/polyhedra.py b/pypol/polyhedra.py index fa2a5c6..6b44bdc 100644 --- a/pypol/polyhedra.py +++ b/pypol/polyhedra.py @@ -172,38 +172,12 @@ class Polyhedron(Domain): else: return 'And({})'.format(', '.join(strings)) - @classmethod - def _fromsympy(cls, expr): - import sympy - equalities = [] - inequalities = [] - if expr.func == sympy.And: - for arg in expr.args: - arg_eqs, arg_ins = cls._fromsympy(arg) - equalities.extend(arg_eqs) - inequalities.extend(arg_ins) - elif expr.func == sympy.Eq: - expr = Expression.fromsympy(expr.args[0] - expr.args[1]) - equalities.append(expr) - else: - if expr.func == sympy.Lt: - expr = Expression.fromsympy(expr.args[1] - expr.args[0] - 1) - elif expr.func == sympy.Le: - expr = Expression.fromsympy(expr.args[1] - expr.args[0]) - elif expr.func == sympy.Ge: - expr = Expression.fromsympy(expr.args[0] - expr.args[1]) - elif expr.func == sympy.Gt: - expr = Expression.fromsympy(expr.args[0] - expr.args[1] - 1) - else: - raise ValueError('non-polyhedral expression: {!r}'.format(expr)) - inequalities.append(expr) - return equalities, inequalities - @classmethod def fromsympy(cls, expr): - import sympy - equalities, inequalities = cls._fromsympy(expr) - return cls(equalities, inequalities) + domain = Domain.fromsympy(expr) + if not isinstance(domain, Polyhedron): + raise ValueError('non-polyhedral expression: {!r}'.format(expr)) + return domain def tosympy(self): import sympy -- 2.20.1