isl_dlname='libisl.so.23'
import os
from ctypes import *
from ctypes.util import find_library

isl_dyld_library_path = os.environ.get('ISL_DYLD_LIBRARY_PATH')
if isl_dyld_library_path != None:
    os.environ['DYLD_LIBRARY_PATH'] =  isl_dyld_library_path
try:
    isl = cdll.LoadLibrary(isl_dlname)
except:
    isl = cdll.LoadLibrary(find_library("isl"))
libc = cdll.LoadLibrary(find_library("c"))

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 c_void_p(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_pw_multi_aff(object):
    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 multi_aff:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_union_pw_multi_aff_from_multi_aff(isl.isl_multi_aff_copy(args[0].ptr))
            return
        if len(args) == 1 and args[0].__class__ is pw_multi_aff:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_union_pw_multi_aff_from_pw_multi_aff(isl.isl_pw_multi_aff_copy(args[0].ptr))
            return
        if len(args) == 1 and args[0].__class__ is union_pw_aff:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_union_pw_multi_aff_from_union_pw_aff(isl.isl_union_pw_aff_copy(args[0].ptr))
            return
        if len(args) == 1 and type(args[0]) == str:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_union_pw_multi_aff_read_from_str(self.ctx, args[0].encode('ascii'))
            return
        raise Error
    def __del__(self):
        if hasattr(self, 'ptr'):
            isl.isl_union_pw_multi_aff_free(self.ptr)
    def __str__(arg0):
        try:
            if not arg0.__class__ is union_pw_multi_aff:
                arg0 = union_pw_multi_aff(arg0)
        except:
            raise
        ptr = isl.isl_union_pw_multi_aff_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.union_pw_multi_aff("""%s""")' % s
        else:
            return 'isl.union_pw_multi_aff("%s")' % s
    def add(arg0, arg1):
        try:
            if not arg0.__class__ is union_pw_multi_aff:
                arg0 = union_pw_multi_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_pw_multi_aff:
                arg1 = union_pw_multi_aff(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_pw_multi_aff_add(isl.isl_union_pw_multi_aff_copy(arg0.ptr), isl.isl_union_pw_multi_aff_copy(arg1.ptr))
        obj = union_pw_multi_aff(ctx=ctx, ptr=res)
        return obj
    def apply(*args):
        if len(args) == 2 and args[1].__class__ is union_pw_multi_aff:
            ctx = args[0].ctx
            res = isl.isl_union_pw_multi_aff_apply_union_pw_multi_aff(isl.isl_union_pw_multi_aff_copy(args[0].ptr), isl.isl_union_pw_multi_aff_copy(args[1].ptr))
            obj = union_pw_multi_aff(ctx=ctx, ptr=res)
            return obj
        raise Error
    def as_multi_union_pw_aff(arg0):
        try:
            if not arg0.__class__ is union_pw_multi_aff:
                arg0 = union_pw_multi_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_pw_multi_aff_as_multi_union_pw_aff(isl.isl_union_pw_multi_aff_copy(arg0.ptr))
        obj = multi_union_pw_aff(ctx=ctx, ptr=res)
        return obj
    def as_pw_multi_aff(arg0):
        try:
            if not arg0.__class__ is union_pw_multi_aff:
                arg0 = union_pw_multi_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_pw_multi_aff_as_pw_multi_aff(isl.isl_union_pw_multi_aff_copy(arg0.ptr))
        obj = pw_multi_aff(ctx=ctx, ptr=res)
        return obj
    def as_union_map(arg0):
        try:
            if not arg0.__class__ is union_pw_multi_aff:
                arg0 = union_pw_multi_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_pw_multi_aff_as_union_map(isl.isl_union_pw_multi_aff_copy(arg0.ptr))
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def coalesce(arg0):
        try:
            if not arg0.__class__ is union_pw_multi_aff:
                arg0 = union_pw_multi_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_pw_multi_aff_coalesce(isl.isl_union_pw_multi_aff_copy(arg0.ptr))
        obj = union_pw_multi_aff(ctx=ctx, ptr=res)
        return obj
    def domain(arg0):
        try:
            if not arg0.__class__ is union_pw_multi_aff:
                arg0 = union_pw_multi_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_pw_multi_aff_domain(isl.isl_union_pw_multi_aff_copy(arg0.ptr))
        obj = union_set(ctx=ctx, ptr=res)
        return obj
    @staticmethod
    def empty(*args):
        if len(args) == 0:
            ctx = Context.getDefaultInstance()
            res = isl.isl_union_pw_multi_aff_empty_ctx(ctx)
            obj = union_pw_multi_aff(ctx=ctx, ptr=res)
            return obj
        raise Error
    def extract_pw_multi_aff(arg0, arg1):
        try:
            if not arg0.__class__ is union_pw_multi_aff:
                arg0 = union_pw_multi_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is space:
                arg1 = space(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_pw_multi_aff_extract_pw_multi_aff(arg0.ptr, isl.isl_space_copy(arg1.ptr))
        obj = pw_multi_aff(ctx=ctx, ptr=res)
        return obj
    def flat_range_product(arg0, arg1):
        try:
            if not arg0.__class__ is union_pw_multi_aff:
                arg0 = union_pw_multi_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_pw_multi_aff:
                arg1 = union_pw_multi_aff(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_pw_multi_aff_flat_range_product(isl.isl_union_pw_multi_aff_copy(arg0.ptr), isl.isl_union_pw_multi_aff_copy(arg1.ptr))
        obj = union_pw_multi_aff(ctx=ctx, ptr=res)
        return obj
    def gist(arg0, arg1):
        try:
            if not arg0.__class__ is union_pw_multi_aff:
                arg0 = union_pw_multi_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_set:
                arg1 = union_set(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_pw_multi_aff_gist(isl.isl_union_pw_multi_aff_copy(arg0.ptr), isl.isl_union_set_copy(arg1.ptr))
        obj = union_pw_multi_aff(ctx=ctx, ptr=res)
        return obj
    def intersect_domain(*args):
        if len(args) == 2 and args[1].__class__ is space:
            ctx = args[0].ctx
            res = isl.isl_union_pw_multi_aff_intersect_domain_space(isl.isl_union_pw_multi_aff_copy(args[0].ptr), isl.isl_space_copy(args[1].ptr))
            obj = union_pw_multi_aff(ctx=ctx, ptr=res)
            return obj
        if len(args) == 2 and args[1].__class__ is union_set:
            ctx = args[0].ctx
            res = isl.isl_union_pw_multi_aff_intersect_domain_union_set(isl.isl_union_pw_multi_aff_copy(args[0].ptr), isl.isl_union_set_copy(args[1].ptr))
            obj = union_pw_multi_aff(ctx=ctx, ptr=res)
            return obj
        raise Error
    def intersect_domain_wrapped_domain(arg0, arg1):
        try:
            if not arg0.__class__ is union_pw_multi_aff:
                arg0 = union_pw_multi_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_set:
                arg1 = union_set(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_pw_multi_aff_intersect_domain_wrapped_domain(isl.isl_union_pw_multi_aff_copy(arg0.ptr), isl.isl_union_set_copy(arg1.ptr))
        obj = union_pw_multi_aff(ctx=ctx, ptr=res)
        return obj
    def intersect_domain_wrapped_range(arg0, arg1):
        try:
            if not arg0.__class__ is union_pw_multi_aff:
                arg0 = union_pw_multi_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_set:
                arg1 = union_set(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_pw_multi_aff_intersect_domain_wrapped_range(isl.isl_union_pw_multi_aff_copy(arg0.ptr), isl.isl_union_set_copy(arg1.ptr))
        obj = union_pw_multi_aff(ctx=ctx, ptr=res)
        return obj
    def intersect_params(arg0, arg1):
        try:
            if not arg0.__class__ is union_pw_multi_aff:
                arg0 = union_pw_multi_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_pw_multi_aff_intersect_params(isl.isl_union_pw_multi_aff_copy(arg0.ptr), isl.isl_set_copy(arg1.ptr))
        obj = union_pw_multi_aff(ctx=ctx, ptr=res)
        return obj
    def involves_locals(arg0):
        try:
            if not arg0.__class__ is union_pw_multi_aff:
                arg0 = union_pw_multi_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_pw_multi_aff_involves_locals(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def isa_pw_multi_aff(arg0):
        try:
            if not arg0.__class__ is union_pw_multi_aff:
                arg0 = union_pw_multi_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_pw_multi_aff_isa_pw_multi_aff(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def plain_is_empty(arg0):
        try:
            if not arg0.__class__ is union_pw_multi_aff:
                arg0 = union_pw_multi_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_pw_multi_aff_plain_is_empty(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def preimage_domain_wrapped_domain(*args):
        if len(args) == 2 and args[1].__class__ is union_pw_multi_aff:
            ctx = args[0].ctx
            res = isl.isl_union_pw_multi_aff_preimage_domain_wrapped_domain_union_pw_multi_aff(isl.isl_union_pw_multi_aff_copy(args[0].ptr), isl.isl_union_pw_multi_aff_copy(args[1].ptr))
            obj = union_pw_multi_aff(ctx=ctx, ptr=res)
            return obj
        raise Error
    def pullback(*args):
        if len(args) == 2 and args[1].__class__ is union_pw_multi_aff:
            ctx = args[0].ctx
            res = isl.isl_union_pw_multi_aff_pullback_union_pw_multi_aff(isl.isl_union_pw_multi_aff_copy(args[0].ptr), isl.isl_union_pw_multi_aff_copy(args[1].ptr))
            obj = union_pw_multi_aff(ctx=ctx, ptr=res)
            return obj
        raise Error
    def pw_multi_aff_list(arg0):
        try:
            if not arg0.__class__ is union_pw_multi_aff:
                arg0 = union_pw_multi_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_pw_multi_aff_get_pw_multi_aff_list(arg0.ptr)
        obj = pw_multi_aff_list(ctx=ctx, ptr=res)
        return obj
    def get_pw_multi_aff_list(arg0):
        return arg0.pw_multi_aff_list()
    def range_factor_domain(arg0):
        try:
            if not arg0.__class__ is union_pw_multi_aff:
                arg0 = union_pw_multi_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_pw_multi_aff_range_factor_domain(isl.isl_union_pw_multi_aff_copy(arg0.ptr))
        obj = union_pw_multi_aff(ctx=ctx, ptr=res)
        return obj
    def range_factor_range(arg0):
        try:
            if not arg0.__class__ is union_pw_multi_aff:
                arg0 = union_pw_multi_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_pw_multi_aff_range_factor_range(isl.isl_union_pw_multi_aff_copy(arg0.ptr))
        obj = union_pw_multi_aff(ctx=ctx, ptr=res)
        return obj
    def range_product(arg0, arg1):
        try:
            if not arg0.__class__ is union_pw_multi_aff:
                arg0 = union_pw_multi_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_pw_multi_aff:
                arg1 = union_pw_multi_aff(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_pw_multi_aff_range_product(isl.isl_union_pw_multi_aff_copy(arg0.ptr), isl.isl_union_pw_multi_aff_copy(arg1.ptr))
        obj = union_pw_multi_aff(ctx=ctx, ptr=res)
        return obj
    def space(arg0):
        try:
            if not arg0.__class__ is union_pw_multi_aff:
                arg0 = union_pw_multi_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_pw_multi_aff_get_space(arg0.ptr)
        obj = space(ctx=ctx, ptr=res)
        return obj
    def get_space(arg0):
        return arg0.space()
    def sub(arg0, arg1):
        try:
            if not arg0.__class__ is union_pw_multi_aff:
                arg0 = union_pw_multi_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_pw_multi_aff:
                arg1 = union_pw_multi_aff(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_pw_multi_aff_sub(isl.isl_union_pw_multi_aff_copy(arg0.ptr), isl.isl_union_pw_multi_aff_copy(arg1.ptr))
        obj = union_pw_multi_aff(ctx=ctx, ptr=res)
        return obj
    def subtract_domain(*args):
        if len(args) == 2 and args[1].__class__ is space:
            ctx = args[0].ctx
            res = isl.isl_union_pw_multi_aff_subtract_domain_space(isl.isl_union_pw_multi_aff_copy(args[0].ptr), isl.isl_space_copy(args[1].ptr))
            obj = union_pw_multi_aff(ctx=ctx, ptr=res)
            return obj
        if len(args) == 2 and args[1].__class__ is union_set:
            ctx = args[0].ctx
            res = isl.isl_union_pw_multi_aff_subtract_domain_union_set(isl.isl_union_pw_multi_aff_copy(args[0].ptr), isl.isl_union_set_copy(args[1].ptr))
            obj = union_pw_multi_aff(ctx=ctx, ptr=res)
            return obj
        raise Error
    def union_add(arg0, arg1):
        try:
            if not arg0.__class__ is union_pw_multi_aff:
                arg0 = union_pw_multi_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_pw_multi_aff:
                arg1 = union_pw_multi_aff(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_pw_multi_aff_union_add(isl.isl_union_pw_multi_aff_copy(arg0.ptr), isl.isl_union_pw_multi_aff_copy(arg1.ptr))
        obj = union_pw_multi_aff(ctx=ctx, ptr=res)
        return obj

isl.isl_union_pw_multi_aff_from_multi_aff.restype = c_void_p
isl.isl_union_pw_multi_aff_from_multi_aff.argtypes = [c_void_p]
isl.isl_union_pw_multi_aff_from_pw_multi_aff.restype = c_void_p
isl.isl_union_pw_multi_aff_from_pw_multi_aff.argtypes = [c_void_p]
isl.isl_union_pw_multi_aff_from_union_pw_aff.restype = c_void_p
isl.isl_union_pw_multi_aff_from_union_pw_aff.argtypes = [c_void_p]
isl.isl_union_pw_multi_aff_read_from_str.restype = c_void_p
isl.isl_union_pw_multi_aff_read_from_str.argtypes = [Context, c_char_p]
isl.isl_union_pw_multi_aff_add.restype = c_void_p
isl.isl_union_pw_multi_aff_add.argtypes = [c_void_p, c_void_p]
isl.isl_union_pw_multi_aff_apply_union_pw_multi_aff.restype = c_void_p
isl.isl_union_pw_multi_aff_apply_union_pw_multi_aff.argtypes = [c_void_p, c_void_p]
isl.isl_union_pw_multi_aff_as_multi_union_pw_aff.restype = c_void_p
isl.isl_union_pw_multi_aff_as_multi_union_pw_aff.argtypes = [c_void_p]
isl.isl_union_pw_multi_aff_as_pw_multi_aff.restype = c_void_p
isl.isl_union_pw_multi_aff_as_pw_multi_aff.argtypes = [c_void_p]
isl.isl_union_pw_multi_aff_as_union_map.restype = c_void_p
isl.isl_union_pw_multi_aff_as_union_map.argtypes = [c_void_p]
isl.isl_union_pw_multi_aff_coalesce.restype = c_void_p
isl.isl_union_pw_multi_aff_coalesce.argtypes = [c_void_p]
isl.isl_union_pw_multi_aff_domain.restype = c_void_p
isl.isl_union_pw_multi_aff_domain.argtypes = [c_void_p]
isl.isl_union_pw_multi_aff_empty_ctx.restype = c_void_p
isl.isl_union_pw_multi_aff_empty_ctx.argtypes = [Context]
isl.isl_union_pw_multi_aff_extract_pw_multi_aff.restype = c_void_p
isl.isl_union_pw_multi_aff_extract_pw_multi_aff.argtypes = [c_void_p, c_void_p]
isl.isl_union_pw_multi_aff_flat_range_product.restype = c_void_p
isl.isl_union_pw_multi_aff_flat_range_product.argtypes = [c_void_p, c_void_p]
isl.isl_union_pw_multi_aff_gist.restype = c_void_p
isl.isl_union_pw_multi_aff_gist.argtypes = [c_void_p, c_void_p]
isl.isl_union_pw_multi_aff_intersect_domain_space.restype = c_void_p
isl.isl_union_pw_multi_aff_intersect_domain_space.argtypes = [c_void_p, c_void_p]
isl.isl_union_pw_multi_aff_intersect_domain_union_set.restype = c_void_p
isl.isl_union_pw_multi_aff_intersect_domain_union_set.argtypes = [c_void_p, c_void_p]
isl.isl_union_pw_multi_aff_intersect_domain_wrapped_domain.restype = c_void_p
isl.isl_union_pw_multi_aff_intersect_domain_wrapped_domain.argtypes = [c_void_p, c_void_p]
isl.isl_union_pw_multi_aff_intersect_domain_wrapped_range.restype = c_void_p
isl.isl_union_pw_multi_aff_intersect_domain_wrapped_range.argtypes = [c_void_p, c_void_p]
isl.isl_union_pw_multi_aff_intersect_params.restype = c_void_p
isl.isl_union_pw_multi_aff_intersect_params.argtypes = [c_void_p, c_void_p]
isl.isl_union_pw_multi_aff_involves_locals.argtypes = [c_void_p]
isl.isl_union_pw_multi_aff_isa_pw_multi_aff.argtypes = [c_void_p]
isl.isl_union_pw_multi_aff_plain_is_empty.argtypes = [c_void_p]
isl.isl_union_pw_multi_aff_preimage_domain_wrapped_domain_union_pw_multi_aff.restype = c_void_p
isl.isl_union_pw_multi_aff_preimage_domain_wrapped_domain_union_pw_multi_aff.argtypes = [c_void_p, c_void_p]
isl.isl_union_pw_multi_aff_pullback_union_pw_multi_aff.restype = c_void_p
isl.isl_union_pw_multi_aff_pullback_union_pw_multi_aff.argtypes = [c_void_p, c_void_p]
isl.isl_union_pw_multi_aff_get_pw_multi_aff_list.restype = c_void_p
isl.isl_union_pw_multi_aff_get_pw_multi_aff_list.argtypes = [c_void_p]
isl.isl_union_pw_multi_aff_range_factor_domain.restype = c_void_p
isl.isl_union_pw_multi_aff_range_factor_domain.argtypes = [c_void_p]
isl.isl_union_pw_multi_aff_range_factor_range.restype = c_void_p
isl.isl_union_pw_multi_aff_range_factor_range.argtypes = [c_void_p]
isl.isl_union_pw_multi_aff_range_product.restype = c_void_p
isl.isl_union_pw_multi_aff_range_product.argtypes = [c_void_p, c_void_p]
isl.isl_union_pw_multi_aff_get_space.restype = c_void_p
isl.isl_union_pw_multi_aff_get_space.argtypes = [c_void_p]
isl.isl_union_pw_multi_aff_sub.restype = c_void_p
isl.isl_union_pw_multi_aff_sub.argtypes = [c_void_p, c_void_p]
isl.isl_union_pw_multi_aff_subtract_domain_space.restype = c_void_p
isl.isl_union_pw_multi_aff_subtract_domain_space.argtypes = [c_void_p, c_void_p]
isl.isl_union_pw_multi_aff_subtract_domain_union_set.restype = c_void_p
isl.isl_union_pw_multi_aff_subtract_domain_union_set.argtypes = [c_void_p, c_void_p]
isl.isl_union_pw_multi_aff_union_add.restype = c_void_p
isl.isl_union_pw_multi_aff_union_add.argtypes = [c_void_p, c_void_p]
isl.isl_union_pw_multi_aff_copy.restype = c_void_p
isl.isl_union_pw_multi_aff_copy.argtypes = [c_void_p]
isl.isl_union_pw_multi_aff_free.restype = c_void_p
isl.isl_union_pw_multi_aff_free.argtypes = [c_void_p]
isl.isl_union_pw_multi_aff_to_str.restype = POINTER(c_char)
isl.isl_union_pw_multi_aff_to_str.argtypes = [c_void_p]

class multi_union_pw_aff(object):
    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 multi_pw_aff:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_multi_union_pw_aff_from_multi_pw_aff(isl.isl_multi_pw_aff_copy(args[0].ptr))
            return
        if len(args) == 1 and args[0].__class__ is union_pw_aff:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_multi_union_pw_aff_from_union_pw_aff(isl.isl_union_pw_aff_copy(args[0].ptr))
            return
        if len(args) == 2 and args[0].__class__ is space and args[1].__class__ is union_pw_aff_list:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_multi_union_pw_aff_from_union_pw_aff_list(isl.isl_space_copy(args[0].ptr), isl.isl_union_pw_aff_list_copy(args[1].ptr))
            return
        if len(args) == 1 and type(args[0]) == str:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_multi_union_pw_aff_read_from_str(self.ctx, args[0].encode('ascii'))
            return
        raise Error
    def __del__(self):
        if hasattr(self, 'ptr'):
            isl.isl_multi_union_pw_aff_free(self.ptr)
    def __str__(arg0):
        try:
            if not arg0.__class__ is multi_union_pw_aff:
                arg0 = multi_union_pw_aff(arg0)
        except:
            raise
        ptr = isl.isl_multi_union_pw_aff_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.multi_union_pw_aff("""%s""")' % s
        else:
            return 'isl.multi_union_pw_aff("%s")' % s
    def add(arg0, arg1):
        try:
            if not arg0.__class__ is multi_union_pw_aff:
                arg0 = multi_union_pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_union_pw_aff:
                arg1 = multi_union_pw_aff(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_union_pw_aff_add(isl.isl_multi_union_pw_aff_copy(arg0.ptr), isl.isl_multi_union_pw_aff_copy(arg1.ptr))
        obj = multi_union_pw_aff(ctx=ctx, ptr=res)
        return obj
    def at(arg0, arg1):
        try:
            if not arg0.__class__ is multi_union_pw_aff:
                arg0 = multi_union_pw_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_union_pw_aff_get_at(arg0.ptr, arg1)
        obj = union_pw_aff(ctx=ctx, ptr=res)
        return obj
    def get_at(arg0, arg1):
        return arg0.at(arg1)
    def bind(arg0, arg1):
        try:
            if not arg0.__class__ is multi_union_pw_aff:
                arg0 = multi_union_pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_id:
                arg1 = multi_id(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_union_pw_aff_bind(isl.isl_multi_union_pw_aff_copy(arg0.ptr), isl.isl_multi_id_copy(arg1.ptr))
        obj = union_set(ctx=ctx, ptr=res)
        return obj
    def coalesce(arg0):
        try:
            if not arg0.__class__ is multi_union_pw_aff:
                arg0 = multi_union_pw_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_union_pw_aff_coalesce(isl.isl_multi_union_pw_aff_copy(arg0.ptr))
        obj = multi_union_pw_aff(ctx=ctx, ptr=res)
        return obj
    def domain(arg0):
        try:
            if not arg0.__class__ is multi_union_pw_aff:
                arg0 = multi_union_pw_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_union_pw_aff_domain(isl.isl_multi_union_pw_aff_copy(arg0.ptr))
        obj = union_set(ctx=ctx, ptr=res)
        return obj
    def flat_range_product(arg0, arg1):
        try:
            if not arg0.__class__ is multi_union_pw_aff:
                arg0 = multi_union_pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_union_pw_aff:
                arg1 = multi_union_pw_aff(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_union_pw_aff_flat_range_product(isl.isl_multi_union_pw_aff_copy(arg0.ptr), isl.isl_multi_union_pw_aff_copy(arg1.ptr))
        obj = multi_union_pw_aff(ctx=ctx, ptr=res)
        return obj
    def gist(arg0, arg1):
        try:
            if not arg0.__class__ is multi_union_pw_aff:
                arg0 = multi_union_pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_set:
                arg1 = union_set(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_union_pw_aff_gist(isl.isl_multi_union_pw_aff_copy(arg0.ptr), isl.isl_union_set_copy(arg1.ptr))
        obj = multi_union_pw_aff(ctx=ctx, ptr=res)
        return obj
    def has_range_tuple_id(arg0):
        try:
            if not arg0.__class__ is multi_union_pw_aff:
                arg0 = multi_union_pw_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_union_pw_aff_has_range_tuple_id(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def intersect_domain(arg0, arg1):
        try:
            if not arg0.__class__ is multi_union_pw_aff:
                arg0 = multi_union_pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_set:
                arg1 = union_set(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_union_pw_aff_intersect_domain(isl.isl_multi_union_pw_aff_copy(arg0.ptr), isl.isl_union_set_copy(arg1.ptr))
        obj = multi_union_pw_aff(ctx=ctx, ptr=res)
        return obj
    def intersect_params(arg0, arg1):
        try:
            if not arg0.__class__ is multi_union_pw_aff:
                arg0 = multi_union_pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_union_pw_aff_intersect_params(isl.isl_multi_union_pw_aff_copy(arg0.ptr), isl.isl_set_copy(arg1.ptr))
        obj = multi_union_pw_aff(ctx=ctx, ptr=res)
        return obj
    def involves_nan(arg0):
        try:
            if not arg0.__class__ is multi_union_pw_aff:
                arg0 = multi_union_pw_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_union_pw_aff_involves_nan(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def list(arg0):
        try:
            if not arg0.__class__ is multi_union_pw_aff:
                arg0 = multi_union_pw_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_union_pw_aff_get_list(arg0.ptr)
        obj = union_pw_aff_list(ctx=ctx, ptr=res)
        return obj
    def get_list(arg0):
        return arg0.list()
    def neg(arg0):
        try:
            if not arg0.__class__ is multi_union_pw_aff:
                arg0 = multi_union_pw_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_union_pw_aff_neg(isl.isl_multi_union_pw_aff_copy(arg0.ptr))
        obj = multi_union_pw_aff(ctx=ctx, ptr=res)
        return obj
    def plain_is_equal(arg0, arg1):
        try:
            if not arg0.__class__ is multi_union_pw_aff:
                arg0 = multi_union_pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_union_pw_aff:
                arg1 = multi_union_pw_aff(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_union_pw_aff_plain_is_equal(arg0.ptr, arg1.ptr)
        if res < 0:
            raise
        return bool(res)
    def pullback(*args):
        if len(args) == 2 and args[1].__class__ is union_pw_multi_aff:
            ctx = args[0].ctx
            res = isl.isl_multi_union_pw_aff_pullback_union_pw_multi_aff(isl.isl_multi_union_pw_aff_copy(args[0].ptr), isl.isl_union_pw_multi_aff_copy(args[1].ptr))
            obj = multi_union_pw_aff(ctx=ctx, ptr=res)
            return obj
        raise Error
    def range_product(arg0, arg1):
        try:
            if not arg0.__class__ is multi_union_pw_aff:
                arg0 = multi_union_pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_union_pw_aff:
                arg1 = multi_union_pw_aff(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_union_pw_aff_range_product(isl.isl_multi_union_pw_aff_copy(arg0.ptr), isl.isl_multi_union_pw_aff_copy(arg1.ptr))
        obj = multi_union_pw_aff(ctx=ctx, ptr=res)
        return obj
    def range_tuple_id(arg0):
        try:
            if not arg0.__class__ is multi_union_pw_aff:
                arg0 = multi_union_pw_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_union_pw_aff_get_range_tuple_id(arg0.ptr)
        obj = id(ctx=ctx, ptr=res)
        return obj
    def get_range_tuple_id(arg0):
        return arg0.range_tuple_id()
    def reset_range_tuple_id(arg0):
        try:
            if not arg0.__class__ is multi_union_pw_aff:
                arg0 = multi_union_pw_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_union_pw_aff_reset_range_tuple_id(isl.isl_multi_union_pw_aff_copy(arg0.ptr))
        obj = multi_union_pw_aff(ctx=ctx, ptr=res)
        return obj
    def scale(*args):
        if len(args) == 2 and args[1].__class__ is multi_val:
            ctx = args[0].ctx
            res = isl.isl_multi_union_pw_aff_scale_multi_val(isl.isl_multi_union_pw_aff_copy(args[0].ptr), isl.isl_multi_val_copy(args[1].ptr))
            obj = multi_union_pw_aff(ctx=ctx, ptr=res)
            return obj
        if len(args) == 2 and (args[1].__class__ is val or type(args[1]) == int):
            args = list(args)
            try:
                if not args[1].__class__ is val:
                    args[1] = val(args[1])
            except:
                raise
            ctx = args[0].ctx
            res = isl.isl_multi_union_pw_aff_scale_val(isl.isl_multi_union_pw_aff_copy(args[0].ptr), isl.isl_val_copy(args[1].ptr))
            obj = multi_union_pw_aff(ctx=ctx, ptr=res)
            return obj
        raise Error
    def scale_down(*args):
        if len(args) == 2 and args[1].__class__ is multi_val:
            ctx = args[0].ctx
            res = isl.isl_multi_union_pw_aff_scale_down_multi_val(isl.isl_multi_union_pw_aff_copy(args[0].ptr), isl.isl_multi_val_copy(args[1].ptr))
            obj = multi_union_pw_aff(ctx=ctx, ptr=res)
            return obj
        if len(args) == 2 and (args[1].__class__ is val or type(args[1]) == int):
            args = list(args)
            try:
                if not args[1].__class__ is val:
                    args[1] = val(args[1])
            except:
                raise
            ctx = args[0].ctx
            res = isl.isl_multi_union_pw_aff_scale_down_val(isl.isl_multi_union_pw_aff_copy(args[0].ptr), isl.isl_val_copy(args[1].ptr))
            obj = multi_union_pw_aff(ctx=ctx, ptr=res)
            return obj
        raise Error
    def set_at(arg0, arg1, arg2):
        try:
            if not arg0.__class__ is multi_union_pw_aff:
                arg0 = multi_union_pw_aff(arg0)
        except:
            raise
        try:
            if not arg2.__class__ is union_pw_aff:
                arg2 = union_pw_aff(arg2)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_union_pw_aff_set_at(isl.isl_multi_union_pw_aff_copy(arg0.ptr), arg1, isl.isl_union_pw_aff_copy(arg2.ptr))
        obj = multi_union_pw_aff(ctx=ctx, ptr=res)
        return obj
    def set_range_tuple(*args):
        if len(args) == 2 and (args[1].__class__ is id or type(args[1]) == str):
            args = list(args)
            try:
                if not args[1].__class__ is id:
                    args[1] = id(args[1])
            except:
                raise
            ctx = args[0].ctx
            res = isl.isl_multi_union_pw_aff_set_range_tuple_id(isl.isl_multi_union_pw_aff_copy(args[0].ptr), isl.isl_id_copy(args[1].ptr))
            obj = multi_union_pw_aff(ctx=ctx, ptr=res)
            return obj
        raise Error
    def size(arg0):
        try:
            if not arg0.__class__ is multi_union_pw_aff:
                arg0 = multi_union_pw_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_union_pw_aff_size(arg0.ptr)
        if res < 0:
            raise
        return int(res)
    def space(arg0):
        try:
            if not arg0.__class__ is multi_union_pw_aff:
                arg0 = multi_union_pw_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_union_pw_aff_get_space(arg0.ptr)
        obj = space(ctx=ctx, ptr=res)
        return obj
    def get_space(arg0):
        return arg0.space()
    def sub(arg0, arg1):
        try:
            if not arg0.__class__ is multi_union_pw_aff:
                arg0 = multi_union_pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_union_pw_aff:
                arg1 = multi_union_pw_aff(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_union_pw_aff_sub(isl.isl_multi_union_pw_aff_copy(arg0.ptr), isl.isl_multi_union_pw_aff_copy(arg1.ptr))
        obj = multi_union_pw_aff(ctx=ctx, ptr=res)
        return obj
    def union_add(arg0, arg1):
        try:
            if not arg0.__class__ is multi_union_pw_aff:
                arg0 = multi_union_pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_union_pw_aff:
                arg1 = multi_union_pw_aff(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_union_pw_aff_union_add(isl.isl_multi_union_pw_aff_copy(arg0.ptr), isl.isl_multi_union_pw_aff_copy(arg1.ptr))
        obj = multi_union_pw_aff(ctx=ctx, ptr=res)
        return obj
    @staticmethod
    def zero(arg0):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_union_pw_aff_zero(isl.isl_space_copy(arg0.ptr))
        obj = multi_union_pw_aff(ctx=ctx, ptr=res)
        return obj

isl.isl_multi_union_pw_aff_from_multi_pw_aff.restype = c_void_p
isl.isl_multi_union_pw_aff_from_multi_pw_aff.argtypes = [c_void_p]
isl.isl_multi_union_pw_aff_from_union_pw_aff.restype = c_void_p
isl.isl_multi_union_pw_aff_from_union_pw_aff.argtypes = [c_void_p]
isl.isl_multi_union_pw_aff_from_union_pw_aff_list.restype = c_void_p
isl.isl_multi_union_pw_aff_from_union_pw_aff_list.argtypes = [c_void_p, c_void_p]
isl.isl_multi_union_pw_aff_read_from_str.restype = c_void_p
isl.isl_multi_union_pw_aff_read_from_str.argtypes = [Context, c_char_p]
isl.isl_multi_union_pw_aff_add.restype = c_void_p
isl.isl_multi_union_pw_aff_add.argtypes = [c_void_p, c_void_p]
isl.isl_multi_union_pw_aff_get_at.restype = c_void_p
isl.isl_multi_union_pw_aff_get_at.argtypes = [c_void_p, c_int]
isl.isl_multi_union_pw_aff_bind.restype = c_void_p
isl.isl_multi_union_pw_aff_bind.argtypes = [c_void_p, c_void_p]
isl.isl_multi_union_pw_aff_coalesce.restype = c_void_p
isl.isl_multi_union_pw_aff_coalesce.argtypes = [c_void_p]
isl.isl_multi_union_pw_aff_domain.restype = c_void_p
isl.isl_multi_union_pw_aff_domain.argtypes = [c_void_p]
isl.isl_multi_union_pw_aff_flat_range_product.restype = c_void_p
isl.isl_multi_union_pw_aff_flat_range_product.argtypes = [c_void_p, c_void_p]
isl.isl_multi_union_pw_aff_gist.restype = c_void_p
isl.isl_multi_union_pw_aff_gist.argtypes = [c_void_p, c_void_p]
isl.isl_multi_union_pw_aff_has_range_tuple_id.argtypes = [c_void_p]
isl.isl_multi_union_pw_aff_intersect_domain.restype = c_void_p
isl.isl_multi_union_pw_aff_intersect_domain.argtypes = [c_void_p, c_void_p]
isl.isl_multi_union_pw_aff_intersect_params.restype = c_void_p
isl.isl_multi_union_pw_aff_intersect_params.argtypes = [c_void_p, c_void_p]
isl.isl_multi_union_pw_aff_involves_nan.argtypes = [c_void_p]
isl.isl_multi_union_pw_aff_get_list.restype = c_void_p
isl.isl_multi_union_pw_aff_get_list.argtypes = [c_void_p]
isl.isl_multi_union_pw_aff_neg.restype = c_void_p
isl.isl_multi_union_pw_aff_neg.argtypes = [c_void_p]
isl.isl_multi_union_pw_aff_plain_is_equal.argtypes = [c_void_p, c_void_p]
isl.isl_multi_union_pw_aff_pullback_union_pw_multi_aff.restype = c_void_p
isl.isl_multi_union_pw_aff_pullback_union_pw_multi_aff.argtypes = [c_void_p, c_void_p]
isl.isl_multi_union_pw_aff_range_product.restype = c_void_p
isl.isl_multi_union_pw_aff_range_product.argtypes = [c_void_p, c_void_p]
isl.isl_multi_union_pw_aff_get_range_tuple_id.restype = c_void_p
isl.isl_multi_union_pw_aff_get_range_tuple_id.argtypes = [c_void_p]
isl.isl_multi_union_pw_aff_reset_range_tuple_id.restype = c_void_p
isl.isl_multi_union_pw_aff_reset_range_tuple_id.argtypes = [c_void_p]
isl.isl_multi_union_pw_aff_scale_multi_val.restype = c_void_p
isl.isl_multi_union_pw_aff_scale_multi_val.argtypes = [c_void_p, c_void_p]
isl.isl_multi_union_pw_aff_scale_val.restype = c_void_p
isl.isl_multi_union_pw_aff_scale_val.argtypes = [c_void_p, c_void_p]
isl.isl_multi_union_pw_aff_scale_down_multi_val.restype = c_void_p
isl.isl_multi_union_pw_aff_scale_down_multi_val.argtypes = [c_void_p, c_void_p]
isl.isl_multi_union_pw_aff_scale_down_val.restype = c_void_p
isl.isl_multi_union_pw_aff_scale_down_val.argtypes = [c_void_p, c_void_p]
isl.isl_multi_union_pw_aff_set_at.restype = c_void_p
isl.isl_multi_union_pw_aff_set_at.argtypes = [c_void_p, c_int, c_void_p]
isl.isl_multi_union_pw_aff_set_range_tuple_id.restype = c_void_p
isl.isl_multi_union_pw_aff_set_range_tuple_id.argtypes = [c_void_p, c_void_p]
isl.isl_multi_union_pw_aff_size.argtypes = [c_void_p]
isl.isl_multi_union_pw_aff_get_space.restype = c_void_p
isl.isl_multi_union_pw_aff_get_space.argtypes = [c_void_p]
isl.isl_multi_union_pw_aff_sub.restype = c_void_p
isl.isl_multi_union_pw_aff_sub.argtypes = [c_void_p, c_void_p]
isl.isl_multi_union_pw_aff_union_add.restype = c_void_p
isl.isl_multi_union_pw_aff_union_add.argtypes = [c_void_p, c_void_p]
isl.isl_multi_union_pw_aff_zero.restype = c_void_p
isl.isl_multi_union_pw_aff_zero.argtypes = [c_void_p]
isl.isl_multi_union_pw_aff_copy.restype = c_void_p
isl.isl_multi_union_pw_aff_copy.argtypes = [c_void_p]
isl.isl_multi_union_pw_aff_free.restype = c_void_p
isl.isl_multi_union_pw_aff_free.argtypes = [c_void_p]
isl.isl_multi_union_pw_aff_to_str.restype = POINTER(c_char)
isl.isl_multi_union_pw_aff_to_str.argtypes = [c_void_p]

class union_pw_aff(union_pw_multi_aff, multi_union_pw_aff):
    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 aff:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_union_pw_aff_from_aff(isl.isl_aff_copy(args[0].ptr))
            return
        if len(args) == 1 and args[0].__class__ is pw_aff:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_union_pw_aff_from_pw_aff(isl.isl_pw_aff_copy(args[0].ptr))
            return
        if len(args) == 1 and type(args[0]) == str:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_union_pw_aff_read_from_str(self.ctx, args[0].encode('ascii'))
            return
        raise Error
    def __del__(self):
        if hasattr(self, 'ptr'):
            isl.isl_union_pw_aff_free(self.ptr)
    def __str__(arg0):
        try:
            if not arg0.__class__ is union_pw_aff:
                arg0 = union_pw_aff(arg0)
        except:
            raise
        ptr = isl.isl_union_pw_aff_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.union_pw_aff("""%s""")' % s
        else:
            return 'isl.union_pw_aff("%s")' % s
    def add(arg0, arg1):
        try:
            if not arg0.__class__ is union_pw_aff:
                arg0 = union_pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_pw_aff:
                arg1 = union_pw_aff(arg1)
        except:
            return union_pw_multi_aff(arg0).add(arg1)
        ctx = arg0.ctx
        res = isl.isl_union_pw_aff_add(isl.isl_union_pw_aff_copy(arg0.ptr), isl.isl_union_pw_aff_copy(arg1.ptr))
        obj = union_pw_aff(ctx=ctx, ptr=res)
        return obj
    def bind(*args):
        if len(args) == 2 and (args[1].__class__ is id or type(args[1]) == str):
            args = list(args)
            try:
                if not args[1].__class__ is id:
                    args[1] = id(args[1])
            except:
                raise
            ctx = args[0].ctx
            res = isl.isl_union_pw_aff_bind_id(isl.isl_union_pw_aff_copy(args[0].ptr), isl.isl_id_copy(args[1].ptr))
            obj = union_set(ctx=ctx, ptr=res)
            return obj
        raise Error
    def coalesce(arg0):
        try:
            if not arg0.__class__ is union_pw_aff:
                arg0 = union_pw_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_pw_aff_coalesce(isl.isl_union_pw_aff_copy(arg0.ptr))
        obj = union_pw_aff(ctx=ctx, ptr=res)
        return obj
    def domain(arg0):
        try:
            if not arg0.__class__ is union_pw_aff:
                arg0 = union_pw_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_pw_aff_domain(isl.isl_union_pw_aff_copy(arg0.ptr))
        obj = union_set(ctx=ctx, ptr=res)
        return obj
    def gist(arg0, arg1):
        try:
            if not arg0.__class__ is union_pw_aff:
                arg0 = union_pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_set:
                arg1 = union_set(arg1)
        except:
            return union_pw_multi_aff(arg0).gist(arg1)
        ctx = arg0.ctx
        res = isl.isl_union_pw_aff_gist(isl.isl_union_pw_aff_copy(arg0.ptr), isl.isl_union_set_copy(arg1.ptr))
        obj = union_pw_aff(ctx=ctx, ptr=res)
        return obj
    def intersect_domain(*args):
        if len(args) == 2 and args[1].__class__ is space:
            ctx = args[0].ctx
            res = isl.isl_union_pw_aff_intersect_domain_space(isl.isl_union_pw_aff_copy(args[0].ptr), isl.isl_space_copy(args[1].ptr))
            obj = union_pw_aff(ctx=ctx, ptr=res)
            return obj
        if len(args) == 2 and args[1].__class__ is union_set:
            ctx = args[0].ctx
            res = isl.isl_union_pw_aff_intersect_domain_union_set(isl.isl_union_pw_aff_copy(args[0].ptr), isl.isl_union_set_copy(args[1].ptr))
            obj = union_pw_aff(ctx=ctx, ptr=res)
            return obj
        raise Error
    def intersect_domain_wrapped_domain(arg0, arg1):
        try:
            if not arg0.__class__ is union_pw_aff:
                arg0 = union_pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_set:
                arg1 = union_set(arg1)
        except:
            return union_pw_multi_aff(arg0).intersect_domain_wrapped_domain(arg1)
        ctx = arg0.ctx
        res = isl.isl_union_pw_aff_intersect_domain_wrapped_domain(isl.isl_union_pw_aff_copy(arg0.ptr), isl.isl_union_set_copy(arg1.ptr))
        obj = union_pw_aff(ctx=ctx, ptr=res)
        return obj
    def intersect_domain_wrapped_range(arg0, arg1):
        try:
            if not arg0.__class__ is union_pw_aff:
                arg0 = union_pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_set:
                arg1 = union_set(arg1)
        except:
            return union_pw_multi_aff(arg0).intersect_domain_wrapped_range(arg1)
        ctx = arg0.ctx
        res = isl.isl_union_pw_aff_intersect_domain_wrapped_range(isl.isl_union_pw_aff_copy(arg0.ptr), isl.isl_union_set_copy(arg1.ptr))
        obj = union_pw_aff(ctx=ctx, ptr=res)
        return obj
    def intersect_params(arg0, arg1):
        try:
            if not arg0.__class__ is union_pw_aff:
                arg0 = union_pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            return union_pw_multi_aff(arg0).intersect_params(arg1)
        ctx = arg0.ctx
        res = isl.isl_union_pw_aff_intersect_params(isl.isl_union_pw_aff_copy(arg0.ptr), isl.isl_set_copy(arg1.ptr))
        obj = union_pw_aff(ctx=ctx, ptr=res)
        return obj
    def pullback(*args):
        if len(args) == 2 and args[1].__class__ is union_pw_multi_aff:
            ctx = args[0].ctx
            res = isl.isl_union_pw_aff_pullback_union_pw_multi_aff(isl.isl_union_pw_aff_copy(args[0].ptr), isl.isl_union_pw_multi_aff_copy(args[1].ptr))
            obj = union_pw_aff(ctx=ctx, ptr=res)
            return obj
        raise Error
    def space(arg0):
        try:
            if not arg0.__class__ is union_pw_aff:
                arg0 = union_pw_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_pw_aff_get_space(arg0.ptr)
        obj = space(ctx=ctx, ptr=res)
        return obj
    def get_space(arg0):
        return arg0.space()
    def sub(arg0, arg1):
        try:
            if not arg0.__class__ is union_pw_aff:
                arg0 = union_pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_pw_aff:
                arg1 = union_pw_aff(arg1)
        except:
            return union_pw_multi_aff(arg0).sub(arg1)
        ctx = arg0.ctx
        res = isl.isl_union_pw_aff_sub(isl.isl_union_pw_aff_copy(arg0.ptr), isl.isl_union_pw_aff_copy(arg1.ptr))
        obj = union_pw_aff(ctx=ctx, ptr=res)
        return obj
    def subtract_domain(*args):
        if len(args) == 2 and args[1].__class__ is space:
            ctx = args[0].ctx
            res = isl.isl_union_pw_aff_subtract_domain_space(isl.isl_union_pw_aff_copy(args[0].ptr), isl.isl_space_copy(args[1].ptr))
            obj = union_pw_aff(ctx=ctx, ptr=res)
            return obj
        if len(args) == 2 and args[1].__class__ is union_set:
            ctx = args[0].ctx
            res = isl.isl_union_pw_aff_subtract_domain_union_set(isl.isl_union_pw_aff_copy(args[0].ptr), isl.isl_union_set_copy(args[1].ptr))
            obj = union_pw_aff(ctx=ctx, ptr=res)
            return obj
        raise Error
    def to_list(arg0):
        try:
            if not arg0.__class__ is union_pw_aff:
                arg0 = union_pw_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_pw_aff_to_list(isl.isl_union_pw_aff_copy(arg0.ptr))
        obj = union_pw_aff_list(ctx=ctx, ptr=res)
        return obj
    def union_add(arg0, arg1):
        try:
            if not arg0.__class__ is union_pw_aff:
                arg0 = union_pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_pw_aff:
                arg1 = union_pw_aff(arg1)
        except:
            return union_pw_multi_aff(arg0).union_add(arg1)
        ctx = arg0.ctx
        res = isl.isl_union_pw_aff_union_add(isl.isl_union_pw_aff_copy(arg0.ptr), isl.isl_union_pw_aff_copy(arg1.ptr))
        obj = union_pw_aff(ctx=ctx, ptr=res)
        return obj

isl.isl_union_pw_aff_from_aff.restype = c_void_p
isl.isl_union_pw_aff_from_aff.argtypes = [c_void_p]
isl.isl_union_pw_aff_from_pw_aff.restype = c_void_p
isl.isl_union_pw_aff_from_pw_aff.argtypes = [c_void_p]
isl.isl_union_pw_aff_read_from_str.restype = c_void_p
isl.isl_union_pw_aff_read_from_str.argtypes = [Context, c_char_p]
isl.isl_union_pw_aff_add.restype = c_void_p
isl.isl_union_pw_aff_add.argtypes = [c_void_p, c_void_p]
isl.isl_union_pw_aff_bind_id.restype = c_void_p
isl.isl_union_pw_aff_bind_id.argtypes = [c_void_p, c_void_p]
isl.isl_union_pw_aff_coalesce.restype = c_void_p
isl.isl_union_pw_aff_coalesce.argtypes = [c_void_p]
isl.isl_union_pw_aff_domain.restype = c_void_p
isl.isl_union_pw_aff_domain.argtypes = [c_void_p]
isl.isl_union_pw_aff_gist.restype = c_void_p
isl.isl_union_pw_aff_gist.argtypes = [c_void_p, c_void_p]
isl.isl_union_pw_aff_intersect_domain_space.restype = c_void_p
isl.isl_union_pw_aff_intersect_domain_space.argtypes = [c_void_p, c_void_p]
isl.isl_union_pw_aff_intersect_domain_union_set.restype = c_void_p
isl.isl_union_pw_aff_intersect_domain_union_set.argtypes = [c_void_p, c_void_p]
isl.isl_union_pw_aff_intersect_domain_wrapped_domain.restype = c_void_p
isl.isl_union_pw_aff_intersect_domain_wrapped_domain.argtypes = [c_void_p, c_void_p]
isl.isl_union_pw_aff_intersect_domain_wrapped_range.restype = c_void_p
isl.isl_union_pw_aff_intersect_domain_wrapped_range.argtypes = [c_void_p, c_void_p]
isl.isl_union_pw_aff_intersect_params.restype = c_void_p
isl.isl_union_pw_aff_intersect_params.argtypes = [c_void_p, c_void_p]
isl.isl_union_pw_aff_pullback_union_pw_multi_aff.restype = c_void_p
isl.isl_union_pw_aff_pullback_union_pw_multi_aff.argtypes = [c_void_p, c_void_p]
isl.isl_union_pw_aff_get_space.restype = c_void_p
isl.isl_union_pw_aff_get_space.argtypes = [c_void_p]
isl.isl_union_pw_aff_sub.restype = c_void_p
isl.isl_union_pw_aff_sub.argtypes = [c_void_p, c_void_p]
isl.isl_union_pw_aff_subtract_domain_space.restype = c_void_p
isl.isl_union_pw_aff_subtract_domain_space.argtypes = [c_void_p, c_void_p]
isl.isl_union_pw_aff_subtract_domain_union_set.restype = c_void_p
isl.isl_union_pw_aff_subtract_domain_union_set.argtypes = [c_void_p, c_void_p]
isl.isl_union_pw_aff_to_list.restype = c_void_p
isl.isl_union_pw_aff_to_list.argtypes = [c_void_p]
isl.isl_union_pw_aff_union_add.restype = c_void_p
isl.isl_union_pw_aff_union_add.argtypes = [c_void_p, c_void_p]
isl.isl_union_pw_aff_copy.restype = c_void_p
isl.isl_union_pw_aff_copy.argtypes = [c_void_p]
isl.isl_union_pw_aff_free.restype = c_void_p
isl.isl_union_pw_aff_free.argtypes = [c_void_p]
isl.isl_union_pw_aff_to_str.restype = POINTER(c_char)
isl.isl_union_pw_aff_to_str.argtypes = [c_void_p]

class multi_pw_aff(multi_union_pw_aff):
    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 aff:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_multi_pw_aff_from_aff(isl.isl_aff_copy(args[0].ptr))
            return
        if len(args) == 1 and args[0].__class__ is multi_aff:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_multi_pw_aff_from_multi_aff(isl.isl_multi_aff_copy(args[0].ptr))
            return
        if len(args) == 1 and args[0].__class__ is pw_aff:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_multi_pw_aff_from_pw_aff(isl.isl_pw_aff_copy(args[0].ptr))
            return
        if len(args) == 2 and args[0].__class__ is space and args[1].__class__ is pw_aff_list:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_multi_pw_aff_from_pw_aff_list(isl.isl_space_copy(args[0].ptr), isl.isl_pw_aff_list_copy(args[1].ptr))
            return
        if len(args) == 1 and args[0].__class__ is pw_multi_aff:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_multi_pw_aff_from_pw_multi_aff(isl.isl_pw_multi_aff_copy(args[0].ptr))
            return
        if len(args) == 1 and type(args[0]) == str:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_multi_pw_aff_read_from_str(self.ctx, args[0].encode('ascii'))
            return
        raise Error
    def __del__(self):
        if hasattr(self, 'ptr'):
            isl.isl_multi_pw_aff_free(self.ptr)
    def __str__(arg0):
        try:
            if not arg0.__class__ is multi_pw_aff:
                arg0 = multi_pw_aff(arg0)
        except:
            raise
        ptr = isl.isl_multi_pw_aff_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.multi_pw_aff("""%s""")' % s
        else:
            return 'isl.multi_pw_aff("%s")' % s
    def add(arg0, arg1):
        try:
            if not arg0.__class__ is multi_pw_aff:
                arg0 = multi_pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_pw_aff:
                arg1 = multi_pw_aff(arg1)
        except:
            return multi_union_pw_aff(arg0).add(arg1)
        ctx = arg0.ctx
        res = isl.isl_multi_pw_aff_add(isl.isl_multi_pw_aff_copy(arg0.ptr), isl.isl_multi_pw_aff_copy(arg1.ptr))
        obj = multi_pw_aff(ctx=ctx, ptr=res)
        return obj
    def add_constant(*args):
        if len(args) == 2 and args[1].__class__ is multi_val:
            ctx = args[0].ctx
            res = isl.isl_multi_pw_aff_add_constant_multi_val(isl.isl_multi_pw_aff_copy(args[0].ptr), isl.isl_multi_val_copy(args[1].ptr))
            obj = multi_pw_aff(ctx=ctx, ptr=res)
            return obj
        if len(args) == 2 and (args[1].__class__ is val or type(args[1]) == int):
            args = list(args)
            try:
                if not args[1].__class__ is val:
                    args[1] = val(args[1])
            except:
                raise
            ctx = args[0].ctx
            res = isl.isl_multi_pw_aff_add_constant_val(isl.isl_multi_pw_aff_copy(args[0].ptr), isl.isl_val_copy(args[1].ptr))
            obj = multi_pw_aff(ctx=ctx, ptr=res)
            return obj
        raise Error
    def as_map(arg0):
        try:
            if not arg0.__class__ is multi_pw_aff:
                arg0 = multi_pw_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_pw_aff_as_map(isl.isl_multi_pw_aff_copy(arg0.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def as_multi_aff(arg0):
        try:
            if not arg0.__class__ is multi_pw_aff:
                arg0 = multi_pw_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_pw_aff_as_multi_aff(isl.isl_multi_pw_aff_copy(arg0.ptr))
        obj = multi_aff(ctx=ctx, ptr=res)
        return obj
    def as_set(arg0):
        try:
            if not arg0.__class__ is multi_pw_aff:
                arg0 = multi_pw_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_pw_aff_as_set(isl.isl_multi_pw_aff_copy(arg0.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj
    def at(arg0, arg1):
        try:
            if not arg0.__class__ is multi_pw_aff:
                arg0 = multi_pw_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_pw_aff_get_at(arg0.ptr, arg1)
        obj = pw_aff(ctx=ctx, ptr=res)
        return obj
    def get_at(arg0, arg1):
        return arg0.at(arg1)
    def bind(arg0, arg1):
        try:
            if not arg0.__class__ is multi_pw_aff:
                arg0 = multi_pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_id:
                arg1 = multi_id(arg1)
        except:
            return multi_union_pw_aff(arg0).bind(arg1)
        ctx = arg0.ctx
        res = isl.isl_multi_pw_aff_bind(isl.isl_multi_pw_aff_copy(arg0.ptr), isl.isl_multi_id_copy(arg1.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj
    def bind_domain(arg0, arg1):
        try:
            if not arg0.__class__ is multi_pw_aff:
                arg0 = multi_pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_id:
                arg1 = multi_id(arg1)
        except:
            return multi_union_pw_aff(arg0).bind_domain(arg1)
        ctx = arg0.ctx
        res = isl.isl_multi_pw_aff_bind_domain(isl.isl_multi_pw_aff_copy(arg0.ptr), isl.isl_multi_id_copy(arg1.ptr))
        obj = multi_pw_aff(ctx=ctx, ptr=res)
        return obj
    def bind_domain_wrapped_domain(arg0, arg1):
        try:
            if not arg0.__class__ is multi_pw_aff:
                arg0 = multi_pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_id:
                arg1 = multi_id(arg1)
        except:
            return multi_union_pw_aff(arg0).bind_domain_wrapped_domain(arg1)
        ctx = arg0.ctx
        res = isl.isl_multi_pw_aff_bind_domain_wrapped_domain(isl.isl_multi_pw_aff_copy(arg0.ptr), isl.isl_multi_id_copy(arg1.ptr))
        obj = multi_pw_aff(ctx=ctx, ptr=res)
        return obj
    def coalesce(arg0):
        try:
            if not arg0.__class__ is multi_pw_aff:
                arg0 = multi_pw_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_pw_aff_coalesce(isl.isl_multi_pw_aff_copy(arg0.ptr))
        obj = multi_pw_aff(ctx=ctx, ptr=res)
        return obj
    def domain(arg0):
        try:
            if not arg0.__class__ is multi_pw_aff:
                arg0 = multi_pw_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_pw_aff_domain(isl.isl_multi_pw_aff_copy(arg0.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj
    def flat_range_product(arg0, arg1):
        try:
            if not arg0.__class__ is multi_pw_aff:
                arg0 = multi_pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_pw_aff:
                arg1 = multi_pw_aff(arg1)
        except:
            return multi_union_pw_aff(arg0).flat_range_product(arg1)
        ctx = arg0.ctx
        res = isl.isl_multi_pw_aff_flat_range_product(isl.isl_multi_pw_aff_copy(arg0.ptr), isl.isl_multi_pw_aff_copy(arg1.ptr))
        obj = multi_pw_aff(ctx=ctx, ptr=res)
        return obj
    def gist(arg0, arg1):
        try:
            if not arg0.__class__ is multi_pw_aff:
                arg0 = multi_pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            return multi_union_pw_aff(arg0).gist(arg1)
        ctx = arg0.ctx
        res = isl.isl_multi_pw_aff_gist(isl.isl_multi_pw_aff_copy(arg0.ptr), isl.isl_set_copy(arg1.ptr))
        obj = multi_pw_aff(ctx=ctx, ptr=res)
        return obj
    def has_range_tuple_id(arg0):
        try:
            if not arg0.__class__ is multi_pw_aff:
                arg0 = multi_pw_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_pw_aff_has_range_tuple_id(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def identity(*args):
        if len(args) == 1:
            ctx = args[0].ctx
            res = isl.isl_multi_pw_aff_identity_multi_pw_aff(isl.isl_multi_pw_aff_copy(args[0].ptr))
            obj = multi_pw_aff(ctx=ctx, ptr=res)
            return obj
        raise Error
    @staticmethod
    def identity_on_domain(*args):
        if len(args) == 1 and args[0].__class__ is space:
            ctx = args[0].ctx
            res = isl.isl_multi_pw_aff_identity_on_domain_space(isl.isl_space_copy(args[0].ptr))
            obj = multi_pw_aff(ctx=ctx, ptr=res)
            return obj
        raise Error
    def insert_domain(arg0, arg1):
        try:
            if not arg0.__class__ is multi_pw_aff:
                arg0 = multi_pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is space:
                arg1 = space(arg1)
        except:
            return multi_union_pw_aff(arg0).insert_domain(arg1)
        ctx = arg0.ctx
        res = isl.isl_multi_pw_aff_insert_domain(isl.isl_multi_pw_aff_copy(arg0.ptr), isl.isl_space_copy(arg1.ptr))
        obj = multi_pw_aff(ctx=ctx, ptr=res)
        return obj
    def intersect_domain(arg0, arg1):
        try:
            if not arg0.__class__ is multi_pw_aff:
                arg0 = multi_pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            return multi_union_pw_aff(arg0).intersect_domain(arg1)
        ctx = arg0.ctx
        res = isl.isl_multi_pw_aff_intersect_domain(isl.isl_multi_pw_aff_copy(arg0.ptr), isl.isl_set_copy(arg1.ptr))
        obj = multi_pw_aff(ctx=ctx, ptr=res)
        return obj
    def intersect_params(arg0, arg1):
        try:
            if not arg0.__class__ is multi_pw_aff:
                arg0 = multi_pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            return multi_union_pw_aff(arg0).intersect_params(arg1)
        ctx = arg0.ctx
        res = isl.isl_multi_pw_aff_intersect_params(isl.isl_multi_pw_aff_copy(arg0.ptr), isl.isl_set_copy(arg1.ptr))
        obj = multi_pw_aff(ctx=ctx, ptr=res)
        return obj
    def involves_nan(arg0):
        try:
            if not arg0.__class__ is multi_pw_aff:
                arg0 = multi_pw_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_pw_aff_involves_nan(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def involves_param(*args):
        if len(args) == 2 and (args[1].__class__ is id or type(args[1]) == str):
            args = list(args)
            try:
                if not args[1].__class__ is id:
                    args[1] = id(args[1])
            except:
                raise
            ctx = args[0].ctx
            res = isl.isl_multi_pw_aff_involves_param_id(args[0].ptr, args[1].ptr)
            if res < 0:
                raise
            return bool(res)
        if len(args) == 2 and args[1].__class__ is id_list:
            ctx = args[0].ctx
            res = isl.isl_multi_pw_aff_involves_param_id_list(args[0].ptr, args[1].ptr)
            if res < 0:
                raise
            return bool(res)
        raise Error
    def isa_multi_aff(arg0):
        try:
            if not arg0.__class__ is multi_pw_aff:
                arg0 = multi_pw_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_pw_aff_isa_multi_aff(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def list(arg0):
        try:
            if not arg0.__class__ is multi_pw_aff:
                arg0 = multi_pw_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_pw_aff_get_list(arg0.ptr)
        obj = pw_aff_list(ctx=ctx, ptr=res)
        return obj
    def get_list(arg0):
        return arg0.list()
    def max(arg0, arg1):
        try:
            if not arg0.__class__ is multi_pw_aff:
                arg0 = multi_pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_pw_aff:
                arg1 = multi_pw_aff(arg1)
        except:
            return multi_union_pw_aff(arg0).max(arg1)
        ctx = arg0.ctx
        res = isl.isl_multi_pw_aff_max(isl.isl_multi_pw_aff_copy(arg0.ptr), isl.isl_multi_pw_aff_copy(arg1.ptr))
        obj = multi_pw_aff(ctx=ctx, ptr=res)
        return obj
    def max_multi_val(arg0):
        try:
            if not arg0.__class__ is multi_pw_aff:
                arg0 = multi_pw_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_pw_aff_max_multi_val(isl.isl_multi_pw_aff_copy(arg0.ptr))
        obj = multi_val(ctx=ctx, ptr=res)
        return obj
    def min(arg0, arg1):
        try:
            if not arg0.__class__ is multi_pw_aff:
                arg0 = multi_pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_pw_aff:
                arg1 = multi_pw_aff(arg1)
        except:
            return multi_union_pw_aff(arg0).min(arg1)
        ctx = arg0.ctx
        res = isl.isl_multi_pw_aff_min(isl.isl_multi_pw_aff_copy(arg0.ptr), isl.isl_multi_pw_aff_copy(arg1.ptr))
        obj = multi_pw_aff(ctx=ctx, ptr=res)
        return obj
    def min_multi_val(arg0):
        try:
            if not arg0.__class__ is multi_pw_aff:
                arg0 = multi_pw_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_pw_aff_min_multi_val(isl.isl_multi_pw_aff_copy(arg0.ptr))
        obj = multi_val(ctx=ctx, ptr=res)
        return obj
    def neg(arg0):
        try:
            if not arg0.__class__ is multi_pw_aff:
                arg0 = multi_pw_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_pw_aff_neg(isl.isl_multi_pw_aff_copy(arg0.ptr))
        obj = multi_pw_aff(ctx=ctx, ptr=res)
        return obj
    def plain_is_equal(arg0, arg1):
        try:
            if not arg0.__class__ is multi_pw_aff:
                arg0 = multi_pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_pw_aff:
                arg1 = multi_pw_aff(arg1)
        except:
            return multi_union_pw_aff(arg0).plain_is_equal(arg1)
        ctx = arg0.ctx
        res = isl.isl_multi_pw_aff_plain_is_equal(arg0.ptr, arg1.ptr)
        if res < 0:
            raise
        return bool(res)
    def product(arg0, arg1):
        try:
            if not arg0.__class__ is multi_pw_aff:
                arg0 = multi_pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_pw_aff:
                arg1 = multi_pw_aff(arg1)
        except:
            return multi_union_pw_aff(arg0).product(arg1)
        ctx = arg0.ctx
        res = isl.isl_multi_pw_aff_product(isl.isl_multi_pw_aff_copy(arg0.ptr), isl.isl_multi_pw_aff_copy(arg1.ptr))
        obj = multi_pw_aff(ctx=ctx, ptr=res)
        return obj
    def pullback(*args):
        if len(args) == 2 and args[1].__class__ is multi_aff:
            ctx = args[0].ctx
            res = isl.isl_multi_pw_aff_pullback_multi_aff(isl.isl_multi_pw_aff_copy(args[0].ptr), isl.isl_multi_aff_copy(args[1].ptr))
            obj = multi_pw_aff(ctx=ctx, ptr=res)
            return obj
        if len(args) == 2 and args[1].__class__ is multi_pw_aff:
            ctx = args[0].ctx
            res = isl.isl_multi_pw_aff_pullback_multi_pw_aff(isl.isl_multi_pw_aff_copy(args[0].ptr), isl.isl_multi_pw_aff_copy(args[1].ptr))
            obj = multi_pw_aff(ctx=ctx, ptr=res)
            return obj
        if len(args) == 2 and args[1].__class__ is pw_multi_aff:
            ctx = args[0].ctx
            res = isl.isl_multi_pw_aff_pullback_pw_multi_aff(isl.isl_multi_pw_aff_copy(args[0].ptr), isl.isl_pw_multi_aff_copy(args[1].ptr))
            obj = multi_pw_aff(ctx=ctx, ptr=res)
            return obj
        raise Error
    def range_product(arg0, arg1):
        try:
            if not arg0.__class__ is multi_pw_aff:
                arg0 = multi_pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_pw_aff:
                arg1 = multi_pw_aff(arg1)
        except:
            return multi_union_pw_aff(arg0).range_product(arg1)
        ctx = arg0.ctx
        res = isl.isl_multi_pw_aff_range_product(isl.isl_multi_pw_aff_copy(arg0.ptr), isl.isl_multi_pw_aff_copy(arg1.ptr))
        obj = multi_pw_aff(ctx=ctx, ptr=res)
        return obj
    def range_tuple_id(arg0):
        try:
            if not arg0.__class__ is multi_pw_aff:
                arg0 = multi_pw_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_pw_aff_get_range_tuple_id(arg0.ptr)
        obj = id(ctx=ctx, ptr=res)
        return obj
    def get_range_tuple_id(arg0):
        return arg0.range_tuple_id()
    def reset_range_tuple_id(arg0):
        try:
            if not arg0.__class__ is multi_pw_aff:
                arg0 = multi_pw_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_pw_aff_reset_range_tuple_id(isl.isl_multi_pw_aff_copy(arg0.ptr))
        obj = multi_pw_aff(ctx=ctx, ptr=res)
        return obj
    def scale(*args):
        if len(args) == 2 and args[1].__class__ is multi_val:
            ctx = args[0].ctx
            res = isl.isl_multi_pw_aff_scale_multi_val(isl.isl_multi_pw_aff_copy(args[0].ptr), isl.isl_multi_val_copy(args[1].ptr))
            obj = multi_pw_aff(ctx=ctx, ptr=res)
            return obj
        if len(args) == 2 and (args[1].__class__ is val or type(args[1]) == int):
            args = list(args)
            try:
                if not args[1].__class__ is val:
                    args[1] = val(args[1])
            except:
                raise
            ctx = args[0].ctx
            res = isl.isl_multi_pw_aff_scale_val(isl.isl_multi_pw_aff_copy(args[0].ptr), isl.isl_val_copy(args[1].ptr))
            obj = multi_pw_aff(ctx=ctx, ptr=res)
            return obj
        raise Error
    def scale_down(*args):
        if len(args) == 2 and args[1].__class__ is multi_val:
            ctx = args[0].ctx
            res = isl.isl_multi_pw_aff_scale_down_multi_val(isl.isl_multi_pw_aff_copy(args[0].ptr), isl.isl_multi_val_copy(args[1].ptr))
            obj = multi_pw_aff(ctx=ctx, ptr=res)
            return obj
        if len(args) == 2 and (args[1].__class__ is val or type(args[1]) == int):
            args = list(args)
            try:
                if not args[1].__class__ is val:
                    args[1] = val(args[1])
            except:
                raise
            ctx = args[0].ctx
            res = isl.isl_multi_pw_aff_scale_down_val(isl.isl_multi_pw_aff_copy(args[0].ptr), isl.isl_val_copy(args[1].ptr))
            obj = multi_pw_aff(ctx=ctx, ptr=res)
            return obj
        raise Error
    def set_at(arg0, arg1, arg2):
        try:
            if not arg0.__class__ is multi_pw_aff:
                arg0 = multi_pw_aff(arg0)
        except:
            raise
        try:
            if not arg2.__class__ is pw_aff:
                arg2 = pw_aff(arg2)
        except:
            return multi_union_pw_aff(arg0).set_at(arg1, arg2)
        ctx = arg0.ctx
        res = isl.isl_multi_pw_aff_set_at(isl.isl_multi_pw_aff_copy(arg0.ptr), arg1, isl.isl_pw_aff_copy(arg2.ptr))
        obj = multi_pw_aff(ctx=ctx, ptr=res)
        return obj
    def set_range_tuple(*args):
        if len(args) == 2 and (args[1].__class__ is id or type(args[1]) == str):
            args = list(args)
            try:
                if not args[1].__class__ is id:
                    args[1] = id(args[1])
            except:
                raise
            ctx = args[0].ctx
            res = isl.isl_multi_pw_aff_set_range_tuple_id(isl.isl_multi_pw_aff_copy(args[0].ptr), isl.isl_id_copy(args[1].ptr))
            obj = multi_pw_aff(ctx=ctx, ptr=res)
            return obj
        raise Error
    def size(arg0):
        try:
            if not arg0.__class__ is multi_pw_aff:
                arg0 = multi_pw_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_pw_aff_size(arg0.ptr)
        if res < 0:
            raise
        return int(res)
    def space(arg0):
        try:
            if not arg0.__class__ is multi_pw_aff:
                arg0 = multi_pw_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_pw_aff_get_space(arg0.ptr)
        obj = space(ctx=ctx, ptr=res)
        return obj
    def get_space(arg0):
        return arg0.space()
    def sub(arg0, arg1):
        try:
            if not arg0.__class__ is multi_pw_aff:
                arg0 = multi_pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_pw_aff:
                arg1 = multi_pw_aff(arg1)
        except:
            return multi_union_pw_aff(arg0).sub(arg1)
        ctx = arg0.ctx
        res = isl.isl_multi_pw_aff_sub(isl.isl_multi_pw_aff_copy(arg0.ptr), isl.isl_multi_pw_aff_copy(arg1.ptr))
        obj = multi_pw_aff(ctx=ctx, ptr=res)
        return obj
    def unbind_params_insert_domain(arg0, arg1):
        try:
            if not arg0.__class__ is multi_pw_aff:
                arg0 = multi_pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_id:
                arg1 = multi_id(arg1)
        except:
            return multi_union_pw_aff(arg0).unbind_params_insert_domain(arg1)
        ctx = arg0.ctx
        res = isl.isl_multi_pw_aff_unbind_params_insert_domain(isl.isl_multi_pw_aff_copy(arg0.ptr), isl.isl_multi_id_copy(arg1.ptr))
        obj = multi_pw_aff(ctx=ctx, ptr=res)
        return obj
    def union_add(arg0, arg1):
        try:
            if not arg0.__class__ is multi_pw_aff:
                arg0 = multi_pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_pw_aff:
                arg1 = multi_pw_aff(arg1)
        except:
            return multi_union_pw_aff(arg0).union_add(arg1)
        ctx = arg0.ctx
        res = isl.isl_multi_pw_aff_union_add(isl.isl_multi_pw_aff_copy(arg0.ptr), isl.isl_multi_pw_aff_copy(arg1.ptr))
        obj = multi_pw_aff(ctx=ctx, ptr=res)
        return obj
    @staticmethod
    def zero(arg0):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_pw_aff_zero(isl.isl_space_copy(arg0.ptr))
        obj = multi_pw_aff(ctx=ctx, ptr=res)
        return obj

isl.isl_multi_pw_aff_from_aff.restype = c_void_p
isl.isl_multi_pw_aff_from_aff.argtypes = [c_void_p]
isl.isl_multi_pw_aff_from_multi_aff.restype = c_void_p
isl.isl_multi_pw_aff_from_multi_aff.argtypes = [c_void_p]
isl.isl_multi_pw_aff_from_pw_aff.restype = c_void_p
isl.isl_multi_pw_aff_from_pw_aff.argtypes = [c_void_p]
isl.isl_multi_pw_aff_from_pw_aff_list.restype = c_void_p
isl.isl_multi_pw_aff_from_pw_aff_list.argtypes = [c_void_p, c_void_p]
isl.isl_multi_pw_aff_from_pw_multi_aff.restype = c_void_p
isl.isl_multi_pw_aff_from_pw_multi_aff.argtypes = [c_void_p]
isl.isl_multi_pw_aff_read_from_str.restype = c_void_p
isl.isl_multi_pw_aff_read_from_str.argtypes = [Context, c_char_p]
isl.isl_multi_pw_aff_add.restype = c_void_p
isl.isl_multi_pw_aff_add.argtypes = [c_void_p, c_void_p]
isl.isl_multi_pw_aff_add_constant_multi_val.restype = c_void_p
isl.isl_multi_pw_aff_add_constant_multi_val.argtypes = [c_void_p, c_void_p]
isl.isl_multi_pw_aff_add_constant_val.restype = c_void_p
isl.isl_multi_pw_aff_add_constant_val.argtypes = [c_void_p, c_void_p]
isl.isl_multi_pw_aff_as_map.restype = c_void_p
isl.isl_multi_pw_aff_as_map.argtypes = [c_void_p]
isl.isl_multi_pw_aff_as_multi_aff.restype = c_void_p
isl.isl_multi_pw_aff_as_multi_aff.argtypes = [c_void_p]
isl.isl_multi_pw_aff_as_set.restype = c_void_p
isl.isl_multi_pw_aff_as_set.argtypes = [c_void_p]
isl.isl_multi_pw_aff_get_at.restype = c_void_p
isl.isl_multi_pw_aff_get_at.argtypes = [c_void_p, c_int]
isl.isl_multi_pw_aff_bind.restype = c_void_p
isl.isl_multi_pw_aff_bind.argtypes = [c_void_p, c_void_p]
isl.isl_multi_pw_aff_bind_domain.restype = c_void_p
isl.isl_multi_pw_aff_bind_domain.argtypes = [c_void_p, c_void_p]
isl.isl_multi_pw_aff_bind_domain_wrapped_domain.restype = c_void_p
isl.isl_multi_pw_aff_bind_domain_wrapped_domain.argtypes = [c_void_p, c_void_p]
isl.isl_multi_pw_aff_coalesce.restype = c_void_p
isl.isl_multi_pw_aff_coalesce.argtypes = [c_void_p]
isl.isl_multi_pw_aff_domain.restype = c_void_p
isl.isl_multi_pw_aff_domain.argtypes = [c_void_p]
isl.isl_multi_pw_aff_flat_range_product.restype = c_void_p
isl.isl_multi_pw_aff_flat_range_product.argtypes = [c_void_p, c_void_p]
isl.isl_multi_pw_aff_gist.restype = c_void_p
isl.isl_multi_pw_aff_gist.argtypes = [c_void_p, c_void_p]
isl.isl_multi_pw_aff_has_range_tuple_id.argtypes = [c_void_p]
isl.isl_multi_pw_aff_identity_multi_pw_aff.restype = c_void_p
isl.isl_multi_pw_aff_identity_multi_pw_aff.argtypes = [c_void_p]
isl.isl_multi_pw_aff_identity_on_domain_space.restype = c_void_p
isl.isl_multi_pw_aff_identity_on_domain_space.argtypes = [c_void_p]
isl.isl_multi_pw_aff_insert_domain.restype = c_void_p
isl.isl_multi_pw_aff_insert_domain.argtypes = [c_void_p, c_void_p]
isl.isl_multi_pw_aff_intersect_domain.restype = c_void_p
isl.isl_multi_pw_aff_intersect_domain.argtypes = [c_void_p, c_void_p]
isl.isl_multi_pw_aff_intersect_params.restype = c_void_p
isl.isl_multi_pw_aff_intersect_params.argtypes = [c_void_p, c_void_p]
isl.isl_multi_pw_aff_involves_nan.argtypes = [c_void_p]
isl.isl_multi_pw_aff_involves_param_id.argtypes = [c_void_p, c_void_p]
isl.isl_multi_pw_aff_involves_param_id_list.argtypes = [c_void_p, c_void_p]
isl.isl_multi_pw_aff_isa_multi_aff.argtypes = [c_void_p]
isl.isl_multi_pw_aff_get_list.restype = c_void_p
isl.isl_multi_pw_aff_get_list.argtypes = [c_void_p]
isl.isl_multi_pw_aff_max.restype = c_void_p
isl.isl_multi_pw_aff_max.argtypes = [c_void_p, c_void_p]
isl.isl_multi_pw_aff_max_multi_val.restype = c_void_p
isl.isl_multi_pw_aff_max_multi_val.argtypes = [c_void_p]
isl.isl_multi_pw_aff_min.restype = c_void_p
isl.isl_multi_pw_aff_min.argtypes = [c_void_p, c_void_p]
isl.isl_multi_pw_aff_min_multi_val.restype = c_void_p
isl.isl_multi_pw_aff_min_multi_val.argtypes = [c_void_p]
isl.isl_multi_pw_aff_neg.restype = c_void_p
isl.isl_multi_pw_aff_neg.argtypes = [c_void_p]
isl.isl_multi_pw_aff_plain_is_equal.argtypes = [c_void_p, c_void_p]
isl.isl_multi_pw_aff_product.restype = c_void_p
isl.isl_multi_pw_aff_product.argtypes = [c_void_p, c_void_p]
isl.isl_multi_pw_aff_pullback_multi_aff.restype = c_void_p
isl.isl_multi_pw_aff_pullback_multi_aff.argtypes = [c_void_p, c_void_p]
isl.isl_multi_pw_aff_pullback_multi_pw_aff.restype = c_void_p
isl.isl_multi_pw_aff_pullback_multi_pw_aff.argtypes = [c_void_p, c_void_p]
isl.isl_multi_pw_aff_pullback_pw_multi_aff.restype = c_void_p
isl.isl_multi_pw_aff_pullback_pw_multi_aff.argtypes = [c_void_p, c_void_p]
isl.isl_multi_pw_aff_range_product.restype = c_void_p
isl.isl_multi_pw_aff_range_product.argtypes = [c_void_p, c_void_p]
isl.isl_multi_pw_aff_get_range_tuple_id.restype = c_void_p
isl.isl_multi_pw_aff_get_range_tuple_id.argtypes = [c_void_p]
isl.isl_multi_pw_aff_reset_range_tuple_id.restype = c_void_p
isl.isl_multi_pw_aff_reset_range_tuple_id.argtypes = [c_void_p]
isl.isl_multi_pw_aff_scale_multi_val.restype = c_void_p
isl.isl_multi_pw_aff_scale_multi_val.argtypes = [c_void_p, c_void_p]
isl.isl_multi_pw_aff_scale_val.restype = c_void_p
isl.isl_multi_pw_aff_scale_val.argtypes = [c_void_p, c_void_p]
isl.isl_multi_pw_aff_scale_down_multi_val.restype = c_void_p
isl.isl_multi_pw_aff_scale_down_multi_val.argtypes = [c_void_p, c_void_p]
isl.isl_multi_pw_aff_scale_down_val.restype = c_void_p
isl.isl_multi_pw_aff_scale_down_val.argtypes = [c_void_p, c_void_p]
isl.isl_multi_pw_aff_set_at.restype = c_void_p
isl.isl_multi_pw_aff_set_at.argtypes = [c_void_p, c_int, c_void_p]
isl.isl_multi_pw_aff_set_range_tuple_id.restype = c_void_p
isl.isl_multi_pw_aff_set_range_tuple_id.argtypes = [c_void_p, c_void_p]
isl.isl_multi_pw_aff_size.argtypes = [c_void_p]
isl.isl_multi_pw_aff_get_space.restype = c_void_p
isl.isl_multi_pw_aff_get_space.argtypes = [c_void_p]
isl.isl_multi_pw_aff_sub.restype = c_void_p
isl.isl_multi_pw_aff_sub.argtypes = [c_void_p, c_void_p]
isl.isl_multi_pw_aff_unbind_params_insert_domain.restype = c_void_p
isl.isl_multi_pw_aff_unbind_params_insert_domain.argtypes = [c_void_p, c_void_p]
isl.isl_multi_pw_aff_union_add.restype = c_void_p
isl.isl_multi_pw_aff_union_add.argtypes = [c_void_p, c_void_p]
isl.isl_multi_pw_aff_zero.restype = c_void_p
isl.isl_multi_pw_aff_zero.argtypes = [c_void_p]
isl.isl_multi_pw_aff_copy.restype = c_void_p
isl.isl_multi_pw_aff_copy.argtypes = [c_void_p]
isl.isl_multi_pw_aff_free.restype = c_void_p
isl.isl_multi_pw_aff_free.argtypes = [c_void_p]
isl.isl_multi_pw_aff_to_str.restype = POINTER(c_char)
isl.isl_multi_pw_aff_to_str.argtypes = [c_void_p]

class pw_multi_aff(union_pw_multi_aff, multi_pw_aff):
    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 multi_aff:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_pw_multi_aff_from_multi_aff(isl.isl_multi_aff_copy(args[0].ptr))
            return
        if len(args) == 1 and args[0].__class__ is pw_aff:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_pw_multi_aff_from_pw_aff(isl.isl_pw_aff_copy(args[0].ptr))
            return
        if len(args) == 1 and type(args[0]) == str:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_pw_multi_aff_read_from_str(self.ctx, args[0].encode('ascii'))
            return
        raise Error
    def __del__(self):
        if hasattr(self, 'ptr'):
            isl.isl_pw_multi_aff_free(self.ptr)
    def __str__(arg0):
        try:
            if not arg0.__class__ is pw_multi_aff:
                arg0 = pw_multi_aff(arg0)
        except:
            raise
        ptr = isl.isl_pw_multi_aff_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.pw_multi_aff("""%s""")' % s
        else:
            return 'isl.pw_multi_aff("%s")' % s
    def add(arg0, arg1):
        try:
            if not arg0.__class__ is pw_multi_aff:
                arg0 = pw_multi_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is pw_multi_aff:
                arg1 = pw_multi_aff(arg1)
        except:
            return union_pw_multi_aff(arg0).add(arg1)
        ctx = arg0.ctx
        res = isl.isl_pw_multi_aff_add(isl.isl_pw_multi_aff_copy(arg0.ptr), isl.isl_pw_multi_aff_copy(arg1.ptr))
        obj = pw_multi_aff(ctx=ctx, ptr=res)
        return obj
    def add_constant(*args):
        if len(args) == 2 and args[1].__class__ is multi_val:
            ctx = args[0].ctx
            res = isl.isl_pw_multi_aff_add_constant_multi_val(isl.isl_pw_multi_aff_copy(args[0].ptr), isl.isl_multi_val_copy(args[1].ptr))
            obj = pw_multi_aff(ctx=ctx, ptr=res)
            return obj
        if len(args) == 2 and (args[1].__class__ is val or type(args[1]) == int):
            args = list(args)
            try:
                if not args[1].__class__ is val:
                    args[1] = val(args[1])
            except:
                raise
            ctx = args[0].ctx
            res = isl.isl_pw_multi_aff_add_constant_val(isl.isl_pw_multi_aff_copy(args[0].ptr), isl.isl_val_copy(args[1].ptr))
            obj = pw_multi_aff(ctx=ctx, ptr=res)
            return obj
        raise Error
    def as_map(arg0):
        try:
            if not arg0.__class__ is pw_multi_aff:
                arg0 = pw_multi_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_pw_multi_aff_as_map(isl.isl_pw_multi_aff_copy(arg0.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def as_multi_aff(arg0):
        try:
            if not arg0.__class__ is pw_multi_aff:
                arg0 = pw_multi_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_pw_multi_aff_as_multi_aff(isl.isl_pw_multi_aff_copy(arg0.ptr))
        obj = multi_aff(ctx=ctx, ptr=res)
        return obj
    def as_set(arg0):
        try:
            if not arg0.__class__ is pw_multi_aff:
                arg0 = pw_multi_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_pw_multi_aff_as_set(isl.isl_pw_multi_aff_copy(arg0.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj
    def at(arg0, arg1):
        try:
            if not arg0.__class__ is pw_multi_aff:
                arg0 = pw_multi_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_pw_multi_aff_get_at(arg0.ptr, arg1)
        obj = pw_aff(ctx=ctx, ptr=res)
        return obj
    def get_at(arg0, arg1):
        return arg0.at(arg1)
    def bind_domain(arg0, arg1):
        try:
            if not arg0.__class__ is pw_multi_aff:
                arg0 = pw_multi_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_id:
                arg1 = multi_id(arg1)
        except:
            return union_pw_multi_aff(arg0).bind_domain(arg1)
        ctx = arg0.ctx
        res = isl.isl_pw_multi_aff_bind_domain(isl.isl_pw_multi_aff_copy(arg0.ptr), isl.isl_multi_id_copy(arg1.ptr))
        obj = pw_multi_aff(ctx=ctx, ptr=res)
        return obj
    def bind_domain_wrapped_domain(arg0, arg1):
        try:
            if not arg0.__class__ is pw_multi_aff:
                arg0 = pw_multi_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_id:
                arg1 = multi_id(arg1)
        except:
            return union_pw_multi_aff(arg0).bind_domain_wrapped_domain(arg1)
        ctx = arg0.ctx
        res = isl.isl_pw_multi_aff_bind_domain_wrapped_domain(isl.isl_pw_multi_aff_copy(arg0.ptr), isl.isl_multi_id_copy(arg1.ptr))
        obj = pw_multi_aff(ctx=ctx, ptr=res)
        return obj
    def coalesce(arg0):
        try:
            if not arg0.__class__ is pw_multi_aff:
                arg0 = pw_multi_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_pw_multi_aff_coalesce(isl.isl_pw_multi_aff_copy(arg0.ptr))
        obj = pw_multi_aff(ctx=ctx, ptr=res)
        return obj
    def domain(arg0):
        try:
            if not arg0.__class__ is pw_multi_aff:
                arg0 = pw_multi_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_pw_multi_aff_domain(isl.isl_pw_multi_aff_copy(arg0.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj
    @staticmethod
    def domain_map(arg0):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_pw_multi_aff_domain_map(isl.isl_space_copy(arg0.ptr))
        obj = pw_multi_aff(ctx=ctx, ptr=res)
        return obj
    def flat_range_product(arg0, arg1):
        try:
            if not arg0.__class__ is pw_multi_aff:
                arg0 = pw_multi_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is pw_multi_aff:
                arg1 = pw_multi_aff(arg1)
        except:
            return union_pw_multi_aff(arg0).flat_range_product(arg1)
        ctx = arg0.ctx
        res = isl.isl_pw_multi_aff_flat_range_product(isl.isl_pw_multi_aff_copy(arg0.ptr), isl.isl_pw_multi_aff_copy(arg1.ptr))
        obj = pw_multi_aff(ctx=ctx, ptr=res)
        return obj
    def foreach_piece(arg0, arg1):
        try:
            if not arg0.__class__ is pw_multi_aff:
                arg0 = pw_multi_aff(arg0)
        except:
            raise
        exc_info = [None]
        fn = CFUNCTYPE(c_int, c_void_p, c_void_p, c_void_p)
        def cb_func(cb_arg0, cb_arg1, cb_arg2):
            cb_arg0 = set(ctx=arg0.ctx, ptr=(cb_arg0))
            cb_arg1 = multi_aff(ctx=arg0.ctx, ptr=(cb_arg1))
            try:
                arg1(cb_arg0, cb_arg1)
            except BaseException as e:
                exc_info[0] = e
                return -1
            return 0
        cb = fn(cb_func)
        ctx = arg0.ctx
        res = isl.isl_pw_multi_aff_foreach_piece(arg0.ptr, cb, None)
        if exc_info[0] is not None:
            raise exc_info[0]
        if res < 0:
            raise
    def gist(arg0, arg1):
        try:
            if not arg0.__class__ is pw_multi_aff:
                arg0 = pw_multi_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            return union_pw_multi_aff(arg0).gist(arg1)
        ctx = arg0.ctx
        res = isl.isl_pw_multi_aff_gist(isl.isl_pw_multi_aff_copy(arg0.ptr), isl.isl_set_copy(arg1.ptr))
        obj = pw_multi_aff(ctx=ctx, ptr=res)
        return obj
    def has_range_tuple_id(arg0):
        try:
            if not arg0.__class__ is pw_multi_aff:
                arg0 = pw_multi_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_pw_multi_aff_has_range_tuple_id(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    @staticmethod
    def identity_on_domain(*args):
        if len(args) == 1 and args[0].__class__ is space:
            ctx = args[0].ctx
            res = isl.isl_pw_multi_aff_identity_on_domain_space(isl.isl_space_copy(args[0].ptr))
            obj = pw_multi_aff(ctx=ctx, ptr=res)
            return obj
        raise Error
    def insert_domain(arg0, arg1):
        try:
            if not arg0.__class__ is pw_multi_aff:
                arg0 = pw_multi_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is space:
                arg1 = space(arg1)
        except:
            return union_pw_multi_aff(arg0).insert_domain(arg1)
        ctx = arg0.ctx
        res = isl.isl_pw_multi_aff_insert_domain(isl.isl_pw_multi_aff_copy(arg0.ptr), isl.isl_space_copy(arg1.ptr))
        obj = pw_multi_aff(ctx=ctx, ptr=res)
        return obj
    def intersect_domain(arg0, arg1):
        try:
            if not arg0.__class__ is pw_multi_aff:
                arg0 = pw_multi_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            return union_pw_multi_aff(arg0).intersect_domain(arg1)
        ctx = arg0.ctx
        res = isl.isl_pw_multi_aff_intersect_domain(isl.isl_pw_multi_aff_copy(arg0.ptr), isl.isl_set_copy(arg1.ptr))
        obj = pw_multi_aff(ctx=ctx, ptr=res)
        return obj
    def intersect_params(arg0, arg1):
        try:
            if not arg0.__class__ is pw_multi_aff:
                arg0 = pw_multi_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            return union_pw_multi_aff(arg0).intersect_params(arg1)
        ctx = arg0.ctx
        res = isl.isl_pw_multi_aff_intersect_params(isl.isl_pw_multi_aff_copy(arg0.ptr), isl.isl_set_copy(arg1.ptr))
        obj = pw_multi_aff(ctx=ctx, ptr=res)
        return obj
    def involves_locals(arg0):
        try:
            if not arg0.__class__ is pw_multi_aff:
                arg0 = pw_multi_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_pw_multi_aff_involves_locals(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def isa_multi_aff(arg0):
        try:
            if not arg0.__class__ is pw_multi_aff:
                arg0 = pw_multi_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_pw_multi_aff_isa_multi_aff(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def max_multi_val(arg0):
        try:
            if not arg0.__class__ is pw_multi_aff:
                arg0 = pw_multi_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_pw_multi_aff_max_multi_val(isl.isl_pw_multi_aff_copy(arg0.ptr))
        obj = multi_val(ctx=ctx, ptr=res)
        return obj
    def min_multi_val(arg0):
        try:
            if not arg0.__class__ is pw_multi_aff:
                arg0 = pw_multi_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_pw_multi_aff_min_multi_val(isl.isl_pw_multi_aff_copy(arg0.ptr))
        obj = multi_val(ctx=ctx, ptr=res)
        return obj
    @staticmethod
    def multi_val_on_domain(arg0, arg1):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_val:
                arg1 = multi_val(arg1)
        except:
            return union_pw_multi_aff(arg0).multi_val_on_domain(arg1)
        ctx = arg0.ctx
        res = isl.isl_pw_multi_aff_multi_val_on_domain(isl.isl_set_copy(arg0.ptr), isl.isl_multi_val_copy(arg1.ptr))
        obj = pw_multi_aff(ctx=ctx, ptr=res)
        return obj
    def n_piece(arg0):
        try:
            if not arg0.__class__ is pw_multi_aff:
                arg0 = pw_multi_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_pw_multi_aff_n_piece(arg0.ptr)
        if res < 0:
            raise
        return int(res)
    def preimage_domain_wrapped_domain(*args):
        if len(args) == 2 and args[1].__class__ is pw_multi_aff:
            ctx = args[0].ctx
            res = isl.isl_pw_multi_aff_preimage_domain_wrapped_domain_pw_multi_aff(isl.isl_pw_multi_aff_copy(args[0].ptr), isl.isl_pw_multi_aff_copy(args[1].ptr))
            obj = pw_multi_aff(ctx=ctx, ptr=res)
            return obj
        raise Error
    def product(arg0, arg1):
        try:
            if not arg0.__class__ is pw_multi_aff:
                arg0 = pw_multi_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is pw_multi_aff:
                arg1 = pw_multi_aff(arg1)
        except:
            return union_pw_multi_aff(arg0).product(arg1)
        ctx = arg0.ctx
        res = isl.isl_pw_multi_aff_product(isl.isl_pw_multi_aff_copy(arg0.ptr), isl.isl_pw_multi_aff_copy(arg1.ptr))
        obj = pw_multi_aff(ctx=ctx, ptr=res)
        return obj
    def pullback(*args):
        if len(args) == 2 and args[1].__class__ is multi_aff:
            ctx = args[0].ctx
            res = isl.isl_pw_multi_aff_pullback_multi_aff(isl.isl_pw_multi_aff_copy(args[0].ptr), isl.isl_multi_aff_copy(args[1].ptr))
            obj = pw_multi_aff(ctx=ctx, ptr=res)
            return obj
        if len(args) == 2 and args[1].__class__ is pw_multi_aff:
            ctx = args[0].ctx
            res = isl.isl_pw_multi_aff_pullback_pw_multi_aff(isl.isl_pw_multi_aff_copy(args[0].ptr), isl.isl_pw_multi_aff_copy(args[1].ptr))
            obj = pw_multi_aff(ctx=ctx, ptr=res)
            return obj
        raise Error
    def range_factor_domain(arg0):
        try:
            if not arg0.__class__ is pw_multi_aff:
                arg0 = pw_multi_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_pw_multi_aff_range_factor_domain(isl.isl_pw_multi_aff_copy(arg0.ptr))
        obj = pw_multi_aff(ctx=ctx, ptr=res)
        return obj
    def range_factor_range(arg0):
        try:
            if not arg0.__class__ is pw_multi_aff:
                arg0 = pw_multi_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_pw_multi_aff_range_factor_range(isl.isl_pw_multi_aff_copy(arg0.ptr))
        obj = pw_multi_aff(ctx=ctx, ptr=res)
        return obj
    @staticmethod
    def range_map(arg0):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_pw_multi_aff_range_map(isl.isl_space_copy(arg0.ptr))
        obj = pw_multi_aff(ctx=ctx, ptr=res)
        return obj
    def range_product(arg0, arg1):
        try:
            if not arg0.__class__ is pw_multi_aff:
                arg0 = pw_multi_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is pw_multi_aff:
                arg1 = pw_multi_aff(arg1)
        except:
            return union_pw_multi_aff(arg0).range_product(arg1)
        ctx = arg0.ctx
        res = isl.isl_pw_multi_aff_range_product(isl.isl_pw_multi_aff_copy(arg0.ptr), isl.isl_pw_multi_aff_copy(arg1.ptr))
        obj = pw_multi_aff(ctx=ctx, ptr=res)
        return obj
    def range_tuple_id(arg0):
        try:
            if not arg0.__class__ is pw_multi_aff:
                arg0 = pw_multi_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_pw_multi_aff_get_range_tuple_id(arg0.ptr)
        obj = id(ctx=ctx, ptr=res)
        return obj
    def get_range_tuple_id(arg0):
        return arg0.range_tuple_id()
    def scale(*args):
        if len(args) == 2 and (args[1].__class__ is val or type(args[1]) == int):
            args = list(args)
            try:
                if not args[1].__class__ is val:
                    args[1] = val(args[1])
            except:
                raise
            ctx = args[0].ctx
            res = isl.isl_pw_multi_aff_scale_val(isl.isl_pw_multi_aff_copy(args[0].ptr), isl.isl_val_copy(args[1].ptr))
            obj = pw_multi_aff(ctx=ctx, ptr=res)
            return obj
        raise Error
    def scale_down(*args):
        if len(args) == 2 and (args[1].__class__ is val or type(args[1]) == int):
            args = list(args)
            try:
                if not args[1].__class__ is val:
                    args[1] = val(args[1])
            except:
                raise
            ctx = args[0].ctx
            res = isl.isl_pw_multi_aff_scale_down_val(isl.isl_pw_multi_aff_copy(args[0].ptr), isl.isl_val_copy(args[1].ptr))
            obj = pw_multi_aff(ctx=ctx, ptr=res)
            return obj
        raise Error
    def set_range_tuple(*args):
        if len(args) == 2 and (args[1].__class__ is id or type(args[1]) == str):
            args = list(args)
            try:
                if not args[1].__class__ is id:
                    args[1] = id(args[1])
            except:
                raise
            ctx = args[0].ctx
            res = isl.isl_pw_multi_aff_set_range_tuple_id(isl.isl_pw_multi_aff_copy(args[0].ptr), isl.isl_id_copy(args[1].ptr))
            obj = pw_multi_aff(ctx=ctx, ptr=res)
            return obj
        raise Error
    def space(arg0):
        try:
            if not arg0.__class__ is pw_multi_aff:
                arg0 = pw_multi_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_pw_multi_aff_get_space(arg0.ptr)
        obj = space(ctx=ctx, ptr=res)
        return obj
    def get_space(arg0):
        return arg0.space()
    def sub(arg0, arg1):
        try:
            if not arg0.__class__ is pw_multi_aff:
                arg0 = pw_multi_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is pw_multi_aff:
                arg1 = pw_multi_aff(arg1)
        except:
            return union_pw_multi_aff(arg0).sub(arg1)
        ctx = arg0.ctx
        res = isl.isl_pw_multi_aff_sub(isl.isl_pw_multi_aff_copy(arg0.ptr), isl.isl_pw_multi_aff_copy(arg1.ptr))
        obj = pw_multi_aff(ctx=ctx, ptr=res)
        return obj
    def subtract_domain(arg0, arg1):
        try:
            if not arg0.__class__ is pw_multi_aff:
                arg0 = pw_multi_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            return union_pw_multi_aff(arg0).subtract_domain(arg1)
        ctx = arg0.ctx
        res = isl.isl_pw_multi_aff_subtract_domain(isl.isl_pw_multi_aff_copy(arg0.ptr), isl.isl_set_copy(arg1.ptr))
        obj = pw_multi_aff(ctx=ctx, ptr=res)
        return obj
    def to_list(arg0):
        try:
            if not arg0.__class__ is pw_multi_aff:
                arg0 = pw_multi_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_pw_multi_aff_to_list(isl.isl_pw_multi_aff_copy(arg0.ptr))
        obj = pw_multi_aff_list(ctx=ctx, ptr=res)
        return obj
    def to_multi_pw_aff(arg0):
        try:
            if not arg0.__class__ is pw_multi_aff:
                arg0 = pw_multi_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_pw_multi_aff_to_multi_pw_aff(isl.isl_pw_multi_aff_copy(arg0.ptr))
        obj = multi_pw_aff(ctx=ctx, ptr=res)
        return obj
    def to_union_pw_multi_aff(arg0):
        try:
            if not arg0.__class__ is pw_multi_aff:
                arg0 = pw_multi_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_pw_multi_aff_to_union_pw_multi_aff(isl.isl_pw_multi_aff_copy(arg0.ptr))
        obj = union_pw_multi_aff(ctx=ctx, ptr=res)
        return obj
    def union_add(arg0, arg1):
        try:
            if not arg0.__class__ is pw_multi_aff:
                arg0 = pw_multi_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is pw_multi_aff:
                arg1 = pw_multi_aff(arg1)
        except:
            return union_pw_multi_aff(arg0).union_add(arg1)
        ctx = arg0.ctx
        res = isl.isl_pw_multi_aff_union_add(isl.isl_pw_multi_aff_copy(arg0.ptr), isl.isl_pw_multi_aff_copy(arg1.ptr))
        obj = pw_multi_aff(ctx=ctx, ptr=res)
        return obj
    @staticmethod
    def zero(arg0):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_pw_multi_aff_zero(isl.isl_space_copy(arg0.ptr))
        obj = pw_multi_aff(ctx=ctx, ptr=res)
        return obj

isl.isl_pw_multi_aff_from_multi_aff.restype = c_void_p
isl.isl_pw_multi_aff_from_multi_aff.argtypes = [c_void_p]
isl.isl_pw_multi_aff_from_pw_aff.restype = c_void_p
isl.isl_pw_multi_aff_from_pw_aff.argtypes = [c_void_p]
isl.isl_pw_multi_aff_read_from_str.restype = c_void_p
isl.isl_pw_multi_aff_read_from_str.argtypes = [Context, c_char_p]
isl.isl_pw_multi_aff_add.restype = c_void_p
isl.isl_pw_multi_aff_add.argtypes = [c_void_p, c_void_p]
isl.isl_pw_multi_aff_add_constant_multi_val.restype = c_void_p
isl.isl_pw_multi_aff_add_constant_multi_val.argtypes = [c_void_p, c_void_p]
isl.isl_pw_multi_aff_add_constant_val.restype = c_void_p
isl.isl_pw_multi_aff_add_constant_val.argtypes = [c_void_p, c_void_p]
isl.isl_pw_multi_aff_as_map.restype = c_void_p
isl.isl_pw_multi_aff_as_map.argtypes = [c_void_p]
isl.isl_pw_multi_aff_as_multi_aff.restype = c_void_p
isl.isl_pw_multi_aff_as_multi_aff.argtypes = [c_void_p]
isl.isl_pw_multi_aff_as_set.restype = c_void_p
isl.isl_pw_multi_aff_as_set.argtypes = [c_void_p]
isl.isl_pw_multi_aff_get_at.restype = c_void_p
isl.isl_pw_multi_aff_get_at.argtypes = [c_void_p, c_int]
isl.isl_pw_multi_aff_bind_domain.restype = c_void_p
isl.isl_pw_multi_aff_bind_domain.argtypes = [c_void_p, c_void_p]
isl.isl_pw_multi_aff_bind_domain_wrapped_domain.restype = c_void_p
isl.isl_pw_multi_aff_bind_domain_wrapped_domain.argtypes = [c_void_p, c_void_p]
isl.isl_pw_multi_aff_coalesce.restype = c_void_p
isl.isl_pw_multi_aff_coalesce.argtypes = [c_void_p]
isl.isl_pw_multi_aff_domain.restype = c_void_p
isl.isl_pw_multi_aff_domain.argtypes = [c_void_p]
isl.isl_pw_multi_aff_domain_map.restype = c_void_p
isl.isl_pw_multi_aff_domain_map.argtypes = [c_void_p]
isl.isl_pw_multi_aff_flat_range_product.restype = c_void_p
isl.isl_pw_multi_aff_flat_range_product.argtypes = [c_void_p, c_void_p]
isl.isl_pw_multi_aff_foreach_piece.argtypes = [c_void_p, c_void_p, c_void_p]
isl.isl_pw_multi_aff_gist.restype = c_void_p
isl.isl_pw_multi_aff_gist.argtypes = [c_void_p, c_void_p]
isl.isl_pw_multi_aff_has_range_tuple_id.argtypes = [c_void_p]
isl.isl_pw_multi_aff_identity_on_domain_space.restype = c_void_p
isl.isl_pw_multi_aff_identity_on_domain_space.argtypes = [c_void_p]
isl.isl_pw_multi_aff_insert_domain.restype = c_void_p
isl.isl_pw_multi_aff_insert_domain.argtypes = [c_void_p, c_void_p]
isl.isl_pw_multi_aff_intersect_domain.restype = c_void_p
isl.isl_pw_multi_aff_intersect_domain.argtypes = [c_void_p, c_void_p]
isl.isl_pw_multi_aff_intersect_params.restype = c_void_p
isl.isl_pw_multi_aff_intersect_params.argtypes = [c_void_p, c_void_p]
isl.isl_pw_multi_aff_involves_locals.argtypes = [c_void_p]
isl.isl_pw_multi_aff_isa_multi_aff.argtypes = [c_void_p]
isl.isl_pw_multi_aff_max_multi_val.restype = c_void_p
isl.isl_pw_multi_aff_max_multi_val.argtypes = [c_void_p]
isl.isl_pw_multi_aff_min_multi_val.restype = c_void_p
isl.isl_pw_multi_aff_min_multi_val.argtypes = [c_void_p]
isl.isl_pw_multi_aff_multi_val_on_domain.restype = c_void_p
isl.isl_pw_multi_aff_multi_val_on_domain.argtypes = [c_void_p, c_void_p]
isl.isl_pw_multi_aff_n_piece.argtypes = [c_void_p]
isl.isl_pw_multi_aff_preimage_domain_wrapped_domain_pw_multi_aff.restype = c_void_p
isl.isl_pw_multi_aff_preimage_domain_wrapped_domain_pw_multi_aff.argtypes = [c_void_p, c_void_p]
isl.isl_pw_multi_aff_product.restype = c_void_p
isl.isl_pw_multi_aff_product.argtypes = [c_void_p, c_void_p]
isl.isl_pw_multi_aff_pullback_multi_aff.restype = c_void_p
isl.isl_pw_multi_aff_pullback_multi_aff.argtypes = [c_void_p, c_void_p]
isl.isl_pw_multi_aff_pullback_pw_multi_aff.restype = c_void_p
isl.isl_pw_multi_aff_pullback_pw_multi_aff.argtypes = [c_void_p, c_void_p]
isl.isl_pw_multi_aff_range_factor_domain.restype = c_void_p
isl.isl_pw_multi_aff_range_factor_domain.argtypes = [c_void_p]
isl.isl_pw_multi_aff_range_factor_range.restype = c_void_p
isl.isl_pw_multi_aff_range_factor_range.argtypes = [c_void_p]
isl.isl_pw_multi_aff_range_map.restype = c_void_p
isl.isl_pw_multi_aff_range_map.argtypes = [c_void_p]
isl.isl_pw_multi_aff_range_product.restype = c_void_p
isl.isl_pw_multi_aff_range_product.argtypes = [c_void_p, c_void_p]
isl.isl_pw_multi_aff_get_range_tuple_id.restype = c_void_p
isl.isl_pw_multi_aff_get_range_tuple_id.argtypes = [c_void_p]
isl.isl_pw_multi_aff_scale_val.restype = c_void_p
isl.isl_pw_multi_aff_scale_val.argtypes = [c_void_p, c_void_p]
isl.isl_pw_multi_aff_scale_down_val.restype = c_void_p
isl.isl_pw_multi_aff_scale_down_val.argtypes = [c_void_p, c_void_p]
isl.isl_pw_multi_aff_set_range_tuple_id.restype = c_void_p
isl.isl_pw_multi_aff_set_range_tuple_id.argtypes = [c_void_p, c_void_p]
isl.isl_pw_multi_aff_get_space.restype = c_void_p
isl.isl_pw_multi_aff_get_space.argtypes = [c_void_p]
isl.isl_pw_multi_aff_sub.restype = c_void_p
isl.isl_pw_multi_aff_sub.argtypes = [c_void_p, c_void_p]
isl.isl_pw_multi_aff_subtract_domain.restype = c_void_p
isl.isl_pw_multi_aff_subtract_domain.argtypes = [c_void_p, c_void_p]
isl.isl_pw_multi_aff_to_list.restype = c_void_p
isl.isl_pw_multi_aff_to_list.argtypes = [c_void_p]
isl.isl_pw_multi_aff_to_multi_pw_aff.restype = c_void_p
isl.isl_pw_multi_aff_to_multi_pw_aff.argtypes = [c_void_p]
isl.isl_pw_multi_aff_to_union_pw_multi_aff.restype = c_void_p
isl.isl_pw_multi_aff_to_union_pw_multi_aff.argtypes = [c_void_p]
isl.isl_pw_multi_aff_union_add.restype = c_void_p
isl.isl_pw_multi_aff_union_add.argtypes = [c_void_p, c_void_p]
isl.isl_pw_multi_aff_zero.restype = c_void_p
isl.isl_pw_multi_aff_zero.argtypes = [c_void_p]
isl.isl_pw_multi_aff_copy.restype = c_void_p
isl.isl_pw_multi_aff_copy.argtypes = [c_void_p]
isl.isl_pw_multi_aff_free.restype = c_void_p
isl.isl_pw_multi_aff_free.argtypes = [c_void_p]
isl.isl_pw_multi_aff_to_str.restype = POINTER(c_char)
isl.isl_pw_multi_aff_to_str.argtypes = [c_void_p]

class pw_aff(union_pw_aff, pw_multi_aff, multi_pw_aff):
    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 aff:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_pw_aff_from_aff(isl.isl_aff_copy(args[0].ptr))
            return
        if len(args) == 1 and type(args[0]) == str:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_pw_aff_read_from_str(self.ctx, args[0].encode('ascii'))
            return
        raise Error
    def __del__(self):
        if hasattr(self, 'ptr'):
            isl.isl_pw_aff_free(self.ptr)
    def __str__(arg0):
        try:
            if not arg0.__class__ is pw_aff:
                arg0 = pw_aff(arg0)
        except:
            raise
        ptr = isl.isl_pw_aff_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.pw_aff("""%s""")' % s
        else:
            return 'isl.pw_aff("%s")' % s
    def add(arg0, arg1):
        try:
            if not arg0.__class__ is pw_aff:
                arg0 = pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is pw_aff:
                arg1 = pw_aff(arg1)
        except:
            return union_pw_aff(arg0).add(arg1)
        ctx = arg0.ctx
        res = isl.isl_pw_aff_add(isl.isl_pw_aff_copy(arg0.ptr), isl.isl_pw_aff_copy(arg1.ptr))
        obj = pw_aff(ctx=ctx, ptr=res)
        return obj
    def add_constant(*args):
        if len(args) == 2 and (args[1].__class__ is val or type(args[1]) == int):
            args = list(args)
            try:
                if not args[1].__class__ is val:
                    args[1] = val(args[1])
            except:
                raise
            ctx = args[0].ctx
            res = isl.isl_pw_aff_add_constant_val(isl.isl_pw_aff_copy(args[0].ptr), isl.isl_val_copy(args[1].ptr))
            obj = pw_aff(ctx=ctx, ptr=res)
            return obj
        raise Error
    def as_aff(arg0):
        try:
            if not arg0.__class__ is pw_aff:
                arg0 = pw_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_pw_aff_as_aff(isl.isl_pw_aff_copy(arg0.ptr))
        obj = aff(ctx=ctx, ptr=res)
        return obj
    def as_map(arg0):
        try:
            if not arg0.__class__ is pw_aff:
                arg0 = pw_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_pw_aff_as_map(isl.isl_pw_aff_copy(arg0.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def bind(*args):
        if len(args) == 2 and (args[1].__class__ is id or type(args[1]) == str):
            args = list(args)
            try:
                if not args[1].__class__ is id:
                    args[1] = id(args[1])
            except:
                raise
            ctx = args[0].ctx
            res = isl.isl_pw_aff_bind_id(isl.isl_pw_aff_copy(args[0].ptr), isl.isl_id_copy(args[1].ptr))
            obj = set(ctx=ctx, ptr=res)
            return obj
        raise Error
    def bind_domain(arg0, arg1):
        try:
            if not arg0.__class__ is pw_aff:
                arg0 = pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_id:
                arg1 = multi_id(arg1)
        except:
            return union_pw_aff(arg0).bind_domain(arg1)
        ctx = arg0.ctx
        res = isl.isl_pw_aff_bind_domain(isl.isl_pw_aff_copy(arg0.ptr), isl.isl_multi_id_copy(arg1.ptr))
        obj = pw_aff(ctx=ctx, ptr=res)
        return obj
    def bind_domain_wrapped_domain(arg0, arg1):
        try:
            if not arg0.__class__ is pw_aff:
                arg0 = pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_id:
                arg1 = multi_id(arg1)
        except:
            return union_pw_aff(arg0).bind_domain_wrapped_domain(arg1)
        ctx = arg0.ctx
        res = isl.isl_pw_aff_bind_domain_wrapped_domain(isl.isl_pw_aff_copy(arg0.ptr), isl.isl_multi_id_copy(arg1.ptr))
        obj = pw_aff(ctx=ctx, ptr=res)
        return obj
    def ceil(arg0):
        try:
            if not arg0.__class__ is pw_aff:
                arg0 = pw_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_pw_aff_ceil(isl.isl_pw_aff_copy(arg0.ptr))
        obj = pw_aff(ctx=ctx, ptr=res)
        return obj
    def coalesce(arg0):
        try:
            if not arg0.__class__ is pw_aff:
                arg0 = pw_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_pw_aff_coalesce(isl.isl_pw_aff_copy(arg0.ptr))
        obj = pw_aff(ctx=ctx, ptr=res)
        return obj
    def cond(arg0, arg1, arg2):
        try:
            if not arg0.__class__ is pw_aff:
                arg0 = pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is pw_aff:
                arg1 = pw_aff(arg1)
        except:
            return union_pw_aff(arg0).cond(arg1, arg2)
        try:
            if not arg2.__class__ is pw_aff:
                arg2 = pw_aff(arg2)
        except:
            return union_pw_aff(arg0).cond(arg1, arg2)
        ctx = arg0.ctx
        res = isl.isl_pw_aff_cond(isl.isl_pw_aff_copy(arg0.ptr), isl.isl_pw_aff_copy(arg1.ptr), isl.isl_pw_aff_copy(arg2.ptr))
        obj = pw_aff(ctx=ctx, ptr=res)
        return obj
    def div(arg0, arg1):
        try:
            if not arg0.__class__ is pw_aff:
                arg0 = pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is pw_aff:
                arg1 = pw_aff(arg1)
        except:
            return union_pw_aff(arg0).div(arg1)
        ctx = arg0.ctx
        res = isl.isl_pw_aff_div(isl.isl_pw_aff_copy(arg0.ptr), isl.isl_pw_aff_copy(arg1.ptr))
        obj = pw_aff(ctx=ctx, ptr=res)
        return obj
    def domain(arg0):
        try:
            if not arg0.__class__ is pw_aff:
                arg0 = pw_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_pw_aff_domain(isl.isl_pw_aff_copy(arg0.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj
    def eq_set(arg0, arg1):
        try:
            if not arg0.__class__ is pw_aff:
                arg0 = pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is pw_aff:
                arg1 = pw_aff(arg1)
        except:
            return union_pw_aff(arg0).eq_set(arg1)
        ctx = arg0.ctx
        res = isl.isl_pw_aff_eq_set(isl.isl_pw_aff_copy(arg0.ptr), isl.isl_pw_aff_copy(arg1.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj
    def eval(arg0, arg1):
        try:
            if not arg0.__class__ is pw_aff:
                arg0 = pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is point:
                arg1 = point(arg1)
        except:
            return union_pw_aff(arg0).eval(arg1)
        ctx = arg0.ctx
        res = isl.isl_pw_aff_eval(isl.isl_pw_aff_copy(arg0.ptr), isl.isl_point_copy(arg1.ptr))
        obj = val(ctx=ctx, ptr=res)
        return obj
    def floor(arg0):
        try:
            if not arg0.__class__ is pw_aff:
                arg0 = pw_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_pw_aff_floor(isl.isl_pw_aff_copy(arg0.ptr))
        obj = pw_aff(ctx=ctx, ptr=res)
        return obj
    def ge_set(arg0, arg1):
        try:
            if not arg0.__class__ is pw_aff:
                arg0 = pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is pw_aff:
                arg1 = pw_aff(arg1)
        except:
            return union_pw_aff(arg0).ge_set(arg1)
        ctx = arg0.ctx
        res = isl.isl_pw_aff_ge_set(isl.isl_pw_aff_copy(arg0.ptr), isl.isl_pw_aff_copy(arg1.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj
    def gist(arg0, arg1):
        try:
            if not arg0.__class__ is pw_aff:
                arg0 = pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            return union_pw_aff(arg0).gist(arg1)
        ctx = arg0.ctx
        res = isl.isl_pw_aff_gist(isl.isl_pw_aff_copy(arg0.ptr), isl.isl_set_copy(arg1.ptr))
        obj = pw_aff(ctx=ctx, ptr=res)
        return obj
    def gt_set(arg0, arg1):
        try:
            if not arg0.__class__ is pw_aff:
                arg0 = pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is pw_aff:
                arg1 = pw_aff(arg1)
        except:
            return union_pw_aff(arg0).gt_set(arg1)
        ctx = arg0.ctx
        res = isl.isl_pw_aff_gt_set(isl.isl_pw_aff_copy(arg0.ptr), isl.isl_pw_aff_copy(arg1.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj
    def insert_domain(arg0, arg1):
        try:
            if not arg0.__class__ is pw_aff:
                arg0 = pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is space:
                arg1 = space(arg1)
        except:
            return union_pw_aff(arg0).insert_domain(arg1)
        ctx = arg0.ctx
        res = isl.isl_pw_aff_insert_domain(isl.isl_pw_aff_copy(arg0.ptr), isl.isl_space_copy(arg1.ptr))
        obj = pw_aff(ctx=ctx, ptr=res)
        return obj
    def intersect_domain(arg0, arg1):
        try:
            if not arg0.__class__ is pw_aff:
                arg0 = pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            return union_pw_aff(arg0).intersect_domain(arg1)
        ctx = arg0.ctx
        res = isl.isl_pw_aff_intersect_domain(isl.isl_pw_aff_copy(arg0.ptr), isl.isl_set_copy(arg1.ptr))
        obj = pw_aff(ctx=ctx, ptr=res)
        return obj
    def intersect_params(arg0, arg1):
        try:
            if not arg0.__class__ is pw_aff:
                arg0 = pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            return union_pw_aff(arg0).intersect_params(arg1)
        ctx = arg0.ctx
        res = isl.isl_pw_aff_intersect_params(isl.isl_pw_aff_copy(arg0.ptr), isl.isl_set_copy(arg1.ptr))
        obj = pw_aff(ctx=ctx, ptr=res)
        return obj
    def isa_aff(arg0):
        try:
            if not arg0.__class__ is pw_aff:
                arg0 = pw_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_pw_aff_isa_aff(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def le_set(arg0, arg1):
        try:
            if not arg0.__class__ is pw_aff:
                arg0 = pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is pw_aff:
                arg1 = pw_aff(arg1)
        except:
            return union_pw_aff(arg0).le_set(arg1)
        ctx = arg0.ctx
        res = isl.isl_pw_aff_le_set(isl.isl_pw_aff_copy(arg0.ptr), isl.isl_pw_aff_copy(arg1.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj
    def lt_set(arg0, arg1):
        try:
            if not arg0.__class__ is pw_aff:
                arg0 = pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is pw_aff:
                arg1 = pw_aff(arg1)
        except:
            return union_pw_aff(arg0).lt_set(arg1)
        ctx = arg0.ctx
        res = isl.isl_pw_aff_lt_set(isl.isl_pw_aff_copy(arg0.ptr), isl.isl_pw_aff_copy(arg1.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj
    def max(arg0, arg1):
        try:
            if not arg0.__class__ is pw_aff:
                arg0 = pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is pw_aff:
                arg1 = pw_aff(arg1)
        except:
            return union_pw_aff(arg0).max(arg1)
        ctx = arg0.ctx
        res = isl.isl_pw_aff_max(isl.isl_pw_aff_copy(arg0.ptr), isl.isl_pw_aff_copy(arg1.ptr))
        obj = pw_aff(ctx=ctx, ptr=res)
        return obj
    def min(arg0, arg1):
        try:
            if not arg0.__class__ is pw_aff:
                arg0 = pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is pw_aff:
                arg1 = pw_aff(arg1)
        except:
            return union_pw_aff(arg0).min(arg1)
        ctx = arg0.ctx
        res = isl.isl_pw_aff_min(isl.isl_pw_aff_copy(arg0.ptr), isl.isl_pw_aff_copy(arg1.ptr))
        obj = pw_aff(ctx=ctx, ptr=res)
        return obj
    def mod(*args):
        if len(args) == 2 and (args[1].__class__ is val or type(args[1]) == int):
            args = list(args)
            try:
                if not args[1].__class__ is val:
                    args[1] = val(args[1])
            except:
                raise
            ctx = args[0].ctx
            res = isl.isl_pw_aff_mod_val(isl.isl_pw_aff_copy(args[0].ptr), isl.isl_val_copy(args[1].ptr))
            obj = pw_aff(ctx=ctx, ptr=res)
            return obj
        raise Error
    def mul(arg0, arg1):
        try:
            if not arg0.__class__ is pw_aff:
                arg0 = pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is pw_aff:
                arg1 = pw_aff(arg1)
        except:
            return union_pw_aff(arg0).mul(arg1)
        ctx = arg0.ctx
        res = isl.isl_pw_aff_mul(isl.isl_pw_aff_copy(arg0.ptr), isl.isl_pw_aff_copy(arg1.ptr))
        obj = pw_aff(ctx=ctx, ptr=res)
        return obj
    def ne_set(arg0, arg1):
        try:
            if not arg0.__class__ is pw_aff:
                arg0 = pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is pw_aff:
                arg1 = pw_aff(arg1)
        except:
            return union_pw_aff(arg0).ne_set(arg1)
        ctx = arg0.ctx
        res = isl.isl_pw_aff_ne_set(isl.isl_pw_aff_copy(arg0.ptr), isl.isl_pw_aff_copy(arg1.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj
    def neg(arg0):
        try:
            if not arg0.__class__ is pw_aff:
                arg0 = pw_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_pw_aff_neg(isl.isl_pw_aff_copy(arg0.ptr))
        obj = pw_aff(ctx=ctx, ptr=res)
        return obj
    @staticmethod
    def param_on_domain(*args):
        if len(args) == 2 and args[0].__class__ is set and (args[1].__class__ is id or type(args[1]) == str):
            args = list(args)
            try:
                if not args[1].__class__ is id:
                    args[1] = id(args[1])
            except:
                raise
            ctx = args[0].ctx
            res = isl.isl_pw_aff_param_on_domain_id(isl.isl_set_copy(args[0].ptr), isl.isl_id_copy(args[1].ptr))
            obj = pw_aff(ctx=ctx, ptr=res)
            return obj
        raise Error
    def pullback(*args):
        if len(args) == 2 and args[1].__class__ is multi_aff:
            ctx = args[0].ctx
            res = isl.isl_pw_aff_pullback_multi_aff(isl.isl_pw_aff_copy(args[0].ptr), isl.isl_multi_aff_copy(args[1].ptr))
            obj = pw_aff(ctx=ctx, ptr=res)
            return obj
        if len(args) == 2 and args[1].__class__ is multi_pw_aff:
            ctx = args[0].ctx
            res = isl.isl_pw_aff_pullback_multi_pw_aff(isl.isl_pw_aff_copy(args[0].ptr), isl.isl_multi_pw_aff_copy(args[1].ptr))
            obj = pw_aff(ctx=ctx, ptr=res)
            return obj
        if len(args) == 2 and args[1].__class__ is pw_multi_aff:
            ctx = args[0].ctx
            res = isl.isl_pw_aff_pullback_pw_multi_aff(isl.isl_pw_aff_copy(args[0].ptr), isl.isl_pw_multi_aff_copy(args[1].ptr))
            obj = pw_aff(ctx=ctx, ptr=res)
            return obj
        raise Error
    def scale(*args):
        if len(args) == 2 and (args[1].__class__ is val or type(args[1]) == int):
            args = list(args)
            try:
                if not args[1].__class__ is val:
                    args[1] = val(args[1])
            except:
                raise
            ctx = args[0].ctx
            res = isl.isl_pw_aff_scale_val(isl.isl_pw_aff_copy(args[0].ptr), isl.isl_val_copy(args[1].ptr))
            obj = pw_aff(ctx=ctx, ptr=res)
            return obj
        raise Error
    def scale_down(*args):
        if len(args) == 2 and (args[1].__class__ is val or type(args[1]) == int):
            args = list(args)
            try:
                if not args[1].__class__ is val:
                    args[1] = val(args[1])
            except:
                raise
            ctx = args[0].ctx
            res = isl.isl_pw_aff_scale_down_val(isl.isl_pw_aff_copy(args[0].ptr), isl.isl_val_copy(args[1].ptr))
            obj = pw_aff(ctx=ctx, ptr=res)
            return obj
        raise Error
    def space(arg0):
        try:
            if not arg0.__class__ is pw_aff:
                arg0 = pw_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_pw_aff_get_space(arg0.ptr)
        obj = space(ctx=ctx, ptr=res)
        return obj
    def get_space(arg0):
        return arg0.space()
    def sub(arg0, arg1):
        try:
            if not arg0.__class__ is pw_aff:
                arg0 = pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is pw_aff:
                arg1 = pw_aff(arg1)
        except:
            return union_pw_aff(arg0).sub(arg1)
        ctx = arg0.ctx
        res = isl.isl_pw_aff_sub(isl.isl_pw_aff_copy(arg0.ptr), isl.isl_pw_aff_copy(arg1.ptr))
        obj = pw_aff(ctx=ctx, ptr=res)
        return obj
    def subtract_domain(arg0, arg1):
        try:
            if not arg0.__class__ is pw_aff:
                arg0 = pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            return union_pw_aff(arg0).subtract_domain(arg1)
        ctx = arg0.ctx
        res = isl.isl_pw_aff_subtract_domain(isl.isl_pw_aff_copy(arg0.ptr), isl.isl_set_copy(arg1.ptr))
        obj = pw_aff(ctx=ctx, ptr=res)
        return obj
    def tdiv_q(arg0, arg1):
        try:
            if not arg0.__class__ is pw_aff:
                arg0 = pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is pw_aff:
                arg1 = pw_aff(arg1)
        except:
            return union_pw_aff(arg0).tdiv_q(arg1)
        ctx = arg0.ctx
        res = isl.isl_pw_aff_tdiv_q(isl.isl_pw_aff_copy(arg0.ptr), isl.isl_pw_aff_copy(arg1.ptr))
        obj = pw_aff(ctx=ctx, ptr=res)
        return obj
    def tdiv_r(arg0, arg1):
        try:
            if not arg0.__class__ is pw_aff:
                arg0 = pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is pw_aff:
                arg1 = pw_aff(arg1)
        except:
            return union_pw_aff(arg0).tdiv_r(arg1)
        ctx = arg0.ctx
        res = isl.isl_pw_aff_tdiv_r(isl.isl_pw_aff_copy(arg0.ptr), isl.isl_pw_aff_copy(arg1.ptr))
        obj = pw_aff(ctx=ctx, ptr=res)
        return obj
    def to_list(arg0):
        try:
            if not arg0.__class__ is pw_aff:
                arg0 = pw_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_pw_aff_to_list(isl.isl_pw_aff_copy(arg0.ptr))
        obj = pw_aff_list(ctx=ctx, ptr=res)
        return obj
    def to_union_pw_aff(arg0):
        try:
            if not arg0.__class__ is pw_aff:
                arg0 = pw_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_pw_aff_to_union_pw_aff(isl.isl_pw_aff_copy(arg0.ptr))
        obj = union_pw_aff(ctx=ctx, ptr=res)
        return obj
    def union_add(arg0, arg1):
        try:
            if not arg0.__class__ is pw_aff:
                arg0 = pw_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is pw_aff:
                arg1 = pw_aff(arg1)
        except:
            return union_pw_aff(arg0).union_add(arg1)
        ctx = arg0.ctx
        res = isl.isl_pw_aff_union_add(isl.isl_pw_aff_copy(arg0.ptr), isl.isl_pw_aff_copy(arg1.ptr))
        obj = pw_aff(ctx=ctx, ptr=res)
        return obj

isl.isl_pw_aff_from_aff.restype = c_void_p
isl.isl_pw_aff_from_aff.argtypes = [c_void_p]
isl.isl_pw_aff_read_from_str.restype = c_void_p
isl.isl_pw_aff_read_from_str.argtypes = [Context, c_char_p]
isl.isl_pw_aff_add.restype = c_void_p
isl.isl_pw_aff_add.argtypes = [c_void_p, c_void_p]
isl.isl_pw_aff_add_constant_val.restype = c_void_p
isl.isl_pw_aff_add_constant_val.argtypes = [c_void_p, c_void_p]
isl.isl_pw_aff_as_aff.restype = c_void_p
isl.isl_pw_aff_as_aff.argtypes = [c_void_p]
isl.isl_pw_aff_as_map.restype = c_void_p
isl.isl_pw_aff_as_map.argtypes = [c_void_p]
isl.isl_pw_aff_bind_id.restype = c_void_p
isl.isl_pw_aff_bind_id.argtypes = [c_void_p, c_void_p]
isl.isl_pw_aff_bind_domain.restype = c_void_p
isl.isl_pw_aff_bind_domain.argtypes = [c_void_p, c_void_p]
isl.isl_pw_aff_bind_domain_wrapped_domain.restype = c_void_p
isl.isl_pw_aff_bind_domain_wrapped_domain.argtypes = [c_void_p, c_void_p]
isl.isl_pw_aff_ceil.restype = c_void_p
isl.isl_pw_aff_ceil.argtypes = [c_void_p]
isl.isl_pw_aff_coalesce.restype = c_void_p
isl.isl_pw_aff_coalesce.argtypes = [c_void_p]
isl.isl_pw_aff_cond.restype = c_void_p
isl.isl_pw_aff_cond.argtypes = [c_void_p, c_void_p, c_void_p]
isl.isl_pw_aff_div.restype = c_void_p
isl.isl_pw_aff_div.argtypes = [c_void_p, c_void_p]
isl.isl_pw_aff_domain.restype = c_void_p
isl.isl_pw_aff_domain.argtypes = [c_void_p]
isl.isl_pw_aff_eq_set.restype = c_void_p
isl.isl_pw_aff_eq_set.argtypes = [c_void_p, c_void_p]
isl.isl_pw_aff_eval.restype = c_void_p
isl.isl_pw_aff_eval.argtypes = [c_void_p, c_void_p]
isl.isl_pw_aff_floor.restype = c_void_p
isl.isl_pw_aff_floor.argtypes = [c_void_p]
isl.isl_pw_aff_ge_set.restype = c_void_p
isl.isl_pw_aff_ge_set.argtypes = [c_void_p, c_void_p]
isl.isl_pw_aff_gist.restype = c_void_p
isl.isl_pw_aff_gist.argtypes = [c_void_p, c_void_p]
isl.isl_pw_aff_gt_set.restype = c_void_p
isl.isl_pw_aff_gt_set.argtypes = [c_void_p, c_void_p]
isl.isl_pw_aff_insert_domain.restype = c_void_p
isl.isl_pw_aff_insert_domain.argtypes = [c_void_p, c_void_p]
isl.isl_pw_aff_intersect_domain.restype = c_void_p
isl.isl_pw_aff_intersect_domain.argtypes = [c_void_p, c_void_p]
isl.isl_pw_aff_intersect_params.restype = c_void_p
isl.isl_pw_aff_intersect_params.argtypes = [c_void_p, c_void_p]
isl.isl_pw_aff_isa_aff.argtypes = [c_void_p]
isl.isl_pw_aff_le_set.restype = c_void_p
isl.isl_pw_aff_le_set.argtypes = [c_void_p, c_void_p]
isl.isl_pw_aff_lt_set.restype = c_void_p
isl.isl_pw_aff_lt_set.argtypes = [c_void_p, c_void_p]
isl.isl_pw_aff_max.restype = c_void_p
isl.isl_pw_aff_max.argtypes = [c_void_p, c_void_p]
isl.isl_pw_aff_min.restype = c_void_p
isl.isl_pw_aff_min.argtypes = [c_void_p, c_void_p]
isl.isl_pw_aff_mod_val.restype = c_void_p
isl.isl_pw_aff_mod_val.argtypes = [c_void_p, c_void_p]
isl.isl_pw_aff_mul.restype = c_void_p
isl.isl_pw_aff_mul.argtypes = [c_void_p, c_void_p]
isl.isl_pw_aff_ne_set.restype = c_void_p
isl.isl_pw_aff_ne_set.argtypes = [c_void_p, c_void_p]
isl.isl_pw_aff_neg.restype = c_void_p
isl.isl_pw_aff_neg.argtypes = [c_void_p]
isl.isl_pw_aff_param_on_domain_id.restype = c_void_p
isl.isl_pw_aff_param_on_domain_id.argtypes = [c_void_p, c_void_p]
isl.isl_pw_aff_pullback_multi_aff.restype = c_void_p
isl.isl_pw_aff_pullback_multi_aff.argtypes = [c_void_p, c_void_p]
isl.isl_pw_aff_pullback_multi_pw_aff.restype = c_void_p
isl.isl_pw_aff_pullback_multi_pw_aff.argtypes = [c_void_p, c_void_p]
isl.isl_pw_aff_pullback_pw_multi_aff.restype = c_void_p
isl.isl_pw_aff_pullback_pw_multi_aff.argtypes = [c_void_p, c_void_p]
isl.isl_pw_aff_scale_val.restype = c_void_p
isl.isl_pw_aff_scale_val.argtypes = [c_void_p, c_void_p]
isl.isl_pw_aff_scale_down_val.restype = c_void_p
isl.isl_pw_aff_scale_down_val.argtypes = [c_void_p, c_void_p]
isl.isl_pw_aff_get_space.restype = c_void_p
isl.isl_pw_aff_get_space.argtypes = [c_void_p]
isl.isl_pw_aff_sub.restype = c_void_p
isl.isl_pw_aff_sub.argtypes = [c_void_p, c_void_p]
isl.isl_pw_aff_subtract_domain.restype = c_void_p
isl.isl_pw_aff_subtract_domain.argtypes = [c_void_p, c_void_p]
isl.isl_pw_aff_tdiv_q.restype = c_void_p
isl.isl_pw_aff_tdiv_q.argtypes = [c_void_p, c_void_p]
isl.isl_pw_aff_tdiv_r.restype = c_void_p
isl.isl_pw_aff_tdiv_r.argtypes = [c_void_p, c_void_p]
isl.isl_pw_aff_to_list.restype = c_void_p
isl.isl_pw_aff_to_list.argtypes = [c_void_p]
isl.isl_pw_aff_to_union_pw_aff.restype = c_void_p
isl.isl_pw_aff_to_union_pw_aff.argtypes = [c_void_p]
isl.isl_pw_aff_union_add.restype = c_void_p
isl.isl_pw_aff_union_add.argtypes = [c_void_p, c_void_p]
isl.isl_pw_aff_copy.restype = c_void_p
isl.isl_pw_aff_copy.argtypes = [c_void_p]
isl.isl_pw_aff_free.restype = c_void_p
isl.isl_pw_aff_free.argtypes = [c_void_p]
isl.isl_pw_aff_to_str.restype = POINTER(c_char)
isl.isl_pw_aff_to_str.argtypes = [c_void_p]

class multi_aff(pw_multi_aff, multi_pw_aff):
    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 aff:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_multi_aff_from_aff(isl.isl_aff_copy(args[0].ptr))
            return
        if len(args) == 2 and args[0].__class__ is space and args[1].__class__ is aff_list:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_multi_aff_from_aff_list(isl.isl_space_copy(args[0].ptr), isl.isl_aff_list_copy(args[1].ptr))
            return
        if len(args) == 1 and type(args[0]) == str:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_multi_aff_read_from_str(self.ctx, args[0].encode('ascii'))
            return
        raise Error
    def __del__(self):
        if hasattr(self, 'ptr'):
            isl.isl_multi_aff_free(self.ptr)
    def __str__(arg0):
        try:
            if not arg0.__class__ is multi_aff:
                arg0 = multi_aff(arg0)
        except:
            raise
        ptr = isl.isl_multi_aff_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.multi_aff("""%s""")' % s
        else:
            return 'isl.multi_aff("%s")' % s
    def add(arg0, arg1):
        try:
            if not arg0.__class__ is multi_aff:
                arg0 = multi_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_aff:
                arg1 = multi_aff(arg1)
        except:
            return pw_multi_aff(arg0).add(arg1)
        ctx = arg0.ctx
        res = isl.isl_multi_aff_add(isl.isl_multi_aff_copy(arg0.ptr), isl.isl_multi_aff_copy(arg1.ptr))
        obj = multi_aff(ctx=ctx, ptr=res)
        return obj
    def add_constant(*args):
        if len(args) == 2 and args[1].__class__ is multi_val:
            ctx = args[0].ctx
            res = isl.isl_multi_aff_add_constant_multi_val(isl.isl_multi_aff_copy(args[0].ptr), isl.isl_multi_val_copy(args[1].ptr))
            obj = multi_aff(ctx=ctx, ptr=res)
            return obj
        if len(args) == 2 and (args[1].__class__ is val or type(args[1]) == int):
            args = list(args)
            try:
                if not args[1].__class__ is val:
                    args[1] = val(args[1])
            except:
                raise
            ctx = args[0].ctx
            res = isl.isl_multi_aff_add_constant_val(isl.isl_multi_aff_copy(args[0].ptr), isl.isl_val_copy(args[1].ptr))
            obj = multi_aff(ctx=ctx, ptr=res)
            return obj
        raise Error
    def as_map(arg0):
        try:
            if not arg0.__class__ is multi_aff:
                arg0 = multi_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_aff_as_map(isl.isl_multi_aff_copy(arg0.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def as_set(arg0):
        try:
            if not arg0.__class__ is multi_aff:
                arg0 = multi_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_aff_as_set(isl.isl_multi_aff_copy(arg0.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj
    def at(arg0, arg1):
        try:
            if not arg0.__class__ is multi_aff:
                arg0 = multi_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_aff_get_at(arg0.ptr, arg1)
        obj = aff(ctx=ctx, ptr=res)
        return obj
    def get_at(arg0, arg1):
        return arg0.at(arg1)
    def bind(arg0, arg1):
        try:
            if not arg0.__class__ is multi_aff:
                arg0 = multi_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_id:
                arg1 = multi_id(arg1)
        except:
            return pw_multi_aff(arg0).bind(arg1)
        ctx = arg0.ctx
        res = isl.isl_multi_aff_bind(isl.isl_multi_aff_copy(arg0.ptr), isl.isl_multi_id_copy(arg1.ptr))
        obj = basic_set(ctx=ctx, ptr=res)
        return obj
    def bind_domain(arg0, arg1):
        try:
            if not arg0.__class__ is multi_aff:
                arg0 = multi_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_id:
                arg1 = multi_id(arg1)
        except:
            return pw_multi_aff(arg0).bind_domain(arg1)
        ctx = arg0.ctx
        res = isl.isl_multi_aff_bind_domain(isl.isl_multi_aff_copy(arg0.ptr), isl.isl_multi_id_copy(arg1.ptr))
        obj = multi_aff(ctx=ctx, ptr=res)
        return obj
    def bind_domain_wrapped_domain(arg0, arg1):
        try:
            if not arg0.__class__ is multi_aff:
                arg0 = multi_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_id:
                arg1 = multi_id(arg1)
        except:
            return pw_multi_aff(arg0).bind_domain_wrapped_domain(arg1)
        ctx = arg0.ctx
        res = isl.isl_multi_aff_bind_domain_wrapped_domain(isl.isl_multi_aff_copy(arg0.ptr), isl.isl_multi_id_copy(arg1.ptr))
        obj = multi_aff(ctx=ctx, ptr=res)
        return obj
    def constant_multi_val(arg0):
        try:
            if not arg0.__class__ is multi_aff:
                arg0 = multi_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_aff_get_constant_multi_val(arg0.ptr)
        obj = multi_val(ctx=ctx, ptr=res)
        return obj
    def get_constant_multi_val(arg0):
        return arg0.constant_multi_val()
    @staticmethod
    def domain_map(arg0):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_aff_domain_map(isl.isl_space_copy(arg0.ptr))
        obj = multi_aff(ctx=ctx, ptr=res)
        return obj
    def flat_range_product(arg0, arg1):
        try:
            if not arg0.__class__ is multi_aff:
                arg0 = multi_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_aff:
                arg1 = multi_aff(arg1)
        except:
            return pw_multi_aff(arg0).flat_range_product(arg1)
        ctx = arg0.ctx
        res = isl.isl_multi_aff_flat_range_product(isl.isl_multi_aff_copy(arg0.ptr), isl.isl_multi_aff_copy(arg1.ptr))
        obj = multi_aff(ctx=ctx, ptr=res)
        return obj
    def floor(arg0):
        try:
            if not arg0.__class__ is multi_aff:
                arg0 = multi_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_aff_floor(isl.isl_multi_aff_copy(arg0.ptr))
        obj = multi_aff(ctx=ctx, ptr=res)
        return obj
    def gist(arg0, arg1):
        try:
            if not arg0.__class__ is multi_aff:
                arg0 = multi_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            return pw_multi_aff(arg0).gist(arg1)
        ctx = arg0.ctx
        res = isl.isl_multi_aff_gist(isl.isl_multi_aff_copy(arg0.ptr), isl.isl_set_copy(arg1.ptr))
        obj = multi_aff(ctx=ctx, ptr=res)
        return obj
    def has_range_tuple_id(arg0):
        try:
            if not arg0.__class__ is multi_aff:
                arg0 = multi_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_aff_has_range_tuple_id(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def identity(*args):
        if len(args) == 1:
            ctx = args[0].ctx
            res = isl.isl_multi_aff_identity_multi_aff(isl.isl_multi_aff_copy(args[0].ptr))
            obj = multi_aff(ctx=ctx, ptr=res)
            return obj
        raise Error
    @staticmethod
    def identity_on_domain(*args):
        if len(args) == 1 and args[0].__class__ is space:
            ctx = args[0].ctx
            res = isl.isl_multi_aff_identity_on_domain_space(isl.isl_space_copy(args[0].ptr))
            obj = multi_aff(ctx=ctx, ptr=res)
            return obj
        raise Error
    def insert_domain(arg0, arg1):
        try:
            if not arg0.__class__ is multi_aff:
                arg0 = multi_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is space:
                arg1 = space(arg1)
        except:
            return pw_multi_aff(arg0).insert_domain(arg1)
        ctx = arg0.ctx
        res = isl.isl_multi_aff_insert_domain(isl.isl_multi_aff_copy(arg0.ptr), isl.isl_space_copy(arg1.ptr))
        obj = multi_aff(ctx=ctx, ptr=res)
        return obj
    def involves_locals(arg0):
        try:
            if not arg0.__class__ is multi_aff:
                arg0 = multi_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_aff_involves_locals(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def involves_nan(arg0):
        try:
            if not arg0.__class__ is multi_aff:
                arg0 = multi_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_aff_involves_nan(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def list(arg0):
        try:
            if not arg0.__class__ is multi_aff:
                arg0 = multi_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_aff_get_list(arg0.ptr)
        obj = aff_list(ctx=ctx, ptr=res)
        return obj
    def get_list(arg0):
        return arg0.list()
    @staticmethod
    def multi_val_on_domain(*args):
        if len(args) == 2 and args[0].__class__ is space and args[1].__class__ is multi_val:
            ctx = args[0].ctx
            res = isl.isl_multi_aff_multi_val_on_domain_space(isl.isl_space_copy(args[0].ptr), isl.isl_multi_val_copy(args[1].ptr))
            obj = multi_aff(ctx=ctx, ptr=res)
            return obj
        raise Error
    def neg(arg0):
        try:
            if not arg0.__class__ is multi_aff:
                arg0 = multi_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_aff_neg(isl.isl_multi_aff_copy(arg0.ptr))
        obj = multi_aff(ctx=ctx, ptr=res)
        return obj
    def plain_is_equal(arg0, arg1):
        try:
            if not arg0.__class__ is multi_aff:
                arg0 = multi_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_aff:
                arg1 = multi_aff(arg1)
        except:
            return pw_multi_aff(arg0).plain_is_equal(arg1)
        ctx = arg0.ctx
        res = isl.isl_multi_aff_plain_is_equal(arg0.ptr, arg1.ptr)
        if res < 0:
            raise
        return bool(res)
    def product(arg0, arg1):
        try:
            if not arg0.__class__ is multi_aff:
                arg0 = multi_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_aff:
                arg1 = multi_aff(arg1)
        except:
            return pw_multi_aff(arg0).product(arg1)
        ctx = arg0.ctx
        res = isl.isl_multi_aff_product(isl.isl_multi_aff_copy(arg0.ptr), isl.isl_multi_aff_copy(arg1.ptr))
        obj = multi_aff(ctx=ctx, ptr=res)
        return obj
    def pullback(*args):
        if len(args) == 2 and args[1].__class__ is multi_aff:
            ctx = args[0].ctx
            res = isl.isl_multi_aff_pullback_multi_aff(isl.isl_multi_aff_copy(args[0].ptr), isl.isl_multi_aff_copy(args[1].ptr))
            obj = multi_aff(ctx=ctx, ptr=res)
            return obj
        raise Error
    @staticmethod
    def range_map(arg0):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_aff_range_map(isl.isl_space_copy(arg0.ptr))
        obj = multi_aff(ctx=ctx, ptr=res)
        return obj
    def range_product(arg0, arg1):
        try:
            if not arg0.__class__ is multi_aff:
                arg0 = multi_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_aff:
                arg1 = multi_aff(arg1)
        except:
            return pw_multi_aff(arg0).range_product(arg1)
        ctx = arg0.ctx
        res = isl.isl_multi_aff_range_product(isl.isl_multi_aff_copy(arg0.ptr), isl.isl_multi_aff_copy(arg1.ptr))
        obj = multi_aff(ctx=ctx, ptr=res)
        return obj
    def range_tuple_id(arg0):
        try:
            if not arg0.__class__ is multi_aff:
                arg0 = multi_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_aff_get_range_tuple_id(arg0.ptr)
        obj = id(ctx=ctx, ptr=res)
        return obj
    def get_range_tuple_id(arg0):
        return arg0.range_tuple_id()
    def reset_range_tuple_id(arg0):
        try:
            if not arg0.__class__ is multi_aff:
                arg0 = multi_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_aff_reset_range_tuple_id(isl.isl_multi_aff_copy(arg0.ptr))
        obj = multi_aff(ctx=ctx, ptr=res)
        return obj
    def scale(*args):
        if len(args) == 2 and args[1].__class__ is multi_val:
            ctx = args[0].ctx
            res = isl.isl_multi_aff_scale_multi_val(isl.isl_multi_aff_copy(args[0].ptr), isl.isl_multi_val_copy(args[1].ptr))
            obj = multi_aff(ctx=ctx, ptr=res)
            return obj
        if len(args) == 2 and (args[1].__class__ is val or type(args[1]) == int):
            args = list(args)
            try:
                if not args[1].__class__ is val:
                    args[1] = val(args[1])
            except:
                raise
            ctx = args[0].ctx
            res = isl.isl_multi_aff_scale_val(isl.isl_multi_aff_copy(args[0].ptr), isl.isl_val_copy(args[1].ptr))
            obj = multi_aff(ctx=ctx, ptr=res)
            return obj
        raise Error
    def scale_down(*args):
        if len(args) == 2 and args[1].__class__ is multi_val:
            ctx = args[0].ctx
            res = isl.isl_multi_aff_scale_down_multi_val(isl.isl_multi_aff_copy(args[0].ptr), isl.isl_multi_val_copy(args[1].ptr))
            obj = multi_aff(ctx=ctx, ptr=res)
            return obj
        if len(args) == 2 and (args[1].__class__ is val or type(args[1]) == int):
            args = list(args)
            try:
                if not args[1].__class__ is val:
                    args[1] = val(args[1])
            except:
                raise
            ctx = args[0].ctx
            res = isl.isl_multi_aff_scale_down_val(isl.isl_multi_aff_copy(args[0].ptr), isl.isl_val_copy(args[1].ptr))
            obj = multi_aff(ctx=ctx, ptr=res)
            return obj
        raise Error
    def set_at(arg0, arg1, arg2):
        try:
            if not arg0.__class__ is multi_aff:
                arg0 = multi_aff(arg0)
        except:
            raise
        try:
            if not arg2.__class__ is aff:
                arg2 = aff(arg2)
        except:
            return pw_multi_aff(arg0).set_at(arg1, arg2)
        ctx = arg0.ctx
        res = isl.isl_multi_aff_set_at(isl.isl_multi_aff_copy(arg0.ptr), arg1, isl.isl_aff_copy(arg2.ptr))
        obj = multi_aff(ctx=ctx, ptr=res)
        return obj
    def set_range_tuple(*args):
        if len(args) == 2 and (args[1].__class__ is id or type(args[1]) == str):
            args = list(args)
            try:
                if not args[1].__class__ is id:
                    args[1] = id(args[1])
            except:
                raise
            ctx = args[0].ctx
            res = isl.isl_multi_aff_set_range_tuple_id(isl.isl_multi_aff_copy(args[0].ptr), isl.isl_id_copy(args[1].ptr))
            obj = multi_aff(ctx=ctx, ptr=res)
            return obj
        raise Error
    def size(arg0):
        try:
            if not arg0.__class__ is multi_aff:
                arg0 = multi_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_aff_size(arg0.ptr)
        if res < 0:
            raise
        return int(res)
    def space(arg0):
        try:
            if not arg0.__class__ is multi_aff:
                arg0 = multi_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_aff_get_space(arg0.ptr)
        obj = space(ctx=ctx, ptr=res)
        return obj
    def get_space(arg0):
        return arg0.space()
    def sub(arg0, arg1):
        try:
            if not arg0.__class__ is multi_aff:
                arg0 = multi_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_aff:
                arg1 = multi_aff(arg1)
        except:
            return pw_multi_aff(arg0).sub(arg1)
        ctx = arg0.ctx
        res = isl.isl_multi_aff_sub(isl.isl_multi_aff_copy(arg0.ptr), isl.isl_multi_aff_copy(arg1.ptr))
        obj = multi_aff(ctx=ctx, ptr=res)
        return obj
    def to_multi_pw_aff(arg0):
        try:
            if not arg0.__class__ is multi_aff:
                arg0 = multi_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_aff_to_multi_pw_aff(isl.isl_multi_aff_copy(arg0.ptr))
        obj = multi_pw_aff(ctx=ctx, ptr=res)
        return obj
    def to_multi_union_pw_aff(arg0):
        try:
            if not arg0.__class__ is multi_aff:
                arg0 = multi_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_aff_to_multi_union_pw_aff(isl.isl_multi_aff_copy(arg0.ptr))
        obj = multi_union_pw_aff(ctx=ctx, ptr=res)
        return obj
    def to_pw_multi_aff(arg0):
        try:
            if not arg0.__class__ is multi_aff:
                arg0 = multi_aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_aff_to_pw_multi_aff(isl.isl_multi_aff_copy(arg0.ptr))
        obj = pw_multi_aff(ctx=ctx, ptr=res)
        return obj
    def unbind_params_insert_domain(arg0, arg1):
        try:
            if not arg0.__class__ is multi_aff:
                arg0 = multi_aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_id:
                arg1 = multi_id(arg1)
        except:
            return pw_multi_aff(arg0).unbind_params_insert_domain(arg1)
        ctx = arg0.ctx
        res = isl.isl_multi_aff_unbind_params_insert_domain(isl.isl_multi_aff_copy(arg0.ptr), isl.isl_multi_id_copy(arg1.ptr))
        obj = multi_aff(ctx=ctx, ptr=res)
        return obj
    @staticmethod
    def zero(arg0):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_aff_zero(isl.isl_space_copy(arg0.ptr))
        obj = multi_aff(ctx=ctx, ptr=res)
        return obj

isl.isl_multi_aff_from_aff.restype = c_void_p
isl.isl_multi_aff_from_aff.argtypes = [c_void_p]
isl.isl_multi_aff_from_aff_list.restype = c_void_p
isl.isl_multi_aff_from_aff_list.argtypes = [c_void_p, c_void_p]
isl.isl_multi_aff_read_from_str.restype = c_void_p
isl.isl_multi_aff_read_from_str.argtypes = [Context, c_char_p]
isl.isl_multi_aff_add.restype = c_void_p
isl.isl_multi_aff_add.argtypes = [c_void_p, c_void_p]
isl.isl_multi_aff_add_constant_multi_val.restype = c_void_p
isl.isl_multi_aff_add_constant_multi_val.argtypes = [c_void_p, c_void_p]
isl.isl_multi_aff_add_constant_val.restype = c_void_p
isl.isl_multi_aff_add_constant_val.argtypes = [c_void_p, c_void_p]
isl.isl_multi_aff_as_map.restype = c_void_p
isl.isl_multi_aff_as_map.argtypes = [c_void_p]
isl.isl_multi_aff_as_set.restype = c_void_p
isl.isl_multi_aff_as_set.argtypes = [c_void_p]
isl.isl_multi_aff_get_at.restype = c_void_p
isl.isl_multi_aff_get_at.argtypes = [c_void_p, c_int]
isl.isl_multi_aff_bind.restype = c_void_p
isl.isl_multi_aff_bind.argtypes = [c_void_p, c_void_p]
isl.isl_multi_aff_bind_domain.restype = c_void_p
isl.isl_multi_aff_bind_domain.argtypes = [c_void_p, c_void_p]
isl.isl_multi_aff_bind_domain_wrapped_domain.restype = c_void_p
isl.isl_multi_aff_bind_domain_wrapped_domain.argtypes = [c_void_p, c_void_p]
isl.isl_multi_aff_get_constant_multi_val.restype = c_void_p
isl.isl_multi_aff_get_constant_multi_val.argtypes = [c_void_p]
isl.isl_multi_aff_domain_map.restype = c_void_p
isl.isl_multi_aff_domain_map.argtypes = [c_void_p]
isl.isl_multi_aff_flat_range_product.restype = c_void_p
isl.isl_multi_aff_flat_range_product.argtypes = [c_void_p, c_void_p]
isl.isl_multi_aff_floor.restype = c_void_p
isl.isl_multi_aff_floor.argtypes = [c_void_p]
isl.isl_multi_aff_gist.restype = c_void_p
isl.isl_multi_aff_gist.argtypes = [c_void_p, c_void_p]
isl.isl_multi_aff_has_range_tuple_id.argtypes = [c_void_p]
isl.isl_multi_aff_identity_multi_aff.restype = c_void_p
isl.isl_multi_aff_identity_multi_aff.argtypes = [c_void_p]
isl.isl_multi_aff_identity_on_domain_space.restype = c_void_p
isl.isl_multi_aff_identity_on_domain_space.argtypes = [c_void_p]
isl.isl_multi_aff_insert_domain.restype = c_void_p
isl.isl_multi_aff_insert_domain.argtypes = [c_void_p, c_void_p]
isl.isl_multi_aff_involves_locals.argtypes = [c_void_p]
isl.isl_multi_aff_involves_nan.argtypes = [c_void_p]
isl.isl_multi_aff_get_list.restype = c_void_p
isl.isl_multi_aff_get_list.argtypes = [c_void_p]
isl.isl_multi_aff_multi_val_on_domain_space.restype = c_void_p
isl.isl_multi_aff_multi_val_on_domain_space.argtypes = [c_void_p, c_void_p]
isl.isl_multi_aff_neg.restype = c_void_p
isl.isl_multi_aff_neg.argtypes = [c_void_p]
isl.isl_multi_aff_plain_is_equal.argtypes = [c_void_p, c_void_p]
isl.isl_multi_aff_product.restype = c_void_p
isl.isl_multi_aff_product.argtypes = [c_void_p, c_void_p]
isl.isl_multi_aff_pullback_multi_aff.restype = c_void_p
isl.isl_multi_aff_pullback_multi_aff.argtypes = [c_void_p, c_void_p]
isl.isl_multi_aff_range_map.restype = c_void_p
isl.isl_multi_aff_range_map.argtypes = [c_void_p]
isl.isl_multi_aff_range_product.restype = c_void_p
isl.isl_multi_aff_range_product.argtypes = [c_void_p, c_void_p]
isl.isl_multi_aff_get_range_tuple_id.restype = c_void_p
isl.isl_multi_aff_get_range_tuple_id.argtypes = [c_void_p]
isl.isl_multi_aff_reset_range_tuple_id.restype = c_void_p
isl.isl_multi_aff_reset_range_tuple_id.argtypes = [c_void_p]
isl.isl_multi_aff_scale_multi_val.restype = c_void_p
isl.isl_multi_aff_scale_multi_val.argtypes = [c_void_p, c_void_p]
isl.isl_multi_aff_scale_val.restype = c_void_p
isl.isl_multi_aff_scale_val.argtypes = [c_void_p, c_void_p]
isl.isl_multi_aff_scale_down_multi_val.restype = c_void_p
isl.isl_multi_aff_scale_down_multi_val.argtypes = [c_void_p, c_void_p]
isl.isl_multi_aff_scale_down_val.restype = c_void_p
isl.isl_multi_aff_scale_down_val.argtypes = [c_void_p, c_void_p]
isl.isl_multi_aff_set_at.restype = c_void_p
isl.isl_multi_aff_set_at.argtypes = [c_void_p, c_int, c_void_p]
isl.isl_multi_aff_set_range_tuple_id.restype = c_void_p
isl.isl_multi_aff_set_range_tuple_id.argtypes = [c_void_p, c_void_p]
isl.isl_multi_aff_size.argtypes = [c_void_p]
isl.isl_multi_aff_get_space.restype = c_void_p
isl.isl_multi_aff_get_space.argtypes = [c_void_p]
isl.isl_multi_aff_sub.restype = c_void_p
isl.isl_multi_aff_sub.argtypes = [c_void_p, c_void_p]
isl.isl_multi_aff_to_multi_pw_aff.restype = c_void_p
isl.isl_multi_aff_to_multi_pw_aff.argtypes = [c_void_p]
isl.isl_multi_aff_to_multi_union_pw_aff.restype = c_void_p
isl.isl_multi_aff_to_multi_union_pw_aff.argtypes = [c_void_p]
isl.isl_multi_aff_to_pw_multi_aff.restype = c_void_p
isl.isl_multi_aff_to_pw_multi_aff.argtypes = [c_void_p]
isl.isl_multi_aff_unbind_params_insert_domain.restype = c_void_p
isl.isl_multi_aff_unbind_params_insert_domain.argtypes = [c_void_p, c_void_p]
isl.isl_multi_aff_zero.restype = c_void_p
isl.isl_multi_aff_zero.argtypes = [c_void_p]
isl.isl_multi_aff_copy.restype = c_void_p
isl.isl_multi_aff_copy.argtypes = [c_void_p]
isl.isl_multi_aff_free.restype = c_void_p
isl.isl_multi_aff_free.argtypes = [c_void_p]
isl.isl_multi_aff_to_str.restype = POINTER(c_char)
isl.isl_multi_aff_to_str.argtypes = [c_void_p]

class aff(pw_aff, multi_aff):
    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_aff_read_from_str(self.ctx, args[0].encode('ascii'))
            return
        raise Error
    def __del__(self):
        if hasattr(self, 'ptr'):
            isl.isl_aff_free(self.ptr)
    def __str__(arg0):
        try:
            if not arg0.__class__ is aff:
                arg0 = aff(arg0)
        except:
            raise
        ptr = isl.isl_aff_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.aff("""%s""")' % s
        else:
            return 'isl.aff("%s")' % s
    def add(arg0, arg1):
        try:
            if not arg0.__class__ is aff:
                arg0 = aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is aff:
                arg1 = aff(arg1)
        except:
            return pw_aff(arg0).add(arg1)
        ctx = arg0.ctx
        res = isl.isl_aff_add(isl.isl_aff_copy(arg0.ptr), isl.isl_aff_copy(arg1.ptr))
        obj = aff(ctx=ctx, ptr=res)
        return obj
    def add_constant(*args):
        if len(args) == 2 and (args[1].__class__ is val or type(args[1]) == int):
            args = list(args)
            try:
                if not args[1].__class__ is val:
                    args[1] = val(args[1])
            except:
                raise
            ctx = args[0].ctx
            res = isl.isl_aff_add_constant_val(isl.isl_aff_copy(args[0].ptr), isl.isl_val_copy(args[1].ptr))
            obj = aff(ctx=ctx, ptr=res)
            return obj
        raise Error
    def bind(*args):
        if len(args) == 2 and (args[1].__class__ is id or type(args[1]) == str):
            args = list(args)
            try:
                if not args[1].__class__ is id:
                    args[1] = id(args[1])
            except:
                raise
            ctx = args[0].ctx
            res = isl.isl_aff_bind_id(isl.isl_aff_copy(args[0].ptr), isl.isl_id_copy(args[1].ptr))
            obj = basic_set(ctx=ctx, ptr=res)
            return obj
        raise Error
    def ceil(arg0):
        try:
            if not arg0.__class__ is aff:
                arg0 = aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_aff_ceil(isl.isl_aff_copy(arg0.ptr))
        obj = aff(ctx=ctx, ptr=res)
        return obj
    def constant_val(arg0):
        try:
            if not arg0.__class__ is aff:
                arg0 = aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_aff_get_constant_val(arg0.ptr)
        obj = val(ctx=ctx, ptr=res)
        return obj
    def get_constant_val(arg0):
        return arg0.constant_val()
    def div(arg0, arg1):
        try:
            if not arg0.__class__ is aff:
                arg0 = aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is aff:
                arg1 = aff(arg1)
        except:
            return pw_aff(arg0).div(arg1)
        ctx = arg0.ctx
        res = isl.isl_aff_div(isl.isl_aff_copy(arg0.ptr), isl.isl_aff_copy(arg1.ptr))
        obj = aff(ctx=ctx, ptr=res)
        return obj
    def eq_set(arg0, arg1):
        try:
            if not arg0.__class__ is aff:
                arg0 = aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is aff:
                arg1 = aff(arg1)
        except:
            return pw_aff(arg0).eq_set(arg1)
        ctx = arg0.ctx
        res = isl.isl_aff_eq_set(isl.isl_aff_copy(arg0.ptr), isl.isl_aff_copy(arg1.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj
    def eval(arg0, arg1):
        try:
            if not arg0.__class__ is aff:
                arg0 = aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is point:
                arg1 = point(arg1)
        except:
            return pw_aff(arg0).eval(arg1)
        ctx = arg0.ctx
        res = isl.isl_aff_eval(isl.isl_aff_copy(arg0.ptr), isl.isl_point_copy(arg1.ptr))
        obj = val(ctx=ctx, ptr=res)
        return obj
    def floor(arg0):
        try:
            if not arg0.__class__ is aff:
                arg0 = aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_aff_floor(isl.isl_aff_copy(arg0.ptr))
        obj = aff(ctx=ctx, ptr=res)
        return obj
    def ge_set(arg0, arg1):
        try:
            if not arg0.__class__ is aff:
                arg0 = aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is aff:
                arg1 = aff(arg1)
        except:
            return pw_aff(arg0).ge_set(arg1)
        ctx = arg0.ctx
        res = isl.isl_aff_ge_set(isl.isl_aff_copy(arg0.ptr), isl.isl_aff_copy(arg1.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj
    def gist(arg0, arg1):
        try:
            if not arg0.__class__ is aff:
                arg0 = aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            return pw_aff(arg0).gist(arg1)
        ctx = arg0.ctx
        res = isl.isl_aff_gist(isl.isl_aff_copy(arg0.ptr), isl.isl_set_copy(arg1.ptr))
        obj = aff(ctx=ctx, ptr=res)
        return obj
    def gt_set(arg0, arg1):
        try:
            if not arg0.__class__ is aff:
                arg0 = aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is aff:
                arg1 = aff(arg1)
        except:
            return pw_aff(arg0).gt_set(arg1)
        ctx = arg0.ctx
        res = isl.isl_aff_gt_set(isl.isl_aff_copy(arg0.ptr), isl.isl_aff_copy(arg1.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj
    def is_cst(arg0):
        try:
            if not arg0.__class__ is aff:
                arg0 = aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_aff_is_cst(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def le_set(arg0, arg1):
        try:
            if not arg0.__class__ is aff:
                arg0 = aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is aff:
                arg1 = aff(arg1)
        except:
            return pw_aff(arg0).le_set(arg1)
        ctx = arg0.ctx
        res = isl.isl_aff_le_set(isl.isl_aff_copy(arg0.ptr), isl.isl_aff_copy(arg1.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj
    def lt_set(arg0, arg1):
        try:
            if not arg0.__class__ is aff:
                arg0 = aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is aff:
                arg1 = aff(arg1)
        except:
            return pw_aff(arg0).lt_set(arg1)
        ctx = arg0.ctx
        res = isl.isl_aff_lt_set(isl.isl_aff_copy(arg0.ptr), isl.isl_aff_copy(arg1.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj
    def mod(*args):
        if len(args) == 2 and (args[1].__class__ is val or type(args[1]) == int):
            args = list(args)
            try:
                if not args[1].__class__ is val:
                    args[1] = val(args[1])
            except:
                raise
            ctx = args[0].ctx
            res = isl.isl_aff_mod_val(isl.isl_aff_copy(args[0].ptr), isl.isl_val_copy(args[1].ptr))
            obj = aff(ctx=ctx, ptr=res)
            return obj
        raise Error
    def mul(arg0, arg1):
        try:
            if not arg0.__class__ is aff:
                arg0 = aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is aff:
                arg1 = aff(arg1)
        except:
            return pw_aff(arg0).mul(arg1)
        ctx = arg0.ctx
        res = isl.isl_aff_mul(isl.isl_aff_copy(arg0.ptr), isl.isl_aff_copy(arg1.ptr))
        obj = aff(ctx=ctx, ptr=res)
        return obj
    def ne_set(arg0, arg1):
        try:
            if not arg0.__class__ is aff:
                arg0 = aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is aff:
                arg1 = aff(arg1)
        except:
            return pw_aff(arg0).ne_set(arg1)
        ctx = arg0.ctx
        res = isl.isl_aff_ne_set(isl.isl_aff_copy(arg0.ptr), isl.isl_aff_copy(arg1.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj
    def neg(arg0):
        try:
            if not arg0.__class__ is aff:
                arg0 = aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_aff_neg(isl.isl_aff_copy(arg0.ptr))
        obj = aff(ctx=ctx, ptr=res)
        return obj
    def pullback(*args):
        if len(args) == 2 and args[1].__class__ is multi_aff:
            ctx = args[0].ctx
            res = isl.isl_aff_pullback_multi_aff(isl.isl_aff_copy(args[0].ptr), isl.isl_multi_aff_copy(args[1].ptr))
            obj = aff(ctx=ctx, ptr=res)
            return obj
        raise Error
    def scale(*args):
        if len(args) == 2 and (args[1].__class__ is val or type(args[1]) == int):
            args = list(args)
            try:
                if not args[1].__class__ is val:
                    args[1] = val(args[1])
            except:
                raise
            ctx = args[0].ctx
            res = isl.isl_aff_scale_val(isl.isl_aff_copy(args[0].ptr), isl.isl_val_copy(args[1].ptr))
            obj = aff(ctx=ctx, ptr=res)
            return obj
        raise Error
    def scale_down(*args):
        if len(args) == 2 and (args[1].__class__ is val or type(args[1]) == int):
            args = list(args)
            try:
                if not args[1].__class__ is val:
                    args[1] = val(args[1])
            except:
                raise
            ctx = args[0].ctx
            res = isl.isl_aff_scale_down_val(isl.isl_aff_copy(args[0].ptr), isl.isl_val_copy(args[1].ptr))
            obj = aff(ctx=ctx, ptr=res)
            return obj
        raise Error
    def sub(arg0, arg1):
        try:
            if not arg0.__class__ is aff:
                arg0 = aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is aff:
                arg1 = aff(arg1)
        except:
            return pw_aff(arg0).sub(arg1)
        ctx = arg0.ctx
        res = isl.isl_aff_sub(isl.isl_aff_copy(arg0.ptr), isl.isl_aff_copy(arg1.ptr))
        obj = aff(ctx=ctx, ptr=res)
        return obj
    def to_list(arg0):
        try:
            if not arg0.__class__ is aff:
                arg0 = aff(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_aff_to_list(isl.isl_aff_copy(arg0.ptr))
        obj = aff_list(ctx=ctx, ptr=res)
        return obj
    def unbind_params_insert_domain(arg0, arg1):
        try:
            if not arg0.__class__ is aff:
                arg0 = aff(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_id:
                arg1 = multi_id(arg1)
        except:
            return pw_aff(arg0).unbind_params_insert_domain(arg1)
        ctx = arg0.ctx
        res = isl.isl_aff_unbind_params_insert_domain(isl.isl_aff_copy(arg0.ptr), isl.isl_multi_id_copy(arg1.ptr))
        obj = aff(ctx=ctx, ptr=res)
        return obj
    @staticmethod
    def zero_on_domain(*args):
        if len(args) == 1 and args[0].__class__ is space:
            ctx = args[0].ctx
            res = isl.isl_aff_zero_on_domain_space(isl.isl_space_copy(args[0].ptr))
            obj = aff(ctx=ctx, ptr=res)
            return obj
        raise Error

isl.isl_aff_read_from_str.restype = c_void_p
isl.isl_aff_read_from_str.argtypes = [Context, c_char_p]
isl.isl_aff_add.restype = c_void_p
isl.isl_aff_add.argtypes = [c_void_p, c_void_p]
isl.isl_aff_add_constant_val.restype = c_void_p
isl.isl_aff_add_constant_val.argtypes = [c_void_p, c_void_p]
isl.isl_aff_bind_id.restype = c_void_p
isl.isl_aff_bind_id.argtypes = [c_void_p, c_void_p]
isl.isl_aff_ceil.restype = c_void_p
isl.isl_aff_ceil.argtypes = [c_void_p]
isl.isl_aff_get_constant_val.restype = c_void_p
isl.isl_aff_get_constant_val.argtypes = [c_void_p]
isl.isl_aff_div.restype = c_void_p
isl.isl_aff_div.argtypes = [c_void_p, c_void_p]
isl.isl_aff_eq_set.restype = c_void_p
isl.isl_aff_eq_set.argtypes = [c_void_p, c_void_p]
isl.isl_aff_eval.restype = c_void_p
isl.isl_aff_eval.argtypes = [c_void_p, c_void_p]
isl.isl_aff_floor.restype = c_void_p
isl.isl_aff_floor.argtypes = [c_void_p]
isl.isl_aff_ge_set.restype = c_void_p
isl.isl_aff_ge_set.argtypes = [c_void_p, c_void_p]
isl.isl_aff_gist.restype = c_void_p
isl.isl_aff_gist.argtypes = [c_void_p, c_void_p]
isl.isl_aff_gt_set.restype = c_void_p
isl.isl_aff_gt_set.argtypes = [c_void_p, c_void_p]
isl.isl_aff_is_cst.argtypes = [c_void_p]
isl.isl_aff_le_set.restype = c_void_p
isl.isl_aff_le_set.argtypes = [c_void_p, c_void_p]
isl.isl_aff_lt_set.restype = c_void_p
isl.isl_aff_lt_set.argtypes = [c_void_p, c_void_p]
isl.isl_aff_mod_val.restype = c_void_p
isl.isl_aff_mod_val.argtypes = [c_void_p, c_void_p]
isl.isl_aff_mul.restype = c_void_p
isl.isl_aff_mul.argtypes = [c_void_p, c_void_p]
isl.isl_aff_ne_set.restype = c_void_p
isl.isl_aff_ne_set.argtypes = [c_void_p, c_void_p]
isl.isl_aff_neg.restype = c_void_p
isl.isl_aff_neg.argtypes = [c_void_p]
isl.isl_aff_pullback_multi_aff.restype = c_void_p
isl.isl_aff_pullback_multi_aff.argtypes = [c_void_p, c_void_p]
isl.isl_aff_scale_val.restype = c_void_p
isl.isl_aff_scale_val.argtypes = [c_void_p, c_void_p]
isl.isl_aff_scale_down_val.restype = c_void_p
isl.isl_aff_scale_down_val.argtypes = [c_void_p, c_void_p]
isl.isl_aff_sub.restype = c_void_p
isl.isl_aff_sub.argtypes = [c_void_p, c_void_p]
isl.isl_aff_to_list.restype = c_void_p
isl.isl_aff_to_list.argtypes = [c_void_p]
isl.isl_aff_unbind_params_insert_domain.restype = c_void_p
isl.isl_aff_unbind_params_insert_domain.argtypes = [c_void_p, c_void_p]
isl.isl_aff_zero_on_domain_space.restype = c_void_p
isl.isl_aff_zero_on_domain_space.argtypes = [c_void_p]
isl.isl_aff_copy.restype = c_void_p
isl.isl_aff_copy.argtypes = [c_void_p]
isl.isl_aff_free.restype = c_void_p
isl.isl_aff_free.argtypes = [c_void_p]
isl.isl_aff_to_str.restype = POINTER(c_char)
isl.isl_aff_to_str.argtypes = [c_void_p]

class aff_list(object):
    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]) == int:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_aff_list_alloc(self.ctx, args[0])
            return
        if len(args) == 1 and args[0].__class__ is aff:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_aff_list_from_aff(isl.isl_aff_copy(args[0].ptr))
            return
        if len(args) == 1 and type(args[0]) == str:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_aff_list_read_from_str(self.ctx, args[0].encode('ascii'))
            return
        raise Error
    def __del__(self):
        if hasattr(self, 'ptr'):
            isl.isl_aff_list_free(self.ptr)
    def __str__(arg0):
        try:
            if not arg0.__class__ is aff_list:
                arg0 = aff_list(arg0)
        except:
            raise
        ptr = isl.isl_aff_list_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.aff_list("""%s""")' % s
        else:
            return 'isl.aff_list("%s")' % s
    def add(arg0, arg1):
        try:
            if not arg0.__class__ is aff_list:
                arg0 = aff_list(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is aff:
                arg1 = aff(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_aff_list_add(isl.isl_aff_list_copy(arg0.ptr), isl.isl_aff_copy(arg1.ptr))
        obj = aff_list(ctx=ctx, ptr=res)
        return obj
    def at(arg0, arg1):
        try:
            if not arg0.__class__ is aff_list:
                arg0 = aff_list(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_aff_list_get_at(arg0.ptr, arg1)
        obj = aff(ctx=ctx, ptr=res)
        return obj
    def get_at(arg0, arg1):
        return arg0.at(arg1)
    def clear(arg0):
        try:
            if not arg0.__class__ is aff_list:
                arg0 = aff_list(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_aff_list_clear(isl.isl_aff_list_copy(arg0.ptr))
        obj = aff_list(ctx=ctx, ptr=res)
        return obj
    def concat(arg0, arg1):
        try:
            if not arg0.__class__ is aff_list:
                arg0 = aff_list(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is aff_list:
                arg1 = aff_list(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_aff_list_concat(isl.isl_aff_list_copy(arg0.ptr), isl.isl_aff_list_copy(arg1.ptr))
        obj = aff_list(ctx=ctx, ptr=res)
        return obj
    def drop(arg0, arg1, arg2):
        try:
            if not arg0.__class__ is aff_list:
                arg0 = aff_list(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_aff_list_drop(isl.isl_aff_list_copy(arg0.ptr), arg1, arg2)
        obj = aff_list(ctx=ctx, ptr=res)
        return obj
    def foreach(arg0, arg1):
        try:
            if not arg0.__class__ is aff_list:
                arg0 = aff_list(arg0)
        except:
            raise
        exc_info = [None]
        fn = CFUNCTYPE(c_int, c_void_p, c_void_p)
        def cb_func(cb_arg0, cb_arg1):
            cb_arg0 = aff(ctx=arg0.ctx, ptr=(cb_arg0))
            try:
                arg1(cb_arg0)
            except BaseException as e:
                exc_info[0] = e
                return -1
            return 0
        cb = fn(cb_func)
        ctx = arg0.ctx
        res = isl.isl_aff_list_foreach(arg0.ptr, cb, None)
        if exc_info[0] is not None:
            raise exc_info[0]
        if res < 0:
            raise
    def insert(arg0, arg1, arg2):
        try:
            if not arg0.__class__ is aff_list:
                arg0 = aff_list(arg0)
        except:
            raise
        try:
            if not arg2.__class__ is aff:
                arg2 = aff(arg2)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_aff_list_insert(isl.isl_aff_list_copy(arg0.ptr), arg1, isl.isl_aff_copy(arg2.ptr))
        obj = aff_list(ctx=ctx, ptr=res)
        return obj
    def size(arg0):
        try:
            if not arg0.__class__ is aff_list:
                arg0 = aff_list(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_aff_list_size(arg0.ptr)
        if res < 0:
            raise
        return int(res)

isl.isl_aff_list_alloc.restype = c_void_p
isl.isl_aff_list_alloc.argtypes = [Context, c_int]
isl.isl_aff_list_from_aff.restype = c_void_p
isl.isl_aff_list_from_aff.argtypes = [c_void_p]
isl.isl_aff_list_read_from_str.restype = c_void_p
isl.isl_aff_list_read_from_str.argtypes = [Context, c_char_p]
isl.isl_aff_list_add.restype = c_void_p
isl.isl_aff_list_add.argtypes = [c_void_p, c_void_p]
isl.isl_aff_list_get_at.restype = c_void_p
isl.isl_aff_list_get_at.argtypes = [c_void_p, c_int]
isl.isl_aff_list_clear.restype = c_void_p
isl.isl_aff_list_clear.argtypes = [c_void_p]
isl.isl_aff_list_concat.restype = c_void_p
isl.isl_aff_list_concat.argtypes = [c_void_p, c_void_p]
isl.isl_aff_list_drop.restype = c_void_p
isl.isl_aff_list_drop.argtypes = [c_void_p, c_int, c_int]
isl.isl_aff_list_foreach.argtypes = [c_void_p, c_void_p, c_void_p]
isl.isl_aff_list_insert.restype = c_void_p
isl.isl_aff_list_insert.argtypes = [c_void_p, c_int, c_void_p]
isl.isl_aff_list_size.argtypes = [c_void_p]
isl.isl_aff_list_copy.restype = c_void_p
isl.isl_aff_list_copy.argtypes = [c_void_p]
isl.isl_aff_list_free.restype = c_void_p
isl.isl_aff_list_free.argtypes = [c_void_p]
isl.isl_aff_list_to_str.restype = POINTER(c_char)
isl.isl_aff_list_to_str.argtypes = [c_void_p]

class ast_build(object):
    def __init__(self, *args, **keywords):
        if "ptr" in keywords:
            self.ctx = keywords["ctx"]
            self.ptr = keywords["ptr"]
            return
        if len(args) == 0:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_ast_build_alloc(self.ctx)
            return
        raise Error
    def __del__(self):
        if hasattr(self, 'ptr'):
            isl.isl_ast_build_free(self.ptr)
    def copy_callbacks(self, obj):
        if hasattr(obj, 'at_each_domain'):
            self.at_each_domain = obj.at_each_domain
    def set_at_each_domain(arg0, arg1):
        try:
            if not arg0.__class__ is ast_build:
                arg0 = ast_build(arg0)
        except:
            raise
        exc_info = [None]
        fn = CFUNCTYPE(c_void_p, c_void_p, c_void_p, c_void_p)
        def cb_func(cb_arg0, cb_arg1, cb_arg2):
            cb_arg0 = ast_node(ctx=arg0.ctx, ptr=(cb_arg0))
            cb_arg1 = ast_build(ctx=arg0.ctx, ptr=isl.isl_ast_build_copy(cb_arg1))
            try:
                res = arg1(cb_arg0, cb_arg1)
            except BaseException as e:
                exc_info[0] = e
                return None
            return isl.isl_ast_node_copy(res.ptr)
        cb = fn(cb_func)
        ctx = arg0.ctx
        res = isl.isl_ast_build_set_at_each_domain(isl.isl_ast_build_copy(arg0.ptr), cb, None)
        if exc_info[0] is not None:
            raise exc_info[0]
        if hasattr(arg0, 'at_each_domain') and arg0.at_each_domain['exc_info'] != None:
            exc_info = arg0.at_each_domain['exc_info'][0]
            arg0.at_each_domain['exc_info'][0] = None
            if exc_info is not None:
                raise exc_info
        obj = ast_build(ctx=ctx, ptr=res)
        obj.copy_callbacks(arg0)
        obj.at_each_domain = { 'func': cb, 'exc_info': exc_info }
        return obj
    def access_from(*args):
        if len(args) == 2 and args[1].__class__ is multi_pw_aff:
            ctx = args[0].ctx
            res = isl.isl_ast_build_access_from_multi_pw_aff(args[0].ptr, isl.isl_multi_pw_aff_copy(args[1].ptr))
            if hasattr(args[0], 'at_each_domain') and args[0].at_each_domain['exc_info'] != None:
                exc_info = args[0].at_each_domain['exc_info'][0]
                args[0].at_each_domain['exc_info'][0] = None
                if exc_info is not None:
                    raise exc_info
            obj = ast_expr(ctx=ctx, ptr=res)
            return obj
        if len(args) == 2 and args[1].__class__ is pw_multi_aff:
            ctx = args[0].ctx
            res = isl.isl_ast_build_access_from_pw_multi_aff(args[0].ptr, isl.isl_pw_multi_aff_copy(args[1].ptr))
            if hasattr(args[0], 'at_each_domain') and args[0].at_each_domain['exc_info'] != None:
                exc_info = args[0].at_each_domain['exc_info'][0]
                args[0].at_each_domain['exc_info'][0] = None
                if exc_info is not None:
                    raise exc_info
            obj = ast_expr(ctx=ctx, ptr=res)
            return obj
        raise Error
    def call_from(*args):
        if len(args) == 2 and args[1].__class__ is multi_pw_aff:
            ctx = args[0].ctx
            res = isl.isl_ast_build_call_from_multi_pw_aff(args[0].ptr, isl.isl_multi_pw_aff_copy(args[1].ptr))
            if hasattr(args[0], 'at_each_domain') and args[0].at_each_domain['exc_info'] != None:
                exc_info = args[0].at_each_domain['exc_info'][0]
                args[0].at_each_domain['exc_info'][0] = None
                if exc_info is not None:
                    raise exc_info
            obj = ast_expr(ctx=ctx, ptr=res)
            return obj
        if len(args) == 2 and args[1].__class__ is pw_multi_aff:
            ctx = args[0].ctx
            res = isl.isl_ast_build_call_from_pw_multi_aff(args[0].ptr, isl.isl_pw_multi_aff_copy(args[1].ptr))
            if hasattr(args[0], 'at_each_domain') and args[0].at_each_domain['exc_info'] != None:
                exc_info = args[0].at_each_domain['exc_info'][0]
                args[0].at_each_domain['exc_info'][0] = None
                if exc_info is not None:
                    raise exc_info
            obj = ast_expr(ctx=ctx, ptr=res)
            return obj
        raise Error
    def expr_from(*args):
        if len(args) == 2 and args[1].__class__ is pw_aff:
            ctx = args[0].ctx
            res = isl.isl_ast_build_expr_from_pw_aff(args[0].ptr, isl.isl_pw_aff_copy(args[1].ptr))
            if hasattr(args[0], 'at_each_domain') and args[0].at_each_domain['exc_info'] != None:
                exc_info = args[0].at_each_domain['exc_info'][0]
                args[0].at_each_domain['exc_info'][0] = None
                if exc_info is not None:
                    raise exc_info
            obj = ast_expr(ctx=ctx, ptr=res)
            return obj
        if len(args) == 2 and args[1].__class__ is set:
            ctx = args[0].ctx
            res = isl.isl_ast_build_expr_from_set(args[0].ptr, isl.isl_set_copy(args[1].ptr))
            if hasattr(args[0], 'at_each_domain') and args[0].at_each_domain['exc_info'] != None:
                exc_info = args[0].at_each_domain['exc_info'][0]
                args[0].at_each_domain['exc_info'][0] = None
                if exc_info is not None:
                    raise exc_info
            obj = ast_expr(ctx=ctx, ptr=res)
            return obj
        raise Error
    @staticmethod
    def from_context(arg0):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_ast_build_from_context(isl.isl_set_copy(arg0.ptr))
        obj = ast_build(ctx=ctx, ptr=res)
        return obj
    def node_from(*args):
        if len(args) == 2 and args[1].__class__ is schedule:
            ctx = args[0].ctx
            res = isl.isl_ast_build_node_from_schedule(args[0].ptr, isl.isl_schedule_copy(args[1].ptr))
            if hasattr(args[0], 'at_each_domain') and args[0].at_each_domain['exc_info'] != None:
                exc_info = args[0].at_each_domain['exc_info'][0]
                args[0].at_each_domain['exc_info'][0] = None
                if exc_info is not None:
                    raise exc_info
            obj = ast_node(ctx=ctx, ptr=res)
            return obj
        raise Error
    def node_from_schedule_map(arg0, arg1):
        try:
            if not arg0.__class__ is ast_build:
                arg0 = ast_build(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_map:
                arg1 = union_map(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_ast_build_node_from_schedule_map(arg0.ptr, isl.isl_union_map_copy(arg1.ptr))
        if hasattr(arg0, 'at_each_domain') and arg0.at_each_domain['exc_info'] != None:
            exc_info = arg0.at_each_domain['exc_info'][0]
            arg0.at_each_domain['exc_info'][0] = None
            if exc_info is not None:
                raise exc_info
        obj = ast_node(ctx=ctx, ptr=res)
        return obj
    def schedule(arg0):
        try:
            if not arg0.__class__ is ast_build:
                arg0 = ast_build(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_ast_build_get_schedule(arg0.ptr)
        if hasattr(arg0, 'at_each_domain') and arg0.at_each_domain['exc_info'] != None:
            exc_info = arg0.at_each_domain['exc_info'][0]
            arg0.at_each_domain['exc_info'][0] = None
            if exc_info is not None:
                raise exc_info
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def get_schedule(arg0):
        return arg0.schedule()

isl.isl_ast_build_alloc.restype = c_void_p
isl.isl_ast_build_alloc.argtypes = [Context]
isl.isl_ast_build_set_at_each_domain.restype = c_void_p
isl.isl_ast_build_set_at_each_domain.argtypes = [c_void_p, c_void_p, c_void_p]
isl.isl_ast_build_access_from_multi_pw_aff.restype = c_void_p
isl.isl_ast_build_access_from_multi_pw_aff.argtypes = [c_void_p, c_void_p]
isl.isl_ast_build_access_from_pw_multi_aff.restype = c_void_p
isl.isl_ast_build_access_from_pw_multi_aff.argtypes = [c_void_p, c_void_p]
isl.isl_ast_build_call_from_multi_pw_aff.restype = c_void_p
isl.isl_ast_build_call_from_multi_pw_aff.argtypes = [c_void_p, c_void_p]
isl.isl_ast_build_call_from_pw_multi_aff.restype = c_void_p
isl.isl_ast_build_call_from_pw_multi_aff.argtypes = [c_void_p, c_void_p]
isl.isl_ast_build_expr_from_pw_aff.restype = c_void_p
isl.isl_ast_build_expr_from_pw_aff.argtypes = [c_void_p, c_void_p]
isl.isl_ast_build_expr_from_set.restype = c_void_p
isl.isl_ast_build_expr_from_set.argtypes = [c_void_p, c_void_p]
isl.isl_ast_build_from_context.restype = c_void_p
isl.isl_ast_build_from_context.argtypes = [c_void_p]
isl.isl_ast_build_node_from_schedule.restype = c_void_p
isl.isl_ast_build_node_from_schedule.argtypes = [c_void_p, c_void_p]
isl.isl_ast_build_node_from_schedule_map.restype = c_void_p
isl.isl_ast_build_node_from_schedule_map.argtypes = [c_void_p, c_void_p]
isl.isl_ast_build_get_schedule.restype = c_void_p
isl.isl_ast_build_get_schedule.argtypes = [c_void_p]
isl.isl_ast_build_copy.restype = c_void_p
isl.isl_ast_build_copy.argtypes = [c_void_p]
isl.isl_ast_build_free.restype = c_void_p
isl.isl_ast_build_free.argtypes = [c_void_p]

class ast_expr(object):
    def __init__(self, *args, **keywords):
        if "ptr" in keywords:
            self.ctx = keywords["ctx"]
            self.ptr = keywords["ptr"]
            return
        if len(args) == 1 and isinstance(args[0], ast_expr_op):
            self.ctx = args[0].ctx
            self.ptr = isl.isl_ast_expr_copy(args[0].ptr)
            return
        if len(args) == 1 and isinstance(args[0], ast_expr_id):
            self.ctx = args[0].ctx
            self.ptr = isl.isl_ast_expr_copy(args[0].ptr)
            return
        if len(args) == 1 and isinstance(args[0], ast_expr_int):
            self.ctx = args[0].ctx
            self.ptr = isl.isl_ast_expr_copy(args[0].ptr)
            return
        raise Error
    def __del__(self):
        if hasattr(self, 'ptr'):
            isl.isl_ast_expr_free(self.ptr)
    def __new__(cls, *args, **keywords):
        if "ptr" in keywords:
            type = isl.isl_ast_expr_get_type(keywords["ptr"])
            if type == 0:
                return ast_expr_op(**keywords)
            if type == 1:
                return ast_expr_id(**keywords)
            if type == 2:
                return ast_expr_int(**keywords)
            raise
        return super(ast_expr, cls).__new__(cls)
    def __str__(arg0):
        try:
            if not arg0.__class__ is ast_expr:
                arg0 = ast_expr(arg0)
        except:
            raise
        ptr = isl.isl_ast_expr_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.ast_expr("""%s""")' % s
        else:
            return 'isl.ast_expr("%s")' % s
    def to_C_str(arg0):
        try:
            if not arg0.__class__ is ast_expr:
                arg0 = ast_expr(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_ast_expr_to_C_str(arg0.ptr)
        if res == 0:
            raise
        string = cast(res, c_char_p).value.decode('ascii')
        libc.free(res)
        return string

isl.isl_ast_expr_to_C_str.restype = POINTER(c_char)
isl.isl_ast_expr_to_C_str.argtypes = [c_void_p]
isl.isl_ast_expr_copy.restype = c_void_p
isl.isl_ast_expr_copy.argtypes = [c_void_p]
isl.isl_ast_expr_free.restype = c_void_p
isl.isl_ast_expr_free.argtypes = [c_void_p]
isl.isl_ast_expr_to_str.restype = POINTER(c_char)
isl.isl_ast_expr_to_str.argtypes = [c_void_p]
isl.isl_ast_expr_get_type.argtypes = [c_void_p]

class ast_expr_id(ast_expr):
    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_ast_expr_free(self.ptr)
    def __new__(cls, *args, **keywords):
        return super(ast_expr_id, cls).__new__(cls)
    def __str__(arg0):
        try:
            if not arg0.__class__ is ast_expr_id:
                arg0 = ast_expr_id(arg0)
        except:
            raise
        ptr = isl.isl_ast_expr_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.ast_expr_id("""%s""")' % s
        else:
            return 'isl.ast_expr_id("%s")' % s
    def id(arg0):
        try:
            if not arg0.__class__ is ast_expr:
                arg0 = ast_expr(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_ast_expr_id_get_id(arg0.ptr)
        obj = id(ctx=ctx, ptr=res)
        return obj
    def get_id(arg0):
        return arg0.id()

isl.isl_ast_expr_id_get_id.restype = c_void_p
isl.isl_ast_expr_id_get_id.argtypes = [c_void_p]
isl.isl_ast_expr_copy.restype = c_void_p
isl.isl_ast_expr_copy.argtypes = [c_void_p]
isl.isl_ast_expr_free.restype = c_void_p
isl.isl_ast_expr_free.argtypes = [c_void_p]
isl.isl_ast_expr_to_str.restype = POINTER(c_char)
isl.isl_ast_expr_to_str.argtypes = [c_void_p]

class ast_expr_int(ast_expr):
    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_ast_expr_free(self.ptr)
    def __new__(cls, *args, **keywords):
        return super(ast_expr_int, cls).__new__(cls)
    def __str__(arg0):
        try:
            if not arg0.__class__ is ast_expr_int:
                arg0 = ast_expr_int(arg0)
        except:
            raise
        ptr = isl.isl_ast_expr_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.ast_expr_int("""%s""")' % s
        else:
            return 'isl.ast_expr_int("%s")' % s
    def val(arg0):
        try:
            if not arg0.__class__ is ast_expr:
                arg0 = ast_expr(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_ast_expr_int_get_val(arg0.ptr)
        obj = val(ctx=ctx, ptr=res)
        return obj
    def get_val(arg0):
        return arg0.val()

isl.isl_ast_expr_int_get_val.restype = c_void_p
isl.isl_ast_expr_int_get_val.argtypes = [c_void_p]
isl.isl_ast_expr_copy.restype = c_void_p
isl.isl_ast_expr_copy.argtypes = [c_void_p]
isl.isl_ast_expr_free.restype = c_void_p
isl.isl_ast_expr_free.argtypes = [c_void_p]
isl.isl_ast_expr_to_str.restype = POINTER(c_char)
isl.isl_ast_expr_to_str.argtypes = [c_void_p]

class ast_expr_op(ast_expr):
    def __init__(self, *args, **keywords):
        if "ptr" in keywords:
            self.ctx = keywords["ctx"]
            self.ptr = keywords["ptr"]
            return
        if len(args) == 1 and isinstance(args[0], ast_expr_op_and):
            self.ctx = args[0].ctx
            self.ptr = isl.isl_ast_expr_copy(args[0].ptr)
            return
        if len(args) == 1 and isinstance(args[0], ast_expr_op_and_then):
            self.ctx = args[0].ctx
            self.ptr = isl.isl_ast_expr_copy(args[0].ptr)
            return
        if len(args) == 1 and isinstance(args[0], ast_expr_op_or):
            self.ctx = args[0].ctx
            self.ptr = isl.isl_ast_expr_copy(args[0].ptr)
            return
        if len(args) == 1 and isinstance(args[0], ast_expr_op_or_else):
            self.ctx = args[0].ctx
            self.ptr = isl.isl_ast_expr_copy(args[0].ptr)
            return
        if len(args) == 1 and isinstance(args[0], ast_expr_op_max):
            self.ctx = args[0].ctx
            self.ptr = isl.isl_ast_expr_copy(args[0].ptr)
            return
        if len(args) == 1 and isinstance(args[0], ast_expr_op_min):
            self.ctx = args[0].ctx
            self.ptr = isl.isl_ast_expr_copy(args[0].ptr)
            return
        if len(args) == 1 and isinstance(args[0], ast_expr_op_minus):
            self.ctx = args[0].ctx
            self.ptr = isl.isl_ast_expr_copy(args[0].ptr)
            return
        if len(args) == 1 and isinstance(args[0], ast_expr_op_add):
            self.ctx = args[0].ctx
            self.ptr = isl.isl_ast_expr_copy(args[0].ptr)
            return
        if len(args) == 1 and isinstance(args[0], ast_expr_op_sub):
            self.ctx = args[0].ctx
            self.ptr = isl.isl_ast_expr_copy(args[0].ptr)
            return
        if len(args) == 1 and isinstance(args[0], ast_expr_op_mul):
            self.ctx = args[0].ctx
            self.ptr = isl.isl_ast_expr_copy(args[0].ptr)
            return
        if len(args) == 1 and isinstance(args[0], ast_expr_op_div):
            self.ctx = args[0].ctx
            self.ptr = isl.isl_ast_expr_copy(args[0].ptr)
            return
        if len(args) == 1 and isinstance(args[0], ast_expr_op_fdiv_q):
            self.ctx = args[0].ctx
            self.ptr = isl.isl_ast_expr_copy(args[0].ptr)
            return
        if len(args) == 1 and isinstance(args[0], ast_expr_op_pdiv_q):
            self.ctx = args[0].ctx
            self.ptr = isl.isl_ast_expr_copy(args[0].ptr)
            return
        if len(args) == 1 and isinstance(args[0], ast_expr_op_pdiv_r):
            self.ctx = args[0].ctx
            self.ptr = isl.isl_ast_expr_copy(args[0].ptr)
            return
        if len(args) == 1 and isinstance(args[0], ast_expr_op_zdiv_r):
            self.ctx = args[0].ctx
            self.ptr = isl.isl_ast_expr_copy(args[0].ptr)
            return
        if len(args) == 1 and isinstance(args[0], ast_expr_op_cond):
            self.ctx = args[0].ctx
            self.ptr = isl.isl_ast_expr_copy(args[0].ptr)
            return
        if len(args) == 1 and isinstance(args[0], ast_expr_op_select):
            self.ctx = args[0].ctx
            self.ptr = isl.isl_ast_expr_copy(args[0].ptr)
            return
        if len(args) == 1 and isinstance(args[0], ast_expr_op_eq):
            self.ctx = args[0].ctx
            self.ptr = isl.isl_ast_expr_copy(args[0].ptr)
            return
        if len(args) == 1 and isinstance(args[0], ast_expr_op_le):
            self.ctx = args[0].ctx
            self.ptr = isl.isl_ast_expr_copy(args[0].ptr)
            return
        if len(args) == 1 and isinstance(args[0], ast_expr_op_lt):
            self.ctx = args[0].ctx
            self.ptr = isl.isl_ast_expr_copy(args[0].ptr)
            return
        if len(args) == 1 and isinstance(args[0], ast_expr_op_ge):
            self.ctx = args[0].ctx
            self.ptr = isl.isl_ast_expr_copy(args[0].ptr)
            return
        if len(args) == 1 and isinstance(args[0], ast_expr_op_gt):
            self.ctx = args[0].ctx
            self.ptr = isl.isl_ast_expr_copy(args[0].ptr)
            return
        if len(args) == 1 and isinstance(args[0], ast_expr_op_call):
            self.ctx = args[0].ctx
            self.ptr = isl.isl_ast_expr_copy(args[0].ptr)
            return
        if len(args) == 1 and isinstance(args[0], ast_expr_op_access):
            self.ctx = args[0].ctx
            self.ptr = isl.isl_ast_expr_copy(args[0].ptr)
            return
        if len(args) == 1 and isinstance(args[0], ast_expr_op_member):
            self.ctx = args[0].ctx
            self.ptr = isl.isl_ast_expr_copy(args[0].ptr)
            return
        if len(args) == 1 and isinstance(args[0], ast_expr_op_address_of):
            self.ctx = args[0].ctx
            self.ptr = isl.isl_ast_expr_copy(args[0].ptr)
            return
        raise Error
    def __del__(self):
        if hasattr(self, 'ptr'):
            isl.isl_ast_expr_free(self.ptr)
    def __new__(cls, *args, **keywords):
        if "ptr" in keywords:
            type = isl.isl_ast_expr_op_get_type(keywords["ptr"])
            if type == 0:
                return ast_expr_op_and(**keywords)
            if type == 1:
                return ast_expr_op_and_then(**keywords)
            if type == 2:
                return ast_expr_op_or(**keywords)
            if type == 3:
                return ast_expr_op_or_else(**keywords)
            if type == 4:
                return ast_expr_op_max(**keywords)
            if type == 5:
                return ast_expr_op_min(**keywords)
            if type == 6:
                return ast_expr_op_minus(**keywords)
            if type == 7:
                return ast_expr_op_add(**keywords)
            if type == 8:
                return ast_expr_op_sub(**keywords)
            if type == 9:
                return ast_expr_op_mul(**keywords)
            if type == 10:
                return ast_expr_op_div(**keywords)
            if type == 11:
                return ast_expr_op_fdiv_q(**keywords)
            if type == 12:
                return ast_expr_op_pdiv_q(**keywords)
            if type == 13:
                return ast_expr_op_pdiv_r(**keywords)
            if type == 14:
                return ast_expr_op_zdiv_r(**keywords)
            if type == 15:
                return ast_expr_op_cond(**keywords)
            if type == 16:
                return ast_expr_op_select(**keywords)
            if type == 17:
                return ast_expr_op_eq(**keywords)
            if type == 18:
                return ast_expr_op_le(**keywords)
            if type == 19:
                return ast_expr_op_lt(**keywords)
            if type == 20:
                return ast_expr_op_ge(**keywords)
            if type == 21:
                return ast_expr_op_gt(**keywords)
            if type == 22:
                return ast_expr_op_call(**keywords)
            if type == 23:
                return ast_expr_op_access(**keywords)
            if type == 24:
                return ast_expr_op_member(**keywords)
            if type == 25:
                return ast_expr_op_address_of(**keywords)
            raise
        return super(ast_expr_op, cls).__new__(cls)
    def __str__(arg0):
        try:
            if not arg0.__class__ is ast_expr_op:
                arg0 = ast_expr_op(arg0)
        except:
            raise
        ptr = isl.isl_ast_expr_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.ast_expr_op("""%s""")' % s
        else:
            return 'isl.ast_expr_op("%s")' % s
    def arg(arg0, arg1):
        try:
            if not arg0.__class__ is ast_expr:
                arg0 = ast_expr(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_ast_expr_op_get_arg(arg0.ptr, arg1)
        obj = ast_expr(ctx=ctx, ptr=res)
        return obj
    def get_arg(arg0, arg1):
        return arg0.arg(arg1)
    def n_arg(arg0):
        try:
            if not arg0.__class__ is ast_expr:
                arg0 = ast_expr(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_ast_expr_op_get_n_arg(arg0.ptr)
        if res < 0:
            raise
        return int(res)
    def get_n_arg(arg0):
        return arg0.n_arg()

isl.isl_ast_expr_op_get_arg.restype = c_void_p
isl.isl_ast_expr_op_get_arg.argtypes = [c_void_p, c_int]
isl.isl_ast_expr_op_get_n_arg.argtypes = [c_void_p]
isl.isl_ast_expr_copy.restype = c_void_p
isl.isl_ast_expr_copy.argtypes = [c_void_p]
isl.isl_ast_expr_free.restype = c_void_p
isl.isl_ast_expr_free.argtypes = [c_void_p]
isl.isl_ast_expr_to_str.restype = POINTER(c_char)
isl.isl_ast_expr_to_str.argtypes = [c_void_p]
isl.isl_ast_expr_op_get_type.argtypes = [c_void_p]

class ast_expr_op_access(ast_expr_op):
    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_ast_expr_free(self.ptr)
    def __new__(cls, *args, **keywords):
        return super(ast_expr_op_access, cls).__new__(cls)
    def __str__(arg0):
        try:
            if not arg0.__class__ is ast_expr_op_access:
                arg0 = ast_expr_op_access(arg0)
        except:
            raise
        ptr = isl.isl_ast_expr_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.ast_expr_op_access("""%s""")' % s
        else:
            return 'isl.ast_expr_op_access("%s")' % s

isl.isl_ast_expr_copy.restype = c_void_p
isl.isl_ast_expr_copy.argtypes = [c_void_p]
isl.isl_ast_expr_free.restype = c_void_p
isl.isl_ast_expr_free.argtypes = [c_void_p]
isl.isl_ast_expr_to_str.restype = POINTER(c_char)
isl.isl_ast_expr_to_str.argtypes = [c_void_p]

class ast_expr_op_add(ast_expr_op):
    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_ast_expr_free(self.ptr)
    def __new__(cls, *args, **keywords):
        return super(ast_expr_op_add, cls).__new__(cls)
    def __str__(arg0):
        try:
            if not arg0.__class__ is ast_expr_op_add:
                arg0 = ast_expr_op_add(arg0)
        except:
            raise
        ptr = isl.isl_ast_expr_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.ast_expr_op_add("""%s""")' % s
        else:
            return 'isl.ast_expr_op_add("%s")' % s

isl.isl_ast_expr_copy.restype = c_void_p
isl.isl_ast_expr_copy.argtypes = [c_void_p]
isl.isl_ast_expr_free.restype = c_void_p
isl.isl_ast_expr_free.argtypes = [c_void_p]
isl.isl_ast_expr_to_str.restype = POINTER(c_char)
isl.isl_ast_expr_to_str.argtypes = [c_void_p]

class ast_expr_op_address_of(ast_expr_op):
    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_ast_expr_free(self.ptr)
    def __new__(cls, *args, **keywords):
        return super(ast_expr_op_address_of, cls).__new__(cls)
    def __str__(arg0):
        try:
            if not arg0.__class__ is ast_expr_op_address_of:
                arg0 = ast_expr_op_address_of(arg0)
        except:
            raise
        ptr = isl.isl_ast_expr_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.ast_expr_op_address_of("""%s""")' % s
        else:
            return 'isl.ast_expr_op_address_of("%s")' % s

isl.isl_ast_expr_copy.restype = c_void_p
isl.isl_ast_expr_copy.argtypes = [c_void_p]
isl.isl_ast_expr_free.restype = c_void_p
isl.isl_ast_expr_free.argtypes = [c_void_p]
isl.isl_ast_expr_to_str.restype = POINTER(c_char)
isl.isl_ast_expr_to_str.argtypes = [c_void_p]

class ast_expr_op_and(ast_expr_op):
    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_ast_expr_free(self.ptr)
    def __new__(cls, *args, **keywords):
        return super(ast_expr_op_and, cls).__new__(cls)
    def __str__(arg0):
        try:
            if not arg0.__class__ is ast_expr_op_and:
                arg0 = ast_expr_op_and(arg0)
        except:
            raise
        ptr = isl.isl_ast_expr_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.ast_expr_op_and("""%s""")' % s
        else:
            return 'isl.ast_expr_op_and("%s")' % s

isl.isl_ast_expr_copy.restype = c_void_p
isl.isl_ast_expr_copy.argtypes = [c_void_p]
isl.isl_ast_expr_free.restype = c_void_p
isl.isl_ast_expr_free.argtypes = [c_void_p]
isl.isl_ast_expr_to_str.restype = POINTER(c_char)
isl.isl_ast_expr_to_str.argtypes = [c_void_p]

class ast_expr_op_and_then(ast_expr_op):
    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_ast_expr_free(self.ptr)
    def __new__(cls, *args, **keywords):
        return super(ast_expr_op_and_then, cls).__new__(cls)
    def __str__(arg0):
        try:
            if not arg0.__class__ is ast_expr_op_and_then:
                arg0 = ast_expr_op_and_then(arg0)
        except:
            raise
        ptr = isl.isl_ast_expr_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.ast_expr_op_and_then("""%s""")' % s
        else:
            return 'isl.ast_expr_op_and_then("%s")' % s

isl.isl_ast_expr_copy.restype = c_void_p
isl.isl_ast_expr_copy.argtypes = [c_void_p]
isl.isl_ast_expr_free.restype = c_void_p
isl.isl_ast_expr_free.argtypes = [c_void_p]
isl.isl_ast_expr_to_str.restype = POINTER(c_char)
isl.isl_ast_expr_to_str.argtypes = [c_void_p]

class ast_expr_op_call(ast_expr_op):
    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_ast_expr_free(self.ptr)
    def __new__(cls, *args, **keywords):
        return super(ast_expr_op_call, cls).__new__(cls)
    def __str__(arg0):
        try:
            if not arg0.__class__ is ast_expr_op_call:
                arg0 = ast_expr_op_call(arg0)
        except:
            raise
        ptr = isl.isl_ast_expr_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.ast_expr_op_call("""%s""")' % s
        else:
            return 'isl.ast_expr_op_call("%s")' % s

isl.isl_ast_expr_copy.restype = c_void_p
isl.isl_ast_expr_copy.argtypes = [c_void_p]
isl.isl_ast_expr_free.restype = c_void_p
isl.isl_ast_expr_free.argtypes = [c_void_p]
isl.isl_ast_expr_to_str.restype = POINTER(c_char)
isl.isl_ast_expr_to_str.argtypes = [c_void_p]

class ast_expr_op_cond(ast_expr_op):
    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_ast_expr_free(self.ptr)
    def __new__(cls, *args, **keywords):
        return super(ast_expr_op_cond, cls).__new__(cls)
    def __str__(arg0):
        try:
            if not arg0.__class__ is ast_expr_op_cond:
                arg0 = ast_expr_op_cond(arg0)
        except:
            raise
        ptr = isl.isl_ast_expr_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.ast_expr_op_cond("""%s""")' % s
        else:
            return 'isl.ast_expr_op_cond("%s")' % s

isl.isl_ast_expr_copy.restype = c_void_p
isl.isl_ast_expr_copy.argtypes = [c_void_p]
isl.isl_ast_expr_free.restype = c_void_p
isl.isl_ast_expr_free.argtypes = [c_void_p]
isl.isl_ast_expr_to_str.restype = POINTER(c_char)
isl.isl_ast_expr_to_str.argtypes = [c_void_p]

class ast_expr_op_div(ast_expr_op):
    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_ast_expr_free(self.ptr)
    def __new__(cls, *args, **keywords):
        return super(ast_expr_op_div, cls).__new__(cls)
    def __str__(arg0):
        try:
            if not arg0.__class__ is ast_expr_op_div:
                arg0 = ast_expr_op_div(arg0)
        except:
            raise
        ptr = isl.isl_ast_expr_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.ast_expr_op_div("""%s""")' % s
        else:
            return 'isl.ast_expr_op_div("%s")' % s

isl.isl_ast_expr_copy.restype = c_void_p
isl.isl_ast_expr_copy.argtypes = [c_void_p]
isl.isl_ast_expr_free.restype = c_void_p
isl.isl_ast_expr_free.argtypes = [c_void_p]
isl.isl_ast_expr_to_str.restype = POINTER(c_char)
isl.isl_ast_expr_to_str.argtypes = [c_void_p]

class ast_expr_op_eq(ast_expr_op):
    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_ast_expr_free(self.ptr)
    def __new__(cls, *args, **keywords):
        return super(ast_expr_op_eq, cls).__new__(cls)
    def __str__(arg0):
        try:
            if not arg0.__class__ is ast_expr_op_eq:
                arg0 = ast_expr_op_eq(arg0)
        except:
            raise
        ptr = isl.isl_ast_expr_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.ast_expr_op_eq("""%s""")' % s
        else:
            return 'isl.ast_expr_op_eq("%s")' % s

isl.isl_ast_expr_copy.restype = c_void_p
isl.isl_ast_expr_copy.argtypes = [c_void_p]
isl.isl_ast_expr_free.restype = c_void_p
isl.isl_ast_expr_free.argtypes = [c_void_p]
isl.isl_ast_expr_to_str.restype = POINTER(c_char)
isl.isl_ast_expr_to_str.argtypes = [c_void_p]

class ast_expr_op_fdiv_q(ast_expr_op):
    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_ast_expr_free(self.ptr)
    def __new__(cls, *args, **keywords):
        return super(ast_expr_op_fdiv_q, cls).__new__(cls)
    def __str__(arg0):
        try:
            if not arg0.__class__ is ast_expr_op_fdiv_q:
                arg0 = ast_expr_op_fdiv_q(arg0)
        except:
            raise
        ptr = isl.isl_ast_expr_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.ast_expr_op_fdiv_q("""%s""")' % s
        else:
            return 'isl.ast_expr_op_fdiv_q("%s")' % s

isl.isl_ast_expr_copy.restype = c_void_p
isl.isl_ast_expr_copy.argtypes = [c_void_p]
isl.isl_ast_expr_free.restype = c_void_p
isl.isl_ast_expr_free.argtypes = [c_void_p]
isl.isl_ast_expr_to_str.restype = POINTER(c_char)
isl.isl_ast_expr_to_str.argtypes = [c_void_p]

class ast_expr_op_ge(ast_expr_op):
    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_ast_expr_free(self.ptr)
    def __new__(cls, *args, **keywords):
        return super(ast_expr_op_ge, cls).__new__(cls)
    def __str__(arg0):
        try:
            if not arg0.__class__ is ast_expr_op_ge:
                arg0 = ast_expr_op_ge(arg0)
        except:
            raise
        ptr = isl.isl_ast_expr_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.ast_expr_op_ge("""%s""")' % s
        else:
            return 'isl.ast_expr_op_ge("%s")' % s

isl.isl_ast_expr_copy.restype = c_void_p
isl.isl_ast_expr_copy.argtypes = [c_void_p]
isl.isl_ast_expr_free.restype = c_void_p
isl.isl_ast_expr_free.argtypes = [c_void_p]
isl.isl_ast_expr_to_str.restype = POINTER(c_char)
isl.isl_ast_expr_to_str.argtypes = [c_void_p]

class ast_expr_op_gt(ast_expr_op):
    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_ast_expr_free(self.ptr)
    def __new__(cls, *args, **keywords):
        return super(ast_expr_op_gt, cls).__new__(cls)
    def __str__(arg0):
        try:
            if not arg0.__class__ is ast_expr_op_gt:
                arg0 = ast_expr_op_gt(arg0)
        except:
            raise
        ptr = isl.isl_ast_expr_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.ast_expr_op_gt("""%s""")' % s
        else:
            return 'isl.ast_expr_op_gt("%s")' % s

isl.isl_ast_expr_copy.restype = c_void_p
isl.isl_ast_expr_copy.argtypes = [c_void_p]
isl.isl_ast_expr_free.restype = c_void_p
isl.isl_ast_expr_free.argtypes = [c_void_p]
isl.isl_ast_expr_to_str.restype = POINTER(c_char)
isl.isl_ast_expr_to_str.argtypes = [c_void_p]

class ast_expr_op_le(ast_expr_op):
    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_ast_expr_free(self.ptr)
    def __new__(cls, *args, **keywords):
        return super(ast_expr_op_le, cls).__new__(cls)
    def __str__(arg0):
        try:
            if not arg0.__class__ is ast_expr_op_le:
                arg0 = ast_expr_op_le(arg0)
        except:
            raise
        ptr = isl.isl_ast_expr_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.ast_expr_op_le("""%s""")' % s
        else:
            return 'isl.ast_expr_op_le("%s")' % s

isl.isl_ast_expr_copy.restype = c_void_p
isl.isl_ast_expr_copy.argtypes = [c_void_p]
isl.isl_ast_expr_free.restype = c_void_p
isl.isl_ast_expr_free.argtypes = [c_void_p]
isl.isl_ast_expr_to_str.restype = POINTER(c_char)
isl.isl_ast_expr_to_str.argtypes = [c_void_p]

class ast_expr_op_lt(ast_expr_op):
    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_ast_expr_free(self.ptr)
    def __new__(cls, *args, **keywords):
        return super(ast_expr_op_lt, cls).__new__(cls)
    def __str__(arg0):
        try:
            if not arg0.__class__ is ast_expr_op_lt:
                arg0 = ast_expr_op_lt(arg0)
        except:
            raise
        ptr = isl.isl_ast_expr_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.ast_expr_op_lt("""%s""")' % s
        else:
            return 'isl.ast_expr_op_lt("%s")' % s

isl.isl_ast_expr_copy.restype = c_void_p
isl.isl_ast_expr_copy.argtypes = [c_void_p]
isl.isl_ast_expr_free.restype = c_void_p
isl.isl_ast_expr_free.argtypes = [c_void_p]
isl.isl_ast_expr_to_str.restype = POINTER(c_char)
isl.isl_ast_expr_to_str.argtypes = [c_void_p]

class ast_expr_op_max(ast_expr_op):
    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_ast_expr_free(self.ptr)
    def __new__(cls, *args, **keywords):
        return super(ast_expr_op_max, cls).__new__(cls)
    def __str__(arg0):
        try:
            if not arg0.__class__ is ast_expr_op_max:
                arg0 = ast_expr_op_max(arg0)
        except:
            raise
        ptr = isl.isl_ast_expr_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.ast_expr_op_max("""%s""")' % s
        else:
            return 'isl.ast_expr_op_max("%s")' % s

isl.isl_ast_expr_copy.restype = c_void_p
isl.isl_ast_expr_copy.argtypes = [c_void_p]
isl.isl_ast_expr_free.restype = c_void_p
isl.isl_ast_expr_free.argtypes = [c_void_p]
isl.isl_ast_expr_to_str.restype = POINTER(c_char)
isl.isl_ast_expr_to_str.argtypes = [c_void_p]

class ast_expr_op_member(ast_expr_op):
    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_ast_expr_free(self.ptr)
    def __new__(cls, *args, **keywords):
        return super(ast_expr_op_member, cls).__new__(cls)
    def __str__(arg0):
        try:
            if not arg0.__class__ is ast_expr_op_member:
                arg0 = ast_expr_op_member(arg0)
        except:
            raise
        ptr = isl.isl_ast_expr_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.ast_expr_op_member("""%s""")' % s
        else:
            return 'isl.ast_expr_op_member("%s")' % s

isl.isl_ast_expr_copy.restype = c_void_p
isl.isl_ast_expr_copy.argtypes = [c_void_p]
isl.isl_ast_expr_free.restype = c_void_p
isl.isl_ast_expr_free.argtypes = [c_void_p]
isl.isl_ast_expr_to_str.restype = POINTER(c_char)
isl.isl_ast_expr_to_str.argtypes = [c_void_p]

class ast_expr_op_min(ast_expr_op):
    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_ast_expr_free(self.ptr)
    def __new__(cls, *args, **keywords):
        return super(ast_expr_op_min, cls).__new__(cls)
    def __str__(arg0):
        try:
            if not arg0.__class__ is ast_expr_op_min:
                arg0 = ast_expr_op_min(arg0)
        except:
            raise
        ptr = isl.isl_ast_expr_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.ast_expr_op_min("""%s""")' % s
        else:
            return 'isl.ast_expr_op_min("%s")' % s

isl.isl_ast_expr_copy.restype = c_void_p
isl.isl_ast_expr_copy.argtypes = [c_void_p]
isl.isl_ast_expr_free.restype = c_void_p
isl.isl_ast_expr_free.argtypes = [c_void_p]
isl.isl_ast_expr_to_str.restype = POINTER(c_char)
isl.isl_ast_expr_to_str.argtypes = [c_void_p]

class ast_expr_op_minus(ast_expr_op):
    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_ast_expr_free(self.ptr)
    def __new__(cls, *args, **keywords):
        return super(ast_expr_op_minus, cls).__new__(cls)
    def __str__(arg0):
        try:
            if not arg0.__class__ is ast_expr_op_minus:
                arg0 = ast_expr_op_minus(arg0)
        except:
            raise
        ptr = isl.isl_ast_expr_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.ast_expr_op_minus("""%s""")' % s
        else:
            return 'isl.ast_expr_op_minus("%s")' % s

isl.isl_ast_expr_copy.restype = c_void_p
isl.isl_ast_expr_copy.argtypes = [c_void_p]
isl.isl_ast_expr_free.restype = c_void_p
isl.isl_ast_expr_free.argtypes = [c_void_p]
isl.isl_ast_expr_to_str.restype = POINTER(c_char)
isl.isl_ast_expr_to_str.argtypes = [c_void_p]

class ast_expr_op_mul(ast_expr_op):
    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_ast_expr_free(self.ptr)
    def __new__(cls, *args, **keywords):
        return super(ast_expr_op_mul, cls).__new__(cls)
    def __str__(arg0):
        try:
            if not arg0.__class__ is ast_expr_op_mul:
                arg0 = ast_expr_op_mul(arg0)
        except:
            raise
        ptr = isl.isl_ast_expr_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.ast_expr_op_mul("""%s""")' % s
        else:
            return 'isl.ast_expr_op_mul("%s")' % s

isl.isl_ast_expr_copy.restype = c_void_p
isl.isl_ast_expr_copy.argtypes = [c_void_p]
isl.isl_ast_expr_free.restype = c_void_p
isl.isl_ast_expr_free.argtypes = [c_void_p]
isl.isl_ast_expr_to_str.restype = POINTER(c_char)
isl.isl_ast_expr_to_str.argtypes = [c_void_p]

class ast_expr_op_or(ast_expr_op):
    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_ast_expr_free(self.ptr)
    def __new__(cls, *args, **keywords):
        return super(ast_expr_op_or, cls).__new__(cls)
    def __str__(arg0):
        try:
            if not arg0.__class__ is ast_expr_op_or:
                arg0 = ast_expr_op_or(arg0)
        except:
            raise
        ptr = isl.isl_ast_expr_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.ast_expr_op_or("""%s""")' % s
        else:
            return 'isl.ast_expr_op_or("%s")' % s

isl.isl_ast_expr_copy.restype = c_void_p
isl.isl_ast_expr_copy.argtypes = [c_void_p]
isl.isl_ast_expr_free.restype = c_void_p
isl.isl_ast_expr_free.argtypes = [c_void_p]
isl.isl_ast_expr_to_str.restype = POINTER(c_char)
isl.isl_ast_expr_to_str.argtypes = [c_void_p]

class ast_expr_op_or_else(ast_expr_op):
    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_ast_expr_free(self.ptr)
    def __new__(cls, *args, **keywords):
        return super(ast_expr_op_or_else, cls).__new__(cls)
    def __str__(arg0):
        try:
            if not arg0.__class__ is ast_expr_op_or_else:
                arg0 = ast_expr_op_or_else(arg0)
        except:
            raise
        ptr = isl.isl_ast_expr_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.ast_expr_op_or_else("""%s""")' % s
        else:
            return 'isl.ast_expr_op_or_else("%s")' % s

isl.isl_ast_expr_copy.restype = c_void_p
isl.isl_ast_expr_copy.argtypes = [c_void_p]
isl.isl_ast_expr_free.restype = c_void_p
isl.isl_ast_expr_free.argtypes = [c_void_p]
isl.isl_ast_expr_to_str.restype = POINTER(c_char)
isl.isl_ast_expr_to_str.argtypes = [c_void_p]

class ast_expr_op_pdiv_q(ast_expr_op):
    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_ast_expr_free(self.ptr)
    def __new__(cls, *args, **keywords):
        return super(ast_expr_op_pdiv_q, cls).__new__(cls)
    def __str__(arg0):
        try:
            if not arg0.__class__ is ast_expr_op_pdiv_q:
                arg0 = ast_expr_op_pdiv_q(arg0)
        except:
            raise
        ptr = isl.isl_ast_expr_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.ast_expr_op_pdiv_q("""%s""")' % s
        else:
            return 'isl.ast_expr_op_pdiv_q("%s")' % s

isl.isl_ast_expr_copy.restype = c_void_p
isl.isl_ast_expr_copy.argtypes = [c_void_p]
isl.isl_ast_expr_free.restype = c_void_p
isl.isl_ast_expr_free.argtypes = [c_void_p]
isl.isl_ast_expr_to_str.restype = POINTER(c_char)
isl.isl_ast_expr_to_str.argtypes = [c_void_p]

class ast_expr_op_pdiv_r(ast_expr_op):
    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_ast_expr_free(self.ptr)
    def __new__(cls, *args, **keywords):
        return super(ast_expr_op_pdiv_r, cls).__new__(cls)
    def __str__(arg0):
        try:
            if not arg0.__class__ is ast_expr_op_pdiv_r:
                arg0 = ast_expr_op_pdiv_r(arg0)
        except:
            raise
        ptr = isl.isl_ast_expr_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.ast_expr_op_pdiv_r("""%s""")' % s
        else:
            return 'isl.ast_expr_op_pdiv_r("%s")' % s

isl.isl_ast_expr_copy.restype = c_void_p
isl.isl_ast_expr_copy.argtypes = [c_void_p]
isl.isl_ast_expr_free.restype = c_void_p
isl.isl_ast_expr_free.argtypes = [c_void_p]
isl.isl_ast_expr_to_str.restype = POINTER(c_char)
isl.isl_ast_expr_to_str.argtypes = [c_void_p]

class ast_expr_op_select(ast_expr_op):
    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_ast_expr_free(self.ptr)
    def __new__(cls, *args, **keywords):
        return super(ast_expr_op_select, cls).__new__(cls)
    def __str__(arg0):
        try:
            if not arg0.__class__ is ast_expr_op_select:
                arg0 = ast_expr_op_select(arg0)
        except:
            raise
        ptr = isl.isl_ast_expr_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.ast_expr_op_select("""%s""")' % s
        else:
            return 'isl.ast_expr_op_select("%s")' % s

isl.isl_ast_expr_copy.restype = c_void_p
isl.isl_ast_expr_copy.argtypes = [c_void_p]
isl.isl_ast_expr_free.restype = c_void_p
isl.isl_ast_expr_free.argtypes = [c_void_p]
isl.isl_ast_expr_to_str.restype = POINTER(c_char)
isl.isl_ast_expr_to_str.argtypes = [c_void_p]

class ast_expr_op_sub(ast_expr_op):
    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_ast_expr_free(self.ptr)
    def __new__(cls, *args, **keywords):
        return super(ast_expr_op_sub, cls).__new__(cls)
    def __str__(arg0):
        try:
            if not arg0.__class__ is ast_expr_op_sub:
                arg0 = ast_expr_op_sub(arg0)
        except:
            raise
        ptr = isl.isl_ast_expr_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.ast_expr_op_sub("""%s""")' % s
        else:
            return 'isl.ast_expr_op_sub("%s")' % s

isl.isl_ast_expr_copy.restype = c_void_p
isl.isl_ast_expr_copy.argtypes = [c_void_p]
isl.isl_ast_expr_free.restype = c_void_p
isl.isl_ast_expr_free.argtypes = [c_void_p]
isl.isl_ast_expr_to_str.restype = POINTER(c_char)
isl.isl_ast_expr_to_str.argtypes = [c_void_p]

class ast_expr_op_zdiv_r(ast_expr_op):
    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_ast_expr_free(self.ptr)
    def __new__(cls, *args, **keywords):
        return super(ast_expr_op_zdiv_r, cls).__new__(cls)
    def __str__(arg0):
        try:
            if not arg0.__class__ is ast_expr_op_zdiv_r:
                arg0 = ast_expr_op_zdiv_r(arg0)
        except:
            raise
        ptr = isl.isl_ast_expr_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.ast_expr_op_zdiv_r("""%s""")' % s
        else:
            return 'isl.ast_expr_op_zdiv_r("%s")' % s

isl.isl_ast_expr_copy.restype = c_void_p
isl.isl_ast_expr_copy.argtypes = [c_void_p]
isl.isl_ast_expr_free.restype = c_void_p
isl.isl_ast_expr_free.argtypes = [c_void_p]
isl.isl_ast_expr_to_str.restype = POINTER(c_char)
isl.isl_ast_expr_to_str.argtypes = [c_void_p]

class ast_node(object):
    def __init__(self, *args, **keywords):
        if "ptr" in keywords:
            self.ctx = keywords["ctx"]
            self.ptr = keywords["ptr"]
            return
        if len(args) == 1 and isinstance(args[0], ast_node_for):
            self.ctx = args[0].ctx
            self.ptr = isl.isl_ast_node_copy(args[0].ptr)
            return
        if len(args) == 1 and isinstance(args[0], ast_node_if):
            self.ctx = args[0].ctx
            self.ptr = isl.isl_ast_node_copy(args[0].ptr)
            return
        if len(args) == 1 and isinstance(args[0], ast_node_block):
            self.ctx = args[0].ctx
            self.ptr = isl.isl_ast_node_copy(args[0].ptr)
            return
        if len(args) == 1 and isinstance(args[0], ast_node_mark):
            self.ctx = args[0].ctx
            self.ptr = isl.isl_ast_node_copy(args[0].ptr)
            return
        if len(args) == 1 and isinstance(args[0], ast_node_user):
            self.ctx = args[0].ctx
            self.ptr = isl.isl_ast_node_copy(args[0].ptr)
            return
        raise Error
    def __del__(self):
        if hasattr(self, 'ptr'):
            isl.isl_ast_node_free(self.ptr)
    def __new__(cls, *args, **keywords):
        if "ptr" in keywords:
            type = isl.isl_ast_node_get_type(keywords["ptr"])
            if type == 1:
                return ast_node_for(**keywords)
            if type == 2:
                return ast_node_if(**keywords)
            if type == 3:
                return ast_node_block(**keywords)
            if type == 4:
                return ast_node_mark(**keywords)
            if type == 5:
                return ast_node_user(**keywords)
            raise
        return super(ast_node, cls).__new__(cls)
    def __str__(arg0):
        try:
            if not arg0.__class__ is ast_node:
                arg0 = ast_node(arg0)
        except:
            raise
        ptr = isl.isl_ast_node_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.ast_node("""%s""")' % s
        else:
            return 'isl.ast_node("%s")' % s
    def to_C_str(arg0):
        try:
            if not arg0.__class__ is ast_node:
                arg0 = ast_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_ast_node_to_C_str(arg0.ptr)
        if res == 0:
            raise
        string = cast(res, c_char_p).value.decode('ascii')
        libc.free(res)
        return string
    def to_list(arg0):
        try:
            if not arg0.__class__ is ast_node:
                arg0 = ast_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_ast_node_to_list(isl.isl_ast_node_copy(arg0.ptr))
        obj = ast_node_list(ctx=ctx, ptr=res)
        return obj

isl.isl_ast_node_to_C_str.restype = POINTER(c_char)
isl.isl_ast_node_to_C_str.argtypes = [c_void_p]
isl.isl_ast_node_to_list.restype = c_void_p
isl.isl_ast_node_to_list.argtypes = [c_void_p]
isl.isl_ast_node_copy.restype = c_void_p
isl.isl_ast_node_copy.argtypes = [c_void_p]
isl.isl_ast_node_free.restype = c_void_p
isl.isl_ast_node_free.argtypes = [c_void_p]
isl.isl_ast_node_to_str.restype = POINTER(c_char)
isl.isl_ast_node_to_str.argtypes = [c_void_p]
isl.isl_ast_node_get_type.argtypes = [c_void_p]

class ast_node_block(ast_node):
    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_ast_node_free(self.ptr)
    def __new__(cls, *args, **keywords):
        return super(ast_node_block, cls).__new__(cls)
    def __str__(arg0):
        try:
            if not arg0.__class__ is ast_node_block:
                arg0 = ast_node_block(arg0)
        except:
            raise
        ptr = isl.isl_ast_node_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.ast_node_block("""%s""")' % s
        else:
            return 'isl.ast_node_block("%s")' % s
    def children(arg0):
        try:
            if not arg0.__class__ is ast_node:
                arg0 = ast_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_ast_node_block_get_children(arg0.ptr)
        obj = ast_node_list(ctx=ctx, ptr=res)
        return obj
    def get_children(arg0):
        return arg0.children()

isl.isl_ast_node_block_get_children.restype = c_void_p
isl.isl_ast_node_block_get_children.argtypes = [c_void_p]
isl.isl_ast_node_copy.restype = c_void_p
isl.isl_ast_node_copy.argtypes = [c_void_p]
isl.isl_ast_node_free.restype = c_void_p
isl.isl_ast_node_free.argtypes = [c_void_p]
isl.isl_ast_node_to_str.restype = POINTER(c_char)
isl.isl_ast_node_to_str.argtypes = [c_void_p]

class ast_node_for(ast_node):
    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_ast_node_free(self.ptr)
    def __new__(cls, *args, **keywords):
        return super(ast_node_for, cls).__new__(cls)
    def __str__(arg0):
        try:
            if not arg0.__class__ is ast_node_for:
                arg0 = ast_node_for(arg0)
        except:
            raise
        ptr = isl.isl_ast_node_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.ast_node_for("""%s""")' % s
        else:
            return 'isl.ast_node_for("%s")' % s
    def body(arg0):
        try:
            if not arg0.__class__ is ast_node:
                arg0 = ast_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_ast_node_for_get_body(arg0.ptr)
        obj = ast_node(ctx=ctx, ptr=res)
        return obj
    def get_body(arg0):
        return arg0.body()
    def cond(arg0):
        try:
            if not arg0.__class__ is ast_node:
                arg0 = ast_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_ast_node_for_get_cond(arg0.ptr)
        obj = ast_expr(ctx=ctx, ptr=res)
        return obj
    def get_cond(arg0):
        return arg0.cond()
    def inc(arg0):
        try:
            if not arg0.__class__ is ast_node:
                arg0 = ast_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_ast_node_for_get_inc(arg0.ptr)
        obj = ast_expr(ctx=ctx, ptr=res)
        return obj
    def get_inc(arg0):
        return arg0.inc()
    def init(arg0):
        try:
            if not arg0.__class__ is ast_node:
                arg0 = ast_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_ast_node_for_get_init(arg0.ptr)
        obj = ast_expr(ctx=ctx, ptr=res)
        return obj
    def get_init(arg0):
        return arg0.init()
    def is_degenerate(arg0):
        try:
            if not arg0.__class__ is ast_node:
                arg0 = ast_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_ast_node_for_is_degenerate(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def iterator(arg0):
        try:
            if not arg0.__class__ is ast_node:
                arg0 = ast_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_ast_node_for_get_iterator(arg0.ptr)
        obj = ast_expr(ctx=ctx, ptr=res)
        return obj
    def get_iterator(arg0):
        return arg0.iterator()

isl.isl_ast_node_for_get_body.restype = c_void_p
isl.isl_ast_node_for_get_body.argtypes = [c_void_p]
isl.isl_ast_node_for_get_cond.restype = c_void_p
isl.isl_ast_node_for_get_cond.argtypes = [c_void_p]
isl.isl_ast_node_for_get_inc.restype = c_void_p
isl.isl_ast_node_for_get_inc.argtypes = [c_void_p]
isl.isl_ast_node_for_get_init.restype = c_void_p
isl.isl_ast_node_for_get_init.argtypes = [c_void_p]
isl.isl_ast_node_for_is_degenerate.argtypes = [c_void_p]
isl.isl_ast_node_for_get_iterator.restype = c_void_p
isl.isl_ast_node_for_get_iterator.argtypes = [c_void_p]
isl.isl_ast_node_copy.restype = c_void_p
isl.isl_ast_node_copy.argtypes = [c_void_p]
isl.isl_ast_node_free.restype = c_void_p
isl.isl_ast_node_free.argtypes = [c_void_p]
isl.isl_ast_node_to_str.restype = POINTER(c_char)
isl.isl_ast_node_to_str.argtypes = [c_void_p]

class ast_node_if(ast_node):
    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_ast_node_free(self.ptr)
    def __new__(cls, *args, **keywords):
        return super(ast_node_if, cls).__new__(cls)
    def __str__(arg0):
        try:
            if not arg0.__class__ is ast_node_if:
                arg0 = ast_node_if(arg0)
        except:
            raise
        ptr = isl.isl_ast_node_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.ast_node_if("""%s""")' % s
        else:
            return 'isl.ast_node_if("%s")' % s
    def cond(arg0):
        try:
            if not arg0.__class__ is ast_node:
                arg0 = ast_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_ast_node_if_get_cond(arg0.ptr)
        obj = ast_expr(ctx=ctx, ptr=res)
        return obj
    def get_cond(arg0):
        return arg0.cond()
    def else_node(arg0):
        try:
            if not arg0.__class__ is ast_node:
                arg0 = ast_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_ast_node_if_get_else_node(arg0.ptr)
        obj = ast_node(ctx=ctx, ptr=res)
        return obj
    def get_else_node(arg0):
        return arg0.else_node()
    def has_else_node(arg0):
        try:
            if not arg0.__class__ is ast_node:
                arg0 = ast_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_ast_node_if_has_else_node(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def then_node(arg0):
        try:
            if not arg0.__class__ is ast_node:
                arg0 = ast_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_ast_node_if_get_then_node(arg0.ptr)
        obj = ast_node(ctx=ctx, ptr=res)
        return obj
    def get_then_node(arg0):
        return arg0.then_node()

isl.isl_ast_node_if_get_cond.restype = c_void_p
isl.isl_ast_node_if_get_cond.argtypes = [c_void_p]
isl.isl_ast_node_if_get_else_node.restype = c_void_p
isl.isl_ast_node_if_get_else_node.argtypes = [c_void_p]
isl.isl_ast_node_if_has_else_node.argtypes = [c_void_p]
isl.isl_ast_node_if_get_then_node.restype = c_void_p
isl.isl_ast_node_if_get_then_node.argtypes = [c_void_p]
isl.isl_ast_node_copy.restype = c_void_p
isl.isl_ast_node_copy.argtypes = [c_void_p]
isl.isl_ast_node_free.restype = c_void_p
isl.isl_ast_node_free.argtypes = [c_void_p]
isl.isl_ast_node_to_str.restype = POINTER(c_char)
isl.isl_ast_node_to_str.argtypes = [c_void_p]

class ast_node_list(object):
    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]) == int:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_ast_node_list_alloc(self.ctx, args[0])
            return
        if len(args) == 1 and args[0].__class__ is ast_node:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_ast_node_list_from_ast_node(isl.isl_ast_node_copy(args[0].ptr))
            return
        raise Error
    def __del__(self):
        if hasattr(self, 'ptr'):
            isl.isl_ast_node_list_free(self.ptr)
    def __str__(arg0):
        try:
            if not arg0.__class__ is ast_node_list:
                arg0 = ast_node_list(arg0)
        except:
            raise
        ptr = isl.isl_ast_node_list_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.ast_node_list("""%s""")' % s
        else:
            return 'isl.ast_node_list("%s")' % s
    def add(arg0, arg1):
        try:
            if not arg0.__class__ is ast_node_list:
                arg0 = ast_node_list(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is ast_node:
                arg1 = ast_node(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_ast_node_list_add(isl.isl_ast_node_list_copy(arg0.ptr), isl.isl_ast_node_copy(arg1.ptr))
        obj = ast_node_list(ctx=ctx, ptr=res)
        return obj
    def at(arg0, arg1):
        try:
            if not arg0.__class__ is ast_node_list:
                arg0 = ast_node_list(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_ast_node_list_get_at(arg0.ptr, arg1)
        obj = ast_node(ctx=ctx, ptr=res)
        return obj
    def get_at(arg0, arg1):
        return arg0.at(arg1)
    def clear(arg0):
        try:
            if not arg0.__class__ is ast_node_list:
                arg0 = ast_node_list(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_ast_node_list_clear(isl.isl_ast_node_list_copy(arg0.ptr))
        obj = ast_node_list(ctx=ctx, ptr=res)
        return obj
    def concat(arg0, arg1):
        try:
            if not arg0.__class__ is ast_node_list:
                arg0 = ast_node_list(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is ast_node_list:
                arg1 = ast_node_list(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_ast_node_list_concat(isl.isl_ast_node_list_copy(arg0.ptr), isl.isl_ast_node_list_copy(arg1.ptr))
        obj = ast_node_list(ctx=ctx, ptr=res)
        return obj
    def drop(arg0, arg1, arg2):
        try:
            if not arg0.__class__ is ast_node_list:
                arg0 = ast_node_list(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_ast_node_list_drop(isl.isl_ast_node_list_copy(arg0.ptr), arg1, arg2)
        obj = ast_node_list(ctx=ctx, ptr=res)
        return obj
    def foreach(arg0, arg1):
        try:
            if not arg0.__class__ is ast_node_list:
                arg0 = ast_node_list(arg0)
        except:
            raise
        exc_info = [None]
        fn = CFUNCTYPE(c_int, c_void_p, c_void_p)
        def cb_func(cb_arg0, cb_arg1):
            cb_arg0 = ast_node(ctx=arg0.ctx, ptr=(cb_arg0))
            try:
                arg1(cb_arg0)
            except BaseException as e:
                exc_info[0] = e
                return -1
            return 0
        cb = fn(cb_func)
        ctx = arg0.ctx
        res = isl.isl_ast_node_list_foreach(arg0.ptr, cb, None)
        if exc_info[0] is not None:
            raise exc_info[0]
        if res < 0:
            raise
    def insert(arg0, arg1, arg2):
        try:
            if not arg0.__class__ is ast_node_list:
                arg0 = ast_node_list(arg0)
        except:
            raise
        try:
            if not arg2.__class__ is ast_node:
                arg2 = ast_node(arg2)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_ast_node_list_insert(isl.isl_ast_node_list_copy(arg0.ptr), arg1, isl.isl_ast_node_copy(arg2.ptr))
        obj = ast_node_list(ctx=ctx, ptr=res)
        return obj
    def size(arg0):
        try:
            if not arg0.__class__ is ast_node_list:
                arg0 = ast_node_list(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_ast_node_list_size(arg0.ptr)
        if res < 0:
            raise
        return int(res)

isl.isl_ast_node_list_alloc.restype = c_void_p
isl.isl_ast_node_list_alloc.argtypes = [Context, c_int]
isl.isl_ast_node_list_from_ast_node.restype = c_void_p
isl.isl_ast_node_list_from_ast_node.argtypes = [c_void_p]
isl.isl_ast_node_list_add.restype = c_void_p
isl.isl_ast_node_list_add.argtypes = [c_void_p, c_void_p]
isl.isl_ast_node_list_get_at.restype = c_void_p
isl.isl_ast_node_list_get_at.argtypes = [c_void_p, c_int]
isl.isl_ast_node_list_clear.restype = c_void_p
isl.isl_ast_node_list_clear.argtypes = [c_void_p]
isl.isl_ast_node_list_concat.restype = c_void_p
isl.isl_ast_node_list_concat.argtypes = [c_void_p, c_void_p]
isl.isl_ast_node_list_drop.restype = c_void_p
isl.isl_ast_node_list_drop.argtypes = [c_void_p, c_int, c_int]
isl.isl_ast_node_list_foreach.argtypes = [c_void_p, c_void_p, c_void_p]
isl.isl_ast_node_list_insert.restype = c_void_p
isl.isl_ast_node_list_insert.argtypes = [c_void_p, c_int, c_void_p]
isl.isl_ast_node_list_size.argtypes = [c_void_p]
isl.isl_ast_node_list_copy.restype = c_void_p
isl.isl_ast_node_list_copy.argtypes = [c_void_p]
isl.isl_ast_node_list_free.restype = c_void_p
isl.isl_ast_node_list_free.argtypes = [c_void_p]
isl.isl_ast_node_list_to_str.restype = POINTER(c_char)
isl.isl_ast_node_list_to_str.argtypes = [c_void_p]

class ast_node_mark(ast_node):
    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_ast_node_free(self.ptr)
    def __new__(cls, *args, **keywords):
        return super(ast_node_mark, cls).__new__(cls)
    def __str__(arg0):
        try:
            if not arg0.__class__ is ast_node_mark:
                arg0 = ast_node_mark(arg0)
        except:
            raise
        ptr = isl.isl_ast_node_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.ast_node_mark("""%s""")' % s
        else:
            return 'isl.ast_node_mark("%s")' % s
    def id(arg0):
        try:
            if not arg0.__class__ is ast_node:
                arg0 = ast_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_ast_node_mark_get_id(arg0.ptr)
        obj = id(ctx=ctx, ptr=res)
        return obj
    def get_id(arg0):
        return arg0.id()
    def node(arg0):
        try:
            if not arg0.__class__ is ast_node:
                arg0 = ast_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_ast_node_mark_get_node(arg0.ptr)
        obj = ast_node(ctx=ctx, ptr=res)
        return obj
    def get_node(arg0):
        return arg0.node()

isl.isl_ast_node_mark_get_id.restype = c_void_p
isl.isl_ast_node_mark_get_id.argtypes = [c_void_p]
isl.isl_ast_node_mark_get_node.restype = c_void_p
isl.isl_ast_node_mark_get_node.argtypes = [c_void_p]
isl.isl_ast_node_copy.restype = c_void_p
isl.isl_ast_node_copy.argtypes = [c_void_p]
isl.isl_ast_node_free.restype = c_void_p
isl.isl_ast_node_free.argtypes = [c_void_p]
isl.isl_ast_node_to_str.restype = POINTER(c_char)
isl.isl_ast_node_to_str.argtypes = [c_void_p]

class ast_node_user(ast_node):
    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_ast_node_free(self.ptr)
    def __new__(cls, *args, **keywords):
        return super(ast_node_user, cls).__new__(cls)
    def __str__(arg0):
        try:
            if not arg0.__class__ is ast_node_user:
                arg0 = ast_node_user(arg0)
        except:
            raise
        ptr = isl.isl_ast_node_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.ast_node_user("""%s""")' % s
        else:
            return 'isl.ast_node_user("%s")' % s
    def expr(arg0):
        try:
            if not arg0.__class__ is ast_node:
                arg0 = ast_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_ast_node_user_get_expr(arg0.ptr)
        obj = ast_expr(ctx=ctx, ptr=res)
        return obj
    def get_expr(arg0):
        return arg0.expr()

isl.isl_ast_node_user_get_expr.restype = c_void_p
isl.isl_ast_node_user_get_expr.argtypes = [c_void_p]
isl.isl_ast_node_copy.restype = c_void_p
isl.isl_ast_node_copy.argtypes = [c_void_p]
isl.isl_ast_node_free.restype = c_void_p
isl.isl_ast_node_free.argtypes = [c_void_p]
isl.isl_ast_node_to_str.restype = POINTER(c_char)
isl.isl_ast_node_to_str.argtypes = [c_void_p]

class union_map(object):
    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 basic_map:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_union_map_from_basic_map(isl.isl_basic_map_copy(args[0].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].encode('ascii'))
            return
        raise Error
    def __del__(self):
        if hasattr(self, 'ptr'):
            isl.isl_union_map_free(self.ptr)
    def __str__(arg0):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        ptr = isl.isl_union_map_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.union_map("""%s""")' % s
        else:
            return 'isl.union_map("%s")' % s
    def affine_hull(arg0):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_affine_hull(isl.isl_union_map_copy(arg0.ptr))
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def apply_domain(arg0, arg1):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_map:
                arg1 = union_map(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_apply_domain(isl.isl_union_map_copy(arg0.ptr), isl.isl_union_map_copy(arg1.ptr))
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def apply_range(arg0, arg1):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_map:
                arg1 = union_map(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_apply_range(isl.isl_union_map_copy(arg0.ptr), isl.isl_union_map_copy(arg1.ptr))
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def as_map(arg0):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_as_map(isl.isl_union_map_copy(arg0.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def as_multi_union_pw_aff(arg0):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_as_multi_union_pw_aff(isl.isl_union_map_copy(arg0.ptr))
        obj = multi_union_pw_aff(ctx=ctx, ptr=res)
        return obj
    def as_union_pw_multi_aff(arg0):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_as_union_pw_multi_aff(isl.isl_union_map_copy(arg0.ptr))
        obj = union_pw_multi_aff(ctx=ctx, ptr=res)
        return obj
    def bind_range(arg0, arg1):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_id:
                arg1 = multi_id(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_bind_range(isl.isl_union_map_copy(arg0.ptr), isl.isl_multi_id_copy(arg1.ptr))
        obj = union_set(ctx=ctx, ptr=res)
        return obj
    def coalesce(arg0):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_coalesce(isl.isl_union_map_copy(arg0.ptr))
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def compute_divs(arg0):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_compute_divs(isl.isl_union_map_copy(arg0.ptr))
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def curry(arg0):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_curry(isl.isl_union_map_copy(arg0.ptr))
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def deltas(arg0):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_deltas(isl.isl_union_map_copy(arg0.ptr))
        obj = union_set(ctx=ctx, ptr=res)
        return obj
    def detect_equalities(arg0):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_detect_equalities(isl.isl_union_map_copy(arg0.ptr))
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def domain(arg0):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_domain(isl.isl_union_map_copy(arg0.ptr))
        obj = union_set(ctx=ctx, ptr=res)
        return obj
    def domain_factor_domain(arg0):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_domain_factor_domain(isl.isl_union_map_copy(arg0.ptr))
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def domain_factor_range(arg0):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_domain_factor_range(isl.isl_union_map_copy(arg0.ptr))
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def domain_map(arg0):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_domain_map(isl.isl_union_map_copy(arg0.ptr))
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def domain_map_union_pw_multi_aff(arg0):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_domain_map_union_pw_multi_aff(isl.isl_union_map_copy(arg0.ptr))
        obj = union_pw_multi_aff(ctx=ctx, ptr=res)
        return obj
    def domain_product(arg0, arg1):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_map:
                arg1 = union_map(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_domain_product(isl.isl_union_map_copy(arg0.ptr), isl.isl_union_map_copy(arg1.ptr))
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    @staticmethod
    def empty(*args):
        if len(args) == 0:
            ctx = Context.getDefaultInstance()
            res = isl.isl_union_map_empty_ctx(ctx)
            obj = union_map(ctx=ctx, ptr=res)
            return obj
        raise Error
    def eq_at(*args):
        if len(args) == 2 and args[1].__class__ is multi_union_pw_aff:
            ctx = args[0].ctx
            res = isl.isl_union_map_eq_at_multi_union_pw_aff(isl.isl_union_map_copy(args[0].ptr), isl.isl_multi_union_pw_aff_copy(args[1].ptr))
            obj = union_map(ctx=ctx, ptr=res)
            return obj
        raise Error
    def every_map(arg0, arg1):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        exc_info = [None]
        fn = CFUNCTYPE(c_int, c_void_p, c_void_p)
        def cb_func(cb_arg0, cb_arg1):
            cb_arg0 = map(ctx=arg0.ctx, ptr=isl.isl_map_copy(cb_arg0))
            try:
                res = arg1(cb_arg0)
            except BaseException as e:
                exc_info[0] = e
                return -1
            return 1 if res else 0
        cb = fn(cb_func)
        ctx = arg0.ctx
        res = isl.isl_union_map_every_map(arg0.ptr, cb, None)
        if exc_info[0] is not None:
            raise exc_info[0]
        if res < 0:
            raise
        return bool(res)
    def extract_map(arg0, arg1):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is space:
                arg1 = space(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_extract_map(arg0.ptr, isl.isl_space_copy(arg1.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def factor_domain(arg0):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_factor_domain(isl.isl_union_map_copy(arg0.ptr))
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def factor_range(arg0):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_factor_range(isl.isl_union_map_copy(arg0.ptr))
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def fixed_power(*args):
        if len(args) == 2 and (args[1].__class__ is val or type(args[1]) == int):
            args = list(args)
            try:
                if not args[1].__class__ is val:
                    args[1] = val(args[1])
            except:
                raise
            ctx = args[0].ctx
            res = isl.isl_union_map_fixed_power_val(isl.isl_union_map_copy(args[0].ptr), isl.isl_val_copy(args[1].ptr))
            obj = union_map(ctx=ctx, ptr=res)
            return obj
        raise Error
    def foreach_map(arg0, arg1):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        exc_info = [None]
        fn = CFUNCTYPE(c_int, c_void_p, c_void_p)
        def cb_func(cb_arg0, cb_arg1):
            cb_arg0 = map(ctx=arg0.ctx, ptr=(cb_arg0))
            try:
                arg1(cb_arg0)
            except BaseException as e:
                exc_info[0] = e
                return -1
            return 0
        cb = fn(cb_func)
        ctx = arg0.ctx
        res = isl.isl_union_map_foreach_map(arg0.ptr, cb, None)
        if exc_info[0] is not None:
            raise exc_info[0]
        if res < 0:
            raise
    @staticmethod
    def convert_from(*args):
        if len(args) == 1 and args[0].__class__ is multi_union_pw_aff:
            ctx = args[0].ctx
            res = isl.isl_union_map_from_multi_union_pw_aff(isl.isl_multi_union_pw_aff_copy(args[0].ptr))
            obj = union_map(ctx=ctx, ptr=res)
            return obj
        if len(args) == 1 and args[0].__class__ is union_pw_multi_aff:
            ctx = args[0].ctx
            res = isl.isl_union_map_from_union_pw_multi_aff(isl.isl_union_pw_multi_aff_copy(args[0].ptr))
            obj = union_map(ctx=ctx, ptr=res)
            return obj
        raise Error
    @staticmethod
    def from_domain(arg0):
        try:
            if not arg0.__class__ is union_set:
                arg0 = union_set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_from_domain(isl.isl_union_set_copy(arg0.ptr))
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    @staticmethod
    def from_domain_and_range(arg0, arg1):
        try:
            if not arg0.__class__ is union_set:
                arg0 = union_set(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_set:
                arg1 = union_set(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_from_domain_and_range(isl.isl_union_set_copy(arg0.ptr), isl.isl_union_set_copy(arg1.ptr))
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    @staticmethod
    def from_range(arg0):
        try:
            if not arg0.__class__ is union_set:
                arg0 = union_set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_from_range(isl.isl_union_set_copy(arg0.ptr))
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def gist(arg0, arg1):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_map:
                arg1 = union_map(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_gist(isl.isl_union_map_copy(arg0.ptr), isl.isl_union_map_copy(arg1.ptr))
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def gist_domain(arg0, arg1):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_set:
                arg1 = union_set(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_gist_domain(isl.isl_union_map_copy(arg0.ptr), isl.isl_union_set_copy(arg1.ptr))
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def gist_params(arg0, arg1):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_gist_params(isl.isl_union_map_copy(arg0.ptr), isl.isl_set_copy(arg1.ptr))
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def gist_range(arg0, arg1):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_set:
                arg1 = union_set(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_gist_range(isl.isl_union_map_copy(arg0.ptr), isl.isl_union_set_copy(arg1.ptr))
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def intersect(arg0, arg1):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_map:
                arg1 = union_map(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_intersect(isl.isl_union_map_copy(arg0.ptr), isl.isl_union_map_copy(arg1.ptr))
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def intersect_domain(*args):
        if len(args) == 2 and args[1].__class__ is space:
            ctx = args[0].ctx
            res = isl.isl_union_map_intersect_domain_space(isl.isl_union_map_copy(args[0].ptr), isl.isl_space_copy(args[1].ptr))
            obj = union_map(ctx=ctx, ptr=res)
            return obj
        if len(args) == 2 and args[1].__class__ is union_set:
            ctx = args[0].ctx
            res = isl.isl_union_map_intersect_domain_union_set(isl.isl_union_map_copy(args[0].ptr), isl.isl_union_set_copy(args[1].ptr))
            obj = union_map(ctx=ctx, ptr=res)
            return obj
        raise Error
    def intersect_domain_factor_domain(arg0, arg1):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_map:
                arg1 = union_map(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_intersect_domain_factor_domain(isl.isl_union_map_copy(arg0.ptr), isl.isl_union_map_copy(arg1.ptr))
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def intersect_domain_factor_range(arg0, arg1):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_map:
                arg1 = union_map(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_intersect_domain_factor_range(isl.isl_union_map_copy(arg0.ptr), isl.isl_union_map_copy(arg1.ptr))
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def intersect_params(arg0, arg1):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_intersect_params(isl.isl_union_map_copy(arg0.ptr), isl.isl_set_copy(arg1.ptr))
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def intersect_range(*args):
        if len(args) == 2 and args[1].__class__ is space:
            ctx = args[0].ctx
            res = isl.isl_union_map_intersect_range_space(isl.isl_union_map_copy(args[0].ptr), isl.isl_space_copy(args[1].ptr))
            obj = union_map(ctx=ctx, ptr=res)
            return obj
        if len(args) == 2 and args[1].__class__ is union_set:
            ctx = args[0].ctx
            res = isl.isl_union_map_intersect_range_union_set(isl.isl_union_map_copy(args[0].ptr), isl.isl_union_set_copy(args[1].ptr))
            obj = union_map(ctx=ctx, ptr=res)
            return obj
        raise Error
    def intersect_range_factor_domain(arg0, arg1):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_map:
                arg1 = union_map(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_intersect_range_factor_domain(isl.isl_union_map_copy(arg0.ptr), isl.isl_union_map_copy(arg1.ptr))
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def intersect_range_factor_range(arg0, arg1):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_map:
                arg1 = union_map(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_intersect_range_factor_range(isl.isl_union_map_copy(arg0.ptr), isl.isl_union_map_copy(arg1.ptr))
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def is_bijective(arg0):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_is_bijective(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def is_disjoint(arg0, arg1):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_map:
                arg1 = union_map(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_is_disjoint(arg0.ptr, arg1.ptr)
        if res < 0:
            raise
        return bool(res)
    def is_empty(arg0):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_is_empty(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def is_equal(arg0, arg1):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_map:
                arg1 = union_map(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_is_equal(arg0.ptr, arg1.ptr)
        if res < 0:
            raise
        return bool(res)
    def is_injective(arg0):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_is_injective(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def is_single_valued(arg0):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_is_single_valued(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def is_strict_subset(arg0, arg1):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_map:
                arg1 = union_map(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_is_strict_subset(arg0.ptr, arg1.ptr)
        if res < 0:
            raise
        return bool(res)
    def is_subset(arg0, arg1):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_map:
                arg1 = union_map(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_is_subset(arg0.ptr, arg1.ptr)
        if res < 0:
            raise
        return bool(res)
    def isa_map(arg0):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_isa_map(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def lexmax(arg0):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_lexmax(isl.isl_union_map_copy(arg0.ptr))
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def lexmin(arg0):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_lexmin(isl.isl_union_map_copy(arg0.ptr))
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def map_list(arg0):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_get_map_list(arg0.ptr)
        obj = map_list(ctx=ctx, ptr=res)
        return obj
    def get_map_list(arg0):
        return arg0.map_list()
    def polyhedral_hull(arg0):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_polyhedral_hull(isl.isl_union_map_copy(arg0.ptr))
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def preimage_domain(*args):
        if len(args) == 2 and args[1].__class__ is multi_aff:
            ctx = args[0].ctx
            res = isl.isl_union_map_preimage_domain_multi_aff(isl.isl_union_map_copy(args[0].ptr), isl.isl_multi_aff_copy(args[1].ptr))
            obj = union_map(ctx=ctx, ptr=res)
            return obj
        if len(args) == 2 and args[1].__class__ is multi_pw_aff:
            ctx = args[0].ctx
            res = isl.isl_union_map_preimage_domain_multi_pw_aff(isl.isl_union_map_copy(args[0].ptr), isl.isl_multi_pw_aff_copy(args[1].ptr))
            obj = union_map(ctx=ctx, ptr=res)
            return obj
        if len(args) == 2 and args[1].__class__ is pw_multi_aff:
            ctx = args[0].ctx
            res = isl.isl_union_map_preimage_domain_pw_multi_aff(isl.isl_union_map_copy(args[0].ptr), isl.isl_pw_multi_aff_copy(args[1].ptr))
            obj = union_map(ctx=ctx, ptr=res)
            return obj
        if len(args) == 2 and args[1].__class__ is union_pw_multi_aff:
            ctx = args[0].ctx
            res = isl.isl_union_map_preimage_domain_union_pw_multi_aff(isl.isl_union_map_copy(args[0].ptr), isl.isl_union_pw_multi_aff_copy(args[1].ptr))
            obj = union_map(ctx=ctx, ptr=res)
            return obj
        raise Error
    def preimage_range(*args):
        if len(args) == 2 and args[1].__class__ is multi_aff:
            ctx = args[0].ctx
            res = isl.isl_union_map_preimage_range_multi_aff(isl.isl_union_map_copy(args[0].ptr), isl.isl_multi_aff_copy(args[1].ptr))
            obj = union_map(ctx=ctx, ptr=res)
            return obj
        if len(args) == 2 and args[1].__class__ is pw_multi_aff:
            ctx = args[0].ctx
            res = isl.isl_union_map_preimage_range_pw_multi_aff(isl.isl_union_map_copy(args[0].ptr), isl.isl_pw_multi_aff_copy(args[1].ptr))
            obj = union_map(ctx=ctx, ptr=res)
            return obj
        if len(args) == 2 and args[1].__class__ is union_pw_multi_aff:
            ctx = args[0].ctx
            res = isl.isl_union_map_preimage_range_union_pw_multi_aff(isl.isl_union_map_copy(args[0].ptr), isl.isl_union_pw_multi_aff_copy(args[1].ptr))
            obj = union_map(ctx=ctx, ptr=res)
            return obj
        raise Error
    def product(arg0, arg1):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_map:
                arg1 = union_map(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_product(isl.isl_union_map_copy(arg0.ptr), isl.isl_union_map_copy(arg1.ptr))
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def project_out_all_params(arg0):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_project_out_all_params(isl.isl_union_map_copy(arg0.ptr))
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def range(arg0):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_range(isl.isl_union_map_copy(arg0.ptr))
        obj = union_set(ctx=ctx, ptr=res)
        return obj
    def range_factor_domain(arg0):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_range_factor_domain(isl.isl_union_map_copy(arg0.ptr))
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def range_factor_range(arg0):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_range_factor_range(isl.isl_union_map_copy(arg0.ptr))
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def range_map(arg0):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_range_map(isl.isl_union_map_copy(arg0.ptr))
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def range_product(arg0, arg1):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_map:
                arg1 = union_map(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_range_product(isl.isl_union_map_copy(arg0.ptr), isl.isl_union_map_copy(arg1.ptr))
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def range_reverse(arg0):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_range_reverse(isl.isl_union_map_copy(arg0.ptr))
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def reverse(arg0):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_reverse(isl.isl_union_map_copy(arg0.ptr))
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def space(arg0):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_get_space(arg0.ptr)
        obj = space(ctx=ctx, ptr=res)
        return obj
    def get_space(arg0):
        return arg0.space()
    def subtract(arg0, arg1):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_map:
                arg1 = union_map(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_subtract(isl.isl_union_map_copy(arg0.ptr), isl.isl_union_map_copy(arg1.ptr))
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def subtract_domain(arg0, arg1):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_set:
                arg1 = union_set(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_subtract_domain(isl.isl_union_map_copy(arg0.ptr), isl.isl_union_set_copy(arg1.ptr))
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def subtract_range(arg0, arg1):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_set:
                arg1 = union_set(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_subtract_range(isl.isl_union_map_copy(arg0.ptr), isl.isl_union_set_copy(arg1.ptr))
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def uncurry(arg0):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_uncurry(isl.isl_union_map_copy(arg0.ptr))
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def union(arg0, arg1):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_map:
                arg1 = union_map(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_union(isl.isl_union_map_copy(arg0.ptr), isl.isl_union_map_copy(arg1.ptr))
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def universe(arg0):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_universe(isl.isl_union_map_copy(arg0.ptr))
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def wrap(arg0):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_wrap(isl.isl_union_map_copy(arg0.ptr))
        obj = union_set(ctx=ctx, ptr=res)
        return obj
    def zip(arg0):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_map_zip(isl.isl_union_map_copy(arg0.ptr))
        obj = union_map(ctx=ctx, ptr=res)
        return obj

isl.isl_union_map_from_basic_map.restype = c_void_p
isl.isl_union_map_from_basic_map.argtypes = [c_void_p]
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_affine_hull.argtypes = [c_void_p]
isl.isl_union_map_apply_domain.restype = c_void_p
isl.isl_union_map_apply_domain.argtypes = [c_void_p, c_void_p]
isl.isl_union_map_apply_range.restype = c_void_p
isl.isl_union_map_apply_range.argtypes = [c_void_p, c_void_p]
isl.isl_union_map_as_map.restype = c_void_p
isl.isl_union_map_as_map.argtypes = [c_void_p]
isl.isl_union_map_as_multi_union_pw_aff.restype = c_void_p
isl.isl_union_map_as_multi_union_pw_aff.argtypes = [c_void_p]
isl.isl_union_map_as_union_pw_multi_aff.restype = c_void_p
isl.isl_union_map_as_union_pw_multi_aff.argtypes = [c_void_p]
isl.isl_union_map_bind_range.restype = c_void_p
isl.isl_union_map_bind_range.argtypes = [c_void_p, c_void_p]
isl.isl_union_map_coalesce.restype = c_void_p
isl.isl_union_map_coalesce.argtypes = [c_void_p]
isl.isl_union_map_compute_divs.restype = c_void_p
isl.isl_union_map_compute_divs.argtypes = [c_void_p]
isl.isl_union_map_curry.restype = c_void_p
isl.isl_union_map_curry.argtypes = [c_void_p]
isl.isl_union_map_deltas.restype = c_void_p
isl.isl_union_map_deltas.argtypes = [c_void_p]
isl.isl_union_map_detect_equalities.restype = c_void_p
isl.isl_union_map_detect_equalities.argtypes = [c_void_p]
isl.isl_union_map_domain.restype = c_void_p
isl.isl_union_map_domain.argtypes = [c_void_p]
isl.isl_union_map_domain_factor_domain.restype = c_void_p
isl.isl_union_map_domain_factor_domain.argtypes = [c_void_p]
isl.isl_union_map_domain_factor_range.restype = c_void_p
isl.isl_union_map_domain_factor_range.argtypes = [c_void_p]
isl.isl_union_map_domain_map.restype = c_void_p
isl.isl_union_map_domain_map.argtypes = [c_void_p]
isl.isl_union_map_domain_map_union_pw_multi_aff.restype = c_void_p
isl.isl_union_map_domain_map_union_pw_multi_aff.argtypes = [c_void_p]
isl.isl_union_map_domain_product.restype = c_void_p
isl.isl_union_map_domain_product.argtypes = [c_void_p, c_void_p]
isl.isl_union_map_empty_ctx.restype = c_void_p
isl.isl_union_map_empty_ctx.argtypes = [Context]
isl.isl_union_map_eq_at_multi_union_pw_aff.restype = c_void_p
isl.isl_union_map_eq_at_multi_union_pw_aff.argtypes = [c_void_p, c_void_p]
isl.isl_union_map_every_map.argtypes = [c_void_p, c_void_p, c_void_p]
isl.isl_union_map_extract_map.restype = c_void_p
isl.isl_union_map_extract_map.argtypes = [c_void_p, c_void_p]
isl.isl_union_map_factor_domain.restype = c_void_p
isl.isl_union_map_factor_domain.argtypes = [c_void_p]
isl.isl_union_map_factor_range.restype = c_void_p
isl.isl_union_map_factor_range.argtypes = [c_void_p]
isl.isl_union_map_fixed_power_val.restype = c_void_p
isl.isl_union_map_fixed_power_val.argtypes = [c_void_p, c_void_p]
isl.isl_union_map_foreach_map.argtypes = [c_void_p, c_void_p, c_void_p]
isl.isl_union_map_from_multi_union_pw_aff.restype = c_void_p
isl.isl_union_map_from_multi_union_pw_aff.argtypes = [c_void_p]
isl.isl_union_map_from_union_pw_multi_aff.restype = c_void_p
isl.isl_union_map_from_union_pw_multi_aff.argtypes = [c_void_p]
isl.isl_union_map_from_domain.restype = c_void_p
isl.isl_union_map_from_domain.argtypes = [c_void_p]
isl.isl_union_map_from_domain_and_range.restype = c_void_p
isl.isl_union_map_from_domain_and_range.argtypes = [c_void_p, c_void_p]
isl.isl_union_map_from_range.restype = c_void_p
isl.isl_union_map_from_range.argtypes = [c_void_p]
isl.isl_union_map_gist.restype = c_void_p
isl.isl_union_map_gist.argtypes = [c_void_p, c_void_p]
isl.isl_union_map_gist_domain.restype = c_void_p
isl.isl_union_map_gist_domain.argtypes = [c_void_p, c_void_p]
isl.isl_union_map_gist_params.restype = c_void_p
isl.isl_union_map_gist_params.argtypes = [c_void_p, c_void_p]
isl.isl_union_map_gist_range.restype = c_void_p
isl.isl_union_map_gist_range.argtypes = [c_void_p, c_void_p]
isl.isl_union_map_intersect.restype = c_void_p
isl.isl_union_map_intersect.argtypes = [c_void_p, c_void_p]
isl.isl_union_map_intersect_domain_space.restype = c_void_p
isl.isl_union_map_intersect_domain_space.argtypes = [c_void_p, c_void_p]
isl.isl_union_map_intersect_domain_union_set.restype = c_void_p
isl.isl_union_map_intersect_domain_union_set.argtypes = [c_void_p, c_void_p]
isl.isl_union_map_intersect_domain_factor_domain.restype = c_void_p
isl.isl_union_map_intersect_domain_factor_domain.argtypes = [c_void_p, c_void_p]
isl.isl_union_map_intersect_domain_factor_range.restype = c_void_p
isl.isl_union_map_intersect_domain_factor_range.argtypes = [c_void_p, c_void_p]
isl.isl_union_map_intersect_params.restype = c_void_p
isl.isl_union_map_intersect_params.argtypes = [c_void_p, c_void_p]
isl.isl_union_map_intersect_range_space.restype = c_void_p
isl.isl_union_map_intersect_range_space.argtypes = [c_void_p, c_void_p]
isl.isl_union_map_intersect_range_union_set.restype = c_void_p
isl.isl_union_map_intersect_range_union_set.argtypes = [c_void_p, c_void_p]
isl.isl_union_map_intersect_range_factor_domain.restype = c_void_p
isl.isl_union_map_intersect_range_factor_domain.argtypes = [c_void_p, c_void_p]
isl.isl_union_map_intersect_range_factor_range.restype = c_void_p
isl.isl_union_map_intersect_range_factor_range.argtypes = [c_void_p, c_void_p]
isl.isl_union_map_is_bijective.argtypes = [c_void_p]
isl.isl_union_map_is_disjoint.argtypes = [c_void_p, c_void_p]
isl.isl_union_map_is_empty.argtypes = [c_void_p]
isl.isl_union_map_is_equal.argtypes = [c_void_p, c_void_p]
isl.isl_union_map_is_injective.argtypes = [c_void_p]
isl.isl_union_map_is_single_valued.argtypes = [c_void_p]
isl.isl_union_map_is_strict_subset.argtypes = [c_void_p, c_void_p]
isl.isl_union_map_is_subset.argtypes = [c_void_p, c_void_p]
isl.isl_union_map_isa_map.argtypes = [c_void_p]
isl.isl_union_map_lexmax.restype = c_void_p
isl.isl_union_map_lexmax.argtypes = [c_void_p]
isl.isl_union_map_lexmin.restype = c_void_p
isl.isl_union_map_lexmin.argtypes = [c_void_p]
isl.isl_union_map_get_map_list.restype = c_void_p
isl.isl_union_map_get_map_list.argtypes = [c_void_p]
isl.isl_union_map_polyhedral_hull.restype = c_void_p
isl.isl_union_map_polyhedral_hull.argtypes = [c_void_p]
isl.isl_union_map_preimage_domain_multi_aff.restype = c_void_p
isl.isl_union_map_preimage_domain_multi_aff.argtypes = [c_void_p, c_void_p]
isl.isl_union_map_preimage_domain_multi_pw_aff.restype = c_void_p
isl.isl_union_map_preimage_domain_multi_pw_aff.argtypes = [c_void_p, c_void_p]
isl.isl_union_map_preimage_domain_pw_multi_aff.restype = c_void_p
isl.isl_union_map_preimage_domain_pw_multi_aff.argtypes = [c_void_p, c_void_p]
isl.isl_union_map_preimage_domain_union_pw_multi_aff.restype = c_void_p
isl.isl_union_map_preimage_domain_union_pw_multi_aff.argtypes = [c_void_p, c_void_p]
isl.isl_union_map_preimage_range_multi_aff.restype = c_void_p
isl.isl_union_map_preimage_range_multi_aff.argtypes = [c_void_p, c_void_p]
isl.isl_union_map_preimage_range_pw_multi_aff.restype = c_void_p
isl.isl_union_map_preimage_range_pw_multi_aff.argtypes = [c_void_p, c_void_p]
isl.isl_union_map_preimage_range_union_pw_multi_aff.restype = c_void_p
isl.isl_union_map_preimage_range_union_pw_multi_aff.argtypes = [c_void_p, c_void_p]
isl.isl_union_map_product.restype = c_void_p
isl.isl_union_map_product.argtypes = [c_void_p, c_void_p]
isl.isl_union_map_project_out_all_params.restype = c_void_p
isl.isl_union_map_project_out_all_params.argtypes = [c_void_p]
isl.isl_union_map_range.restype = c_void_p
isl.isl_union_map_range.argtypes = [c_void_p]
isl.isl_union_map_range_factor_domain.restype = c_void_p
isl.isl_union_map_range_factor_domain.argtypes = [c_void_p]
isl.isl_union_map_range_factor_range.restype = c_void_p
isl.isl_union_map_range_factor_range.argtypes = [c_void_p]
isl.isl_union_map_range_map.restype = c_void_p
isl.isl_union_map_range_map.argtypes = [c_void_p]
isl.isl_union_map_range_product.restype = c_void_p
isl.isl_union_map_range_product.argtypes = [c_void_p, c_void_p]
isl.isl_union_map_range_reverse.restype = c_void_p
isl.isl_union_map_range_reverse.argtypes = [c_void_p]
isl.isl_union_map_reverse.restype = c_void_p
isl.isl_union_map_reverse.argtypes = [c_void_p]
isl.isl_union_map_get_space.restype = c_void_p
isl.isl_union_map_get_space.argtypes = [c_void_p]
isl.isl_union_map_subtract.restype = c_void_p
isl.isl_union_map_subtract.argtypes = [c_void_p, c_void_p]
isl.isl_union_map_subtract_domain.restype = c_void_p
isl.isl_union_map_subtract_domain.argtypes = [c_void_p, c_void_p]
isl.isl_union_map_subtract_range.restype = c_void_p
isl.isl_union_map_subtract_range.argtypes = [c_void_p, c_void_p]
isl.isl_union_map_uncurry.restype = c_void_p
isl.isl_union_map_uncurry.argtypes = [c_void_p]
isl.isl_union_map_union.restype = c_void_p
isl.isl_union_map_union.argtypes = [c_void_p, c_void_p]
isl.isl_union_map_universe.restype = c_void_p
isl.isl_union_map_universe.argtypes = [c_void_p]
isl.isl_union_map_wrap.restype = c_void_p
isl.isl_union_map_wrap.argtypes = [c_void_p]
isl.isl_union_map_zip.restype = c_void_p
isl.isl_union_map_zip.argtypes = [c_void_p]
isl.isl_union_map_copy.restype = c_void_p
isl.isl_union_map_copy.argtypes = [c_void_p]
isl.isl_union_map_free.restype = c_void_p
isl.isl_union_map_free.argtypes = [c_void_p]
isl.isl_union_map_to_str.restype = POINTER(c_char)
isl.isl_union_map_to_str.argtypes = [c_void_p]

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 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
        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].encode('ascii'))
            return
        raise Error
    def __del__(self):
        if hasattr(self, 'ptr'):
            isl.isl_map_free(self.ptr)
    def __str__(arg0):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        ptr = isl.isl_map_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.map("""%s""")' % s
        else:
            return 'isl.map("%s")' % s
    def affine_hull(arg0):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_affine_hull(isl.isl_map_copy(arg0.ptr))
        obj = basic_map(ctx=ctx, ptr=res)
        return obj
    def apply_domain(arg0, arg1):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is map:
                arg1 = map(arg1)
        except:
            return union_map(arg0).apply_domain(arg1)
        ctx = arg0.ctx
        res = isl.isl_map_apply_domain(isl.isl_map_copy(arg0.ptr), isl.isl_map_copy(arg1.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def apply_range(arg0, arg1):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is map:
                arg1 = map(arg1)
        except:
            return union_map(arg0).apply_range(arg1)
        ctx = arg0.ctx
        res = isl.isl_map_apply_range(isl.isl_map_copy(arg0.ptr), isl.isl_map_copy(arg1.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def as_pw_multi_aff(arg0):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_as_pw_multi_aff(isl.isl_map_copy(arg0.ptr))
        obj = pw_multi_aff(ctx=ctx, ptr=res)
        return obj
    def bind_domain(arg0, arg1):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_id:
                arg1 = multi_id(arg1)
        except:
            return union_map(arg0).bind_domain(arg1)
        ctx = arg0.ctx
        res = isl.isl_map_bind_domain(isl.isl_map_copy(arg0.ptr), isl.isl_multi_id_copy(arg1.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj
    def bind_range(arg0, arg1):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_id:
                arg1 = multi_id(arg1)
        except:
            return union_map(arg0).bind_range(arg1)
        ctx = arg0.ctx
        res = isl.isl_map_bind_range(isl.isl_map_copy(arg0.ptr), isl.isl_multi_id_copy(arg1.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj
    def coalesce(arg0):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_coalesce(isl.isl_map_copy(arg0.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def complement(arg0):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_complement(isl.isl_map_copy(arg0.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def curry(arg0):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_curry(isl.isl_map_copy(arg0.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def deltas(arg0):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_deltas(isl.isl_map_copy(arg0.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj
    def detect_equalities(arg0):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_detect_equalities(isl.isl_map_copy(arg0.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def domain(arg0):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_domain(isl.isl_map_copy(arg0.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj
    def domain_factor_domain(arg0):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_domain_factor_domain(isl.isl_map_copy(arg0.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def domain_factor_range(arg0):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_domain_factor_range(isl.isl_map_copy(arg0.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def domain_product(arg0, arg1):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is map:
                arg1 = map(arg1)
        except:
            return union_map(arg0).domain_product(arg1)
        ctx = arg0.ctx
        res = isl.isl_map_domain_product(isl.isl_map_copy(arg0.ptr), isl.isl_map_copy(arg1.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def domain_tuple_dim(arg0):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_domain_tuple_dim(arg0.ptr)
        if res < 0:
            raise
        return int(res)
    def domain_tuple_id(arg0):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_get_domain_tuple_id(arg0.ptr)
        obj = id(ctx=ctx, ptr=res)
        return obj
    def get_domain_tuple_id(arg0):
        return arg0.domain_tuple_id()
    @staticmethod
    def empty(arg0):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_empty(isl.isl_space_copy(arg0.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def eq_at(*args):
        if len(args) == 2 and args[1].__class__ is multi_pw_aff:
            ctx = args[0].ctx
            res = isl.isl_map_eq_at_multi_pw_aff(isl.isl_map_copy(args[0].ptr), isl.isl_multi_pw_aff_copy(args[1].ptr))
            obj = map(ctx=ctx, ptr=res)
            return obj
        raise Error
    def factor_domain(arg0):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_factor_domain(isl.isl_map_copy(arg0.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def factor_range(arg0):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_factor_range(isl.isl_map_copy(arg0.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def flatten(arg0):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_flatten(isl.isl_map_copy(arg0.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def flatten_domain(arg0):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_flatten_domain(isl.isl_map_copy(arg0.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def flatten_range(arg0):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_flatten_range(isl.isl_map_copy(arg0.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def foreach_basic_map(arg0, arg1):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        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=arg0.ctx, ptr=(cb_arg0))
            try:
                arg1(cb_arg0)
            except BaseException as e:
                exc_info[0] = e
                return -1
            return 0
        cb = fn(cb_func)
        ctx = arg0.ctx
        res = isl.isl_map_foreach_basic_map(arg0.ptr, cb, None)
        if exc_info[0] is not None:
            raise exc_info[0]
        if res < 0:
            raise
    def gist(arg0, arg1):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is map:
                arg1 = map(arg1)
        except:
            return union_map(arg0).gist(arg1)
        ctx = arg0.ctx
        res = isl.isl_map_gist(isl.isl_map_copy(arg0.ptr), isl.isl_map_copy(arg1.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def gist_domain(arg0, arg1):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            return union_map(arg0).gist_domain(arg1)
        ctx = arg0.ctx
        res = isl.isl_map_gist_domain(isl.isl_map_copy(arg0.ptr), isl.isl_set_copy(arg1.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def has_domain_tuple_id(arg0):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_has_domain_tuple_id(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def has_range_tuple_id(arg0):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_has_range_tuple_id(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def intersect(arg0, arg1):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is map:
                arg1 = map(arg1)
        except:
            return union_map(arg0).intersect(arg1)
        ctx = arg0.ctx
        res = isl.isl_map_intersect(isl.isl_map_copy(arg0.ptr), isl.isl_map_copy(arg1.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def intersect_domain(arg0, arg1):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            return union_map(arg0).intersect_domain(arg1)
        ctx = arg0.ctx
        res = isl.isl_map_intersect_domain(isl.isl_map_copy(arg0.ptr), isl.isl_set_copy(arg1.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def intersect_domain_factor_domain(arg0, arg1):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is map:
                arg1 = map(arg1)
        except:
            return union_map(arg0).intersect_domain_factor_domain(arg1)
        ctx = arg0.ctx
        res = isl.isl_map_intersect_domain_factor_domain(isl.isl_map_copy(arg0.ptr), isl.isl_map_copy(arg1.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def intersect_domain_factor_range(arg0, arg1):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is map:
                arg1 = map(arg1)
        except:
            return union_map(arg0).intersect_domain_factor_range(arg1)
        ctx = arg0.ctx
        res = isl.isl_map_intersect_domain_factor_range(isl.isl_map_copy(arg0.ptr), isl.isl_map_copy(arg1.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def intersect_params(arg0, arg1):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            return union_map(arg0).intersect_params(arg1)
        ctx = arg0.ctx
        res = isl.isl_map_intersect_params(isl.isl_map_copy(arg0.ptr), isl.isl_set_copy(arg1.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def intersect_range(arg0, arg1):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            return union_map(arg0).intersect_range(arg1)
        ctx = arg0.ctx
        res = isl.isl_map_intersect_range(isl.isl_map_copy(arg0.ptr), isl.isl_set_copy(arg1.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def intersect_range_factor_domain(arg0, arg1):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is map:
                arg1 = map(arg1)
        except:
            return union_map(arg0).intersect_range_factor_domain(arg1)
        ctx = arg0.ctx
        res = isl.isl_map_intersect_range_factor_domain(isl.isl_map_copy(arg0.ptr), isl.isl_map_copy(arg1.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def intersect_range_factor_range(arg0, arg1):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is map:
                arg1 = map(arg1)
        except:
            return union_map(arg0).intersect_range_factor_range(arg1)
        ctx = arg0.ctx
        res = isl.isl_map_intersect_range_factor_range(isl.isl_map_copy(arg0.ptr), isl.isl_map_copy(arg1.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def is_bijective(arg0):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_is_bijective(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def is_disjoint(arg0, arg1):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is map:
                arg1 = map(arg1)
        except:
            return union_map(arg0).is_disjoint(arg1)
        ctx = arg0.ctx
        res = isl.isl_map_is_disjoint(arg0.ptr, arg1.ptr)
        if res < 0:
            raise
        return bool(res)
    def is_empty(arg0):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_is_empty(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def is_equal(arg0, arg1):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is map:
                arg1 = map(arg1)
        except:
            return union_map(arg0).is_equal(arg1)
        ctx = arg0.ctx
        res = isl.isl_map_is_equal(arg0.ptr, arg1.ptr)
        if res < 0:
            raise
        return bool(res)
    def is_injective(arg0):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_is_injective(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def is_single_valued(arg0):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_is_single_valued(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def is_strict_subset(arg0, arg1):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is map:
                arg1 = map(arg1)
        except:
            return union_map(arg0).is_strict_subset(arg1)
        ctx = arg0.ctx
        res = isl.isl_map_is_strict_subset(arg0.ptr, arg1.ptr)
        if res < 0:
            raise
        return bool(res)
    def is_subset(arg0, arg1):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is map:
                arg1 = map(arg1)
        except:
            return union_map(arg0).is_subset(arg1)
        ctx = arg0.ctx
        res = isl.isl_map_is_subset(arg0.ptr, arg1.ptr)
        if res < 0:
            raise
        return bool(res)
    def lex_ge_at(*args):
        if len(args) == 2 and args[1].__class__ is multi_pw_aff:
            ctx = args[0].ctx
            res = isl.isl_map_lex_ge_at_multi_pw_aff(isl.isl_map_copy(args[0].ptr), isl.isl_multi_pw_aff_copy(args[1].ptr))
            obj = map(ctx=ctx, ptr=res)
            return obj
        raise Error
    def lex_gt_at(*args):
        if len(args) == 2 and args[1].__class__ is multi_pw_aff:
            ctx = args[0].ctx
            res = isl.isl_map_lex_gt_at_multi_pw_aff(isl.isl_map_copy(args[0].ptr), isl.isl_multi_pw_aff_copy(args[1].ptr))
            obj = map(ctx=ctx, ptr=res)
            return obj
        raise Error
    def lex_le_at(*args):
        if len(args) == 2 and args[1].__class__ is multi_pw_aff:
            ctx = args[0].ctx
            res = isl.isl_map_lex_le_at_multi_pw_aff(isl.isl_map_copy(args[0].ptr), isl.isl_multi_pw_aff_copy(args[1].ptr))
            obj = map(ctx=ctx, ptr=res)
            return obj
        raise Error
    def lex_lt_at(*args):
        if len(args) == 2 and args[1].__class__ is multi_pw_aff:
            ctx = args[0].ctx
            res = isl.isl_map_lex_lt_at_multi_pw_aff(isl.isl_map_copy(args[0].ptr), isl.isl_multi_pw_aff_copy(args[1].ptr))
            obj = map(ctx=ctx, ptr=res)
            return obj
        raise Error
    def lexmax(arg0):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_lexmax(isl.isl_map_copy(arg0.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def lexmax_pw_multi_aff(arg0):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_lexmax_pw_multi_aff(isl.isl_map_copy(arg0.ptr))
        obj = pw_multi_aff(ctx=ctx, ptr=res)
        return obj
    def lexmin(arg0):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_lexmin(isl.isl_map_copy(arg0.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def lexmin_pw_multi_aff(arg0):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_lexmin_pw_multi_aff(isl.isl_map_copy(arg0.ptr))
        obj = pw_multi_aff(ctx=ctx, ptr=res)
        return obj
    def lower_bound(*args):
        if len(args) == 2 and args[1].__class__ is multi_pw_aff:
            ctx = args[0].ctx
            res = isl.isl_map_lower_bound_multi_pw_aff(isl.isl_map_copy(args[0].ptr), isl.isl_multi_pw_aff_copy(args[1].ptr))
            obj = map(ctx=ctx, ptr=res)
            return obj
        raise Error
    def max_multi_pw_aff(arg0):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_max_multi_pw_aff(isl.isl_map_copy(arg0.ptr))
        obj = multi_pw_aff(ctx=ctx, ptr=res)
        return obj
    def min_multi_pw_aff(arg0):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_min_multi_pw_aff(isl.isl_map_copy(arg0.ptr))
        obj = multi_pw_aff(ctx=ctx, ptr=res)
        return obj
    def n_basic_map(arg0):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_n_basic_map(arg0.ptr)
        if res < 0:
            raise
        return int(res)
    def polyhedral_hull(arg0):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_polyhedral_hull(isl.isl_map_copy(arg0.ptr))
        obj = basic_map(ctx=ctx, ptr=res)
        return obj
    def preimage_domain(*args):
        if len(args) == 2 and args[1].__class__ is multi_aff:
            ctx = args[0].ctx
            res = isl.isl_map_preimage_domain_multi_aff(isl.isl_map_copy(args[0].ptr), isl.isl_multi_aff_copy(args[1].ptr))
            obj = map(ctx=ctx, ptr=res)
            return obj
        if len(args) == 2 and args[1].__class__ is multi_pw_aff:
            ctx = args[0].ctx
            res = isl.isl_map_preimage_domain_multi_pw_aff(isl.isl_map_copy(args[0].ptr), isl.isl_multi_pw_aff_copy(args[1].ptr))
            obj = map(ctx=ctx, ptr=res)
            return obj
        if len(args) == 2 and args[1].__class__ is pw_multi_aff:
            ctx = args[0].ctx
            res = isl.isl_map_preimage_domain_pw_multi_aff(isl.isl_map_copy(args[0].ptr), isl.isl_pw_multi_aff_copy(args[1].ptr))
            obj = map(ctx=ctx, ptr=res)
            return obj
        raise Error
    def preimage_range(*args):
        if len(args) == 2 and args[1].__class__ is multi_aff:
            ctx = args[0].ctx
            res = isl.isl_map_preimage_range_multi_aff(isl.isl_map_copy(args[0].ptr), isl.isl_multi_aff_copy(args[1].ptr))
            obj = map(ctx=ctx, ptr=res)
            return obj
        if len(args) == 2 and args[1].__class__ is pw_multi_aff:
            ctx = args[0].ctx
            res = isl.isl_map_preimage_range_pw_multi_aff(isl.isl_map_copy(args[0].ptr), isl.isl_pw_multi_aff_copy(args[1].ptr))
            obj = map(ctx=ctx, ptr=res)
            return obj
        raise Error
    def product(arg0, arg1):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is map:
                arg1 = map(arg1)
        except:
            return union_map(arg0).product(arg1)
        ctx = arg0.ctx
        res = isl.isl_map_product(isl.isl_map_copy(arg0.ptr), isl.isl_map_copy(arg1.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def project_out_all_params(arg0):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_project_out_all_params(isl.isl_map_copy(arg0.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def range(arg0):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_range(isl.isl_map_copy(arg0.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj
    def range_factor_domain(arg0):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_range_factor_domain(isl.isl_map_copy(arg0.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def range_factor_range(arg0):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_range_factor_range(isl.isl_map_copy(arg0.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def range_lattice_tile(arg0):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_get_range_lattice_tile(arg0.ptr)
        obj = fixed_box(ctx=ctx, ptr=res)
        return obj
    def get_range_lattice_tile(arg0):
        return arg0.range_lattice_tile()
    def range_product(arg0, arg1):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is map:
                arg1 = map(arg1)
        except:
            return union_map(arg0).range_product(arg1)
        ctx = arg0.ctx
        res = isl.isl_map_range_product(isl.isl_map_copy(arg0.ptr), isl.isl_map_copy(arg1.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def range_reverse(arg0):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_range_reverse(isl.isl_map_copy(arg0.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def range_simple_fixed_box_hull(arg0):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_get_range_simple_fixed_box_hull(arg0.ptr)
        obj = fixed_box(ctx=ctx, ptr=res)
        return obj
    def get_range_simple_fixed_box_hull(arg0):
        return arg0.range_simple_fixed_box_hull()
    def range_tuple_dim(arg0):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_range_tuple_dim(arg0.ptr)
        if res < 0:
            raise
        return int(res)
    def range_tuple_id(arg0):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_get_range_tuple_id(arg0.ptr)
        obj = id(ctx=ctx, ptr=res)
        return obj
    def get_range_tuple_id(arg0):
        return arg0.range_tuple_id()
    def reverse(arg0):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_reverse(isl.isl_map_copy(arg0.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def sample(arg0):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_sample(isl.isl_map_copy(arg0.ptr))
        obj = basic_map(ctx=ctx, ptr=res)
        return obj
    def set_domain_tuple(*args):
        if len(args) == 2 and (args[1].__class__ is id or type(args[1]) == str):
            args = list(args)
            try:
                if not args[1].__class__ is id:
                    args[1] = id(args[1])
            except:
                raise
            ctx = args[0].ctx
            res = isl.isl_map_set_domain_tuple_id(isl.isl_map_copy(args[0].ptr), isl.isl_id_copy(args[1].ptr))
            obj = map(ctx=ctx, ptr=res)
            return obj
        raise Error
    def set_range_tuple(*args):
        if len(args) == 2 and (args[1].__class__ is id or type(args[1]) == str):
            args = list(args)
            try:
                if not args[1].__class__ is id:
                    args[1] = id(args[1])
            except:
                raise
            ctx = args[0].ctx
            res = isl.isl_map_set_range_tuple_id(isl.isl_map_copy(args[0].ptr), isl.isl_id_copy(args[1].ptr))
            obj = map(ctx=ctx, ptr=res)
            return obj
        raise Error
    def space(arg0):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_get_space(arg0.ptr)
        obj = space(ctx=ctx, ptr=res)
        return obj
    def get_space(arg0):
        return arg0.space()
    def subtract(arg0, arg1):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is map:
                arg1 = map(arg1)
        except:
            return union_map(arg0).subtract(arg1)
        ctx = arg0.ctx
        res = isl.isl_map_subtract(isl.isl_map_copy(arg0.ptr), isl.isl_map_copy(arg1.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def to_list(arg0):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_to_list(isl.isl_map_copy(arg0.ptr))
        obj = map_list(ctx=ctx, ptr=res)
        return obj
    def to_union_map(arg0):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_to_union_map(isl.isl_map_copy(arg0.ptr))
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def uncurry(arg0):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_uncurry(isl.isl_map_copy(arg0.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def union(arg0, arg1):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is map:
                arg1 = map(arg1)
        except:
            return union_map(arg0).union(arg1)
        ctx = arg0.ctx
        res = isl.isl_map_union(isl.isl_map_copy(arg0.ptr), isl.isl_map_copy(arg1.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    @staticmethod
    def universe(arg0):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_universe(isl.isl_space_copy(arg0.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def unshifted_simple_hull(arg0):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_unshifted_simple_hull(isl.isl_map_copy(arg0.ptr))
        obj = basic_map(ctx=ctx, ptr=res)
        return obj
    def upper_bound(*args):
        if len(args) == 2 and args[1].__class__ is multi_pw_aff:
            ctx = args[0].ctx
            res = isl.isl_map_upper_bound_multi_pw_aff(isl.isl_map_copy(args[0].ptr), isl.isl_multi_pw_aff_copy(args[1].ptr))
            obj = map(ctx=ctx, ptr=res)
            return obj
        raise Error
    def wrap(arg0):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_wrap(isl.isl_map_copy(arg0.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj
    def zip(arg0):
        try:
            if not arg0.__class__ is map:
                arg0 = map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_zip(isl.isl_map_copy(arg0.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj

isl.isl_map_from_basic_map.restype = c_void_p
isl.isl_map_from_basic_map.argtypes = [c_void_p]
isl.isl_map_read_from_str.restype = c_void_p
isl.isl_map_read_from_str.argtypes = [Context, c_char_p]
isl.isl_map_affine_hull.restype = c_void_p
isl.isl_map_affine_hull.argtypes = [c_void_p]
isl.isl_map_apply_domain.restype = c_void_p
isl.isl_map_apply_domain.argtypes = [c_void_p, c_void_p]
isl.isl_map_apply_range.restype = c_void_p
isl.isl_map_apply_range.argtypes = [c_void_p, c_void_p]
isl.isl_map_as_pw_multi_aff.restype = c_void_p
isl.isl_map_as_pw_multi_aff.argtypes = [c_void_p]
isl.isl_map_bind_domain.restype = c_void_p
isl.isl_map_bind_domain.argtypes = [c_void_p, c_void_p]
isl.isl_map_bind_range.restype = c_void_p
isl.isl_map_bind_range.argtypes = [c_void_p, c_void_p]
isl.isl_map_coalesce.restype = c_void_p
isl.isl_map_coalesce.argtypes = [c_void_p]
isl.isl_map_complement.restype = c_void_p
isl.isl_map_complement.argtypes = [c_void_p]
isl.isl_map_curry.restype = c_void_p
isl.isl_map_curry.argtypes = [c_void_p]
isl.isl_map_deltas.restype = c_void_p
isl.isl_map_deltas.argtypes = [c_void_p]
isl.isl_map_detect_equalities.restype = c_void_p
isl.isl_map_detect_equalities.argtypes = [c_void_p]
isl.isl_map_domain.restype = c_void_p
isl.isl_map_domain.argtypes = [c_void_p]
isl.isl_map_domain_factor_domain.restype = c_void_p
isl.isl_map_domain_factor_domain.argtypes = [c_void_p]
isl.isl_map_domain_factor_range.restype = c_void_p
isl.isl_map_domain_factor_range.argtypes = [c_void_p]
isl.isl_map_domain_product.restype = c_void_p
isl.isl_map_domain_product.argtypes = [c_void_p, c_void_p]
isl.isl_map_domain_tuple_dim.argtypes = [c_void_p]
isl.isl_map_get_domain_tuple_id.restype = c_void_p
isl.isl_map_get_domain_tuple_id.argtypes = [c_void_p]
isl.isl_map_empty.restype = c_void_p
isl.isl_map_empty.argtypes = [c_void_p]
isl.isl_map_eq_at_multi_pw_aff.restype = c_void_p
isl.isl_map_eq_at_multi_pw_aff.argtypes = [c_void_p, c_void_p]
isl.isl_map_factor_domain.restype = c_void_p
isl.isl_map_factor_domain.argtypes = [c_void_p]
isl.isl_map_factor_range.restype = c_void_p
isl.isl_map_factor_range.argtypes = [c_void_p]
isl.isl_map_flatten.restype = c_void_p
isl.isl_map_flatten.argtypes = [c_void_p]
isl.isl_map_flatten_domain.restype = c_void_p
isl.isl_map_flatten_domain.argtypes = [c_void_p]
isl.isl_map_flatten_range.restype = c_void_p
isl.isl_map_flatten_range.argtypes = [c_void_p]
isl.isl_map_foreach_basic_map.argtypes = [c_void_p, c_void_p, c_void_p]
isl.isl_map_gist.restype = c_void_p
isl.isl_map_gist.argtypes = [c_void_p, c_void_p]
isl.isl_map_gist_domain.restype = c_void_p
isl.isl_map_gist_domain.argtypes = [c_void_p, c_void_p]
isl.isl_map_has_domain_tuple_id.argtypes = [c_void_p]
isl.isl_map_has_range_tuple_id.argtypes = [c_void_p]
isl.isl_map_intersect.restype = c_void_p
isl.isl_map_intersect.argtypes = [c_void_p, c_void_p]
isl.isl_map_intersect_domain.restype = c_void_p
isl.isl_map_intersect_domain.argtypes = [c_void_p, c_void_p]
isl.isl_map_intersect_domain_factor_domain.restype = c_void_p
isl.isl_map_intersect_domain_factor_domain.argtypes = [c_void_p, c_void_p]
isl.isl_map_intersect_domain_factor_range.restype = c_void_p
isl.isl_map_intersect_domain_factor_range.argtypes = [c_void_p, c_void_p]
isl.isl_map_intersect_params.restype = c_void_p
isl.isl_map_intersect_params.argtypes = [c_void_p, c_void_p]
isl.isl_map_intersect_range.restype = c_void_p
isl.isl_map_intersect_range.argtypes = [c_void_p, c_void_p]
isl.isl_map_intersect_range_factor_domain.restype = c_void_p
isl.isl_map_intersect_range_factor_domain.argtypes = [c_void_p, c_void_p]
isl.isl_map_intersect_range_factor_range.restype = c_void_p
isl.isl_map_intersect_range_factor_range.argtypes = [c_void_p, c_void_p]
isl.isl_map_is_bijective.argtypes = [c_void_p]
isl.isl_map_is_disjoint.argtypes = [c_void_p, c_void_p]
isl.isl_map_is_empty.argtypes = [c_void_p]
isl.isl_map_is_equal.argtypes = [c_void_p, c_void_p]
isl.isl_map_is_injective.argtypes = [c_void_p]
isl.isl_map_is_single_valued.argtypes = [c_void_p]
isl.isl_map_is_strict_subset.argtypes = [c_void_p, c_void_p]
isl.isl_map_is_subset.argtypes = [c_void_p, c_void_p]
isl.isl_map_lex_ge_at_multi_pw_aff.restype = c_void_p
isl.isl_map_lex_ge_at_multi_pw_aff.argtypes = [c_void_p, c_void_p]
isl.isl_map_lex_gt_at_multi_pw_aff.restype = c_void_p
isl.isl_map_lex_gt_at_multi_pw_aff.argtypes = [c_void_p, c_void_p]
isl.isl_map_lex_le_at_multi_pw_aff.restype = c_void_p
isl.isl_map_lex_le_at_multi_pw_aff.argtypes = [c_void_p, c_void_p]
isl.isl_map_lex_lt_at_multi_pw_aff.restype = c_void_p
isl.isl_map_lex_lt_at_multi_pw_aff.argtypes = [c_void_p, c_void_p]
isl.isl_map_lexmax.restype = c_void_p
isl.isl_map_lexmax.argtypes = [c_void_p]
isl.isl_map_lexmax_pw_multi_aff.restype = c_void_p
isl.isl_map_lexmax_pw_multi_aff.argtypes = [c_void_p]
isl.isl_map_lexmin.restype = c_void_p
isl.isl_map_lexmin.argtypes = [c_void_p]
isl.isl_map_lexmin_pw_multi_aff.restype = c_void_p
isl.isl_map_lexmin_pw_multi_aff.argtypes = [c_void_p]
isl.isl_map_lower_bound_multi_pw_aff.restype = c_void_p
isl.isl_map_lower_bound_multi_pw_aff.argtypes = [c_void_p, c_void_p]
isl.isl_map_max_multi_pw_aff.restype = c_void_p
isl.isl_map_max_multi_pw_aff.argtypes = [c_void_p]
isl.isl_map_min_multi_pw_aff.restype = c_void_p
isl.isl_map_min_multi_pw_aff.argtypes = [c_void_p]
isl.isl_map_n_basic_map.argtypes = [c_void_p]
isl.isl_map_polyhedral_hull.restype = c_void_p
isl.isl_map_polyhedral_hull.argtypes = [c_void_p]
isl.isl_map_preimage_domain_multi_aff.restype = c_void_p
isl.isl_map_preimage_domain_multi_aff.argtypes = [c_void_p, c_void_p]
isl.isl_map_preimage_domain_multi_pw_aff.restype = c_void_p
isl.isl_map_preimage_domain_multi_pw_aff.argtypes = [c_void_p, c_void_p]
isl.isl_map_preimage_domain_pw_multi_aff.restype = c_void_p
isl.isl_map_preimage_domain_pw_multi_aff.argtypes = [c_void_p, c_void_p]
isl.isl_map_preimage_range_multi_aff.restype = c_void_p
isl.isl_map_preimage_range_multi_aff.argtypes = [c_void_p, c_void_p]
isl.isl_map_preimage_range_pw_multi_aff.restype = c_void_p
isl.isl_map_preimage_range_pw_multi_aff.argtypes = [c_void_p, c_void_p]
isl.isl_map_product.restype = c_void_p
isl.isl_map_product.argtypes = [c_void_p, c_void_p]
isl.isl_map_project_out_all_params.restype = c_void_p
isl.isl_map_project_out_all_params.argtypes = [c_void_p]
isl.isl_map_range.restype = c_void_p
isl.isl_map_range.argtypes = [c_void_p]
isl.isl_map_range_factor_domain.restype = c_void_p
isl.isl_map_range_factor_domain.argtypes = [c_void_p]
isl.isl_map_range_factor_range.restype = c_void_p
isl.isl_map_range_factor_range.argtypes = [c_void_p]
isl.isl_map_get_range_lattice_tile.restype = c_void_p
isl.isl_map_get_range_lattice_tile.argtypes = [c_void_p]
isl.isl_map_range_product.restype = c_void_p
isl.isl_map_range_product.argtypes = [c_void_p, c_void_p]
isl.isl_map_range_reverse.restype = c_void_p
isl.isl_map_range_reverse.argtypes = [c_void_p]
isl.isl_map_get_range_simple_fixed_box_hull.restype = c_void_p
isl.isl_map_get_range_simple_fixed_box_hull.argtypes = [c_void_p]
isl.isl_map_range_tuple_dim.argtypes = [c_void_p]
isl.isl_map_get_range_tuple_id.restype = c_void_p
isl.isl_map_get_range_tuple_id.argtypes = [c_void_p]
isl.isl_map_reverse.restype = c_void_p
isl.isl_map_reverse.argtypes = [c_void_p]
isl.isl_map_sample.restype = c_void_p
isl.isl_map_sample.argtypes = [c_void_p]
isl.isl_map_set_domain_tuple_id.restype = c_void_p
isl.isl_map_set_domain_tuple_id.argtypes = [c_void_p, c_void_p]
isl.isl_map_set_range_tuple_id.restype = c_void_p
isl.isl_map_set_range_tuple_id.argtypes = [c_void_p, c_void_p]
isl.isl_map_get_space.restype = c_void_p
isl.isl_map_get_space.argtypes = [c_void_p]
isl.isl_map_subtract.restype = c_void_p
isl.isl_map_subtract.argtypes = [c_void_p, c_void_p]
isl.isl_map_to_list.restype = c_void_p
isl.isl_map_to_list.argtypes = [c_void_p]
isl.isl_map_to_union_map.restype = c_void_p
isl.isl_map_to_union_map.argtypes = [c_void_p]
isl.isl_map_uncurry.restype = c_void_p
isl.isl_map_uncurry.argtypes = [c_void_p]
isl.isl_map_union.restype = c_void_p
isl.isl_map_union.argtypes = [c_void_p, c_void_p]
isl.isl_map_universe.restype = c_void_p
isl.isl_map_universe.argtypes = [c_void_p]
isl.isl_map_unshifted_simple_hull.restype = c_void_p
isl.isl_map_unshifted_simple_hull.argtypes = [c_void_p]
isl.isl_map_upper_bound_multi_pw_aff.restype = c_void_p
isl.isl_map_upper_bound_multi_pw_aff.argtypes = [c_void_p, c_void_p]
isl.isl_map_wrap.restype = c_void_p
isl.isl_map_wrap.argtypes = [c_void_p]
isl.isl_map_zip.restype = c_void_p
isl.isl_map_zip.argtypes = [c_void_p]
isl.isl_map_copy.restype = c_void_p
isl.isl_map_copy.argtypes = [c_void_p]
isl.isl_map_free.restype = c_void_p
isl.isl_map_free.argtypes = [c_void_p]
isl.isl_map_to_str.restype = POINTER(c_char)
isl.isl_map_to_str.argtypes = [c_void_p]

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].encode('ascii'))
            return
        raise Error
    def __del__(self):
        if hasattr(self, 'ptr'):
            isl.isl_basic_map_free(self.ptr)
    def __str__(arg0):
        try:
            if not arg0.__class__ is basic_map:
                arg0 = basic_map(arg0)
        except:
            raise
        ptr = isl.isl_basic_map_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.basic_map("""%s""")' % s
        else:
            return 'isl.basic_map("%s")' % s
    def affine_hull(arg0):
        try:
            if not arg0.__class__ is basic_map:
                arg0 = basic_map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_basic_map_affine_hull(isl.isl_basic_map_copy(arg0.ptr))
        obj = basic_map(ctx=ctx, ptr=res)
        return obj
    def apply_domain(arg0, arg1):
        try:
            if not arg0.__class__ is basic_map:
                arg0 = basic_map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is basic_map:
                arg1 = basic_map(arg1)
        except:
            return map(arg0).apply_domain(arg1)
        ctx = arg0.ctx
        res = isl.isl_basic_map_apply_domain(isl.isl_basic_map_copy(arg0.ptr), isl.isl_basic_map_copy(arg1.ptr))
        obj = basic_map(ctx=ctx, ptr=res)
        return obj
    def apply_range(arg0, arg1):
        try:
            if not arg0.__class__ is basic_map:
                arg0 = basic_map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is basic_map:
                arg1 = basic_map(arg1)
        except:
            return map(arg0).apply_range(arg1)
        ctx = arg0.ctx
        res = isl.isl_basic_map_apply_range(isl.isl_basic_map_copy(arg0.ptr), isl.isl_basic_map_copy(arg1.ptr))
        obj = basic_map(ctx=ctx, ptr=res)
        return obj
    def deltas(arg0):
        try:
            if not arg0.__class__ is basic_map:
                arg0 = basic_map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_basic_map_deltas(isl.isl_basic_map_copy(arg0.ptr))
        obj = basic_set(ctx=ctx, ptr=res)
        return obj
    def detect_equalities(arg0):
        try:
            if not arg0.__class__ is basic_map:
                arg0 = basic_map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_basic_map_detect_equalities(isl.isl_basic_map_copy(arg0.ptr))
        obj = basic_map(ctx=ctx, ptr=res)
        return obj
    def flatten(arg0):
        try:
            if not arg0.__class__ is basic_map:
                arg0 = basic_map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_basic_map_flatten(isl.isl_basic_map_copy(arg0.ptr))
        obj = basic_map(ctx=ctx, ptr=res)
        return obj
    def flatten_domain(arg0):
        try:
            if not arg0.__class__ is basic_map:
                arg0 = basic_map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_basic_map_flatten_domain(isl.isl_basic_map_copy(arg0.ptr))
        obj = basic_map(ctx=ctx, ptr=res)
        return obj
    def flatten_range(arg0):
        try:
            if not arg0.__class__ is basic_map:
                arg0 = basic_map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_basic_map_flatten_range(isl.isl_basic_map_copy(arg0.ptr))
        obj = basic_map(ctx=ctx, ptr=res)
        return obj
    def gist(arg0, arg1):
        try:
            if not arg0.__class__ is basic_map:
                arg0 = basic_map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is basic_map:
                arg1 = basic_map(arg1)
        except:
            return map(arg0).gist(arg1)
        ctx = arg0.ctx
        res = isl.isl_basic_map_gist(isl.isl_basic_map_copy(arg0.ptr), isl.isl_basic_map_copy(arg1.ptr))
        obj = basic_map(ctx=ctx, ptr=res)
        return obj
    def intersect(arg0, arg1):
        try:
            if not arg0.__class__ is basic_map:
                arg0 = basic_map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is basic_map:
                arg1 = basic_map(arg1)
        except:
            return map(arg0).intersect(arg1)
        ctx = arg0.ctx
        res = isl.isl_basic_map_intersect(isl.isl_basic_map_copy(arg0.ptr), isl.isl_basic_map_copy(arg1.ptr))
        obj = basic_map(ctx=ctx, ptr=res)
        return obj
    def intersect_domain(arg0, arg1):
        try:
            if not arg0.__class__ is basic_map:
                arg0 = basic_map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is basic_set:
                arg1 = basic_set(arg1)
        except:
            return map(arg0).intersect_domain(arg1)
        ctx = arg0.ctx
        res = isl.isl_basic_map_intersect_domain(isl.isl_basic_map_copy(arg0.ptr), isl.isl_basic_set_copy(arg1.ptr))
        obj = basic_map(ctx=ctx, ptr=res)
        return obj
    def intersect_range(arg0, arg1):
        try:
            if not arg0.__class__ is basic_map:
                arg0 = basic_map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is basic_set:
                arg1 = basic_set(arg1)
        except:
            return map(arg0).intersect_range(arg1)
        ctx = arg0.ctx
        res = isl.isl_basic_map_intersect_range(isl.isl_basic_map_copy(arg0.ptr), isl.isl_basic_set_copy(arg1.ptr))
        obj = basic_map(ctx=ctx, ptr=res)
        return obj
    def is_empty(arg0):
        try:
            if not arg0.__class__ is basic_map:
                arg0 = basic_map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_basic_map_is_empty(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def is_equal(arg0, arg1):
        try:
            if not arg0.__class__ is basic_map:
                arg0 = basic_map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is basic_map:
                arg1 = basic_map(arg1)
        except:
            return map(arg0).is_equal(arg1)
        ctx = arg0.ctx
        res = isl.isl_basic_map_is_equal(arg0.ptr, arg1.ptr)
        if res < 0:
            raise
        return bool(res)
    def is_subset(arg0, arg1):
        try:
            if not arg0.__class__ is basic_map:
                arg0 = basic_map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is basic_map:
                arg1 = basic_map(arg1)
        except:
            return map(arg0).is_subset(arg1)
        ctx = arg0.ctx
        res = isl.isl_basic_map_is_subset(arg0.ptr, arg1.ptr)
        if res < 0:
            raise
        return bool(res)
    def lexmax(arg0):
        try:
            if not arg0.__class__ is basic_map:
                arg0 = basic_map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_basic_map_lexmax(isl.isl_basic_map_copy(arg0.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def lexmin(arg0):
        try:
            if not arg0.__class__ is basic_map:
                arg0 = basic_map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_basic_map_lexmin(isl.isl_basic_map_copy(arg0.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def reverse(arg0):
        try:
            if not arg0.__class__ is basic_map:
                arg0 = basic_map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_basic_map_reverse(isl.isl_basic_map_copy(arg0.ptr))
        obj = basic_map(ctx=ctx, ptr=res)
        return obj
    def sample(arg0):
        try:
            if not arg0.__class__ is basic_map:
                arg0 = basic_map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_basic_map_sample(isl.isl_basic_map_copy(arg0.ptr))
        obj = basic_map(ctx=ctx, ptr=res)
        return obj
    def union(arg0, arg1):
        try:
            if not arg0.__class__ is basic_map:
                arg0 = basic_map(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is basic_map:
                arg1 = basic_map(arg1)
        except:
            return map(arg0).union(arg1)
        ctx = arg0.ctx
        res = isl.isl_basic_map_union(isl.isl_basic_map_copy(arg0.ptr), isl.isl_basic_map_copy(arg1.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj

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_affine_hull.restype = c_void_p
isl.isl_basic_map_affine_hull.argtypes = [c_void_p]
isl.isl_basic_map_apply_domain.restype = c_void_p
isl.isl_basic_map_apply_domain.argtypes = [c_void_p, c_void_p]
isl.isl_basic_map_apply_range.restype = c_void_p
isl.isl_basic_map_apply_range.argtypes = [c_void_p, c_void_p]
isl.isl_basic_map_deltas.restype = c_void_p
isl.isl_basic_map_deltas.argtypes = [c_void_p]
isl.isl_basic_map_detect_equalities.restype = c_void_p
isl.isl_basic_map_detect_equalities.argtypes = [c_void_p]
isl.isl_basic_map_flatten.restype = c_void_p
isl.isl_basic_map_flatten.argtypes = [c_void_p]
isl.isl_basic_map_flatten_domain.restype = c_void_p
isl.isl_basic_map_flatten_domain.argtypes = [c_void_p]
isl.isl_basic_map_flatten_range.restype = c_void_p
isl.isl_basic_map_flatten_range.argtypes = [c_void_p]
isl.isl_basic_map_gist.restype = c_void_p
isl.isl_basic_map_gist.argtypes = [c_void_p, c_void_p]
isl.isl_basic_map_intersect.restype = c_void_p
isl.isl_basic_map_intersect.argtypes = [c_void_p, c_void_p]
isl.isl_basic_map_intersect_domain.restype = c_void_p
isl.isl_basic_map_intersect_domain.argtypes = [c_void_p, c_void_p]
isl.isl_basic_map_intersect_range.restype = c_void_p
isl.isl_basic_map_intersect_range.argtypes = [c_void_p, c_void_p]
isl.isl_basic_map_is_empty.argtypes = [c_void_p]
isl.isl_basic_map_is_equal.argtypes = [c_void_p, c_void_p]
isl.isl_basic_map_is_subset.argtypes = [c_void_p, c_void_p]
isl.isl_basic_map_lexmax.restype = c_void_p
isl.isl_basic_map_lexmax.argtypes = [c_void_p]
isl.isl_basic_map_lexmin.restype = c_void_p
isl.isl_basic_map_lexmin.argtypes = [c_void_p]
isl.isl_basic_map_reverse.restype = c_void_p
isl.isl_basic_map_reverse.argtypes = [c_void_p]
isl.isl_basic_map_sample.restype = c_void_p
isl.isl_basic_map_sample.argtypes = [c_void_p]
isl.isl_basic_map_union.restype = c_void_p
isl.isl_basic_map_union.argtypes = [c_void_p, c_void_p]
isl.isl_basic_map_copy.restype = c_void_p
isl.isl_basic_map_copy.argtypes = [c_void_p]
isl.isl_basic_map_free.restype = c_void_p
isl.isl_basic_map_free.argtypes = [c_void_p]
isl.isl_basic_map_to_str.restype = POINTER(c_char)
isl.isl_basic_map_to_str.argtypes = [c_void_p]

class union_set(object):
    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 basic_set:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_union_set_from_basic_set(isl.isl_basic_set_copy(args[0].ptr))
            return
        if len(args) == 1 and args[0].__class__ is point:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_union_set_from_point(isl.isl_point_copy(args[0].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].encode('ascii'))
            return
        raise Error
    def __del__(self):
        if hasattr(self, 'ptr'):
            isl.isl_union_set_free(self.ptr)
    def __str__(arg0):
        try:
            if not arg0.__class__ is union_set:
                arg0 = union_set(arg0)
        except:
            raise
        ptr = isl.isl_union_set_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.union_set("""%s""")' % s
        else:
            return 'isl.union_set("%s")' % s
    def affine_hull(arg0):
        try:
            if not arg0.__class__ is union_set:
                arg0 = union_set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_set_affine_hull(isl.isl_union_set_copy(arg0.ptr))
        obj = union_set(ctx=ctx, ptr=res)
        return obj
    def apply(arg0, arg1):
        try:
            if not arg0.__class__ is union_set:
                arg0 = union_set(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_map:
                arg1 = union_map(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_set_apply(isl.isl_union_set_copy(arg0.ptr), isl.isl_union_map_copy(arg1.ptr))
        obj = union_set(ctx=ctx, ptr=res)
        return obj
    def as_set(arg0):
        try:
            if not arg0.__class__ is union_set:
                arg0 = union_set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_set_as_set(isl.isl_union_set_copy(arg0.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj
    def coalesce(arg0):
        try:
            if not arg0.__class__ is union_set:
                arg0 = union_set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_set_coalesce(isl.isl_union_set_copy(arg0.ptr))
        obj = union_set(ctx=ctx, ptr=res)
        return obj
    def compute_divs(arg0):
        try:
            if not arg0.__class__ is union_set:
                arg0 = union_set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_set_compute_divs(isl.isl_union_set_copy(arg0.ptr))
        obj = union_set(ctx=ctx, ptr=res)
        return obj
    def detect_equalities(arg0):
        try:
            if not arg0.__class__ is union_set:
                arg0 = union_set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_set_detect_equalities(isl.isl_union_set_copy(arg0.ptr))
        obj = union_set(ctx=ctx, ptr=res)
        return obj
    @staticmethod
    def empty(*args):
        if len(args) == 0:
            ctx = Context.getDefaultInstance()
            res = isl.isl_union_set_empty_ctx(ctx)
            obj = union_set(ctx=ctx, ptr=res)
            return obj
        raise Error
    def every_set(arg0, arg1):
        try:
            if not arg0.__class__ is union_set:
                arg0 = union_set(arg0)
        except:
            raise
        exc_info = [None]
        fn = CFUNCTYPE(c_int, c_void_p, c_void_p)
        def cb_func(cb_arg0, cb_arg1):
            cb_arg0 = set(ctx=arg0.ctx, ptr=isl.isl_set_copy(cb_arg0))
            try:
                res = arg1(cb_arg0)
            except BaseException as e:
                exc_info[0] = e
                return -1
            return 1 if res else 0
        cb = fn(cb_func)
        ctx = arg0.ctx
        res = isl.isl_union_set_every_set(arg0.ptr, cb, None)
        if exc_info[0] is not None:
            raise exc_info[0]
        if res < 0:
            raise
        return bool(res)
    def extract_set(arg0, arg1):
        try:
            if not arg0.__class__ is union_set:
                arg0 = union_set(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is space:
                arg1 = space(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_set_extract_set(arg0.ptr, isl.isl_space_copy(arg1.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj
    def foreach_point(arg0, arg1):
        try:
            if not arg0.__class__ is union_set:
                arg0 = union_set(arg0)
        except:
            raise
        exc_info = [None]
        fn = CFUNCTYPE(c_int, c_void_p, c_void_p)
        def cb_func(cb_arg0, cb_arg1):
            cb_arg0 = point(ctx=arg0.ctx, ptr=(cb_arg0))
            try:
                arg1(cb_arg0)
            except BaseException as e:
                exc_info[0] = e
                return -1
            return 0
        cb = fn(cb_func)
        ctx = arg0.ctx
        res = isl.isl_union_set_foreach_point(arg0.ptr, cb, None)
        if exc_info[0] is not None:
            raise exc_info[0]
        if res < 0:
            raise
    def foreach_set(arg0, arg1):
        try:
            if not arg0.__class__ is union_set:
                arg0 = union_set(arg0)
        except:
            raise
        exc_info = [None]
        fn = CFUNCTYPE(c_int, c_void_p, c_void_p)
        def cb_func(cb_arg0, cb_arg1):
            cb_arg0 = set(ctx=arg0.ctx, ptr=(cb_arg0))
            try:
                arg1(cb_arg0)
            except BaseException as e:
                exc_info[0] = e
                return -1
            return 0
        cb = fn(cb_func)
        ctx = arg0.ctx
        res = isl.isl_union_set_foreach_set(arg0.ptr, cb, None)
        if exc_info[0] is not None:
            raise exc_info[0]
        if res < 0:
            raise
    def gist(arg0, arg1):
        try:
            if not arg0.__class__ is union_set:
                arg0 = union_set(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_set:
                arg1 = union_set(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_set_gist(isl.isl_union_set_copy(arg0.ptr), isl.isl_union_set_copy(arg1.ptr))
        obj = union_set(ctx=ctx, ptr=res)
        return obj
    def gist_params(arg0, arg1):
        try:
            if not arg0.__class__ is union_set:
                arg0 = union_set(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_set_gist_params(isl.isl_union_set_copy(arg0.ptr), isl.isl_set_copy(arg1.ptr))
        obj = union_set(ctx=ctx, ptr=res)
        return obj
    def identity(arg0):
        try:
            if not arg0.__class__ is union_set:
                arg0 = union_set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_set_identity(isl.isl_union_set_copy(arg0.ptr))
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def intersect(arg0, arg1):
        try:
            if not arg0.__class__ is union_set:
                arg0 = union_set(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_set:
                arg1 = union_set(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_set_intersect(isl.isl_union_set_copy(arg0.ptr), isl.isl_union_set_copy(arg1.ptr))
        obj = union_set(ctx=ctx, ptr=res)
        return obj
    def intersect_params(arg0, arg1):
        try:
            if not arg0.__class__ is union_set:
                arg0 = union_set(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_set_intersect_params(isl.isl_union_set_copy(arg0.ptr), isl.isl_set_copy(arg1.ptr))
        obj = union_set(ctx=ctx, ptr=res)
        return obj
    def is_disjoint(arg0, arg1):
        try:
            if not arg0.__class__ is union_set:
                arg0 = union_set(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_set:
                arg1 = union_set(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_set_is_disjoint(arg0.ptr, arg1.ptr)
        if res < 0:
            raise
        return bool(res)
    def is_empty(arg0):
        try:
            if not arg0.__class__ is union_set:
                arg0 = union_set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_set_is_empty(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def is_equal(arg0, arg1):
        try:
            if not arg0.__class__ is union_set:
                arg0 = union_set(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_set:
                arg1 = union_set(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_set_is_equal(arg0.ptr, arg1.ptr)
        if res < 0:
            raise
        return bool(res)
    def is_strict_subset(arg0, arg1):
        try:
            if not arg0.__class__ is union_set:
                arg0 = union_set(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_set:
                arg1 = union_set(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_set_is_strict_subset(arg0.ptr, arg1.ptr)
        if res < 0:
            raise
        return bool(res)
    def is_subset(arg0, arg1):
        try:
            if not arg0.__class__ is union_set:
                arg0 = union_set(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_set:
                arg1 = union_set(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_set_is_subset(arg0.ptr, arg1.ptr)
        if res < 0:
            raise
        return bool(res)
    def isa_set(arg0):
        try:
            if not arg0.__class__ is union_set:
                arg0 = union_set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_set_isa_set(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def lexmax(arg0):
        try:
            if not arg0.__class__ is union_set:
                arg0 = union_set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_set_lexmax(isl.isl_union_set_copy(arg0.ptr))
        obj = union_set(ctx=ctx, ptr=res)
        return obj
    def lexmin(arg0):
        try:
            if not arg0.__class__ is union_set:
                arg0 = union_set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_set_lexmin(isl.isl_union_set_copy(arg0.ptr))
        obj = union_set(ctx=ctx, ptr=res)
        return obj
    def polyhedral_hull(arg0):
        try:
            if not arg0.__class__ is union_set:
                arg0 = union_set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_set_polyhedral_hull(isl.isl_union_set_copy(arg0.ptr))
        obj = union_set(ctx=ctx, ptr=res)
        return obj
    def preimage(*args):
        if len(args) == 2 and args[1].__class__ is multi_aff:
            ctx = args[0].ctx
            res = isl.isl_union_set_preimage_multi_aff(isl.isl_union_set_copy(args[0].ptr), isl.isl_multi_aff_copy(args[1].ptr))
            obj = union_set(ctx=ctx, ptr=res)
            return obj
        if len(args) == 2 and args[1].__class__ is pw_multi_aff:
            ctx = args[0].ctx
            res = isl.isl_union_set_preimage_pw_multi_aff(isl.isl_union_set_copy(args[0].ptr), isl.isl_pw_multi_aff_copy(args[1].ptr))
            obj = union_set(ctx=ctx, ptr=res)
            return obj
        if len(args) == 2 and args[1].__class__ is union_pw_multi_aff:
            ctx = args[0].ctx
            res = isl.isl_union_set_preimage_union_pw_multi_aff(isl.isl_union_set_copy(args[0].ptr), isl.isl_union_pw_multi_aff_copy(args[1].ptr))
            obj = union_set(ctx=ctx, ptr=res)
            return obj
        raise Error
    def sample_point(arg0):
        try:
            if not arg0.__class__ is union_set:
                arg0 = union_set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_set_sample_point(isl.isl_union_set_copy(arg0.ptr))
        obj = point(ctx=ctx, ptr=res)
        return obj
    def set_list(arg0):
        try:
            if not arg0.__class__ is union_set:
                arg0 = union_set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_set_get_set_list(arg0.ptr)
        obj = set_list(ctx=ctx, ptr=res)
        return obj
    def get_set_list(arg0):
        return arg0.set_list()
    def space(arg0):
        try:
            if not arg0.__class__ is union_set:
                arg0 = union_set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_set_get_space(arg0.ptr)
        obj = space(ctx=ctx, ptr=res)
        return obj
    def get_space(arg0):
        return arg0.space()
    def subtract(arg0, arg1):
        try:
            if not arg0.__class__ is union_set:
                arg0 = union_set(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_set:
                arg1 = union_set(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_set_subtract(isl.isl_union_set_copy(arg0.ptr), isl.isl_union_set_copy(arg1.ptr))
        obj = union_set(ctx=ctx, ptr=res)
        return obj
    def to_list(arg0):
        try:
            if not arg0.__class__ is union_set:
                arg0 = union_set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_set_to_list(isl.isl_union_set_copy(arg0.ptr))
        obj = union_set_list(ctx=ctx, ptr=res)
        return obj
    def union(arg0, arg1):
        try:
            if not arg0.__class__ is union_set:
                arg0 = union_set(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_set:
                arg1 = union_set(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_set_union(isl.isl_union_set_copy(arg0.ptr), isl.isl_union_set_copy(arg1.ptr))
        obj = union_set(ctx=ctx, ptr=res)
        return obj
    def universe(arg0):
        try:
            if not arg0.__class__ is union_set:
                arg0 = union_set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_set_universe(isl.isl_union_set_copy(arg0.ptr))
        obj = union_set(ctx=ctx, ptr=res)
        return obj
    def unwrap(arg0):
        try:
            if not arg0.__class__ is union_set:
                arg0 = union_set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_set_unwrap(isl.isl_union_set_copy(arg0.ptr))
        obj = union_map(ctx=ctx, ptr=res)
        return obj

isl.isl_union_set_from_basic_set.restype = c_void_p
isl.isl_union_set_from_basic_set.argtypes = [c_void_p]
isl.isl_union_set_from_point.restype = c_void_p
isl.isl_union_set_from_point.argtypes = [c_void_p]
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_affine_hull.restype = c_void_p
isl.isl_union_set_affine_hull.argtypes = [c_void_p]
isl.isl_union_set_apply.restype = c_void_p
isl.isl_union_set_apply.argtypes = [c_void_p, c_void_p]
isl.isl_union_set_as_set.restype = c_void_p
isl.isl_union_set_as_set.argtypes = [c_void_p]
isl.isl_union_set_coalesce.restype = c_void_p
isl.isl_union_set_coalesce.argtypes = [c_void_p]
isl.isl_union_set_compute_divs.restype = c_void_p
isl.isl_union_set_compute_divs.argtypes = [c_void_p]
isl.isl_union_set_detect_equalities.restype = c_void_p
isl.isl_union_set_detect_equalities.argtypes = [c_void_p]
isl.isl_union_set_empty_ctx.restype = c_void_p
isl.isl_union_set_empty_ctx.argtypes = [Context]
isl.isl_union_set_every_set.argtypes = [c_void_p, c_void_p, c_void_p]
isl.isl_union_set_extract_set.restype = c_void_p
isl.isl_union_set_extract_set.argtypes = [c_void_p, c_void_p]
isl.isl_union_set_foreach_point.argtypes = [c_void_p, c_void_p, c_void_p]
isl.isl_union_set_foreach_set.argtypes = [c_void_p, c_void_p, c_void_p]
isl.isl_union_set_gist.restype = c_void_p
isl.isl_union_set_gist.argtypes = [c_void_p, c_void_p]
isl.isl_union_set_gist_params.restype = c_void_p
isl.isl_union_set_gist_params.argtypes = [c_void_p, c_void_p]
isl.isl_union_set_identity.restype = c_void_p
isl.isl_union_set_identity.argtypes = [c_void_p]
isl.isl_union_set_intersect.restype = c_void_p
isl.isl_union_set_intersect.argtypes = [c_void_p, c_void_p]
isl.isl_union_set_intersect_params.restype = c_void_p
isl.isl_union_set_intersect_params.argtypes = [c_void_p, c_void_p]
isl.isl_union_set_is_disjoint.argtypes = [c_void_p, c_void_p]
isl.isl_union_set_is_empty.argtypes = [c_void_p]
isl.isl_union_set_is_equal.argtypes = [c_void_p, c_void_p]
isl.isl_union_set_is_strict_subset.argtypes = [c_void_p, c_void_p]
isl.isl_union_set_is_subset.argtypes = [c_void_p, c_void_p]
isl.isl_union_set_isa_set.argtypes = [c_void_p]
isl.isl_union_set_lexmax.restype = c_void_p
isl.isl_union_set_lexmax.argtypes = [c_void_p]
isl.isl_union_set_lexmin.restype = c_void_p
isl.isl_union_set_lexmin.argtypes = [c_void_p]
isl.isl_union_set_polyhedral_hull.restype = c_void_p
isl.isl_union_set_polyhedral_hull.argtypes = [c_void_p]
isl.isl_union_set_preimage_multi_aff.restype = c_void_p
isl.isl_union_set_preimage_multi_aff.argtypes = [c_void_p, c_void_p]
isl.isl_union_set_preimage_pw_multi_aff.restype = c_void_p
isl.isl_union_set_preimage_pw_multi_aff.argtypes = [c_void_p, c_void_p]
isl.isl_union_set_preimage_union_pw_multi_aff.restype = c_void_p
isl.isl_union_set_preimage_union_pw_multi_aff.argtypes = [c_void_p, c_void_p]
isl.isl_union_set_sample_point.restype = c_void_p
isl.isl_union_set_sample_point.argtypes = [c_void_p]
isl.isl_union_set_get_set_list.restype = c_void_p
isl.isl_union_set_get_set_list.argtypes = [c_void_p]
isl.isl_union_set_get_space.restype = c_void_p
isl.isl_union_set_get_space.argtypes = [c_void_p]
isl.isl_union_set_subtract.restype = c_void_p
isl.isl_union_set_subtract.argtypes = [c_void_p, c_void_p]
isl.isl_union_set_to_list.restype = c_void_p
isl.isl_union_set_to_list.argtypes = [c_void_p]
isl.isl_union_set_union.restype = c_void_p
isl.isl_union_set_union.argtypes = [c_void_p, c_void_p]
isl.isl_union_set_universe.restype = c_void_p
isl.isl_union_set_universe.argtypes = [c_void_p]
isl.isl_union_set_unwrap.restype = c_void_p
isl.isl_union_set_unwrap.argtypes = [c_void_p]
isl.isl_union_set_copy.restype = c_void_p
isl.isl_union_set_copy.argtypes = [c_void_p]
isl.isl_union_set_free.restype = c_void_p
isl.isl_union_set_free.argtypes = [c_void_p]
isl.isl_union_set_to_str.restype = POINTER(c_char)
isl.isl_union_set_to_str.argtypes = [c_void_p]

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 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
        if len(args) == 1 and args[0].__class__ is point:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_set_from_point(isl.isl_point_copy(args[0].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].encode('ascii'))
            return
        raise Error
    def __del__(self):
        if hasattr(self, 'ptr'):
            isl.isl_set_free(self.ptr)
    def __str__(arg0):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        ptr = isl.isl_set_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.set("""%s""")' % s
        else:
            return 'isl.set("%s")' % s
    def affine_hull(arg0):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_set_affine_hull(isl.isl_set_copy(arg0.ptr))
        obj = basic_set(ctx=ctx, ptr=res)
        return obj
    def apply(arg0, arg1):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is map:
                arg1 = map(arg1)
        except:
            return union_set(arg0).apply(arg1)
        ctx = arg0.ctx
        res = isl.isl_set_apply(isl.isl_set_copy(arg0.ptr), isl.isl_map_copy(arg1.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj
    def as_pw_multi_aff(arg0):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_set_as_pw_multi_aff(isl.isl_set_copy(arg0.ptr))
        obj = pw_multi_aff(ctx=ctx, ptr=res)
        return obj
    def bind(arg0, arg1):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_id:
                arg1 = multi_id(arg1)
        except:
            return union_set(arg0).bind(arg1)
        ctx = arg0.ctx
        res = isl.isl_set_bind(isl.isl_set_copy(arg0.ptr), isl.isl_multi_id_copy(arg1.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj
    def coalesce(arg0):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_set_coalesce(isl.isl_set_copy(arg0.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj
    def complement(arg0):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_set_complement(isl.isl_set_copy(arg0.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj
    def detect_equalities(arg0):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_set_detect_equalities(isl.isl_set_copy(arg0.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj
    def dim_max_val(arg0, arg1):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_set_dim_max_val(isl.isl_set_copy(arg0.ptr), arg1)
        obj = val(ctx=ctx, ptr=res)
        return obj
    def dim_min_val(arg0, arg1):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_set_dim_min_val(isl.isl_set_copy(arg0.ptr), arg1)
        obj = val(ctx=ctx, ptr=res)
        return obj
    @staticmethod
    def empty(arg0):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_set_empty(isl.isl_space_copy(arg0.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj
    def flatten(arg0):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_set_flatten(isl.isl_set_copy(arg0.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj
    def foreach_basic_set(arg0, arg1):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        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=arg0.ctx, ptr=(cb_arg0))
            try:
                arg1(cb_arg0)
            except BaseException as e:
                exc_info[0] = e
                return -1
            return 0
        cb = fn(cb_func)
        ctx = arg0.ctx
        res = isl.isl_set_foreach_basic_set(arg0.ptr, cb, None)
        if exc_info[0] is not None:
            raise exc_info[0]
        if res < 0:
            raise
    def foreach_point(arg0, arg1):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        exc_info = [None]
        fn = CFUNCTYPE(c_int, c_void_p, c_void_p)
        def cb_func(cb_arg0, cb_arg1):
            cb_arg0 = point(ctx=arg0.ctx, ptr=(cb_arg0))
            try:
                arg1(cb_arg0)
            except BaseException as e:
                exc_info[0] = e
                return -1
            return 0
        cb = fn(cb_func)
        ctx = arg0.ctx
        res = isl.isl_set_foreach_point(arg0.ptr, cb, None)
        if exc_info[0] is not None:
            raise exc_info[0]
        if res < 0:
            raise
    def gist(arg0, arg1):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            return union_set(arg0).gist(arg1)
        ctx = arg0.ctx
        res = isl.isl_set_gist(isl.isl_set_copy(arg0.ptr), isl.isl_set_copy(arg1.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj
    def identity(arg0):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_set_identity(isl.isl_set_copy(arg0.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def indicator_function(arg0):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_set_indicator_function(isl.isl_set_copy(arg0.ptr))
        obj = pw_aff(ctx=ctx, ptr=res)
        return obj
    def insert_domain(arg0, arg1):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is space:
                arg1 = space(arg1)
        except:
            return union_set(arg0).insert_domain(arg1)
        ctx = arg0.ctx
        res = isl.isl_set_insert_domain(isl.isl_set_copy(arg0.ptr), isl.isl_space_copy(arg1.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def intersect(arg0, arg1):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            return union_set(arg0).intersect(arg1)
        ctx = arg0.ctx
        res = isl.isl_set_intersect(isl.isl_set_copy(arg0.ptr), isl.isl_set_copy(arg1.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj
    def intersect_params(arg0, arg1):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            return union_set(arg0).intersect_params(arg1)
        ctx = arg0.ctx
        res = isl.isl_set_intersect_params(isl.isl_set_copy(arg0.ptr), isl.isl_set_copy(arg1.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj
    def involves_locals(arg0):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_set_involves_locals(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def is_disjoint(arg0, arg1):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            return union_set(arg0).is_disjoint(arg1)
        ctx = arg0.ctx
        res = isl.isl_set_is_disjoint(arg0.ptr, arg1.ptr)
        if res < 0:
            raise
        return bool(res)
    def is_empty(arg0):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_set_is_empty(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def is_equal(arg0, arg1):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            return union_set(arg0).is_equal(arg1)
        ctx = arg0.ctx
        res = isl.isl_set_is_equal(arg0.ptr, arg1.ptr)
        if res < 0:
            raise
        return bool(res)
    def is_singleton(arg0):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_set_is_singleton(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def is_strict_subset(arg0, arg1):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            return union_set(arg0).is_strict_subset(arg1)
        ctx = arg0.ctx
        res = isl.isl_set_is_strict_subset(arg0.ptr, arg1.ptr)
        if res < 0:
            raise
        return bool(res)
    def is_subset(arg0, arg1):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            return union_set(arg0).is_subset(arg1)
        ctx = arg0.ctx
        res = isl.isl_set_is_subset(arg0.ptr, arg1.ptr)
        if res < 0:
            raise
        return bool(res)
    def is_wrapping(arg0):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_set_is_wrapping(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def lexmax(arg0):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_set_lexmax(isl.isl_set_copy(arg0.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj
    def lexmax_pw_multi_aff(arg0):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_set_lexmax_pw_multi_aff(isl.isl_set_copy(arg0.ptr))
        obj = pw_multi_aff(ctx=ctx, ptr=res)
        return obj
    def lexmin(arg0):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_set_lexmin(isl.isl_set_copy(arg0.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj
    def lexmin_pw_multi_aff(arg0):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_set_lexmin_pw_multi_aff(isl.isl_set_copy(arg0.ptr))
        obj = pw_multi_aff(ctx=ctx, ptr=res)
        return obj
    def lower_bound(*args):
        if len(args) == 2 and args[1].__class__ is multi_pw_aff:
            ctx = args[0].ctx
            res = isl.isl_set_lower_bound_multi_pw_aff(isl.isl_set_copy(args[0].ptr), isl.isl_multi_pw_aff_copy(args[1].ptr))
            obj = set(ctx=ctx, ptr=res)
            return obj
        if len(args) == 2 and args[1].__class__ is multi_val:
            ctx = args[0].ctx
            res = isl.isl_set_lower_bound_multi_val(isl.isl_set_copy(args[0].ptr), isl.isl_multi_val_copy(args[1].ptr))
            obj = set(ctx=ctx, ptr=res)
            return obj
        raise Error
    def max_multi_pw_aff(arg0):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_set_max_multi_pw_aff(isl.isl_set_copy(arg0.ptr))
        obj = multi_pw_aff(ctx=ctx, ptr=res)
        return obj
    def max_val(arg0, arg1):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is aff:
                arg1 = aff(arg1)
        except:
            return union_set(arg0).max_val(arg1)
        ctx = arg0.ctx
        res = isl.isl_set_max_val(arg0.ptr, arg1.ptr)
        obj = val(ctx=ctx, ptr=res)
        return obj
    def min_multi_pw_aff(arg0):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_set_min_multi_pw_aff(isl.isl_set_copy(arg0.ptr))
        obj = multi_pw_aff(ctx=ctx, ptr=res)
        return obj
    def min_val(arg0, arg1):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is aff:
                arg1 = aff(arg1)
        except:
            return union_set(arg0).min_val(arg1)
        ctx = arg0.ctx
        res = isl.isl_set_min_val(arg0.ptr, arg1.ptr)
        obj = val(ctx=ctx, ptr=res)
        return obj
    def n_basic_set(arg0):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_set_n_basic_set(arg0.ptr)
        if res < 0:
            raise
        return int(res)
    def params(arg0):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_set_params(isl.isl_set_copy(arg0.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj
    def plain_multi_val_if_fixed(arg0):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_set_get_plain_multi_val_if_fixed(arg0.ptr)
        obj = multi_val(ctx=ctx, ptr=res)
        return obj
    def get_plain_multi_val_if_fixed(arg0):
        return arg0.plain_multi_val_if_fixed()
    def polyhedral_hull(arg0):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_set_polyhedral_hull(isl.isl_set_copy(arg0.ptr))
        obj = basic_set(ctx=ctx, ptr=res)
        return obj
    def preimage(*args):
        if len(args) == 2 and args[1].__class__ is multi_aff:
            ctx = args[0].ctx
            res = isl.isl_set_preimage_multi_aff(isl.isl_set_copy(args[0].ptr), isl.isl_multi_aff_copy(args[1].ptr))
            obj = set(ctx=ctx, ptr=res)
            return obj
        if len(args) == 2 and args[1].__class__ is multi_pw_aff:
            ctx = args[0].ctx
            res = isl.isl_set_preimage_multi_pw_aff(isl.isl_set_copy(args[0].ptr), isl.isl_multi_pw_aff_copy(args[1].ptr))
            obj = set(ctx=ctx, ptr=res)
            return obj
        if len(args) == 2 and args[1].__class__ is pw_multi_aff:
            ctx = args[0].ctx
            res = isl.isl_set_preimage_pw_multi_aff(isl.isl_set_copy(args[0].ptr), isl.isl_pw_multi_aff_copy(args[1].ptr))
            obj = set(ctx=ctx, ptr=res)
            return obj
        raise Error
    def product(arg0, arg1):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            return union_set(arg0).product(arg1)
        ctx = arg0.ctx
        res = isl.isl_set_product(isl.isl_set_copy(arg0.ptr), isl.isl_set_copy(arg1.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj
    def project_out_all_params(arg0):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_set_project_out_all_params(isl.isl_set_copy(arg0.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj
    def project_out_param(*args):
        if len(args) == 2 and (args[1].__class__ is id or type(args[1]) == str):
            args = list(args)
            try:
                if not args[1].__class__ is id:
                    args[1] = id(args[1])
            except:
                raise
            ctx = args[0].ctx
            res = isl.isl_set_project_out_param_id(isl.isl_set_copy(args[0].ptr), isl.isl_id_copy(args[1].ptr))
            obj = set(ctx=ctx, ptr=res)
            return obj
        if len(args) == 2 and args[1].__class__ is id_list:
            ctx = args[0].ctx
            res = isl.isl_set_project_out_param_id_list(isl.isl_set_copy(args[0].ptr), isl.isl_id_list_copy(args[1].ptr))
            obj = set(ctx=ctx, ptr=res)
            return obj
        raise Error
    def pw_multi_aff_on_domain(*args):
        if len(args) == 2 and args[1].__class__ is multi_val:
            ctx = args[0].ctx
            res = isl.isl_set_pw_multi_aff_on_domain_multi_val(isl.isl_set_copy(args[0].ptr), isl.isl_multi_val_copy(args[1].ptr))
            obj = pw_multi_aff(ctx=ctx, ptr=res)
            return obj
        raise Error
    def sample(arg0):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_set_sample(isl.isl_set_copy(arg0.ptr))
        obj = basic_set(ctx=ctx, ptr=res)
        return obj
    def sample_point(arg0):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_set_sample_point(isl.isl_set_copy(arg0.ptr))
        obj = point(ctx=ctx, ptr=res)
        return obj
    def simple_fixed_box_hull(arg0):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_set_get_simple_fixed_box_hull(arg0.ptr)
        obj = fixed_box(ctx=ctx, ptr=res)
        return obj
    def get_simple_fixed_box_hull(arg0):
        return arg0.simple_fixed_box_hull()
    def space(arg0):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_set_get_space(arg0.ptr)
        obj = space(ctx=ctx, ptr=res)
        return obj
    def get_space(arg0):
        return arg0.space()
    def stride(arg0, arg1):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_set_get_stride(arg0.ptr, arg1)
        obj = val(ctx=ctx, ptr=res)
        return obj
    def get_stride(arg0, arg1):
        return arg0.stride(arg1)
    def subtract(arg0, arg1):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            return union_set(arg0).subtract(arg1)
        ctx = arg0.ctx
        res = isl.isl_set_subtract(isl.isl_set_copy(arg0.ptr), isl.isl_set_copy(arg1.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj
    def to_list(arg0):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_set_to_list(isl.isl_set_copy(arg0.ptr))
        obj = set_list(ctx=ctx, ptr=res)
        return obj
    def to_union_set(arg0):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_set_to_union_set(isl.isl_set_copy(arg0.ptr))
        obj = union_set(ctx=ctx, ptr=res)
        return obj
    def translation(arg0):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_set_translation(isl.isl_set_copy(arg0.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def tuple_dim(arg0):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_set_tuple_dim(arg0.ptr)
        if res < 0:
            raise
        return int(res)
    def unbind_params(arg0, arg1):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_id:
                arg1 = multi_id(arg1)
        except:
            return union_set(arg0).unbind_params(arg1)
        ctx = arg0.ctx
        res = isl.isl_set_unbind_params(isl.isl_set_copy(arg0.ptr), isl.isl_multi_id_copy(arg1.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj
    def unbind_params_insert_domain(arg0, arg1):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_id:
                arg1 = multi_id(arg1)
        except:
            return union_set(arg0).unbind_params_insert_domain(arg1)
        ctx = arg0.ctx
        res = isl.isl_set_unbind_params_insert_domain(isl.isl_set_copy(arg0.ptr), isl.isl_multi_id_copy(arg1.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def union(arg0, arg1):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            return union_set(arg0).union(arg1)
        ctx = arg0.ctx
        res = isl.isl_set_union(isl.isl_set_copy(arg0.ptr), isl.isl_set_copy(arg1.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj
    @staticmethod
    def universe(arg0):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_set_universe(isl.isl_space_copy(arg0.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj
    def unshifted_simple_hull(arg0):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_set_unshifted_simple_hull(isl.isl_set_copy(arg0.ptr))
        obj = basic_set(ctx=ctx, ptr=res)
        return obj
    def unwrap(arg0):
        try:
            if not arg0.__class__ is set:
                arg0 = set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_set_unwrap(isl.isl_set_copy(arg0.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def upper_bound(*args):
        if len(args) == 2 and args[1].__class__ is multi_pw_aff:
            ctx = args[0].ctx
            res = isl.isl_set_upper_bound_multi_pw_aff(isl.isl_set_copy(args[0].ptr), isl.isl_multi_pw_aff_copy(args[1].ptr))
            obj = set(ctx=ctx, ptr=res)
            return obj
        if len(args) == 2 and args[1].__class__ is multi_val:
            ctx = args[0].ctx
            res = isl.isl_set_upper_bound_multi_val(isl.isl_set_copy(args[0].ptr), isl.isl_multi_val_copy(args[1].ptr))
            obj = set(ctx=ctx, ptr=res)
            return obj
        raise Error

isl.isl_set_from_basic_set.restype = c_void_p
isl.isl_set_from_basic_set.argtypes = [c_void_p]
isl.isl_set_from_point.restype = c_void_p
isl.isl_set_from_point.argtypes = [c_void_p]
isl.isl_set_read_from_str.restype = c_void_p
isl.isl_set_read_from_str.argtypes = [Context, c_char_p]
isl.isl_set_affine_hull.restype = c_void_p
isl.isl_set_affine_hull.argtypes = [c_void_p]
isl.isl_set_apply.restype = c_void_p
isl.isl_set_apply.argtypes = [c_void_p, c_void_p]
isl.isl_set_as_pw_multi_aff.restype = c_void_p
isl.isl_set_as_pw_multi_aff.argtypes = [c_void_p]
isl.isl_set_bind.restype = c_void_p
isl.isl_set_bind.argtypes = [c_void_p, c_void_p]
isl.isl_set_coalesce.restype = c_void_p
isl.isl_set_coalesce.argtypes = [c_void_p]
isl.isl_set_complement.restype = c_void_p
isl.isl_set_complement.argtypes = [c_void_p]
isl.isl_set_detect_equalities.restype = c_void_p
isl.isl_set_detect_equalities.argtypes = [c_void_p]
isl.isl_set_dim_max_val.restype = c_void_p
isl.isl_set_dim_max_val.argtypes = [c_void_p, c_int]
isl.isl_set_dim_min_val.restype = c_void_p
isl.isl_set_dim_min_val.argtypes = [c_void_p, c_int]
isl.isl_set_empty.restype = c_void_p
isl.isl_set_empty.argtypes = [c_void_p]
isl.isl_set_flatten.restype = c_void_p
isl.isl_set_flatten.argtypes = [c_void_p]
isl.isl_set_foreach_basic_set.argtypes = [c_void_p, c_void_p, c_void_p]
isl.isl_set_foreach_point.argtypes = [c_void_p, c_void_p, c_void_p]
isl.isl_set_gist.restype = c_void_p
isl.isl_set_gist.argtypes = [c_void_p, c_void_p]
isl.isl_set_identity.restype = c_void_p
isl.isl_set_identity.argtypes = [c_void_p]
isl.isl_set_indicator_function.restype = c_void_p
isl.isl_set_indicator_function.argtypes = [c_void_p]
isl.isl_set_insert_domain.restype = c_void_p
isl.isl_set_insert_domain.argtypes = [c_void_p, c_void_p]
isl.isl_set_intersect.restype = c_void_p
isl.isl_set_intersect.argtypes = [c_void_p, c_void_p]
isl.isl_set_intersect_params.restype = c_void_p
isl.isl_set_intersect_params.argtypes = [c_void_p, c_void_p]
isl.isl_set_involves_locals.argtypes = [c_void_p]
isl.isl_set_is_disjoint.argtypes = [c_void_p, c_void_p]
isl.isl_set_is_empty.argtypes = [c_void_p]
isl.isl_set_is_equal.argtypes = [c_void_p, c_void_p]
isl.isl_set_is_singleton.argtypes = [c_void_p]
isl.isl_set_is_strict_subset.argtypes = [c_void_p, c_void_p]
isl.isl_set_is_subset.argtypes = [c_void_p, c_void_p]
isl.isl_set_is_wrapping.argtypes = [c_void_p]
isl.isl_set_lexmax.restype = c_void_p
isl.isl_set_lexmax.argtypes = [c_void_p]
isl.isl_set_lexmax_pw_multi_aff.restype = c_void_p
isl.isl_set_lexmax_pw_multi_aff.argtypes = [c_void_p]
isl.isl_set_lexmin.restype = c_void_p
isl.isl_set_lexmin.argtypes = [c_void_p]
isl.isl_set_lexmin_pw_multi_aff.restype = c_void_p
isl.isl_set_lexmin_pw_multi_aff.argtypes = [c_void_p]
isl.isl_set_lower_bound_multi_pw_aff.restype = c_void_p
isl.isl_set_lower_bound_multi_pw_aff.argtypes = [c_void_p, c_void_p]
isl.isl_set_lower_bound_multi_val.restype = c_void_p
isl.isl_set_lower_bound_multi_val.argtypes = [c_void_p, c_void_p]
isl.isl_set_max_multi_pw_aff.restype = c_void_p
isl.isl_set_max_multi_pw_aff.argtypes = [c_void_p]
isl.isl_set_max_val.restype = c_void_p
isl.isl_set_max_val.argtypes = [c_void_p, c_void_p]
isl.isl_set_min_multi_pw_aff.restype = c_void_p
isl.isl_set_min_multi_pw_aff.argtypes = [c_void_p]
isl.isl_set_min_val.restype = c_void_p
isl.isl_set_min_val.argtypes = [c_void_p, c_void_p]
isl.isl_set_n_basic_set.argtypes = [c_void_p]
isl.isl_set_params.restype = c_void_p
isl.isl_set_params.argtypes = [c_void_p]
isl.isl_set_get_plain_multi_val_if_fixed.restype = c_void_p
isl.isl_set_get_plain_multi_val_if_fixed.argtypes = [c_void_p]
isl.isl_set_polyhedral_hull.restype = c_void_p
isl.isl_set_polyhedral_hull.argtypes = [c_void_p]
isl.isl_set_preimage_multi_aff.restype = c_void_p
isl.isl_set_preimage_multi_aff.argtypes = [c_void_p, c_void_p]
isl.isl_set_preimage_multi_pw_aff.restype = c_void_p
isl.isl_set_preimage_multi_pw_aff.argtypes = [c_void_p, c_void_p]
isl.isl_set_preimage_pw_multi_aff.restype = c_void_p
isl.isl_set_preimage_pw_multi_aff.argtypes = [c_void_p, c_void_p]
isl.isl_set_product.restype = c_void_p
isl.isl_set_product.argtypes = [c_void_p, c_void_p]
isl.isl_set_project_out_all_params.restype = c_void_p
isl.isl_set_project_out_all_params.argtypes = [c_void_p]
isl.isl_set_project_out_param_id.restype = c_void_p
isl.isl_set_project_out_param_id.argtypes = [c_void_p, c_void_p]
isl.isl_set_project_out_param_id_list.restype = c_void_p
isl.isl_set_project_out_param_id_list.argtypes = [c_void_p, c_void_p]
isl.isl_set_pw_multi_aff_on_domain_multi_val.restype = c_void_p
isl.isl_set_pw_multi_aff_on_domain_multi_val.argtypes = [c_void_p, c_void_p]
isl.isl_set_sample.restype = c_void_p
isl.isl_set_sample.argtypes = [c_void_p]
isl.isl_set_sample_point.restype = c_void_p
isl.isl_set_sample_point.argtypes = [c_void_p]
isl.isl_set_get_simple_fixed_box_hull.restype = c_void_p
isl.isl_set_get_simple_fixed_box_hull.argtypes = [c_void_p]
isl.isl_set_get_space.restype = c_void_p
isl.isl_set_get_space.argtypes = [c_void_p]
isl.isl_set_get_stride.restype = c_void_p
isl.isl_set_get_stride.argtypes = [c_void_p, c_int]
isl.isl_set_subtract.restype = c_void_p
isl.isl_set_subtract.argtypes = [c_void_p, c_void_p]
isl.isl_set_to_list.restype = c_void_p
isl.isl_set_to_list.argtypes = [c_void_p]
isl.isl_set_to_union_set.restype = c_void_p
isl.isl_set_to_union_set.argtypes = [c_void_p]
isl.isl_set_translation.restype = c_void_p
isl.isl_set_translation.argtypes = [c_void_p]
isl.isl_set_tuple_dim.argtypes = [c_void_p]
isl.isl_set_unbind_params.restype = c_void_p
isl.isl_set_unbind_params.argtypes = [c_void_p, c_void_p]
isl.isl_set_unbind_params_insert_domain.restype = c_void_p
isl.isl_set_unbind_params_insert_domain.argtypes = [c_void_p, c_void_p]
isl.isl_set_union.restype = c_void_p
isl.isl_set_union.argtypes = [c_void_p, c_void_p]
isl.isl_set_universe.restype = c_void_p
isl.isl_set_universe.argtypes = [c_void_p]
isl.isl_set_unshifted_simple_hull.restype = c_void_p
isl.isl_set_unshifted_simple_hull.argtypes = [c_void_p]
isl.isl_set_unwrap.restype = c_void_p
isl.isl_set_unwrap.argtypes = [c_void_p]
isl.isl_set_upper_bound_multi_pw_aff.restype = c_void_p
isl.isl_set_upper_bound_multi_pw_aff.argtypes = [c_void_p, c_void_p]
isl.isl_set_upper_bound_multi_val.restype = c_void_p
isl.isl_set_upper_bound_multi_val.argtypes = [c_void_p, c_void_p]
isl.isl_set_copy.restype = c_void_p
isl.isl_set_copy.argtypes = [c_void_p]
isl.isl_set_free.restype = c_void_p
isl.isl_set_free.argtypes = [c_void_p]
isl.isl_set_to_str.restype = POINTER(c_char)
isl.isl_set_to_str.argtypes = [c_void_p]

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 args[0].__class__ is point:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_basic_set_from_point(isl.isl_point_copy(args[0].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].encode('ascii'))
            return
        raise Error
    def __del__(self):
        if hasattr(self, 'ptr'):
            isl.isl_basic_set_free(self.ptr)
    def __str__(arg0):
        try:
            if not arg0.__class__ is basic_set:
                arg0 = basic_set(arg0)
        except:
            raise
        ptr = isl.isl_basic_set_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.basic_set("""%s""")' % s
        else:
            return 'isl.basic_set("%s")' % s
    def affine_hull(arg0):
        try:
            if not arg0.__class__ is basic_set:
                arg0 = basic_set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_basic_set_affine_hull(isl.isl_basic_set_copy(arg0.ptr))
        obj = basic_set(ctx=ctx, ptr=res)
        return obj
    def apply(arg0, arg1):
        try:
            if not arg0.__class__ is basic_set:
                arg0 = basic_set(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is basic_map:
                arg1 = basic_map(arg1)
        except:
            return set(arg0).apply(arg1)
        ctx = arg0.ctx
        res = isl.isl_basic_set_apply(isl.isl_basic_set_copy(arg0.ptr), isl.isl_basic_map_copy(arg1.ptr))
        obj = basic_set(ctx=ctx, ptr=res)
        return obj
    def detect_equalities(arg0):
        try:
            if not arg0.__class__ is basic_set:
                arg0 = basic_set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_basic_set_detect_equalities(isl.isl_basic_set_copy(arg0.ptr))
        obj = basic_set(ctx=ctx, ptr=res)
        return obj
    def dim_max_val(arg0, arg1):
        try:
            if not arg0.__class__ is basic_set:
                arg0 = basic_set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_basic_set_dim_max_val(isl.isl_basic_set_copy(arg0.ptr), arg1)
        obj = val(ctx=ctx, ptr=res)
        return obj
    def flatten(arg0):
        try:
            if not arg0.__class__ is basic_set:
                arg0 = basic_set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_basic_set_flatten(isl.isl_basic_set_copy(arg0.ptr))
        obj = basic_set(ctx=ctx, ptr=res)
        return obj
    def gist(arg0, arg1):
        try:
            if not arg0.__class__ is basic_set:
                arg0 = basic_set(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is basic_set:
                arg1 = basic_set(arg1)
        except:
            return set(arg0).gist(arg1)
        ctx = arg0.ctx
        res = isl.isl_basic_set_gist(isl.isl_basic_set_copy(arg0.ptr), isl.isl_basic_set_copy(arg1.ptr))
        obj = basic_set(ctx=ctx, ptr=res)
        return obj
    def intersect(arg0, arg1):
        try:
            if not arg0.__class__ is basic_set:
                arg0 = basic_set(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is basic_set:
                arg1 = basic_set(arg1)
        except:
            return set(arg0).intersect(arg1)
        ctx = arg0.ctx
        res = isl.isl_basic_set_intersect(isl.isl_basic_set_copy(arg0.ptr), isl.isl_basic_set_copy(arg1.ptr))
        obj = basic_set(ctx=ctx, ptr=res)
        return obj
    def intersect_params(arg0, arg1):
        try:
            if not arg0.__class__ is basic_set:
                arg0 = basic_set(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is basic_set:
                arg1 = basic_set(arg1)
        except:
            return set(arg0).intersect_params(arg1)
        ctx = arg0.ctx
        res = isl.isl_basic_set_intersect_params(isl.isl_basic_set_copy(arg0.ptr), isl.isl_basic_set_copy(arg1.ptr))
        obj = basic_set(ctx=ctx, ptr=res)
        return obj
    def is_empty(arg0):
        try:
            if not arg0.__class__ is basic_set:
                arg0 = basic_set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_basic_set_is_empty(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def is_equal(arg0, arg1):
        try:
            if not arg0.__class__ is basic_set:
                arg0 = basic_set(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is basic_set:
                arg1 = basic_set(arg1)
        except:
            return set(arg0).is_equal(arg1)
        ctx = arg0.ctx
        res = isl.isl_basic_set_is_equal(arg0.ptr, arg1.ptr)
        if res < 0:
            raise
        return bool(res)
    def is_subset(arg0, arg1):
        try:
            if not arg0.__class__ is basic_set:
                arg0 = basic_set(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is basic_set:
                arg1 = basic_set(arg1)
        except:
            return set(arg0).is_subset(arg1)
        ctx = arg0.ctx
        res = isl.isl_basic_set_is_subset(arg0.ptr, arg1.ptr)
        if res < 0:
            raise
        return bool(res)
    def is_wrapping(arg0):
        try:
            if not arg0.__class__ is basic_set:
                arg0 = basic_set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_basic_set_is_wrapping(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def lexmax(arg0):
        try:
            if not arg0.__class__ is basic_set:
                arg0 = basic_set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_basic_set_lexmax(isl.isl_basic_set_copy(arg0.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj
    def lexmin(arg0):
        try:
            if not arg0.__class__ is basic_set:
                arg0 = basic_set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_basic_set_lexmin(isl.isl_basic_set_copy(arg0.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj
    def params(arg0):
        try:
            if not arg0.__class__ is basic_set:
                arg0 = basic_set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_basic_set_params(isl.isl_basic_set_copy(arg0.ptr))
        obj = basic_set(ctx=ctx, ptr=res)
        return obj
    def sample(arg0):
        try:
            if not arg0.__class__ is basic_set:
                arg0 = basic_set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_basic_set_sample(isl.isl_basic_set_copy(arg0.ptr))
        obj = basic_set(ctx=ctx, ptr=res)
        return obj
    def sample_point(arg0):
        try:
            if not arg0.__class__ is basic_set:
                arg0 = basic_set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_basic_set_sample_point(isl.isl_basic_set_copy(arg0.ptr))
        obj = point(ctx=ctx, ptr=res)
        return obj
    def to_set(arg0):
        try:
            if not arg0.__class__ is basic_set:
                arg0 = basic_set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_basic_set_to_set(isl.isl_basic_set_copy(arg0.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj
    def union(arg0, arg1):
        try:
            if not arg0.__class__ is basic_set:
                arg0 = basic_set(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is basic_set:
                arg1 = basic_set(arg1)
        except:
            return set(arg0).union(arg1)
        ctx = arg0.ctx
        res = isl.isl_basic_set_union(isl.isl_basic_set_copy(arg0.ptr), isl.isl_basic_set_copy(arg1.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj

isl.isl_basic_set_from_point.restype = c_void_p
isl.isl_basic_set_from_point.argtypes = [c_void_p]
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_affine_hull.restype = c_void_p
isl.isl_basic_set_affine_hull.argtypes = [c_void_p]
isl.isl_basic_set_apply.restype = c_void_p
isl.isl_basic_set_apply.argtypes = [c_void_p, c_void_p]
isl.isl_basic_set_detect_equalities.restype = c_void_p
isl.isl_basic_set_detect_equalities.argtypes = [c_void_p]
isl.isl_basic_set_dim_max_val.restype = c_void_p
isl.isl_basic_set_dim_max_val.argtypes = [c_void_p, c_int]
isl.isl_basic_set_flatten.restype = c_void_p
isl.isl_basic_set_flatten.argtypes = [c_void_p]
isl.isl_basic_set_gist.restype = c_void_p
isl.isl_basic_set_gist.argtypes = [c_void_p, c_void_p]
isl.isl_basic_set_intersect.restype = c_void_p
isl.isl_basic_set_intersect.argtypes = [c_void_p, c_void_p]
isl.isl_basic_set_intersect_params.restype = c_void_p
isl.isl_basic_set_intersect_params.argtypes = [c_void_p, c_void_p]
isl.isl_basic_set_is_empty.argtypes = [c_void_p]
isl.isl_basic_set_is_equal.argtypes = [c_void_p, c_void_p]
isl.isl_basic_set_is_subset.argtypes = [c_void_p, c_void_p]
isl.isl_basic_set_is_wrapping.argtypes = [c_void_p]
isl.isl_basic_set_lexmax.restype = c_void_p
isl.isl_basic_set_lexmax.argtypes = [c_void_p]
isl.isl_basic_set_lexmin.restype = c_void_p
isl.isl_basic_set_lexmin.argtypes = [c_void_p]
isl.isl_basic_set_params.restype = c_void_p
isl.isl_basic_set_params.argtypes = [c_void_p]
isl.isl_basic_set_sample.restype = c_void_p
isl.isl_basic_set_sample.argtypes = [c_void_p]
isl.isl_basic_set_sample_point.restype = c_void_p
isl.isl_basic_set_sample_point.argtypes = [c_void_p]
isl.isl_basic_set_to_set.restype = c_void_p
isl.isl_basic_set_to_set.argtypes = [c_void_p]
isl.isl_basic_set_union.restype = c_void_p
isl.isl_basic_set_union.argtypes = [c_void_p, c_void_p]
isl.isl_basic_set_copy.restype = c_void_p
isl.isl_basic_set_copy.argtypes = [c_void_p]
isl.isl_basic_set_free.restype = c_void_p
isl.isl_basic_set_free.argtypes = [c_void_p]
isl.isl_basic_set_to_str.restype = POINTER(c_char)
isl.isl_basic_set_to_str.argtypes = [c_void_p]

class fixed_box(object):
    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_fixed_box_free(self.ptr)
    def __str__(arg0):
        try:
            if not arg0.__class__ is fixed_box:
                arg0 = fixed_box(arg0)
        except:
            raise
        ptr = isl.isl_fixed_box_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.fixed_box("""%s""")' % s
        else:
            return 'isl.fixed_box("%s")' % s
    def is_valid(arg0):
        try:
            if not arg0.__class__ is fixed_box:
                arg0 = fixed_box(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_fixed_box_is_valid(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def offset(arg0):
        try:
            if not arg0.__class__ is fixed_box:
                arg0 = fixed_box(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_fixed_box_get_offset(arg0.ptr)
        obj = multi_aff(ctx=ctx, ptr=res)
        return obj
    def get_offset(arg0):
        return arg0.offset()
    def size(arg0):
        try:
            if not arg0.__class__ is fixed_box:
                arg0 = fixed_box(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_fixed_box_get_size(arg0.ptr)
        obj = multi_val(ctx=ctx, ptr=res)
        return obj
    def get_size(arg0):
        return arg0.size()
    def space(arg0):
        try:
            if not arg0.__class__ is fixed_box:
                arg0 = fixed_box(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_fixed_box_get_space(arg0.ptr)
        obj = space(ctx=ctx, ptr=res)
        return obj
    def get_space(arg0):
        return arg0.space()

isl.isl_fixed_box_is_valid.argtypes = [c_void_p]
isl.isl_fixed_box_get_offset.restype = c_void_p
isl.isl_fixed_box_get_offset.argtypes = [c_void_p]
isl.isl_fixed_box_get_size.restype = c_void_p
isl.isl_fixed_box_get_size.argtypes = [c_void_p]
isl.isl_fixed_box_get_space.restype = c_void_p
isl.isl_fixed_box_get_space.argtypes = [c_void_p]
isl.isl_fixed_box_copy.restype = c_void_p
isl.isl_fixed_box_copy.argtypes = [c_void_p]
isl.isl_fixed_box_free.restype = c_void_p
isl.isl_fixed_box_free.argtypes = [c_void_p]
isl.isl_fixed_box_to_str.restype = POINTER(c_char)
isl.isl_fixed_box_to_str.argtypes = [c_void_p]

class id(object):
    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_id_read_from_str(self.ctx, args[0].encode('ascii'))
            return
        raise Error
    def __del__(self):
        if hasattr(self, 'ptr'):
            isl.isl_id_free(self.ptr)
    def __str__(arg0):
        try:
            if not arg0.__class__ is id:
                arg0 = id(arg0)
        except:
            raise
        ptr = isl.isl_id_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.id("""%s""")' % s
        else:
            return 'isl.id("%s")' % s
    def name(arg0):
        try:
            if not arg0.__class__ is id:
                arg0 = id(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_id_get_name(arg0.ptr)
        if res == 0:
            raise
        string = cast(res, c_char_p).value.decode('ascii')
        return string
    def get_name(arg0):
        return arg0.name()
    def to_list(arg0):
        try:
            if not arg0.__class__ is id:
                arg0 = id(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_id_to_list(isl.isl_id_copy(arg0.ptr))
        obj = id_list(ctx=ctx, ptr=res)
        return obj

isl.isl_id_read_from_str.restype = c_void_p
isl.isl_id_read_from_str.argtypes = [Context, c_char_p]
isl.isl_id_get_name.restype = POINTER(c_char)
isl.isl_id_get_name.argtypes = [c_void_p]
isl.isl_id_to_list.restype = c_void_p
isl.isl_id_to_list.argtypes = [c_void_p]
isl.isl_id_copy.restype = c_void_p
isl.isl_id_copy.argtypes = [c_void_p]
isl.isl_id_free.restype = c_void_p
isl.isl_id_free.argtypes = [c_void_p]
isl.isl_id_to_str.restype = POINTER(c_char)
isl.isl_id_to_str.argtypes = [c_void_p]

class id_list(object):
    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]) == int:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_id_list_alloc(self.ctx, args[0])
            return
        if len(args) == 1 and (args[0].__class__ is id or type(args[0]) == str):
            args = list(args)
            try:
                if not args[0].__class__ is id:
                    args[0] = id(args[0])
            except:
                raise
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_id_list_from_id(isl.isl_id_copy(args[0].ptr))
            return
        if len(args) == 1 and type(args[0]) == str:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_id_list_read_from_str(self.ctx, args[0].encode('ascii'))
            return
        raise Error
    def __del__(self):
        if hasattr(self, 'ptr'):
            isl.isl_id_list_free(self.ptr)
    def __str__(arg0):
        try:
            if not arg0.__class__ is id_list:
                arg0 = id_list(arg0)
        except:
            raise
        ptr = isl.isl_id_list_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.id_list("""%s""")' % s
        else:
            return 'isl.id_list("%s")' % s
    def add(arg0, arg1):
        try:
            if not arg0.__class__ is id_list:
                arg0 = id_list(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is id:
                arg1 = id(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_id_list_add(isl.isl_id_list_copy(arg0.ptr), isl.isl_id_copy(arg1.ptr))
        obj = id_list(ctx=ctx, ptr=res)
        return obj
    def at(arg0, arg1):
        try:
            if not arg0.__class__ is id_list:
                arg0 = id_list(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_id_list_get_at(arg0.ptr, arg1)
        obj = id(ctx=ctx, ptr=res)
        return obj
    def get_at(arg0, arg1):
        return arg0.at(arg1)
    def clear(arg0):
        try:
            if not arg0.__class__ is id_list:
                arg0 = id_list(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_id_list_clear(isl.isl_id_list_copy(arg0.ptr))
        obj = id_list(ctx=ctx, ptr=res)
        return obj
    def concat(arg0, arg1):
        try:
            if not arg0.__class__ is id_list:
                arg0 = id_list(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is id_list:
                arg1 = id_list(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_id_list_concat(isl.isl_id_list_copy(arg0.ptr), isl.isl_id_list_copy(arg1.ptr))
        obj = id_list(ctx=ctx, ptr=res)
        return obj
    def drop(arg0, arg1, arg2):
        try:
            if not arg0.__class__ is id_list:
                arg0 = id_list(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_id_list_drop(isl.isl_id_list_copy(arg0.ptr), arg1, arg2)
        obj = id_list(ctx=ctx, ptr=res)
        return obj
    def foreach(arg0, arg1):
        try:
            if not arg0.__class__ is id_list:
                arg0 = id_list(arg0)
        except:
            raise
        exc_info = [None]
        fn = CFUNCTYPE(c_int, c_void_p, c_void_p)
        def cb_func(cb_arg0, cb_arg1):
            cb_arg0 = id(ctx=arg0.ctx, ptr=(cb_arg0))
            try:
                arg1(cb_arg0)
            except BaseException as e:
                exc_info[0] = e
                return -1
            return 0
        cb = fn(cb_func)
        ctx = arg0.ctx
        res = isl.isl_id_list_foreach(arg0.ptr, cb, None)
        if exc_info[0] is not None:
            raise exc_info[0]
        if res < 0:
            raise
    def insert(arg0, arg1, arg2):
        try:
            if not arg0.__class__ is id_list:
                arg0 = id_list(arg0)
        except:
            raise
        try:
            if not arg2.__class__ is id:
                arg2 = id(arg2)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_id_list_insert(isl.isl_id_list_copy(arg0.ptr), arg1, isl.isl_id_copy(arg2.ptr))
        obj = id_list(ctx=ctx, ptr=res)
        return obj
    def size(arg0):
        try:
            if not arg0.__class__ is id_list:
                arg0 = id_list(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_id_list_size(arg0.ptr)
        if res < 0:
            raise
        return int(res)

isl.isl_id_list_alloc.restype = c_void_p
isl.isl_id_list_alloc.argtypes = [Context, c_int]
isl.isl_id_list_from_id.restype = c_void_p
isl.isl_id_list_from_id.argtypes = [c_void_p]
isl.isl_id_list_read_from_str.restype = c_void_p
isl.isl_id_list_read_from_str.argtypes = [Context, c_char_p]
isl.isl_id_list_add.restype = c_void_p
isl.isl_id_list_add.argtypes = [c_void_p, c_void_p]
isl.isl_id_list_get_at.restype = c_void_p
isl.isl_id_list_get_at.argtypes = [c_void_p, c_int]
isl.isl_id_list_clear.restype = c_void_p
isl.isl_id_list_clear.argtypes = [c_void_p]
isl.isl_id_list_concat.restype = c_void_p
isl.isl_id_list_concat.argtypes = [c_void_p, c_void_p]
isl.isl_id_list_drop.restype = c_void_p
isl.isl_id_list_drop.argtypes = [c_void_p, c_int, c_int]
isl.isl_id_list_foreach.argtypes = [c_void_p, c_void_p, c_void_p]
isl.isl_id_list_insert.restype = c_void_p
isl.isl_id_list_insert.argtypes = [c_void_p, c_int, c_void_p]
isl.isl_id_list_size.argtypes = [c_void_p]
isl.isl_id_list_copy.restype = c_void_p
isl.isl_id_list_copy.argtypes = [c_void_p]
isl.isl_id_list_free.restype = c_void_p
isl.isl_id_list_free.argtypes = [c_void_p]
isl.isl_id_list_to_str.restype = POINTER(c_char)
isl.isl_id_list_to_str.argtypes = [c_void_p]

class map_list(object):
    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]) == int:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_map_list_alloc(self.ctx, args[0])
            return
        if len(args) == 1 and args[0].__class__ is map:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_map_list_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_map_list_read_from_str(self.ctx, args[0].encode('ascii'))
            return
        raise Error
    def __del__(self):
        if hasattr(self, 'ptr'):
            isl.isl_map_list_free(self.ptr)
    def __str__(arg0):
        try:
            if not arg0.__class__ is map_list:
                arg0 = map_list(arg0)
        except:
            raise
        ptr = isl.isl_map_list_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.map_list("""%s""")' % s
        else:
            return 'isl.map_list("%s")' % s
    def add(arg0, arg1):
        try:
            if not arg0.__class__ is map_list:
                arg0 = map_list(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is map:
                arg1 = map(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_list_add(isl.isl_map_list_copy(arg0.ptr), isl.isl_map_copy(arg1.ptr))
        obj = map_list(ctx=ctx, ptr=res)
        return obj
    def at(arg0, arg1):
        try:
            if not arg0.__class__ is map_list:
                arg0 = map_list(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_list_get_at(arg0.ptr, arg1)
        obj = map(ctx=ctx, ptr=res)
        return obj
    def get_at(arg0, arg1):
        return arg0.at(arg1)
    def clear(arg0):
        try:
            if not arg0.__class__ is map_list:
                arg0 = map_list(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_list_clear(isl.isl_map_list_copy(arg0.ptr))
        obj = map_list(ctx=ctx, ptr=res)
        return obj
    def concat(arg0, arg1):
        try:
            if not arg0.__class__ is map_list:
                arg0 = map_list(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is map_list:
                arg1 = map_list(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_list_concat(isl.isl_map_list_copy(arg0.ptr), isl.isl_map_list_copy(arg1.ptr))
        obj = map_list(ctx=ctx, ptr=res)
        return obj
    def drop(arg0, arg1, arg2):
        try:
            if not arg0.__class__ is map_list:
                arg0 = map_list(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_list_drop(isl.isl_map_list_copy(arg0.ptr), arg1, arg2)
        obj = map_list(ctx=ctx, ptr=res)
        return obj
    def foreach(arg0, arg1):
        try:
            if not arg0.__class__ is map_list:
                arg0 = map_list(arg0)
        except:
            raise
        exc_info = [None]
        fn = CFUNCTYPE(c_int, c_void_p, c_void_p)
        def cb_func(cb_arg0, cb_arg1):
            cb_arg0 = map(ctx=arg0.ctx, ptr=(cb_arg0))
            try:
                arg1(cb_arg0)
            except BaseException as e:
                exc_info[0] = e
                return -1
            return 0
        cb = fn(cb_func)
        ctx = arg0.ctx
        res = isl.isl_map_list_foreach(arg0.ptr, cb, None)
        if exc_info[0] is not None:
            raise exc_info[0]
        if res < 0:
            raise
    def insert(arg0, arg1, arg2):
        try:
            if not arg0.__class__ is map_list:
                arg0 = map_list(arg0)
        except:
            raise
        try:
            if not arg2.__class__ is map:
                arg2 = map(arg2)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_list_insert(isl.isl_map_list_copy(arg0.ptr), arg1, isl.isl_map_copy(arg2.ptr))
        obj = map_list(ctx=ctx, ptr=res)
        return obj
    def size(arg0):
        try:
            if not arg0.__class__ is map_list:
                arg0 = map_list(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_map_list_size(arg0.ptr)
        if res < 0:
            raise
        return int(res)

isl.isl_map_list_alloc.restype = c_void_p
isl.isl_map_list_alloc.argtypes = [Context, c_int]
isl.isl_map_list_from_map.restype = c_void_p
isl.isl_map_list_from_map.argtypes = [c_void_p]
isl.isl_map_list_read_from_str.restype = c_void_p
isl.isl_map_list_read_from_str.argtypes = [Context, c_char_p]
isl.isl_map_list_add.restype = c_void_p
isl.isl_map_list_add.argtypes = [c_void_p, c_void_p]
isl.isl_map_list_get_at.restype = c_void_p
isl.isl_map_list_get_at.argtypes = [c_void_p, c_int]
isl.isl_map_list_clear.restype = c_void_p
isl.isl_map_list_clear.argtypes = [c_void_p]
isl.isl_map_list_concat.restype = c_void_p
isl.isl_map_list_concat.argtypes = [c_void_p, c_void_p]
isl.isl_map_list_drop.restype = c_void_p
isl.isl_map_list_drop.argtypes = [c_void_p, c_int, c_int]
isl.isl_map_list_foreach.argtypes = [c_void_p, c_void_p, c_void_p]
isl.isl_map_list_insert.restype = c_void_p
isl.isl_map_list_insert.argtypes = [c_void_p, c_int, c_void_p]
isl.isl_map_list_size.argtypes = [c_void_p]
isl.isl_map_list_copy.restype = c_void_p
isl.isl_map_list_copy.argtypes = [c_void_p]
isl.isl_map_list_free.restype = c_void_p
isl.isl_map_list_free.argtypes = [c_void_p]
isl.isl_map_list_to_str.restype = POINTER(c_char)
isl.isl_map_list_to_str.argtypes = [c_void_p]

class multi_id(object):
    def __init__(self, *args, **keywords):
        if "ptr" in keywords:
            self.ctx = keywords["ctx"]
            self.ptr = keywords["ptr"]
            return
        if len(args) == 2 and args[0].__class__ is space and args[1].__class__ is id_list:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_multi_id_from_id_list(isl.isl_space_copy(args[0].ptr), isl.isl_id_list_copy(args[1].ptr))
            return
        if len(args) == 1 and type(args[0]) == str:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_multi_id_read_from_str(self.ctx, args[0].encode('ascii'))
            return
        raise Error
    def __del__(self):
        if hasattr(self, 'ptr'):
            isl.isl_multi_id_free(self.ptr)
    def __str__(arg0):
        try:
            if not arg0.__class__ is multi_id:
                arg0 = multi_id(arg0)
        except:
            raise
        ptr = isl.isl_multi_id_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.multi_id("""%s""")' % s
        else:
            return 'isl.multi_id("%s")' % s
    def at(arg0, arg1):
        try:
            if not arg0.__class__ is multi_id:
                arg0 = multi_id(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_id_get_at(arg0.ptr, arg1)
        obj = id(ctx=ctx, ptr=res)
        return obj
    def get_at(arg0, arg1):
        return arg0.at(arg1)
    def flat_range_product(arg0, arg1):
        try:
            if not arg0.__class__ is multi_id:
                arg0 = multi_id(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_id:
                arg1 = multi_id(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_id_flat_range_product(isl.isl_multi_id_copy(arg0.ptr), isl.isl_multi_id_copy(arg1.ptr))
        obj = multi_id(ctx=ctx, ptr=res)
        return obj
    def list(arg0):
        try:
            if not arg0.__class__ is multi_id:
                arg0 = multi_id(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_id_get_list(arg0.ptr)
        obj = id_list(ctx=ctx, ptr=res)
        return obj
    def get_list(arg0):
        return arg0.list()
    def plain_is_equal(arg0, arg1):
        try:
            if not arg0.__class__ is multi_id:
                arg0 = multi_id(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_id:
                arg1 = multi_id(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_id_plain_is_equal(arg0.ptr, arg1.ptr)
        if res < 0:
            raise
        return bool(res)
    def range_product(arg0, arg1):
        try:
            if not arg0.__class__ is multi_id:
                arg0 = multi_id(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_id:
                arg1 = multi_id(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_id_range_product(isl.isl_multi_id_copy(arg0.ptr), isl.isl_multi_id_copy(arg1.ptr))
        obj = multi_id(ctx=ctx, ptr=res)
        return obj
    def set_at(arg0, arg1, arg2):
        try:
            if not arg0.__class__ is multi_id:
                arg0 = multi_id(arg0)
        except:
            raise
        try:
            if not arg2.__class__ is id:
                arg2 = id(arg2)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_id_set_at(isl.isl_multi_id_copy(arg0.ptr), arg1, isl.isl_id_copy(arg2.ptr))
        obj = multi_id(ctx=ctx, ptr=res)
        return obj
    def size(arg0):
        try:
            if not arg0.__class__ is multi_id:
                arg0 = multi_id(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_id_size(arg0.ptr)
        if res < 0:
            raise
        return int(res)
    def space(arg0):
        try:
            if not arg0.__class__ is multi_id:
                arg0 = multi_id(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_id_get_space(arg0.ptr)
        obj = space(ctx=ctx, ptr=res)
        return obj
    def get_space(arg0):
        return arg0.space()

isl.isl_multi_id_from_id_list.restype = c_void_p
isl.isl_multi_id_from_id_list.argtypes = [c_void_p, c_void_p]
isl.isl_multi_id_read_from_str.restype = c_void_p
isl.isl_multi_id_read_from_str.argtypes = [Context, c_char_p]
isl.isl_multi_id_get_at.restype = c_void_p
isl.isl_multi_id_get_at.argtypes = [c_void_p, c_int]
isl.isl_multi_id_flat_range_product.restype = c_void_p
isl.isl_multi_id_flat_range_product.argtypes = [c_void_p, c_void_p]
isl.isl_multi_id_get_list.restype = c_void_p
isl.isl_multi_id_get_list.argtypes = [c_void_p]
isl.isl_multi_id_plain_is_equal.argtypes = [c_void_p, c_void_p]
isl.isl_multi_id_range_product.restype = c_void_p
isl.isl_multi_id_range_product.argtypes = [c_void_p, c_void_p]
isl.isl_multi_id_set_at.restype = c_void_p
isl.isl_multi_id_set_at.argtypes = [c_void_p, c_int, c_void_p]
isl.isl_multi_id_size.argtypes = [c_void_p]
isl.isl_multi_id_get_space.restype = c_void_p
isl.isl_multi_id_get_space.argtypes = [c_void_p]
isl.isl_multi_id_copy.restype = c_void_p
isl.isl_multi_id_copy.argtypes = [c_void_p]
isl.isl_multi_id_free.restype = c_void_p
isl.isl_multi_id_free.argtypes = [c_void_p]
isl.isl_multi_id_to_str.restype = POINTER(c_char)
isl.isl_multi_id_to_str.argtypes = [c_void_p]

class multi_val(object):
    def __init__(self, *args, **keywords):
        if "ptr" in keywords:
            self.ctx = keywords["ctx"]
            self.ptr = keywords["ptr"]
            return
        if len(args) == 2 and args[0].__class__ is space and args[1].__class__ is val_list:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_multi_val_from_val_list(isl.isl_space_copy(args[0].ptr), isl.isl_val_list_copy(args[1].ptr))
            return
        if len(args) == 1 and type(args[0]) == str:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_multi_val_read_from_str(self.ctx, args[0].encode('ascii'))
            return
        raise Error
    def __del__(self):
        if hasattr(self, 'ptr'):
            isl.isl_multi_val_free(self.ptr)
    def __str__(arg0):
        try:
            if not arg0.__class__ is multi_val:
                arg0 = multi_val(arg0)
        except:
            raise
        ptr = isl.isl_multi_val_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.multi_val("""%s""")' % s
        else:
            return 'isl.multi_val("%s")' % s
    def add(*args):
        if len(args) == 2 and args[1].__class__ is multi_val:
            ctx = args[0].ctx
            res = isl.isl_multi_val_add(isl.isl_multi_val_copy(args[0].ptr), isl.isl_multi_val_copy(args[1].ptr))
            obj = multi_val(ctx=ctx, ptr=res)
            return obj
        if len(args) == 2 and (args[1].__class__ is val or type(args[1]) == int):
            args = list(args)
            try:
                if not args[1].__class__ is val:
                    args[1] = val(args[1])
            except:
                raise
            ctx = args[0].ctx
            res = isl.isl_multi_val_add_val(isl.isl_multi_val_copy(args[0].ptr), isl.isl_val_copy(args[1].ptr))
            obj = multi_val(ctx=ctx, ptr=res)
            return obj
        raise Error
    def at(arg0, arg1):
        try:
            if not arg0.__class__ is multi_val:
                arg0 = multi_val(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_val_get_at(arg0.ptr, arg1)
        obj = val(ctx=ctx, ptr=res)
        return obj
    def get_at(arg0, arg1):
        return arg0.at(arg1)
    def flat_range_product(arg0, arg1):
        try:
            if not arg0.__class__ is multi_val:
                arg0 = multi_val(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_val:
                arg1 = multi_val(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_val_flat_range_product(isl.isl_multi_val_copy(arg0.ptr), isl.isl_multi_val_copy(arg1.ptr))
        obj = multi_val(ctx=ctx, ptr=res)
        return obj
    def has_range_tuple_id(arg0):
        try:
            if not arg0.__class__ is multi_val:
                arg0 = multi_val(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_val_has_range_tuple_id(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def involves_nan(arg0):
        try:
            if not arg0.__class__ is multi_val:
                arg0 = multi_val(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_val_involves_nan(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def list(arg0):
        try:
            if not arg0.__class__ is multi_val:
                arg0 = multi_val(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_val_get_list(arg0.ptr)
        obj = val_list(ctx=ctx, ptr=res)
        return obj
    def get_list(arg0):
        return arg0.list()
    def max(arg0, arg1):
        try:
            if not arg0.__class__ is multi_val:
                arg0 = multi_val(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_val:
                arg1 = multi_val(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_val_max(isl.isl_multi_val_copy(arg0.ptr), isl.isl_multi_val_copy(arg1.ptr))
        obj = multi_val(ctx=ctx, ptr=res)
        return obj
    def min(arg0, arg1):
        try:
            if not arg0.__class__ is multi_val:
                arg0 = multi_val(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_val:
                arg1 = multi_val(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_val_min(isl.isl_multi_val_copy(arg0.ptr), isl.isl_multi_val_copy(arg1.ptr))
        obj = multi_val(ctx=ctx, ptr=res)
        return obj
    def neg(arg0):
        try:
            if not arg0.__class__ is multi_val:
                arg0 = multi_val(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_val_neg(isl.isl_multi_val_copy(arg0.ptr))
        obj = multi_val(ctx=ctx, ptr=res)
        return obj
    def plain_is_equal(arg0, arg1):
        try:
            if not arg0.__class__ is multi_val:
                arg0 = multi_val(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_val:
                arg1 = multi_val(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_val_plain_is_equal(arg0.ptr, arg1.ptr)
        if res < 0:
            raise
        return bool(res)
    def product(arg0, arg1):
        try:
            if not arg0.__class__ is multi_val:
                arg0 = multi_val(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_val:
                arg1 = multi_val(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_val_product(isl.isl_multi_val_copy(arg0.ptr), isl.isl_multi_val_copy(arg1.ptr))
        obj = multi_val(ctx=ctx, ptr=res)
        return obj
    def range_product(arg0, arg1):
        try:
            if not arg0.__class__ is multi_val:
                arg0 = multi_val(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_val:
                arg1 = multi_val(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_val_range_product(isl.isl_multi_val_copy(arg0.ptr), isl.isl_multi_val_copy(arg1.ptr))
        obj = multi_val(ctx=ctx, ptr=res)
        return obj
    def range_tuple_id(arg0):
        try:
            if not arg0.__class__ is multi_val:
                arg0 = multi_val(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_val_get_range_tuple_id(arg0.ptr)
        obj = id(ctx=ctx, ptr=res)
        return obj
    def get_range_tuple_id(arg0):
        return arg0.range_tuple_id()
    def reset_range_tuple_id(arg0):
        try:
            if not arg0.__class__ is multi_val:
                arg0 = multi_val(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_val_reset_range_tuple_id(isl.isl_multi_val_copy(arg0.ptr))
        obj = multi_val(ctx=ctx, ptr=res)
        return obj
    def scale(*args):
        if len(args) == 2 and args[1].__class__ is multi_val:
            ctx = args[0].ctx
            res = isl.isl_multi_val_scale_multi_val(isl.isl_multi_val_copy(args[0].ptr), isl.isl_multi_val_copy(args[1].ptr))
            obj = multi_val(ctx=ctx, ptr=res)
            return obj
        if len(args) == 2 and (args[1].__class__ is val or type(args[1]) == int):
            args = list(args)
            try:
                if not args[1].__class__ is val:
                    args[1] = val(args[1])
            except:
                raise
            ctx = args[0].ctx
            res = isl.isl_multi_val_scale_val(isl.isl_multi_val_copy(args[0].ptr), isl.isl_val_copy(args[1].ptr))
            obj = multi_val(ctx=ctx, ptr=res)
            return obj
        raise Error
    def scale_down(*args):
        if len(args) == 2 and args[1].__class__ is multi_val:
            ctx = args[0].ctx
            res = isl.isl_multi_val_scale_down_multi_val(isl.isl_multi_val_copy(args[0].ptr), isl.isl_multi_val_copy(args[1].ptr))
            obj = multi_val(ctx=ctx, ptr=res)
            return obj
        if len(args) == 2 and (args[1].__class__ is val or type(args[1]) == int):
            args = list(args)
            try:
                if not args[1].__class__ is val:
                    args[1] = val(args[1])
            except:
                raise
            ctx = args[0].ctx
            res = isl.isl_multi_val_scale_down_val(isl.isl_multi_val_copy(args[0].ptr), isl.isl_val_copy(args[1].ptr))
            obj = multi_val(ctx=ctx, ptr=res)
            return obj
        raise Error
    def set_at(arg0, arg1, arg2):
        try:
            if not arg0.__class__ is multi_val:
                arg0 = multi_val(arg0)
        except:
            raise
        try:
            if not arg2.__class__ is val:
                arg2 = val(arg2)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_val_set_at(isl.isl_multi_val_copy(arg0.ptr), arg1, isl.isl_val_copy(arg2.ptr))
        obj = multi_val(ctx=ctx, ptr=res)
        return obj
    def set_range_tuple(*args):
        if len(args) == 2 and (args[1].__class__ is id or type(args[1]) == str):
            args = list(args)
            try:
                if not args[1].__class__ is id:
                    args[1] = id(args[1])
            except:
                raise
            ctx = args[0].ctx
            res = isl.isl_multi_val_set_range_tuple_id(isl.isl_multi_val_copy(args[0].ptr), isl.isl_id_copy(args[1].ptr))
            obj = multi_val(ctx=ctx, ptr=res)
            return obj
        raise Error
    def size(arg0):
        try:
            if not arg0.__class__ is multi_val:
                arg0 = multi_val(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_val_size(arg0.ptr)
        if res < 0:
            raise
        return int(res)
    def space(arg0):
        try:
            if not arg0.__class__ is multi_val:
                arg0 = multi_val(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_val_get_space(arg0.ptr)
        obj = space(ctx=ctx, ptr=res)
        return obj
    def get_space(arg0):
        return arg0.space()
    def sub(arg0, arg1):
        try:
            if not arg0.__class__ is multi_val:
                arg0 = multi_val(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_val:
                arg1 = multi_val(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_val_sub(isl.isl_multi_val_copy(arg0.ptr), isl.isl_multi_val_copy(arg1.ptr))
        obj = multi_val(ctx=ctx, ptr=res)
        return obj
    @staticmethod
    def zero(arg0):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_multi_val_zero(isl.isl_space_copy(arg0.ptr))
        obj = multi_val(ctx=ctx, ptr=res)
        return obj

isl.isl_multi_val_from_val_list.restype = c_void_p
isl.isl_multi_val_from_val_list.argtypes = [c_void_p, c_void_p]
isl.isl_multi_val_read_from_str.restype = c_void_p
isl.isl_multi_val_read_from_str.argtypes = [Context, c_char_p]
isl.isl_multi_val_add.restype = c_void_p
isl.isl_multi_val_add.argtypes = [c_void_p, c_void_p]
isl.isl_multi_val_add_val.restype = c_void_p
isl.isl_multi_val_add_val.argtypes = [c_void_p, c_void_p]
isl.isl_multi_val_get_at.restype = c_void_p
isl.isl_multi_val_get_at.argtypes = [c_void_p, c_int]
isl.isl_multi_val_flat_range_product.restype = c_void_p
isl.isl_multi_val_flat_range_product.argtypes = [c_void_p, c_void_p]
isl.isl_multi_val_has_range_tuple_id.argtypes = [c_void_p]
isl.isl_multi_val_involves_nan.argtypes = [c_void_p]
isl.isl_multi_val_get_list.restype = c_void_p
isl.isl_multi_val_get_list.argtypes = [c_void_p]
isl.isl_multi_val_max.restype = c_void_p
isl.isl_multi_val_max.argtypes = [c_void_p, c_void_p]
isl.isl_multi_val_min.restype = c_void_p
isl.isl_multi_val_min.argtypes = [c_void_p, c_void_p]
isl.isl_multi_val_neg.restype = c_void_p
isl.isl_multi_val_neg.argtypes = [c_void_p]
isl.isl_multi_val_plain_is_equal.argtypes = [c_void_p, c_void_p]
isl.isl_multi_val_product.restype = c_void_p
isl.isl_multi_val_product.argtypes = [c_void_p, c_void_p]
isl.isl_multi_val_range_product.restype = c_void_p
isl.isl_multi_val_range_product.argtypes = [c_void_p, c_void_p]
isl.isl_multi_val_get_range_tuple_id.restype = c_void_p
isl.isl_multi_val_get_range_tuple_id.argtypes = [c_void_p]
isl.isl_multi_val_reset_range_tuple_id.restype = c_void_p
isl.isl_multi_val_reset_range_tuple_id.argtypes = [c_void_p]
isl.isl_multi_val_scale_multi_val.restype = c_void_p
isl.isl_multi_val_scale_multi_val.argtypes = [c_void_p, c_void_p]
isl.isl_multi_val_scale_val.restype = c_void_p
isl.isl_multi_val_scale_val.argtypes = [c_void_p, c_void_p]
isl.isl_multi_val_scale_down_multi_val.restype = c_void_p
isl.isl_multi_val_scale_down_multi_val.argtypes = [c_void_p, c_void_p]
isl.isl_multi_val_scale_down_val.restype = c_void_p
isl.isl_multi_val_scale_down_val.argtypes = [c_void_p, c_void_p]
isl.isl_multi_val_set_at.restype = c_void_p
isl.isl_multi_val_set_at.argtypes = [c_void_p, c_int, c_void_p]
isl.isl_multi_val_set_range_tuple_id.restype = c_void_p
isl.isl_multi_val_set_range_tuple_id.argtypes = [c_void_p, c_void_p]
isl.isl_multi_val_size.argtypes = [c_void_p]
isl.isl_multi_val_get_space.restype = c_void_p
isl.isl_multi_val_get_space.argtypes = [c_void_p]
isl.isl_multi_val_sub.restype = c_void_p
isl.isl_multi_val_sub.argtypes = [c_void_p, c_void_p]
isl.isl_multi_val_zero.restype = c_void_p
isl.isl_multi_val_zero.argtypes = [c_void_p]
isl.isl_multi_val_copy.restype = c_void_p
isl.isl_multi_val_copy.argtypes = [c_void_p]
isl.isl_multi_val_free.restype = c_void_p
isl.isl_multi_val_free.argtypes = [c_void_p]
isl.isl_multi_val_to_str.restype = POINTER(c_char)
isl.isl_multi_val_to_str.argtypes = [c_void_p]

class point(basic_set):
    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_point_free(self.ptr)
    def __str__(arg0):
        try:
            if not arg0.__class__ is point:
                arg0 = point(arg0)
        except:
            raise
        ptr = isl.isl_point_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.point("""%s""")' % s
        else:
            return 'isl.point("%s")' % s
    def multi_val(arg0):
        try:
            if not arg0.__class__ is point:
                arg0 = point(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_point_get_multi_val(arg0.ptr)
        obj = multi_val(ctx=ctx, ptr=res)
        return obj
    def get_multi_val(arg0):
        return arg0.multi_val()
    def to_set(arg0):
        try:
            if not arg0.__class__ is point:
                arg0 = point(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_point_to_set(isl.isl_point_copy(arg0.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj

isl.isl_point_get_multi_val.restype = c_void_p
isl.isl_point_get_multi_val.argtypes = [c_void_p]
isl.isl_point_to_set.restype = c_void_p
isl.isl_point_to_set.argtypes = [c_void_p]
isl.isl_point_copy.restype = c_void_p
isl.isl_point_copy.argtypes = [c_void_p]
isl.isl_point_free.restype = c_void_p
isl.isl_point_free.argtypes = [c_void_p]
isl.isl_point_to_str.restype = POINTER(c_char)
isl.isl_point_to_str.argtypes = [c_void_p]

class pw_aff_list(object):
    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]) == int:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_pw_aff_list_alloc(self.ctx, args[0])
            return
        if len(args) == 1 and args[0].__class__ is pw_aff:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_pw_aff_list_from_pw_aff(isl.isl_pw_aff_copy(args[0].ptr))
            return
        if len(args) == 1 and type(args[0]) == str:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_pw_aff_list_read_from_str(self.ctx, args[0].encode('ascii'))
            return
        raise Error
    def __del__(self):
        if hasattr(self, 'ptr'):
            isl.isl_pw_aff_list_free(self.ptr)
    def __str__(arg0):
        try:
            if not arg0.__class__ is pw_aff_list:
                arg0 = pw_aff_list(arg0)
        except:
            raise
        ptr = isl.isl_pw_aff_list_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.pw_aff_list("""%s""")' % s
        else:
            return 'isl.pw_aff_list("%s")' % s
    def add(arg0, arg1):
        try:
            if not arg0.__class__ is pw_aff_list:
                arg0 = pw_aff_list(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is pw_aff:
                arg1 = pw_aff(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_pw_aff_list_add(isl.isl_pw_aff_list_copy(arg0.ptr), isl.isl_pw_aff_copy(arg1.ptr))
        obj = pw_aff_list(ctx=ctx, ptr=res)
        return obj
    def at(arg0, arg1):
        try:
            if not arg0.__class__ is pw_aff_list:
                arg0 = pw_aff_list(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_pw_aff_list_get_at(arg0.ptr, arg1)
        obj = pw_aff(ctx=ctx, ptr=res)
        return obj
    def get_at(arg0, arg1):
        return arg0.at(arg1)
    def clear(arg0):
        try:
            if not arg0.__class__ is pw_aff_list:
                arg0 = pw_aff_list(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_pw_aff_list_clear(isl.isl_pw_aff_list_copy(arg0.ptr))
        obj = pw_aff_list(ctx=ctx, ptr=res)
        return obj
    def concat(arg0, arg1):
        try:
            if not arg0.__class__ is pw_aff_list:
                arg0 = pw_aff_list(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is pw_aff_list:
                arg1 = pw_aff_list(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_pw_aff_list_concat(isl.isl_pw_aff_list_copy(arg0.ptr), isl.isl_pw_aff_list_copy(arg1.ptr))
        obj = pw_aff_list(ctx=ctx, ptr=res)
        return obj
    def drop(arg0, arg1, arg2):
        try:
            if not arg0.__class__ is pw_aff_list:
                arg0 = pw_aff_list(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_pw_aff_list_drop(isl.isl_pw_aff_list_copy(arg0.ptr), arg1, arg2)
        obj = pw_aff_list(ctx=ctx, ptr=res)
        return obj
    def foreach(arg0, arg1):
        try:
            if not arg0.__class__ is pw_aff_list:
                arg0 = pw_aff_list(arg0)
        except:
            raise
        exc_info = [None]
        fn = CFUNCTYPE(c_int, c_void_p, c_void_p)
        def cb_func(cb_arg0, cb_arg1):
            cb_arg0 = pw_aff(ctx=arg0.ctx, ptr=(cb_arg0))
            try:
                arg1(cb_arg0)
            except BaseException as e:
                exc_info[0] = e
                return -1
            return 0
        cb = fn(cb_func)
        ctx = arg0.ctx
        res = isl.isl_pw_aff_list_foreach(arg0.ptr, cb, None)
        if exc_info[0] is not None:
            raise exc_info[0]
        if res < 0:
            raise
    def insert(arg0, arg1, arg2):
        try:
            if not arg0.__class__ is pw_aff_list:
                arg0 = pw_aff_list(arg0)
        except:
            raise
        try:
            if not arg2.__class__ is pw_aff:
                arg2 = pw_aff(arg2)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_pw_aff_list_insert(isl.isl_pw_aff_list_copy(arg0.ptr), arg1, isl.isl_pw_aff_copy(arg2.ptr))
        obj = pw_aff_list(ctx=ctx, ptr=res)
        return obj
    def size(arg0):
        try:
            if not arg0.__class__ is pw_aff_list:
                arg0 = pw_aff_list(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_pw_aff_list_size(arg0.ptr)
        if res < 0:
            raise
        return int(res)

isl.isl_pw_aff_list_alloc.restype = c_void_p
isl.isl_pw_aff_list_alloc.argtypes = [Context, c_int]
isl.isl_pw_aff_list_from_pw_aff.restype = c_void_p
isl.isl_pw_aff_list_from_pw_aff.argtypes = [c_void_p]
isl.isl_pw_aff_list_read_from_str.restype = c_void_p
isl.isl_pw_aff_list_read_from_str.argtypes = [Context, c_char_p]
isl.isl_pw_aff_list_add.restype = c_void_p
isl.isl_pw_aff_list_add.argtypes = [c_void_p, c_void_p]
isl.isl_pw_aff_list_get_at.restype = c_void_p
isl.isl_pw_aff_list_get_at.argtypes = [c_void_p, c_int]
isl.isl_pw_aff_list_clear.restype = c_void_p
isl.isl_pw_aff_list_clear.argtypes = [c_void_p]
isl.isl_pw_aff_list_concat.restype = c_void_p
isl.isl_pw_aff_list_concat.argtypes = [c_void_p, c_void_p]
isl.isl_pw_aff_list_drop.restype = c_void_p
isl.isl_pw_aff_list_drop.argtypes = [c_void_p, c_int, c_int]
isl.isl_pw_aff_list_foreach.argtypes = [c_void_p, c_void_p, c_void_p]
isl.isl_pw_aff_list_insert.restype = c_void_p
isl.isl_pw_aff_list_insert.argtypes = [c_void_p, c_int, c_void_p]
isl.isl_pw_aff_list_size.argtypes = [c_void_p]
isl.isl_pw_aff_list_copy.restype = c_void_p
isl.isl_pw_aff_list_copy.argtypes = [c_void_p]
isl.isl_pw_aff_list_free.restype = c_void_p
isl.isl_pw_aff_list_free.argtypes = [c_void_p]
isl.isl_pw_aff_list_to_str.restype = POINTER(c_char)
isl.isl_pw_aff_list_to_str.argtypes = [c_void_p]

class pw_multi_aff_list(object):
    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]) == int:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_pw_multi_aff_list_alloc(self.ctx, args[0])
            return
        if len(args) == 1 and args[0].__class__ is pw_multi_aff:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_pw_multi_aff_list_from_pw_multi_aff(isl.isl_pw_multi_aff_copy(args[0].ptr))
            return
        if len(args) == 1 and type(args[0]) == str:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_pw_multi_aff_list_read_from_str(self.ctx, args[0].encode('ascii'))
            return
        raise Error
    def __del__(self):
        if hasattr(self, 'ptr'):
            isl.isl_pw_multi_aff_list_free(self.ptr)
    def __str__(arg0):
        try:
            if not arg0.__class__ is pw_multi_aff_list:
                arg0 = pw_multi_aff_list(arg0)
        except:
            raise
        ptr = isl.isl_pw_multi_aff_list_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.pw_multi_aff_list("""%s""")' % s
        else:
            return 'isl.pw_multi_aff_list("%s")' % s
    def add(arg0, arg1):
        try:
            if not arg0.__class__ is pw_multi_aff_list:
                arg0 = pw_multi_aff_list(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is pw_multi_aff:
                arg1 = pw_multi_aff(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_pw_multi_aff_list_add(isl.isl_pw_multi_aff_list_copy(arg0.ptr), isl.isl_pw_multi_aff_copy(arg1.ptr))
        obj = pw_multi_aff_list(ctx=ctx, ptr=res)
        return obj
    def at(arg0, arg1):
        try:
            if not arg0.__class__ is pw_multi_aff_list:
                arg0 = pw_multi_aff_list(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_pw_multi_aff_list_get_at(arg0.ptr, arg1)
        obj = pw_multi_aff(ctx=ctx, ptr=res)
        return obj
    def get_at(arg0, arg1):
        return arg0.at(arg1)
    def clear(arg0):
        try:
            if not arg0.__class__ is pw_multi_aff_list:
                arg0 = pw_multi_aff_list(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_pw_multi_aff_list_clear(isl.isl_pw_multi_aff_list_copy(arg0.ptr))
        obj = pw_multi_aff_list(ctx=ctx, ptr=res)
        return obj
    def concat(arg0, arg1):
        try:
            if not arg0.__class__ is pw_multi_aff_list:
                arg0 = pw_multi_aff_list(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is pw_multi_aff_list:
                arg1 = pw_multi_aff_list(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_pw_multi_aff_list_concat(isl.isl_pw_multi_aff_list_copy(arg0.ptr), isl.isl_pw_multi_aff_list_copy(arg1.ptr))
        obj = pw_multi_aff_list(ctx=ctx, ptr=res)
        return obj
    def drop(arg0, arg1, arg2):
        try:
            if not arg0.__class__ is pw_multi_aff_list:
                arg0 = pw_multi_aff_list(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_pw_multi_aff_list_drop(isl.isl_pw_multi_aff_list_copy(arg0.ptr), arg1, arg2)
        obj = pw_multi_aff_list(ctx=ctx, ptr=res)
        return obj
    def foreach(arg0, arg1):
        try:
            if not arg0.__class__ is pw_multi_aff_list:
                arg0 = pw_multi_aff_list(arg0)
        except:
            raise
        exc_info = [None]
        fn = CFUNCTYPE(c_int, c_void_p, c_void_p)
        def cb_func(cb_arg0, cb_arg1):
            cb_arg0 = pw_multi_aff(ctx=arg0.ctx, ptr=(cb_arg0))
            try:
                arg1(cb_arg0)
            except BaseException as e:
                exc_info[0] = e
                return -1
            return 0
        cb = fn(cb_func)
        ctx = arg0.ctx
        res = isl.isl_pw_multi_aff_list_foreach(arg0.ptr, cb, None)
        if exc_info[0] is not None:
            raise exc_info[0]
        if res < 0:
            raise
    def insert(arg0, arg1, arg2):
        try:
            if not arg0.__class__ is pw_multi_aff_list:
                arg0 = pw_multi_aff_list(arg0)
        except:
            raise
        try:
            if not arg2.__class__ is pw_multi_aff:
                arg2 = pw_multi_aff(arg2)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_pw_multi_aff_list_insert(isl.isl_pw_multi_aff_list_copy(arg0.ptr), arg1, isl.isl_pw_multi_aff_copy(arg2.ptr))
        obj = pw_multi_aff_list(ctx=ctx, ptr=res)
        return obj
    def size(arg0):
        try:
            if not arg0.__class__ is pw_multi_aff_list:
                arg0 = pw_multi_aff_list(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_pw_multi_aff_list_size(arg0.ptr)
        if res < 0:
            raise
        return int(res)

isl.isl_pw_multi_aff_list_alloc.restype = c_void_p
isl.isl_pw_multi_aff_list_alloc.argtypes = [Context, c_int]
isl.isl_pw_multi_aff_list_from_pw_multi_aff.restype = c_void_p
isl.isl_pw_multi_aff_list_from_pw_multi_aff.argtypes = [c_void_p]
isl.isl_pw_multi_aff_list_read_from_str.restype = c_void_p
isl.isl_pw_multi_aff_list_read_from_str.argtypes = [Context, c_char_p]
isl.isl_pw_multi_aff_list_add.restype = c_void_p
isl.isl_pw_multi_aff_list_add.argtypes = [c_void_p, c_void_p]
isl.isl_pw_multi_aff_list_get_at.restype = c_void_p
isl.isl_pw_multi_aff_list_get_at.argtypes = [c_void_p, c_int]
isl.isl_pw_multi_aff_list_clear.restype = c_void_p
isl.isl_pw_multi_aff_list_clear.argtypes = [c_void_p]
isl.isl_pw_multi_aff_list_concat.restype = c_void_p
isl.isl_pw_multi_aff_list_concat.argtypes = [c_void_p, c_void_p]
isl.isl_pw_multi_aff_list_drop.restype = c_void_p
isl.isl_pw_multi_aff_list_drop.argtypes = [c_void_p, c_int, c_int]
isl.isl_pw_multi_aff_list_foreach.argtypes = [c_void_p, c_void_p, c_void_p]
isl.isl_pw_multi_aff_list_insert.restype = c_void_p
isl.isl_pw_multi_aff_list_insert.argtypes = [c_void_p, c_int, c_void_p]
isl.isl_pw_multi_aff_list_size.argtypes = [c_void_p]
isl.isl_pw_multi_aff_list_copy.restype = c_void_p
isl.isl_pw_multi_aff_list_copy.argtypes = [c_void_p]
isl.isl_pw_multi_aff_list_free.restype = c_void_p
isl.isl_pw_multi_aff_list_free.argtypes = [c_void_p]
isl.isl_pw_multi_aff_list_to_str.restype = POINTER(c_char)
isl.isl_pw_multi_aff_list_to_str.argtypes = [c_void_p]

class schedule(object):
    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_schedule_read_from_str(self.ctx, args[0].encode('ascii'))
            return
        raise Error
    def __del__(self):
        if hasattr(self, 'ptr'):
            isl.isl_schedule_free(self.ptr)
    def __str__(arg0):
        try:
            if not arg0.__class__ is schedule:
                arg0 = schedule(arg0)
        except:
            raise
        ptr = isl.isl_schedule_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.schedule("""%s""")' % s
        else:
            return 'isl.schedule("%s")' % s
    def domain(arg0):
        try:
            if not arg0.__class__ is schedule:
                arg0 = schedule(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_get_domain(arg0.ptr)
        obj = union_set(ctx=ctx, ptr=res)
        return obj
    def get_domain(arg0):
        return arg0.domain()
    @staticmethod
    def from_domain(arg0):
        try:
            if not arg0.__class__ is union_set:
                arg0 = union_set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_from_domain(isl.isl_union_set_copy(arg0.ptr))
        obj = schedule(ctx=ctx, ptr=res)
        return obj
    def map(arg0):
        try:
            if not arg0.__class__ is schedule:
                arg0 = schedule(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_get_map(arg0.ptr)
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def get_map(arg0):
        return arg0.map()
    def pullback(*args):
        if len(args) == 2 and args[1].__class__ is union_pw_multi_aff:
            ctx = args[0].ctx
            res = isl.isl_schedule_pullback_union_pw_multi_aff(isl.isl_schedule_copy(args[0].ptr), isl.isl_union_pw_multi_aff_copy(args[1].ptr))
            obj = schedule(ctx=ctx, ptr=res)
            return obj
        raise Error
    def root(arg0):
        try:
            if not arg0.__class__ is schedule:
                arg0 = schedule(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_get_root(arg0.ptr)
        obj = schedule_node(ctx=ctx, ptr=res)
        return obj
    def get_root(arg0):
        return arg0.root()

isl.isl_schedule_read_from_str.restype = c_void_p
isl.isl_schedule_read_from_str.argtypes = [Context, c_char_p]
isl.isl_schedule_get_domain.restype = c_void_p
isl.isl_schedule_get_domain.argtypes = [c_void_p]
isl.isl_schedule_from_domain.restype = c_void_p
isl.isl_schedule_from_domain.argtypes = [c_void_p]
isl.isl_schedule_get_map.restype = c_void_p
isl.isl_schedule_get_map.argtypes = [c_void_p]
isl.isl_schedule_pullback_union_pw_multi_aff.restype = c_void_p
isl.isl_schedule_pullback_union_pw_multi_aff.argtypes = [c_void_p, c_void_p]
isl.isl_schedule_get_root.restype = c_void_p
isl.isl_schedule_get_root.argtypes = [c_void_p]
isl.isl_schedule_copy.restype = c_void_p
isl.isl_schedule_copy.argtypes = [c_void_p]
isl.isl_schedule_free.restype = c_void_p
isl.isl_schedule_free.argtypes = [c_void_p]
isl.isl_schedule_to_str.restype = POINTER(c_char)
isl.isl_schedule_to_str.argtypes = [c_void_p]

class schedule_constraints(object):
    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_schedule_constraints_read_from_str(self.ctx, args[0].encode('ascii'))
            return
        raise Error
    def __del__(self):
        if hasattr(self, 'ptr'):
            isl.isl_schedule_constraints_free(self.ptr)
    def __str__(arg0):
        try:
            if not arg0.__class__ is schedule_constraints:
                arg0 = schedule_constraints(arg0)
        except:
            raise
        ptr = isl.isl_schedule_constraints_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.schedule_constraints("""%s""")' % s
        else:
            return 'isl.schedule_constraints("%s")' % s
    def coincidence(arg0):
        try:
            if not arg0.__class__ is schedule_constraints:
                arg0 = schedule_constraints(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_constraints_get_coincidence(arg0.ptr)
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def get_coincidence(arg0):
        return arg0.coincidence()
    def compute_schedule(arg0):
        try:
            if not arg0.__class__ is schedule_constraints:
                arg0 = schedule_constraints(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_constraints_compute_schedule(isl.isl_schedule_constraints_copy(arg0.ptr))
        obj = schedule(ctx=ctx, ptr=res)
        return obj
    def conditional_validity(arg0):
        try:
            if not arg0.__class__ is schedule_constraints:
                arg0 = schedule_constraints(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_constraints_get_conditional_validity(arg0.ptr)
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def get_conditional_validity(arg0):
        return arg0.conditional_validity()
    def conditional_validity_condition(arg0):
        try:
            if not arg0.__class__ is schedule_constraints:
                arg0 = schedule_constraints(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_constraints_get_conditional_validity_condition(arg0.ptr)
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def get_conditional_validity_condition(arg0):
        return arg0.conditional_validity_condition()
    def context(arg0):
        try:
            if not arg0.__class__ is schedule_constraints:
                arg0 = schedule_constraints(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_constraints_get_context(arg0.ptr)
        obj = set(ctx=ctx, ptr=res)
        return obj
    def get_context(arg0):
        return arg0.context()
    def domain(arg0):
        try:
            if not arg0.__class__ is schedule_constraints:
                arg0 = schedule_constraints(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_constraints_get_domain(arg0.ptr)
        obj = union_set(ctx=ctx, ptr=res)
        return obj
    def get_domain(arg0):
        return arg0.domain()
    @staticmethod
    def on_domain(arg0):
        try:
            if not arg0.__class__ is union_set:
                arg0 = union_set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_constraints_on_domain(isl.isl_union_set_copy(arg0.ptr))
        obj = schedule_constraints(ctx=ctx, ptr=res)
        return obj
    def proximity(arg0):
        try:
            if not arg0.__class__ is schedule_constraints:
                arg0 = schedule_constraints(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_constraints_get_proximity(arg0.ptr)
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def get_proximity(arg0):
        return arg0.proximity()
    def set_coincidence(arg0, arg1):
        try:
            if not arg0.__class__ is schedule_constraints:
                arg0 = schedule_constraints(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_map:
                arg1 = union_map(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_constraints_set_coincidence(isl.isl_schedule_constraints_copy(arg0.ptr), isl.isl_union_map_copy(arg1.ptr))
        obj = schedule_constraints(ctx=ctx, ptr=res)
        return obj
    def set_conditional_validity(arg0, arg1, arg2):
        try:
            if not arg0.__class__ is schedule_constraints:
                arg0 = schedule_constraints(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_map:
                arg1 = union_map(arg1)
        except:
            raise
        try:
            if not arg2.__class__ is union_map:
                arg2 = union_map(arg2)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_constraints_set_conditional_validity(isl.isl_schedule_constraints_copy(arg0.ptr), isl.isl_union_map_copy(arg1.ptr), isl.isl_union_map_copy(arg2.ptr))
        obj = schedule_constraints(ctx=ctx, ptr=res)
        return obj
    def set_context(arg0, arg1):
        try:
            if not arg0.__class__ is schedule_constraints:
                arg0 = schedule_constraints(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_constraints_set_context(isl.isl_schedule_constraints_copy(arg0.ptr), isl.isl_set_copy(arg1.ptr))
        obj = schedule_constraints(ctx=ctx, ptr=res)
        return obj
    def set_proximity(arg0, arg1):
        try:
            if not arg0.__class__ is schedule_constraints:
                arg0 = schedule_constraints(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_map:
                arg1 = union_map(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_constraints_set_proximity(isl.isl_schedule_constraints_copy(arg0.ptr), isl.isl_union_map_copy(arg1.ptr))
        obj = schedule_constraints(ctx=ctx, ptr=res)
        return obj
    def set_validity(arg0, arg1):
        try:
            if not arg0.__class__ is schedule_constraints:
                arg0 = schedule_constraints(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_map:
                arg1 = union_map(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_constraints_set_validity(isl.isl_schedule_constraints_copy(arg0.ptr), isl.isl_union_map_copy(arg1.ptr))
        obj = schedule_constraints(ctx=ctx, ptr=res)
        return obj
    def validity(arg0):
        try:
            if not arg0.__class__ is schedule_constraints:
                arg0 = schedule_constraints(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_constraints_get_validity(arg0.ptr)
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def get_validity(arg0):
        return arg0.validity()

isl.isl_schedule_constraints_read_from_str.restype = c_void_p
isl.isl_schedule_constraints_read_from_str.argtypes = [Context, c_char_p]
isl.isl_schedule_constraints_get_coincidence.restype = c_void_p
isl.isl_schedule_constraints_get_coincidence.argtypes = [c_void_p]
isl.isl_schedule_constraints_compute_schedule.restype = c_void_p
isl.isl_schedule_constraints_compute_schedule.argtypes = [c_void_p]
isl.isl_schedule_constraints_get_conditional_validity.restype = c_void_p
isl.isl_schedule_constraints_get_conditional_validity.argtypes = [c_void_p]
isl.isl_schedule_constraints_get_conditional_validity_condition.restype = c_void_p
isl.isl_schedule_constraints_get_conditional_validity_condition.argtypes = [c_void_p]
isl.isl_schedule_constraints_get_context.restype = c_void_p
isl.isl_schedule_constraints_get_context.argtypes = [c_void_p]
isl.isl_schedule_constraints_get_domain.restype = c_void_p
isl.isl_schedule_constraints_get_domain.argtypes = [c_void_p]
isl.isl_schedule_constraints_on_domain.restype = c_void_p
isl.isl_schedule_constraints_on_domain.argtypes = [c_void_p]
isl.isl_schedule_constraints_get_proximity.restype = c_void_p
isl.isl_schedule_constraints_get_proximity.argtypes = [c_void_p]
isl.isl_schedule_constraints_set_coincidence.restype = c_void_p
isl.isl_schedule_constraints_set_coincidence.argtypes = [c_void_p, c_void_p]
isl.isl_schedule_constraints_set_conditional_validity.restype = c_void_p
isl.isl_schedule_constraints_set_conditional_validity.argtypes = [c_void_p, c_void_p, c_void_p]
isl.isl_schedule_constraints_set_context.restype = c_void_p
isl.isl_schedule_constraints_set_context.argtypes = [c_void_p, c_void_p]
isl.isl_schedule_constraints_set_proximity.restype = c_void_p
isl.isl_schedule_constraints_set_proximity.argtypes = [c_void_p, c_void_p]
isl.isl_schedule_constraints_set_validity.restype = c_void_p
isl.isl_schedule_constraints_set_validity.argtypes = [c_void_p, c_void_p]
isl.isl_schedule_constraints_get_validity.restype = c_void_p
isl.isl_schedule_constraints_get_validity.argtypes = [c_void_p]
isl.isl_schedule_constraints_copy.restype = c_void_p
isl.isl_schedule_constraints_copy.argtypes = [c_void_p]
isl.isl_schedule_constraints_free.restype = c_void_p
isl.isl_schedule_constraints_free.argtypes = [c_void_p]
isl.isl_schedule_constraints_to_str.restype = POINTER(c_char)
isl.isl_schedule_constraints_to_str.argtypes = [c_void_p]

class schedule_node(object):
    def __init__(self, *args, **keywords):
        if "ptr" in keywords:
            self.ctx = keywords["ctx"]
            self.ptr = keywords["ptr"]
            return
        if len(args) == 1 and isinstance(args[0], schedule_node_band):
            self.ctx = args[0].ctx
            self.ptr = isl.isl_schedule_node_copy(args[0].ptr)
            return
        if len(args) == 1 and isinstance(args[0], schedule_node_context):
            self.ctx = args[0].ctx
            self.ptr = isl.isl_schedule_node_copy(args[0].ptr)
            return
        if len(args) == 1 and isinstance(args[0], schedule_node_domain):
            self.ctx = args[0].ctx
            self.ptr = isl.isl_schedule_node_copy(args[0].ptr)
            return
        if len(args) == 1 and isinstance(args[0], schedule_node_expansion):
            self.ctx = args[0].ctx
            self.ptr = isl.isl_schedule_node_copy(args[0].ptr)
            return
        if len(args) == 1 and isinstance(args[0], schedule_node_extension):
            self.ctx = args[0].ctx
            self.ptr = isl.isl_schedule_node_copy(args[0].ptr)
            return
        if len(args) == 1 and isinstance(args[0], schedule_node_filter):
            self.ctx = args[0].ctx
            self.ptr = isl.isl_schedule_node_copy(args[0].ptr)
            return
        if len(args) == 1 and isinstance(args[0], schedule_node_leaf):
            self.ctx = args[0].ctx
            self.ptr = isl.isl_schedule_node_copy(args[0].ptr)
            return
        if len(args) == 1 and isinstance(args[0], schedule_node_guard):
            self.ctx = args[0].ctx
            self.ptr = isl.isl_schedule_node_copy(args[0].ptr)
            return
        if len(args) == 1 and isinstance(args[0], schedule_node_mark):
            self.ctx = args[0].ctx
            self.ptr = isl.isl_schedule_node_copy(args[0].ptr)
            return
        if len(args) == 1 and isinstance(args[0], schedule_node_sequence):
            self.ctx = args[0].ctx
            self.ptr = isl.isl_schedule_node_copy(args[0].ptr)
            return
        if len(args) == 1 and isinstance(args[0], schedule_node_set):
            self.ctx = args[0].ctx
            self.ptr = isl.isl_schedule_node_copy(args[0].ptr)
            return
        raise Error
    def __del__(self):
        if hasattr(self, 'ptr'):
            isl.isl_schedule_node_free(self.ptr)
    def __new__(cls, *args, **keywords):
        if "ptr" in keywords:
            type = isl.isl_schedule_node_get_type(keywords["ptr"])
            if type == 0:
                return schedule_node_band(**keywords)
            if type == 1:
                return schedule_node_context(**keywords)
            if type == 2:
                return schedule_node_domain(**keywords)
            if type == 3:
                return schedule_node_expansion(**keywords)
            if type == 4:
                return schedule_node_extension(**keywords)
            if type == 5:
                return schedule_node_filter(**keywords)
            if type == 6:
                return schedule_node_leaf(**keywords)
            if type == 7:
                return schedule_node_guard(**keywords)
            if type == 8:
                return schedule_node_mark(**keywords)
            if type == 9:
                return schedule_node_sequence(**keywords)
            if type == 10:
                return schedule_node_set(**keywords)
            raise
        return super(schedule_node, cls).__new__(cls)
    def __str__(arg0):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        ptr = isl.isl_schedule_node_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.schedule_node("""%s""")' % s
        else:
            return 'isl.schedule_node("%s")' % s
    def ancestor(arg0, arg1):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_ancestor(isl.isl_schedule_node_copy(arg0.ptr), arg1)
        obj = schedule_node(ctx=ctx, ptr=res)
        return obj
    def ancestor_child_position(arg0, arg1):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is schedule_node:
                arg1 = schedule_node(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_get_ancestor_child_position(arg0.ptr, arg1.ptr)
        if res < 0:
            raise
        return int(res)
    def get_ancestor_child_position(arg0, arg1):
        return arg0.ancestor_child_position(arg1)
    def child(arg0, arg1):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_child(isl.isl_schedule_node_copy(arg0.ptr), arg1)
        obj = schedule_node(ctx=ctx, ptr=res)
        return obj
    def child_position(arg0):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_get_child_position(arg0.ptr)
        if res < 0:
            raise
        return int(res)
    def get_child_position(arg0):
        return arg0.child_position()
    def every_descendant(arg0, arg1):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        exc_info = [None]
        fn = CFUNCTYPE(c_int, c_void_p, c_void_p)
        def cb_func(cb_arg0, cb_arg1):
            cb_arg0 = schedule_node(ctx=arg0.ctx, ptr=isl.isl_schedule_node_copy(cb_arg0))
            try:
                res = arg1(cb_arg0)
            except BaseException as e:
                exc_info[0] = e
                return -1
            return 1 if res else 0
        cb = fn(cb_func)
        ctx = arg0.ctx
        res = isl.isl_schedule_node_every_descendant(arg0.ptr, cb, None)
        if exc_info[0] is not None:
            raise exc_info[0]
        if res < 0:
            raise
        return bool(res)
    def first_child(arg0):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_first_child(isl.isl_schedule_node_copy(arg0.ptr))
        obj = schedule_node(ctx=ctx, ptr=res)
        return obj
    def foreach_ancestor_top_down(arg0, arg1):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        exc_info = [None]
        fn = CFUNCTYPE(c_int, c_void_p, c_void_p)
        def cb_func(cb_arg0, cb_arg1):
            cb_arg0 = schedule_node(ctx=arg0.ctx, ptr=isl.isl_schedule_node_copy(cb_arg0))
            try:
                arg1(cb_arg0)
            except BaseException as e:
                exc_info[0] = e
                return -1
            return 0
        cb = fn(cb_func)
        ctx = arg0.ctx
        res = isl.isl_schedule_node_foreach_ancestor_top_down(arg0.ptr, cb, None)
        if exc_info[0] is not None:
            raise exc_info[0]
        if res < 0:
            raise
    def foreach_descendant_top_down(arg0, arg1):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        exc_info = [None]
        fn = CFUNCTYPE(c_int, c_void_p, c_void_p)
        def cb_func(cb_arg0, cb_arg1):
            cb_arg0 = schedule_node(ctx=arg0.ctx, ptr=isl.isl_schedule_node_copy(cb_arg0))
            try:
                res = arg1(cb_arg0)
            except BaseException as e:
                exc_info[0] = e
                return -1
            return 1 if res else 0
        cb = fn(cb_func)
        ctx = arg0.ctx
        res = isl.isl_schedule_node_foreach_descendant_top_down(arg0.ptr, cb, None)
        if exc_info[0] is not None:
            raise exc_info[0]
        if res < 0:
            raise
    @staticmethod
    def from_domain(arg0):
        try:
            if not arg0.__class__ is union_set:
                arg0 = union_set(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_from_domain(isl.isl_union_set_copy(arg0.ptr))
        obj = schedule_node(ctx=ctx, ptr=res)
        return obj
    @staticmethod
    def from_extension(arg0):
        try:
            if not arg0.__class__ is union_map:
                arg0 = union_map(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_from_extension(isl.isl_union_map_copy(arg0.ptr))
        obj = schedule_node(ctx=ctx, ptr=res)
        return obj
    def graft_after(arg0, arg1):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is schedule_node:
                arg1 = schedule_node(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_graft_after(isl.isl_schedule_node_copy(arg0.ptr), isl.isl_schedule_node_copy(arg1.ptr))
        obj = schedule_node(ctx=ctx, ptr=res)
        return obj
    def graft_before(arg0, arg1):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is schedule_node:
                arg1 = schedule_node(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_graft_before(isl.isl_schedule_node_copy(arg0.ptr), isl.isl_schedule_node_copy(arg1.ptr))
        obj = schedule_node(ctx=ctx, ptr=res)
        return obj
    def has_children(arg0):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_has_children(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def has_next_sibling(arg0):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_has_next_sibling(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def has_parent(arg0):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_has_parent(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def has_previous_sibling(arg0):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_has_previous_sibling(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def insert_context(arg0, arg1):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_insert_context(isl.isl_schedule_node_copy(arg0.ptr), isl.isl_set_copy(arg1.ptr))
        obj = schedule_node(ctx=ctx, ptr=res)
        return obj
    def insert_filter(arg0, arg1):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_set:
                arg1 = union_set(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_insert_filter(isl.isl_schedule_node_copy(arg0.ptr), isl.isl_union_set_copy(arg1.ptr))
        obj = schedule_node(ctx=ctx, ptr=res)
        return obj
    def insert_guard(arg0, arg1):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_insert_guard(isl.isl_schedule_node_copy(arg0.ptr), isl.isl_set_copy(arg1.ptr))
        obj = schedule_node(ctx=ctx, ptr=res)
        return obj
    def insert_mark(arg0, arg1):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is id:
                arg1 = id(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_insert_mark(isl.isl_schedule_node_copy(arg0.ptr), isl.isl_id_copy(arg1.ptr))
        obj = schedule_node(ctx=ctx, ptr=res)
        return obj
    def insert_partial_schedule(arg0, arg1):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_union_pw_aff:
                arg1 = multi_union_pw_aff(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_insert_partial_schedule(isl.isl_schedule_node_copy(arg0.ptr), isl.isl_multi_union_pw_aff_copy(arg1.ptr))
        obj = schedule_node(ctx=ctx, ptr=res)
        return obj
    def insert_sequence(arg0, arg1):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_set_list:
                arg1 = union_set_list(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_insert_sequence(isl.isl_schedule_node_copy(arg0.ptr), isl.isl_union_set_list_copy(arg1.ptr))
        obj = schedule_node(ctx=ctx, ptr=res)
        return obj
    def insert_set(arg0, arg1):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_set_list:
                arg1 = union_set_list(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_insert_set(isl.isl_schedule_node_copy(arg0.ptr), isl.isl_union_set_list_copy(arg1.ptr))
        obj = schedule_node(ctx=ctx, ptr=res)
        return obj
    def is_equal(arg0, arg1):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is schedule_node:
                arg1 = schedule_node(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_is_equal(arg0.ptr, arg1.ptr)
        if res < 0:
            raise
        return bool(res)
    def is_subtree_anchored(arg0):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_is_subtree_anchored(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def map_descendant_bottom_up(arg0, arg1):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        exc_info = [None]
        fn = CFUNCTYPE(c_void_p, c_void_p, c_void_p)
        def cb_func(cb_arg0, cb_arg1):
            cb_arg0 = schedule_node(ctx=arg0.ctx, ptr=(cb_arg0))
            try:
                res = arg1(cb_arg0)
            except BaseException as e:
                exc_info[0] = e
                return None
            return isl.isl_schedule_node_copy(res.ptr)
        cb = fn(cb_func)
        ctx = arg0.ctx
        res = isl.isl_schedule_node_map_descendant_bottom_up(isl.isl_schedule_node_copy(arg0.ptr), cb, None)
        if exc_info[0] is not None:
            raise exc_info[0]
        obj = schedule_node(ctx=ctx, ptr=res)
        return obj
    def n_children(arg0):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_n_children(arg0.ptr)
        if res < 0:
            raise
        return int(res)
    def next_sibling(arg0):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_next_sibling(isl.isl_schedule_node_copy(arg0.ptr))
        obj = schedule_node(ctx=ctx, ptr=res)
        return obj
    def order_after(arg0, arg1):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_set:
                arg1 = union_set(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_order_after(isl.isl_schedule_node_copy(arg0.ptr), isl.isl_union_set_copy(arg1.ptr))
        obj = schedule_node(ctx=ctx, ptr=res)
        return obj
    def order_before(arg0, arg1):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_set:
                arg1 = union_set(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_order_before(isl.isl_schedule_node_copy(arg0.ptr), isl.isl_union_set_copy(arg1.ptr))
        obj = schedule_node(ctx=ctx, ptr=res)
        return obj
    def parent(arg0):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_parent(isl.isl_schedule_node_copy(arg0.ptr))
        obj = schedule_node(ctx=ctx, ptr=res)
        return obj
    def prefix_schedule_multi_union_pw_aff(arg0):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_get_prefix_schedule_multi_union_pw_aff(arg0.ptr)
        obj = multi_union_pw_aff(ctx=ctx, ptr=res)
        return obj
    def get_prefix_schedule_multi_union_pw_aff(arg0):
        return arg0.prefix_schedule_multi_union_pw_aff()
    def prefix_schedule_union_map(arg0):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_get_prefix_schedule_union_map(arg0.ptr)
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def get_prefix_schedule_union_map(arg0):
        return arg0.prefix_schedule_union_map()
    def prefix_schedule_union_pw_multi_aff(arg0):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_get_prefix_schedule_union_pw_multi_aff(arg0.ptr)
        obj = union_pw_multi_aff(ctx=ctx, ptr=res)
        return obj
    def get_prefix_schedule_union_pw_multi_aff(arg0):
        return arg0.prefix_schedule_union_pw_multi_aff()
    def previous_sibling(arg0):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_previous_sibling(isl.isl_schedule_node_copy(arg0.ptr))
        obj = schedule_node(ctx=ctx, ptr=res)
        return obj
    def root(arg0):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_root(isl.isl_schedule_node_copy(arg0.ptr))
        obj = schedule_node(ctx=ctx, ptr=res)
        return obj
    def schedule(arg0):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_get_schedule(arg0.ptr)
        obj = schedule(ctx=ctx, ptr=res)
        return obj
    def get_schedule(arg0):
        return arg0.schedule()
    def shared_ancestor(arg0, arg1):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is schedule_node:
                arg1 = schedule_node(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_get_shared_ancestor(arg0.ptr, arg1.ptr)
        obj = schedule_node(ctx=ctx, ptr=res)
        return obj
    def get_shared_ancestor(arg0, arg1):
        return arg0.shared_ancestor(arg1)
    def tree_depth(arg0):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_get_tree_depth(arg0.ptr)
        if res < 0:
            raise
        return int(res)
    def get_tree_depth(arg0):
        return arg0.tree_depth()

isl.isl_schedule_node_ancestor.restype = c_void_p
isl.isl_schedule_node_ancestor.argtypes = [c_void_p, c_int]
isl.isl_schedule_node_get_ancestor_child_position.argtypes = [c_void_p, c_void_p]
isl.isl_schedule_node_child.restype = c_void_p
isl.isl_schedule_node_child.argtypes = [c_void_p, c_int]
isl.isl_schedule_node_get_child_position.argtypes = [c_void_p]
isl.isl_schedule_node_every_descendant.argtypes = [c_void_p, c_void_p, c_void_p]
isl.isl_schedule_node_first_child.restype = c_void_p
isl.isl_schedule_node_first_child.argtypes = [c_void_p]
isl.isl_schedule_node_foreach_ancestor_top_down.argtypes = [c_void_p, c_void_p, c_void_p]
isl.isl_schedule_node_foreach_descendant_top_down.argtypes = [c_void_p, c_void_p, c_void_p]
isl.isl_schedule_node_from_domain.restype = c_void_p
isl.isl_schedule_node_from_domain.argtypes = [c_void_p]
isl.isl_schedule_node_from_extension.restype = c_void_p
isl.isl_schedule_node_from_extension.argtypes = [c_void_p]
isl.isl_schedule_node_graft_after.restype = c_void_p
isl.isl_schedule_node_graft_after.argtypes = [c_void_p, c_void_p]
isl.isl_schedule_node_graft_before.restype = c_void_p
isl.isl_schedule_node_graft_before.argtypes = [c_void_p, c_void_p]
isl.isl_schedule_node_has_children.argtypes = [c_void_p]
isl.isl_schedule_node_has_next_sibling.argtypes = [c_void_p]
isl.isl_schedule_node_has_parent.argtypes = [c_void_p]
isl.isl_schedule_node_has_previous_sibling.argtypes = [c_void_p]
isl.isl_schedule_node_insert_context.restype = c_void_p
isl.isl_schedule_node_insert_context.argtypes = [c_void_p, c_void_p]
isl.isl_schedule_node_insert_filter.restype = c_void_p
isl.isl_schedule_node_insert_filter.argtypes = [c_void_p, c_void_p]
isl.isl_schedule_node_insert_guard.restype = c_void_p
isl.isl_schedule_node_insert_guard.argtypes = [c_void_p, c_void_p]
isl.isl_schedule_node_insert_mark.restype = c_void_p
isl.isl_schedule_node_insert_mark.argtypes = [c_void_p, c_void_p]
isl.isl_schedule_node_insert_partial_schedule.restype = c_void_p
isl.isl_schedule_node_insert_partial_schedule.argtypes = [c_void_p, c_void_p]
isl.isl_schedule_node_insert_sequence.restype = c_void_p
isl.isl_schedule_node_insert_sequence.argtypes = [c_void_p, c_void_p]
isl.isl_schedule_node_insert_set.restype = c_void_p
isl.isl_schedule_node_insert_set.argtypes = [c_void_p, c_void_p]
isl.isl_schedule_node_is_equal.argtypes = [c_void_p, c_void_p]
isl.isl_schedule_node_is_subtree_anchored.argtypes = [c_void_p]
isl.isl_schedule_node_map_descendant_bottom_up.restype = c_void_p
isl.isl_schedule_node_map_descendant_bottom_up.argtypes = [c_void_p, c_void_p, c_void_p]
isl.isl_schedule_node_n_children.argtypes = [c_void_p]
isl.isl_schedule_node_next_sibling.restype = c_void_p
isl.isl_schedule_node_next_sibling.argtypes = [c_void_p]
isl.isl_schedule_node_order_after.restype = c_void_p
isl.isl_schedule_node_order_after.argtypes = [c_void_p, c_void_p]
isl.isl_schedule_node_order_before.restype = c_void_p
isl.isl_schedule_node_order_before.argtypes = [c_void_p, c_void_p]
isl.isl_schedule_node_parent.restype = c_void_p
isl.isl_schedule_node_parent.argtypes = [c_void_p]
isl.isl_schedule_node_get_prefix_schedule_multi_union_pw_aff.restype = c_void_p
isl.isl_schedule_node_get_prefix_schedule_multi_union_pw_aff.argtypes = [c_void_p]
isl.isl_schedule_node_get_prefix_schedule_union_map.restype = c_void_p
isl.isl_schedule_node_get_prefix_schedule_union_map.argtypes = [c_void_p]
isl.isl_schedule_node_get_prefix_schedule_union_pw_multi_aff.restype = c_void_p
isl.isl_schedule_node_get_prefix_schedule_union_pw_multi_aff.argtypes = [c_void_p]
isl.isl_schedule_node_previous_sibling.restype = c_void_p
isl.isl_schedule_node_previous_sibling.argtypes = [c_void_p]
isl.isl_schedule_node_root.restype = c_void_p
isl.isl_schedule_node_root.argtypes = [c_void_p]
isl.isl_schedule_node_get_schedule.restype = c_void_p
isl.isl_schedule_node_get_schedule.argtypes = [c_void_p]
isl.isl_schedule_node_get_shared_ancestor.restype = c_void_p
isl.isl_schedule_node_get_shared_ancestor.argtypes = [c_void_p, c_void_p]
isl.isl_schedule_node_get_tree_depth.argtypes = [c_void_p]
isl.isl_schedule_node_copy.restype = c_void_p
isl.isl_schedule_node_copy.argtypes = [c_void_p]
isl.isl_schedule_node_free.restype = c_void_p
isl.isl_schedule_node_free.argtypes = [c_void_p]
isl.isl_schedule_node_to_str.restype = POINTER(c_char)
isl.isl_schedule_node_to_str.argtypes = [c_void_p]
isl.isl_schedule_node_get_type.argtypes = [c_void_p]

class schedule_node_band(schedule_node):
    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_schedule_node_free(self.ptr)
    def __new__(cls, *args, **keywords):
        return super(schedule_node_band, cls).__new__(cls)
    def __str__(arg0):
        try:
            if not arg0.__class__ is schedule_node_band:
                arg0 = schedule_node_band(arg0)
        except:
            raise
        ptr = isl.isl_schedule_node_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.schedule_node_band("""%s""")' % s
        else:
            return 'isl.schedule_node_band("%s")' % s
    def ast_build_options(arg0):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_band_get_ast_build_options(arg0.ptr)
        obj = union_set(ctx=ctx, ptr=res)
        return obj
    def get_ast_build_options(arg0):
        return arg0.ast_build_options()
    def ast_isolate_option(arg0):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_band_get_ast_isolate_option(arg0.ptr)
        obj = set(ctx=ctx, ptr=res)
        return obj
    def get_ast_isolate_option(arg0):
        return arg0.ast_isolate_option()
    def member_get_coincident(arg0, arg1):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_band_member_get_coincident(arg0.ptr, arg1)
        if res < 0:
            raise
        return bool(res)
    def member_set_coincident(arg0, arg1, arg2):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_band_member_set_coincident(isl.isl_schedule_node_copy(arg0.ptr), arg1, arg2)
        obj = schedule_node(ctx=ctx, ptr=res)
        return obj
    def mod(arg0, arg1):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_val:
                arg1 = multi_val(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_band_mod(isl.isl_schedule_node_copy(arg0.ptr), isl.isl_multi_val_copy(arg1.ptr))
        obj = schedule_node(ctx=ctx, ptr=res)
        return obj
    def n_member(arg0):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_band_n_member(arg0.ptr)
        if res < 0:
            raise
        return int(res)
    def partial_schedule(arg0):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_band_get_partial_schedule(arg0.ptr)
        obj = multi_union_pw_aff(ctx=ctx, ptr=res)
        return obj
    def get_partial_schedule(arg0):
        return arg0.partial_schedule()
    def permutable(arg0):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_band_get_permutable(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def get_permutable(arg0):
        return arg0.permutable()
    def scale(arg0, arg1):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_val:
                arg1 = multi_val(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_band_scale(isl.isl_schedule_node_copy(arg0.ptr), isl.isl_multi_val_copy(arg1.ptr))
        obj = schedule_node(ctx=ctx, ptr=res)
        return obj
    def scale_down(arg0, arg1):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_val:
                arg1 = multi_val(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_band_scale_down(isl.isl_schedule_node_copy(arg0.ptr), isl.isl_multi_val_copy(arg1.ptr))
        obj = schedule_node(ctx=ctx, ptr=res)
        return obj
    def set_ast_build_options(arg0, arg1):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_set:
                arg1 = union_set(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_band_set_ast_build_options(isl.isl_schedule_node_copy(arg0.ptr), isl.isl_union_set_copy(arg1.ptr))
        obj = schedule_node(ctx=ctx, ptr=res)
        return obj
    def set_permutable(arg0, arg1):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_band_set_permutable(isl.isl_schedule_node_copy(arg0.ptr), arg1)
        obj = schedule_node(ctx=ctx, ptr=res)
        return obj
    def shift(arg0, arg1):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_union_pw_aff:
                arg1 = multi_union_pw_aff(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_band_shift(isl.isl_schedule_node_copy(arg0.ptr), isl.isl_multi_union_pw_aff_copy(arg1.ptr))
        obj = schedule_node(ctx=ctx, ptr=res)
        return obj
    def split(arg0, arg1):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_band_split(isl.isl_schedule_node_copy(arg0.ptr), arg1)
        obj = schedule_node(ctx=ctx, ptr=res)
        return obj
    def tile(arg0, arg1):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is multi_val:
                arg1 = multi_val(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_band_tile(isl.isl_schedule_node_copy(arg0.ptr), isl.isl_multi_val_copy(arg1.ptr))
        obj = schedule_node(ctx=ctx, ptr=res)
        return obj
    def member_set_ast_loop_default(arg0, arg1):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_band_member_set_ast_loop_type(isl.isl_schedule_node_copy(arg0.ptr), arg1, 0)
        obj = schedule_node(ctx=ctx, ptr=res)
        return obj
    def member_set_ast_loop_atomic(arg0, arg1):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_band_member_set_ast_loop_type(isl.isl_schedule_node_copy(arg0.ptr), arg1, 1)
        obj = schedule_node(ctx=ctx, ptr=res)
        return obj
    def member_set_ast_loop_unroll(arg0, arg1):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_band_member_set_ast_loop_type(isl.isl_schedule_node_copy(arg0.ptr), arg1, 2)
        obj = schedule_node(ctx=ctx, ptr=res)
        return obj
    def member_set_ast_loop_separate(arg0, arg1):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_band_member_set_ast_loop_type(isl.isl_schedule_node_copy(arg0.ptr), arg1, 3)
        obj = schedule_node(ctx=ctx, ptr=res)
        return obj

isl.isl_schedule_node_band_get_ast_build_options.restype = c_void_p
isl.isl_schedule_node_band_get_ast_build_options.argtypes = [c_void_p]
isl.isl_schedule_node_band_get_ast_isolate_option.restype = c_void_p
isl.isl_schedule_node_band_get_ast_isolate_option.argtypes = [c_void_p]
isl.isl_schedule_node_band_member_get_coincident.argtypes = [c_void_p, c_int]
isl.isl_schedule_node_band_member_set_coincident.restype = c_void_p
isl.isl_schedule_node_band_member_set_coincident.argtypes = [c_void_p, c_int, c_int]
isl.isl_schedule_node_band_mod.restype = c_void_p
isl.isl_schedule_node_band_mod.argtypes = [c_void_p, c_void_p]
isl.isl_schedule_node_band_n_member.argtypes = [c_void_p]
isl.isl_schedule_node_band_get_partial_schedule.restype = c_void_p
isl.isl_schedule_node_band_get_partial_schedule.argtypes = [c_void_p]
isl.isl_schedule_node_band_get_permutable.argtypes = [c_void_p]
isl.isl_schedule_node_band_scale.restype = c_void_p
isl.isl_schedule_node_band_scale.argtypes = [c_void_p, c_void_p]
isl.isl_schedule_node_band_scale_down.restype = c_void_p
isl.isl_schedule_node_band_scale_down.argtypes = [c_void_p, c_void_p]
isl.isl_schedule_node_band_set_ast_build_options.restype = c_void_p
isl.isl_schedule_node_band_set_ast_build_options.argtypes = [c_void_p, c_void_p]
isl.isl_schedule_node_band_set_permutable.restype = c_void_p
isl.isl_schedule_node_band_set_permutable.argtypes = [c_void_p, c_int]
isl.isl_schedule_node_band_shift.restype = c_void_p
isl.isl_schedule_node_band_shift.argtypes = [c_void_p, c_void_p]
isl.isl_schedule_node_band_split.restype = c_void_p
isl.isl_schedule_node_band_split.argtypes = [c_void_p, c_int]
isl.isl_schedule_node_band_tile.restype = c_void_p
isl.isl_schedule_node_band_tile.argtypes = [c_void_p, c_void_p]
isl.isl_schedule_node_band_member_set_ast_loop_type.restype = c_void_p
isl.isl_schedule_node_band_member_set_ast_loop_type.argtypes = [c_void_p, c_int, c_int]
isl.isl_schedule_node_copy.restype = c_void_p
isl.isl_schedule_node_copy.argtypes = [c_void_p]
isl.isl_schedule_node_free.restype = c_void_p
isl.isl_schedule_node_free.argtypes = [c_void_p]
isl.isl_schedule_node_to_str.restype = POINTER(c_char)
isl.isl_schedule_node_to_str.argtypes = [c_void_p]

class schedule_node_context(schedule_node):
    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_schedule_node_free(self.ptr)
    def __new__(cls, *args, **keywords):
        return super(schedule_node_context, cls).__new__(cls)
    def __str__(arg0):
        try:
            if not arg0.__class__ is schedule_node_context:
                arg0 = schedule_node_context(arg0)
        except:
            raise
        ptr = isl.isl_schedule_node_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.schedule_node_context("""%s""")' % s
        else:
            return 'isl.schedule_node_context("%s")' % s
    def context(arg0):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_context_get_context(arg0.ptr)
        obj = set(ctx=ctx, ptr=res)
        return obj
    def get_context(arg0):
        return arg0.context()

isl.isl_schedule_node_context_get_context.restype = c_void_p
isl.isl_schedule_node_context_get_context.argtypes = [c_void_p]
isl.isl_schedule_node_copy.restype = c_void_p
isl.isl_schedule_node_copy.argtypes = [c_void_p]
isl.isl_schedule_node_free.restype = c_void_p
isl.isl_schedule_node_free.argtypes = [c_void_p]
isl.isl_schedule_node_to_str.restype = POINTER(c_char)
isl.isl_schedule_node_to_str.argtypes = [c_void_p]

class schedule_node_domain(schedule_node):
    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_schedule_node_free(self.ptr)
    def __new__(cls, *args, **keywords):
        return super(schedule_node_domain, cls).__new__(cls)
    def __str__(arg0):
        try:
            if not arg0.__class__ is schedule_node_domain:
                arg0 = schedule_node_domain(arg0)
        except:
            raise
        ptr = isl.isl_schedule_node_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.schedule_node_domain("""%s""")' % s
        else:
            return 'isl.schedule_node_domain("%s")' % s
    def domain(arg0):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_domain_get_domain(arg0.ptr)
        obj = union_set(ctx=ctx, ptr=res)
        return obj
    def get_domain(arg0):
        return arg0.domain()

isl.isl_schedule_node_domain_get_domain.restype = c_void_p
isl.isl_schedule_node_domain_get_domain.argtypes = [c_void_p]
isl.isl_schedule_node_copy.restype = c_void_p
isl.isl_schedule_node_copy.argtypes = [c_void_p]
isl.isl_schedule_node_free.restype = c_void_p
isl.isl_schedule_node_free.argtypes = [c_void_p]
isl.isl_schedule_node_to_str.restype = POINTER(c_char)
isl.isl_schedule_node_to_str.argtypes = [c_void_p]

class schedule_node_expansion(schedule_node):
    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_schedule_node_free(self.ptr)
    def __new__(cls, *args, **keywords):
        return super(schedule_node_expansion, cls).__new__(cls)
    def __str__(arg0):
        try:
            if not arg0.__class__ is schedule_node_expansion:
                arg0 = schedule_node_expansion(arg0)
        except:
            raise
        ptr = isl.isl_schedule_node_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.schedule_node_expansion("""%s""")' % s
        else:
            return 'isl.schedule_node_expansion("%s")' % s
    def contraction(arg0):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_expansion_get_contraction(arg0.ptr)
        obj = union_pw_multi_aff(ctx=ctx, ptr=res)
        return obj
    def get_contraction(arg0):
        return arg0.contraction()
    def expansion(arg0):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_expansion_get_expansion(arg0.ptr)
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def get_expansion(arg0):
        return arg0.expansion()

isl.isl_schedule_node_expansion_get_contraction.restype = c_void_p
isl.isl_schedule_node_expansion_get_contraction.argtypes = [c_void_p]
isl.isl_schedule_node_expansion_get_expansion.restype = c_void_p
isl.isl_schedule_node_expansion_get_expansion.argtypes = [c_void_p]
isl.isl_schedule_node_copy.restype = c_void_p
isl.isl_schedule_node_copy.argtypes = [c_void_p]
isl.isl_schedule_node_free.restype = c_void_p
isl.isl_schedule_node_free.argtypes = [c_void_p]
isl.isl_schedule_node_to_str.restype = POINTER(c_char)
isl.isl_schedule_node_to_str.argtypes = [c_void_p]

class schedule_node_extension(schedule_node):
    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_schedule_node_free(self.ptr)
    def __new__(cls, *args, **keywords):
        return super(schedule_node_extension, cls).__new__(cls)
    def __str__(arg0):
        try:
            if not arg0.__class__ is schedule_node_extension:
                arg0 = schedule_node_extension(arg0)
        except:
            raise
        ptr = isl.isl_schedule_node_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.schedule_node_extension("""%s""")' % s
        else:
            return 'isl.schedule_node_extension("%s")' % s
    def extension(arg0):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_extension_get_extension(arg0.ptr)
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def get_extension(arg0):
        return arg0.extension()

isl.isl_schedule_node_extension_get_extension.restype = c_void_p
isl.isl_schedule_node_extension_get_extension.argtypes = [c_void_p]
isl.isl_schedule_node_copy.restype = c_void_p
isl.isl_schedule_node_copy.argtypes = [c_void_p]
isl.isl_schedule_node_free.restype = c_void_p
isl.isl_schedule_node_free.argtypes = [c_void_p]
isl.isl_schedule_node_to_str.restype = POINTER(c_char)
isl.isl_schedule_node_to_str.argtypes = [c_void_p]

class schedule_node_filter(schedule_node):
    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_schedule_node_free(self.ptr)
    def __new__(cls, *args, **keywords):
        return super(schedule_node_filter, cls).__new__(cls)
    def __str__(arg0):
        try:
            if not arg0.__class__ is schedule_node_filter:
                arg0 = schedule_node_filter(arg0)
        except:
            raise
        ptr = isl.isl_schedule_node_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.schedule_node_filter("""%s""")' % s
        else:
            return 'isl.schedule_node_filter("%s")' % s
    def filter(arg0):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_filter_get_filter(arg0.ptr)
        obj = union_set(ctx=ctx, ptr=res)
        return obj
    def get_filter(arg0):
        return arg0.filter()

isl.isl_schedule_node_filter_get_filter.restype = c_void_p
isl.isl_schedule_node_filter_get_filter.argtypes = [c_void_p]
isl.isl_schedule_node_copy.restype = c_void_p
isl.isl_schedule_node_copy.argtypes = [c_void_p]
isl.isl_schedule_node_free.restype = c_void_p
isl.isl_schedule_node_free.argtypes = [c_void_p]
isl.isl_schedule_node_to_str.restype = POINTER(c_char)
isl.isl_schedule_node_to_str.argtypes = [c_void_p]

class schedule_node_guard(schedule_node):
    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_schedule_node_free(self.ptr)
    def __new__(cls, *args, **keywords):
        return super(schedule_node_guard, cls).__new__(cls)
    def __str__(arg0):
        try:
            if not arg0.__class__ is schedule_node_guard:
                arg0 = schedule_node_guard(arg0)
        except:
            raise
        ptr = isl.isl_schedule_node_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.schedule_node_guard("""%s""")' % s
        else:
            return 'isl.schedule_node_guard("%s")' % s
    def guard(arg0):
        try:
            if not arg0.__class__ is schedule_node:
                arg0 = schedule_node(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_schedule_node_guard_get_guard(arg0.ptr)
        obj = set(ctx=ctx, ptr=res)
        return obj
    def get_guard(arg0):
        return arg0.guard()

isl.isl_schedule_node_guard_get_guard.restype = c_void_p
isl.isl_schedule_node_guard_get_guard.argtypes = [c_void_p]
isl.isl_schedule_node_copy.restype = c_void_p
isl.isl_schedule_node_copy.argtypes = [c_void_p]
isl.isl_schedule_node_free.restype = c_void_p
isl.isl_schedule_node_free.argtypes = [c_void_p]
isl.isl_schedule_node_to_str.restype = POINTER(c_char)
isl.isl_schedule_node_to_str.argtypes = [c_void_p]

class schedule_node_leaf(schedule_node):
    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_schedule_node_free(self.ptr)
    def __new__(cls, *args, **keywords):
        return super(schedule_node_leaf, cls).__new__(cls)
    def __str__(arg0):
        try:
            if not arg0.__class__ is schedule_node_leaf:
                arg0 = schedule_node_leaf(arg0)
        except:
            raise
        ptr = isl.isl_schedule_node_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.schedule_node_leaf("""%s""")' % s
        else:
            return 'isl.schedule_node_leaf("%s")' % s

isl.isl_schedule_node_copy.restype = c_void_p
isl.isl_schedule_node_copy.argtypes = [c_void_p]
isl.isl_schedule_node_free.restype = c_void_p
isl.isl_schedule_node_free.argtypes = [c_void_p]
isl.isl_schedule_node_to_str.restype = POINTER(c_char)
isl.isl_schedule_node_to_str.argtypes = [c_void_p]

class schedule_node_mark(schedule_node):
    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_schedule_node_free(self.ptr)
    def __new__(cls, *args, **keywords):
        return super(schedule_node_mark, cls).__new__(cls)
    def __str__(arg0):
        try:
            if not arg0.__class__ is schedule_node_mark:
                arg0 = schedule_node_mark(arg0)
        except:
            raise
        ptr = isl.isl_schedule_node_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.schedule_node_mark("""%s""")' % s
        else:
            return 'isl.schedule_node_mark("%s")' % s

isl.isl_schedule_node_copy.restype = c_void_p
isl.isl_schedule_node_copy.argtypes = [c_void_p]
isl.isl_schedule_node_free.restype = c_void_p
isl.isl_schedule_node_free.argtypes = [c_void_p]
isl.isl_schedule_node_to_str.restype = POINTER(c_char)
isl.isl_schedule_node_to_str.argtypes = [c_void_p]

class schedule_node_sequence(schedule_node):
    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_schedule_node_free(self.ptr)
    def __new__(cls, *args, **keywords):
        return super(schedule_node_sequence, cls).__new__(cls)
    def __str__(arg0):
        try:
            if not arg0.__class__ is schedule_node_sequence:
                arg0 = schedule_node_sequence(arg0)
        except:
            raise
        ptr = isl.isl_schedule_node_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.schedule_node_sequence("""%s""")' % s
        else:
            return 'isl.schedule_node_sequence("%s")' % s

isl.isl_schedule_node_copy.restype = c_void_p
isl.isl_schedule_node_copy.argtypes = [c_void_p]
isl.isl_schedule_node_free.restype = c_void_p
isl.isl_schedule_node_free.argtypes = [c_void_p]
isl.isl_schedule_node_to_str.restype = POINTER(c_char)
isl.isl_schedule_node_to_str.argtypes = [c_void_p]

class schedule_node_set(schedule_node):
    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_schedule_node_free(self.ptr)
    def __new__(cls, *args, **keywords):
        return super(schedule_node_set, cls).__new__(cls)
    def __str__(arg0):
        try:
            if not arg0.__class__ is schedule_node_set:
                arg0 = schedule_node_set(arg0)
        except:
            raise
        ptr = isl.isl_schedule_node_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.schedule_node_set("""%s""")' % s
        else:
            return 'isl.schedule_node_set("%s")' % s

isl.isl_schedule_node_copy.restype = c_void_p
isl.isl_schedule_node_copy.argtypes = [c_void_p]
isl.isl_schedule_node_free.restype = c_void_p
isl.isl_schedule_node_free.argtypes = [c_void_p]
isl.isl_schedule_node_to_str.restype = POINTER(c_char)
isl.isl_schedule_node_to_str.argtypes = [c_void_p]

class set_list(object):
    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]) == int:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_set_list_alloc(self.ctx, args[0])
            return
        if len(args) == 1 and args[0].__class__ is set:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_set_list_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_set_list_read_from_str(self.ctx, args[0].encode('ascii'))
            return
        raise Error
    def __del__(self):
        if hasattr(self, 'ptr'):
            isl.isl_set_list_free(self.ptr)
    def __str__(arg0):
        try:
            if not arg0.__class__ is set_list:
                arg0 = set_list(arg0)
        except:
            raise
        ptr = isl.isl_set_list_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.set_list("""%s""")' % s
        else:
            return 'isl.set_list("%s")' % s
    def add(arg0, arg1):
        try:
            if not arg0.__class__ is set_list:
                arg0 = set_list(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is set:
                arg1 = set(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_set_list_add(isl.isl_set_list_copy(arg0.ptr), isl.isl_set_copy(arg1.ptr))
        obj = set_list(ctx=ctx, ptr=res)
        return obj
    def at(arg0, arg1):
        try:
            if not arg0.__class__ is set_list:
                arg0 = set_list(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_set_list_get_at(arg0.ptr, arg1)
        obj = set(ctx=ctx, ptr=res)
        return obj
    def get_at(arg0, arg1):
        return arg0.at(arg1)
    def clear(arg0):
        try:
            if not arg0.__class__ is set_list:
                arg0 = set_list(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_set_list_clear(isl.isl_set_list_copy(arg0.ptr))
        obj = set_list(ctx=ctx, ptr=res)
        return obj
    def concat(arg0, arg1):
        try:
            if not arg0.__class__ is set_list:
                arg0 = set_list(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is set_list:
                arg1 = set_list(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_set_list_concat(isl.isl_set_list_copy(arg0.ptr), isl.isl_set_list_copy(arg1.ptr))
        obj = set_list(ctx=ctx, ptr=res)
        return obj
    def drop(arg0, arg1, arg2):
        try:
            if not arg0.__class__ is set_list:
                arg0 = set_list(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_set_list_drop(isl.isl_set_list_copy(arg0.ptr), arg1, arg2)
        obj = set_list(ctx=ctx, ptr=res)
        return obj
    def foreach(arg0, arg1):
        try:
            if not arg0.__class__ is set_list:
                arg0 = set_list(arg0)
        except:
            raise
        exc_info = [None]
        fn = CFUNCTYPE(c_int, c_void_p, c_void_p)
        def cb_func(cb_arg0, cb_arg1):
            cb_arg0 = set(ctx=arg0.ctx, ptr=(cb_arg0))
            try:
                arg1(cb_arg0)
            except BaseException as e:
                exc_info[0] = e
                return -1
            return 0
        cb = fn(cb_func)
        ctx = arg0.ctx
        res = isl.isl_set_list_foreach(arg0.ptr, cb, None)
        if exc_info[0] is not None:
            raise exc_info[0]
        if res < 0:
            raise
    def insert(arg0, arg1, arg2):
        try:
            if not arg0.__class__ is set_list:
                arg0 = set_list(arg0)
        except:
            raise
        try:
            if not arg2.__class__ is set:
                arg2 = set(arg2)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_set_list_insert(isl.isl_set_list_copy(arg0.ptr), arg1, isl.isl_set_copy(arg2.ptr))
        obj = set_list(ctx=ctx, ptr=res)
        return obj
    def size(arg0):
        try:
            if not arg0.__class__ is set_list:
                arg0 = set_list(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_set_list_size(arg0.ptr)
        if res < 0:
            raise
        return int(res)

isl.isl_set_list_alloc.restype = c_void_p
isl.isl_set_list_alloc.argtypes = [Context, c_int]
isl.isl_set_list_from_set.restype = c_void_p
isl.isl_set_list_from_set.argtypes = [c_void_p]
isl.isl_set_list_read_from_str.restype = c_void_p
isl.isl_set_list_read_from_str.argtypes = [Context, c_char_p]
isl.isl_set_list_add.restype = c_void_p
isl.isl_set_list_add.argtypes = [c_void_p, c_void_p]
isl.isl_set_list_get_at.restype = c_void_p
isl.isl_set_list_get_at.argtypes = [c_void_p, c_int]
isl.isl_set_list_clear.restype = c_void_p
isl.isl_set_list_clear.argtypes = [c_void_p]
isl.isl_set_list_concat.restype = c_void_p
isl.isl_set_list_concat.argtypes = [c_void_p, c_void_p]
isl.isl_set_list_drop.restype = c_void_p
isl.isl_set_list_drop.argtypes = [c_void_p, c_int, c_int]
isl.isl_set_list_foreach.argtypes = [c_void_p, c_void_p, c_void_p]
isl.isl_set_list_insert.restype = c_void_p
isl.isl_set_list_insert.argtypes = [c_void_p, c_int, c_void_p]
isl.isl_set_list_size.argtypes = [c_void_p]
isl.isl_set_list_copy.restype = c_void_p
isl.isl_set_list_copy.argtypes = [c_void_p]
isl.isl_set_list_free.restype = c_void_p
isl.isl_set_list_free.argtypes = [c_void_p]
isl.isl_set_list_to_str.restype = POINTER(c_char)
isl.isl_set_list_to_str.argtypes = [c_void_p]

class space(object):
    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_space_free(self.ptr)
    def __str__(arg0):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        ptr = isl.isl_space_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.space("""%s""")' % s
        else:
            return 'isl.space("%s")' % s
    def add_named_tuple(*args):
        if len(args) == 3 and (args[1].__class__ is id or type(args[1]) == str) and type(args[2]) == int:
            args = list(args)
            try:
                if not args[1].__class__ is id:
                    args[1] = id(args[1])
            except:
                raise
            ctx = args[0].ctx
            res = isl.isl_space_add_named_tuple_id_ui(isl.isl_space_copy(args[0].ptr), isl.isl_id_copy(args[1].ptr), args[2])
            obj = space(ctx=ctx, ptr=res)
            return obj
        raise Error
    def add_param(*args):
        if len(args) == 2 and (args[1].__class__ is id or type(args[1]) == str):
            args = list(args)
            try:
                if not args[1].__class__ is id:
                    args[1] = id(args[1])
            except:
                raise
            ctx = args[0].ctx
            res = isl.isl_space_add_param_id(isl.isl_space_copy(args[0].ptr), isl.isl_id_copy(args[1].ptr))
            obj = space(ctx=ctx, ptr=res)
            return obj
        raise Error
    def add_unnamed_tuple(*args):
        if len(args) == 2 and type(args[1]) == int:
            ctx = args[0].ctx
            res = isl.isl_space_add_unnamed_tuple_ui(isl.isl_space_copy(args[0].ptr), args[1])
            obj = space(ctx=ctx, ptr=res)
            return obj
        raise Error
    def curry(arg0):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_space_curry(isl.isl_space_copy(arg0.ptr))
        obj = space(ctx=ctx, ptr=res)
        return obj
    def domain(arg0):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_space_domain(isl.isl_space_copy(arg0.ptr))
        obj = space(ctx=ctx, ptr=res)
        return obj
    def domain_map_multi_aff(arg0):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_space_domain_map_multi_aff(isl.isl_space_copy(arg0.ptr))
        obj = multi_aff(ctx=ctx, ptr=res)
        return obj
    def domain_map_pw_multi_aff(arg0):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_space_domain_map_pw_multi_aff(isl.isl_space_copy(arg0.ptr))
        obj = pw_multi_aff(ctx=ctx, ptr=res)
        return obj
    def domain_tuple_id(arg0):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_space_get_domain_tuple_id(arg0.ptr)
        obj = id(ctx=ctx, ptr=res)
        return obj
    def get_domain_tuple_id(arg0):
        return arg0.domain_tuple_id()
    def flatten_domain(arg0):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_space_flatten_domain(isl.isl_space_copy(arg0.ptr))
        obj = space(ctx=ctx, ptr=res)
        return obj
    def flatten_range(arg0):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_space_flatten_range(isl.isl_space_copy(arg0.ptr))
        obj = space(ctx=ctx, ptr=res)
        return obj
    def has_domain_tuple_id(arg0):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_space_has_domain_tuple_id(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def has_range_tuple_id(arg0):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_space_has_range_tuple_id(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def identity_multi_aff_on_domain(arg0):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_space_identity_multi_aff_on_domain(isl.isl_space_copy(arg0.ptr))
        obj = multi_aff(ctx=ctx, ptr=res)
        return obj
    def identity_multi_pw_aff_on_domain(arg0):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_space_identity_multi_pw_aff_on_domain(isl.isl_space_copy(arg0.ptr))
        obj = multi_pw_aff(ctx=ctx, ptr=res)
        return obj
    def identity_pw_multi_aff_on_domain(arg0):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_space_identity_pw_multi_aff_on_domain(isl.isl_space_copy(arg0.ptr))
        obj = pw_multi_aff(ctx=ctx, ptr=res)
        return obj
    def is_equal(arg0, arg1):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is space:
                arg1 = space(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_space_is_equal(arg0.ptr, arg1.ptr)
        if res < 0:
            raise
        return bool(res)
    def is_wrapping(arg0):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_space_is_wrapping(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def map_from_set(arg0):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_space_map_from_set(isl.isl_space_copy(arg0.ptr))
        obj = space(ctx=ctx, ptr=res)
        return obj
    def multi_aff(arg0, arg1):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is aff_list:
                arg1 = aff_list(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_space_multi_aff(isl.isl_space_copy(arg0.ptr), isl.isl_aff_list_copy(arg1.ptr))
        obj = multi_aff(ctx=ctx, ptr=res)
        return obj
    def multi_aff_on_domain(*args):
        if len(args) == 2 and args[1].__class__ is multi_val:
            ctx = args[0].ctx
            res = isl.isl_space_multi_aff_on_domain_multi_val(isl.isl_space_copy(args[0].ptr), isl.isl_multi_val_copy(args[1].ptr))
            obj = multi_aff(ctx=ctx, ptr=res)
            return obj
        raise Error
    def multi_id(arg0, arg1):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is id_list:
                arg1 = id_list(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_space_multi_id(isl.isl_space_copy(arg0.ptr), isl.isl_id_list_copy(arg1.ptr))
        obj = multi_id(ctx=ctx, ptr=res)
        return obj
    def multi_pw_aff(arg0, arg1):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is pw_aff_list:
                arg1 = pw_aff_list(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_space_multi_pw_aff(isl.isl_space_copy(arg0.ptr), isl.isl_pw_aff_list_copy(arg1.ptr))
        obj = multi_pw_aff(ctx=ctx, ptr=res)
        return obj
    def multi_union_pw_aff(arg0, arg1):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_pw_aff_list:
                arg1 = union_pw_aff_list(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_space_multi_union_pw_aff(isl.isl_space_copy(arg0.ptr), isl.isl_union_pw_aff_list_copy(arg1.ptr))
        obj = multi_union_pw_aff(ctx=ctx, ptr=res)
        return obj
    def multi_val(arg0, arg1):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is val_list:
                arg1 = val_list(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_space_multi_val(isl.isl_space_copy(arg0.ptr), isl.isl_val_list_copy(arg1.ptr))
        obj = multi_val(ctx=ctx, ptr=res)
        return obj
    def param_aff_on_domain(*args):
        if len(args) == 2 and (args[1].__class__ is id or type(args[1]) == str):
            args = list(args)
            try:
                if not args[1].__class__ is id:
                    args[1] = id(args[1])
            except:
                raise
            ctx = args[0].ctx
            res = isl.isl_space_param_aff_on_domain_id(isl.isl_space_copy(args[0].ptr), isl.isl_id_copy(args[1].ptr))
            obj = aff(ctx=ctx, ptr=res)
            return obj
        raise Error
    def params(arg0):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_space_params(isl.isl_space_copy(arg0.ptr))
        obj = space(ctx=ctx, ptr=res)
        return obj
    def product(arg0, arg1):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is space:
                arg1 = space(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_space_product(isl.isl_space_copy(arg0.ptr), isl.isl_space_copy(arg1.ptr))
        obj = space(ctx=ctx, ptr=res)
        return obj
    def range(arg0):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_space_range(isl.isl_space_copy(arg0.ptr))
        obj = space(ctx=ctx, ptr=res)
        return obj
    def range_map_multi_aff(arg0):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_space_range_map_multi_aff(isl.isl_space_copy(arg0.ptr))
        obj = multi_aff(ctx=ctx, ptr=res)
        return obj
    def range_map_pw_multi_aff(arg0):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_space_range_map_pw_multi_aff(isl.isl_space_copy(arg0.ptr))
        obj = pw_multi_aff(ctx=ctx, ptr=res)
        return obj
    def range_reverse(arg0):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_space_range_reverse(isl.isl_space_copy(arg0.ptr))
        obj = space(ctx=ctx, ptr=res)
        return obj
    def range_tuple_id(arg0):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_space_get_range_tuple_id(arg0.ptr)
        obj = id(ctx=ctx, ptr=res)
        return obj
    def get_range_tuple_id(arg0):
        return arg0.range_tuple_id()
    def reverse(arg0):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_space_reverse(isl.isl_space_copy(arg0.ptr))
        obj = space(ctx=ctx, ptr=res)
        return obj
    def set_domain_tuple(*args):
        if len(args) == 2 and (args[1].__class__ is id or type(args[1]) == str):
            args = list(args)
            try:
                if not args[1].__class__ is id:
                    args[1] = id(args[1])
            except:
                raise
            ctx = args[0].ctx
            res = isl.isl_space_set_domain_tuple_id(isl.isl_space_copy(args[0].ptr), isl.isl_id_copy(args[1].ptr))
            obj = space(ctx=ctx, ptr=res)
            return obj
        raise Error
    def set_range_tuple(*args):
        if len(args) == 2 and (args[1].__class__ is id or type(args[1]) == str):
            args = list(args)
            try:
                if not args[1].__class__ is id:
                    args[1] = id(args[1])
            except:
                raise
            ctx = args[0].ctx
            res = isl.isl_space_set_range_tuple_id(isl.isl_space_copy(args[0].ptr), isl.isl_id_copy(args[1].ptr))
            obj = space(ctx=ctx, ptr=res)
            return obj
        raise Error
    def uncurry(arg0):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_space_uncurry(isl.isl_space_copy(arg0.ptr))
        obj = space(ctx=ctx, ptr=res)
        return obj
    @staticmethod
    def unit():
        ctx = Context.getDefaultInstance()
        res = isl.isl_space_unit(ctx)
        obj = space(ctx=ctx, ptr=res)
        return obj
    def universe_map(arg0):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_space_universe_map(isl.isl_space_copy(arg0.ptr))
        obj = map(ctx=ctx, ptr=res)
        return obj
    def universe_set(arg0):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_space_universe_set(isl.isl_space_copy(arg0.ptr))
        obj = set(ctx=ctx, ptr=res)
        return obj
    def unwrap(arg0):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_space_unwrap(isl.isl_space_copy(arg0.ptr))
        obj = space(ctx=ctx, ptr=res)
        return obj
    def wrap(arg0):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_space_wrap(isl.isl_space_copy(arg0.ptr))
        obj = space(ctx=ctx, ptr=res)
        return obj
    def zero_aff_on_domain(arg0):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_space_zero_aff_on_domain(isl.isl_space_copy(arg0.ptr))
        obj = aff(ctx=ctx, ptr=res)
        return obj
    def zero_multi_aff(arg0):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_space_zero_multi_aff(isl.isl_space_copy(arg0.ptr))
        obj = multi_aff(ctx=ctx, ptr=res)
        return obj
    def zero_multi_pw_aff(arg0):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_space_zero_multi_pw_aff(isl.isl_space_copy(arg0.ptr))
        obj = multi_pw_aff(ctx=ctx, ptr=res)
        return obj
    def zero_multi_union_pw_aff(arg0):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_space_zero_multi_union_pw_aff(isl.isl_space_copy(arg0.ptr))
        obj = multi_union_pw_aff(ctx=ctx, ptr=res)
        return obj
    def zero_multi_val(arg0):
        try:
            if not arg0.__class__ is space:
                arg0 = space(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_space_zero_multi_val(isl.isl_space_copy(arg0.ptr))
        obj = multi_val(ctx=ctx, ptr=res)
        return obj

isl.isl_space_add_named_tuple_id_ui.restype = c_void_p
isl.isl_space_add_named_tuple_id_ui.argtypes = [c_void_p, c_void_p, c_int]
isl.isl_space_add_param_id.restype = c_void_p
isl.isl_space_add_param_id.argtypes = [c_void_p, c_void_p]
isl.isl_space_add_unnamed_tuple_ui.restype = c_void_p
isl.isl_space_add_unnamed_tuple_ui.argtypes = [c_void_p, c_int]
isl.isl_space_curry.restype = c_void_p
isl.isl_space_curry.argtypes = [c_void_p]
isl.isl_space_domain.restype = c_void_p
isl.isl_space_domain.argtypes = [c_void_p]
isl.isl_space_domain_map_multi_aff.restype = c_void_p
isl.isl_space_domain_map_multi_aff.argtypes = [c_void_p]
isl.isl_space_domain_map_pw_multi_aff.restype = c_void_p
isl.isl_space_domain_map_pw_multi_aff.argtypes = [c_void_p]
isl.isl_space_get_domain_tuple_id.restype = c_void_p
isl.isl_space_get_domain_tuple_id.argtypes = [c_void_p]
isl.isl_space_flatten_domain.restype = c_void_p
isl.isl_space_flatten_domain.argtypes = [c_void_p]
isl.isl_space_flatten_range.restype = c_void_p
isl.isl_space_flatten_range.argtypes = [c_void_p]
isl.isl_space_has_domain_tuple_id.argtypes = [c_void_p]
isl.isl_space_has_range_tuple_id.argtypes = [c_void_p]
isl.isl_space_identity_multi_aff_on_domain.restype = c_void_p
isl.isl_space_identity_multi_aff_on_domain.argtypes = [c_void_p]
isl.isl_space_identity_multi_pw_aff_on_domain.restype = c_void_p
isl.isl_space_identity_multi_pw_aff_on_domain.argtypes = [c_void_p]
isl.isl_space_identity_pw_multi_aff_on_domain.restype = c_void_p
isl.isl_space_identity_pw_multi_aff_on_domain.argtypes = [c_void_p]
isl.isl_space_is_equal.argtypes = [c_void_p, c_void_p]
isl.isl_space_is_wrapping.argtypes = [c_void_p]
isl.isl_space_map_from_set.restype = c_void_p
isl.isl_space_map_from_set.argtypes = [c_void_p]
isl.isl_space_multi_aff.restype = c_void_p
isl.isl_space_multi_aff.argtypes = [c_void_p, c_void_p]
isl.isl_space_multi_aff_on_domain_multi_val.restype = c_void_p
isl.isl_space_multi_aff_on_domain_multi_val.argtypes = [c_void_p, c_void_p]
isl.isl_space_multi_id.restype = c_void_p
isl.isl_space_multi_id.argtypes = [c_void_p, c_void_p]
isl.isl_space_multi_pw_aff.restype = c_void_p
isl.isl_space_multi_pw_aff.argtypes = [c_void_p, c_void_p]
isl.isl_space_multi_union_pw_aff.restype = c_void_p
isl.isl_space_multi_union_pw_aff.argtypes = [c_void_p, c_void_p]
isl.isl_space_multi_val.restype = c_void_p
isl.isl_space_multi_val.argtypes = [c_void_p, c_void_p]
isl.isl_space_param_aff_on_domain_id.restype = c_void_p
isl.isl_space_param_aff_on_domain_id.argtypes = [c_void_p, c_void_p]
isl.isl_space_params.restype = c_void_p
isl.isl_space_params.argtypes = [c_void_p]
isl.isl_space_product.restype = c_void_p
isl.isl_space_product.argtypes = [c_void_p, c_void_p]
isl.isl_space_range.restype = c_void_p
isl.isl_space_range.argtypes = [c_void_p]
isl.isl_space_range_map_multi_aff.restype = c_void_p
isl.isl_space_range_map_multi_aff.argtypes = [c_void_p]
isl.isl_space_range_map_pw_multi_aff.restype = c_void_p
isl.isl_space_range_map_pw_multi_aff.argtypes = [c_void_p]
isl.isl_space_range_reverse.restype = c_void_p
isl.isl_space_range_reverse.argtypes = [c_void_p]
isl.isl_space_get_range_tuple_id.restype = c_void_p
isl.isl_space_get_range_tuple_id.argtypes = [c_void_p]
isl.isl_space_reverse.restype = c_void_p
isl.isl_space_reverse.argtypes = [c_void_p]
isl.isl_space_set_domain_tuple_id.restype = c_void_p
isl.isl_space_set_domain_tuple_id.argtypes = [c_void_p, c_void_p]
isl.isl_space_set_range_tuple_id.restype = c_void_p
isl.isl_space_set_range_tuple_id.argtypes = [c_void_p, c_void_p]
isl.isl_space_uncurry.restype = c_void_p
isl.isl_space_uncurry.argtypes = [c_void_p]
isl.isl_space_unit.restype = c_void_p
isl.isl_space_unit.argtypes = [Context]
isl.isl_space_universe_map.restype = c_void_p
isl.isl_space_universe_map.argtypes = [c_void_p]
isl.isl_space_universe_set.restype = c_void_p
isl.isl_space_universe_set.argtypes = [c_void_p]
isl.isl_space_unwrap.restype = c_void_p
isl.isl_space_unwrap.argtypes = [c_void_p]
isl.isl_space_wrap.restype = c_void_p
isl.isl_space_wrap.argtypes = [c_void_p]
isl.isl_space_zero_aff_on_domain.restype = c_void_p
isl.isl_space_zero_aff_on_domain.argtypes = [c_void_p]
isl.isl_space_zero_multi_aff.restype = c_void_p
isl.isl_space_zero_multi_aff.argtypes = [c_void_p]
isl.isl_space_zero_multi_pw_aff.restype = c_void_p
isl.isl_space_zero_multi_pw_aff.argtypes = [c_void_p]
isl.isl_space_zero_multi_union_pw_aff.restype = c_void_p
isl.isl_space_zero_multi_union_pw_aff.argtypes = [c_void_p]
isl.isl_space_zero_multi_val.restype = c_void_p
isl.isl_space_zero_multi_val.argtypes = [c_void_p]
isl.isl_space_copy.restype = c_void_p
isl.isl_space_copy.argtypes = [c_void_p]
isl.isl_space_free.restype = c_void_p
isl.isl_space_free.argtypes = [c_void_p]
isl.isl_space_to_str.restype = POINTER(c_char)
isl.isl_space_to_str.argtypes = [c_void_p]

class union_access_info(object):
    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 union_map:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_union_access_info_from_sink(isl.isl_union_map_copy(args[0].ptr))
            return
        raise Error
    def __del__(self):
        if hasattr(self, 'ptr'):
            isl.isl_union_access_info_free(self.ptr)
    def __str__(arg0):
        try:
            if not arg0.__class__ is union_access_info:
                arg0 = union_access_info(arg0)
        except:
            raise
        ptr = isl.isl_union_access_info_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.union_access_info("""%s""")' % s
        else:
            return 'isl.union_access_info("%s")' % s
    def compute_flow(arg0):
        try:
            if not arg0.__class__ is union_access_info:
                arg0 = union_access_info(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_access_info_compute_flow(isl.isl_union_access_info_copy(arg0.ptr))
        obj = union_flow(ctx=ctx, ptr=res)
        return obj
    def set_kill(arg0, arg1):
        try:
            if not arg0.__class__ is union_access_info:
                arg0 = union_access_info(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_map:
                arg1 = union_map(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_access_info_set_kill(isl.isl_union_access_info_copy(arg0.ptr), isl.isl_union_map_copy(arg1.ptr))
        obj = union_access_info(ctx=ctx, ptr=res)
        return obj
    def set_may_source(arg0, arg1):
        try:
            if not arg0.__class__ is union_access_info:
                arg0 = union_access_info(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_map:
                arg1 = union_map(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_access_info_set_may_source(isl.isl_union_access_info_copy(arg0.ptr), isl.isl_union_map_copy(arg1.ptr))
        obj = union_access_info(ctx=ctx, ptr=res)
        return obj
    def set_must_source(arg0, arg1):
        try:
            if not arg0.__class__ is union_access_info:
                arg0 = union_access_info(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_map:
                arg1 = union_map(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_access_info_set_must_source(isl.isl_union_access_info_copy(arg0.ptr), isl.isl_union_map_copy(arg1.ptr))
        obj = union_access_info(ctx=ctx, ptr=res)
        return obj
    def set_schedule(arg0, arg1):
        try:
            if not arg0.__class__ is union_access_info:
                arg0 = union_access_info(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is schedule:
                arg1 = schedule(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_access_info_set_schedule(isl.isl_union_access_info_copy(arg0.ptr), isl.isl_schedule_copy(arg1.ptr))
        obj = union_access_info(ctx=ctx, ptr=res)
        return obj
    def set_schedule_map(arg0, arg1):
        try:
            if not arg0.__class__ is union_access_info:
                arg0 = union_access_info(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_map:
                arg1 = union_map(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_access_info_set_schedule_map(isl.isl_union_access_info_copy(arg0.ptr), isl.isl_union_map_copy(arg1.ptr))
        obj = union_access_info(ctx=ctx, ptr=res)
        return obj

isl.isl_union_access_info_from_sink.restype = c_void_p
isl.isl_union_access_info_from_sink.argtypes = [c_void_p]
isl.isl_union_access_info_compute_flow.restype = c_void_p
isl.isl_union_access_info_compute_flow.argtypes = [c_void_p]
isl.isl_union_access_info_set_kill.restype = c_void_p
isl.isl_union_access_info_set_kill.argtypes = [c_void_p, c_void_p]
isl.isl_union_access_info_set_may_source.restype = c_void_p
isl.isl_union_access_info_set_may_source.argtypes = [c_void_p, c_void_p]
isl.isl_union_access_info_set_must_source.restype = c_void_p
isl.isl_union_access_info_set_must_source.argtypes = [c_void_p, c_void_p]
isl.isl_union_access_info_set_schedule.restype = c_void_p
isl.isl_union_access_info_set_schedule.argtypes = [c_void_p, c_void_p]
isl.isl_union_access_info_set_schedule_map.restype = c_void_p
isl.isl_union_access_info_set_schedule_map.argtypes = [c_void_p, c_void_p]
isl.isl_union_access_info_copy.restype = c_void_p
isl.isl_union_access_info_copy.argtypes = [c_void_p]
isl.isl_union_access_info_free.restype = c_void_p
isl.isl_union_access_info_free.argtypes = [c_void_p]
isl.isl_union_access_info_to_str.restype = POINTER(c_char)
isl.isl_union_access_info_to_str.argtypes = [c_void_p]

class union_flow(object):
    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_flow_free(self.ptr)
    def __str__(arg0):
        try:
            if not arg0.__class__ is union_flow:
                arg0 = union_flow(arg0)
        except:
            raise
        ptr = isl.isl_union_flow_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.union_flow("""%s""")' % s
        else:
            return 'isl.union_flow("%s")' % s
    def full_may_dependence(arg0):
        try:
            if not arg0.__class__ is union_flow:
                arg0 = union_flow(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_flow_get_full_may_dependence(arg0.ptr)
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def get_full_may_dependence(arg0):
        return arg0.full_may_dependence()
    def full_must_dependence(arg0):
        try:
            if not arg0.__class__ is union_flow:
                arg0 = union_flow(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_flow_get_full_must_dependence(arg0.ptr)
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def get_full_must_dependence(arg0):
        return arg0.full_must_dependence()
    def may_dependence(arg0):
        try:
            if not arg0.__class__ is union_flow:
                arg0 = union_flow(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_flow_get_may_dependence(arg0.ptr)
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def get_may_dependence(arg0):
        return arg0.may_dependence()
    def may_no_source(arg0):
        try:
            if not arg0.__class__ is union_flow:
                arg0 = union_flow(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_flow_get_may_no_source(arg0.ptr)
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def get_may_no_source(arg0):
        return arg0.may_no_source()
    def must_dependence(arg0):
        try:
            if not arg0.__class__ is union_flow:
                arg0 = union_flow(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_flow_get_must_dependence(arg0.ptr)
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def get_must_dependence(arg0):
        return arg0.must_dependence()
    def must_no_source(arg0):
        try:
            if not arg0.__class__ is union_flow:
                arg0 = union_flow(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_flow_get_must_no_source(arg0.ptr)
        obj = union_map(ctx=ctx, ptr=res)
        return obj
    def get_must_no_source(arg0):
        return arg0.must_no_source()

isl.isl_union_flow_get_full_may_dependence.restype = c_void_p
isl.isl_union_flow_get_full_may_dependence.argtypes = [c_void_p]
isl.isl_union_flow_get_full_must_dependence.restype = c_void_p
isl.isl_union_flow_get_full_must_dependence.argtypes = [c_void_p]
isl.isl_union_flow_get_may_dependence.restype = c_void_p
isl.isl_union_flow_get_may_dependence.argtypes = [c_void_p]
isl.isl_union_flow_get_may_no_source.restype = c_void_p
isl.isl_union_flow_get_may_no_source.argtypes = [c_void_p]
isl.isl_union_flow_get_must_dependence.restype = c_void_p
isl.isl_union_flow_get_must_dependence.argtypes = [c_void_p]
isl.isl_union_flow_get_must_no_source.restype = c_void_p
isl.isl_union_flow_get_must_no_source.argtypes = [c_void_p]
isl.isl_union_flow_copy.restype = c_void_p
isl.isl_union_flow_copy.argtypes = [c_void_p]
isl.isl_union_flow_free.restype = c_void_p
isl.isl_union_flow_free.argtypes = [c_void_p]
isl.isl_union_flow_to_str.restype = POINTER(c_char)
isl.isl_union_flow_to_str.argtypes = [c_void_p]

class union_pw_aff_list(object):
    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]) == int:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_union_pw_aff_list_alloc(self.ctx, args[0])
            return
        if len(args) == 1 and args[0].__class__ is union_pw_aff:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_union_pw_aff_list_from_union_pw_aff(isl.isl_union_pw_aff_copy(args[0].ptr))
            return
        if len(args) == 1 and type(args[0]) == str:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_union_pw_aff_list_read_from_str(self.ctx, args[0].encode('ascii'))
            return
        raise Error
    def __del__(self):
        if hasattr(self, 'ptr'):
            isl.isl_union_pw_aff_list_free(self.ptr)
    def __str__(arg0):
        try:
            if not arg0.__class__ is union_pw_aff_list:
                arg0 = union_pw_aff_list(arg0)
        except:
            raise
        ptr = isl.isl_union_pw_aff_list_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.union_pw_aff_list("""%s""")' % s
        else:
            return 'isl.union_pw_aff_list("%s")' % s
    def add(arg0, arg1):
        try:
            if not arg0.__class__ is union_pw_aff_list:
                arg0 = union_pw_aff_list(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_pw_aff:
                arg1 = union_pw_aff(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_pw_aff_list_add(isl.isl_union_pw_aff_list_copy(arg0.ptr), isl.isl_union_pw_aff_copy(arg1.ptr))
        obj = union_pw_aff_list(ctx=ctx, ptr=res)
        return obj
    def at(arg0, arg1):
        try:
            if not arg0.__class__ is union_pw_aff_list:
                arg0 = union_pw_aff_list(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_pw_aff_list_get_at(arg0.ptr, arg1)
        obj = union_pw_aff(ctx=ctx, ptr=res)
        return obj
    def get_at(arg0, arg1):
        return arg0.at(arg1)
    def clear(arg0):
        try:
            if not arg0.__class__ is union_pw_aff_list:
                arg0 = union_pw_aff_list(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_pw_aff_list_clear(isl.isl_union_pw_aff_list_copy(arg0.ptr))
        obj = union_pw_aff_list(ctx=ctx, ptr=res)
        return obj
    def concat(arg0, arg1):
        try:
            if not arg0.__class__ is union_pw_aff_list:
                arg0 = union_pw_aff_list(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_pw_aff_list:
                arg1 = union_pw_aff_list(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_pw_aff_list_concat(isl.isl_union_pw_aff_list_copy(arg0.ptr), isl.isl_union_pw_aff_list_copy(arg1.ptr))
        obj = union_pw_aff_list(ctx=ctx, ptr=res)
        return obj
    def drop(arg0, arg1, arg2):
        try:
            if not arg0.__class__ is union_pw_aff_list:
                arg0 = union_pw_aff_list(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_pw_aff_list_drop(isl.isl_union_pw_aff_list_copy(arg0.ptr), arg1, arg2)
        obj = union_pw_aff_list(ctx=ctx, ptr=res)
        return obj
    def foreach(arg0, arg1):
        try:
            if not arg0.__class__ is union_pw_aff_list:
                arg0 = union_pw_aff_list(arg0)
        except:
            raise
        exc_info = [None]
        fn = CFUNCTYPE(c_int, c_void_p, c_void_p)
        def cb_func(cb_arg0, cb_arg1):
            cb_arg0 = union_pw_aff(ctx=arg0.ctx, ptr=(cb_arg0))
            try:
                arg1(cb_arg0)
            except BaseException as e:
                exc_info[0] = e
                return -1
            return 0
        cb = fn(cb_func)
        ctx = arg0.ctx
        res = isl.isl_union_pw_aff_list_foreach(arg0.ptr, cb, None)
        if exc_info[0] is not None:
            raise exc_info[0]
        if res < 0:
            raise
    def insert(arg0, arg1, arg2):
        try:
            if not arg0.__class__ is union_pw_aff_list:
                arg0 = union_pw_aff_list(arg0)
        except:
            raise
        try:
            if not arg2.__class__ is union_pw_aff:
                arg2 = union_pw_aff(arg2)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_pw_aff_list_insert(isl.isl_union_pw_aff_list_copy(arg0.ptr), arg1, isl.isl_union_pw_aff_copy(arg2.ptr))
        obj = union_pw_aff_list(ctx=ctx, ptr=res)
        return obj
    def size(arg0):
        try:
            if not arg0.__class__ is union_pw_aff_list:
                arg0 = union_pw_aff_list(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_pw_aff_list_size(arg0.ptr)
        if res < 0:
            raise
        return int(res)

isl.isl_union_pw_aff_list_alloc.restype = c_void_p
isl.isl_union_pw_aff_list_alloc.argtypes = [Context, c_int]
isl.isl_union_pw_aff_list_from_union_pw_aff.restype = c_void_p
isl.isl_union_pw_aff_list_from_union_pw_aff.argtypes = [c_void_p]
isl.isl_union_pw_aff_list_read_from_str.restype = c_void_p
isl.isl_union_pw_aff_list_read_from_str.argtypes = [Context, c_char_p]
isl.isl_union_pw_aff_list_add.restype = c_void_p
isl.isl_union_pw_aff_list_add.argtypes = [c_void_p, c_void_p]
isl.isl_union_pw_aff_list_get_at.restype = c_void_p
isl.isl_union_pw_aff_list_get_at.argtypes = [c_void_p, c_int]
isl.isl_union_pw_aff_list_clear.restype = c_void_p
isl.isl_union_pw_aff_list_clear.argtypes = [c_void_p]
isl.isl_union_pw_aff_list_concat.restype = c_void_p
isl.isl_union_pw_aff_list_concat.argtypes = [c_void_p, c_void_p]
isl.isl_union_pw_aff_list_drop.restype = c_void_p
isl.isl_union_pw_aff_list_drop.argtypes = [c_void_p, c_int, c_int]
isl.isl_union_pw_aff_list_foreach.argtypes = [c_void_p, c_void_p, c_void_p]
isl.isl_union_pw_aff_list_insert.restype = c_void_p
isl.isl_union_pw_aff_list_insert.argtypes = [c_void_p, c_int, c_void_p]
isl.isl_union_pw_aff_list_size.argtypes = [c_void_p]
isl.isl_union_pw_aff_list_copy.restype = c_void_p
isl.isl_union_pw_aff_list_copy.argtypes = [c_void_p]
isl.isl_union_pw_aff_list_free.restype = c_void_p
isl.isl_union_pw_aff_list_free.argtypes = [c_void_p]
isl.isl_union_pw_aff_list_to_str.restype = POINTER(c_char)
isl.isl_union_pw_aff_list_to_str.argtypes = [c_void_p]

class union_set_list(object):
    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]) == int:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_union_set_list_alloc(self.ctx, args[0])
            return
        if len(args) == 1 and args[0].__class__ is union_set:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_union_set_list_from_union_set(isl.isl_union_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_list_read_from_str(self.ctx, args[0].encode('ascii'))
            return
        raise Error
    def __del__(self):
        if hasattr(self, 'ptr'):
            isl.isl_union_set_list_free(self.ptr)
    def __str__(arg0):
        try:
            if not arg0.__class__ is union_set_list:
                arg0 = union_set_list(arg0)
        except:
            raise
        ptr = isl.isl_union_set_list_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.union_set_list("""%s""")' % s
        else:
            return 'isl.union_set_list("%s")' % s
    def add(arg0, arg1):
        try:
            if not arg0.__class__ is union_set_list:
                arg0 = union_set_list(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_set:
                arg1 = union_set(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_set_list_add(isl.isl_union_set_list_copy(arg0.ptr), isl.isl_union_set_copy(arg1.ptr))
        obj = union_set_list(ctx=ctx, ptr=res)
        return obj
    def at(arg0, arg1):
        try:
            if not arg0.__class__ is union_set_list:
                arg0 = union_set_list(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_set_list_get_at(arg0.ptr, arg1)
        obj = union_set(ctx=ctx, ptr=res)
        return obj
    def get_at(arg0, arg1):
        return arg0.at(arg1)
    def clear(arg0):
        try:
            if not arg0.__class__ is union_set_list:
                arg0 = union_set_list(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_set_list_clear(isl.isl_union_set_list_copy(arg0.ptr))
        obj = union_set_list(ctx=ctx, ptr=res)
        return obj
    def concat(arg0, arg1):
        try:
            if not arg0.__class__ is union_set_list:
                arg0 = union_set_list(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is union_set_list:
                arg1 = union_set_list(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_set_list_concat(isl.isl_union_set_list_copy(arg0.ptr), isl.isl_union_set_list_copy(arg1.ptr))
        obj = union_set_list(ctx=ctx, ptr=res)
        return obj
    def drop(arg0, arg1, arg2):
        try:
            if not arg0.__class__ is union_set_list:
                arg0 = union_set_list(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_set_list_drop(isl.isl_union_set_list_copy(arg0.ptr), arg1, arg2)
        obj = union_set_list(ctx=ctx, ptr=res)
        return obj
    def foreach(arg0, arg1):
        try:
            if not arg0.__class__ is union_set_list:
                arg0 = union_set_list(arg0)
        except:
            raise
        exc_info = [None]
        fn = CFUNCTYPE(c_int, c_void_p, c_void_p)
        def cb_func(cb_arg0, cb_arg1):
            cb_arg0 = union_set(ctx=arg0.ctx, ptr=(cb_arg0))
            try:
                arg1(cb_arg0)
            except BaseException as e:
                exc_info[0] = e
                return -1
            return 0
        cb = fn(cb_func)
        ctx = arg0.ctx
        res = isl.isl_union_set_list_foreach(arg0.ptr, cb, None)
        if exc_info[0] is not None:
            raise exc_info[0]
        if res < 0:
            raise
    def insert(arg0, arg1, arg2):
        try:
            if not arg0.__class__ is union_set_list:
                arg0 = union_set_list(arg0)
        except:
            raise
        try:
            if not arg2.__class__ is union_set:
                arg2 = union_set(arg2)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_set_list_insert(isl.isl_union_set_list_copy(arg0.ptr), arg1, isl.isl_union_set_copy(arg2.ptr))
        obj = union_set_list(ctx=ctx, ptr=res)
        return obj
    def size(arg0):
        try:
            if not arg0.__class__ is union_set_list:
                arg0 = union_set_list(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_union_set_list_size(arg0.ptr)
        if res < 0:
            raise
        return int(res)

isl.isl_union_set_list_alloc.restype = c_void_p
isl.isl_union_set_list_alloc.argtypes = [Context, c_int]
isl.isl_union_set_list_from_union_set.restype = c_void_p
isl.isl_union_set_list_from_union_set.argtypes = [c_void_p]
isl.isl_union_set_list_read_from_str.restype = c_void_p
isl.isl_union_set_list_read_from_str.argtypes = [Context, c_char_p]
isl.isl_union_set_list_add.restype = c_void_p
isl.isl_union_set_list_add.argtypes = [c_void_p, c_void_p]
isl.isl_union_set_list_get_at.restype = c_void_p
isl.isl_union_set_list_get_at.argtypes = [c_void_p, c_int]
isl.isl_union_set_list_clear.restype = c_void_p
isl.isl_union_set_list_clear.argtypes = [c_void_p]
isl.isl_union_set_list_concat.restype = c_void_p
isl.isl_union_set_list_concat.argtypes = [c_void_p, c_void_p]
isl.isl_union_set_list_drop.restype = c_void_p
isl.isl_union_set_list_drop.argtypes = [c_void_p, c_int, c_int]
isl.isl_union_set_list_foreach.argtypes = [c_void_p, c_void_p, c_void_p]
isl.isl_union_set_list_insert.restype = c_void_p
isl.isl_union_set_list_insert.argtypes = [c_void_p, c_int, c_void_p]
isl.isl_union_set_list_size.argtypes = [c_void_p]
isl.isl_union_set_list_copy.restype = c_void_p
isl.isl_union_set_list_copy.argtypes = [c_void_p]
isl.isl_union_set_list_free.restype = c_void_p
isl.isl_union_set_list_free.argtypes = [c_void_p]
isl.isl_union_set_list_to_str.restype = POINTER(c_char)
isl.isl_union_set_list_to_str.argtypes = [c_void_p]

class val(object):
    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]) == int:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_val_int_from_si(self.ctx, args[0])
            return
        if len(args) == 1 and type(args[0]) == str:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_val_read_from_str(self.ctx, args[0].encode('ascii'))
            return
        raise Error
    def __del__(self):
        if hasattr(self, 'ptr'):
            isl.isl_val_free(self.ptr)
    def __str__(arg0):
        try:
            if not arg0.__class__ is val:
                arg0 = val(arg0)
        except:
            raise
        ptr = isl.isl_val_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.val("""%s""")' % s
        else:
            return 'isl.val("%s")' % s
    def abs(arg0):
        try:
            if not arg0.__class__ is val:
                arg0 = val(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_val_abs(isl.isl_val_copy(arg0.ptr))
        obj = val(ctx=ctx, ptr=res)
        return obj
    def abs_eq(arg0, arg1):
        try:
            if not arg0.__class__ is val:
                arg0 = val(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is val:
                arg1 = val(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_val_abs_eq(arg0.ptr, arg1.ptr)
        if res < 0:
            raise
        return bool(res)
    def add(arg0, arg1):
        try:
            if not arg0.__class__ is val:
                arg0 = val(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is val:
                arg1 = val(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_val_add(isl.isl_val_copy(arg0.ptr), isl.isl_val_copy(arg1.ptr))
        obj = val(ctx=ctx, ptr=res)
        return obj
    def ceil(arg0):
        try:
            if not arg0.__class__ is val:
                arg0 = val(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_val_ceil(isl.isl_val_copy(arg0.ptr))
        obj = val(ctx=ctx, ptr=res)
        return obj
    def cmp_si(arg0, arg1):
        try:
            if not arg0.__class__ is val:
                arg0 = val(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_val_cmp_si(arg0.ptr, arg1)
        return res
    def den_si(arg0):
        try:
            if not arg0.__class__ is val:
                arg0 = val(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_val_get_den_si(arg0.ptr)
        return res
    def get_den_si(arg0):
        return arg0.den_si()
    def div(arg0, arg1):
        try:
            if not arg0.__class__ is val:
                arg0 = val(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is val:
                arg1 = val(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_val_div(isl.isl_val_copy(arg0.ptr), isl.isl_val_copy(arg1.ptr))
        obj = val(ctx=ctx, ptr=res)
        return obj
    def eq(arg0, arg1):
        try:
            if not arg0.__class__ is val:
                arg0 = val(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is val:
                arg1 = val(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_val_eq(arg0.ptr, arg1.ptr)
        if res < 0:
            raise
        return bool(res)
    def floor(arg0):
        try:
            if not arg0.__class__ is val:
                arg0 = val(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_val_floor(isl.isl_val_copy(arg0.ptr))
        obj = val(ctx=ctx, ptr=res)
        return obj
    def gcd(arg0, arg1):
        try:
            if not arg0.__class__ is val:
                arg0 = val(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is val:
                arg1 = val(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_val_gcd(isl.isl_val_copy(arg0.ptr), isl.isl_val_copy(arg1.ptr))
        obj = val(ctx=ctx, ptr=res)
        return obj
    def ge(arg0, arg1):
        try:
            if not arg0.__class__ is val:
                arg0 = val(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is val:
                arg1 = val(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_val_ge(arg0.ptr, arg1.ptr)
        if res < 0:
            raise
        return bool(res)
    def gt(arg0, arg1):
        try:
            if not arg0.__class__ is val:
                arg0 = val(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is val:
                arg1 = val(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_val_gt(arg0.ptr, arg1.ptr)
        if res < 0:
            raise
        return bool(res)
    @staticmethod
    def infty():
        ctx = Context.getDefaultInstance()
        res = isl.isl_val_infty(ctx)
        obj = val(ctx=ctx, ptr=res)
        return obj
    def inv(arg0):
        try:
            if not arg0.__class__ is val:
                arg0 = val(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_val_inv(isl.isl_val_copy(arg0.ptr))
        obj = val(ctx=ctx, ptr=res)
        return obj
    def is_divisible_by(arg0, arg1):
        try:
            if not arg0.__class__ is val:
                arg0 = val(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is val:
                arg1 = val(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_val_is_divisible_by(arg0.ptr, arg1.ptr)
        if res < 0:
            raise
        return bool(res)
    def is_infty(arg0):
        try:
            if not arg0.__class__ is val:
                arg0 = val(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_val_is_infty(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def is_int(arg0):
        try:
            if not arg0.__class__ is val:
                arg0 = val(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_val_is_int(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def is_nan(arg0):
        try:
            if not arg0.__class__ is val:
                arg0 = val(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_val_is_nan(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def is_neg(arg0):
        try:
            if not arg0.__class__ is val:
                arg0 = val(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_val_is_neg(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def is_neginfty(arg0):
        try:
            if not arg0.__class__ is val:
                arg0 = val(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_val_is_neginfty(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def is_negone(arg0):
        try:
            if not arg0.__class__ is val:
                arg0 = val(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_val_is_negone(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def is_nonneg(arg0):
        try:
            if not arg0.__class__ is val:
                arg0 = val(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_val_is_nonneg(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def is_nonpos(arg0):
        try:
            if not arg0.__class__ is val:
                arg0 = val(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_val_is_nonpos(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def is_one(arg0):
        try:
            if not arg0.__class__ is val:
                arg0 = val(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_val_is_one(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def is_pos(arg0):
        try:
            if not arg0.__class__ is val:
                arg0 = val(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_val_is_pos(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def is_rat(arg0):
        try:
            if not arg0.__class__ is val:
                arg0 = val(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_val_is_rat(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def is_zero(arg0):
        try:
            if not arg0.__class__ is val:
                arg0 = val(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_val_is_zero(arg0.ptr)
        if res < 0:
            raise
        return bool(res)
    def le(arg0, arg1):
        try:
            if not arg0.__class__ is val:
                arg0 = val(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is val:
                arg1 = val(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_val_le(arg0.ptr, arg1.ptr)
        if res < 0:
            raise
        return bool(res)
    def lt(arg0, arg1):
        try:
            if not arg0.__class__ is val:
                arg0 = val(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is val:
                arg1 = val(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_val_lt(arg0.ptr, arg1.ptr)
        if res < 0:
            raise
        return bool(res)
    def max(arg0, arg1):
        try:
            if not arg0.__class__ is val:
                arg0 = val(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is val:
                arg1 = val(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_val_max(isl.isl_val_copy(arg0.ptr), isl.isl_val_copy(arg1.ptr))
        obj = val(ctx=ctx, ptr=res)
        return obj
    def min(arg0, arg1):
        try:
            if not arg0.__class__ is val:
                arg0 = val(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is val:
                arg1 = val(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_val_min(isl.isl_val_copy(arg0.ptr), isl.isl_val_copy(arg1.ptr))
        obj = val(ctx=ctx, ptr=res)
        return obj
    def mod(arg0, arg1):
        try:
            if not arg0.__class__ is val:
                arg0 = val(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is val:
                arg1 = val(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_val_mod(isl.isl_val_copy(arg0.ptr), isl.isl_val_copy(arg1.ptr))
        obj = val(ctx=ctx, ptr=res)
        return obj
    def mul(arg0, arg1):
        try:
            if not arg0.__class__ is val:
                arg0 = val(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is val:
                arg1 = val(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_val_mul(isl.isl_val_copy(arg0.ptr), isl.isl_val_copy(arg1.ptr))
        obj = val(ctx=ctx, ptr=res)
        return obj
    @staticmethod
    def nan():
        ctx = Context.getDefaultInstance()
        res = isl.isl_val_nan(ctx)
        obj = val(ctx=ctx, ptr=res)
        return obj
    def ne(arg0, arg1):
        try:
            if not arg0.__class__ is val:
                arg0 = val(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is val:
                arg1 = val(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_val_ne(arg0.ptr, arg1.ptr)
        if res < 0:
            raise
        return bool(res)
    def neg(arg0):
        try:
            if not arg0.__class__ is val:
                arg0 = val(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_val_neg(isl.isl_val_copy(arg0.ptr))
        obj = val(ctx=ctx, ptr=res)
        return obj
    @staticmethod
    def neginfty():
        ctx = Context.getDefaultInstance()
        res = isl.isl_val_neginfty(ctx)
        obj = val(ctx=ctx, ptr=res)
        return obj
    @staticmethod
    def negone():
        ctx = Context.getDefaultInstance()
        res = isl.isl_val_negone(ctx)
        obj = val(ctx=ctx, ptr=res)
        return obj
    def num_si(arg0):
        try:
            if not arg0.__class__ is val:
                arg0 = val(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_val_get_num_si(arg0.ptr)
        return res
    def get_num_si(arg0):
        return arg0.num_si()
    @staticmethod
    def one():
        ctx = Context.getDefaultInstance()
        res = isl.isl_val_one(ctx)
        obj = val(ctx=ctx, ptr=res)
        return obj
    def pow2(arg0):
        try:
            if not arg0.__class__ is val:
                arg0 = val(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_val_pow2(isl.isl_val_copy(arg0.ptr))
        obj = val(ctx=ctx, ptr=res)
        return obj
    def sgn(arg0):
        try:
            if not arg0.__class__ is val:
                arg0 = val(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_val_sgn(arg0.ptr)
        return res
    def sub(arg0, arg1):
        try:
            if not arg0.__class__ is val:
                arg0 = val(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is val:
                arg1 = val(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_val_sub(isl.isl_val_copy(arg0.ptr), isl.isl_val_copy(arg1.ptr))
        obj = val(ctx=ctx, ptr=res)
        return obj
    def to_list(arg0):
        try:
            if not arg0.__class__ is val:
                arg0 = val(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_val_to_list(isl.isl_val_copy(arg0.ptr))
        obj = val_list(ctx=ctx, ptr=res)
        return obj
    def trunc(arg0):
        try:
            if not arg0.__class__ is val:
                arg0 = val(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_val_trunc(isl.isl_val_copy(arg0.ptr))
        obj = val(ctx=ctx, ptr=res)
        return obj
    @staticmethod
    def zero():
        ctx = Context.getDefaultInstance()
        res = isl.isl_val_zero(ctx)
        obj = val(ctx=ctx, ptr=res)
        return obj

isl.isl_val_int_from_si.restype = c_void_p
isl.isl_val_int_from_si.argtypes = [Context, c_long]
isl.isl_val_read_from_str.restype = c_void_p
isl.isl_val_read_from_str.argtypes = [Context, c_char_p]
isl.isl_val_abs.restype = c_void_p
isl.isl_val_abs.argtypes = [c_void_p]
isl.isl_val_abs_eq.argtypes = [c_void_p, c_void_p]
isl.isl_val_add.restype = c_void_p
isl.isl_val_add.argtypes = [c_void_p, c_void_p]
isl.isl_val_ceil.restype = c_void_p
isl.isl_val_ceil.argtypes = [c_void_p]
isl.isl_val_cmp_si.argtypes = [c_void_p, c_long]
isl.isl_val_get_den_si.argtypes = [c_void_p]
isl.isl_val_div.restype = c_void_p
isl.isl_val_div.argtypes = [c_void_p, c_void_p]
isl.isl_val_eq.argtypes = [c_void_p, c_void_p]
isl.isl_val_floor.restype = c_void_p
isl.isl_val_floor.argtypes = [c_void_p]
isl.isl_val_gcd.restype = c_void_p
isl.isl_val_gcd.argtypes = [c_void_p, c_void_p]
isl.isl_val_ge.argtypes = [c_void_p, c_void_p]
isl.isl_val_gt.argtypes = [c_void_p, c_void_p]
isl.isl_val_infty.restype = c_void_p
isl.isl_val_infty.argtypes = [Context]
isl.isl_val_inv.restype = c_void_p
isl.isl_val_inv.argtypes = [c_void_p]
isl.isl_val_is_divisible_by.argtypes = [c_void_p, c_void_p]
isl.isl_val_is_infty.argtypes = [c_void_p]
isl.isl_val_is_int.argtypes = [c_void_p]
isl.isl_val_is_nan.argtypes = [c_void_p]
isl.isl_val_is_neg.argtypes = [c_void_p]
isl.isl_val_is_neginfty.argtypes = [c_void_p]
isl.isl_val_is_negone.argtypes = [c_void_p]
isl.isl_val_is_nonneg.argtypes = [c_void_p]
isl.isl_val_is_nonpos.argtypes = [c_void_p]
isl.isl_val_is_one.argtypes = [c_void_p]
isl.isl_val_is_pos.argtypes = [c_void_p]
isl.isl_val_is_rat.argtypes = [c_void_p]
isl.isl_val_is_zero.argtypes = [c_void_p]
isl.isl_val_le.argtypes = [c_void_p, c_void_p]
isl.isl_val_lt.argtypes = [c_void_p, c_void_p]
isl.isl_val_max.restype = c_void_p
isl.isl_val_max.argtypes = [c_void_p, c_void_p]
isl.isl_val_min.restype = c_void_p
isl.isl_val_min.argtypes = [c_void_p, c_void_p]
isl.isl_val_mod.restype = c_void_p
isl.isl_val_mod.argtypes = [c_void_p, c_void_p]
isl.isl_val_mul.restype = c_void_p
isl.isl_val_mul.argtypes = [c_void_p, c_void_p]
isl.isl_val_nan.restype = c_void_p
isl.isl_val_nan.argtypes = [Context]
isl.isl_val_ne.argtypes = [c_void_p, c_void_p]
isl.isl_val_neg.restype = c_void_p
isl.isl_val_neg.argtypes = [c_void_p]
isl.isl_val_neginfty.restype = c_void_p
isl.isl_val_neginfty.argtypes = [Context]
isl.isl_val_negone.restype = c_void_p
isl.isl_val_negone.argtypes = [Context]
isl.isl_val_get_num_si.argtypes = [c_void_p]
isl.isl_val_one.restype = c_void_p
isl.isl_val_one.argtypes = [Context]
isl.isl_val_pow2.restype = c_void_p
isl.isl_val_pow2.argtypes = [c_void_p]
isl.isl_val_sgn.argtypes = [c_void_p]
isl.isl_val_sub.restype = c_void_p
isl.isl_val_sub.argtypes = [c_void_p, c_void_p]
isl.isl_val_to_list.restype = c_void_p
isl.isl_val_to_list.argtypes = [c_void_p]
isl.isl_val_trunc.restype = c_void_p
isl.isl_val_trunc.argtypes = [c_void_p]
isl.isl_val_zero.restype = c_void_p
isl.isl_val_zero.argtypes = [Context]
isl.isl_val_copy.restype = c_void_p
isl.isl_val_copy.argtypes = [c_void_p]
isl.isl_val_free.restype = c_void_p
isl.isl_val_free.argtypes = [c_void_p]
isl.isl_val_to_str.restype = POINTER(c_char)
isl.isl_val_to_str.argtypes = [c_void_p]

class val_list(object):
    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]) == int:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_val_list_alloc(self.ctx, args[0])
            return
        if len(args) == 1 and (args[0].__class__ is val or type(args[0]) == int):
            args = list(args)
            try:
                if not args[0].__class__ is val:
                    args[0] = val(args[0])
            except:
                raise
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_val_list_from_val(isl.isl_val_copy(args[0].ptr))
            return
        if len(args) == 1 and type(args[0]) == str:
            self.ctx = Context.getDefaultInstance()
            self.ptr = isl.isl_val_list_read_from_str(self.ctx, args[0].encode('ascii'))
            return
        raise Error
    def __del__(self):
        if hasattr(self, 'ptr'):
            isl.isl_val_list_free(self.ptr)
    def __str__(arg0):
        try:
            if not arg0.__class__ is val_list:
                arg0 = val_list(arg0)
        except:
            raise
        ptr = isl.isl_val_list_to_str(arg0.ptr)
        res = cast(ptr, c_char_p).value.decode('ascii')
        libc.free(ptr)
        return res
    def __repr__(self):
        s = str(self)
        if '"' in s:
            return 'isl.val_list("""%s""")' % s
        else:
            return 'isl.val_list("%s")' % s
    def add(arg0, arg1):
        try:
            if not arg0.__class__ is val_list:
                arg0 = val_list(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is val:
                arg1 = val(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_val_list_add(isl.isl_val_list_copy(arg0.ptr), isl.isl_val_copy(arg1.ptr))
        obj = val_list(ctx=ctx, ptr=res)
        return obj
    def at(arg0, arg1):
        try:
            if not arg0.__class__ is val_list:
                arg0 = val_list(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_val_list_get_at(arg0.ptr, arg1)
        obj = val(ctx=ctx, ptr=res)
        return obj
    def get_at(arg0, arg1):
        return arg0.at(arg1)
    def clear(arg0):
        try:
            if not arg0.__class__ is val_list:
                arg0 = val_list(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_val_list_clear(isl.isl_val_list_copy(arg0.ptr))
        obj = val_list(ctx=ctx, ptr=res)
        return obj
    def concat(arg0, arg1):
        try:
            if not arg0.__class__ is val_list:
                arg0 = val_list(arg0)
        except:
            raise
        try:
            if not arg1.__class__ is val_list:
                arg1 = val_list(arg1)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_val_list_concat(isl.isl_val_list_copy(arg0.ptr), isl.isl_val_list_copy(arg1.ptr))
        obj = val_list(ctx=ctx, ptr=res)
        return obj
    def drop(arg0, arg1, arg2):
        try:
            if not arg0.__class__ is val_list:
                arg0 = val_list(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_val_list_drop(isl.isl_val_list_copy(arg0.ptr), arg1, arg2)
        obj = val_list(ctx=ctx, ptr=res)
        return obj
    def foreach(arg0, arg1):
        try:
            if not arg0.__class__ is val_list:
                arg0 = val_list(arg0)
        except:
            raise
        exc_info = [None]
        fn = CFUNCTYPE(c_int, c_void_p, c_void_p)
        def cb_func(cb_arg0, cb_arg1):
            cb_arg0 = val(ctx=arg0.ctx, ptr=(cb_arg0))
            try:
                arg1(cb_arg0)
            except BaseException as e:
                exc_info[0] = e
                return -1
            return 0
        cb = fn(cb_func)
        ctx = arg0.ctx
        res = isl.isl_val_list_foreach(arg0.ptr, cb, None)
        if exc_info[0] is not None:
            raise exc_info[0]
        if res < 0:
            raise
    def insert(arg0, arg1, arg2):
        try:
            if not arg0.__class__ is val_list:
                arg0 = val_list(arg0)
        except:
            raise
        try:
            if not arg2.__class__ is val:
                arg2 = val(arg2)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_val_list_insert(isl.isl_val_list_copy(arg0.ptr), arg1, isl.isl_val_copy(arg2.ptr))
        obj = val_list(ctx=ctx, ptr=res)
        return obj
    def size(arg0):
        try:
            if not arg0.__class__ is val_list:
                arg0 = val_list(arg0)
        except:
            raise
        ctx = arg0.ctx
        res = isl.isl_val_list_size(arg0.ptr)
        if res < 0:
            raise
        return int(res)

isl.isl_val_list_alloc.restype = c_void_p
isl.isl_val_list_alloc.argtypes = [Context, c_int]
isl.isl_val_list_from_val.restype = c_void_p
isl.isl_val_list_from_val.argtypes = [c_void_p]
isl.isl_val_list_read_from_str.restype = c_void_p
isl.isl_val_list_read_from_str.argtypes = [Context, c_char_p]
isl.isl_val_list_add.restype = c_void_p
isl.isl_val_list_add.argtypes = [c_void_p, c_void_p]
isl.isl_val_list_get_at.restype = c_void_p
isl.isl_val_list_get_at.argtypes = [c_void_p, c_int]
isl.isl_val_list_clear.restype = c_void_p
isl.isl_val_list_clear.argtypes = [c_void_p]
isl.isl_val_list_concat.restype = c_void_p
isl.isl_val_list_concat.argtypes = [c_void_p, c_void_p]
isl.isl_val_list_drop.restype = c_void_p
isl.isl_val_list_drop.argtypes = [c_void_p, c_int, c_int]
isl.isl_val_list_foreach.argtypes = [c_void_p, c_void_p, c_void_p]
isl.isl_val_list_insert.restype = c_void_p
isl.isl_val_list_insert.argtypes = [c_void_p, c_int, c_void_p]
isl.isl_val_list_size.argtypes = [c_void_p]
isl.isl_val_list_copy.restype = c_void_p
isl.isl_val_list_copy.argtypes = [c_void_p]
isl.isl_val_list_free.restype = c_void_p
isl.isl_val_list_free.argtypes = [c_void_p]
isl.isl_val_list_to_str.restype = POINTER(c_char)
isl.isl_val_list_to_str.argtypes = [c_void_p]
