from ctypes import *

isl = cdll.LoadLibrary("libisl.so")
libc = cdll.LoadLibrary("libc.so.6")

class Error(Exception):
    pass

class Context:
    defaultInstance = None

    def __init__(self):
        ptr = isl.isl_ctx_alloc()
        self.ptr = ptr

    def __del__(self):
        isl.isl_ctx_free(self)

    def from_param(self):
        return self.ptr

    @staticmethod
    def getDefaultInstance():
        if Context.defaultInstance == None:
            Context.defaultInstance = Context()
        return Context.defaultInstance

isl.isl_ctx_alloc.restype = c_void_p
isl.isl_ctx_free.argtypes = [Context]

class union_map:
    def __init__(self, *args, **keywords):
        if "ptr" in keywords:
            self.ctx = keywords["ctx"]
            self.ptr = keywords["ptr"]
            return
        if len(args) == 1 and args[0].__class__ is map:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_union_map_from_map(isl.isl_map_copy(args[0].ptr))
            return
        if len(args) == 1 and type(args[0]) == str:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_union_map_read_from_str(self.ctx, args[0])
            return
        raise Error
    def __del__(self):
        if hasattr(self, 'ptr'):
            isl.isl_union_map_free(self.ptr)
    def __str__(self):
        ptr = isl.isl_union_map_to_str(self.ptr)
        res = str(cast(ptr, c_char_p).value)
        libc.free(ptr)
        return res
    def __repr__(self):
        return 'isl.union_map("%s")' % str(self)
    def affine_hull(self):
        res = isl.isl_union_map_affine_hull(isl.isl_union_map_copy(self.ptr))
        return union_map(ctx=self.ctx, ptr=res)
    def polyhedral_hull(self):
        res = isl.isl_union_map_polyhedral_hull(isl.isl_union_map_copy(self.ptr))
        return union_map(ctx=self.ctx, ptr=res)
    def coalesce(self):
        res = isl.isl_union_map_coalesce(isl.isl_union_map_copy(self.ptr))
        return union_map(ctx=self.ctx, ptr=res)
    def lexmin(self):
        res = isl.isl_union_map_lexmin(isl.isl_union_map_copy(self.ptr))
        return union_map(ctx=self.ctx, ptr=res)
    def lexmax(self):
        res = isl.isl_union_map_lexmax(isl.isl_union_map_copy(self.ptr))
        return union_map(ctx=self.ctx, ptr=res)
    def union(self, arg1):
        try:
            if not arg1.__class__ is union_map:
                arg1 = union_map(arg1)
        except:
            raise
        res = isl.isl_union_map_union(isl.isl_union_map_copy(self.ptr), isl.isl_union_map_copy(arg1.ptr))
        return union_map(ctx=self.ctx, ptr=res)
    def subtract(self, arg1):
        try:
            if not arg1.__class__ is union_map:
                arg1 = union_map(arg1)
        except:
            raise
        res = isl.isl_union_map_subtract(isl.isl_union_map_copy(self.ptr), isl.isl_union_map_copy(arg1.ptr))
        return union_map(ctx=self.ctx, ptr=res)
    def intersect(self, arg1):
        try:
            if not arg1.__class__ is union_map:
                arg1 = union_map(arg1)
        except:
            raise
        res = isl.isl_union_map_intersect(isl.isl_union_map_copy(self.ptr), isl.isl_union_map_copy(arg1.ptr))
        return union_map(ctx=self.ctx, ptr=res)
    def intersect_params(self, arg1):
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            raise
        res = isl.isl_union_map_intersect_params(isl.isl_union_map_copy(self.ptr), isl.isl_set_copy(arg1.ptr))
        return union_map(ctx=self.ctx, ptr=res)
    def gist(self, arg1):
        try:
            if not arg1.__class__ is union_map:
                arg1 = union_map(arg1)
        except:
            raise
        res = isl.isl_union_map_gist(isl.isl_union_map_copy(self.ptr), isl.isl_union_map_copy(arg1.ptr))
        return union_map(ctx=self.ctx, ptr=res)
    def gist_params(self, arg1):
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            raise
        res = isl.isl_union_map_gist_params(isl.isl_union_map_copy(self.ptr), isl.isl_set_copy(arg1.ptr))
        return union_map(ctx=self.ctx, ptr=res)
    def gist_domain(self, arg1):
        try:
            if not arg1.__class__ is union_set:
                arg1 = union_set(arg1)
        except:
            raise
        res = isl.isl_union_map_gist_domain(isl.isl_union_map_copy(self.ptr), isl.isl_union_set_copy(arg1.ptr))
        return union_map(ctx=self.ctx, ptr=res)
    def intersect_domain(self, arg1):
        try:
            if not arg1.__class__ is union_set:
                arg1 = union_set(arg1)
        except:
            raise
        res = isl.isl_union_map_intersect_domain(isl.isl_union_map_copy(self.ptr), isl.isl_union_set_copy(arg1.ptr))
        return union_map(ctx=self.ctx, ptr=res)
    def intersect_range(self, arg1):
        try:
            if not arg1.__class__ is union_set:
                arg1 = union_set(arg1)
        except:
            raise
        res = isl.isl_union_map_intersect_range(isl.isl_union_map_copy(self.ptr), isl.isl_union_set_copy(arg1.ptr))
        return union_map(ctx=self.ctx, ptr=res)
    def apply_domain(self, arg1):
        try:
            if not arg1.__class__ is union_map:
                arg1 = union_map(arg1)
        except:
            raise
        res = isl.isl_union_map_apply_domain(isl.isl_union_map_copy(self.ptr), isl.isl_union_map_copy(arg1.ptr))
        return union_map(ctx=self.ctx, ptr=res)
    def apply_range(self, arg1):
        try:
            if not arg1.__class__ is union_map:
                arg1 = union_map(arg1)
        except:
            raise
        res = isl.isl_union_map_apply_range(isl.isl_union_map_copy(self.ptr), isl.isl_union_map_copy(arg1.ptr))
        return union_map(ctx=self.ctx, ptr=res)
    def reverse(self):
        res = isl.isl_union_map_reverse(isl.isl_union_map_copy(self.ptr))
        return union_map(ctx=self.ctx, ptr=res)
    def detect_equalities(self):
        res = isl.isl_union_map_detect_equalities(self.ptr)
        return union_map(ctx=self.ctx, ptr=res)
    def deltas(self):
        res = isl.isl_union_map_deltas(isl.isl_union_map_copy(self.ptr))
        return union_set(ctx=self.ctx, ptr=res)
    def is_empty(self):
        res = isl.isl_union_map_is_empty(self.ptr)
        return res
    def is_single_valued(self):
        res = isl.isl_union_map_is_single_valued(self.ptr)
        return res
    def is_injective(self):
        res = isl.isl_union_map_is_injective(self.ptr)
        return res
    def is_bijective(self):
        res = isl.isl_union_map_is_bijective(self.ptr)
        return res
    def is_subset(self, arg1):
        try:
            if not arg1.__class__ is union_map:
                arg1 = union_map(arg1)
        except:
            raise
        res = isl.isl_union_map_is_subset(self.ptr, arg1.ptr)
        return res
    def is_equal(self, arg1):
        try:
            if not arg1.__class__ is union_map:
                arg1 = union_map(arg1)
        except:
            raise
        res = isl.isl_union_map_is_equal(self.ptr, arg1.ptr)
        return res
    def is_strict_subset(self, arg1):
        try:
            if not arg1.__class__ is union_map:
                arg1 = union_map(arg1)
        except:
            raise
        res = isl.isl_union_map_is_strict_subset(self.ptr, arg1.ptr)
        return res
    def foreach_map(self, arg1):
        exc_info = [None]
        fn = CFUNCTYPE(c_int, c_void_p, c_void_p)
        def cb_func(cb_arg0, cb_arg1):
            cb_arg0 = map(ctx=self.ctx, ptr=cb_arg0)
            try:
                arg1(cb_arg0)
            except:
                import sys
                exc_info[0] = sys.exc_info()
                return -1
            return 0
        cb = fn(cb_func)
        res = isl.isl_union_map_foreach_map(self.ptr, cb, None)
        if exc_info[0] != None:
            raise exc_info[0][0], exc_info[0][1], exc_info[0][2]
        return res

