From f431ff9e62582cf7a4f12d17fb198c2fdaf47044 Mon Sep 17 00:00:00 2001 From: Vivien Maisonneuve Date: Mon, 16 Jun 2014 18:03:19 +0200 Subject: [PATCH] Add islhelper.c library to handle isl constants --- .gitignore | 1 + Makefile | 2 +- pypol/islhelper.c | 25 ++++++++++++++++++ pypol/linear.py | 64 +++++++++++++++++++++++------------------------ setup.py | 7 ++++-- 5 files changed, 64 insertions(+), 35 deletions(-) create mode 100644 pypol/islhelper.c diff --git a/.gitignore b/.gitignore index bbe9588..d93c13c 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ /dist/ /MANIFEST __pycache__ +/venv diff --git a/Makefile b/Makefile index 4ab5d2a..8b3f1c4 100644 --- a/Makefile +++ b/Makefile @@ -15,4 +15,4 @@ test: .PHONY: clean clean: - $(RM) build dist MANIFEST pypol/__pycache__ tests/__pycache__ + $(RM) build dist MANIFEST pypol/__pycache__ tests/__pycache__ venv diff --git a/pypol/islhelper.c b/pypol/islhelper.c new file mode 100644 index 0000000..38f249d --- /dev/null +++ b/pypol/islhelper.c @@ -0,0 +1,25 @@ +#include +#include + +static PyMethodDef islhelper_methods[] = { + {NULL, NULL, 0, NULL} +}; + +static struct PyModuleDef islhelpermodule = { + PyModuleDef_HEAD_INIT, + "islhelper", + NULL, + -1, + islhelper_methods +}; + +PyMODINIT_FUNC PyInit_islhelper(void) { + PyObject *m; + m = PyModule_Create(&islhelpermodule); + if (m == NULL) + return NULL; + + PyModule_AddObject(m, "isl_dim_set", PyLong_FromLong(isl_dim_set)); + + return m; +} diff --git a/pypol/linear.py b/pypol/linear.py index 5dfddfe..be30fad 100644 --- a/pypol/linear.py +++ b/pypol/linear.py @@ -2,7 +2,7 @@ import functools import numbers import json import ctypes, ctypes.util -from pypol import isl +from pypol import isl, islhelper from fractions import Fraction, gcd @@ -23,7 +23,7 @@ def symbolToInt(self): make dictionary of key:value (letter:integer) iterate through the dictionary to find matching symbol return the given integer value - d = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'h': 8, 'i': 6, 'j': 10, 'k': 11, 'l': 12, 'm': 13, 'n': 14, + d = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'h': 8, 'i': 6, 'j': 10, 'k': 11, 'l': 12, 'm': 13, 'n': 14, 'o': 15, 'p': 16, 'q': 17, 'r': 18, 's': 19, 't': 20, 'u': 21, 'v': 22, 'w': 23, 'x': 24, 'y': 25, 'z': 26} if self in d: num = d.get(self) @@ -75,8 +75,8 @@ class Context: @property def _as_parameter_(self): return self._ic - - #comment out so does not delete itself after being created + + #comment out so does not delete itself after being created #def __del__(self): # libisl.isl_ctx_free(self) @@ -203,7 +203,7 @@ class Expression: def __rsub__(self, other): return -(self - other) - + @_polymorphic_method def __mul__(self, other): if other.isconstant(): @@ -402,16 +402,16 @@ class Polyhedron: if value.denominator != 1: raise TypeError('non-integer constraint: ' '{} <= 0'.format(constraint)) - self._inequalities.append(constraint) + self._inequalities.append(constraint) self._bset = self.to_isl() #print(self._bset) #put this here just to test from isl method #from_isl = self.from_isl(self._bset) #print(from_isl) #rint(self) - return self._bset - - + return self._bset + + @property def equalities(self): yield from self._equalities @@ -419,15 +419,15 @@ class Polyhedron: @property def inequalities(self): yield from self._inequalities - + @property def constant(self): return self._constant def isconstant(self): return len(self._coefficients) == 0 - - + + def isempty(self): return bool(libisl.isl_basic_set_is_empty(self._bset)) @@ -441,7 +441,7 @@ class Polyhedron: for constraint in self.constraints(): s.update(constraint.symbols) yield from sorted(s) - + @property def dimension(self): return len(self.symbols()) @@ -452,7 +452,7 @@ class Polyhedron: return False else: return True - + def __contains__(self, value): # is the value in the polyhedron? @@ -484,9 +484,9 @@ class Polyhedron: # test whether every element in other is in the polyhedron for value in other: if value == self.constraints(): - return True + return True else: - return False + return False raise NotImplementedError def __ge__(self, other): @@ -543,10 +543,10 @@ class Polyhedron: @classmethod def fromstring(cls, string): raise NotImplementedError - + def to_isl(self): #d = Expression().__dict__ #write expression values to dictionary in form {'_constant': value, '_coefficients': value} - d = {'_constant': 2, '_coefficients': {'b':1}} + d = {'_constant': 2, '_coefficients': {'b':1}} coeff = d.get('_coefficients') num_coefficients = len(coeff) space = libisl.isl_space_set_alloc(Context(), 0, num_coefficients) @@ -560,37 +560,37 @@ class Polyhedron: if '_constant' in d: value = d.get('_constant') ceq = libisl.isl_constraint_set_constant_si(ceq, value) - if '_coefficients' in d: + if '_coefficients' in d: value_co = d.get('_coefficients') for co in value_co: num = value_co.get(co) - ceq = libisl.isl_constraint_set_coefficient_si(ceq, 3, get_ids(co), num) #use 3 for type isl_dim_set - bset = libisl.isl_set_add_constraint(bset, ceq) - - if self._inequalities: + ceq = libisl.isl_constraint_set_coefficient_si(ceq, islhelper.isl_dim_set, get_ids(co), num) + bset = libisl.isl_set_add_constraint(bset, ceq) + + if self._inequalities: if '_constant' in d: value = d.get('_constant') - cin = libisl.isl_constraint_set_constant_si(cin, value) - if '_coefficients' in d: - value_co = d.get('_coefficients') + cin = libisl.isl_constraint_set_constant_si(cin, value) + if '_coefficients' in d: + value_co = d.get('_coefficients') for co in value_co: num = value_co.get(co) if value_co: #if dictionary not empty add coefficient as to constraint - cin = libisl.isl_constraint_set_coefficient_si(cin, 3, get_ids(co), num) #use 3 for type isl_dim_set - bset = libisl.isl_set_add_constraint(bset, cin) + cin = libisl.isl_constraint_set_coefficient_si(cin, islhelper.isl_dim_set, get_ids(co), num) + bset = libisl.isl_set_add_constraint(bset, cin) ip = libisl.isl_printer_to_str(Context()) #create string printer - ip = libisl.isl_printer_print_set(ip, bset) #print set to printer + ip = libisl.isl_printer_print_set(ip, bset) #print set to printer string = libisl.isl_printer_get_str(ip) #get string from printer string = str(string) print(string) return string - - + + def from_isl(self, bset): '''takes basic set in isl form and puts back into python version of polyhedron isl example code gives idl form as: "{[i] : exists (a : i = 2a and i >= 10 and i <= 42)}");''' - + poly = 0 return poly diff --git a/setup.py b/setup.py index a0dfb8a..08587b7 100755 --- a/setup.py +++ b/setup.py @@ -1,10 +1,13 @@ #!/usr/bin/env python3 -from distutils.core import setup +from distutils.core import setup, Extension setup( name='pypol', description='A polyhedral library based on ISL', author='MINES ParisTech', - packages=['pypol'] + packages=['pypol'], + ext_modules = [ + Extension('pypol/islhelper', sources=['pypol/islhelper.c']) + ] ) -- 2.20.1