isl.isl_union_map_from_map.restype = c_void_p
isl.isl_union_map_from_map.argtypes = [c_void_p]
isl.isl_union_map_read_from_str.restype = c_void_p
isl.isl_union_map_read_from_str.argtypes = [Context, c_char_p]
isl.isl_union_map_affine_hull.restype = c_void_p
isl.isl_union_map_polyhedral_hull.restype = c_void_p
isl.isl_union_map_coalesce.restype = c_void_p
isl.isl_union_map_lexmin.restype = c_void_p
isl.isl_union_map_lexmax.restype = c_void_p
isl.isl_union_map_union.restype = c_void_p
isl.isl_union_map_subtract.restype = c_void_p
isl.isl_union_map_intersect.restype = c_void_p
isl.isl_union_map_intersect_params.restype = c_void_p
isl.isl_union_map_gist.restype = c_void_p
isl.isl_union_map_gist_params.restype = c_void_p
isl.isl_union_map_gist_domain.restype = c_void_p
isl.isl_union_map_intersect_domain.restype = c_void_p
isl.isl_union_map_intersect_range.restype = c_void_p
isl.isl_union_map_apply_domain.restype = c_void_p
isl.isl_union_map_apply_range.restype = c_void_p
isl.isl_union_map_reverse.restype = c_void_p
isl.isl_union_map_detect_equalities.restype = c_void_p
isl.isl_union_map_deltas.restype = c_void_p
isl.isl_union_map_free.argtypes = [c_void_p]
isl.isl_union_map_to_str.argtypes = [c_void_p]
isl.isl_union_map_to_str.restype = POINTER(c_char)

class map(union_map):
    def __init__(self, *args, **keywords):
        if "ptr" in keywords:
            self.ctx = keywords["ctx"]
            self.ptr = keywords["ptr"]
            return
        if len(args) == 1 and type(args[0]) == str:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_map_read_from_str(self.ctx, args[0])
            return
        if len(args) == 1 and args[0].__class__ is basic_map:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_map_from_basic_map(isl.isl_basic_map_copy(args[0].ptr))
            return
        raise Error
    def __del__(self):
        if hasattr(self, 'ptr'):
            isl.isl_map_free(self.ptr)
    def __str__(self):
        ptr = isl.isl_map_to_str(self.ptr)
        res = str(cast(ptr, c_char_p).value)
        libc.free(ptr)
        return res
    def __repr__(self):
        return 'isl.map("%s")' % str(self)
    def lexmin(self):
        res = isl.isl_map_lexmin(isl.isl_map_copy(self.ptr))
        return map(ctx=self.ctx, ptr=res)
    def lexmax(self):
        res = isl.isl_map_lexmax(isl.isl_map_copy(self.ptr))
        return map(ctx=self.ctx, ptr=res)
    def reverse(self):
        res = isl.isl_map_reverse(isl.isl_map_copy(self.ptr))
        return map(ctx=self.ctx, ptr=res)
    def union(self, arg1):
        try:
            if not arg1.__class__ is map:
                arg1 = map(arg1)
        except:
            return union_map(self).union(arg1)
        res = isl.isl_map_union(isl.isl_map_copy(self.ptr), isl.isl_map_copy(arg1.ptr))
        return map(ctx=self.ctx, ptr=res)
    def intersect_domain(self, arg1):
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            return union_map(self).intersect_domain(arg1)
        res = isl.isl_map_intersect_domain(isl.isl_map_copy(self.ptr), isl.isl_set_copy(arg1.ptr))
        return map(ctx=self.ctx, ptr=res)
    def intersect_range(self, arg1):
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            return union_map(self).intersect_range(arg1)
        res = isl.isl_map_intersect_range(isl.isl_map_copy(self.ptr), isl.isl_set_copy(arg1.ptr))
        return map(ctx=self.ctx, ptr=res)
    def apply_domain(self, arg1):
        try:
            if not arg1.__class__ is map:
                arg1 = map(arg1)
        except:
            return union_map(self).apply_domain(arg1)
        res = isl.isl_map_apply_domain(isl.isl_map_copy(self.ptr), isl.isl_map_copy(arg1.ptr))
        return map(ctx=self.ctx, ptr=res)
    def apply_range(self, arg1):
        try:
            if not arg1.__class__ is map:
                arg1 = map(arg1)
        except:
            return union_map(self).apply_range(arg1)
        res = isl.isl_map_apply_range(isl.isl_map_copy(self.ptr), isl.isl_map_copy(arg1.ptr))
        return map(ctx=self.ctx, ptr=res)
    def intersect(self, arg1):
        try:
            if not arg1.__class__ is map:
                arg1 = map(arg1)
        except:
            return union_map(self).intersect(arg1)
        res = isl.isl_map_intersect(isl.isl_map_copy(self.ptr), isl.isl_map_copy(arg1.ptr))
        return map(ctx=self.ctx, ptr=res)
    def intersect_params(self, arg1):
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            return union_map(self).intersect_params(arg1)
        res = isl.isl_map_intersect_params(isl.isl_map_copy(self.ptr), isl.isl_set_copy(arg1.ptr))
        return map(ctx=self.ctx, ptr=res)
    def subtract(self, arg1):
        try:
            if not arg1.__class__ is map:
                arg1 = map(arg1)
        except:
            return union_map(self).subtract(arg1)
        res = isl.isl_map_subtract(isl.isl_map_copy(self.ptr), isl.isl_map_copy(arg1.ptr))
        return map(ctx=self.ctx, ptr=res)
    def deltas(self):
        res = isl.isl_map_deltas(isl.isl_map_copy(self.ptr))
        return set(ctx=self.ctx, ptr=res)
    def detect_equalities(self):
        res = isl.isl_map_detect_equalities(isl.isl_map_copy(self.ptr))
        return map(ctx=self.ctx, ptr=res)
    def affine_hull(self):
        res = isl.isl_map_affine_hull(isl.isl_map_copy(self.ptr))
        return basic_map(ctx=self.ctx, ptr=res)
    def polyhedral_hull(self):
        res = isl.isl_map_polyhedral_hull(isl.isl_map_copy(self.ptr))
        return basic_map(ctx=self.ctx, ptr=res)
    def flatten(self):
        res = isl.isl_map_flatten(isl.isl_map_copy(self.ptr))
        return map(ctx=self.ctx, ptr=res)
    def flatten_domain(self):
        res = isl.isl_map_flatten_domain(isl.isl_map_copy(self.ptr))
        return map(ctx=self.ctx, ptr=res)
    def flatten_range(self):
        res = isl.isl_map_flatten_range(isl.isl_map_copy(self.ptr))
        return map(ctx=self.ctx, ptr=res)
    def sample(self):
        res = isl.isl_map_sample(isl.isl_map_copy(self.ptr))
        return basic_map(ctx=self.ctx, ptr=res)
    def is_empty(self):
        res = isl.isl_map_is_empty(self.ptr)
        return res
    def is_subset(self, arg1):
        try:
            if not arg1.__class__ is map:
                arg1 = map(arg1)
        except:
            return union_map(self).is_subset(arg1)
        res = isl.isl_map_is_subset(self.ptr, arg1.ptr)
        return res
    def is_strict_subset(self, arg1):
        try:
            if not arg1.__class__ is map:
                arg1 = map(arg1)
        except:
            return union_map(self).is_strict_subset(arg1)
        res = isl.isl_map_is_strict_subset(self.ptr, arg1.ptr)
        return res
    def is_equal(self, arg1):
        try:
            if not arg1.__class__ is map:
                arg1 = map(arg1)
        except:
            return union_map(self).is_equal(arg1)
        res = isl.isl_map_is_equal(self.ptr, arg1.ptr)
        return res
    def is_single_valued(self):
        res = isl.isl_map_is_single_valued(self.ptr)
        return res
    def is_injective(self):
        res = isl.isl_map_is_injective(self.ptr)
        return res
    def is_bijective(self):
        res = isl.isl_map_is_bijective(self.ptr)
        return res
    def gist(self, arg1):
        try:
            if not arg1.__class__ is map:
                arg1 = map(arg1)
        except:
            return union_map(self).gist(arg1)
        res = isl.isl_map_gist(isl.isl_map_copy(self.ptr), isl.isl_map_copy(arg1.ptr))
        return map(ctx=self.ctx, ptr=res)
    def gist_domain(self, arg1):
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            return union_map(self).gist_domain(arg1)
        res = isl.isl_map_gist_domain(isl.isl_map_copy(self.ptr), isl.isl_set_copy(arg1.ptr))
        return map(ctx=self.ctx, ptr=res)
    def coalesce(self):
        res = isl.isl_map_coalesce(isl.isl_map_copy(self.ptr))
        return map(ctx=self.ctx, ptr=res)
    def foreach_basic_map(self, arg1):
        exc_info = [None]
        fn = CFUNCTYPE(c_int, c_void_p, c_void_p)
        def cb_func(cb_arg0, cb_arg1):
            cb_arg0 = basic_map(ctx=self.ctx, ptr=cb_arg0)
            try:
                arg1(cb_arg0)
            except:
                import sys
                exc_info[0] = sys.exc_info()
                return -1
            return 0
        cb = fn(cb_func)
        res = isl.isl_map_foreach_basic_map(self.ptr, cb, None)
        if exc_info[0] != None:
            raise exc_info[0][0], exc_info[0][1], exc_info[0][2]
        return res

isl.isl_map_read_from_str.restype = c_void_p
isl.isl_map_read_from_str.argtypes = [Context, c_char_p]
isl.isl_map_from_basic_map.restype = c_void_p
isl.isl_map_from_basic_map.argtypes = [c_void_p]
isl.isl_map_lexmin.restype = c_void_p
isl.isl_map_lexmax.restype = c_void_p
isl.isl_map_reverse.restype = c_void_p
isl.isl_map_union.restype = c_void_p
isl.isl_map_intersect_domain.restype = c_void_p
isl.isl_map_intersect_range.restype = c_void_p
isl.isl_map_apply_domain.restype = c_void_p
isl.isl_map_apply_range.restype = c_void_p
isl.isl_map_intersect.restype = c_void_p
isl.isl_map_intersect_params.restype = c_void_p
isl.isl_map_subtract.restype = c_void_p
isl.isl_map_deltas.restype = c_void_p
isl.isl_map_detect_equalities.restype = c_void_p
isl.isl_map_affine_hull.restype = c_void_p
isl.isl_map_polyhedral_hull.restype = c_void_p
isl.isl_map_flatten.restype = c_void_p
isl.isl_map_flatten_domain.restype = c_void_p
isl.isl_map_flatten_range.restype = c_void_p
isl.isl_map_sample.restype = c_void_p
isl.isl_map_gist.restype = c_void_p
isl.isl_map_gist_domain.restype = c_void_p
isl.isl_map_coalesce.restype = c_void_p
isl.isl_map_free.argtypes = [c_void_p]
isl.isl_map_to_str.argtypes = [c_void_p]
isl.isl_map_to_str.restype = POINTER(c_char)

class basic_map(map):
    def __init__(self, *args, **keywords):
        if "ptr" in keywords:
            self.ctx = keywords["ctx"]
            self.ptr = keywords["ptr"]
            return
        if len(args) == 1 and type(args[0]) == str:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_basic_map_read_from_str(self.ctx, args[0])
            return
        raise Error
    def __del__(self):
        if hasattr(self, 'ptr'):
            isl.isl_basic_map_free(self.ptr)
    def __str__(self):
        ptr = isl.isl_basic_map_to_str(self.ptr)
        res = str(cast(ptr, c_char_p).value)
        libc.free(ptr)
        return res
    def __repr__(self):
        return 'isl.basic_map("%s")' % str(self)
    def intersect_domain(self, arg1):
        try:
            if not arg1.__class__ is basic_set:
                arg1 = basic_set(arg1)
        except:
            return map(self).intersect_domain(arg1)
        res = isl.isl_basic_map_intersect_domain(isl.isl_basic_map_copy(self.ptr), isl.isl_basic_set_copy(arg1.ptr))
        return basic_map(ctx=self.ctx, ptr=res)
    def intersect_range(self, arg1):
        try:
            if not arg1.__class__ is basic_set:
                arg1 = basic_set(arg1)
        except:
            return map(self).intersect_range(arg1)
        res = isl.isl_basic_map_intersect_range(isl.isl_basic_map_copy(self.ptr), isl.isl_basic_set_copy(arg1.ptr))
        return basic_map(ctx=self.ctx, ptr=res)
    def intersect(self, arg1):
        try:
            if not arg1.__class__ is basic_map:
                arg1 = basic_map(arg1)
        except:
            return map(self).intersect(arg1)
        res = isl.isl_basic_map_intersect(isl.isl_basic_map_copy(self.ptr), isl.isl_basic_map_copy(arg1.ptr))
        return basic_map(ctx=self.ctx, ptr=res)
    def union(self, arg1):
        try:
            if not arg1.__class__ is basic_map:
                arg1 = basic_map(arg1)
        except:
            return map(self).union(arg1)
        res = isl.isl_basic_map_union(isl.isl_basic_map_copy(self.ptr), isl.isl_basic_map_copy(arg1.ptr))
        return map(ctx=self.ctx, ptr=res)
    def apply_domain(self, arg1):
        try:
            if not arg1.__class__ is basic_map:
                arg1 = basic_map(arg1)
        except:
            return map(self).apply_domain(arg1)
        res = isl.isl_basic_map_apply_domain(isl.isl_basic_map_copy(self.ptr), isl.isl_basic_map_copy(arg1.ptr))
        return basic_map(ctx=self.ctx, ptr=res)
    def apply_range(self, arg1):
        try:
            if not arg1.__class__ is basic_map:
                arg1 = basic_map(arg1)
        except:
            return map(self).apply_range(arg1)
        res = isl.isl_basic_map_apply_range(isl.isl_basic_map_copy(self.ptr), isl.isl_basic_map_copy(arg1.ptr))
        return basic_map(ctx=self.ctx, ptr=res)
    def affine_hull(self):
        res = isl.isl_basic_map_affine_hull(isl.isl_basic_map_copy(self.ptr))
        return basic_map(ctx=self.ctx, ptr=res)
    def reverse(self):
        res = isl.isl_basic_map_reverse(isl.isl_basic_map_copy(self.ptr))
        return basic_map(ctx=self.ctx, ptr=res)
    def sample(self):
        res = isl.isl_basic_map_sample(isl.isl_basic_map_copy(self.ptr))
        return basic_map(ctx=self.ctx, ptr=res)
    def detect_equalities(self):
        res = isl.isl_basic_map_detect_equalities(isl.isl_basic_map_copy(self.ptr))
        return basic_map(ctx=self.ctx, ptr=res)
    def is_equal(self, arg1):
        try:
            if not arg1.__class__ is basic_map:
                arg1 = basic_map(arg1)
        except:
            return map(self).is_equal(arg1)
        res = isl.isl_basic_map_is_equal(self.ptr, arg1.ptr)
        return res
    def lexmin(self):
        res = isl.isl_basic_map_lexmin(isl.isl_basic_map_copy(self.ptr))
        return map(ctx=self.ctx, ptr=res)
    def lexmax(self):
        res = isl.isl_basic_map_lexmax(isl.isl_basic_map_copy(self.ptr))
        return map(ctx=self.ctx, ptr=res)
    def is_empty(self):
        res = isl.isl_basic_map_is_empty(self.ptr)
        return res
    def deltas(self):
        res = isl.isl_basic_map_deltas(isl.isl_basic_map_copy(self.ptr))
        return basic_set(ctx=self.ctx, ptr=res)
    def flatten(self):
        res = isl.isl_basic_map_flatten(isl.isl_basic_map_copy(self.ptr))
        return basic_map(ctx=self.ctx, ptr=res)
    def flatten_domain(self):
        res = isl.isl_basic_map_flatten_domain(isl.isl_basic_map_copy(self.ptr))
        return basic_map(ctx=self.ctx, ptr=res)
    def flatten_range(self):
        res = isl.isl_basic_map_flatten_range(isl.isl_basic_map_copy(self.ptr))
        return basic_map(ctx=self.ctx, ptr=res)
    def gist(self, arg1):
        try:
            if not arg1.__class__ is basic_map:
                arg1 = basic_map(arg1)
        except:
            return map(self).gist(arg1)
        res = isl.isl_basic_map_gist(isl.isl_basic_map_copy(self.ptr), isl.isl_basic_map_copy(arg1.ptr))
        return basic_map(ctx=self.ctx, ptr=res)

isl.isl_basic_map_read_from_str.restype = c_void_p
isl.isl_basic_map_read_from_str.argtypes = [Context, c_char_p]
isl.isl_basic_map_intersect_domain.restype = c_void_p
isl.isl_basic_map_intersect_range.restype = c_void_p
isl.isl_basic_map_intersect.restype = c_void_p
isl.isl_basic_map_union.restype = c_void_p
isl.isl_basic_map_apply_domain.restype = c_void_p
isl.isl_basic_map_apply_range.restype = c_void_p
isl.isl_basic_map_affine_hull.restype = c_void_p
isl.isl_basic_map_reverse.restype = c_void_p
isl.isl_basic_map_sample.restype = c_void_p
isl.isl_basic_map_detect_equalities.restype = c_void_p
isl.isl_basic_map_lexmin.restype = c_void_p
isl.isl_basic_map_lexmax.restype = c_void_p
isl.isl_basic_map_deltas.restype = c_void_p
isl.isl_basic_map_flatten.restype = c_void_p
isl.isl_basic_map_flatten_domain.restype = c_void_p
isl.isl_basic_map_flatten_range.restype = c_void_p
isl.isl_basic_map_gist.restype = c_void_p
isl.isl_basic_map_free.argtypes = [c_void_p]
isl.isl_basic_map_to_str.argtypes = [c_void_p]
isl.isl_basic_map_to_str.restype = POINTER(c_char)

class union_set:
    def __init__(self, *args, **keywords):
        if "ptr" in keywords:
            self.ctx = keywords["ctx"]
            self.ptr = keywords["ptr"]
            return
        if len(args) == 1 and args[0].__class__ is set:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_union_set_from_set(isl.isl_set_copy(args[0].ptr))
            return
        if len(args) == 1 and type(args[0]) == str:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_union_set_read_from_str(self.ctx, args[0])
            return
        raise Error
    def __del__(self):
        if hasattr(self, 'ptr'):
            isl.isl_union_set_free(self.ptr)
    def __str__(self):
        ptr = isl.isl_union_set_to_str(self.ptr)
        res = str(cast(ptr, c_char_p).value)
        libc.free(ptr)
        return res
    def __repr__(self):
        return 'isl.union_set("%s")' % str(self)
    def identity(self):
        res = isl.isl_union_set_identity(isl.isl_union_set_copy(self.ptr))
        return union_map(ctx=self.ctx, ptr=res)
    def detect_equalities(self):
        res = isl.isl_union_set_detect_equalities(isl.isl_union_set_copy(self.ptr))
        return union_set(ctx=self.ctx, ptr=res)
    def affine_hull(self):
        res = isl.isl_union_set_affine_hull(isl.isl_union_set_copy(self.ptr))
        return union_set(ctx=self.ctx, ptr=res)
    def polyhedral_hull(self):
        res = isl.isl_union_set_polyhedral_hull(isl.isl_union_set_copy(self.ptr))
        return union_set(ctx=self.ctx, ptr=res)
    def coalesce(self):
        res = isl.isl_union_set_coalesce(isl.isl_union_set_copy(self.ptr))
        return union_set(ctx=self.ctx, ptr=res)
    def lexmin(self):
        res = isl.isl_union_set_lexmin(isl.isl_union_set_copy(self.ptr))
        return union_set(ctx=self.ctx, ptr=res)
    def lexmax(self):
        res = isl.isl_union_set_lexmax(isl.isl_union_set_copy(self.ptr))
        return union_set(ctx=self.ctx, ptr=res)
    def subtract(self, arg1):
        try:
            if not arg1.__class__ is union_set:
                arg1 = union_set(arg1)
        except:
            raise
        res = isl.isl_union_set_subtract(isl.isl_union_set_copy(self.ptr), isl.isl_union_set_copy(arg1.ptr))
        return union_set(ctx=self.ctx, ptr=res)
    def intersect(self, arg1):
        try:
            if not arg1.__class__ is union_set:
                arg1 = union_set(arg1)
        except:
            raise
        res = isl.isl_union_set_intersect(isl.isl_union_set_copy(self.ptr), isl.isl_union_set_copy(arg1.ptr))
        return union_set(ctx=self.ctx, ptr=res)
    def intersect_params(self, arg1):
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            raise
        res = isl.isl_union_set_intersect_params(isl.isl_union_set_copy(self.ptr), isl.isl_set_copy(arg1.ptr))
        return union_set(ctx=self.ctx, ptr=res)
    def gist(self, arg1):
        try:
            if not arg1.__class__ is union_set:
                arg1 = union_set(arg1)
        except:
            raise
        res = isl.isl_union_set_gist(isl.isl_union_set_copy(self.ptr), isl.isl_union_set_copy(arg1.ptr))
        return union_set(ctx=self.ctx, ptr=res)
    def gist_params(self, arg1):
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            raise
        res = isl.isl_union_set_gist_params(isl.isl_union_set_copy(self.ptr), isl.isl_set_copy(arg1.ptr))
        return union_set(ctx=self.ctx, ptr=res)
    def apply(self, arg1):
        try:
            if not arg1.__class__ is union_map:
                arg1 = union_map(arg1)
        except:
            raise
        res = isl.isl_union_set_apply(isl.isl_union_set_copy(self.ptr), isl.isl_union_map_copy(arg1.ptr))
        return union_set(ctx=self.ctx, ptr=res)
    def is_empty(self):
        res = isl.isl_union_set_is_empty(self.ptr)
        return res
    def is_subset(self, arg1):
        try:
            if not arg1.__class__ is union_set:
                arg1 = union_set(arg1)
        except:
            raise
        res = isl.isl_union_set_is_subset(self.ptr, arg1.ptr)
        return res
    def is_equal(self, arg1):
        try:
            if not arg1.__class__ is union_set:
                arg1 = union_set(arg1)
        except:
            raise
        res = isl.isl_union_set_is_equal(self.ptr, arg1.ptr)
        return res
    def is_strict_subset(self, arg1):
        try:
            if not arg1.__class__ is union_set:
                arg1 = union_set(arg1)
        except:
            raise
        res = isl.isl_union_set_is_strict_subset(self.ptr, arg1.ptr)
        return res
    def foreach_set(self, arg1):
        exc_info = [None]
        fn = CFUNCTYPE(c_int, c_void_p, c_void_p)
        def cb_func(cb_arg0, cb_arg1):
            cb_arg0 = set(ctx=self.ctx, ptr=cb_arg0)
            try:
                arg1(cb_arg0)
            except:
                import sys
                exc_info[0] = sys.exc_info()
                return -1
            return 0
        cb = fn(cb_func)
        res = isl.isl_union_set_foreach_set(self.ptr, cb, None)
        if exc_info[0] != None:
            raise exc_info[0][0], exc_info[0][1], exc_info[0][2]
        return res

isl.isl_union_set_from_set.restype = c_void_p
isl.isl_union_set_from_set.argtypes = [c_void_p]
isl.isl_union_set_read_from_str.restype = c_void_p
isl.isl_union_set_read_from_str.argtypes = [Context, c_char_p]
isl.isl_union_set_identity.restype = c_void_p
isl.isl_union_set_detect_equalities.restype = c_void_p
isl.isl_union_set_affine_hull.restype = c_void_p
isl.isl_union_set_polyhedral_hull.restype = c_void_p
isl.isl_union_set_coalesce.restype = c_void_p
isl.isl_union_set_lexmin.restype = c_void_p
isl.isl_union_set_lexmax.restype = c_void_p
isl.isl_union_set_subtract.restype = c_void_p
isl.isl_union_set_intersect.restype = c_void_p
isl.isl_union_set_intersect_params.restype = c_void_p
isl.isl_union_set_gist.restype = c_void_p
isl.isl_union_set_gist_params.restype = c_void_p
isl.isl_union_set_apply.restype = c_void_p
isl.isl_union_set_free.argtypes = [c_void_p]
isl.isl_union_set_to_str.argtypes = [c_void_p]
isl.isl_union_set_to_str.restype = POINTER(c_char)

class set(union_set):
    def __init__(self, *args, **keywords):
        if "ptr" in keywords:
            self.ctx = keywords["ctx"]
            self.ptr = keywords["ptr"]
            return
        if len(args) == 1 and type(args[0]) == str:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_set_read_from_str(self.ctx, args[0])
            return
        if len(args) == 1 and args[0].__class__ is basic_set:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_set_from_basic_set(isl.isl_basic_set_copy(args[0].ptr))
            return
        raise Error
    def __del__(self):
        if hasattr(self, 'ptr'):
            isl.isl_set_free(self.ptr)
    def __str__(self):
        ptr = isl.isl_set_to_str(self.ptr)
        res = str(cast(ptr, c_char_p).value)
        libc.free(ptr)
        return res
    def __repr__(self):
        return 'isl.set("%s")' % str(self)
    def intersect(self, arg1):
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            return union_set(self).intersect(arg1)
        res = isl.isl_set_intersect(isl.isl_set_copy(self.ptr), isl.isl_set_copy(arg1.ptr))
        return set(ctx=self.ctx, ptr=res)
    def intersect_params(self, arg1):
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            return union_set(self).intersect_params(arg1)
        res = isl.isl_set_intersect_params(isl.isl_set_copy(self.ptr), isl.isl_set_copy(arg1.ptr))
        return set(ctx=self.ctx, ptr=res)
    def subtract(self, arg1):
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            return union_set(self).subtract(arg1)
        res = isl.isl_set_subtract(isl.isl_set_copy(self.ptr), isl.isl_set_copy(arg1.ptr))
        return set(ctx=self.ctx, ptr=res)
    def complement(self):
        res = isl.isl_set_complement(isl.isl_set_copy(self.ptr))
        return set(ctx=self.ctx, ptr=res)
    def apply(self, arg1):
        try:
            if not arg1.__class__ is map:
                arg1 = map(arg1)
        except:
            return union_set(self).apply(arg1)
        res = isl.isl_set_apply(isl.isl_set_copy(self.ptr), isl.isl_map_copy(arg1.ptr))
        return set(ctx=self.ctx, ptr=res)
    def is_empty(self):
        res = isl.isl_set_is_empty(self.ptr)
        return res
    def is_subset(self, arg1):
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            return union_set(self).is_subset(arg1)
        res = isl.isl_set_is_subset(self.ptr, arg1.ptr)
        return res
    def is_strict_subset(self, arg1):
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            return union_set(self).is_strict_subset(arg1)
        res = isl.isl_set_is_strict_subset(self.ptr, arg1.ptr)
        return res
    def is_equal(self, arg1):
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            return union_set(self).is_equal(arg1)
        res = isl.isl_set_is_equal(self.ptr, arg1.ptr)
        return res
    def gist(self, arg1):
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            return union_set(self).gist(arg1)
        res = isl.isl_set_gist(isl.isl_set_copy(self.ptr), isl.isl_set_copy(arg1.ptr))
        return set(ctx=self.ctx, ptr=res)
    def coalesce(self):
        res = isl.isl_set_coalesce(isl.isl_set_copy(self.ptr))
        return set(ctx=self.ctx, ptr=res)
    def foreach_basic_set(self, arg1):
        exc_info = [None]
        fn = CFUNCTYPE(c_int, c_void_p, c_void_p)
        def cb_func(cb_arg0, cb_arg1):
            cb_arg0 = basic_set(ctx=self.ctx, ptr=cb_arg0)
            try:
                arg1(cb_arg0)
            except:
                import sys
                exc_info[0] = sys.exc_info()
                return -1
            return 0
        cb = fn(cb_func)
        res = isl.isl_set_foreach_basic_set(self.ptr, cb, None)
        if exc_info[0] != None:
            raise exc_info[0][0], exc_info[0][1], exc_info[0][2]
        return res
    def lexmin(self):
        res = isl.isl_set_lexmin(isl.isl_set_copy(self.ptr))
        return set(ctx=self.ctx, ptr=res)
    def lexmax(self):
        res = isl.isl_set_lexmax(isl.isl_set_copy(self.ptr))
        return set(ctx=self.ctx, ptr=res)
    def detect_equalities(self):
        res = isl.isl_set_detect_equalities(isl.isl_set_copy(self.ptr))
        return set(ctx=self.ctx, ptr=res)
    def affine_hull(self):
        res = isl.isl_set_affine_hull(isl.isl_set_copy(self.ptr))
        return basic_set(ctx=self.ctx, ptr=res)
    def polyhedral_hull(self):
        res = isl.isl_set_polyhedral_hull(isl.isl_set_copy(self.ptr))
        return basic_set(ctx=self.ctx, ptr=res)
    def union(self, arg1):
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            return union_set(self).union(arg1)
        res = isl.isl_set_union(isl.isl_set_copy(self.ptr), isl.isl_set_copy(arg1.ptr))
        return set(ctx=self.ctx, ptr=res)
    def identity(self):
        res = isl.isl_set_identity(isl.isl_set_copy(self.ptr))
        return map(ctx=self.ctx, ptr=res)
    def is_wrapping(self):
        res = isl.isl_set_is_wrapping(self.ptr)
        return res
    def flatten(self):
        res = isl.isl_set_flatten(isl.isl_set_copy(self.ptr))
        return set(ctx=self.ctx, ptr=res)

isl.isl_set_read_from_str.restype = c_void_p
isl.isl_set_read_from_str.argtypes = [Context, c_char_p]
isl.isl_set_from_basic_set.restype = c_void_p
isl.isl_set_from_basic_set.argtypes = [c_void_p]
isl.isl_set_intersect.restype = c_void_p
isl.isl_set_intersect_params.restype = c_void_p
isl.isl_set_subtract.restype = c_void_p
isl.isl_set_complement.restype = c_void_p
isl.isl_set_apply.restype = c_void_p
isl.isl_set_gist.restype = c_void_p
isl.isl_set_coalesce.restype = c_void_p
isl.isl_set_lexmin.restype = c_void_p
isl.isl_set_lexmax.restype = c_void_p
isl.isl_set_detect_equalities.restype = c_void_p
isl.isl_set_affine_hull.restype = c_void_p
isl.isl_set_polyhedral_hull.restype = c_void_p
isl.isl_set_union.restype = c_void_p
isl.isl_set_identity.restype = c_void_p
isl.isl_set_flatten.restype = c_void_p
isl.isl_set_free.argtypes = [c_void_p]
isl.isl_set_to_str.argtypes = [c_void_p]
isl.isl_set_to_str.restype = POINTER(c_char)

class basic_set(set):
    def __init__(self, *args, **keywords):
        if "ptr" in keywords:
            self.ctx = keywords["ctx"]
            self.ptr = keywords["ptr"]
            return
        if len(args) == 1 and type(args[0]) == str:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_basic_set_read_from_str(self.ctx, args[0])
            return
        raise Error
    def __del__(self):
        if hasattr(self, 'ptr'):
            isl.isl_basic_set_free(self.ptr)
    def __str__(self):
        ptr = isl.isl_basic_set_to_str(self.ptr)
        res = str(cast(ptr, c_char_p).value)
        libc.free(ptr)
        return res
    def __repr__(self):
        return 'isl.basic_set("%s")' % str(self)
    def gist(self, arg1):
        try:
            if not arg1.__class__ is basic_set:
                arg1 = basic_set(arg1)
        except:
            return set(self).gist(arg1)
        res = isl.isl_basic_set_gist(isl.isl_basic_set_copy(self.ptr), isl.isl_basic_set_copy(arg1.ptr))
        return basic_set(ctx=self.ctx, ptr=res)
    def intersect(self, arg1):
        try:
            if not arg1.__class__ is basic_set:
                arg1 = basic_set(arg1)
        except:
            return set(self).intersect(arg1)
        res = isl.isl_basic_set_intersect(isl.isl_basic_set_copy(self.ptr), isl.isl_basic_set_copy(arg1.ptr))
        return basic_set(ctx=self.ctx, ptr=res)
    def intersect_params(self, arg1):
        try:
            if not arg1.__class__ is basic_set:
                arg1 = basic_set(arg1)
        except:
            return set(self).intersect_params(arg1)
        res = isl.isl_basic_set_intersect_params(isl.isl_basic_set_copy(self.ptr), isl.isl_basic_set_copy(arg1.ptr))
        return basic_set(ctx=self.ctx, ptr=res)
    def apply(self, arg1):
        try:
            if not arg1.__class__ is basic_map:
                arg1 = basic_map(arg1)
        except:
            return set(self).apply(arg1)
        res = isl.isl_basic_set_apply(isl.isl_basic_set_copy(self.ptr), isl.isl_basic_map_copy(arg1.ptr))
        return basic_set(ctx=self.ctx, ptr=res)
    def affine_hull(self):
        res = isl.isl_basic_set_affine_hull(isl.isl_basic_set_copy(self.ptr))
        return basic_set(ctx=self.ctx, ptr=res)
    def detect_equalities(self):
        res = isl.isl_basic_set_detect_equalities(isl.isl_basic_set_copy(self.ptr))
        return basic_set(ctx=self.ctx, ptr=res)
    def is_equal(self, arg1):
        res = isl.isl_basic_set_is_equal(self.ptr, arg1.ptr)
        return res
    def lexmin(self):
        res = isl.isl_basic_set_lexmin(isl.isl_basic_set_copy(self.ptr))
        return set(ctx=self.ctx, ptr=res)
    def lexmax(self):
        res = isl.isl_basic_set_lexmax(isl.isl_basic_set_copy(self.ptr))
        return set(ctx=self.ctx, ptr=res)
    def union(self, arg1):
        try:
            if not arg1.__class__ is basic_set:
                arg1 = basic_set(arg1)
        except:
            return set(self).union(arg1)
        res = isl.isl_basic_set_union(isl.isl_basic_set_copy(self.ptr), isl.isl_basic_set_copy(arg1.ptr))
        return set(ctx=self.ctx, ptr=res)
    def is_empty(self):
        res = isl.isl_basic_set_is_empty(self.ptr)
        return res
    def is_wrapping(self):
        res = isl.isl_basic_set_is_wrapping(self.ptr)
        return res
    def flatten(self):
        res = isl.isl_basic_set_flatten(isl.isl_basic_set_copy(self.ptr))
        return basic_set(ctx=self.ctx, ptr=res)

isl.isl_basic_set_read_from_str.restype = c_void_p
isl.isl_basic_set_read_from_str.argtypes = [Context, c_char_p]
isl.isl_basic_set_gist.restype = c_void_p
isl.isl_basic_set_intersect.restype = c_void_p
isl.isl_basic_set_intersect_params.restype = c_void_p
isl.isl_basic_set_apply.restype = c_void_p
isl.isl_basic_set_affine_hull.restype = c_void_p
isl.isl_basic_set_detect_equalities.restype = c_void_p
isl.isl_basic_set_lexmin.restype = c_void_p
isl.isl_basic_set_lexmax.restype = c_void_p
isl.isl_basic_set_union.restype = c_void_p
isl.isl_basic_set_flatten.restype = c_void_p
isl.isl_basic_set_free.argtypes = [c_void_p]
isl.isl_basic_set_to_str.argtypes = [c_void_p]
isl.isl_basic_set_to_str.restype = POINTER(c_char)

class pw_qpolynomial:
    def __init__(self, *args, **keywords):
        if "ptr" in keywords:
            self.ctx = keywords["ctx"]
            self.ptr = keywords["ptr"]
            return
        raise Error
    def __del__(self):
        if hasattr(self, 'ptr'):
            isl.isl_pw_qpolynomial_free(self.ptr)
    def __str__(self):
        ptr = isl.isl_pw_qpolynomial_to_str(self.ptr)
        res = str(cast(ptr, c_char_p).value)
        libc.free(ptr)
        return res
    def __repr__(self):
        return 'isl.pw_qpolynomial("%s")' % str(self)

isl.isl_pw_qpolynomial_free.argtypes = [c_void_p]
isl.isl_pw_qpolynomial_to_str.argtypes = [c_void_p]
isl.isl_pw_qpolynomial_to_str.restype = POINTER(c_char)

class union_pw_qpolynomial:
    def __init__(self, *args, **keywords):
        if "ptr" in keywords:
            self.ctx = keywords["ctx"]
            self.ptr = keywords["ptr"]
            return
        raise Error
    def __del__(self):
        if hasattr(self, 'ptr'):
            isl.isl_union_pw_qpolynomial_free(self.ptr)
    def __str__(self):
        ptr = isl.isl_union_pw_qpolynomial_to_str(self.ptr)
        res = str(cast(ptr, c_char_p).value)
        libc.free(ptr)
        return res
    def __repr__(self):
        return 'isl.union_pw_qpolynomial("%s")' % str(self)

isl.isl_union_pw_qpolynomial_free.argtypes = [c_void_p]
isl.isl_union_pw_qpolynomial_to_str.argtypes = [c_void_p]
isl.isl_union_pw_qpolynomial_to_str.restype = POINTER(c_char)
