[Polly] Regenerate isl-noexceptions.h.

Regenerate the C++ wrapper header from the current isl version's
headers.

The most notable change is that some dimension sizes are represented by
an isl_size (instead of unsigned), which is a signed int. Additionally,
some function may return -1 in case of an error which already had been
fixed in the past. The C++ may no return -1 instead of UINT_MAX which
caused the problems.

Some types in Polly had been changed from unsigned to isl_size
(that were not already auto) and some loops/comparision had to be
changed to avoid unsigned/signed comparison warnings.

GitOrigin-RevId: ab0556bb208bb7598b13e6a629d936e1920d6c0b
diff --git a/include/polly/Support/ISLTools.h b/include/polly/Support/ISLTools.h
index 1e02831..cf631f8 100644
--- a/include/polly/Support/ISLTools.h
+++ b/include/polly/Support/ISLTools.h
@@ -161,7 +161,7 @@
 /// The implementation currently returns the maximum number of dimensions it
 /// encounters, if different, and 0 if none is encountered. However, most other
 /// code will most likely fail if one of these happen.
-unsigned getNumScatterDims(const isl::union_map &Schedule);
+isl_size getNumScatterDims(const isl::union_map &Schedule);
 
 /// Return the scatter space of a @p Schedule.
 ///
diff --git a/lib/Analysis/DependenceInfo.cpp b/lib/Analysis/DependenceInfo.cpp
index 809c802..01b28ce 100644
--- a/lib/Analysis/DependenceInfo.cpp
+++ b/lib/Analysis/DependenceInfo.cpp
@@ -25,6 +25,7 @@
 #include "polly/ScopInfo.h"
 #include "polly/Support/GICHelper.h"
 #include "polly/Support/ISLTools.h"
+#include "llvm/ADT/Sequence.h"
 #include "llvm/Support/Debug.h"
 #include "isl/aff.h"
 #include "isl/ctx.h"
@@ -189,7 +190,7 @@
 
 /// Fix all dimension of @p Zero to 0 and add it to @p user
 static void fixSetToZero(isl::set Zero, isl::union_set *User) {
-  for (unsigned i = 0; i < Zero.dim(isl::dim::set); i++)
+  for (auto i : seq<isl_size>(0, Zero.dim(isl::dim::set)))
     Zero = Zero.fix_si(isl::dim::set, i, 0);
   *User = User->add_set(Zero);
 }
@@ -667,7 +668,7 @@
   Dependences = Dependences.apply_range(Schedule);
 
   isl::set Zero = isl::set::universe(ScheduleSpace);
-  for (unsigned i = 0; i < Zero.dim(isl::dim::set); i++)
+  for (auto i : seq<isl_size>(0, Zero.dim(isl::dim::set)))
     Zero = Zero.fix_si(isl::dim::set, i, 0);
 
   isl::union_set UDeltas = Dependences.deltas();
diff --git a/lib/Analysis/ScopBuilder.cpp b/lib/Analysis/ScopBuilder.cpp
index 96557db..4def171 100644
--- a/lib/Analysis/ScopBuilder.cpp
+++ b/lib/Analysis/ScopBuilder.cpp
@@ -25,6 +25,7 @@
 #include "llvm/ADT/ArrayRef.h"
 #include "llvm/ADT/EquivalenceClasses.h"
 #include "llvm/ADT/PostOrderIterator.h"
+#include "llvm/ADT/Sequence.h"
 #include "llvm/ADT/SmallSet.h"
 #include "llvm/ADT/Statistic.h"
 #include "llvm/Analysis/AliasAnalysis.h"
@@ -201,8 +202,8 @@
 static isl::map createNextIterationMap(isl::space SetSpace, unsigned Dim) {
   isl::space MapSpace = SetSpace.map_from_set();
   isl::map NextIterationMap = isl::map::universe(MapSpace);
-  for (unsigned u = 0; u < NextIterationMap.dim(isl::dim::in); u++)
-    if (u != Dim)
+  for (auto u : seq<isl_size>(0, NextIterationMap.dim(isl::dim::in)))
+    if (u != (isl_size)Dim)
       NextIterationMap =
           NextIterationMap.equate(isl::dim::in, u, isl::dim::out, u);
   isl::constraint C =
@@ -2843,7 +2844,7 @@
     return;
   }
 
-  for (unsigned i = 0; i < Space.dim(isl::dim::param); i++) {
+  for (auto i : seq<isl_size>(0, Space.dim(isl::dim::param))) {
     std::string NameContext =
         scop->getContext().get_dim_name(isl::dim::param, i);
     std::string NameUserContext = UserContext.get_dim_name(isl::dim::param, i);
diff --git a/lib/Analysis/ScopInfo.cpp b/lib/Analysis/ScopInfo.cpp
index 38d37a4..ba52930 100644
--- a/lib/Analysis/ScopInfo.cpp
+++ b/lib/Analysis/ScopInfo.cpp
@@ -30,6 +30,7 @@
 #include "llvm/ADT/APInt.h"
 #include "llvm/ADT/ArrayRef.h"
 #include "llvm/ADT/PostOrderIterator.h"
+#include "llvm/ADT/Sequence.h"
 #include "llvm/ADT/SmallPtrSet.h"
 #include "llvm/ADT/SmallSet.h"
 #include "llvm/ADT/Statistic.h"
@@ -484,10 +485,10 @@
   isl::map Map = isl::map::from_domain_and_range(
       isl::set::universe(AccessSpace), isl::set::universe(ArraySpace));
 
-  for (unsigned i = 0; i < DimsMissing; i++)
+  for (auto i : seq<isl_size>(0, DimsMissing))
     Map = Map.fix_si(isl::dim::out, i, 0);
 
-  for (unsigned i = DimsMissing; i < DimsArray; i++)
+  for (auto i : seq<isl_size>(DimsMissing, DimsArray))
     Map = Map.equate(isl::dim::in, i - DimsMissing, isl::dim::out, i);
 
   AccessRelation = AccessRelation.apply_range(Map);
@@ -528,7 +529,7 @@
            "Loaded element size should be multiple of canonical element size");
     isl::map Map = isl::map::from_domain_and_range(
         isl::set::universe(ArraySpace), isl::set::universe(ArraySpace));
-    for (unsigned i = 0; i < DimsArray - 1; i++)
+    for (auto i : seq<isl_size>(0, DimsArray - 1))
       Map = Map.equate(isl::dim::in, i, isl::dim::out, i);
 
     isl::constraint C;
@@ -1045,7 +1046,7 @@
 
   Stride = getStride(Schedule);
   StrideX = isl::set::universe(Stride.get_space());
-  for (unsigned i = 0; i < StrideX.dim(isl::dim::set) - 1; i++)
+  for (auto i : seq<isl_size>(0, StrideX.dim(isl::dim::set) - 1))
     StrideX = StrideX.fix_si(isl::dim::set, i, 0);
   StrideX = StrideX.fix_si(isl::dim::set, StrideX.dim(isl::dim::set) - 1,
                            StrideWidth);
@@ -1107,7 +1108,7 @@
 
   // Check whether access dimensions correspond to number of dimensions of the
   // accesses array.
-  auto Dims = SAI->getNumberOfDimensions();
+  isl_size Dims = SAI->getNumberOfDimensions();
   assert(NewAccessSpace.dim(isl::dim::set) == Dims &&
          "Access dims must match array dims");
 #endif
diff --git a/lib/External/isl/include/isl/isl-noexceptions.h b/lib/External/isl/include/isl/isl-noexceptions.h
index bb87b88..9bbb464 100644
--- a/lib/External/isl/include/isl/isl-noexceptions.h
+++ b/lib/External/isl/include/isl/isl-noexceptions.h
@@ -8,10 +8,11 @@
 #ifndef ISL_CPP_CHECKED
 #define ISL_CPP_CHECKED
 
+#include <isl/id.h>
+#include <isl/space.h>
 #include <isl/val.h>
 #include <isl/aff.h>
 #include <isl/set.h>
-#include <isl/space.h>
 #include <isl/id.h>
 #include <isl/map.h>
 #include <isl/vec.h>
@@ -22,11 +23,11 @@
 #include <isl/schedule.h>
 #include <isl/schedule_node.h>
 #include <isl/ast_build.h>
+#include <isl/fixed_box.h>
 #include <isl/constraint.h>
 #include <isl/polynomial.h>
 #include <isl/mat.h>
 #include <isl/fixed_box.h>
-
 #include <stdio.h>
 #include <stdlib.h>
 
@@ -184,6 +185,7 @@
 class map_list;
 class mat;
 class multi_aff;
+class multi_id;
 class multi_pw_aff;
 class multi_union_pw_aff;
 class multi_val;
@@ -196,6 +198,7 @@
 class pw_qpolynomial_fold_list;
 class pw_qpolynomial_list;
 class qpolynomial;
+class qpolynomial_list;
 class schedule;
 class schedule_constraints;
 class schedule_node;
@@ -234,9 +237,9 @@
   inline /* implicit */ aff();
   inline /* implicit */ aff(const aff &obj);
   inline /* implicit */ aff(std::nullptr_t);
-  inline explicit aff(local_space ls);
-  inline explicit aff(local_space ls, val val);
   inline explicit aff(ctx ctx, const std::string &str);
+  inline explicit aff(local_space ls, val val);
+  inline explicit aff(local_space ls);
   inline aff &operator=(aff obj);
   inline ~aff();
   inline __isl_give isl_aff *copy() const &;
@@ -252,14 +255,15 @@
   inline aff add(aff aff2) const;
   inline aff add_coefficient_si(isl::dim type, int pos, int v) const;
   inline aff add_coefficient_val(isl::dim type, int pos, val v) const;
+  inline aff add_constant(val v) const;
   inline aff add_constant_num_si(int v) const;
   inline aff add_constant_si(int v) const;
-  inline aff add_constant_val(val v) const;
   inline aff add_dims(isl::dim type, unsigned int n) const;
   inline aff align_params(space model) const;
+  inline basic_set bind(id id) const;
   inline aff ceil() const;
   inline int coefficient_sgn(isl::dim type, int pos) const;
-  inline int dim(isl::dim type) const;
+  inline isl_size dim(isl::dim type) const;
   inline aff div(aff aff2) const;
   inline aff drop_dims(isl::dim type, unsigned int first, unsigned int n) const;
   inline basic_set eq_basic_set(aff aff2) const;
@@ -286,6 +290,7 @@
   inline set gt_set(aff aff2) const;
   inline aff insert_dims(isl::dim type, unsigned int first, unsigned int n) const;
   inline boolean involves_dims(isl::dim type, unsigned int first, unsigned int n) const;
+  inline boolean involves_locals() const;
   inline boolean is_cst() const;
   inline boolean is_nan() const;
   inline basic_set le_basic_set(aff aff2) const;
@@ -296,6 +301,7 @@
   inline aff move_dims(isl::dim dst_type, unsigned int dst_pos, isl::dim src_type, unsigned int src_pos, unsigned int n) const;
   inline aff mul(aff aff2) const;
   static inline aff nan_on_domain(local_space ls);
+  static inline aff nan_on_domain_space(space space);
   inline set ne_set(aff aff2) const;
   inline aff neg() const;
   inline basic_set neg_basic_set() const;
@@ -315,8 +321,11 @@
   inline aff set_dim_id(isl::dim type, unsigned int pos, id id) const;
   inline aff set_tuple_id(isl::dim type, id id) const;
   inline aff sub(aff aff2) const;
+  inline aff unbind_params_insert_domain(multi_id domain) const;
+  static inline aff val_on_domain_space(space space, val val);
   static inline aff var_on_domain(local_space ls, isl::dim type, unsigned int pos);
   inline basic_set zero_basic_set() const;
+  static inline aff zero_on_domain(space space);
 };
 
 // declarations for isl::aff_list
@@ -344,10 +353,12 @@
   inline bool is_null() const;
   inline explicit operator bool() const;
   inline ctx get_ctx() const;
+  inline std::string to_str() const;
   inline void dump() const;
 
   inline aff_list add(aff el) const;
   static inline aff_list alloc(ctx ctx, int n);
+  inline aff_list clear() const;
   inline aff_list concat(aff_list list2) const;
   inline aff_list drop(unsigned int first, unsigned int n) const;
   inline stat foreach(const std::function<stat(aff)> &fn) const;
@@ -355,10 +366,10 @@
   inline aff get_aff(int index) const;
   inline aff get_at(int index) const;
   inline aff_list insert(unsigned int pos, aff el) const;
-  inline int n_aff() const;
+  inline isl_size n_aff() const;
   inline aff_list reverse() const;
   inline aff_list set_aff(int index, aff el) const;
-  inline int size() const;
+  inline isl_size size() const;
   inline aff_list swap(unsigned int pos1, unsigned int pos2) const;
 };
 
@@ -389,17 +400,17 @@
   inline explicit operator bool() const;
   inline ctx get_ctx() const;
 
-  inline ast_expr access_from(pw_multi_aff pma) const;
   inline ast_expr access_from(multi_pw_aff mpa) const;
+  inline ast_expr access_from(pw_multi_aff pma) const;
   inline ast_node ast_from_schedule(union_map schedule) const;
-  inline ast_expr call_from(pw_multi_aff pma) const;
   inline ast_expr call_from(multi_pw_aff mpa) const;
-  inline ast_expr expr_from(set set) const;
+  inline ast_expr call_from(pw_multi_aff pma) const;
   inline ast_expr expr_from(pw_aff pa) const;
+  inline ast_expr expr_from(set set) const;
   static inline ast_build from_context(set set);
   inline union_map get_schedule() const;
   inline space get_schedule_space() const;
-  inline ast_node node_from_schedule(schedule schedule) const;
+  inline ast_node node_from(schedule schedule) const;
   inline ast_node node_from_schedule_map(union_map schedule) const;
   inline ast_build restrict(set set) const;
 };
@@ -443,14 +454,18 @@
   inline ast_expr ge(ast_expr expr2) const;
   inline id get_id() const;
   inline ast_expr get_op_arg(int pos) const;
-  inline int get_op_n_arg() const;
+  inline isl_size get_op_n_arg() const;
   inline val get_val() const;
   inline ast_expr gt(ast_expr expr2) const;
+  inline id id_get_id() const;
+  inline val int_get_val() const;
   inline boolean is_equal(const ast_expr &expr2) const;
   inline ast_expr le(ast_expr expr2) const;
   inline ast_expr lt(ast_expr expr2) const;
   inline ast_expr mul(ast_expr expr2) const;
   inline ast_expr neg() const;
+  inline ast_expr op_get_arg(int pos) const;
+  inline isl_size op_get_n_arg() const;
   inline ast_expr pdiv_q(ast_expr expr2) const;
   inline ast_expr pdiv_r(ast_expr expr2) const;
   inline ast_expr set_op_arg(int pos, ast_expr arg) const;
@@ -484,10 +499,12 @@
   inline bool is_null() const;
   inline explicit operator bool() const;
   inline ctx get_ctx() const;
+  inline std::string to_str() const;
   inline void dump() const;
 
   inline ast_expr_list add(ast_expr el) const;
   static inline ast_expr_list alloc(ctx ctx, int n);
+  inline ast_expr_list clear() const;
   inline ast_expr_list concat(ast_expr_list list2) const;
   inline ast_expr_list drop(unsigned int first, unsigned int n) const;
   inline stat foreach(const std::function<stat(ast_expr)> &fn) const;
@@ -495,10 +512,10 @@
   inline ast_expr get_ast_expr(int index) const;
   inline ast_expr get_at(int index) const;
   inline ast_expr_list insert(unsigned int pos, ast_expr el) const;
-  inline int n_ast_expr() const;
+  inline isl_size n_ast_expr() const;
   inline ast_expr_list reverse() const;
   inline ast_expr_list set_ast_expr(int index, ast_expr el) const;
-  inline int size() const;
+  inline isl_size size() const;
   inline ast_expr_list swap(unsigned int pos1, unsigned int pos2) const;
 };
 
@@ -541,8 +558,11 @@
   inline id get_annotation() const;
   inline ast_expr if_get_cond() const;
   inline ast_node if_get_else() const;
+  inline ast_node if_get_else_node() const;
   inline ast_node if_get_then() const;
+  inline ast_node if_get_then_node() const;
   inline boolean if_has_else() const;
+  inline boolean if_has_else_node() const;
   inline id mark_get_id() const;
   inline ast_node mark_get_node() const;
   inline ast_node set_annotation(id annotation) const;
@@ -575,10 +595,12 @@
   inline bool is_null() const;
   inline explicit operator bool() const;
   inline ctx get_ctx() const;
+  inline std::string to_str() const;
   inline void dump() const;
 
   inline ast_node_list add(ast_node el) const;
   static inline ast_node_list alloc(ctx ctx, int n);
+  inline ast_node_list clear() const;
   inline ast_node_list concat(ast_node_list list2) const;
   inline ast_node_list drop(unsigned int first, unsigned int n) const;
   inline stat foreach(const std::function<stat(ast_node)> &fn) const;
@@ -586,10 +608,10 @@
   inline ast_node get_ast_node(int index) const;
   inline ast_node get_at(int index) const;
   inline ast_node_list insert(unsigned int pos, ast_node el) const;
-  inline int n_ast_node() const;
+  inline isl_size n_ast_node() const;
   inline ast_node_list reverse() const;
   inline ast_node_list set_ast_node(int index, ast_node el) const;
-  inline int size() const;
+  inline isl_size size() const;
   inline ast_node_list swap(unsigned int pos1, unsigned int pos2) const;
 };
 
@@ -635,7 +657,7 @@
   inline basic_set deltas() const;
   inline basic_map deltas_map() const;
   inline basic_map detect_equalities() const;
-  inline unsigned int dim(isl::dim type) const;
+  inline isl_size dim(isl::dim type) const;
   inline basic_set domain() const;
   inline basic_map domain_map() const;
   inline basic_map domain_product(basic_map bmap2) const;
@@ -644,7 +666,7 @@
   inline basic_map drop_unused_params() const;
   inline basic_map eliminate(isl::dim type, unsigned int first, unsigned int n) const;
   static inline basic_map empty(space space);
-  static inline basic_map equal(space dim, unsigned int n_equal);
+  static inline basic_map equal(space space, unsigned int n_equal);
   inline mat equalities_matrix(isl::dim c1, isl::dim c2, isl::dim c3, isl::dim c4, isl::dim c5) const;
   inline basic_map equate(isl::dim type1, int pos1, isl::dim type2, int pos2) const;
   inline int find_dim_by_name(isl::dim type, const std::string &name) const;
@@ -673,7 +695,7 @@
   inline basic_map gist(basic_map context) const;
   inline basic_map gist_domain(basic_set context) const;
   inline boolean has_dim_id(isl::dim type, unsigned int pos) const;
-  static inline basic_map identity(space dim);
+  static inline basic_map identity(space space);
   inline boolean image_is_bounded() const;
   inline mat inequalities_matrix(isl::dim c1, isl::dim c2, isl::dim c3, isl::dim c4, isl::dim c5) const;
   inline basic_map insert_dims(isl::dim type, unsigned int pos, unsigned int n) const;
@@ -689,15 +711,15 @@
   inline boolean is_strict_subset(const basic_map &bmap2) const;
   inline boolean is_subset(const basic_map &bmap2) const;
   inline boolean is_universe() const;
-  static inline basic_map less_at(space dim, unsigned int pos);
+  static inline basic_map less_at(space space, unsigned int pos);
   inline map lexmax() const;
   inline map lexmin() const;
   inline pw_multi_aff lexmin_pw_multi_aff() const;
   inline basic_map lower_bound_si(isl::dim type, unsigned int pos, int value) const;
-  static inline basic_map more_at(space dim, unsigned int pos);
+  static inline basic_map more_at(space space, unsigned int pos);
   inline basic_map move_dims(isl::dim dst_type, unsigned int dst_pos, isl::dim src_type, unsigned int src_pos, unsigned int n) const;
-  inline int n_constraint() const;
-  static inline basic_map nat_universe(space dim);
+  inline isl_size n_constraint() const;
+  static inline basic_map nat_universe(space space);
   inline basic_map neg() const;
   inline basic_map order_ge(isl::dim type1, int pos1, isl::dim type2, int pos2) const;
   inline basic_map order_gt(isl::dim type1, int pos1, isl::dim type2, int pos2) const;
@@ -753,10 +775,12 @@
   inline bool is_null() const;
   inline explicit operator bool() const;
   inline ctx get_ctx() const;
+  inline std::string to_str() const;
   inline void dump() const;
 
   inline basic_map_list add(basic_map el) const;
   static inline basic_map_list alloc(ctx ctx, int n);
+  inline basic_map_list clear() const;
   inline basic_map_list concat(basic_map_list list2) const;
   inline basic_map_list drop(unsigned int first, unsigned int n) const;
   inline stat foreach(const std::function<stat(basic_map)> &fn) const;
@@ -764,10 +788,10 @@
   inline basic_map get_at(int index) const;
   inline basic_map get_basic_map(int index) const;
   inline basic_map_list insert(unsigned int pos, basic_map el) const;
-  inline int n_basic_map() const;
+  inline isl_size n_basic_map() const;
   inline basic_map_list reverse() const;
   inline basic_map_list set_basic_map(int index, basic_map el) const;
-  inline int size() const;
+  inline isl_size size() const;
   inline basic_map_list swap(unsigned int pos1, unsigned int pos2) const;
 };
 
@@ -787,8 +811,8 @@
   inline /* implicit */ basic_set();
   inline /* implicit */ basic_set(const basic_set &obj);
   inline /* implicit */ basic_set(std::nullptr_t);
-  inline explicit basic_set(ctx ctx, const std::string &str);
   inline /* implicit */ basic_set(point pnt);
+  inline explicit basic_set(ctx ctx, const std::string &str);
   inline basic_set &operator=(basic_set obj);
   inline ~basic_set();
   inline __isl_give isl_basic_set *copy() const &;
@@ -807,7 +831,7 @@
   static inline basic_set box_from_points(point pnt1, point pnt2);
   inline basic_set coefficients() const;
   inline basic_set detect_equalities() const;
-  inline unsigned int dim(isl::dim type) const;
+  inline isl_size dim(isl::dim type) const;
   inline val dim_max_val(int pos) const;
   inline basic_set drop_constraints_involving_dims(isl::dim type, unsigned int first, unsigned int n) const;
   inline basic_set drop_constraints_not_involving_dims(isl::dim type, unsigned int first, unsigned int n) const;
@@ -850,9 +874,9 @@
   inline basic_set lower_bound_val(isl::dim type, unsigned int pos, val value) const;
   inline val max_val(const aff &obj) const;
   inline basic_set move_dims(isl::dim dst_type, unsigned int dst_pos, isl::dim src_type, unsigned int src_pos, unsigned int n) const;
-  inline int n_constraint() const;
-  inline unsigned int n_dim() const;
-  static inline basic_set nat_universe(space dim);
+  inline isl_size n_constraint() const;
+  inline isl_size n_dim() const;
+  static inline basic_set nat_universe(space space);
   inline basic_set neg() const;
   inline basic_set params() const;
   inline boolean plain_is_empty() const;
@@ -903,10 +927,12 @@
   inline bool is_null() const;
   inline explicit operator bool() const;
   inline ctx get_ctx() const;
+  inline std::string to_str() const;
   inline void dump() const;
 
   inline basic_set_list add(basic_set el) const;
   static inline basic_set_list alloc(ctx ctx, int n);
+  inline basic_set_list clear() const;
   inline basic_set_list coefficients() const;
   inline basic_set_list concat(basic_set_list list2) const;
   inline basic_set_list drop(unsigned int first, unsigned int n) const;
@@ -915,10 +941,10 @@
   inline basic_set get_at(int index) const;
   inline basic_set get_basic_set(int index) const;
   inline basic_set_list insert(unsigned int pos, basic_set el) const;
-  inline int n_basic_set() const;
+  inline isl_size n_basic_set() const;
   inline basic_set_list reverse() const;
   inline basic_set_list set_basic_set(int index, basic_set el) const;
-  inline int size() const;
+  inline isl_size size() const;
   inline basic_set_list swap(unsigned int pos1, unsigned int pos2) const;
 };
 
@@ -961,7 +987,7 @@
   inline local_space get_local_space() const;
   inline space get_space() const;
   inline boolean involves_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  inline int is_div_constraint() const;
+  inline boolean is_div_constraint() const;
   inline boolean is_lower_bound(isl::dim type, unsigned int pos) const;
   inline boolean is_upper_bound(isl::dim type, unsigned int pos) const;
   inline int plain_cmp(const constraint &c2) const;
@@ -996,10 +1022,12 @@
   inline bool is_null() const;
   inline explicit operator bool() const;
   inline ctx get_ctx() const;
+  inline std::string to_str() const;
   inline void dump() const;
 
   inline constraint_list add(constraint el) const;
   static inline constraint_list alloc(ctx ctx, int n);
+  inline constraint_list clear() const;
   inline constraint_list concat(constraint_list list2) const;
   inline constraint_list drop(unsigned int first, unsigned int n) const;
   inline stat foreach(const std::function<stat(constraint)> &fn) const;
@@ -1007,10 +1035,10 @@
   inline constraint get_at(int index) const;
   inline constraint get_constraint(int index) const;
   inline constraint_list insert(unsigned int pos, constraint el) const;
-  inline int n_constraint() const;
+  inline isl_size n_constraint() const;
   inline constraint_list reverse() const;
   inline constraint_list set_constraint(int index, constraint el) const;
-  inline int size() const;
+  inline isl_size size() const;
   inline constraint_list swap(unsigned int pos1, unsigned int pos2) const;
 };
 
@@ -1039,6 +1067,8 @@
   inline bool is_null() const;
   inline explicit operator bool() const;
   inline ctx get_ctx() const;
+  inline std::string to_str() const;
+  inline void dump() const;
 
   inline multi_aff get_offset() const;
   inline multi_val get_size() const;
@@ -1062,6 +1092,7 @@
   inline /* implicit */ id();
   inline /* implicit */ id(const id &obj);
   inline /* implicit */ id(std::nullptr_t);
+  inline explicit id(ctx ctx, const std::string &str);
   inline id &operator=(id obj);
   inline ~id();
   inline __isl_give isl_id *copy() const &;
@@ -1105,10 +1136,12 @@
   inline bool is_null() const;
   inline explicit operator bool() const;
   inline ctx get_ctx() const;
+  inline std::string to_str() const;
   inline void dump() const;
 
   inline id_list add(id el) const;
   static inline id_list alloc(ctx ctx, int n);
+  inline id_list clear() const;
   inline id_list concat(id_list list2) const;
   inline id_list drop(unsigned int first, unsigned int n) const;
   inline stat foreach(const std::function<stat(id)> &fn) const;
@@ -1116,10 +1149,10 @@
   inline id get_at(int index) const;
   inline id get_id(int index) const;
   inline id_list insert(unsigned int pos, id el) const;
-  inline int n_id() const;
+  inline isl_size n_id() const;
   inline id_list reverse() const;
   inline id_list set_id(int index, id el) const;
-  inline int size() const;
+  inline isl_size size() const;
   inline id_list swap(unsigned int pos1, unsigned int pos2) const;
 };
 
@@ -1174,7 +1207,7 @@
   inline /* implicit */ local_space();
   inline /* implicit */ local_space(const local_space &obj);
   inline /* implicit */ local_space(std::nullptr_t);
-  inline explicit local_space(space dim);
+  inline explicit local_space(space space);
   inline local_space &operator=(local_space obj);
   inline ~local_space();
   inline __isl_give isl_local_space *copy() const &;
@@ -1187,7 +1220,7 @@
   inline void dump() const;
 
   inline local_space add_dims(isl::dim type, unsigned int n) const;
-  inline int dim(isl::dim type) const;
+  inline isl_size dim(isl::dim type) const;
   inline local_space domain() const;
   inline local_space drop_dims(isl::dim type, unsigned int first, unsigned int n) const;
   inline int find_dim_by_name(isl::dim type, const std::string &name) const;
@@ -1228,8 +1261,8 @@
   inline /* implicit */ map();
   inline /* implicit */ map(const map &obj);
   inline /* implicit */ map(std::nullptr_t);
-  inline explicit map(ctx ctx, const std::string &str);
   inline /* implicit */ map(basic_map bmap);
+  inline explicit map(ctx ctx, const std::string &str);
   inline map &operator=(map obj);
   inline ~map();
   inline __isl_give isl_map *copy() const &;
@@ -1248,6 +1281,8 @@
   inline map align_params(space model) const;
   inline map apply_domain(map map2) const;
   inline map apply_range(map map2) const;
+  inline set bind_domain(multi_id tuple) const;
+  inline set bind_range(multi_id tuple) const;
   inline boolean can_curry() const;
   inline boolean can_range_curry() const;
   inline boolean can_uncurry() const;
@@ -1259,7 +1294,7 @@
   inline set deltas() const;
   inline map deltas_map() const;
   inline map detect_equalities() const;
-  inline unsigned int dim(isl::dim type) const;
+  inline isl_size dim(isl::dim type) const;
   inline pw_aff dim_max(int pos) const;
   inline pw_aff dim_min(int pos) const;
   inline set domain() const;
@@ -1273,6 +1308,7 @@
   inline map drop_unused_params() const;
   inline map eliminate(isl::dim type, unsigned int first, unsigned int n) const;
   static inline map empty(space space);
+  inline map eq_at(multi_pw_aff mpa) const;
   inline map equate(isl::dim type1, int pos1, isl::dim type2, int pos2) const;
   inline map factor_domain() const;
   inline map factor_range() const;
@@ -1316,13 +1352,15 @@
   inline boolean has_equal_space(const map &map2) const;
   inline boolean has_tuple_id(isl::dim type) const;
   inline boolean has_tuple_name(isl::dim type) const;
-  static inline map identity(space dim);
+  static inline map identity(space space);
   inline map insert_dims(isl::dim type, unsigned int pos, unsigned int n) const;
   inline map intersect(map map2) const;
   inline map intersect_domain(set set) const;
+  inline map intersect_domain_factor_domain(map factor) const;
   inline map intersect_domain_factor_range(map factor) const;
   inline map intersect_params(set params) const;
   inline map intersect_range(set set) const;
+  inline map intersect_range_factor_domain(map factor) const;
   inline map intersect_range_factor_range(map factor) const;
   inline boolean involves_dims(isl::dim type, unsigned int first, unsigned int n) const;
   inline boolean is_bijective() const;
@@ -1336,26 +1374,34 @@
   inline boolean is_strict_subset(const map &map2) const;
   inline boolean is_subset(const map &map2) const;
   inline int is_translation() const;
-  static inline map lex_ge(space set_dim);
-  static inline map lex_ge_first(space dim, unsigned int n);
+  static inline map lex_ge(space set_space);
+  inline map lex_ge_at(multi_pw_aff mpa) const;
+  static inline map lex_ge_first(space space, unsigned int n);
   inline map lex_ge_map(map map2) const;
-  static inline map lex_gt(space set_dim);
-  static inline map lex_gt_first(space dim, unsigned int n);
+  static inline map lex_gt(space set_space);
+  inline map lex_gt_at(multi_pw_aff mpa) const;
+  static inline map lex_gt_first(space space, unsigned int n);
   inline map lex_gt_map(map map2) const;
-  static inline map lex_le(space set_dim);
-  static inline map lex_le_first(space dim, unsigned int n);
+  static inline map lex_le(space set_space);
+  inline map lex_le_at(multi_pw_aff mpa) const;
+  static inline map lex_le_first(space space, unsigned int n);
   inline map lex_le_map(map map2) const;
-  static inline map lex_lt(space set_dim);
-  static inline map lex_lt_first(space dim, unsigned int n);
+  static inline map lex_lt(space set_space);
+  inline map lex_lt_at(multi_pw_aff mpa) const;
+  static inline map lex_lt_first(space space, unsigned int n);
   inline map lex_lt_map(map map2) const;
   inline map lexmax() const;
   inline pw_multi_aff lexmax_pw_multi_aff() const;
   inline map lexmin() const;
   inline pw_multi_aff lexmin_pw_multi_aff() const;
+  inline map lower_bound(multi_pw_aff lower) const;
   inline map lower_bound_si(isl::dim type, unsigned int pos, int value) const;
+  inline map lower_bound_val(isl::dim type, unsigned int pos, val value) const;
+  inline multi_pw_aff max_multi_pw_aff() const;
+  inline multi_pw_aff min_multi_pw_aff() const;
   inline map move_dims(isl::dim dst_type, unsigned int dst_pos, isl::dim src_type, unsigned int src_pos, unsigned int n) const;
-  inline int n_basic_map() const;
-  static inline map nat_universe(space dim);
+  inline isl_size n_basic_map() const;
+  static inline map nat_universe(space space);
   inline map neg() const;
   inline map oppose(isl::dim type1, int pos1, isl::dim type2, int pos2) const;
   inline map order_ge(isl::dim type1, int pos1, isl::dim type2, int pos2) const;
@@ -1371,13 +1417,14 @@
   inline boolean plain_is_universe() const;
   inline basic_map plain_unshifted_simple_hull() const;
   inline basic_map polyhedral_hull() const;
-  inline map preimage_domain_multi_aff(multi_aff ma) const;
-  inline map preimage_domain_multi_pw_aff(multi_pw_aff mpa) const;
-  inline map preimage_domain_pw_multi_aff(pw_multi_aff pma) const;
-  inline map preimage_range_multi_aff(multi_aff ma) const;
-  inline map preimage_range_pw_multi_aff(pw_multi_aff pma) const;
+  inline map preimage_domain(multi_aff ma) const;
+  inline map preimage_domain(multi_pw_aff mpa) const;
+  inline map preimage_domain(pw_multi_aff pma) const;
+  inline map preimage_range(multi_aff ma) const;
+  inline map preimage_range(pw_multi_aff pma) const;
   inline map product(map map2) const;
   inline map project_out(isl::dim type, unsigned int first, unsigned int n) const;
+  inline map project_out_all_params() const;
   inline set range() const;
   inline map range_curry() const;
   inline map range_factor_domain() const;
@@ -1385,6 +1432,7 @@
   inline boolean range_is_wrapping() const;
   inline map range_map() const;
   inline map range_product(map map2) const;
+  inline map range_reverse() const;
   inline map remove_dims(isl::dim type, unsigned int first, unsigned int n) const;
   inline map remove_divs() const;
   inline map remove_divs_involving_dims(isl::dim type, unsigned int first, unsigned int n) const;
@@ -1407,7 +1455,9 @@
   static inline map universe(space space);
   inline basic_map unshifted_simple_hull() const;
   inline basic_map unshifted_simple_hull_from_map_list(map_list list) const;
+  inline map upper_bound(multi_pw_aff upper) const;
   inline map upper_bound_si(isl::dim type, unsigned int pos, int value) const;
+  inline map upper_bound_val(isl::dim type, unsigned int pos, val value) const;
   inline set wrap() const;
   inline map zip() const;
 };
@@ -1437,10 +1487,12 @@
   inline bool is_null() const;
   inline explicit operator bool() const;
   inline ctx get_ctx() const;
+  inline std::string to_str() const;
   inline void dump() const;
 
   inline map_list add(map el) const;
   static inline map_list alloc(ctx ctx, int n);
+  inline map_list clear() const;
   inline map_list concat(map_list list2) const;
   inline map_list drop(unsigned int first, unsigned int n) const;
   inline stat foreach(const std::function<stat(map)> &fn) const;
@@ -1448,10 +1500,10 @@
   inline map get_at(int index) const;
   inline map get_map(int index) const;
   inline map_list insert(unsigned int pos, map el) const;
-  inline int n_map() const;
+  inline isl_size n_map() const;
   inline map_list reverse() const;
   inline map_list set_map(int index, map el) const;
-  inline int size() const;
+  inline isl_size size() const;
   inline map_list swap(unsigned int pos1, unsigned int pos2) const;
 };
 
@@ -1487,7 +1539,7 @@
   inline mat add_zero_rows(unsigned int n) const;
   inline mat aff_direct_sum(mat right) const;
   static inline mat alloc(ctx ctx, unsigned int n_row, unsigned int n_col);
-  inline int cols() const;
+  inline isl_size cols() const;
   inline mat concat(mat bot) const;
   inline mat diagonal(mat mat2) const;
   inline mat drop_cols(unsigned int col, unsigned int n) const;
@@ -1507,12 +1559,12 @@
   inline mat normalize() const;
   inline mat normalize_row(int row) const;
   inline mat product(mat right) const;
-  inline int rank() const;
+  inline isl_size rank() const;
   inline mat right_inverse() const;
   inline mat right_kernel() const;
   inline mat row_basis() const;
   inline mat row_basis_extension(mat mat2) const;
-  inline int rows() const;
+  inline isl_size rows() const;
   inline mat set_element_si(int row, int col, int v) const;
   inline mat set_element_val(int row, int col, val v) const;
   inline mat swap_cols(unsigned int i, unsigned int j) const;
@@ -1541,6 +1593,7 @@
   inline /* implicit */ multi_aff(const multi_aff &obj);
   inline /* implicit */ multi_aff(std::nullptr_t);
   inline /* implicit */ multi_aff(aff aff);
+  inline explicit multi_aff(space space, aff_list list);
   inline explicit multi_aff(ctx ctx, const std::string &str);
   inline multi_aff &operator=(multi_aff obj);
   inline ~multi_aff();
@@ -1555,9 +1608,14 @@
   inline void dump() const;
 
   inline multi_aff add(multi_aff multi2) const;
+  inline multi_aff add_constant(multi_val mv) const;
+  inline multi_aff add_constant(val v) const;
   inline multi_aff add_dims(isl::dim type, unsigned int n) const;
   inline multi_aff align_params(space model) const;
-  inline unsigned int dim(isl::dim type) const;
+  inline basic_set bind(multi_id tuple) const;
+  inline multi_aff bind_domain(multi_id tuple) const;
+  inline multi_aff bind_domain_wrapped_domain(multi_id tuple) const;
+  inline isl_size dim(isl::dim type) const;
   static inline multi_aff domain_map(space space);
   inline multi_aff drop_dims(isl::dim type, unsigned int first, unsigned int n) const;
   inline multi_aff factor_range() const;
@@ -1567,11 +1625,13 @@
   inline multi_aff flatten_domain() const;
   inline multi_aff flatten_range() const;
   inline multi_aff floor() const;
-  static inline multi_aff from_aff_list(space space, aff_list list);
   inline multi_aff from_range() const;
   inline aff get_aff(int pos) const;
+  inline aff get_at(int pos) const;
+  inline multi_val get_constant_multi_val() const;
   inline id get_dim_id(isl::dim type, unsigned int pos) const;
   inline space get_domain_space() const;
+  inline aff_list get_list() const;
   inline space get_space() const;
   inline id get_tuple_id(isl::dim type) const;
   inline std::string get_tuple_name(isl::dim type) const;
@@ -1579,8 +1639,12 @@
   inline multi_aff gist_params(set context) const;
   inline boolean has_tuple_id(isl::dim type) const;
   static inline multi_aff identity(space space);
+  inline multi_aff identity() const;
+  static inline multi_aff identity_on_domain(space space);
   inline multi_aff insert_dims(isl::dim type, unsigned int first, unsigned int n) const;
+  inline multi_aff insert_domain(space domain) const;
   inline boolean involves_dims(isl::dim type, unsigned int first, unsigned int n) const;
+  inline boolean involves_locals() const;
   inline boolean involves_nan() const;
   inline set lex_ge_set(multi_aff ma2) const;
   inline set lex_gt_set(multi_aff ma2) const;
@@ -1604,19 +1668,74 @@
   inline multi_aff range_splice(unsigned int pos, multi_aff multi2) const;
   inline multi_aff reset_tuple_id(isl::dim type) const;
   inline multi_aff reset_user() const;
-  inline multi_aff scale_down_multi_val(multi_val mv) const;
-  inline multi_aff scale_down_val(val v) const;
-  inline multi_aff scale_multi_val(multi_val mv) const;
-  inline multi_aff scale_val(val v) const;
+  inline multi_aff scale(multi_val mv) const;
+  inline multi_aff scale(val v) const;
+  inline multi_aff scale_down(multi_val mv) const;
+  inline multi_aff scale_down(val v) const;
   inline multi_aff set_aff(int pos, aff el) const;
+  inline multi_aff set_at(int pos, aff el) const;
   inline multi_aff set_dim_id(isl::dim type, unsigned int pos, id id) const;
   inline multi_aff set_tuple_id(isl::dim type, id id) const;
   inline multi_aff set_tuple_name(isl::dim type, const std::string &s) const;
+  inline isl_size size() const;
   inline multi_aff splice(unsigned int in_pos, unsigned int out_pos, multi_aff multi2) const;
   inline multi_aff sub(multi_aff multi2) const;
+  inline multi_aff unbind_params_insert_domain(multi_id domain) const;
   static inline multi_aff zero(space space);
 };
 
+// declarations for isl::multi_id
+inline multi_id manage(__isl_take isl_multi_id *ptr);
+inline multi_id manage_copy(__isl_keep isl_multi_id *ptr);
+
+class multi_id {
+  friend inline multi_id manage(__isl_take isl_multi_id *ptr);
+  friend inline multi_id manage_copy(__isl_keep isl_multi_id *ptr);
+
+  isl_multi_id *ptr = nullptr;
+
+  inline explicit multi_id(__isl_take isl_multi_id *ptr);
+
+public:
+  inline /* implicit */ multi_id();
+  inline /* implicit */ multi_id(const multi_id &obj);
+  inline /* implicit */ multi_id(std::nullptr_t);
+  inline explicit multi_id(space space, id_list list);
+  inline explicit multi_id(ctx ctx, const std::string &str);
+  inline multi_id &operator=(multi_id obj);
+  inline ~multi_id();
+  inline __isl_give isl_multi_id *copy() const &;
+  inline __isl_give isl_multi_id *copy() && = delete;
+  inline __isl_keep isl_multi_id *get() const;
+  inline __isl_give isl_multi_id *release();
+  inline bool is_null() const;
+  inline explicit operator bool() const;
+  inline ctx get_ctx() const;
+  inline std::string to_str() const;
+  inline void dump() const;
+
+  inline multi_id align_params(space model) const;
+  inline multi_id factor_range() const;
+  inline multi_id flat_range_product(multi_id multi2) const;
+  inline multi_id flatten_range() const;
+  inline multi_id from_range() const;
+  inline id get_at(int pos) const;
+  inline space get_domain_space() const;
+  inline id get_id(int pos) const;
+  inline id_list get_list() const;
+  inline space get_space() const;
+  inline boolean plain_is_equal(const multi_id &multi2) const;
+  inline multi_id range_factor_domain() const;
+  inline multi_id range_factor_range() const;
+  inline boolean range_is_wrapping() const;
+  inline multi_id range_product(multi_id multi2) const;
+  inline multi_id range_splice(unsigned int pos, multi_id multi2) const;
+  inline multi_id reset_user() const;
+  inline multi_id set_at(int pos, id el) const;
+  inline multi_id set_id(int pos, id el) const;
+  inline isl_size size() const;
+};
+
 // declarations for isl::multi_pw_aff
 inline multi_pw_aff manage(__isl_take isl_multi_pw_aff *ptr);
 inline multi_pw_aff manage_copy(__isl_keep isl_multi_pw_aff *ptr);
@@ -1633,8 +1752,10 @@
   inline /* implicit */ multi_pw_aff();
   inline /* implicit */ multi_pw_aff(const multi_pw_aff &obj);
   inline /* implicit */ multi_pw_aff(std::nullptr_t);
+  inline /* implicit */ multi_pw_aff(aff aff);
   inline /* implicit */ multi_pw_aff(multi_aff ma);
   inline /* implicit */ multi_pw_aff(pw_aff pa);
+  inline explicit multi_pw_aff(space space, pw_aff_list list);
   inline /* implicit */ multi_pw_aff(pw_multi_aff pma);
   inline explicit multi_pw_aff(ctx ctx, const std::string &str);
   inline multi_pw_aff &operator=(multi_pw_aff obj);
@@ -1650,10 +1771,15 @@
   inline void dump() const;
 
   inline multi_pw_aff add(multi_pw_aff multi2) const;
+  inline multi_pw_aff add_constant(multi_val mv) const;
+  inline multi_pw_aff add_constant(val v) const;
   inline multi_pw_aff add_dims(isl::dim type, unsigned int n) const;
   inline multi_pw_aff align_params(space model) const;
+  inline set bind(multi_id tuple) const;
+  inline multi_pw_aff bind_domain(multi_id tuple) const;
+  inline multi_pw_aff bind_domain_wrapped_domain(multi_id tuple) const;
   inline multi_pw_aff coalesce() const;
-  inline unsigned int dim(isl::dim type) const;
+  inline isl_size dim(isl::dim type) const;
   inline set domain() const;
   inline multi_pw_aff drop_dims(isl::dim type, unsigned int first, unsigned int n) const;
   inline map eq_map(multi_pw_aff mpa2) const;
@@ -1662,11 +1788,12 @@
   inline int find_dim_by_name(isl::dim type, const std::string &name) const;
   inline multi_pw_aff flat_range_product(multi_pw_aff multi2) const;
   inline multi_pw_aff flatten_range() const;
-  static inline multi_pw_aff from_pw_aff_list(space space, pw_aff_list list);
   inline multi_pw_aff from_range() const;
+  inline pw_aff get_at(int pos) const;
   inline id get_dim_id(isl::dim type, unsigned int pos) const;
   inline space get_domain_space() const;
   inline uint32_t get_hash() const;
+  inline pw_aff_list get_list() const;
   inline pw_aff get_pw_aff(int pos) const;
   inline space get_space() const;
   inline id get_tuple_id(isl::dim type) const;
@@ -1675,15 +1802,26 @@
   inline multi_pw_aff gist_params(set set) const;
   inline boolean has_tuple_id(isl::dim type) const;
   static inline multi_pw_aff identity(space space);
+  inline multi_pw_aff identity() const;
+  static inline multi_pw_aff identity_on_domain(space space);
   inline multi_pw_aff insert_dims(isl::dim type, unsigned int first, unsigned int n) const;
+  inline multi_pw_aff insert_domain(space domain) const;
   inline multi_pw_aff intersect_domain(set domain) const;
   inline multi_pw_aff intersect_params(set set) const;
   inline boolean involves_dims(isl::dim type, unsigned int first, unsigned int n) const;
   inline boolean involves_nan() const;
+  inline boolean involves_param(const id &id) const;
+  inline boolean involves_param(const id_list &list) const;
   inline boolean is_cst() const;
   inline boolean is_equal(const multi_pw_aff &mpa2) const;
+  inline map lex_ge_map(multi_pw_aff mpa2) const;
   inline map lex_gt_map(multi_pw_aff mpa2) const;
+  inline map lex_le_map(multi_pw_aff mpa2) const;
   inline map lex_lt_map(multi_pw_aff mpa2) const;
+  inline multi_pw_aff max(multi_pw_aff multi2) const;
+  inline multi_val max_multi_val() const;
+  inline multi_pw_aff min(multi_pw_aff multi2) const;
+  inline multi_val min_multi_val() const;
   inline multi_pw_aff mod_multi_val(multi_val mv) const;
   inline multi_pw_aff move_dims(isl::dim dst_type, unsigned int dst_pos, isl::dim src_type, unsigned int src_pos, unsigned int n) const;
   inline multi_pw_aff neg() const;
@@ -1691,8 +1829,8 @@
   inline multi_pw_aff product(multi_pw_aff multi2) const;
   inline multi_pw_aff project_domain_on_params() const;
   inline multi_pw_aff pullback(multi_aff ma) const;
-  inline multi_pw_aff pullback(pw_multi_aff pma) const;
   inline multi_pw_aff pullback(multi_pw_aff mpa2) const;
+  inline multi_pw_aff pullback(pw_multi_aff pma) const;
   inline multi_pw_aff range_factor_domain() const;
   inline multi_pw_aff range_factor_range() const;
   inline boolean range_is_wrapping() const;
@@ -1700,16 +1838,20 @@
   inline multi_pw_aff range_splice(unsigned int pos, multi_pw_aff multi2) const;
   inline multi_pw_aff reset_tuple_id(isl::dim type) const;
   inline multi_pw_aff reset_user() const;
-  inline multi_pw_aff scale_down_multi_val(multi_val mv) const;
-  inline multi_pw_aff scale_down_val(val v) const;
-  inline multi_pw_aff scale_multi_val(multi_val mv) const;
-  inline multi_pw_aff scale_val(val v) const;
+  inline multi_pw_aff scale(multi_val mv) const;
+  inline multi_pw_aff scale(val v) const;
+  inline multi_pw_aff scale_down(multi_val mv) const;
+  inline multi_pw_aff scale_down(val v) const;
+  inline multi_pw_aff set_at(int pos, pw_aff el) const;
   inline multi_pw_aff set_dim_id(isl::dim type, unsigned int pos, id id) const;
   inline multi_pw_aff set_pw_aff(int pos, pw_aff el) const;
   inline multi_pw_aff set_tuple_id(isl::dim type, id id) const;
   inline multi_pw_aff set_tuple_name(isl::dim type, const std::string &s) const;
+  inline isl_size size() const;
   inline multi_pw_aff splice(unsigned int in_pos, unsigned int out_pos, multi_pw_aff multi2) const;
   inline multi_pw_aff sub(multi_pw_aff multi2) const;
+  inline multi_pw_aff unbind_params_insert_domain(multi_id domain) const;
+  inline multi_pw_aff union_add(multi_pw_aff mpa2) const;
   static inline multi_pw_aff zero(space space);
 };
 
@@ -1729,8 +1871,9 @@
   inline /* implicit */ multi_union_pw_aff();
   inline /* implicit */ multi_union_pw_aff(const multi_union_pw_aff &obj);
   inline /* implicit */ multi_union_pw_aff(std::nullptr_t);
-  inline /* implicit */ multi_union_pw_aff(union_pw_aff upa);
   inline /* implicit */ multi_union_pw_aff(multi_pw_aff mpa);
+  inline /* implicit */ multi_union_pw_aff(union_pw_aff upa);
+  inline explicit multi_union_pw_aff(space space, union_pw_aff_list list);
   inline explicit multi_union_pw_aff(union_pw_multi_aff upma);
   inline explicit multi_union_pw_aff(ctx ctx, const std::string &str);
   inline multi_union_pw_aff &operator=(multi_union_pw_aff obj);
@@ -1750,8 +1893,9 @@
   inline union_pw_aff apply_aff(aff aff) const;
   inline union_pw_aff apply_pw_aff(pw_aff pa) const;
   inline multi_union_pw_aff apply_pw_multi_aff(pw_multi_aff pma) const;
+  inline union_set bind(multi_id tuple) const;
   inline multi_union_pw_aff coalesce() const;
-  inline unsigned int dim(isl::dim type) const;
+  inline isl_size dim(isl::dim type) const;
   inline union_set domain() const;
   inline multi_union_pw_aff drop_dims(isl::dim type, unsigned int first, unsigned int n) const;
   inline multi_pw_aff extract_multi_pw_aff(space space) const;
@@ -1764,9 +1908,10 @@
   static inline multi_union_pw_aff from_multi_aff(multi_aff ma);
   inline multi_union_pw_aff from_range() const;
   static inline multi_union_pw_aff from_union_map(union_map umap);
-  static inline multi_union_pw_aff from_union_pw_aff_list(space space, union_pw_aff_list list);
+  inline union_pw_aff get_at(int pos) const;
   inline id get_dim_id(isl::dim type, unsigned int pos) const;
   inline space get_domain_space() const;
+  inline union_pw_aff_list get_list() const;
   inline space get_space() const;
   inline id get_tuple_id(isl::dim type) const;
   inline std::string get_tuple_name(isl::dim type) const;
@@ -1794,14 +1939,16 @@
   inline multi_union_pw_aff range_splice(unsigned int pos, multi_union_pw_aff multi2) const;
   inline multi_union_pw_aff reset_tuple_id(isl::dim type) const;
   inline multi_union_pw_aff reset_user() const;
-  inline multi_union_pw_aff scale_down_multi_val(multi_val mv) const;
-  inline multi_union_pw_aff scale_down_val(val v) const;
-  inline multi_union_pw_aff scale_multi_val(multi_val mv) const;
-  inline multi_union_pw_aff scale_val(val v) const;
+  inline multi_union_pw_aff scale(multi_val mv) const;
+  inline multi_union_pw_aff scale(val v) const;
+  inline multi_union_pw_aff scale_down(multi_val mv) const;
+  inline multi_union_pw_aff scale_down(val v) const;
+  inline multi_union_pw_aff set_at(int pos, union_pw_aff el) const;
   inline multi_union_pw_aff set_dim_id(isl::dim type, unsigned int pos, id id) const;
   inline multi_union_pw_aff set_tuple_id(isl::dim type, id id) const;
   inline multi_union_pw_aff set_tuple_name(isl::dim type, const std::string &s) const;
   inline multi_union_pw_aff set_union_pw_aff(int pos, union_pw_aff el) const;
+  inline isl_size size() const;
   inline multi_union_pw_aff sub(multi_union_pw_aff multi2) const;
   inline multi_union_pw_aff union_add(multi_union_pw_aff mupa2) const;
   static inline multi_union_pw_aff zero(space space);
@@ -1824,6 +1971,8 @@
   inline /* implicit */ multi_val();
   inline /* implicit */ multi_val(const multi_val &obj);
   inline /* implicit */ multi_val(std::nullptr_t);
+  inline explicit multi_val(space space, val_list list);
+  inline explicit multi_val(ctx ctx, const std::string &str);
   inline multi_val &operator=(multi_val obj);
   inline ~multi_val();
   inline __isl_give isl_multi_val *copy() const &;
@@ -1837,10 +1986,10 @@
   inline void dump() const;
 
   inline multi_val add(multi_val multi2) const;
+  inline multi_val add(val v) const;
   inline multi_val add_dims(isl::dim type, unsigned int n) const;
-  inline multi_val add_val(val v) const;
   inline multi_val align_params(space model) const;
-  inline unsigned int dim(isl::dim type) const;
+  inline isl_size dim(isl::dim type) const;
   inline multi_val drop_dims(isl::dim type, unsigned int first, unsigned int n) const;
   inline multi_val factor_range() const;
   inline int find_dim_by_id(isl::dim type, const id &id) const;
@@ -1848,9 +1997,10 @@
   inline multi_val flat_range_product(multi_val multi2) const;
   inline multi_val flatten_range() const;
   inline multi_val from_range() const;
-  static inline multi_val from_val_list(space space, val_list list);
+  inline val get_at(int pos) const;
   inline id get_dim_id(isl::dim type, unsigned int pos) const;
   inline space get_domain_space() const;
+  inline val_list get_list() const;
   inline space get_space() const;
   inline id get_tuple_id(isl::dim type) const;
   inline std::string get_tuple_name(isl::dim type) const;
@@ -1859,6 +2009,9 @@
   inline multi_val insert_dims(isl::dim type, unsigned int first, unsigned int n) const;
   inline boolean involves_dims(isl::dim type, unsigned int first, unsigned int n) const;
   inline boolean involves_nan() const;
+  inline boolean is_zero() const;
+  inline multi_val max(multi_val multi2) const;
+  inline multi_val min(multi_val multi2) const;
   inline multi_val mod_multi_val(multi_val mv) const;
   inline multi_val mod_val(val v) const;
   inline multi_val neg() const;
@@ -1870,17 +2023,18 @@
   inline boolean range_is_wrapping() const;
   inline multi_val range_product(multi_val multi2) const;
   inline multi_val range_splice(unsigned int pos, multi_val multi2) const;
-  static inline multi_val read_from_str(ctx ctx, const std::string &str);
   inline multi_val reset_tuple_id(isl::dim type) const;
   inline multi_val reset_user() const;
-  inline multi_val scale_down_multi_val(multi_val mv) const;
-  inline multi_val scale_down_val(val v) const;
-  inline multi_val scale_multi_val(multi_val mv) const;
-  inline multi_val scale_val(val v) const;
+  inline multi_val scale(multi_val mv) const;
+  inline multi_val scale(val v) const;
+  inline multi_val scale_down(multi_val mv) const;
+  inline multi_val scale_down(val v) const;
+  inline multi_val set_at(int pos, val el) const;
   inline multi_val set_dim_id(isl::dim type, unsigned int pos, id id) const;
   inline multi_val set_tuple_id(isl::dim type, id id) const;
   inline multi_val set_tuple_name(isl::dim type, const std::string &s) const;
   inline multi_val set_val(int pos, val el) const;
+  inline isl_size size() const;
   inline multi_val splice(unsigned int in_pos, unsigned int out_pos, multi_val multi2) const;
   inline multi_val sub(multi_val multi2) const;
   static inline multi_val zero(space space);
@@ -1917,6 +2071,7 @@
 
   inline point add_ui(isl::dim type, int pos, unsigned int val) const;
   inline val get_coordinate_val(isl::dim type, int pos) const;
+  inline multi_val get_multi_val() const;
   inline space get_space() const;
   inline point set_coordinate_val(isl::dim type, int pos, val v) const;
   inline point sub_ui(isl::dim type, int pos, unsigned int val) const;
@@ -1939,9 +2094,9 @@
   inline /* implicit */ pw_aff(const pw_aff &obj);
   inline /* implicit */ pw_aff(std::nullptr_t);
   inline /* implicit */ pw_aff(aff aff);
-  inline explicit pw_aff(local_space ls);
-  inline explicit pw_aff(set domain, val v);
   inline explicit pw_aff(ctx ctx, const std::string &str);
+  inline explicit pw_aff(set domain, val v);
+  inline explicit pw_aff(local_space ls);
   inline pw_aff &operator=(pw_aff obj);
   inline ~pw_aff();
   inline __isl_give isl_pw_aff *copy() const &;
@@ -1955,18 +2110,23 @@
   inline void dump() const;
 
   inline pw_aff add(pw_aff pwaff2) const;
+  inline pw_aff add_constant(val v) const;
   inline pw_aff add_dims(isl::dim type, unsigned int n) const;
   inline pw_aff align_params(space model) const;
   static inline pw_aff alloc(set set, aff aff);
+  inline aff as_aff() const;
+  inline set bind(id id) const;
+  inline pw_aff bind_domain(multi_id tuple) const;
+  inline pw_aff bind_domain_wrapped_domain(multi_id tuple) const;
   inline pw_aff ceil() const;
   inline pw_aff coalesce() const;
   inline pw_aff cond(pw_aff pwaff_true, pw_aff pwaff_false) const;
-  inline unsigned int dim(isl::dim type) const;
+  inline isl_size dim(isl::dim type) const;
   inline pw_aff div(pw_aff pa2) const;
   inline set domain() const;
   inline pw_aff drop_dims(isl::dim type, unsigned int first, unsigned int n) const;
   inline pw_aff drop_unused_params() const;
-  static inline pw_aff empty(space dim);
+  static inline pw_aff empty(space space);
   inline map eq_map(pw_aff pa2) const;
   inline set eq_set(pw_aff pwaff2) const;
   inline val eval(point pnt) const;
@@ -1974,6 +2134,7 @@
   inline pw_aff floor() const;
   inline stat foreach_piece(const std::function<stat(set, aff)> &fn) const;
   inline pw_aff from_range() const;
+  inline map ge_map(pw_aff pa2) const;
   inline set ge_set(pw_aff pwaff2) const;
   inline id get_dim_id(isl::dim type, unsigned int pos) const;
   inline std::string get_dim_name(isl::dim type, unsigned int pos) const;
@@ -1988,13 +2149,19 @@
   inline boolean has_dim_id(isl::dim type, unsigned int pos) const;
   inline boolean has_tuple_id(isl::dim type) const;
   inline pw_aff insert_dims(isl::dim type, unsigned int first, unsigned int n) const;
+  inline pw_aff insert_domain(space domain) const;
   inline pw_aff intersect_domain(set set) const;
+  inline pw_aff intersect_domain_wrapped_domain(set set) const;
+  inline pw_aff intersect_domain_wrapped_range(set set) const;
   inline pw_aff intersect_params(set set) const;
   inline boolean involves_dims(isl::dim type, unsigned int first, unsigned int n) const;
   inline boolean involves_nan() const;
+  inline boolean involves_param_id(const id &id) const;
   inline boolean is_cst() const;
   inline boolean is_empty() const;
   inline boolean is_equal(const pw_aff &pa2) const;
+  inline boolean isa_aff() const;
+  inline map le_map(pw_aff pa2) const;
   inline set le_set(pw_aff pwaff2) const;
   inline map lt_map(pw_aff pa2) const;
   inline set lt_set(pw_aff pwaff2) const;
@@ -2003,20 +2170,22 @@
   inline pw_aff mod(val mod) const;
   inline pw_aff move_dims(isl::dim dst_type, unsigned int dst_pos, isl::dim src_type, unsigned int src_pos, unsigned int n) const;
   inline pw_aff mul(pw_aff pwaff2) const;
-  inline int n_piece() const;
+  inline isl_size n_piece() const;
   static inline pw_aff nan_on_domain(local_space ls);
+  static inline pw_aff nan_on_domain_space(space space);
   inline set ne_set(pw_aff pwaff2) const;
   inline pw_aff neg() const;
   inline set non_zero_set() const;
   inline set nonneg_set() const;
+  static inline pw_aff param_on_domain(set domain, id id);
   inline set params() const;
   inline int plain_cmp(const pw_aff &pa2) const;
   inline boolean plain_is_equal(const pw_aff &pwaff2) const;
   inline set pos_set() const;
   inline pw_aff project_domain_on_params() const;
   inline pw_aff pullback(multi_aff ma) const;
-  inline pw_aff pullback(pw_multi_aff pma) const;
   inline pw_aff pullback(multi_pw_aff mpa) const;
+  inline pw_aff pullback(pw_multi_aff pma) const;
   inline pw_aff reset_tuple_id(isl::dim type) const;
   inline pw_aff reset_user() const;
   inline pw_aff scale(val v) const;
@@ -2059,10 +2228,12 @@
   inline bool is_null() const;
   inline explicit operator bool() const;
   inline ctx get_ctx() const;
+  inline std::string to_str() const;
   inline void dump() const;
 
   inline pw_aff_list add(pw_aff el) const;
   static inline pw_aff_list alloc(ctx ctx, int n);
+  inline pw_aff_list clear() const;
   inline pw_aff_list concat(pw_aff_list list2) const;
   inline pw_aff_list drop(unsigned int first, unsigned int n) const;
   inline set eq_set(pw_aff_list list2) const;
@@ -2077,11 +2248,11 @@
   inline set lt_set(pw_aff_list list2) const;
   inline pw_aff max() const;
   inline pw_aff min() const;
-  inline int n_pw_aff() const;
+  inline isl_size n_pw_aff() const;
   inline set ne_set(pw_aff_list list2) const;
   inline pw_aff_list reverse() const;
   inline pw_aff_list set_pw_aff(int index, pw_aff el) const;
-  inline int size() const;
+  inline isl_size size() const;
   inline pw_aff_list swap(unsigned int pos1, unsigned int pos2) const;
 };
 
@@ -2117,11 +2288,17 @@
   inline void dump() const;
 
   inline pw_multi_aff add(pw_multi_aff pma2) const;
+  inline pw_multi_aff add_constant(multi_val mv) const;
+  inline pw_multi_aff add_constant(val v) const;
   inline pw_multi_aff align_params(space model) const;
   static inline pw_multi_aff alloc(set set, multi_aff maff);
+  inline multi_aff as_multi_aff() const;
+  inline pw_multi_aff bind_domain(multi_id tuple) const;
+  inline pw_multi_aff bind_domain_wrapped_domain(multi_id tuple) const;
   inline pw_multi_aff coalesce() const;
-  inline unsigned int dim(isl::dim type) const;
+  inline isl_size dim(isl::dim type) const;
   inline set domain() const;
+  static inline pw_multi_aff domain_map(space space);
   inline pw_multi_aff drop_dims(isl::dim type, unsigned int first, unsigned int n) const;
   inline pw_multi_aff drop_unused_params() const;
   static inline pw_multi_aff empty(space space);
@@ -2145,27 +2322,39 @@
   inline boolean has_tuple_id(isl::dim type) const;
   inline boolean has_tuple_name(isl::dim type) const;
   static inline pw_multi_aff identity(space space);
+  static inline pw_multi_aff identity_on_domain(space space);
+  inline pw_multi_aff insert_domain(space domain) const;
   inline pw_multi_aff intersect_domain(set set) const;
+  inline pw_multi_aff intersect_domain_wrapped_domain(set set) const;
+  inline pw_multi_aff intersect_domain_wrapped_range(set set) const;
   inline pw_multi_aff intersect_params(set set) const;
   inline boolean involves_dims(isl::dim type, unsigned int first, unsigned int n) const;
+  inline boolean involves_locals() const;
   inline boolean involves_nan() const;
+  inline boolean involves_param_id(const id &id) const;
   inline boolean is_equal(const pw_multi_aff &pma2) const;
+  inline boolean isa_multi_aff() const;
+  inline multi_val max_multi_val() const;
+  inline multi_val min_multi_val() const;
   static inline pw_multi_aff multi_val_on_domain(set domain, multi_val mv);
-  inline int n_piece() const;
+  inline isl_size n_piece() const;
   inline pw_multi_aff neg() const;
   inline boolean plain_is_equal(const pw_multi_aff &pma2) const;
+  inline pw_multi_aff preimage_domain_wrapped_domain(pw_multi_aff pma2) const;
   inline pw_multi_aff product(pw_multi_aff pma2) const;
   inline pw_multi_aff project_domain_on_params() const;
   static inline pw_multi_aff project_out_map(space space, isl::dim type, unsigned int first, unsigned int n);
   inline pw_multi_aff pullback(multi_aff ma) const;
   inline pw_multi_aff pullback(pw_multi_aff pma2) const;
+  inline pw_multi_aff range_factor_domain() const;
+  inline pw_multi_aff range_factor_range() const;
   static inline pw_multi_aff range_map(space space);
   inline pw_multi_aff range_product(pw_multi_aff pma2) const;
   inline pw_multi_aff reset_tuple_id(isl::dim type) const;
   inline pw_multi_aff reset_user() const;
-  inline pw_multi_aff scale_down_val(val v) const;
+  inline pw_multi_aff scale(val v) const;
+  inline pw_multi_aff scale_down(val v) const;
   inline pw_multi_aff scale_multi_val(multi_val mv) const;
-  inline pw_multi_aff scale_val(val v) const;
   inline pw_multi_aff set_dim_id(isl::dim type, unsigned int pos, id id) const;
   inline pw_multi_aff set_pw_aff(unsigned int pos, pw_aff pa) const;
   inline pw_multi_aff set_tuple_id(isl::dim type, id id) const;
@@ -2202,10 +2391,12 @@
   inline bool is_null() const;
   inline explicit operator bool() const;
   inline ctx get_ctx() const;
+  inline std::string to_str() const;
   inline void dump() const;
 
   inline pw_multi_aff_list add(pw_multi_aff el) const;
   static inline pw_multi_aff_list alloc(ctx ctx, int n);
+  inline pw_multi_aff_list clear() const;
   inline pw_multi_aff_list concat(pw_multi_aff_list list2) const;
   inline pw_multi_aff_list drop(unsigned int first, unsigned int n) const;
   inline stat foreach(const std::function<stat(pw_multi_aff)> &fn) const;
@@ -2213,10 +2404,10 @@
   inline pw_multi_aff get_at(int index) const;
   inline pw_multi_aff get_pw_multi_aff(int index) const;
   inline pw_multi_aff_list insert(unsigned int pos, pw_multi_aff el) const;
-  inline int n_pw_multi_aff() const;
+  inline isl_size n_pw_multi_aff() const;
   inline pw_multi_aff_list reverse() const;
   inline pw_multi_aff_list set_pw_multi_aff(int index, pw_multi_aff el) const;
-  inline int size() const;
+  inline isl_size size() const;
   inline pw_multi_aff_list swap(unsigned int pos1, unsigned int pos2) const;
 };
 
@@ -2252,8 +2443,9 @@
   inline pw_qpolynomial add(pw_qpolynomial pwqp2) const;
   inline pw_qpolynomial add_dims(isl::dim type, unsigned int n) const;
   static inline pw_qpolynomial alloc(set set, qpolynomial qp);
+  inline qpolynomial as_qpolynomial() const;
   inline pw_qpolynomial coalesce() const;
-  inline unsigned int dim(isl::dim type) const;
+  inline isl_size dim(isl::dim type) const;
   inline set domain() const;
   inline pw_qpolynomial drop_dims(isl::dim type, unsigned int first, unsigned int n) const;
   inline pw_qpolynomial drop_unused_params() const;
@@ -2271,20 +2463,24 @@
   inline boolean has_equal_space(const pw_qpolynomial &pwqp2) const;
   inline pw_qpolynomial insert_dims(isl::dim type, unsigned int first, unsigned int n) const;
   inline pw_qpolynomial intersect_domain(set set) const;
+  inline pw_qpolynomial intersect_domain_wrapped_domain(set set) const;
+  inline pw_qpolynomial intersect_domain_wrapped_range(set set) const;
   inline pw_qpolynomial intersect_params(set set) const;
   inline boolean involves_dims(isl::dim type, unsigned int first, unsigned int n) const;
   inline boolean involves_nan() const;
+  inline boolean involves_param_id(const id &id) const;
   inline boolean is_zero() const;
+  inline boolean isa_qpolynomial() const;
   inline val max() const;
   inline val min() const;
   inline pw_qpolynomial move_dims(isl::dim dst_type, unsigned int dst_pos, isl::dim src_type, unsigned int src_pos, unsigned int n) const;
   inline pw_qpolynomial mul(pw_qpolynomial pwqp2) const;
-  inline int n_piece() const;
+  inline isl_size n_piece() const;
   inline pw_qpolynomial neg() const;
   inline boolean plain_is_equal(const pw_qpolynomial &pwqp2) const;
   inline pw_qpolynomial pow(unsigned int exponent) const;
   inline pw_qpolynomial project_domain_on_params() const;
-  inline pw_qpolynomial reset_domain_space(space dim) const;
+  inline pw_qpolynomial reset_domain_space(space space) const;
   inline pw_qpolynomial reset_user() const;
   inline pw_qpolynomial scale_down_val(val v) const;
   inline pw_qpolynomial scale_val(val v) const;
@@ -2293,7 +2489,7 @@
   inline pw_qpolynomial sub(pw_qpolynomial pwqp2) const;
   inline pw_qpolynomial subtract_domain(set set) const;
   inline pw_qpolynomial to_polynomial(int sign) const;
-  static inline pw_qpolynomial zero(space dim);
+  static inline pw_qpolynomial zero(space space);
 };
 
 // declarations for isl::pw_qpolynomial_fold_list
@@ -2321,6 +2517,7 @@
   inline bool is_null() const;
   inline explicit operator bool() const;
   inline ctx get_ctx() const;
+  inline std::string to_str() const;
   inline void dump() const;
 
 };
@@ -2350,10 +2547,12 @@
   inline bool is_null() const;
   inline explicit operator bool() const;
   inline ctx get_ctx() const;
+  inline std::string to_str() const;
   inline void dump() const;
 
   inline pw_qpolynomial_list add(pw_qpolynomial el) const;
   static inline pw_qpolynomial_list alloc(ctx ctx, int n);
+  inline pw_qpolynomial_list clear() const;
   inline pw_qpolynomial_list concat(pw_qpolynomial_list list2) const;
   inline pw_qpolynomial_list drop(unsigned int first, unsigned int n) const;
   inline stat foreach(const std::function<stat(pw_qpolynomial)> &fn) const;
@@ -2361,10 +2560,10 @@
   inline pw_qpolynomial get_at(int index) const;
   inline pw_qpolynomial get_pw_qpolynomial(int index) const;
   inline pw_qpolynomial_list insert(unsigned int pos, pw_qpolynomial el) const;
-  inline int n_pw_qpolynomial() const;
+  inline isl_size n_pw_qpolynomial() const;
   inline pw_qpolynomial_list reverse() const;
   inline pw_qpolynomial_list set_pw_qpolynomial(int index, pw_qpolynomial el) const;
-  inline int size() const;
+  inline isl_size size() const;
   inline pw_qpolynomial_list swap(unsigned int pos1, unsigned int pos2) const;
 };
 
@@ -2399,7 +2598,7 @@
   inline qpolynomial add_dims(isl::dim type, unsigned int n) const;
   inline qpolynomial align_params(space model) const;
   inline stat as_polynomial_on_domain(const basic_set &bset, const std::function<stat(basic_set, qpolynomial)> &fn) const;
-  inline unsigned int dim(isl::dim type) const;
+  inline isl_size dim(isl::dim type) const;
   inline qpolynomial drop_dims(isl::dim type, unsigned int first, unsigned int n) const;
   inline val eval(point pnt) const;
   inline stat foreach_term(const std::function<stat(term)> &fn) const;
@@ -2412,7 +2611,7 @@
   inline qpolynomial gist(set context) const;
   inline qpolynomial gist_params(set context) const;
   inline qpolynomial homogenize() const;
-  static inline qpolynomial infty_on_domain(space dim);
+  static inline qpolynomial infty_on_domain(space domain);
   inline qpolynomial insert_dims(isl::dim type, unsigned int first, unsigned int n) const;
   inline boolean involves_dims(isl::dim type, unsigned int first, unsigned int n) const;
   inline boolean is_infty() const;
@@ -2421,10 +2620,10 @@
   inline boolean is_zero() const;
   inline qpolynomial move_dims(isl::dim dst_type, unsigned int dst_pos, isl::dim src_type, unsigned int src_pos, unsigned int n) const;
   inline qpolynomial mul(qpolynomial qp2) const;
-  static inline qpolynomial nan_on_domain(space dim);
+  static inline qpolynomial nan_on_domain(space domain);
   inline qpolynomial neg() const;
-  static inline qpolynomial neginfty_on_domain(space dim);
-  static inline qpolynomial one_on_domain(space dim);
+  static inline qpolynomial neginfty_on_domain(space domain);
+  static inline qpolynomial one_on_domain(space domain);
   inline boolean plain_is_equal(const qpolynomial &qp2) const;
   inline qpolynomial pow(unsigned int power) const;
   inline qpolynomial project_domain_on_params() const;
@@ -2433,8 +2632,53 @@
   inline int sgn() const;
   inline qpolynomial sub(qpolynomial qp2) const;
   static inline qpolynomial val_on_domain(space space, val val);
-  static inline qpolynomial var_on_domain(space dim, isl::dim type, unsigned int pos);
-  static inline qpolynomial zero_on_domain(space dim);
+  static inline qpolynomial var_on_domain(space domain, isl::dim type, unsigned int pos);
+  static inline qpolynomial zero_on_domain(space domain);
+};
+
+// declarations for isl::qpolynomial_list
+inline qpolynomial_list manage(__isl_take isl_qpolynomial_list *ptr);
+inline qpolynomial_list manage_copy(__isl_keep isl_qpolynomial_list *ptr);
+
+class qpolynomial_list {
+  friend inline qpolynomial_list manage(__isl_take isl_qpolynomial_list *ptr);
+  friend inline qpolynomial_list manage_copy(__isl_keep isl_qpolynomial_list *ptr);
+
+  isl_qpolynomial_list *ptr = nullptr;
+
+  inline explicit qpolynomial_list(__isl_take isl_qpolynomial_list *ptr);
+
+public:
+  inline /* implicit */ qpolynomial_list();
+  inline /* implicit */ qpolynomial_list(const qpolynomial_list &obj);
+  inline /* implicit */ qpolynomial_list(std::nullptr_t);
+  inline qpolynomial_list &operator=(qpolynomial_list obj);
+  inline ~qpolynomial_list();
+  inline __isl_give isl_qpolynomial_list *copy() const &;
+  inline __isl_give isl_qpolynomial_list *copy() && = delete;
+  inline __isl_keep isl_qpolynomial_list *get() const;
+  inline __isl_give isl_qpolynomial_list *release();
+  inline bool is_null() const;
+  inline explicit operator bool() const;
+  inline ctx get_ctx() const;
+  inline std::string to_str() const;
+  inline void dump() const;
+
+  inline qpolynomial_list add(qpolynomial el) const;
+  static inline qpolynomial_list alloc(ctx ctx, int n);
+  inline qpolynomial_list clear() const;
+  inline qpolynomial_list concat(qpolynomial_list list2) const;
+  inline qpolynomial_list drop(unsigned int first, unsigned int n) const;
+  inline stat foreach(const std::function<stat(qpolynomial)> &fn) const;
+  static inline qpolynomial_list from_qpolynomial(qpolynomial el);
+  inline qpolynomial get_at(int index) const;
+  inline qpolynomial get_qpolynomial(int index) const;
+  inline qpolynomial_list insert(unsigned int pos, qpolynomial el) const;
+  inline isl_size n_qpolynomial() const;
+  inline qpolynomial_list reverse() const;
+  inline qpolynomial_list set_qpolynomial(int index, qpolynomial el) const;
+  inline isl_size size() const;
+  inline qpolynomial_list swap(unsigned int pos1, unsigned int pos2) const;
 };
 
 // declarations for isl::schedule
@@ -2574,21 +2818,21 @@
   inline stat foreach_ancestor_top_down(const std::function<stat(schedule_node)> &fn) const;
   static inline schedule_node from_domain(union_set domain);
   static inline schedule_node from_extension(union_map extension);
-  inline int get_ancestor_child_position(const schedule_node &ancestor) const;
+  inline isl_size get_ancestor_child_position(const schedule_node &ancestor) const;
   inline schedule_node get_child(int pos) const;
-  inline int get_child_position() const;
+  inline isl_size get_child_position() const;
   inline union_set get_domain() const;
   inline multi_union_pw_aff get_prefix_schedule_multi_union_pw_aff() const;
   inline union_map get_prefix_schedule_relation() const;
   inline union_map get_prefix_schedule_union_map() const;
   inline union_pw_multi_aff get_prefix_schedule_union_pw_multi_aff() const;
   inline schedule get_schedule() const;
-  inline int get_schedule_depth() const;
+  inline isl_size get_schedule_depth() const;
   inline schedule_node get_shared_ancestor(const schedule_node &node2) const;
   inline union_pw_multi_aff get_subtree_contraction() const;
   inline union_map get_subtree_expansion() const;
   inline union_map get_subtree_schedule_union_map() const;
-  inline int get_tree_depth() const;
+  inline isl_size get_tree_depth() const;
   inline union_set get_universe_domain() const;
   inline schedule_node graft_after(schedule_node graft) const;
   inline schedule_node graft_before(schedule_node graft) const;
@@ -2608,7 +2852,7 @@
   inline boolean is_equal(const schedule_node &node2) const;
   inline boolean is_subtree_anchored() const;
   inline id mark_get_id() const;
-  inline int n_children() const;
+  inline isl_size n_children() const;
   inline schedule_node next_sibling() const;
   inline schedule_node order_after(union_set filter) const;
   inline schedule_node order_before(union_set filter) const;
@@ -2635,10 +2879,10 @@
   inline /* implicit */ set();
   inline /* implicit */ set(const set &obj);
   inline /* implicit */ set(std::nullptr_t);
-  inline explicit set(ctx ctx, const std::string &str);
   inline /* implicit */ set(basic_set bset);
   inline /* implicit */ set(point pnt);
   inline explicit set(union_set uset);
+  inline explicit set(ctx ctx, const std::string &str);
   inline set &operator=(set obj);
   inline ~set();
   inline __isl_give isl_set *copy() const &;
@@ -2656,6 +2900,7 @@
   inline basic_set affine_hull() const;
   inline set align_params(space model) const;
   inline set apply(map map) const;
+  inline set bind(multi_id tuple) const;
   inline basic_set bounded_simple_hull() const;
   static inline set box_from_points(point pnt1, point pnt2);
   inline set coalesce() const;
@@ -2664,14 +2909,16 @@
   inline basic_set convex_hull() const;
   inline val count_val() const;
   inline set detect_equalities() const;
-  inline unsigned int dim(isl::dim type) const;
+  inline isl_size dim(isl::dim type) const;
   inline boolean dim_has_any_lower_bound(isl::dim type, unsigned int pos) const;
   inline boolean dim_has_any_upper_bound(isl::dim type, unsigned int pos) const;
   inline boolean dim_has_lower_bound(isl::dim type, unsigned int pos) const;
   inline boolean dim_has_upper_bound(isl::dim type, unsigned int pos) const;
   inline boolean dim_is_bounded(isl::dim type, unsigned int pos) const;
   inline pw_aff dim_max(int pos) const;
+  inline val dim_max_val(int pos) const;
   inline pw_aff dim_min(int pos) const;
+  inline val dim_min_val(int pos) const;
   inline set drop_constraints_involving_dims(isl::dim type, unsigned int first, unsigned int n) const;
   inline set drop_constraints_not_involving_dims(isl::dim type, unsigned int first, unsigned int n) const;
   inline set drop_unused_params() const;
@@ -2696,6 +2943,8 @@
   inline basic_set_list get_basic_set_list() const;
   inline id get_dim_id(isl::dim type, unsigned int pos) const;
   inline std::string get_dim_name(isl::dim type, unsigned int pos) const;
+  inline multi_val get_plain_multi_val_if_fixed() const;
+  inline fixed_box get_simple_fixed_box_hull() const;
   inline space get_space() const;
   inline val get_stride(int pos) const;
   inline id get_tuple_id() const;
@@ -2711,9 +2960,13 @@
   inline map identity() const;
   inline pw_aff indicator_function() const;
   inline set insert_dims(isl::dim type, unsigned int pos, unsigned int n) const;
+  inline map insert_domain(space domain) const;
   inline set intersect(set set2) const;
+  inline set intersect_factor_domain(set domain) const;
+  inline set intersect_factor_range(set range) const;
   inline set intersect_params(set params) const;
   inline boolean involves_dims(isl::dim type, unsigned int first, unsigned int n) const;
+  inline boolean involves_locals() const;
   inline boolean is_bounded() const;
   inline boolean is_box() const;
   inline boolean is_disjoint(const set &set2) const;
@@ -2732,14 +2985,18 @@
   inline pw_multi_aff lexmax_pw_multi_aff() const;
   inline set lexmin() const;
   inline pw_multi_aff lexmin_pw_multi_aff() const;
+  inline set lower_bound(multi_pw_aff lower) const;
+  inline set lower_bound(multi_val lower) const;
   inline set lower_bound_si(isl::dim type, unsigned int pos, int value) const;
   inline set lower_bound_val(isl::dim type, unsigned int pos, val value) const;
+  inline multi_pw_aff max_multi_pw_aff() const;
   inline val max_val(const aff &obj) const;
+  inline multi_pw_aff min_multi_pw_aff() const;
   inline val min_val(const aff &obj) const;
   inline set move_dims(isl::dim dst_type, unsigned int dst_pos, isl::dim src_type, unsigned int src_pos, unsigned int n) const;
-  inline int n_basic_set() const;
-  inline unsigned int n_dim() const;
-  static inline set nat_universe(space dim);
+  inline isl_size n_basic_set() const;
+  inline isl_size n_dim() const;
+  static inline set nat_universe(space space);
   inline set neg() const;
   inline set params() const;
   inline int plain_cmp(const set &set2) const;
@@ -2750,18 +3007,21 @@
   inline boolean plain_is_universe() const;
   inline basic_set plain_unshifted_simple_hull() const;
   inline basic_set polyhedral_hull() const;
-  inline set preimage_multi_aff(multi_aff ma) const;
-  inline set preimage_multi_pw_aff(multi_pw_aff mpa) const;
-  inline set preimage_pw_multi_aff(pw_multi_aff pma) const;
+  inline set preimage(multi_aff ma) const;
+  inline set preimage(multi_pw_aff mpa) const;
+  inline set preimage(pw_multi_aff pma) const;
   inline set product(set set2) const;
   inline map project_onto_map(isl::dim type, unsigned int first, unsigned int n) const;
   inline set project_out(isl::dim type, unsigned int first, unsigned int n) const;
+  inline set project_out_all_params() const;
+  inline set project_out_param(id id) const;
+  inline set project_out_param(id_list list) const;
   inline set remove_dims(isl::dim type, unsigned int first, unsigned int n) const;
   inline set remove_divs() const;
   inline set remove_divs_involving_dims(isl::dim type, unsigned int first, unsigned int n) const;
   inline set remove_redundancies() const;
   inline set remove_unknown_divs() const;
-  inline set reset_space(space dim) const;
+  inline set reset_space(space space) const;
   inline set reset_tuple_id() const;
   inline set reset_user() const;
   inline basic_set sample() const;
@@ -2775,11 +3035,16 @@
   inline set split_dims(isl::dim type, unsigned int first, unsigned int n) const;
   inline set subtract(set set2) const;
   inline set sum(set set2) const;
+  inline map translation() const;
+  inline set unbind_params(multi_id tuple) const;
+  inline map unbind_params_insert_domain(multi_id domain) const;
   inline set unite(set set2) const;
   static inline set universe(space space);
   inline basic_set unshifted_simple_hull() const;
   inline basic_set unshifted_simple_hull_from_set_list(set_list list) const;
   inline map unwrap() const;
+  inline set upper_bound(multi_pw_aff upper) const;
+  inline set upper_bound(multi_val upper) const;
   inline set upper_bound_si(isl::dim type, unsigned int pos, int value) const;
   inline set upper_bound_val(isl::dim type, unsigned int pos, val value) const;
   inline map wrapped_domain_map() const;
@@ -2810,10 +3075,12 @@
   inline bool is_null() const;
   inline explicit operator bool() const;
   inline ctx get_ctx() const;
+  inline std::string to_str() const;
   inline void dump() const;
 
   inline set_list add(set el) const;
   static inline set_list alloc(ctx ctx, int n);
+  inline set_list clear() const;
   inline set_list concat(set_list list2) const;
   inline set_list drop(unsigned int first, unsigned int n) const;
   inline stat foreach(const std::function<stat(set)> &fn) const;
@@ -2821,10 +3088,10 @@
   inline set get_at(int index) const;
   inline set get_set(int index) const;
   inline set_list insert(unsigned int pos, set el) const;
-  inline int n_set() const;
+  inline isl_size n_set() const;
   inline set_list reverse() const;
   inline set_list set_set(int index, set el) const;
-  inline int size() const;
+  inline isl_size size() const;
   inline set_list swap(unsigned int pos1, unsigned int pos2) const;
   inline set unite() const;
 };
@@ -2860,20 +3127,23 @@
   inline void dump() const;
 
   inline space add_dims(isl::dim type, unsigned int n) const;
+  inline space add_named_tuple(id tuple_id, unsigned int dim) const;
   inline space add_param_id(id id) const;
-  inline space align_params(space dim2) const;
+  inline space add_unnamed_tuple(unsigned int dim) const;
+  inline space align_params(space space2) const;
   inline boolean can_curry() const;
   inline boolean can_range_curry() const;
   inline boolean can_uncurry() const;
   inline boolean can_zip() const;
   inline space curry() const;
-  inline unsigned int dim(isl::dim type) const;
+  inline isl_size dim(isl::dim type) const;
   inline space domain() const;
   inline space domain_factor_domain() const;
   inline space domain_factor_range() const;
   inline boolean domain_is_wrapping() const;
   inline space domain_map() const;
   inline space domain_product(space right) const;
+  inline space drop_all_params() const;
   inline space drop_dims(isl::dim type, unsigned int first, unsigned int num) const;
   inline space factor_domain() const;
   inline space factor_range() const;
@@ -2916,6 +3186,7 @@
   inline boolean range_is_wrapping() const;
   inline space range_map() const;
   inline space range_product(space right) const;
+  inline space range_reverse() const;
   inline space reset_tuple_id(isl::dim type) const;
   inline space reset_user() const;
   inline space reverse() const;
@@ -2925,6 +3196,7 @@
   inline space set_tuple_name(isl::dim type, const std::string &s) const;
   inline boolean tuple_is_equal(isl::dim type1, const space &space2, isl::dim type2) const;
   inline space uncurry() const;
+  static inline space unit(ctx ctx);
   inline space unwrap() const;
   inline space wrap() const;
   inline space zip() const;
@@ -2956,10 +3228,10 @@
   inline explicit operator bool() const;
   inline ctx get_ctx() const;
 
-  inline unsigned int dim(isl::dim type) const;
+  inline isl_size dim(isl::dim type) const;
   inline val get_coefficient_val() const;
   inline aff get_div(unsigned int pos) const;
-  inline int get_exp(isl::dim type, unsigned int pos) const;
+  inline isl_size get_exp(isl::dim type, unsigned int pos) const;
 };
 
 // declarations for isl::union_access_info
@@ -3049,9 +3321,9 @@
   inline /* implicit */ union_map();
   inline /* implicit */ union_map(const union_map &obj);
   inline /* implicit */ union_map(std::nullptr_t);
-  inline explicit union_map(union_pw_multi_aff upma);
   inline /* implicit */ union_map(basic_map bmap);
   inline /* implicit */ union_map(map map);
+  inline explicit union_map(union_pw_multi_aff upma);
   inline explicit union_map(ctx ctx, const std::string &str);
   inline union_map &operator=(union_map obj);
   inline ~union_map();
@@ -3070,13 +3342,14 @@
   inline union_map align_params(space model) const;
   inline union_map apply_domain(union_map umap2) const;
   inline union_map apply_range(union_map umap2) const;
+  inline union_set bind_range(multi_id tuple) const;
   inline union_map coalesce() const;
   inline boolean contains(const space &space) const;
   inline union_map curry() const;
   inline union_set deltas() const;
   inline union_map deltas_map() const;
   inline union_map detect_equalities() const;
-  inline unsigned int dim(isl::dim type) const;
+  inline isl_size dim(isl::dim type) const;
   inline union_set domain() const;
   inline union_map domain_factor_domain() const;
   inline union_map domain_factor_range() const;
@@ -3084,8 +3357,10 @@
   inline union_pw_multi_aff domain_map_union_pw_multi_aff() const;
   inline union_map domain_product(union_map umap2) const;
   static inline union_map empty(space space);
+  static inline union_map empty(ctx ctx);
+  static inline union_map empty_space(space space);
   inline union_map eq_at(multi_union_pw_aff mupa) const;
-  inline map extract_map(space dim) const;
+  inline map extract_map(space space) const;
   inline union_map factor_domain() const;
   inline union_map factor_range() const;
   inline int find_dim_by_name(isl::dim type, const std::string &name) const;
@@ -3107,9 +3382,14 @@
   inline union_map gist_params(set set) const;
   inline union_map gist_range(union_set uset) const;
   inline union_map intersect(union_map umap2) const;
+  inline union_map intersect_domain(space space) const;
   inline union_map intersect_domain(union_set uset) const;
+  inline union_map intersect_domain_factor_domain(union_map factor) const;
+  inline union_map intersect_domain_factor_range(union_map factor) const;
   inline union_map intersect_params(set set) const;
+  inline union_map intersect_range(space space) const;
   inline union_map intersect_range(union_set uset) const;
+  inline union_map intersect_range_factor_domain(union_map factor) const;
   inline union_map intersect_range_factor_range(union_map factor) const;
   inline boolean involves_dims(isl::dim type, unsigned int first, unsigned int n) const;
   inline boolean is_bijective() const;
@@ -3121,26 +3401,29 @@
   inline boolean is_single_valued() const;
   inline boolean is_strict_subset(const union_map &umap2) const;
   inline boolean is_subset(const union_map &umap2) const;
+  inline boolean isa_map() const;
+  inline union_map lex_ge_at_multi_union_pw_aff(multi_union_pw_aff mupa) const;
   inline union_map lex_ge_union_map(union_map umap2) const;
   inline union_map lex_gt_at_multi_union_pw_aff(multi_union_pw_aff mupa) const;
   inline union_map lex_gt_union_map(union_map umap2) const;
+  inline union_map lex_le_at_multi_union_pw_aff(multi_union_pw_aff mupa) const;
   inline union_map lex_le_union_map(union_map umap2) const;
   inline union_map lex_lt_at_multi_union_pw_aff(multi_union_pw_aff mupa) const;
   inline union_map lex_lt_union_map(union_map umap2) const;
   inline union_map lexmax() const;
   inline union_map lexmin() const;
-  inline int n_map() const;
+  inline isl_size n_map() const;
   inline set params() const;
   inline boolean plain_is_empty() const;
   inline boolean plain_is_injective() const;
   inline union_map polyhedral_hull() const;
-  inline union_map preimage_domain_multi_aff(multi_aff ma) const;
-  inline union_map preimage_domain_multi_pw_aff(multi_pw_aff mpa) const;
-  inline union_map preimage_domain_pw_multi_aff(pw_multi_aff pma) const;
-  inline union_map preimage_domain_union_pw_multi_aff(union_pw_multi_aff upma) const;
-  inline union_map preimage_range_multi_aff(multi_aff ma) const;
-  inline union_map preimage_range_pw_multi_aff(pw_multi_aff pma) const;
-  inline union_map preimage_range_union_pw_multi_aff(union_pw_multi_aff upma) const;
+  inline union_map preimage_domain(multi_aff ma) const;
+  inline union_map preimage_domain(multi_pw_aff mpa) const;
+  inline union_map preimage_domain(pw_multi_aff pma) const;
+  inline union_map preimage_domain(union_pw_multi_aff upma) const;
+  inline union_map preimage_range(multi_aff ma) const;
+  inline union_map preimage_range(pw_multi_aff pma) const;
+  inline union_map preimage_range(union_pw_multi_aff upma) const;
   inline union_map product(union_map umap2) const;
   inline union_map project_out(isl::dim type, unsigned int first, unsigned int n) const;
   inline union_map project_out_all_params() const;
@@ -3150,6 +3433,7 @@
   inline union_map range_factor_range() const;
   inline union_map range_map() const;
   inline union_map range_product(union_map umap2) const;
+  inline union_map range_reverse() const;
   inline union_map remove_divs() const;
   inline union_map remove_redundancies() const;
   inline union_map reset_user() const;
@@ -3191,10 +3475,12 @@
   inline bool is_null() const;
   inline explicit operator bool() const;
   inline ctx get_ctx() const;
+  inline std::string to_str() const;
   inline void dump() const;
 
   inline union_map_list add(union_map el) const;
   static inline union_map_list alloc(ctx ctx, int n);
+  inline union_map_list clear() const;
   inline union_map_list concat(union_map_list list2) const;
   inline union_map_list drop(unsigned int first, unsigned int n) const;
   inline stat foreach(const std::function<stat(union_map)> &fn) const;
@@ -3202,10 +3488,10 @@
   inline union_map get_at(int index) const;
   inline union_map get_union_map(int index) const;
   inline union_map_list insert(unsigned int pos, union_map el) const;
-  inline int n_union_map() const;
+  inline isl_size n_union_map() const;
   inline union_map_list reverse() const;
   inline union_map_list set_union_map(int index, union_map el) const;
-  inline int size() const;
+  inline isl_size size() const;
   inline union_map_list swap(unsigned int pos1, unsigned int pos2) const;
 };
 
@@ -3225,9 +3511,10 @@
   inline /* implicit */ union_pw_aff();
   inline /* implicit */ union_pw_aff(const union_pw_aff &obj);
   inline /* implicit */ union_pw_aff(std::nullptr_t);
+  inline /* implicit */ union_pw_aff(aff aff);
   inline /* implicit */ union_pw_aff(pw_aff pa);
-  inline explicit union_pw_aff(union_set domain, val v);
   inline explicit union_pw_aff(ctx ctx, const std::string &str);
+  inline explicit union_pw_aff(union_set domain, val v);
   inline union_pw_aff &operator=(union_pw_aff obj);
   inline ~union_pw_aff();
   inline __isl_give isl_union_pw_aff *copy() const &;
@@ -3244,11 +3531,14 @@
   inline union_pw_aff add_pw_aff(pw_aff pa) const;
   static inline union_pw_aff aff_on_domain(union_set domain, aff aff);
   inline union_pw_aff align_params(space model) const;
+  inline union_set bind(id id) const;
   inline union_pw_aff coalesce() const;
-  inline unsigned int dim(isl::dim type) const;
+  inline isl_size dim(isl::dim type) const;
   inline union_set domain() const;
   inline union_pw_aff drop_dims(isl::dim type, unsigned int first, unsigned int n) const;
   static inline union_pw_aff empty(space space);
+  static inline union_pw_aff empty_ctx(ctx ctx);
+  static inline union_pw_aff empty_space(space space);
   inline pw_aff extract_pw_aff(space space) const;
   inline int find_dim_by_name(isl::dim type, const std::string &name) const;
   inline union_pw_aff floor() const;
@@ -3257,13 +3547,16 @@
   inline space get_space() const;
   inline union_pw_aff gist(union_set context) const;
   inline union_pw_aff gist_params(set context) const;
+  inline union_pw_aff intersect_domain(space space) const;
   inline union_pw_aff intersect_domain(union_set uset) const;
+  inline union_pw_aff intersect_domain_wrapped_domain(union_set uset) const;
+  inline union_pw_aff intersect_domain_wrapped_range(union_set uset) const;
   inline union_pw_aff intersect_params(set set) const;
   inline boolean involves_nan() const;
   inline val max_val() const;
   inline val min_val() const;
   inline union_pw_aff mod_val(val f) const;
-  inline int n_pw_aff() const;
+  inline isl_size n_pw_aff() const;
   inline union_pw_aff neg() const;
   static inline union_pw_aff param_on_domain_id(union_set domain, id id);
   inline boolean plain_is_equal(const union_pw_aff &upa2) const;
@@ -3273,6 +3566,7 @@
   inline union_pw_aff scale_down_val(val v) const;
   inline union_pw_aff scale_val(val v) const;
   inline union_pw_aff sub(union_pw_aff upa2) const;
+  inline union_pw_aff subtract_domain(space space) const;
   inline union_pw_aff subtract_domain(union_set uset) const;
   inline union_pw_aff union_add(union_pw_aff upa2) const;
   inline union_set zero_union_set() const;
@@ -3303,10 +3597,12 @@
   inline bool is_null() const;
   inline explicit operator bool() const;
   inline ctx get_ctx() const;
+  inline std::string to_str() const;
   inline void dump() const;
 
   inline union_pw_aff_list add(union_pw_aff el) const;
   static inline union_pw_aff_list alloc(ctx ctx, int n);
+  inline union_pw_aff_list clear() const;
   inline union_pw_aff_list concat(union_pw_aff_list list2) const;
   inline union_pw_aff_list drop(unsigned int first, unsigned int n) const;
   inline stat foreach(const std::function<stat(union_pw_aff)> &fn) const;
@@ -3314,10 +3610,10 @@
   inline union_pw_aff get_at(int index) const;
   inline union_pw_aff get_union_pw_aff(int index) const;
   inline union_pw_aff_list insert(unsigned int pos, union_pw_aff el) const;
-  inline int n_union_pw_aff() const;
+  inline isl_size n_union_pw_aff() const;
   inline union_pw_aff_list reverse() const;
   inline union_pw_aff_list set_union_pw_aff(int index, union_pw_aff el) const;
-  inline int size() const;
+  inline isl_size size() const;
   inline union_pw_aff_list swap(unsigned int pos1, unsigned int pos2) const;
 };
 
@@ -3338,12 +3634,13 @@
   inline /* implicit */ union_pw_multi_aff(const union_pw_multi_aff &obj);
   inline /* implicit */ union_pw_multi_aff(std::nullptr_t);
   inline /* implicit */ union_pw_multi_aff(aff aff);
-  inline /* implicit */ union_pw_multi_aff(pw_multi_aff pma);
   inline explicit union_pw_multi_aff(union_set uset);
-  inline explicit union_pw_multi_aff(union_map umap);
-  inline explicit union_pw_multi_aff(ctx ctx, const std::string &str);
-  inline /* implicit */ union_pw_multi_aff(union_pw_aff upa);
+  inline /* implicit */ union_pw_multi_aff(multi_aff ma);
   inline explicit union_pw_multi_aff(multi_union_pw_aff mupa);
+  inline /* implicit */ union_pw_multi_aff(pw_multi_aff pma);
+  inline explicit union_pw_multi_aff(union_map umap);
+  inline /* implicit */ union_pw_multi_aff(union_pw_aff upa);
+  inline explicit union_pw_multi_aff(ctx ctx, const std::string &str);
   inline union_pw_multi_aff &operator=(union_pw_multi_aff obj);
   inline ~union_pw_multi_aff();
   inline __isl_give isl_union_pw_multi_aff *copy() const &;
@@ -3359,11 +3656,15 @@
   inline union_pw_multi_aff add(union_pw_multi_aff upma2) const;
   inline union_pw_multi_aff add_pw_multi_aff(pw_multi_aff pma) const;
   inline union_pw_multi_aff align_params(space model) const;
+  inline union_pw_multi_aff apply(union_pw_multi_aff upma2) const;
+  inline pw_multi_aff as_pw_multi_aff() const;
   inline union_pw_multi_aff coalesce() const;
-  inline unsigned int dim(isl::dim type) const;
+  inline isl_size dim(isl::dim type) const;
   inline union_set domain() const;
   inline union_pw_multi_aff drop_dims(isl::dim type, unsigned int first, unsigned int n) const;
   static inline union_pw_multi_aff empty(space space);
+  static inline union_pw_multi_aff empty(ctx ctx);
+  static inline union_pw_multi_aff empty_space(space space);
   inline pw_multi_aff extract_pw_multi_aff(space space) const;
   inline int find_dim_by_name(isl::dim type, const std::string &name) const;
   inline union_pw_multi_aff flat_range_product(union_pw_multi_aff upma2) const;
@@ -3374,19 +3675,30 @@
   inline union_pw_aff get_union_pw_aff(int pos) const;
   inline union_pw_multi_aff gist(union_set context) const;
   inline union_pw_multi_aff gist_params(set context) const;
+  inline union_pw_multi_aff intersect_domain(space space) const;
   inline union_pw_multi_aff intersect_domain(union_set uset) const;
+  inline union_pw_multi_aff intersect_domain_wrapped_domain(union_set uset) const;
+  inline union_pw_multi_aff intersect_domain_wrapped_range(union_set uset) const;
   inline union_pw_multi_aff intersect_params(set set) const;
+  inline boolean involves_locals() const;
   inline boolean involves_nan() const;
+  inline boolean isa_pw_multi_aff() const;
   static inline union_pw_multi_aff multi_val_on_domain(union_set domain, multi_val mv);
-  inline int n_pw_multi_aff() const;
+  inline isl_size n_pw_multi_aff() const;
   inline union_pw_multi_aff neg() const;
+  inline boolean plain_is_empty() const;
   inline boolean plain_is_equal(const union_pw_multi_aff &upma2) const;
+  inline union_pw_multi_aff preimage_domain_wrapped_domain(union_pw_multi_aff upma2) const;
   inline union_pw_multi_aff pullback(union_pw_multi_aff upma2) const;
+  inline union_pw_multi_aff range_factor_domain() const;
+  inline union_pw_multi_aff range_factor_range() const;
+  inline union_pw_multi_aff range_product(union_pw_multi_aff upma2) const;
   inline union_pw_multi_aff reset_user() const;
   inline union_pw_multi_aff scale_down_val(val val) const;
   inline union_pw_multi_aff scale_multi_val(multi_val mv) const;
   inline union_pw_multi_aff scale_val(val val) const;
   inline union_pw_multi_aff sub(union_pw_multi_aff upma2) const;
+  inline union_pw_multi_aff subtract_domain(space space) const;
   inline union_pw_multi_aff subtract_domain(union_set uset) const;
   inline union_pw_multi_aff union_add(union_pw_multi_aff upma2) const;
 };
@@ -3416,10 +3728,12 @@
   inline bool is_null() const;
   inline explicit operator bool() const;
   inline ctx get_ctx() const;
+  inline std::string to_str() const;
   inline void dump() const;
 
   inline union_pw_multi_aff_list add(union_pw_multi_aff el) const;
   static inline union_pw_multi_aff_list alloc(ctx ctx, int n);
+  inline union_pw_multi_aff_list clear() const;
   inline union_pw_multi_aff_list concat(union_pw_multi_aff_list list2) const;
   inline union_pw_multi_aff_list drop(unsigned int first, unsigned int n) const;
   inline stat foreach(const std::function<stat(union_pw_multi_aff)> &fn) const;
@@ -3427,10 +3741,10 @@
   inline union_pw_multi_aff get_at(int index) const;
   inline union_pw_multi_aff get_union_pw_multi_aff(int index) const;
   inline union_pw_multi_aff_list insert(unsigned int pos, union_pw_multi_aff el) const;
-  inline int n_union_pw_multi_aff() const;
+  inline isl_size n_union_pw_multi_aff() const;
   inline union_pw_multi_aff_list reverse() const;
   inline union_pw_multi_aff_list set_union_pw_multi_aff(int index, union_pw_multi_aff el) const;
-  inline int size() const;
+  inline isl_size size() const;
   inline union_pw_multi_aff_list swap(unsigned int pos1, unsigned int pos2) const;
 };
 
@@ -3466,11 +3780,11 @@
   inline union_pw_qpolynomial add_pw_qpolynomial(pw_qpolynomial pwqp) const;
   inline union_pw_qpolynomial align_params(space model) const;
   inline union_pw_qpolynomial coalesce() const;
-  inline unsigned int dim(isl::dim type) const;
+  inline isl_size dim(isl::dim type) const;
   inline union_set domain() const;
   inline union_pw_qpolynomial drop_dims(isl::dim type, unsigned int first, unsigned int n) const;
   inline val eval(point pnt) const;
-  inline pw_qpolynomial extract_pw_qpolynomial(space dim) const;
+  inline pw_qpolynomial extract_pw_qpolynomial(space space) const;
   inline int find_dim_by_name(isl::dim type, const std::string &name) const;
   inline stat foreach_pw_qpolynomial(const std::function<stat(pw_qpolynomial)> &fn) const;
   static inline union_pw_qpolynomial from_pw_qpolynomial(pw_qpolynomial pwqp);
@@ -3479,10 +3793,14 @@
   inline union_pw_qpolynomial gist(union_set context) const;
   inline union_pw_qpolynomial gist_params(set context) const;
   inline union_pw_qpolynomial intersect_domain(union_set uset) const;
+  inline union_pw_qpolynomial intersect_domain_space(space space) const;
+  inline union_pw_qpolynomial intersect_domain_union_set(union_set uset) const;
+  inline union_pw_qpolynomial intersect_domain_wrapped_domain(union_set uset) const;
+  inline union_pw_qpolynomial intersect_domain_wrapped_range(union_set uset) const;
   inline union_pw_qpolynomial intersect_params(set set) const;
   inline boolean involves_nan() const;
   inline union_pw_qpolynomial mul(union_pw_qpolynomial upwqp2) const;
-  inline int n_pw_qpolynomial() const;
+  inline isl_size n_pw_qpolynomial() const;
   inline union_pw_qpolynomial neg() const;
   inline boolean plain_is_equal(const union_pw_qpolynomial &upwqp2) const;
   inline union_pw_qpolynomial reset_user() const;
@@ -3490,8 +3808,12 @@
   inline union_pw_qpolynomial scale_val(val v) const;
   inline union_pw_qpolynomial sub(union_pw_qpolynomial upwqp2) const;
   inline union_pw_qpolynomial subtract_domain(union_set uset) const;
+  inline union_pw_qpolynomial subtract_domain_space(space space) const;
+  inline union_pw_qpolynomial subtract_domain_union_set(union_set uset) const;
   inline union_pw_qpolynomial to_polynomial(int sign) const;
-  static inline union_pw_qpolynomial zero(space dim);
+  static inline union_pw_qpolynomial zero(space space);
+  static inline union_pw_qpolynomial zero_ctx(ctx ctx);
+  static inline union_pw_qpolynomial zero_space(space space);
 };
 
 // declarations for isl::union_set
@@ -3511,8 +3833,8 @@
   inline /* implicit */ union_set(const union_set &obj);
   inline /* implicit */ union_set(std::nullptr_t);
   inline /* implicit */ union_set(basic_set bset);
-  inline /* implicit */ union_set(set set);
   inline /* implicit */ union_set(point pnt);
+  inline /* implicit */ union_set(set set);
   inline explicit union_set(ctx ctx, const std::string &str);
   inline union_set &operator=(union_set obj);
   inline ~union_set();
@@ -3535,9 +3857,11 @@
   inline schedule compute_schedule(union_map validity, union_map proximity) const;
   inline boolean contains(const space &space) const;
   inline union_set detect_equalities() const;
-  inline unsigned int dim(isl::dim type) const;
+  inline isl_size dim(isl::dim type) const;
   static inline union_set empty(space space);
-  inline set extract_set(space dim) const;
+  static inline union_set empty(ctx ctx);
+  static inline union_set empty_space(space space);
+  inline set extract_set(space space) const;
   inline stat foreach_point(const std::function<stat(point)> &fn) const;
   inline stat foreach_set(const std::function<stat(set)> &fn) const;
   inline basic_set_list get_basic_set_list() const;
@@ -3556,6 +3880,7 @@
   inline boolean is_params() const;
   inline boolean is_strict_subset(const union_set &uset2) const;
   inline boolean is_subset(const union_set &uset2) const;
+  inline boolean isa_set() const;
   inline union_map lex_ge_union_set(union_set uset2) const;
   inline union_map lex_gt_union_set(union_set uset2) const;
   inline union_map lex_le_union_set(union_set uset2) const;
@@ -3563,7 +3888,7 @@
   inline union_set lexmax() const;
   inline union_set lexmin() const;
   inline multi_val min_multi_union_pw_aff(const multi_union_pw_aff &obj) const;
-  inline int n_set() const;
+  inline isl_size n_set() const;
   inline set params() const;
   inline union_set polyhedral_hull() const;
   inline union_set preimage(multi_aff ma) const;
@@ -3571,6 +3896,7 @@
   inline union_set preimage(union_pw_multi_aff upma) const;
   inline union_set product(union_set uset2) const;
   inline union_set project_out(isl::dim type, unsigned int first, unsigned int n) const;
+  inline union_set project_out_all_params() const;
   inline union_set remove_divs() const;
   inline union_set remove_redundancies() const;
   inline union_set reset_user() const;
@@ -3610,10 +3936,12 @@
   inline bool is_null() const;
   inline explicit operator bool() const;
   inline ctx get_ctx() const;
+  inline std::string to_str() const;
   inline void dump() const;
 
   inline union_set_list add(union_set el) const;
   static inline union_set_list alloc(ctx ctx, int n);
+  inline union_set_list clear() const;
   inline union_set_list concat(union_set_list list2) const;
   inline union_set_list drop(unsigned int first, unsigned int n) const;
   inline stat foreach(const std::function<stat(union_set)> &fn) const;
@@ -3621,10 +3949,10 @@
   inline union_set get_at(int index) const;
   inline union_set get_union_set(int index) const;
   inline union_set_list insert(unsigned int pos, union_set el) const;
-  inline int n_union_set() const;
+  inline isl_size n_union_set() const;
   inline union_set_list reverse() const;
   inline union_set_list set_union_set(int index, union_set el) const;
-  inline int size() const;
+  inline isl_size size() const;
   inline union_set_list swap(unsigned int pos1, unsigned int pos2) const;
   inline union_set unite() const;
 };
@@ -3645,8 +3973,8 @@
   inline /* implicit */ val();
   inline /* implicit */ val(const val &obj);
   inline /* implicit */ val(std::nullptr_t);
-  inline explicit val(ctx ctx, const std::string &str);
   inline explicit val(ctx ctx, long i);
+  inline explicit val(ctx ctx, const std::string &str);
   inline val &operator=(val obj);
   inline ~val();
   inline __isl_give isl_val *copy() const &;
@@ -3668,6 +3996,7 @@
   inline val div(val v2) const;
   inline val div_ui(unsigned long v2) const;
   inline boolean eq(const val &v2) const;
+  inline boolean eq_si(long i) const;
   inline val floor() const;
   inline val gcd(val v2) const;
   inline boolean ge(const val &v2) const;
@@ -3698,7 +4027,7 @@
   inline val mod(val v2) const;
   inline val mul(val v2) const;
   inline val mul_ui(unsigned long v2) const;
-  inline size_t n_abs_num_chunks(size_t size) const;
+  inline isl_size n_abs_num_chunks(size_t size) const;
   static inline val nan(ctx ctx);
   inline boolean ne(const val &v2) const;
   inline val neg() const;
@@ -3739,10 +4068,12 @@
   inline bool is_null() const;
   inline explicit operator bool() const;
   inline ctx get_ctx() const;
+  inline std::string to_str() const;
   inline void dump() const;
 
   inline val_list add(val el) const;
   static inline val_list alloc(ctx ctx, int n);
+  inline val_list clear() const;
   inline val_list concat(val_list list2) const;
   inline val_list drop(unsigned int first, unsigned int n) const;
   inline stat foreach(const std::function<stat(val)> &fn) const;
@@ -3750,10 +4081,10 @@
   inline val get_at(int index) const;
   inline val get_val(int index) const;
   inline val_list insert(unsigned int pos, val el) const;
-  inline int n_val() const;
+  inline isl_size n_val() const;
   inline val_list reverse() const;
   inline val_list set_val(int index, val el) const;
-  inline int size() const;
+  inline isl_size size() const;
   inline val_list swap(unsigned int pos1, unsigned int pos2) const;
 };
 
@@ -3804,7 +4135,7 @@
   inline vec set_element_val(int pos, val v) const;
   inline vec set_si(int v) const;
   inline vec set_val(val v) const;
-  inline int size() const;
+  inline isl_size size() const;
   inline vec sort() const;
   static inline vec zero(ctx ctx, unsigned int size);
   inline vec zero_extend(unsigned int size) const;
@@ -3834,9 +4165,9 @@
 aff::aff(__isl_take isl_aff *ptr)
     : ptr(ptr) {}
 
-aff::aff(local_space ls)
+aff::aff(ctx ctx, const std::string &str)
 {
-  auto res = isl_aff_zero_on_domain(ls.release());
+  auto res = isl_aff_read_from_str(ctx.release(), str.c_str());
   ptr = res;
 }
 aff::aff(local_space ls, val val)
@@ -3844,9 +4175,9 @@
   auto res = isl_aff_val_on_domain(ls.release(), val.release());
   ptr = res;
 }
-aff::aff(ctx ctx, const std::string &str)
+aff::aff(local_space ls)
 {
-  auto res = isl_aff_read_from_str(ctx.release(), str.c_str());
+  auto res = isl_aff_zero_on_domain(ls.release());
   ptr = res;
 }
 
@@ -3918,6 +4249,12 @@
   return manage(res);
 }
 
+aff aff::add_constant(val v) const
+{
+  auto res = isl_aff_add_constant_val(copy(), v.release());
+  return manage(res);
+}
+
 aff aff::add_constant_num_si(int v) const
 {
   auto res = isl_aff_add_constant_num_si(copy(), v);
@@ -3930,12 +4267,6 @@
   return manage(res);
 }
 
-aff aff::add_constant_val(val v) const
-{
-  auto res = isl_aff_add_constant_val(copy(), v.release());
-  return manage(res);
-}
-
 aff aff::add_dims(isl::dim type, unsigned int n) const
 {
   auto res = isl_aff_add_dims(copy(), static_cast<enum isl_dim_type>(type), n);
@@ -3948,6 +4279,12 @@
   return manage(res);
 }
 
+basic_set aff::bind(id id) const
+{
+  auto res = isl_aff_bind_id(copy(), id.release());
+  return manage(res);
+}
+
 aff aff::ceil() const
 {
   auto res = isl_aff_ceil(copy());
@@ -3960,7 +4297,7 @@
   return res;
 }
 
-int aff::dim(isl::dim type) const
+isl_size aff::dim(isl::dim type) const
 {
   auto res = isl_aff_dim(get(), static_cast<enum isl_dim_type>(type));
   return res;
@@ -4123,6 +4460,12 @@
   return manage(res);
 }
 
+boolean aff::involves_locals() const
+{
+  auto res = isl_aff_involves_locals(get());
+  return manage(res);
+}
+
 boolean aff::is_cst() const
 {
   auto res = isl_aff_is_cst(get());
@@ -4183,6 +4526,12 @@
   return manage(res);
 }
 
+aff aff::nan_on_domain_space(space space)
+{
+  auto res = isl_aff_nan_on_domain_space(space.release());
+  return manage(res);
+}
+
 set aff::ne_set(aff aff2) const
 {
   auto res = isl_aff_ne_set(copy(), aff2.release());
@@ -4297,6 +4646,18 @@
   return manage(res);
 }
 
+aff aff::unbind_params_insert_domain(multi_id domain) const
+{
+  auto res = isl_aff_unbind_params_insert_domain(copy(), domain.release());
+  return manage(res);
+}
+
+aff aff::val_on_domain_space(space space, val val)
+{
+  auto res = isl_aff_val_on_domain_space(space.release(), val.release());
+  return manage(res);
+}
+
 aff aff::var_on_domain(local_space ls, isl::dim type, unsigned int pos)
 {
   auto res = isl_aff_var_on_domain(ls.release(), static_cast<enum isl_dim_type>(type), pos);
@@ -4309,6 +4670,12 @@
   return manage(res);
 }
 
+aff aff::zero_on_domain(space space)
+{
+  auto res = isl_aff_zero_on_domain_space(space.release());
+  return manage(res);
+}
+
 // implementations for isl::aff_list
 aff_list manage(__isl_take isl_aff_list *ptr) {
   return aff_list(ptr);
@@ -4369,6 +4736,15 @@
 ctx aff_list::get_ctx() const {
   return ctx(isl_aff_list_get_ctx(ptr));
 }
+std::string aff_list::to_str() const {
+  char *Tmp = isl_aff_list_to_str(get());
+  if (!Tmp)
+    return "";
+  std::string S(Tmp);
+  free(Tmp);
+  return S;
+}
+
 
 void aff_list::dump() const {
   isl_aff_list_dump(get());
@@ -4387,6 +4763,12 @@
   return manage(res);
 }
 
+aff_list aff_list::clear() const
+{
+  auto res = isl_aff_list_clear(copy());
+  return manage(res);
+}
+
 aff_list aff_list::concat(aff_list list2) const
 {
   auto res = isl_aff_list_concat(copy(), list2.release());
@@ -4437,7 +4819,7 @@
   return manage(res);
 }
 
-int aff_list::n_aff() const
+isl_size aff_list::n_aff() const
 {
   auto res = isl_aff_list_n_aff(get());
   return res;
@@ -4455,7 +4837,7 @@
   return manage(res);
 }
 
-int aff_list::size() const
+isl_size aff_list::size() const
 {
   auto res = isl_aff_list_size(get());
   return res;
@@ -4534,39 +4916,33 @@
 }
 
 
-ast_expr ast_build::access_from(pw_multi_aff pma) const
-{
-  auto res = isl_ast_build_access_from_pw_multi_aff(get(), pma.release());
-  return manage(res);
-}
-
 ast_expr ast_build::access_from(multi_pw_aff mpa) const
 {
   auto res = isl_ast_build_access_from_multi_pw_aff(get(), mpa.release());
   return manage(res);
 }
 
+ast_expr ast_build::access_from(pw_multi_aff pma) const
+{
+  auto res = isl_ast_build_access_from_pw_multi_aff(get(), pma.release());
+  return manage(res);
+}
+
 ast_node ast_build::ast_from_schedule(union_map schedule) const
 {
   auto res = isl_ast_build_ast_from_schedule(get(), schedule.release());
   return manage(res);
 }
 
-ast_expr ast_build::call_from(pw_multi_aff pma) const
-{
-  auto res = isl_ast_build_call_from_pw_multi_aff(get(), pma.release());
-  return manage(res);
-}
-
 ast_expr ast_build::call_from(multi_pw_aff mpa) const
 {
   auto res = isl_ast_build_call_from_multi_pw_aff(get(), mpa.release());
   return manage(res);
 }
 
-ast_expr ast_build::expr_from(set set) const
+ast_expr ast_build::call_from(pw_multi_aff pma) const
 {
-  auto res = isl_ast_build_expr_from_set(get(), set.release());
+  auto res = isl_ast_build_call_from_pw_multi_aff(get(), pma.release());
   return manage(res);
 }
 
@@ -4576,6 +4952,12 @@
   return manage(res);
 }
 
+ast_expr ast_build::expr_from(set set) const
+{
+  auto res = isl_ast_build_expr_from_set(get(), set.release());
+  return manage(res);
+}
+
 ast_build ast_build::from_context(set set)
 {
   auto res = isl_ast_build_from_context(set.release());
@@ -4594,7 +4976,7 @@
   return manage(res);
 }
 
-ast_node ast_build::node_from_schedule(schedule schedule) const
+ast_node ast_build::node_from(schedule schedule) const
 {
   auto res = isl_ast_build_node_from_schedule(get(), schedule.release());
   return manage(res);
@@ -4753,7 +5135,7 @@
   return manage(res);
 }
 
-int ast_expr::get_op_n_arg() const
+isl_size ast_expr::get_op_n_arg() const
 {
   auto res = isl_ast_expr_get_op_n_arg(get());
   return res;
@@ -4771,6 +5153,18 @@
   return manage(res);
 }
 
+id ast_expr::id_get_id() const
+{
+  auto res = isl_ast_expr_id_get_id(get());
+  return manage(res);
+}
+
+val ast_expr::int_get_val() const
+{
+  auto res = isl_ast_expr_int_get_val(get());
+  return manage(res);
+}
+
 boolean ast_expr::is_equal(const ast_expr &expr2) const
 {
   auto res = isl_ast_expr_is_equal(get(), expr2.get());
@@ -4801,6 +5195,18 @@
   return manage(res);
 }
 
+ast_expr ast_expr::op_get_arg(int pos) const
+{
+  auto res = isl_ast_expr_op_get_arg(get(), pos);
+  return manage(res);
+}
+
+isl_size ast_expr::op_get_n_arg() const
+{
+  auto res = isl_ast_expr_op_get_n_arg(get());
+  return res;
+}
+
 ast_expr ast_expr::pdiv_q(ast_expr expr2) const
 {
   auto res = isl_ast_expr_pdiv_q(copy(), expr2.release());
@@ -4899,6 +5305,15 @@
 ctx ast_expr_list::get_ctx() const {
   return ctx(isl_ast_expr_list_get_ctx(ptr));
 }
+std::string ast_expr_list::to_str() const {
+  char *Tmp = isl_ast_expr_list_to_str(get());
+  if (!Tmp)
+    return "";
+  std::string S(Tmp);
+  free(Tmp);
+  return S;
+}
+
 
 void ast_expr_list::dump() const {
   isl_ast_expr_list_dump(get());
@@ -4917,6 +5332,12 @@
   return manage(res);
 }
 
+ast_expr_list ast_expr_list::clear() const
+{
+  auto res = isl_ast_expr_list_clear(copy());
+  return manage(res);
+}
+
 ast_expr_list ast_expr_list::concat(ast_expr_list list2) const
 {
   auto res = isl_ast_expr_list_concat(copy(), list2.release());
@@ -4967,7 +5388,7 @@
   return manage(res);
 }
 
-int ast_expr_list::n_ast_expr() const
+isl_size ast_expr_list::n_ast_expr() const
 {
   auto res = isl_ast_expr_list_n_ast_expr(get());
   return res;
@@ -4985,7 +5406,7 @@
   return manage(res);
 }
 
-int ast_expr_list::size() const
+isl_size ast_expr_list::size() const
 {
   auto res = isl_ast_expr_list_size(get());
   return res;
@@ -5138,18 +5559,36 @@
   return manage(res);
 }
 
+ast_node ast_node::if_get_else_node() const
+{
+  auto res = isl_ast_node_if_get_else_node(get());
+  return manage(res);
+}
+
 ast_node ast_node::if_get_then() const
 {
   auto res = isl_ast_node_if_get_then(get());
   return manage(res);
 }
 
+ast_node ast_node::if_get_then_node() const
+{
+  auto res = isl_ast_node_if_get_then_node(get());
+  return manage(res);
+}
+
 boolean ast_node::if_has_else() const
 {
   auto res = isl_ast_node_if_has_else(get());
   return manage(res);
 }
 
+boolean ast_node::if_has_else_node() const
+{
+  auto res = isl_ast_node_if_has_else_node(get());
+  return manage(res);
+}
+
 id ast_node::mark_get_id() const
 {
   auto res = isl_ast_node_mark_get_id(get());
@@ -5242,6 +5681,15 @@
 ctx ast_node_list::get_ctx() const {
   return ctx(isl_ast_node_list_get_ctx(ptr));
 }
+std::string ast_node_list::to_str() const {
+  char *Tmp = isl_ast_node_list_to_str(get());
+  if (!Tmp)
+    return "";
+  std::string S(Tmp);
+  free(Tmp);
+  return S;
+}
+
 
 void ast_node_list::dump() const {
   isl_ast_node_list_dump(get());
@@ -5260,6 +5708,12 @@
   return manage(res);
 }
 
+ast_node_list ast_node_list::clear() const
+{
+  auto res = isl_ast_node_list_clear(copy());
+  return manage(res);
+}
+
 ast_node_list ast_node_list::concat(ast_node_list list2) const
 {
   auto res = isl_ast_node_list_concat(copy(), list2.release());
@@ -5310,7 +5764,7 @@
   return manage(res);
 }
 
-int ast_node_list::n_ast_node() const
+isl_size ast_node_list::n_ast_node() const
 {
   auto res = isl_ast_node_list_n_ast_node(get());
   return res;
@@ -5328,7 +5782,7 @@
   return manage(res);
 }
 
-int ast_node_list::size() const
+isl_size ast_node_list::size() const
 {
   auto res = isl_ast_node_list_size(get());
   return res;
@@ -5498,7 +5952,7 @@
   return manage(res);
 }
 
-unsigned int basic_map::dim(isl::dim type) const
+isl_size basic_map::dim(isl::dim type) const
 {
   auto res = isl_basic_map_dim(get(), static_cast<enum isl_dim_type>(type));
   return res;
@@ -5552,9 +6006,9 @@
   return manage(res);
 }
 
-basic_map basic_map::equal(space dim, unsigned int n_equal)
+basic_map basic_map::equal(space space, unsigned int n_equal)
 {
-  auto res = isl_basic_map_equal(dim.release(), n_equal);
+  auto res = isl_basic_map_equal(space.release(), n_equal);
   return manage(res);
 }
 
@@ -5736,9 +6190,9 @@
   return manage(res);
 }
 
-basic_map basic_map::identity(space dim)
+basic_map basic_map::identity(space space)
 {
-  auto res = isl_basic_map_identity(dim.release());
+  auto res = isl_basic_map_identity(space.release());
   return manage(res);
 }
 
@@ -5832,9 +6286,9 @@
   return manage(res);
 }
 
-basic_map basic_map::less_at(space dim, unsigned int pos)
+basic_map basic_map::less_at(space space, unsigned int pos)
 {
-  auto res = isl_basic_map_less_at(dim.release(), pos);
+  auto res = isl_basic_map_less_at(space.release(), pos);
   return manage(res);
 }
 
@@ -5862,9 +6316,9 @@
   return manage(res);
 }
 
-basic_map basic_map::more_at(space dim, unsigned int pos)
+basic_map basic_map::more_at(space space, unsigned int pos)
 {
-  auto res = isl_basic_map_more_at(dim.release(), pos);
+  auto res = isl_basic_map_more_at(space.release(), pos);
   return manage(res);
 }
 
@@ -5874,15 +6328,15 @@
   return manage(res);
 }
 
-int basic_map::n_constraint() const
+isl_size basic_map::n_constraint() const
 {
   auto res = isl_basic_map_n_constraint(get());
   return res;
 }
 
-basic_map basic_map::nat_universe(space dim)
+basic_map basic_map::nat_universe(space space)
 {
-  auto res = isl_basic_map_nat_universe(dim.release());
+  auto res = isl_basic_map_nat_universe(space.release());
   return manage(res);
 }
 
@@ -6114,6 +6568,15 @@
 ctx basic_map_list::get_ctx() const {
   return ctx(isl_basic_map_list_get_ctx(ptr));
 }
+std::string basic_map_list::to_str() const {
+  char *Tmp = isl_basic_map_list_to_str(get());
+  if (!Tmp)
+    return "";
+  std::string S(Tmp);
+  free(Tmp);
+  return S;
+}
+
 
 void basic_map_list::dump() const {
   isl_basic_map_list_dump(get());
@@ -6132,6 +6595,12 @@
   return manage(res);
 }
 
+basic_map_list basic_map_list::clear() const
+{
+  auto res = isl_basic_map_list_clear(copy());
+  return manage(res);
+}
+
 basic_map_list basic_map_list::concat(basic_map_list list2) const
 {
   auto res = isl_basic_map_list_concat(copy(), list2.release());
@@ -6182,7 +6651,7 @@
   return manage(res);
 }
 
-int basic_map_list::n_basic_map() const
+isl_size basic_map_list::n_basic_map() const
 {
   auto res = isl_basic_map_list_n_basic_map(get());
   return res;
@@ -6200,7 +6669,7 @@
   return manage(res);
 }
 
-int basic_map_list::size() const
+isl_size basic_map_list::size() const
 {
   auto res = isl_basic_map_list_size(get());
   return res;
@@ -6236,16 +6705,16 @@
 basic_set::basic_set(__isl_take isl_basic_set *ptr)
     : ptr(ptr) {}
 
-basic_set::basic_set(ctx ctx, const std::string &str)
-{
-  auto res = isl_basic_set_read_from_str(ctx.release(), str.c_str());
-  ptr = res;
-}
 basic_set::basic_set(point pnt)
 {
   auto res = isl_basic_set_from_point(pnt.release());
   ptr = res;
 }
+basic_set::basic_set(ctx ctx, const std::string &str)
+{
+  auto res = isl_basic_set_read_from_str(ctx.release(), str.c_str());
+  ptr = res;
+}
 
 basic_set &basic_set::operator=(basic_set obj) {
   std::swap(this->ptr, obj.ptr);
@@ -6333,7 +6802,7 @@
   return manage(res);
 }
 
-unsigned int basic_set::dim(isl::dim type) const
+isl_size basic_set::dim(isl::dim type) const
 {
   auto res = isl_basic_set_dim(get(), static_cast<enum isl_dim_type>(type));
   return res;
@@ -6609,21 +7078,21 @@
   return manage(res);
 }
 
-int basic_set::n_constraint() const
+isl_size basic_set::n_constraint() const
 {
   auto res = isl_basic_set_n_constraint(get());
   return res;
 }
 
-unsigned int basic_set::n_dim() const
+isl_size basic_set::n_dim() const
 {
   auto res = isl_basic_set_n_dim(get());
   return res;
 }
 
-basic_set basic_set::nat_universe(space dim)
+basic_set basic_set::nat_universe(space space)
 {
-  auto res = isl_basic_set_nat_universe(dim.release());
+  auto res = isl_basic_set_nat_universe(space.release());
   return manage(res);
 }
 
@@ -6825,6 +7294,15 @@
 ctx basic_set_list::get_ctx() const {
   return ctx(isl_basic_set_list_get_ctx(ptr));
 }
+std::string basic_set_list::to_str() const {
+  char *Tmp = isl_basic_set_list_to_str(get());
+  if (!Tmp)
+    return "";
+  std::string S(Tmp);
+  free(Tmp);
+  return S;
+}
+
 
 void basic_set_list::dump() const {
   isl_basic_set_list_dump(get());
@@ -6843,6 +7321,12 @@
   return manage(res);
 }
 
+basic_set_list basic_set_list::clear() const
+{
+  auto res = isl_basic_set_list_clear(copy());
+  return manage(res);
+}
+
 basic_set_list basic_set_list::coefficients() const
 {
   auto res = isl_basic_set_list_coefficients(copy());
@@ -6899,7 +7383,7 @@
   return manage(res);
 }
 
-int basic_set_list::n_basic_set() const
+isl_size basic_set_list::n_basic_set() const
 {
   auto res = isl_basic_set_list_n_basic_set(get());
   return res;
@@ -6917,7 +7401,7 @@
   return manage(res);
 }
 
-int basic_set_list::size() const
+isl_size basic_set_list::size() const
 {
   auto res = isl_basic_set_list_size(get());
   return res;
@@ -7068,10 +7552,10 @@
   return manage(res);
 }
 
-int constraint::is_div_constraint() const
+boolean constraint::is_div_constraint() const
 {
   auto res = isl_constraint_is_div_constraint(get());
-  return res;
+  return manage(res);
 }
 
 boolean constraint::is_lower_bound(isl::dim type, unsigned int pos) const
@@ -7176,6 +7660,15 @@
 ctx constraint_list::get_ctx() const {
   return ctx(isl_constraint_list_get_ctx(ptr));
 }
+std::string constraint_list::to_str() const {
+  char *Tmp = isl_constraint_list_to_str(get());
+  if (!Tmp)
+    return "";
+  std::string S(Tmp);
+  free(Tmp);
+  return S;
+}
+
 
 void constraint_list::dump() const {
   isl_constraint_list_dump(get());
@@ -7194,6 +7687,12 @@
   return manage(res);
 }
 
+constraint_list constraint_list::clear() const
+{
+  auto res = isl_constraint_list_clear(copy());
+  return manage(res);
+}
+
 constraint_list constraint_list::concat(constraint_list list2) const
 {
   auto res = isl_constraint_list_concat(copy(), list2.release());
@@ -7244,7 +7743,7 @@
   return manage(res);
 }
 
-int constraint_list::n_constraint() const
+isl_size constraint_list::n_constraint() const
 {
   auto res = isl_constraint_list_n_constraint(get());
   return res;
@@ -7262,7 +7761,7 @@
   return manage(res);
 }
 
-int constraint_list::size() const
+isl_size constraint_list::size() const
 {
   auto res = isl_constraint_list_size(get());
   return res;
@@ -7334,6 +7833,19 @@
 ctx fixed_box::get_ctx() const {
   return ctx(isl_fixed_box_get_ctx(ptr));
 }
+std::string fixed_box::to_str() const {
+  char *Tmp = isl_fixed_box_to_str(get());
+  if (!Tmp)
+    return "";
+  std::string S(Tmp);
+  free(Tmp);
+  return S;
+}
+
+
+void fixed_box::dump() const {
+  isl_fixed_box_dump(get());
+}
 
 
 multi_aff fixed_box::get_offset() const
@@ -7384,6 +7896,11 @@
 id::id(__isl_take isl_id *ptr)
     : ptr(ptr) {}
 
+id::id(ctx ctx, const std::string &str)
+{
+  auto res = isl_id_read_from_str(ctx.release(), str.c_str());
+  ptr = res;
+}
 
 id &id::operator=(id obj) {
   std::swap(this->ptr, obj.ptr);
@@ -7520,6 +8037,15 @@
 ctx id_list::get_ctx() const {
   return ctx(isl_id_list_get_ctx(ptr));
 }
+std::string id_list::to_str() const {
+  char *Tmp = isl_id_list_to_str(get());
+  if (!Tmp)
+    return "";
+  std::string S(Tmp);
+  free(Tmp);
+  return S;
+}
+
 
 void id_list::dump() const {
   isl_id_list_dump(get());
@@ -7538,6 +8064,12 @@
   return manage(res);
 }
 
+id_list id_list::clear() const
+{
+  auto res = isl_id_list_clear(copy());
+  return manage(res);
+}
+
 id_list id_list::concat(id_list list2) const
 {
   auto res = isl_id_list_concat(copy(), list2.release());
@@ -7588,7 +8120,7 @@
   return manage(res);
 }
 
-int id_list::n_id() const
+isl_size id_list::n_id() const
 {
   auto res = isl_id_list_n_id(get());
   return res;
@@ -7606,7 +8138,7 @@
   return manage(res);
 }
 
-int id_list::size() const
+isl_size id_list::size() const
 {
   auto res = isl_id_list_size(get());
   return res;
@@ -7752,9 +8284,9 @@
 local_space::local_space(__isl_take isl_local_space *ptr)
     : ptr(ptr) {}
 
-local_space::local_space(space dim)
+local_space::local_space(space space)
 {
-  auto res = isl_local_space_from_space(dim.release());
+  auto res = isl_local_space_from_space(space.release());
   ptr = res;
 }
 
@@ -7805,7 +8337,7 @@
   return manage(res);
 }
 
-int local_space::dim(isl::dim type) const
+isl_size local_space::dim(isl::dim type) const
 {
   auto res = isl_local_space_dim(get(), static_cast<enum isl_dim_type>(type));
   return res;
@@ -7968,16 +8500,16 @@
 map::map(__isl_take isl_map *ptr)
     : ptr(ptr) {}
 
-map::map(ctx ctx, const std::string &str)
-{
-  auto res = isl_map_read_from_str(ctx.release(), str.c_str());
-  ptr = res;
-}
 map::map(basic_map bmap)
 {
   auto res = isl_map_from_basic_map(bmap.release());
   ptr = res;
 }
+map::map(ctx ctx, const std::string &str)
+{
+  auto res = isl_map_read_from_str(ctx.release(), str.c_str());
+  ptr = res;
+}
 
 map &map::operator=(map obj) {
   std::swap(this->ptr, obj.ptr);
@@ -8065,6 +8597,18 @@
   return manage(res);
 }
 
+set map::bind_domain(multi_id tuple) const
+{
+  auto res = isl_map_bind_domain(copy(), tuple.release());
+  return manage(res);
+}
+
+set map::bind_range(multi_id tuple) const
+{
+  auto res = isl_map_bind_range(copy(), tuple.release());
+  return manage(res);
+}
+
 boolean map::can_curry() const
 {
   auto res = isl_map_can_curry(get());
@@ -8131,7 +8675,7 @@
   return manage(res);
 }
 
-unsigned int map::dim(isl::dim type) const
+isl_size map::dim(isl::dim type) const
 {
   auto res = isl_map_dim(get(), static_cast<enum isl_dim_type>(type));
   return res;
@@ -8215,6 +8759,12 @@
   return manage(res);
 }
 
+map map::eq_at(multi_pw_aff mpa) const
+{
+  auto res = isl_map_eq_at_multi_pw_aff(copy(), mpa.release());
+  return manage(res);
+}
+
 map map::equate(isl::dim type1, int pos1, isl::dim type2, int pos2) const
 {
   auto res = isl_map_equate(copy(), static_cast<enum isl_dim_type>(type1), pos1, static_cast<enum isl_dim_type>(type2), pos2);
@@ -8483,9 +9033,9 @@
   return manage(res);
 }
 
-map map::identity(space dim)
+map map::identity(space space)
 {
-  auto res = isl_map_identity(dim.release());
+  auto res = isl_map_identity(space.release());
   return manage(res);
 }
 
@@ -8507,6 +9057,12 @@
   return manage(res);
 }
 
+map map::intersect_domain_factor_domain(map factor) const
+{
+  auto res = isl_map_intersect_domain_factor_domain(copy(), factor.release());
+  return manage(res);
+}
+
 map map::intersect_domain_factor_range(map factor) const
 {
   auto res = isl_map_intersect_domain_factor_range(copy(), factor.release());
@@ -8525,6 +9081,12 @@
   return manage(res);
 }
 
+map map::intersect_range_factor_domain(map factor) const
+{
+  auto res = isl_map_intersect_range_factor_domain(copy(), factor.release());
+  return manage(res);
+}
+
 map map::intersect_range_factor_range(map factor) const
 {
   auto res = isl_map_intersect_range_factor_range(copy(), factor.release());
@@ -8603,15 +9165,21 @@
   return res;
 }
 
-map map::lex_ge(space set_dim)
+map map::lex_ge(space set_space)
 {
-  auto res = isl_map_lex_ge(set_dim.release());
+  auto res = isl_map_lex_ge(set_space.release());
   return manage(res);
 }
 
-map map::lex_ge_first(space dim, unsigned int n)
+map map::lex_ge_at(multi_pw_aff mpa) const
 {
-  auto res = isl_map_lex_ge_first(dim.release(), n);
+  auto res = isl_map_lex_ge_at_multi_pw_aff(copy(), mpa.release());
+  return manage(res);
+}
+
+map map::lex_ge_first(space space, unsigned int n)
+{
+  auto res = isl_map_lex_ge_first(space.release(), n);
   return manage(res);
 }
 
@@ -8621,15 +9189,21 @@
   return manage(res);
 }
 
-map map::lex_gt(space set_dim)
+map map::lex_gt(space set_space)
 {
-  auto res = isl_map_lex_gt(set_dim.release());
+  auto res = isl_map_lex_gt(set_space.release());
   return manage(res);
 }
 
-map map::lex_gt_first(space dim, unsigned int n)
+map map::lex_gt_at(multi_pw_aff mpa) const
 {
-  auto res = isl_map_lex_gt_first(dim.release(), n);
+  auto res = isl_map_lex_gt_at_multi_pw_aff(copy(), mpa.release());
+  return manage(res);
+}
+
+map map::lex_gt_first(space space, unsigned int n)
+{
+  auto res = isl_map_lex_gt_first(space.release(), n);
   return manage(res);
 }
 
@@ -8639,15 +9213,21 @@
   return manage(res);
 }
 
-map map::lex_le(space set_dim)
+map map::lex_le(space set_space)
 {
-  auto res = isl_map_lex_le(set_dim.release());
+  auto res = isl_map_lex_le(set_space.release());
   return manage(res);
 }
 
-map map::lex_le_first(space dim, unsigned int n)
+map map::lex_le_at(multi_pw_aff mpa) const
 {
-  auto res = isl_map_lex_le_first(dim.release(), n);
+  auto res = isl_map_lex_le_at_multi_pw_aff(copy(), mpa.release());
+  return manage(res);
+}
+
+map map::lex_le_first(space space, unsigned int n)
+{
+  auto res = isl_map_lex_le_first(space.release(), n);
   return manage(res);
 }
 
@@ -8657,15 +9237,21 @@
   return manage(res);
 }
 
-map map::lex_lt(space set_dim)
+map map::lex_lt(space set_space)
 {
-  auto res = isl_map_lex_lt(set_dim.release());
+  auto res = isl_map_lex_lt(set_space.release());
   return manage(res);
 }
 
-map map::lex_lt_first(space dim, unsigned int n)
+map map::lex_lt_at(multi_pw_aff mpa) const
 {
-  auto res = isl_map_lex_lt_first(dim.release(), n);
+  auto res = isl_map_lex_lt_at_multi_pw_aff(copy(), mpa.release());
+  return manage(res);
+}
+
+map map::lex_lt_first(space space, unsigned int n)
+{
+  auto res = isl_map_lex_lt_first(space.release(), n);
   return manage(res);
 }
 
@@ -8699,27 +9285,51 @@
   return manage(res);
 }
 
+map map::lower_bound(multi_pw_aff lower) const
+{
+  auto res = isl_map_lower_bound_multi_pw_aff(copy(), lower.release());
+  return manage(res);
+}
+
 map map::lower_bound_si(isl::dim type, unsigned int pos, int value) const
 {
   auto res = isl_map_lower_bound_si(copy(), static_cast<enum isl_dim_type>(type), pos, value);
   return manage(res);
 }
 
+map map::lower_bound_val(isl::dim type, unsigned int pos, val value) const
+{
+  auto res = isl_map_lower_bound_val(copy(), static_cast<enum isl_dim_type>(type), pos, value.release());
+  return manage(res);
+}
+
+multi_pw_aff map::max_multi_pw_aff() const
+{
+  auto res = isl_map_max_multi_pw_aff(copy());
+  return manage(res);
+}
+
+multi_pw_aff map::min_multi_pw_aff() const
+{
+  auto res = isl_map_min_multi_pw_aff(copy());
+  return manage(res);
+}
+
 map map::move_dims(isl::dim dst_type, unsigned int dst_pos, isl::dim src_type, unsigned int src_pos, unsigned int n) const
 {
   auto res = isl_map_move_dims(copy(), static_cast<enum isl_dim_type>(dst_type), dst_pos, static_cast<enum isl_dim_type>(src_type), src_pos, n);
   return manage(res);
 }
 
-int map::n_basic_map() const
+isl_size map::n_basic_map() const
 {
   auto res = isl_map_n_basic_map(get());
   return res;
 }
 
-map map::nat_universe(space dim)
+map map::nat_universe(space space)
 {
-  auto res = isl_map_nat_universe(dim.release());
+  auto res = isl_map_nat_universe(space.release());
   return manage(res);
 }
 
@@ -8813,31 +9423,31 @@
   return manage(res);
 }
 
-map map::preimage_domain_multi_aff(multi_aff ma) const
+map map::preimage_domain(multi_aff ma) const
 {
   auto res = isl_map_preimage_domain_multi_aff(copy(), ma.release());
   return manage(res);
 }
 
-map map::preimage_domain_multi_pw_aff(multi_pw_aff mpa) const
+map map::preimage_domain(multi_pw_aff mpa) const
 {
   auto res = isl_map_preimage_domain_multi_pw_aff(copy(), mpa.release());
   return manage(res);
 }
 
-map map::preimage_domain_pw_multi_aff(pw_multi_aff pma) const
+map map::preimage_domain(pw_multi_aff pma) const
 {
   auto res = isl_map_preimage_domain_pw_multi_aff(copy(), pma.release());
   return manage(res);
 }
 
-map map::preimage_range_multi_aff(multi_aff ma) const
+map map::preimage_range(multi_aff ma) const
 {
   auto res = isl_map_preimage_range_multi_aff(copy(), ma.release());
   return manage(res);
 }
 
-map map::preimage_range_pw_multi_aff(pw_multi_aff pma) const
+map map::preimage_range(pw_multi_aff pma) const
 {
   auto res = isl_map_preimage_range_pw_multi_aff(copy(), pma.release());
   return manage(res);
@@ -8855,6 +9465,12 @@
   return manage(res);
 }
 
+map map::project_out_all_params() const
+{
+  auto res = isl_map_project_out_all_params(copy());
+  return manage(res);
+}
+
 set map::range() const
 {
   auto res = isl_map_range(copy());
@@ -8897,6 +9513,12 @@
   return manage(res);
 }
 
+map map::range_reverse() const
+{
+  auto res = isl_map_range_reverse(copy());
+  return manage(res);
+}
+
 map map::remove_dims(isl::dim type, unsigned int first, unsigned int n) const
 {
   auto res = isl_map_remove_dims(copy(), static_cast<enum isl_dim_type>(type), first, n);
@@ -9029,12 +9651,24 @@
   return manage(res);
 }
 
+map map::upper_bound(multi_pw_aff upper) const
+{
+  auto res = isl_map_upper_bound_multi_pw_aff(copy(), upper.release());
+  return manage(res);
+}
+
 map map::upper_bound_si(isl::dim type, unsigned int pos, int value) const
 {
   auto res = isl_map_upper_bound_si(copy(), static_cast<enum isl_dim_type>(type), pos, value);
   return manage(res);
 }
 
+map map::upper_bound_val(isl::dim type, unsigned int pos, val value) const
+{
+  auto res = isl_map_upper_bound_val(copy(), static_cast<enum isl_dim_type>(type), pos, value.release());
+  return manage(res);
+}
+
 set map::wrap() const
 {
   auto res = isl_map_wrap(copy());
@@ -9107,6 +9741,15 @@
 ctx map_list::get_ctx() const {
   return ctx(isl_map_list_get_ctx(ptr));
 }
+std::string map_list::to_str() const {
+  char *Tmp = isl_map_list_to_str(get());
+  if (!Tmp)
+    return "";
+  std::string S(Tmp);
+  free(Tmp);
+  return S;
+}
+
 
 void map_list::dump() const {
   isl_map_list_dump(get());
@@ -9125,6 +9768,12 @@
   return manage(res);
 }
 
+map_list map_list::clear() const
+{
+  auto res = isl_map_list_clear(copy());
+  return manage(res);
+}
+
 map_list map_list::concat(map_list list2) const
 {
   auto res = isl_map_list_concat(copy(), list2.release());
@@ -9175,7 +9824,7 @@
   return manage(res);
 }
 
-int map_list::n_map() const
+isl_size map_list::n_map() const
 {
   auto res = isl_map_list_n_map(get());
   return res;
@@ -9193,7 +9842,7 @@
   return manage(res);
 }
 
-int map_list::size() const
+isl_size map_list::size() const
 {
   auto res = isl_map_list_size(get());
   return res;
@@ -9301,7 +9950,7 @@
   return manage(res);
 }
 
-int mat::cols() const
+isl_size mat::cols() const
 {
   auto res = isl_mat_cols(get());
   return res;
@@ -9421,7 +10070,7 @@
   return manage(res);
 }
 
-int mat::rank() const
+isl_size mat::rank() const
 {
   auto res = isl_mat_rank(get());
   return res;
@@ -9451,7 +10100,7 @@
   return manage(res);
 }
 
-int mat::rows() const
+isl_size mat::rows() const
 {
   auto res = isl_mat_rows(get());
   return res;
@@ -9540,6 +10189,11 @@
   auto res = isl_multi_aff_from_aff(aff.release());
   ptr = res;
 }
+multi_aff::multi_aff(space space, aff_list list)
+{
+  auto res = isl_multi_aff_from_aff_list(space.release(), list.release());
+  ptr = res;
+}
 multi_aff::multi_aff(ctx ctx, const std::string &str)
 {
   auto res = isl_multi_aff_read_from_str(ctx.release(), str.c_str());
@@ -9602,6 +10256,18 @@
   return manage(res);
 }
 
+multi_aff multi_aff::add_constant(multi_val mv) const
+{
+  auto res = isl_multi_aff_add_constant_multi_val(copy(), mv.release());
+  return manage(res);
+}
+
+multi_aff multi_aff::add_constant(val v) const
+{
+  auto res = isl_multi_aff_add_constant_val(copy(), v.release());
+  return manage(res);
+}
+
 multi_aff multi_aff::add_dims(isl::dim type, unsigned int n) const
 {
   auto res = isl_multi_aff_add_dims(copy(), static_cast<enum isl_dim_type>(type), n);
@@ -9614,7 +10280,25 @@
   return manage(res);
 }
 
-unsigned int multi_aff::dim(isl::dim type) const
+basic_set multi_aff::bind(multi_id tuple) const
+{
+  auto res = isl_multi_aff_bind(copy(), tuple.release());
+  return manage(res);
+}
+
+multi_aff multi_aff::bind_domain(multi_id tuple) const
+{
+  auto res = isl_multi_aff_bind_domain(copy(), tuple.release());
+  return manage(res);
+}
+
+multi_aff multi_aff::bind_domain_wrapped_domain(multi_id tuple) const
+{
+  auto res = isl_multi_aff_bind_domain_wrapped_domain(copy(), tuple.release());
+  return manage(res);
+}
+
+isl_size multi_aff::dim(isl::dim type) const
 {
   auto res = isl_multi_aff_dim(get(), static_cast<enum isl_dim_type>(type));
   return res;
@@ -9674,12 +10358,6 @@
   return manage(res);
 }
 
-multi_aff multi_aff::from_aff_list(space space, aff_list list)
-{
-  auto res = isl_multi_aff_from_aff_list(space.release(), list.release());
-  return manage(res);
-}
-
 multi_aff multi_aff::from_range() const
 {
   auto res = isl_multi_aff_from_range(copy());
@@ -9692,6 +10370,18 @@
   return manage(res);
 }
 
+aff multi_aff::get_at(int pos) const
+{
+  auto res = isl_multi_aff_get_at(get(), pos);
+  return manage(res);
+}
+
+multi_val multi_aff::get_constant_multi_val() const
+{
+  auto res = isl_multi_aff_get_constant_multi_val(get());
+  return manage(res);
+}
+
 id multi_aff::get_dim_id(isl::dim type, unsigned int pos) const
 {
   auto res = isl_multi_aff_get_dim_id(get(), static_cast<enum isl_dim_type>(type), pos);
@@ -9704,6 +10394,12 @@
   return manage(res);
 }
 
+aff_list multi_aff::get_list() const
+{
+  auto res = isl_multi_aff_get_list(get());
+  return manage(res);
+}
+
 space multi_aff::get_space() const
 {
   auto res = isl_multi_aff_get_space(get());
@@ -9747,18 +10443,42 @@
   return manage(res);
 }
 
+multi_aff multi_aff::identity() const
+{
+  auto res = isl_multi_aff_identity_multi_aff(copy());
+  return manage(res);
+}
+
+multi_aff multi_aff::identity_on_domain(space space)
+{
+  auto res = isl_multi_aff_identity_on_domain_space(space.release());
+  return manage(res);
+}
+
 multi_aff multi_aff::insert_dims(isl::dim type, unsigned int first, unsigned int n) const
 {
   auto res = isl_multi_aff_insert_dims(copy(), static_cast<enum isl_dim_type>(type), first, n);
   return manage(res);
 }
 
+multi_aff multi_aff::insert_domain(space domain) const
+{
+  auto res = isl_multi_aff_insert_domain(copy(), domain.release());
+  return manage(res);
+}
+
 boolean multi_aff::involves_dims(isl::dim type, unsigned int first, unsigned int n) const
 {
   auto res = isl_multi_aff_involves_dims(get(), static_cast<enum isl_dim_type>(type), first, n);
   return manage(res);
 }
 
+boolean multi_aff::involves_locals() const
+{
+  auto res = isl_multi_aff_involves_locals(get());
+  return manage(res);
+}
+
 boolean multi_aff::involves_nan() const
 {
   auto res = isl_multi_aff_involves_nan(get());
@@ -9897,36 +10617,42 @@
   return manage(res);
 }
 
-multi_aff multi_aff::scale_down_multi_val(multi_val mv) const
-{
-  auto res = isl_multi_aff_scale_down_multi_val(copy(), mv.release());
-  return manage(res);
-}
-
-multi_aff multi_aff::scale_down_val(val v) const
-{
-  auto res = isl_multi_aff_scale_down_val(copy(), v.release());
-  return manage(res);
-}
-
-multi_aff multi_aff::scale_multi_val(multi_val mv) const
+multi_aff multi_aff::scale(multi_val mv) const
 {
   auto res = isl_multi_aff_scale_multi_val(copy(), mv.release());
   return manage(res);
 }
 
-multi_aff multi_aff::scale_val(val v) const
+multi_aff multi_aff::scale(val v) const
 {
   auto res = isl_multi_aff_scale_val(copy(), v.release());
   return manage(res);
 }
 
+multi_aff multi_aff::scale_down(multi_val mv) const
+{
+  auto res = isl_multi_aff_scale_down_multi_val(copy(), mv.release());
+  return manage(res);
+}
+
+multi_aff multi_aff::scale_down(val v) const
+{
+  auto res = isl_multi_aff_scale_down_val(copy(), v.release());
+  return manage(res);
+}
+
 multi_aff multi_aff::set_aff(int pos, aff el) const
 {
   auto res = isl_multi_aff_set_aff(copy(), pos, el.release());
   return manage(res);
 }
 
+multi_aff multi_aff::set_at(int pos, aff el) const
+{
+  auto res = isl_multi_aff_set_at(copy(), pos, el.release());
+  return manage(res);
+}
+
 multi_aff multi_aff::set_dim_id(isl::dim type, unsigned int pos, id id) const
 {
   auto res = isl_multi_aff_set_dim_id(copy(), static_cast<enum isl_dim_type>(type), pos, id.release());
@@ -9945,6 +10671,12 @@
   return manage(res);
 }
 
+isl_size multi_aff::size() const
+{
+  auto res = isl_multi_aff_size(get());
+  return res;
+}
+
 multi_aff multi_aff::splice(unsigned int in_pos, unsigned int out_pos, multi_aff multi2) const
 {
   auto res = isl_multi_aff_splice(copy(), in_pos, out_pos, multi2.release());
@@ -9957,12 +10689,223 @@
   return manage(res);
 }
 
+multi_aff multi_aff::unbind_params_insert_domain(multi_id domain) const
+{
+  auto res = isl_multi_aff_unbind_params_insert_domain(copy(), domain.release());
+  return manage(res);
+}
+
 multi_aff multi_aff::zero(space space)
 {
   auto res = isl_multi_aff_zero(space.release());
   return manage(res);
 }
 
+// implementations for isl::multi_id
+multi_id manage(__isl_take isl_multi_id *ptr) {
+  return multi_id(ptr);
+}
+multi_id manage_copy(__isl_keep isl_multi_id *ptr) {
+  ptr = isl_multi_id_copy(ptr);
+  return multi_id(ptr);
+}
+
+multi_id::multi_id()
+    : ptr(nullptr) {}
+
+multi_id::multi_id(const multi_id &obj)
+    : ptr(nullptr)
+{
+  ptr = obj.copy();
+}
+multi_id::multi_id(std::nullptr_t)
+    : ptr(nullptr) {}
+
+
+multi_id::multi_id(__isl_take isl_multi_id *ptr)
+    : ptr(ptr) {}
+
+multi_id::multi_id(space space, id_list list)
+{
+  auto res = isl_multi_id_from_id_list(space.release(), list.release());
+  ptr = res;
+}
+multi_id::multi_id(ctx ctx, const std::string &str)
+{
+  auto res = isl_multi_id_read_from_str(ctx.release(), str.c_str());
+  ptr = res;
+}
+
+multi_id &multi_id::operator=(multi_id obj) {
+  std::swap(this->ptr, obj.ptr);
+  return *this;
+}
+
+multi_id::~multi_id() {
+  if (ptr)
+    isl_multi_id_free(ptr);
+}
+
+__isl_give isl_multi_id *multi_id::copy() const & {
+  return isl_multi_id_copy(ptr);
+}
+
+__isl_keep isl_multi_id *multi_id::get() const {
+  return ptr;
+}
+
+__isl_give isl_multi_id *multi_id::release() {
+  isl_multi_id *tmp = ptr;
+  ptr = nullptr;
+  return tmp;
+}
+
+bool multi_id::is_null() const {
+  return ptr == nullptr;
+}
+multi_id::operator bool() const {
+  return !is_null();
+}
+
+
+ctx multi_id::get_ctx() const {
+  return ctx(isl_multi_id_get_ctx(ptr));
+}
+std::string multi_id::to_str() const {
+  char *Tmp = isl_multi_id_to_str(get());
+  if (!Tmp)
+    return "";
+  std::string S(Tmp);
+  free(Tmp);
+  return S;
+}
+
+
+void multi_id::dump() const {
+  isl_multi_id_dump(get());
+}
+
+
+multi_id multi_id::align_params(space model) const
+{
+  auto res = isl_multi_id_align_params(copy(), model.release());
+  return manage(res);
+}
+
+multi_id multi_id::factor_range() const
+{
+  auto res = isl_multi_id_factor_range(copy());
+  return manage(res);
+}
+
+multi_id multi_id::flat_range_product(multi_id multi2) const
+{
+  auto res = isl_multi_id_flat_range_product(copy(), multi2.release());
+  return manage(res);
+}
+
+multi_id multi_id::flatten_range() const
+{
+  auto res = isl_multi_id_flatten_range(copy());
+  return manage(res);
+}
+
+multi_id multi_id::from_range() const
+{
+  auto res = isl_multi_id_from_range(copy());
+  return manage(res);
+}
+
+id multi_id::get_at(int pos) const
+{
+  auto res = isl_multi_id_get_at(get(), pos);
+  return manage(res);
+}
+
+space multi_id::get_domain_space() const
+{
+  auto res = isl_multi_id_get_domain_space(get());
+  return manage(res);
+}
+
+id multi_id::get_id(int pos) const
+{
+  auto res = isl_multi_id_get_id(get(), pos);
+  return manage(res);
+}
+
+id_list multi_id::get_list() const
+{
+  auto res = isl_multi_id_get_list(get());
+  return manage(res);
+}
+
+space multi_id::get_space() const
+{
+  auto res = isl_multi_id_get_space(get());
+  return manage(res);
+}
+
+boolean multi_id::plain_is_equal(const multi_id &multi2) const
+{
+  auto res = isl_multi_id_plain_is_equal(get(), multi2.get());
+  return manage(res);
+}
+
+multi_id multi_id::range_factor_domain() const
+{
+  auto res = isl_multi_id_range_factor_domain(copy());
+  return manage(res);
+}
+
+multi_id multi_id::range_factor_range() const
+{
+  auto res = isl_multi_id_range_factor_range(copy());
+  return manage(res);
+}
+
+boolean multi_id::range_is_wrapping() const
+{
+  auto res = isl_multi_id_range_is_wrapping(get());
+  return manage(res);
+}
+
+multi_id multi_id::range_product(multi_id multi2) const
+{
+  auto res = isl_multi_id_range_product(copy(), multi2.release());
+  return manage(res);
+}
+
+multi_id multi_id::range_splice(unsigned int pos, multi_id multi2) const
+{
+  auto res = isl_multi_id_range_splice(copy(), pos, multi2.release());
+  return manage(res);
+}
+
+multi_id multi_id::reset_user() const
+{
+  auto res = isl_multi_id_reset_user(copy());
+  return manage(res);
+}
+
+multi_id multi_id::set_at(int pos, id el) const
+{
+  auto res = isl_multi_id_set_at(copy(), pos, el.release());
+  return manage(res);
+}
+
+multi_id multi_id::set_id(int pos, id el) const
+{
+  auto res = isl_multi_id_set_id(copy(), pos, el.release());
+  return manage(res);
+}
+
+isl_size multi_id::size() const
+{
+  auto res = isl_multi_id_size(get());
+  return res;
+}
+
 // implementations for isl::multi_pw_aff
 multi_pw_aff manage(__isl_take isl_multi_pw_aff *ptr) {
   return multi_pw_aff(ptr);
@@ -9987,6 +10930,11 @@
 multi_pw_aff::multi_pw_aff(__isl_take isl_multi_pw_aff *ptr)
     : ptr(ptr) {}
 
+multi_pw_aff::multi_pw_aff(aff aff)
+{
+  auto res = isl_multi_pw_aff_from_aff(aff.release());
+  ptr = res;
+}
 multi_pw_aff::multi_pw_aff(multi_aff ma)
 {
   auto res = isl_multi_pw_aff_from_multi_aff(ma.release());
@@ -9997,6 +10945,11 @@
   auto res = isl_multi_pw_aff_from_pw_aff(pa.release());
   ptr = res;
 }
+multi_pw_aff::multi_pw_aff(space space, pw_aff_list list)
+{
+  auto res = isl_multi_pw_aff_from_pw_aff_list(space.release(), list.release());
+  ptr = res;
+}
 multi_pw_aff::multi_pw_aff(pw_multi_aff pma)
 {
   auto res = isl_multi_pw_aff_from_pw_multi_aff(pma.release());
@@ -10064,6 +11017,18 @@
   return manage(res);
 }
 
+multi_pw_aff multi_pw_aff::add_constant(multi_val mv) const
+{
+  auto res = isl_multi_pw_aff_add_constant_multi_val(copy(), mv.release());
+  return manage(res);
+}
+
+multi_pw_aff multi_pw_aff::add_constant(val v) const
+{
+  auto res = isl_multi_pw_aff_add_constant_val(copy(), v.release());
+  return manage(res);
+}
+
 multi_pw_aff multi_pw_aff::add_dims(isl::dim type, unsigned int n) const
 {
   auto res = isl_multi_pw_aff_add_dims(copy(), static_cast<enum isl_dim_type>(type), n);
@@ -10076,13 +11041,31 @@
   return manage(res);
 }
 
+set multi_pw_aff::bind(multi_id tuple) const
+{
+  auto res = isl_multi_pw_aff_bind(copy(), tuple.release());
+  return manage(res);
+}
+
+multi_pw_aff multi_pw_aff::bind_domain(multi_id tuple) const
+{
+  auto res = isl_multi_pw_aff_bind_domain(copy(), tuple.release());
+  return manage(res);
+}
+
+multi_pw_aff multi_pw_aff::bind_domain_wrapped_domain(multi_id tuple) const
+{
+  auto res = isl_multi_pw_aff_bind_domain_wrapped_domain(copy(), tuple.release());
+  return manage(res);
+}
+
 multi_pw_aff multi_pw_aff::coalesce() const
 {
   auto res = isl_multi_pw_aff_coalesce(copy());
   return manage(res);
 }
 
-unsigned int multi_pw_aff::dim(isl::dim type) const
+isl_size multi_pw_aff::dim(isl::dim type) const
 {
   auto res = isl_multi_pw_aff_dim(get(), static_cast<enum isl_dim_type>(type));
   return res;
@@ -10136,18 +11119,18 @@
   return manage(res);
 }
 
-multi_pw_aff multi_pw_aff::from_pw_aff_list(space space, pw_aff_list list)
-{
-  auto res = isl_multi_pw_aff_from_pw_aff_list(space.release(), list.release());
-  return manage(res);
-}
-
 multi_pw_aff multi_pw_aff::from_range() const
 {
   auto res = isl_multi_pw_aff_from_range(copy());
   return manage(res);
 }
 
+pw_aff multi_pw_aff::get_at(int pos) const
+{
+  auto res = isl_multi_pw_aff_get_at(get(), pos);
+  return manage(res);
+}
+
 id multi_pw_aff::get_dim_id(isl::dim type, unsigned int pos) const
 {
   auto res = isl_multi_pw_aff_get_dim_id(get(), static_cast<enum isl_dim_type>(type), pos);
@@ -10166,6 +11149,12 @@
   return res;
 }
 
+pw_aff_list multi_pw_aff::get_list() const
+{
+  auto res = isl_multi_pw_aff_get_list(get());
+  return manage(res);
+}
+
 pw_aff multi_pw_aff::get_pw_aff(int pos) const
 {
   auto res = isl_multi_pw_aff_get_pw_aff(get(), pos);
@@ -10215,12 +11204,30 @@
   return manage(res);
 }
 
+multi_pw_aff multi_pw_aff::identity() const
+{
+  auto res = isl_multi_pw_aff_identity_multi_pw_aff(copy());
+  return manage(res);
+}
+
+multi_pw_aff multi_pw_aff::identity_on_domain(space space)
+{
+  auto res = isl_multi_pw_aff_identity_on_domain_space(space.release());
+  return manage(res);
+}
+
 multi_pw_aff multi_pw_aff::insert_dims(isl::dim type, unsigned int first, unsigned int n) const
 {
   auto res = isl_multi_pw_aff_insert_dims(copy(), static_cast<enum isl_dim_type>(type), first, n);
   return manage(res);
 }
 
+multi_pw_aff multi_pw_aff::insert_domain(space domain) const
+{
+  auto res = isl_multi_pw_aff_insert_domain(copy(), domain.release());
+  return manage(res);
+}
+
 multi_pw_aff multi_pw_aff::intersect_domain(set domain) const
 {
   auto res = isl_multi_pw_aff_intersect_domain(copy(), domain.release());
@@ -10245,6 +11252,18 @@
   return manage(res);
 }
 
+boolean multi_pw_aff::involves_param(const id &id) const
+{
+  auto res = isl_multi_pw_aff_involves_param_id(get(), id.get());
+  return manage(res);
+}
+
+boolean multi_pw_aff::involves_param(const id_list &list) const
+{
+  auto res = isl_multi_pw_aff_involves_param_id_list(get(), list.get());
+  return manage(res);
+}
+
 boolean multi_pw_aff::is_cst() const
 {
   auto res = isl_multi_pw_aff_is_cst(get());
@@ -10257,18 +11276,54 @@
   return manage(res);
 }
 
+map multi_pw_aff::lex_ge_map(multi_pw_aff mpa2) const
+{
+  auto res = isl_multi_pw_aff_lex_ge_map(copy(), mpa2.release());
+  return manage(res);
+}
+
 map multi_pw_aff::lex_gt_map(multi_pw_aff mpa2) const
 {
   auto res = isl_multi_pw_aff_lex_gt_map(copy(), mpa2.release());
   return manage(res);
 }
 
+map multi_pw_aff::lex_le_map(multi_pw_aff mpa2) const
+{
+  auto res = isl_multi_pw_aff_lex_le_map(copy(), mpa2.release());
+  return manage(res);
+}
+
 map multi_pw_aff::lex_lt_map(multi_pw_aff mpa2) const
 {
   auto res = isl_multi_pw_aff_lex_lt_map(copy(), mpa2.release());
   return manage(res);
 }
 
+multi_pw_aff multi_pw_aff::max(multi_pw_aff multi2) const
+{
+  auto res = isl_multi_pw_aff_max(copy(), multi2.release());
+  return manage(res);
+}
+
+multi_val multi_pw_aff::max_multi_val() const
+{
+  auto res = isl_multi_pw_aff_max_multi_val(copy());
+  return manage(res);
+}
+
+multi_pw_aff multi_pw_aff::min(multi_pw_aff multi2) const
+{
+  auto res = isl_multi_pw_aff_min(copy(), multi2.release());
+  return manage(res);
+}
+
+multi_val multi_pw_aff::min_multi_val() const
+{
+  auto res = isl_multi_pw_aff_min_multi_val(copy());
+  return manage(res);
+}
+
 multi_pw_aff multi_pw_aff::mod_multi_val(multi_val mv) const
 {
   auto res = isl_multi_pw_aff_mod_multi_val(copy(), mv.release());
@@ -10311,18 +11366,18 @@
   return manage(res);
 }
 
-multi_pw_aff multi_pw_aff::pullback(pw_multi_aff pma) const
-{
-  auto res = isl_multi_pw_aff_pullback_pw_multi_aff(copy(), pma.release());
-  return manage(res);
-}
-
 multi_pw_aff multi_pw_aff::pullback(multi_pw_aff mpa2) const
 {
   auto res = isl_multi_pw_aff_pullback_multi_pw_aff(copy(), mpa2.release());
   return manage(res);
 }
 
+multi_pw_aff multi_pw_aff::pullback(pw_multi_aff pma) const
+{
+  auto res = isl_multi_pw_aff_pullback_pw_multi_aff(copy(), pma.release());
+  return manage(res);
+}
+
 multi_pw_aff multi_pw_aff::range_factor_domain() const
 {
   auto res = isl_multi_pw_aff_range_factor_domain(copy());
@@ -10365,30 +11420,36 @@
   return manage(res);
 }
 
-multi_pw_aff multi_pw_aff::scale_down_multi_val(multi_val mv) const
-{
-  auto res = isl_multi_pw_aff_scale_down_multi_val(copy(), mv.release());
-  return manage(res);
-}
-
-multi_pw_aff multi_pw_aff::scale_down_val(val v) const
-{
-  auto res = isl_multi_pw_aff_scale_down_val(copy(), v.release());
-  return manage(res);
-}
-
-multi_pw_aff multi_pw_aff::scale_multi_val(multi_val mv) const
+multi_pw_aff multi_pw_aff::scale(multi_val mv) const
 {
   auto res = isl_multi_pw_aff_scale_multi_val(copy(), mv.release());
   return manage(res);
 }
 
-multi_pw_aff multi_pw_aff::scale_val(val v) const
+multi_pw_aff multi_pw_aff::scale(val v) const
 {
   auto res = isl_multi_pw_aff_scale_val(copy(), v.release());
   return manage(res);
 }
 
+multi_pw_aff multi_pw_aff::scale_down(multi_val mv) const
+{
+  auto res = isl_multi_pw_aff_scale_down_multi_val(copy(), mv.release());
+  return manage(res);
+}
+
+multi_pw_aff multi_pw_aff::scale_down(val v) const
+{
+  auto res = isl_multi_pw_aff_scale_down_val(copy(), v.release());
+  return manage(res);
+}
+
+multi_pw_aff multi_pw_aff::set_at(int pos, pw_aff el) const
+{
+  auto res = isl_multi_pw_aff_set_at(copy(), pos, el.release());
+  return manage(res);
+}
+
 multi_pw_aff multi_pw_aff::set_dim_id(isl::dim type, unsigned int pos, id id) const
 {
   auto res = isl_multi_pw_aff_set_dim_id(copy(), static_cast<enum isl_dim_type>(type), pos, id.release());
@@ -10413,6 +11474,12 @@
   return manage(res);
 }
 
+isl_size multi_pw_aff::size() const
+{
+  auto res = isl_multi_pw_aff_size(get());
+  return res;
+}
+
 multi_pw_aff multi_pw_aff::splice(unsigned int in_pos, unsigned int out_pos, multi_pw_aff multi2) const
 {
   auto res = isl_multi_pw_aff_splice(copy(), in_pos, out_pos, multi2.release());
@@ -10425,6 +11492,18 @@
   return manage(res);
 }
 
+multi_pw_aff multi_pw_aff::unbind_params_insert_domain(multi_id domain) const
+{
+  auto res = isl_multi_pw_aff_unbind_params_insert_domain(copy(), domain.release());
+  return manage(res);
+}
+
+multi_pw_aff multi_pw_aff::union_add(multi_pw_aff mpa2) const
+{
+  auto res = isl_multi_pw_aff_union_add(copy(), mpa2.release());
+  return manage(res);
+}
+
 multi_pw_aff multi_pw_aff::zero(space space)
 {
   auto res = isl_multi_pw_aff_zero(space.release());
@@ -10455,14 +11534,19 @@
 multi_union_pw_aff::multi_union_pw_aff(__isl_take isl_multi_union_pw_aff *ptr)
     : ptr(ptr) {}
 
+multi_union_pw_aff::multi_union_pw_aff(multi_pw_aff mpa)
+{
+  auto res = isl_multi_union_pw_aff_from_multi_pw_aff(mpa.release());
+  ptr = res;
+}
 multi_union_pw_aff::multi_union_pw_aff(union_pw_aff upa)
 {
   auto res = isl_multi_union_pw_aff_from_union_pw_aff(upa.release());
   ptr = res;
 }
-multi_union_pw_aff::multi_union_pw_aff(multi_pw_aff mpa)
+multi_union_pw_aff::multi_union_pw_aff(space space, union_pw_aff_list list)
 {
-  auto res = isl_multi_union_pw_aff_from_multi_pw_aff(mpa.release());
+  auto res = isl_multi_union_pw_aff_from_union_pw_aff_list(space.release(), list.release());
   ptr = res;
 }
 multi_union_pw_aff::multi_union_pw_aff(union_pw_multi_aff upma)
@@ -10556,13 +11640,19 @@
   return manage(res);
 }
 
+union_set multi_union_pw_aff::bind(multi_id tuple) const
+{
+  auto res = isl_multi_union_pw_aff_bind(copy(), tuple.release());
+  return manage(res);
+}
+
 multi_union_pw_aff multi_union_pw_aff::coalesce() const
 {
   auto res = isl_multi_union_pw_aff_coalesce(copy());
   return manage(res);
 }
 
-unsigned int multi_union_pw_aff::dim(isl::dim type) const
+isl_size multi_union_pw_aff::dim(isl::dim type) const
 {
   auto res = isl_multi_union_pw_aff_dim(get(), static_cast<enum isl_dim_type>(type));
   return res;
@@ -10640,9 +11730,9 @@
   return manage(res);
 }
 
-multi_union_pw_aff multi_union_pw_aff::from_union_pw_aff_list(space space, union_pw_aff_list list)
+union_pw_aff multi_union_pw_aff::get_at(int pos) const
 {
-  auto res = isl_multi_union_pw_aff_from_union_pw_aff_list(space.release(), list.release());
+  auto res = isl_multi_union_pw_aff_get_at(get(), pos);
   return manage(res);
 }
 
@@ -10658,6 +11748,12 @@
   return manage(res);
 }
 
+union_pw_aff_list multi_union_pw_aff::get_list() const
+{
+  auto res = isl_multi_union_pw_aff_get_list(get());
+  return manage(res);
+}
+
 space multi_union_pw_aff::get_space() const
 {
   auto res = isl_multi_union_pw_aff_get_space(get());
@@ -10821,30 +11917,36 @@
   return manage(res);
 }
 
-multi_union_pw_aff multi_union_pw_aff::scale_down_multi_val(multi_val mv) const
-{
-  auto res = isl_multi_union_pw_aff_scale_down_multi_val(copy(), mv.release());
-  return manage(res);
-}
-
-multi_union_pw_aff multi_union_pw_aff::scale_down_val(val v) const
-{
-  auto res = isl_multi_union_pw_aff_scale_down_val(copy(), v.release());
-  return manage(res);
-}
-
-multi_union_pw_aff multi_union_pw_aff::scale_multi_val(multi_val mv) const
+multi_union_pw_aff multi_union_pw_aff::scale(multi_val mv) const
 {
   auto res = isl_multi_union_pw_aff_scale_multi_val(copy(), mv.release());
   return manage(res);
 }
 
-multi_union_pw_aff multi_union_pw_aff::scale_val(val v) const
+multi_union_pw_aff multi_union_pw_aff::scale(val v) const
 {
   auto res = isl_multi_union_pw_aff_scale_val(copy(), v.release());
   return manage(res);
 }
 
+multi_union_pw_aff multi_union_pw_aff::scale_down(multi_val mv) const
+{
+  auto res = isl_multi_union_pw_aff_scale_down_multi_val(copy(), mv.release());
+  return manage(res);
+}
+
+multi_union_pw_aff multi_union_pw_aff::scale_down(val v) const
+{
+  auto res = isl_multi_union_pw_aff_scale_down_val(copy(), v.release());
+  return manage(res);
+}
+
+multi_union_pw_aff multi_union_pw_aff::set_at(int pos, union_pw_aff el) const
+{
+  auto res = isl_multi_union_pw_aff_set_at(copy(), pos, el.release());
+  return manage(res);
+}
+
 multi_union_pw_aff multi_union_pw_aff::set_dim_id(isl::dim type, unsigned int pos, id id) const
 {
   auto res = isl_multi_union_pw_aff_set_dim_id(copy(), static_cast<enum isl_dim_type>(type), pos, id.release());
@@ -10869,6 +11971,12 @@
   return manage(res);
 }
 
+isl_size multi_union_pw_aff::size() const
+{
+  auto res = isl_multi_union_pw_aff_size(get());
+  return res;
+}
+
 multi_union_pw_aff multi_union_pw_aff::sub(multi_union_pw_aff multi2) const
 {
   auto res = isl_multi_union_pw_aff_sub(copy(), multi2.release());
@@ -10917,6 +12025,16 @@
 multi_val::multi_val(__isl_take isl_multi_val *ptr)
     : ptr(ptr) {}
 
+multi_val::multi_val(space space, val_list list)
+{
+  auto res = isl_multi_val_from_val_list(space.release(), list.release());
+  ptr = res;
+}
+multi_val::multi_val(ctx ctx, const std::string &str)
+{
+  auto res = isl_multi_val_read_from_str(ctx.release(), str.c_str());
+  ptr = res;
+}
 
 multi_val &multi_val::operator=(multi_val obj) {
   std::swap(this->ptr, obj.ptr);
@@ -10974,15 +12092,15 @@
   return manage(res);
 }
 
-multi_val multi_val::add_dims(isl::dim type, unsigned int n) const
+multi_val multi_val::add(val v) const
 {
-  auto res = isl_multi_val_add_dims(copy(), static_cast<enum isl_dim_type>(type), n);
+  auto res = isl_multi_val_add_val(copy(), v.release());
   return manage(res);
 }
 
-multi_val multi_val::add_val(val v) const
+multi_val multi_val::add_dims(isl::dim type, unsigned int n) const
 {
-  auto res = isl_multi_val_add_val(copy(), v.release());
+  auto res = isl_multi_val_add_dims(copy(), static_cast<enum isl_dim_type>(type), n);
   return manage(res);
 }
 
@@ -10992,7 +12110,7 @@
   return manage(res);
 }
 
-unsigned int multi_val::dim(isl::dim type) const
+isl_size multi_val::dim(isl::dim type) const
 {
   auto res = isl_multi_val_dim(get(), static_cast<enum isl_dim_type>(type));
   return res;
@@ -11040,9 +12158,9 @@
   return manage(res);
 }
 
-multi_val multi_val::from_val_list(space space, val_list list)
+val multi_val::get_at(int pos) const
 {
-  auto res = isl_multi_val_from_val_list(space.release(), list.release());
+  auto res = isl_multi_val_get_at(get(), pos);
   return manage(res);
 }
 
@@ -11058,6 +12176,12 @@
   return manage(res);
 }
 
+val_list multi_val::get_list() const
+{
+  auto res = isl_multi_val_get_list(get());
+  return manage(res);
+}
+
 space multi_val::get_space() const
 {
   auto res = isl_multi_val_get_space(get());
@@ -11107,6 +12231,24 @@
   return manage(res);
 }
 
+boolean multi_val::is_zero() const
+{
+  auto res = isl_multi_val_is_zero(get());
+  return manage(res);
+}
+
+multi_val multi_val::max(multi_val multi2) const
+{
+  auto res = isl_multi_val_max(copy(), multi2.release());
+  return manage(res);
+}
+
+multi_val multi_val::min(multi_val multi2) const
+{
+  auto res = isl_multi_val_min(copy(), multi2.release());
+  return manage(res);
+}
+
 multi_val multi_val::mod_multi_val(multi_val mv) const
 {
   auto res = isl_multi_val_mod_multi_val(copy(), mv.release());
@@ -11173,12 +12315,6 @@
   return manage(res);
 }
 
-multi_val multi_val::read_from_str(ctx ctx, const std::string &str)
-{
-  auto res = isl_multi_val_read_from_str(ctx.release(), str.c_str());
-  return manage(res);
-}
-
 multi_val multi_val::reset_tuple_id(isl::dim type) const
 {
   auto res = isl_multi_val_reset_tuple_id(copy(), static_cast<enum isl_dim_type>(type));
@@ -11191,30 +12327,36 @@
   return manage(res);
 }
 
-multi_val multi_val::scale_down_multi_val(multi_val mv) const
-{
-  auto res = isl_multi_val_scale_down_multi_val(copy(), mv.release());
-  return manage(res);
-}
-
-multi_val multi_val::scale_down_val(val v) const
-{
-  auto res = isl_multi_val_scale_down_val(copy(), v.release());
-  return manage(res);
-}
-
-multi_val multi_val::scale_multi_val(multi_val mv) const
+multi_val multi_val::scale(multi_val mv) const
 {
   auto res = isl_multi_val_scale_multi_val(copy(), mv.release());
   return manage(res);
 }
 
-multi_val multi_val::scale_val(val v) const
+multi_val multi_val::scale(val v) const
 {
   auto res = isl_multi_val_scale_val(copy(), v.release());
   return manage(res);
 }
 
+multi_val multi_val::scale_down(multi_val mv) const
+{
+  auto res = isl_multi_val_scale_down_multi_val(copy(), mv.release());
+  return manage(res);
+}
+
+multi_val multi_val::scale_down(val v) const
+{
+  auto res = isl_multi_val_scale_down_val(copy(), v.release());
+  return manage(res);
+}
+
+multi_val multi_val::set_at(int pos, val el) const
+{
+  auto res = isl_multi_val_set_at(copy(), pos, el.release());
+  return manage(res);
+}
+
 multi_val multi_val::set_dim_id(isl::dim type, unsigned int pos, id id) const
 {
   auto res = isl_multi_val_set_dim_id(copy(), static_cast<enum isl_dim_type>(type), pos, id.release());
@@ -11239,6 +12381,12 @@
   return manage(res);
 }
 
+isl_size multi_val::size() const
+{
+  auto res = isl_multi_val_size(get());
+  return res;
+}
+
 multi_val multi_val::splice(unsigned int in_pos, unsigned int out_pos, multi_val multi2) const
 {
   auto res = isl_multi_val_splice(copy(), in_pos, out_pos, multi2.release());
@@ -11349,6 +12497,12 @@
   return manage(res);
 }
 
+multi_val point::get_multi_val() const
+{
+  auto res = isl_point_get_multi_val(get());
+  return manage(res);
+}
+
 space point::get_space() const
 {
   auto res = isl_point_get_space(get());
@@ -11396,9 +12550,9 @@
   auto res = isl_pw_aff_from_aff(aff.release());
   ptr = res;
 }
-pw_aff::pw_aff(local_space ls)
+pw_aff::pw_aff(ctx ctx, const std::string &str)
 {
-  auto res = isl_pw_aff_zero_on_domain(ls.release());
+  auto res = isl_pw_aff_read_from_str(ctx.release(), str.c_str());
   ptr = res;
 }
 pw_aff::pw_aff(set domain, val v)
@@ -11406,9 +12560,9 @@
   auto res = isl_pw_aff_val_on_domain(domain.release(), v.release());
   ptr = res;
 }
-pw_aff::pw_aff(ctx ctx, const std::string &str)
+pw_aff::pw_aff(local_space ls)
 {
-  auto res = isl_pw_aff_read_from_str(ctx.release(), str.c_str());
+  auto res = isl_pw_aff_zero_on_domain(ls.release());
   ptr = res;
 }
 
@@ -11468,6 +12622,12 @@
   return manage(res);
 }
 
+pw_aff pw_aff::add_constant(val v) const
+{
+  auto res = isl_pw_aff_add_constant_val(copy(), v.release());
+  return manage(res);
+}
+
 pw_aff pw_aff::add_dims(isl::dim type, unsigned int n) const
 {
   auto res = isl_pw_aff_add_dims(copy(), static_cast<enum isl_dim_type>(type), n);
@@ -11486,6 +12646,30 @@
   return manage(res);
 }
 
+aff pw_aff::as_aff() const
+{
+  auto res = isl_pw_aff_as_aff(copy());
+  return manage(res);
+}
+
+set pw_aff::bind(id id) const
+{
+  auto res = isl_pw_aff_bind_id(copy(), id.release());
+  return manage(res);
+}
+
+pw_aff pw_aff::bind_domain(multi_id tuple) const
+{
+  auto res = isl_pw_aff_bind_domain(copy(), tuple.release());
+  return manage(res);
+}
+
+pw_aff pw_aff::bind_domain_wrapped_domain(multi_id tuple) const
+{
+  auto res = isl_pw_aff_bind_domain_wrapped_domain(copy(), tuple.release());
+  return manage(res);
+}
+
 pw_aff pw_aff::ceil() const
 {
   auto res = isl_pw_aff_ceil(copy());
@@ -11504,7 +12688,7 @@
   return manage(res);
 }
 
-unsigned int pw_aff::dim(isl::dim type) const
+isl_size pw_aff::dim(isl::dim type) const
 {
   auto res = isl_pw_aff_dim(get(), static_cast<enum isl_dim_type>(type));
   return res;
@@ -11534,9 +12718,9 @@
   return manage(res);
 }
 
-pw_aff pw_aff::empty(space dim)
+pw_aff pw_aff::empty(space space)
 {
-  auto res = isl_pw_aff_empty(dim.release());
+  auto res = isl_pw_aff_empty(space.release());
   return manage(res);
 }
 
@@ -11590,6 +12774,12 @@
   return manage(res);
 }
 
+map pw_aff::ge_map(pw_aff pa2) const
+{
+  auto res = isl_pw_aff_ge_map(copy(), pa2.release());
+  return manage(res);
+}
+
 set pw_aff::ge_set(pw_aff pwaff2) const
 {
   auto res = isl_pw_aff_ge_set(copy(), pwaff2.release());
@@ -11675,12 +12865,30 @@
   return manage(res);
 }
 
+pw_aff pw_aff::insert_domain(space domain) const
+{
+  auto res = isl_pw_aff_insert_domain(copy(), domain.release());
+  return manage(res);
+}
+
 pw_aff pw_aff::intersect_domain(set set) const
 {
   auto res = isl_pw_aff_intersect_domain(copy(), set.release());
   return manage(res);
 }
 
+pw_aff pw_aff::intersect_domain_wrapped_domain(set set) const
+{
+  auto res = isl_pw_aff_intersect_domain_wrapped_domain(copy(), set.release());
+  return manage(res);
+}
+
+pw_aff pw_aff::intersect_domain_wrapped_range(set set) const
+{
+  auto res = isl_pw_aff_intersect_domain_wrapped_range(copy(), set.release());
+  return manage(res);
+}
+
 pw_aff pw_aff::intersect_params(set set) const
 {
   auto res = isl_pw_aff_intersect_params(copy(), set.release());
@@ -11699,6 +12907,12 @@
   return manage(res);
 }
 
+boolean pw_aff::involves_param_id(const id &id) const
+{
+  auto res = isl_pw_aff_involves_param_id(get(), id.get());
+  return manage(res);
+}
+
 boolean pw_aff::is_cst() const
 {
   auto res = isl_pw_aff_is_cst(get());
@@ -11717,6 +12931,18 @@
   return manage(res);
 }
 
+boolean pw_aff::isa_aff() const
+{
+  auto res = isl_pw_aff_isa_aff(get());
+  return manage(res);
+}
+
+map pw_aff::le_map(pw_aff pa2) const
+{
+  auto res = isl_pw_aff_le_map(copy(), pa2.release());
+  return manage(res);
+}
+
 set pw_aff::le_set(pw_aff pwaff2) const
 {
   auto res = isl_pw_aff_le_set(copy(), pwaff2.release());
@@ -11765,7 +12991,7 @@
   return manage(res);
 }
 
-int pw_aff::n_piece() const
+isl_size pw_aff::n_piece() const
 {
   auto res = isl_pw_aff_n_piece(get());
   return res;
@@ -11777,6 +13003,12 @@
   return manage(res);
 }
 
+pw_aff pw_aff::nan_on_domain_space(space space)
+{
+  auto res = isl_pw_aff_nan_on_domain_space(space.release());
+  return manage(res);
+}
+
 set pw_aff::ne_set(pw_aff pwaff2) const
 {
   auto res = isl_pw_aff_ne_set(copy(), pwaff2.release());
@@ -11801,6 +13033,12 @@
   return manage(res);
 }
 
+pw_aff pw_aff::param_on_domain(set domain, id id)
+{
+  auto res = isl_pw_aff_param_on_domain_id(domain.release(), id.release());
+  return manage(res);
+}
+
 set pw_aff::params() const
 {
   auto res = isl_pw_aff_params(copy());
@@ -11837,18 +13075,18 @@
   return manage(res);
 }
 
-pw_aff pw_aff::pullback(pw_multi_aff pma) const
-{
-  auto res = isl_pw_aff_pullback_pw_multi_aff(copy(), pma.release());
-  return manage(res);
-}
-
 pw_aff pw_aff::pullback(multi_pw_aff mpa) const
 {
   auto res = isl_pw_aff_pullback_multi_pw_aff(copy(), mpa.release());
   return manage(res);
 }
 
+pw_aff pw_aff::pullback(pw_multi_aff pma) const
+{
+  auto res = isl_pw_aff_pullback_pw_multi_aff(copy(), pma.release());
+  return manage(res);
+}
+
 pw_aff pw_aff::reset_tuple_id(isl::dim type) const
 {
   auto res = isl_pw_aff_reset_tuple_id(copy(), static_cast<enum isl_dim_type>(type));
@@ -11999,6 +13237,15 @@
 ctx pw_aff_list::get_ctx() const {
   return ctx(isl_pw_aff_list_get_ctx(ptr));
 }
+std::string pw_aff_list::to_str() const {
+  char *Tmp = isl_pw_aff_list_to_str(get());
+  if (!Tmp)
+    return "";
+  std::string S(Tmp);
+  free(Tmp);
+  return S;
+}
+
 
 void pw_aff_list::dump() const {
   isl_pw_aff_list_dump(get());
@@ -12017,6 +13264,12 @@
   return manage(res);
 }
 
+pw_aff_list pw_aff_list::clear() const
+{
+  auto res = isl_pw_aff_list_clear(copy());
+  return manage(res);
+}
+
 pw_aff_list pw_aff_list::concat(pw_aff_list list2) const
 {
   auto res = isl_pw_aff_list_concat(copy(), list2.release());
@@ -12109,7 +13362,7 @@
   return manage(res);
 }
 
-int pw_aff_list::n_pw_aff() const
+isl_size pw_aff_list::n_pw_aff() const
 {
   auto res = isl_pw_aff_list_n_pw_aff(get());
   return res;
@@ -12133,7 +13386,7 @@
   return manage(res);
 }
 
-int pw_aff_list::size() const
+isl_size pw_aff_list::size() const
 {
   auto res = isl_pw_aff_list_size(get());
   return res;
@@ -12241,6 +13494,18 @@
   return manage(res);
 }
 
+pw_multi_aff pw_multi_aff::add_constant(multi_val mv) const
+{
+  auto res = isl_pw_multi_aff_add_constant_multi_val(copy(), mv.release());
+  return manage(res);
+}
+
+pw_multi_aff pw_multi_aff::add_constant(val v) const
+{
+  auto res = isl_pw_multi_aff_add_constant_val(copy(), v.release());
+  return manage(res);
+}
+
 pw_multi_aff pw_multi_aff::align_params(space model) const
 {
   auto res = isl_pw_multi_aff_align_params(copy(), model.release());
@@ -12253,13 +13518,31 @@
   return manage(res);
 }
 
+multi_aff pw_multi_aff::as_multi_aff() const
+{
+  auto res = isl_pw_multi_aff_as_multi_aff(copy());
+  return manage(res);
+}
+
+pw_multi_aff pw_multi_aff::bind_domain(multi_id tuple) const
+{
+  auto res = isl_pw_multi_aff_bind_domain(copy(), tuple.release());
+  return manage(res);
+}
+
+pw_multi_aff pw_multi_aff::bind_domain_wrapped_domain(multi_id tuple) const
+{
+  auto res = isl_pw_multi_aff_bind_domain_wrapped_domain(copy(), tuple.release());
+  return manage(res);
+}
+
 pw_multi_aff pw_multi_aff::coalesce() const
 {
   auto res = isl_pw_multi_aff_coalesce(copy());
   return manage(res);
 }
 
-unsigned int pw_multi_aff::dim(isl::dim type) const
+isl_size pw_multi_aff::dim(isl::dim type) const
 {
   auto res = isl_pw_multi_aff_dim(get(), static_cast<enum isl_dim_type>(type));
   return res;
@@ -12271,6 +13554,12 @@
   return manage(res);
 }
 
+pw_multi_aff pw_multi_aff::domain_map(space space)
+{
+  auto res = isl_pw_multi_aff_domain_map(space.release());
+  return manage(res);
+}
+
 pw_multi_aff pw_multi_aff::drop_dims(isl::dim type, unsigned int first, unsigned int n) const
 {
   auto res = isl_pw_multi_aff_drop_dims(copy(), static_cast<enum isl_dim_type>(type), first, n);
@@ -12419,12 +13708,36 @@
   return manage(res);
 }
 
+pw_multi_aff pw_multi_aff::identity_on_domain(space space)
+{
+  auto res = isl_pw_multi_aff_identity_on_domain_space(space.release());
+  return manage(res);
+}
+
+pw_multi_aff pw_multi_aff::insert_domain(space domain) const
+{
+  auto res = isl_pw_multi_aff_insert_domain(copy(), domain.release());
+  return manage(res);
+}
+
 pw_multi_aff pw_multi_aff::intersect_domain(set set) const
 {
   auto res = isl_pw_multi_aff_intersect_domain(copy(), set.release());
   return manage(res);
 }
 
+pw_multi_aff pw_multi_aff::intersect_domain_wrapped_domain(set set) const
+{
+  auto res = isl_pw_multi_aff_intersect_domain_wrapped_domain(copy(), set.release());
+  return manage(res);
+}
+
+pw_multi_aff pw_multi_aff::intersect_domain_wrapped_range(set set) const
+{
+  auto res = isl_pw_multi_aff_intersect_domain_wrapped_range(copy(), set.release());
+  return manage(res);
+}
+
 pw_multi_aff pw_multi_aff::intersect_params(set set) const
 {
   auto res = isl_pw_multi_aff_intersect_params(copy(), set.release());
@@ -12437,25 +13750,55 @@
   return manage(res);
 }
 
+boolean pw_multi_aff::involves_locals() const
+{
+  auto res = isl_pw_multi_aff_involves_locals(get());
+  return manage(res);
+}
+
 boolean pw_multi_aff::involves_nan() const
 {
   auto res = isl_pw_multi_aff_involves_nan(get());
   return manage(res);
 }
 
+boolean pw_multi_aff::involves_param_id(const id &id) const
+{
+  auto res = isl_pw_multi_aff_involves_param_id(get(), id.get());
+  return manage(res);
+}
+
 boolean pw_multi_aff::is_equal(const pw_multi_aff &pma2) const
 {
   auto res = isl_pw_multi_aff_is_equal(get(), pma2.get());
   return manage(res);
 }
 
+boolean pw_multi_aff::isa_multi_aff() const
+{
+  auto res = isl_pw_multi_aff_isa_multi_aff(get());
+  return manage(res);
+}
+
+multi_val pw_multi_aff::max_multi_val() const
+{
+  auto res = isl_pw_multi_aff_max_multi_val(copy());
+  return manage(res);
+}
+
+multi_val pw_multi_aff::min_multi_val() const
+{
+  auto res = isl_pw_multi_aff_min_multi_val(copy());
+  return manage(res);
+}
+
 pw_multi_aff pw_multi_aff::multi_val_on_domain(set domain, multi_val mv)
 {
   auto res = isl_pw_multi_aff_multi_val_on_domain(domain.release(), mv.release());
   return manage(res);
 }
 
-int pw_multi_aff::n_piece() const
+isl_size pw_multi_aff::n_piece() const
 {
   auto res = isl_pw_multi_aff_n_piece(get());
   return res;
@@ -12473,6 +13816,12 @@
   return manage(res);
 }
 
+pw_multi_aff pw_multi_aff::preimage_domain_wrapped_domain(pw_multi_aff pma2) const
+{
+  auto res = isl_pw_multi_aff_preimage_domain_wrapped_domain_pw_multi_aff(copy(), pma2.release());
+  return manage(res);
+}
+
 pw_multi_aff pw_multi_aff::product(pw_multi_aff pma2) const
 {
   auto res = isl_pw_multi_aff_product(copy(), pma2.release());
@@ -12503,6 +13852,18 @@
   return manage(res);
 }
 
+pw_multi_aff pw_multi_aff::range_factor_domain() const
+{
+  auto res = isl_pw_multi_aff_range_factor_domain(copy());
+  return manage(res);
+}
+
+pw_multi_aff pw_multi_aff::range_factor_range() const
+{
+  auto res = isl_pw_multi_aff_range_factor_range(copy());
+  return manage(res);
+}
+
 pw_multi_aff pw_multi_aff::range_map(space space)
 {
   auto res = isl_pw_multi_aff_range_map(space.release());
@@ -12527,7 +13888,13 @@
   return manage(res);
 }
 
-pw_multi_aff pw_multi_aff::scale_down_val(val v) const
+pw_multi_aff pw_multi_aff::scale(val v) const
+{
+  auto res = isl_pw_multi_aff_scale_val(copy(), v.release());
+  return manage(res);
+}
+
+pw_multi_aff pw_multi_aff::scale_down(val v) const
 {
   auto res = isl_pw_multi_aff_scale_down_val(copy(), v.release());
   return manage(res);
@@ -12539,12 +13906,6 @@
   return manage(res);
 }
 
-pw_multi_aff pw_multi_aff::scale_val(val v) const
-{
-  auto res = isl_pw_multi_aff_scale_val(copy(), v.release());
-  return manage(res);
-}
-
 pw_multi_aff pw_multi_aff::set_dim_id(isl::dim type, unsigned int pos, id id) const
 {
   auto res = isl_pw_multi_aff_set_dim_id(copy(), static_cast<enum isl_dim_type>(type), pos, id.release());
@@ -12659,6 +14020,15 @@
 ctx pw_multi_aff_list::get_ctx() const {
   return ctx(isl_pw_multi_aff_list_get_ctx(ptr));
 }
+std::string pw_multi_aff_list::to_str() const {
+  char *Tmp = isl_pw_multi_aff_list_to_str(get());
+  if (!Tmp)
+    return "";
+  std::string S(Tmp);
+  free(Tmp);
+  return S;
+}
+
 
 void pw_multi_aff_list::dump() const {
   isl_pw_multi_aff_list_dump(get());
@@ -12677,6 +14047,12 @@
   return manage(res);
 }
 
+pw_multi_aff_list pw_multi_aff_list::clear() const
+{
+  auto res = isl_pw_multi_aff_list_clear(copy());
+  return manage(res);
+}
+
 pw_multi_aff_list pw_multi_aff_list::concat(pw_multi_aff_list list2) const
 {
   auto res = isl_pw_multi_aff_list_concat(copy(), list2.release());
@@ -12727,7 +14103,7 @@
   return manage(res);
 }
 
-int pw_multi_aff_list::n_pw_multi_aff() const
+isl_size pw_multi_aff_list::n_pw_multi_aff() const
 {
   auto res = isl_pw_multi_aff_list_n_pw_multi_aff(get());
   return res;
@@ -12745,7 +14121,7 @@
   return manage(res);
 }
 
-int pw_multi_aff_list::size() const
+isl_size pw_multi_aff_list::size() const
 {
   auto res = isl_pw_multi_aff_list_size(get());
   return res;
@@ -12855,13 +14231,19 @@
   return manage(res);
 }
 
+qpolynomial pw_qpolynomial::as_qpolynomial() const
+{
+  auto res = isl_pw_qpolynomial_as_qpolynomial(copy());
+  return manage(res);
+}
+
 pw_qpolynomial pw_qpolynomial::coalesce() const
 {
   auto res = isl_pw_qpolynomial_coalesce(copy());
   return manage(res);
 }
 
-unsigned int pw_qpolynomial::dim(isl::dim type) const
+isl_size pw_qpolynomial::dim(isl::dim type) const
 {
   auto res = isl_pw_qpolynomial_dim(get(), static_cast<enum isl_dim_type>(type));
   return res;
@@ -12977,6 +14359,18 @@
   return manage(res);
 }
 
+pw_qpolynomial pw_qpolynomial::intersect_domain_wrapped_domain(set set) const
+{
+  auto res = isl_pw_qpolynomial_intersect_domain_wrapped_domain(copy(), set.release());
+  return manage(res);
+}
+
+pw_qpolynomial pw_qpolynomial::intersect_domain_wrapped_range(set set) const
+{
+  auto res = isl_pw_qpolynomial_intersect_domain_wrapped_range(copy(), set.release());
+  return manage(res);
+}
+
 pw_qpolynomial pw_qpolynomial::intersect_params(set set) const
 {
   auto res = isl_pw_qpolynomial_intersect_params(copy(), set.release());
@@ -12995,12 +14389,24 @@
   return manage(res);
 }
 
+boolean pw_qpolynomial::involves_param_id(const id &id) const
+{
+  auto res = isl_pw_qpolynomial_involves_param_id(get(), id.get());
+  return manage(res);
+}
+
 boolean pw_qpolynomial::is_zero() const
 {
   auto res = isl_pw_qpolynomial_is_zero(get());
   return manage(res);
 }
 
+boolean pw_qpolynomial::isa_qpolynomial() const
+{
+  auto res = isl_pw_qpolynomial_isa_qpolynomial(get());
+  return manage(res);
+}
+
 val pw_qpolynomial::max() const
 {
   auto res = isl_pw_qpolynomial_max(copy());
@@ -13025,7 +14431,7 @@
   return manage(res);
 }
 
-int pw_qpolynomial::n_piece() const
+isl_size pw_qpolynomial::n_piece() const
 {
   auto res = isl_pw_qpolynomial_n_piece(get());
   return res;
@@ -13055,9 +14461,9 @@
   return manage(res);
 }
 
-pw_qpolynomial pw_qpolynomial::reset_domain_space(space dim) const
+pw_qpolynomial pw_qpolynomial::reset_domain_space(space space) const
 {
-  auto res = isl_pw_qpolynomial_reset_domain_space(copy(), dim.release());
+  auto res = isl_pw_qpolynomial_reset_domain_space(copy(), space.release());
   return manage(res);
 }
 
@@ -13109,9 +14515,9 @@
   return manage(res);
 }
 
-pw_qpolynomial pw_qpolynomial::zero(space dim)
+pw_qpolynomial pw_qpolynomial::zero(space space)
 {
-  auto res = isl_pw_qpolynomial_zero(dim.release());
+  auto res = isl_pw_qpolynomial_zero(space.release());
   return manage(res);
 }
 
@@ -13175,6 +14581,15 @@
 ctx pw_qpolynomial_fold_list::get_ctx() const {
   return ctx(isl_pw_qpolynomial_fold_list_get_ctx(ptr));
 }
+std::string pw_qpolynomial_fold_list::to_str() const {
+  char *Tmp = isl_pw_qpolynomial_fold_list_to_str(get());
+  if (!Tmp)
+    return "";
+  std::string S(Tmp);
+  free(Tmp);
+  return S;
+}
+
 
 void pw_qpolynomial_fold_list::dump() const {
   isl_pw_qpolynomial_fold_list_dump(get());
@@ -13242,6 +14657,15 @@
 ctx pw_qpolynomial_list::get_ctx() const {
   return ctx(isl_pw_qpolynomial_list_get_ctx(ptr));
 }
+std::string pw_qpolynomial_list::to_str() const {
+  char *Tmp = isl_pw_qpolynomial_list_to_str(get());
+  if (!Tmp)
+    return "";
+  std::string S(Tmp);
+  free(Tmp);
+  return S;
+}
+
 
 void pw_qpolynomial_list::dump() const {
   isl_pw_qpolynomial_list_dump(get());
@@ -13260,6 +14684,12 @@
   return manage(res);
 }
 
+pw_qpolynomial_list pw_qpolynomial_list::clear() const
+{
+  auto res = isl_pw_qpolynomial_list_clear(copy());
+  return manage(res);
+}
+
 pw_qpolynomial_list pw_qpolynomial_list::concat(pw_qpolynomial_list list2) const
 {
   auto res = isl_pw_qpolynomial_list_concat(copy(), list2.release());
@@ -13310,7 +14740,7 @@
   return manage(res);
 }
 
-int pw_qpolynomial_list::n_pw_qpolynomial() const
+isl_size pw_qpolynomial_list::n_pw_qpolynomial() const
 {
   auto res = isl_pw_qpolynomial_list_n_pw_qpolynomial(get());
   return res;
@@ -13328,7 +14758,7 @@
   return manage(res);
 }
 
-int pw_qpolynomial_list::size() const
+isl_size pw_qpolynomial_list::size() const
 {
   auto res = isl_pw_qpolynomial_list_size(get());
   return res;
@@ -13438,7 +14868,7 @@
   return manage(res);
 }
 
-unsigned int qpolynomial::dim(isl::dim type) const
+isl_size qpolynomial::dim(isl::dim type) const
 {
   auto res = isl_qpolynomial_dim(get(), static_cast<enum isl_dim_type>(type));
   return res;
@@ -13524,9 +14954,9 @@
   return manage(res);
 }
 
-qpolynomial qpolynomial::infty_on_domain(space dim)
+qpolynomial qpolynomial::infty_on_domain(space domain)
 {
-  auto res = isl_qpolynomial_infty_on_domain(dim.release());
+  auto res = isl_qpolynomial_infty_on_domain(domain.release());
   return manage(res);
 }
 
@@ -13578,9 +15008,9 @@
   return manage(res);
 }
 
-qpolynomial qpolynomial::nan_on_domain(space dim)
+qpolynomial qpolynomial::nan_on_domain(space domain)
 {
-  auto res = isl_qpolynomial_nan_on_domain(dim.release());
+  auto res = isl_qpolynomial_nan_on_domain(domain.release());
   return manage(res);
 }
 
@@ -13590,15 +15020,15 @@
   return manage(res);
 }
 
-qpolynomial qpolynomial::neginfty_on_domain(space dim)
+qpolynomial qpolynomial::neginfty_on_domain(space domain)
 {
-  auto res = isl_qpolynomial_neginfty_on_domain(dim.release());
+  auto res = isl_qpolynomial_neginfty_on_domain(domain.release());
   return manage(res);
 }
 
-qpolynomial qpolynomial::one_on_domain(space dim)
+qpolynomial qpolynomial::one_on_domain(space domain)
 {
-  auto res = isl_qpolynomial_one_on_domain(dim.release());
+  auto res = isl_qpolynomial_one_on_domain(domain.release());
   return manage(res);
 }
 
@@ -13650,15 +15080,188 @@
   return manage(res);
 }
 
-qpolynomial qpolynomial::var_on_domain(space dim, isl::dim type, unsigned int pos)
+qpolynomial qpolynomial::var_on_domain(space domain, isl::dim type, unsigned int pos)
 {
-  auto res = isl_qpolynomial_var_on_domain(dim.release(), static_cast<enum isl_dim_type>(type), pos);
+  auto res = isl_qpolynomial_var_on_domain(domain.release(), static_cast<enum isl_dim_type>(type), pos);
   return manage(res);
 }
 
-qpolynomial qpolynomial::zero_on_domain(space dim)
+qpolynomial qpolynomial::zero_on_domain(space domain)
 {
-  auto res = isl_qpolynomial_zero_on_domain(dim.release());
+  auto res = isl_qpolynomial_zero_on_domain(domain.release());
+  return manage(res);
+}
+
+// implementations for isl::qpolynomial_list
+qpolynomial_list manage(__isl_take isl_qpolynomial_list *ptr) {
+  return qpolynomial_list(ptr);
+}
+qpolynomial_list manage_copy(__isl_keep isl_qpolynomial_list *ptr) {
+  ptr = isl_qpolynomial_list_copy(ptr);
+  return qpolynomial_list(ptr);
+}
+
+qpolynomial_list::qpolynomial_list()
+    : ptr(nullptr) {}
+
+qpolynomial_list::qpolynomial_list(const qpolynomial_list &obj)
+    : ptr(nullptr)
+{
+  ptr = obj.copy();
+}
+qpolynomial_list::qpolynomial_list(std::nullptr_t)
+    : ptr(nullptr) {}
+
+
+qpolynomial_list::qpolynomial_list(__isl_take isl_qpolynomial_list *ptr)
+    : ptr(ptr) {}
+
+
+qpolynomial_list &qpolynomial_list::operator=(qpolynomial_list obj) {
+  std::swap(this->ptr, obj.ptr);
+  return *this;
+}
+
+qpolynomial_list::~qpolynomial_list() {
+  if (ptr)
+    isl_qpolynomial_list_free(ptr);
+}
+
+__isl_give isl_qpolynomial_list *qpolynomial_list::copy() const & {
+  return isl_qpolynomial_list_copy(ptr);
+}
+
+__isl_keep isl_qpolynomial_list *qpolynomial_list::get() const {
+  return ptr;
+}
+
+__isl_give isl_qpolynomial_list *qpolynomial_list::release() {
+  isl_qpolynomial_list *tmp = ptr;
+  ptr = nullptr;
+  return tmp;
+}
+
+bool qpolynomial_list::is_null() const {
+  return ptr == nullptr;
+}
+qpolynomial_list::operator bool() const {
+  return !is_null();
+}
+
+
+ctx qpolynomial_list::get_ctx() const {
+  return ctx(isl_qpolynomial_list_get_ctx(ptr));
+}
+std::string qpolynomial_list::to_str() const {
+  char *Tmp = isl_qpolynomial_list_to_str(get());
+  if (!Tmp)
+    return "";
+  std::string S(Tmp);
+  free(Tmp);
+  return S;
+}
+
+
+void qpolynomial_list::dump() const {
+  isl_qpolynomial_list_dump(get());
+}
+
+
+qpolynomial_list qpolynomial_list::add(qpolynomial el) const
+{
+  auto res = isl_qpolynomial_list_add(copy(), el.release());
+  return manage(res);
+}
+
+qpolynomial_list qpolynomial_list::alloc(ctx ctx, int n)
+{
+  auto res = isl_qpolynomial_list_alloc(ctx.release(), n);
+  return manage(res);
+}
+
+qpolynomial_list qpolynomial_list::clear() const
+{
+  auto res = isl_qpolynomial_list_clear(copy());
+  return manage(res);
+}
+
+qpolynomial_list qpolynomial_list::concat(qpolynomial_list list2) const
+{
+  auto res = isl_qpolynomial_list_concat(copy(), list2.release());
+  return manage(res);
+}
+
+qpolynomial_list qpolynomial_list::drop(unsigned int first, unsigned int n) const
+{
+  auto res = isl_qpolynomial_list_drop(copy(), first, n);
+  return manage(res);
+}
+
+stat qpolynomial_list::foreach(const std::function<stat(qpolynomial)> &fn) const
+{
+  struct fn_data {
+    const std::function<stat(qpolynomial)> *func;
+  } fn_data = { &fn };
+  auto fn_lambda = [](isl_qpolynomial *arg_0, void *arg_1) -> isl_stat {
+    auto *data = static_cast<struct fn_data *>(arg_1);
+    stat ret = (*data->func)(manage(arg_0));
+    return ret.release();
+  };
+  auto res = isl_qpolynomial_list_foreach(get(), fn_lambda, &fn_data);
+  return manage(res);
+}
+
+qpolynomial_list qpolynomial_list::from_qpolynomial(qpolynomial el)
+{
+  auto res = isl_qpolynomial_list_from_qpolynomial(el.release());
+  return manage(res);
+}
+
+qpolynomial qpolynomial_list::get_at(int index) const
+{
+  auto res = isl_qpolynomial_list_get_at(get(), index);
+  return manage(res);
+}
+
+qpolynomial qpolynomial_list::get_qpolynomial(int index) const
+{
+  auto res = isl_qpolynomial_list_get_qpolynomial(get(), index);
+  return manage(res);
+}
+
+qpolynomial_list qpolynomial_list::insert(unsigned int pos, qpolynomial el) const
+{
+  auto res = isl_qpolynomial_list_insert(copy(), pos, el.release());
+  return manage(res);
+}
+
+isl_size qpolynomial_list::n_qpolynomial() const
+{
+  auto res = isl_qpolynomial_list_n_qpolynomial(get());
+  return res;
+}
+
+qpolynomial_list qpolynomial_list::reverse() const
+{
+  auto res = isl_qpolynomial_list_reverse(copy());
+  return manage(res);
+}
+
+qpolynomial_list qpolynomial_list::set_qpolynomial(int index, qpolynomial el) const
+{
+  auto res = isl_qpolynomial_list_set_qpolynomial(copy(), index, el.release());
+  return manage(res);
+}
+
+isl_size qpolynomial_list::size() const
+{
+  auto res = isl_qpolynomial_list_size(get());
+  return res;
+}
+
+qpolynomial_list qpolynomial_list::swap(unsigned int pos1, unsigned int pos2) const
+{
+  auto res = isl_qpolynomial_list_swap(copy(), pos1, pos2);
   return manage(res);
 }
 
@@ -14187,7 +15790,7 @@
   return manage(res);
 }
 
-int schedule_node::get_ancestor_child_position(const schedule_node &ancestor) const
+isl_size schedule_node::get_ancestor_child_position(const schedule_node &ancestor) const
 {
   auto res = isl_schedule_node_get_ancestor_child_position(get(), ancestor.get());
   return res;
@@ -14199,7 +15802,7 @@
   return manage(res);
 }
 
-int schedule_node::get_child_position() const
+isl_size schedule_node::get_child_position() const
 {
   auto res = isl_schedule_node_get_child_position(get());
   return res;
@@ -14241,7 +15844,7 @@
   return manage(res);
 }
 
-int schedule_node::get_schedule_depth() const
+isl_size schedule_node::get_schedule_depth() const
 {
   auto res = isl_schedule_node_get_schedule_depth(get());
   return res;
@@ -14271,7 +15874,7 @@
   return manage(res);
 }
 
-int schedule_node::get_tree_depth() const
+isl_size schedule_node::get_tree_depth() const
 {
   auto res = isl_schedule_node_get_tree_depth(get());
   return res;
@@ -14391,7 +15994,7 @@
   return manage(res);
 }
 
-int schedule_node::n_children() const
+isl_size schedule_node::n_children() const
 {
   auto res = isl_schedule_node_n_children(get());
   return res;
@@ -14469,11 +16072,6 @@
 set::set(__isl_take isl_set *ptr)
     : ptr(ptr) {}
 
-set::set(ctx ctx, const std::string &str)
-{
-  auto res = isl_set_read_from_str(ctx.release(), str.c_str());
-  ptr = res;
-}
 set::set(basic_set bset)
 {
   auto res = isl_set_from_basic_set(bset.release());
@@ -14489,6 +16087,11 @@
   auto res = isl_set_from_union_set(uset.release());
   ptr = res;
 }
+set::set(ctx ctx, const std::string &str)
+{
+  auto res = isl_set_read_from_str(ctx.release(), str.c_str());
+  ptr = res;
+}
 
 set &set::operator=(set obj) {
   std::swap(this->ptr, obj.ptr);
@@ -14570,6 +16173,12 @@
   return manage(res);
 }
 
+set set::bind(multi_id tuple) const
+{
+  auto res = isl_set_bind(copy(), tuple.release());
+  return manage(res);
+}
+
 basic_set set::bounded_simple_hull() const
 {
   auto res = isl_set_bounded_simple_hull(copy());
@@ -14618,7 +16227,7 @@
   return manage(res);
 }
 
-unsigned int set::dim(isl::dim type) const
+isl_size set::dim(isl::dim type) const
 {
   auto res = isl_set_dim(get(), static_cast<enum isl_dim_type>(type));
   return res;
@@ -14660,12 +16269,24 @@
   return manage(res);
 }
 
+val set::dim_max_val(int pos) const
+{
+  auto res = isl_set_dim_max_val(copy(), pos);
+  return manage(res);
+}
+
 pw_aff set::dim_min(int pos) const
 {
   auto res = isl_set_dim_min(copy(), pos);
   return manage(res);
 }
 
+val set::dim_min_val(int pos) const
+{
+  auto res = isl_set_dim_min_val(copy(), pos);
+  return manage(res);
+}
+
 set set::drop_constraints_involving_dims(isl::dim type, unsigned int first, unsigned int n) const
 {
   auto res = isl_set_drop_constraints_involving_dims(copy(), static_cast<enum isl_dim_type>(type), first, n);
@@ -14827,6 +16448,18 @@
   return tmp;
 }
 
+multi_val set::get_plain_multi_val_if_fixed() const
+{
+  auto res = isl_set_get_plain_multi_val_if_fixed(get());
+  return manage(res);
+}
+
+fixed_box set::get_simple_fixed_box_hull() const
+{
+  auto res = isl_set_get_simple_fixed_box_hull(get());
+  return manage(res);
+}
+
 space set::get_space() const
 {
   auto res = isl_set_get_space(get());
@@ -14918,12 +16551,30 @@
   return manage(res);
 }
 
+map set::insert_domain(space domain) const
+{
+  auto res = isl_set_insert_domain(copy(), domain.release());
+  return manage(res);
+}
+
 set set::intersect(set set2) const
 {
   auto res = isl_set_intersect(copy(), set2.release());
   return manage(res);
 }
 
+set set::intersect_factor_domain(set domain) const
+{
+  auto res = isl_set_intersect_factor_domain(copy(), domain.release());
+  return manage(res);
+}
+
+set set::intersect_factor_range(set range) const
+{
+  auto res = isl_set_intersect_factor_range(copy(), range.release());
+  return manage(res);
+}
+
 set set::intersect_params(set params) const
 {
   auto res = isl_set_intersect_params(copy(), params.release());
@@ -14936,6 +16587,12 @@
   return manage(res);
 }
 
+boolean set::involves_locals() const
+{
+  auto res = isl_set_involves_locals(get());
+  return manage(res);
+}
+
 boolean set::is_bounded() const
 {
   auto res = isl_set_is_bounded(get());
@@ -15044,6 +16701,18 @@
   return manage(res);
 }
 
+set set::lower_bound(multi_pw_aff lower) const
+{
+  auto res = isl_set_lower_bound_multi_pw_aff(copy(), lower.release());
+  return manage(res);
+}
+
+set set::lower_bound(multi_val lower) const
+{
+  auto res = isl_set_lower_bound_multi_val(copy(), lower.release());
+  return manage(res);
+}
+
 set set::lower_bound_si(isl::dim type, unsigned int pos, int value) const
 {
   auto res = isl_set_lower_bound_si(copy(), static_cast<enum isl_dim_type>(type), pos, value);
@@ -15056,12 +16725,24 @@
   return manage(res);
 }
 
+multi_pw_aff set::max_multi_pw_aff() const
+{
+  auto res = isl_set_max_multi_pw_aff(copy());
+  return manage(res);
+}
+
 val set::max_val(const aff &obj) const
 {
   auto res = isl_set_max_val(get(), obj.get());
   return manage(res);
 }
 
+multi_pw_aff set::min_multi_pw_aff() const
+{
+  auto res = isl_set_min_multi_pw_aff(copy());
+  return manage(res);
+}
+
 val set::min_val(const aff &obj) const
 {
   auto res = isl_set_min_val(get(), obj.get());
@@ -15074,21 +16755,21 @@
   return manage(res);
 }
 
-int set::n_basic_set() const
+isl_size set::n_basic_set() const
 {
   auto res = isl_set_n_basic_set(get());
   return res;
 }
 
-unsigned int set::n_dim() const
+isl_size set::n_dim() const
 {
   auto res = isl_set_n_dim(get());
   return res;
 }
 
-set set::nat_universe(space dim)
+set set::nat_universe(space space)
 {
-  auto res = isl_set_nat_universe(dim.release());
+  auto res = isl_set_nat_universe(space.release());
   return manage(res);
 }
 
@@ -15152,19 +16833,19 @@
   return manage(res);
 }
 
-set set::preimage_multi_aff(multi_aff ma) const
+set set::preimage(multi_aff ma) const
 {
   auto res = isl_set_preimage_multi_aff(copy(), ma.release());
   return manage(res);
 }
 
-set set::preimage_multi_pw_aff(multi_pw_aff mpa) const
+set set::preimage(multi_pw_aff mpa) const
 {
   auto res = isl_set_preimage_multi_pw_aff(copy(), mpa.release());
   return manage(res);
 }
 
-set set::preimage_pw_multi_aff(pw_multi_aff pma) const
+set set::preimage(pw_multi_aff pma) const
 {
   auto res = isl_set_preimage_pw_multi_aff(copy(), pma.release());
   return manage(res);
@@ -15188,6 +16869,24 @@
   return manage(res);
 }
 
+set set::project_out_all_params() const
+{
+  auto res = isl_set_project_out_all_params(copy());
+  return manage(res);
+}
+
+set set::project_out_param(id id) const
+{
+  auto res = isl_set_project_out_param_id(copy(), id.release());
+  return manage(res);
+}
+
+set set::project_out_param(id_list list) const
+{
+  auto res = isl_set_project_out_param_id_list(copy(), list.release());
+  return manage(res);
+}
+
 set set::remove_dims(isl::dim type, unsigned int first, unsigned int n) const
 {
   auto res = isl_set_remove_dims(copy(), static_cast<enum isl_dim_type>(type), first, n);
@@ -15218,9 +16917,9 @@
   return manage(res);
 }
 
-set set::reset_space(space dim) const
+set set::reset_space(space space) const
 {
-  auto res = isl_set_reset_space(copy(), dim.release());
+  auto res = isl_set_reset_space(copy(), space.release());
   return manage(res);
 }
 
@@ -15302,6 +17001,24 @@
   return manage(res);
 }
 
+map set::translation() const
+{
+  auto res = isl_set_translation(copy());
+  return manage(res);
+}
+
+set set::unbind_params(multi_id tuple) const
+{
+  auto res = isl_set_unbind_params(copy(), tuple.release());
+  return manage(res);
+}
+
+map set::unbind_params_insert_domain(multi_id domain) const
+{
+  auto res = isl_set_unbind_params_insert_domain(copy(), domain.release());
+  return manage(res);
+}
+
 set set::unite(set set2) const
 {
   auto res = isl_set_union(copy(), set2.release());
@@ -15332,6 +17049,18 @@
   return manage(res);
 }
 
+set set::upper_bound(multi_pw_aff upper) const
+{
+  auto res = isl_set_upper_bound_multi_pw_aff(copy(), upper.release());
+  return manage(res);
+}
+
+set set::upper_bound(multi_val upper) const
+{
+  auto res = isl_set_upper_bound_multi_val(copy(), upper.release());
+  return manage(res);
+}
+
 set set::upper_bound_si(isl::dim type, unsigned int pos, int value) const
 {
   auto res = isl_set_upper_bound_si(copy(), static_cast<enum isl_dim_type>(type), pos, value);
@@ -15410,6 +17139,15 @@
 ctx set_list::get_ctx() const {
   return ctx(isl_set_list_get_ctx(ptr));
 }
+std::string set_list::to_str() const {
+  char *Tmp = isl_set_list_to_str(get());
+  if (!Tmp)
+    return "";
+  std::string S(Tmp);
+  free(Tmp);
+  return S;
+}
+
 
 void set_list::dump() const {
   isl_set_list_dump(get());
@@ -15428,6 +17166,12 @@
   return manage(res);
 }
 
+set_list set_list::clear() const
+{
+  auto res = isl_set_list_clear(copy());
+  return manage(res);
+}
+
 set_list set_list::concat(set_list list2) const
 {
   auto res = isl_set_list_concat(copy(), list2.release());
@@ -15478,7 +17222,7 @@
   return manage(res);
 }
 
-int set_list::n_set() const
+isl_size set_list::n_set() const
 {
   auto res = isl_set_list_n_set(get());
   return res;
@@ -15496,7 +17240,7 @@
   return manage(res);
 }
 
-int set_list::size() const
+isl_size set_list::size() const
 {
   auto res = isl_set_list_size(get());
   return res;
@@ -15605,15 +17349,27 @@
   return manage(res);
 }
 
+space space::add_named_tuple(id tuple_id, unsigned int dim) const
+{
+  auto res = isl_space_add_named_tuple_id_ui(copy(), tuple_id.release(), dim);
+  return manage(res);
+}
+
 space space::add_param_id(id id) const
 {
   auto res = isl_space_add_param_id(copy(), id.release());
   return manage(res);
 }
 
-space space::align_params(space dim2) const
+space space::add_unnamed_tuple(unsigned int dim) const
 {
-  auto res = isl_space_align_params(copy(), dim2.release());
+  auto res = isl_space_add_unnamed_tuple_ui(copy(), dim);
+  return manage(res);
+}
+
+space space::align_params(space space2) const
+{
+  auto res = isl_space_align_params(copy(), space2.release());
   return manage(res);
 }
 
@@ -15647,7 +17403,7 @@
   return manage(res);
 }
 
-unsigned int space::dim(isl::dim type) const
+isl_size space::dim(isl::dim type) const
 {
   auto res = isl_space_dim(get(), static_cast<enum isl_dim_type>(type));
   return res;
@@ -15689,6 +17445,12 @@
   return manage(res);
 }
 
+space space::drop_all_params() const
+{
+  auto res = isl_space_drop_all_params(copy());
+  return manage(res);
+}
+
 space space::drop_dims(isl::dim type, unsigned int first, unsigned int num) const
 {
   auto res = isl_space_drop_dims(copy(), static_cast<enum isl_dim_type>(type), first, num);
@@ -15943,6 +17705,12 @@
   return manage(res);
 }
 
+space space::range_reverse() const
+{
+  auto res = isl_space_range_reverse(copy());
+  return manage(res);
+}
+
 space space::reset_tuple_id(isl::dim type) const
 {
   auto res = isl_space_reset_tuple_id(copy(), static_cast<enum isl_dim_type>(type));
@@ -15997,6 +17765,12 @@
   return manage(res);
 }
 
+space space::unit(ctx ctx)
+{
+  auto res = isl_space_unit(ctx.release());
+  return manage(res);
+}
+
 space space::unwrap() const
 {
   auto res = isl_space_unwrap(copy());
@@ -16077,7 +17851,7 @@
 }
 
 
-unsigned int term::dim(isl::dim type) const
+isl_size term::dim(isl::dim type) const
 {
   auto res = isl_term_dim(get(), static_cast<enum isl_dim_type>(type));
   return res;
@@ -16095,7 +17869,7 @@
   return manage(res);
 }
 
-int term::get_exp(isl::dim type, unsigned int pos) const
+isl_size term::get_exp(isl::dim type, unsigned int pos) const
 {
   auto res = isl_term_get_exp(get(), static_cast<enum isl_dim_type>(type), pos);
   return res;
@@ -16344,11 +18118,6 @@
 union_map::union_map(__isl_take isl_union_map *ptr)
     : ptr(ptr) {}
 
-union_map::union_map(union_pw_multi_aff upma)
-{
-  auto res = isl_union_map_from_union_pw_multi_aff(upma.release());
-  ptr = res;
-}
 union_map::union_map(basic_map bmap)
 {
   auto res = isl_union_map_from_basic_map(bmap.release());
@@ -16359,6 +18128,11 @@
   auto res = isl_union_map_from_map(map.release());
   ptr = res;
 }
+union_map::union_map(union_pw_multi_aff upma)
+{
+  auto res = isl_union_map_from_union_pw_multi_aff(upma.release());
+  ptr = res;
+}
 union_map::union_map(ctx ctx, const std::string &str)
 {
   auto res = isl_union_map_read_from_str(ctx.release(), str.c_str());
@@ -16445,6 +18219,12 @@
   return manage(res);
 }
 
+union_set union_map::bind_range(multi_id tuple) const
+{
+  auto res = isl_union_map_bind_range(copy(), tuple.release());
+  return manage(res);
+}
+
 union_map union_map::coalesce() const
 {
   auto res = isl_union_map_coalesce(copy());
@@ -16481,7 +18261,7 @@
   return manage(res);
 }
 
-unsigned int union_map::dim(isl::dim type) const
+isl_size union_map::dim(isl::dim type) const
 {
   auto res = isl_union_map_dim(get(), static_cast<enum isl_dim_type>(type));
   return res;
@@ -16529,15 +18309,27 @@
   return manage(res);
 }
 
+union_map union_map::empty(ctx ctx)
+{
+  auto res = isl_union_map_empty_ctx(ctx.release());
+  return manage(res);
+}
+
+union_map union_map::empty_space(space space)
+{
+  auto res = isl_union_map_empty_space(space.release());
+  return manage(res);
+}
+
 union_map union_map::eq_at(multi_union_pw_aff mupa) const
 {
   auto res = isl_union_map_eq_at_multi_union_pw_aff(copy(), mupa.release());
   return manage(res);
 }
 
-map union_map::extract_map(space dim) const
+map union_map::extract_map(space space) const
 {
-  auto res = isl_union_map_extract_map(get(), dim.release());
+  auto res = isl_union_map_extract_map(get(), space.release());
   return manage(res);
 }
 
@@ -16675,9 +18467,27 @@
   return manage(res);
 }
 
+union_map union_map::intersect_domain(space space) const
+{
+  auto res = isl_union_map_intersect_domain_space(copy(), space.release());
+  return manage(res);
+}
+
 union_map union_map::intersect_domain(union_set uset) const
 {
-  auto res = isl_union_map_intersect_domain(copy(), uset.release());
+  auto res = isl_union_map_intersect_domain_union_set(copy(), uset.release());
+  return manage(res);
+}
+
+union_map union_map::intersect_domain_factor_domain(union_map factor) const
+{
+  auto res = isl_union_map_intersect_domain_factor_domain(copy(), factor.release());
+  return manage(res);
+}
+
+union_map union_map::intersect_domain_factor_range(union_map factor) const
+{
+  auto res = isl_union_map_intersect_domain_factor_range(copy(), factor.release());
   return manage(res);
 }
 
@@ -16687,9 +18497,21 @@
   return manage(res);
 }
 
+union_map union_map::intersect_range(space space) const
+{
+  auto res = isl_union_map_intersect_range_space(copy(), space.release());
+  return manage(res);
+}
+
 union_map union_map::intersect_range(union_set uset) const
 {
-  auto res = isl_union_map_intersect_range(copy(), uset.release());
+  auto res = isl_union_map_intersect_range_union_set(copy(), uset.release());
+  return manage(res);
+}
+
+union_map union_map::intersect_range_factor_domain(union_map factor) const
+{
+  auto res = isl_union_map_intersect_range_factor_domain(copy(), factor.release());
   return manage(res);
 }
 
@@ -16759,6 +18581,18 @@
   return manage(res);
 }
 
+boolean union_map::isa_map() const
+{
+  auto res = isl_union_map_isa_map(get());
+  return manage(res);
+}
+
+union_map union_map::lex_ge_at_multi_union_pw_aff(multi_union_pw_aff mupa) const
+{
+  auto res = isl_union_map_lex_ge_at_multi_union_pw_aff(copy(), mupa.release());
+  return manage(res);
+}
+
 union_map union_map::lex_ge_union_map(union_map umap2) const
 {
   auto res = isl_union_map_lex_ge_union_map(copy(), umap2.release());
@@ -16777,6 +18611,12 @@
   return manage(res);
 }
 
+union_map union_map::lex_le_at_multi_union_pw_aff(multi_union_pw_aff mupa) const
+{
+  auto res = isl_union_map_lex_le_at_multi_union_pw_aff(copy(), mupa.release());
+  return manage(res);
+}
+
 union_map union_map::lex_le_union_map(union_map umap2) const
 {
   auto res = isl_union_map_lex_le_union_map(copy(), umap2.release());
@@ -16807,7 +18647,7 @@
   return manage(res);
 }
 
-int union_map::n_map() const
+isl_size union_map::n_map() const
 {
   auto res = isl_union_map_n_map(get());
   return res;
@@ -16837,43 +18677,43 @@
   return manage(res);
 }
 
-union_map union_map::preimage_domain_multi_aff(multi_aff ma) const
+union_map union_map::preimage_domain(multi_aff ma) const
 {
   auto res = isl_union_map_preimage_domain_multi_aff(copy(), ma.release());
   return manage(res);
 }
 
-union_map union_map::preimage_domain_multi_pw_aff(multi_pw_aff mpa) const
+union_map union_map::preimage_domain(multi_pw_aff mpa) const
 {
   auto res = isl_union_map_preimage_domain_multi_pw_aff(copy(), mpa.release());
   return manage(res);
 }
 
-union_map union_map::preimage_domain_pw_multi_aff(pw_multi_aff pma) const
+union_map union_map::preimage_domain(pw_multi_aff pma) const
 {
   auto res = isl_union_map_preimage_domain_pw_multi_aff(copy(), pma.release());
   return manage(res);
 }
 
-union_map union_map::preimage_domain_union_pw_multi_aff(union_pw_multi_aff upma) const
+union_map union_map::preimage_domain(union_pw_multi_aff upma) const
 {
   auto res = isl_union_map_preimage_domain_union_pw_multi_aff(copy(), upma.release());
   return manage(res);
 }
 
-union_map union_map::preimage_range_multi_aff(multi_aff ma) const
+union_map union_map::preimage_range(multi_aff ma) const
 {
   auto res = isl_union_map_preimage_range_multi_aff(copy(), ma.release());
   return manage(res);
 }
 
-union_map union_map::preimage_range_pw_multi_aff(pw_multi_aff pma) const
+union_map union_map::preimage_range(pw_multi_aff pma) const
 {
   auto res = isl_union_map_preimage_range_pw_multi_aff(copy(), pma.release());
   return manage(res);
 }
 
-union_map union_map::preimage_range_union_pw_multi_aff(union_pw_multi_aff upma) const
+union_map union_map::preimage_range(union_pw_multi_aff upma) const
 {
   auto res = isl_union_map_preimage_range_union_pw_multi_aff(copy(), upma.release());
   return manage(res);
@@ -16933,6 +18773,12 @@
   return manage(res);
 }
 
+union_map union_map::range_reverse() const
+{
+  auto res = isl_union_map_range_reverse(copy());
+  return manage(res);
+}
+
 union_map union_map::remove_divs() const
 {
   auto res = isl_union_map_remove_divs(copy());
@@ -17077,6 +18923,15 @@
 ctx union_map_list::get_ctx() const {
   return ctx(isl_union_map_list_get_ctx(ptr));
 }
+std::string union_map_list::to_str() const {
+  char *Tmp = isl_union_map_list_to_str(get());
+  if (!Tmp)
+    return "";
+  std::string S(Tmp);
+  free(Tmp);
+  return S;
+}
+
 
 void union_map_list::dump() const {
   isl_union_map_list_dump(get());
@@ -17095,6 +18950,12 @@
   return manage(res);
 }
 
+union_map_list union_map_list::clear() const
+{
+  auto res = isl_union_map_list_clear(copy());
+  return manage(res);
+}
+
 union_map_list union_map_list::concat(union_map_list list2) const
 {
   auto res = isl_union_map_list_concat(copy(), list2.release());
@@ -17145,7 +19006,7 @@
   return manage(res);
 }
 
-int union_map_list::n_union_map() const
+isl_size union_map_list::n_union_map() const
 {
   auto res = isl_union_map_list_n_union_map(get());
   return res;
@@ -17163,7 +19024,7 @@
   return manage(res);
 }
 
-int union_map_list::size() const
+isl_size union_map_list::size() const
 {
   auto res = isl_union_map_list_size(get());
   return res;
@@ -17199,21 +19060,26 @@
 union_pw_aff::union_pw_aff(__isl_take isl_union_pw_aff *ptr)
     : ptr(ptr) {}
 
+union_pw_aff::union_pw_aff(aff aff)
+{
+  auto res = isl_union_pw_aff_from_aff(aff.release());
+  ptr = res;
+}
 union_pw_aff::union_pw_aff(pw_aff pa)
 {
   auto res = isl_union_pw_aff_from_pw_aff(pa.release());
   ptr = res;
 }
-union_pw_aff::union_pw_aff(union_set domain, val v)
-{
-  auto res = isl_union_pw_aff_val_on_domain(domain.release(), v.release());
-  ptr = res;
-}
 union_pw_aff::union_pw_aff(ctx ctx, const std::string &str)
 {
   auto res = isl_union_pw_aff_read_from_str(ctx.release(), str.c_str());
   ptr = res;
 }
+union_pw_aff::union_pw_aff(union_set domain, val v)
+{
+  auto res = isl_union_pw_aff_val_on_domain(domain.release(), v.release());
+  ptr = res;
+}
 
 union_pw_aff &union_pw_aff::operator=(union_pw_aff obj) {
   std::swap(this->ptr, obj.ptr);
@@ -17289,13 +19155,19 @@
   return manage(res);
 }
 
+union_set union_pw_aff::bind(id id) const
+{
+  auto res = isl_union_pw_aff_bind_id(copy(), id.release());
+  return manage(res);
+}
+
 union_pw_aff union_pw_aff::coalesce() const
 {
   auto res = isl_union_pw_aff_coalesce(copy());
   return manage(res);
 }
 
-unsigned int union_pw_aff::dim(isl::dim type) const
+isl_size union_pw_aff::dim(isl::dim type) const
 {
   auto res = isl_union_pw_aff_dim(get(), static_cast<enum isl_dim_type>(type));
   return res;
@@ -17319,6 +19191,18 @@
   return manage(res);
 }
 
+union_pw_aff union_pw_aff::empty_ctx(ctx ctx)
+{
+  auto res = isl_union_pw_aff_empty_ctx(ctx.release());
+  return manage(res);
+}
+
+union_pw_aff union_pw_aff::empty_space(space space)
+{
+  auto res = isl_union_pw_aff_empty_space(space.release());
+  return manage(res);
+}
+
 pw_aff union_pw_aff::extract_pw_aff(space space) const
 {
   auto res = isl_union_pw_aff_extract_pw_aff(get(), space.release());
@@ -17375,9 +19259,27 @@
   return manage(res);
 }
 
+union_pw_aff union_pw_aff::intersect_domain(space space) const
+{
+  auto res = isl_union_pw_aff_intersect_domain_space(copy(), space.release());
+  return manage(res);
+}
+
 union_pw_aff union_pw_aff::intersect_domain(union_set uset) const
 {
-  auto res = isl_union_pw_aff_intersect_domain(copy(), uset.release());
+  auto res = isl_union_pw_aff_intersect_domain_union_set(copy(), uset.release());
+  return manage(res);
+}
+
+union_pw_aff union_pw_aff::intersect_domain_wrapped_domain(union_set uset) const
+{
+  auto res = isl_union_pw_aff_intersect_domain_wrapped_domain(copy(), uset.release());
+  return manage(res);
+}
+
+union_pw_aff union_pw_aff::intersect_domain_wrapped_range(union_set uset) const
+{
+  auto res = isl_union_pw_aff_intersect_domain_wrapped_range(copy(), uset.release());
   return manage(res);
 }
 
@@ -17411,7 +19313,7 @@
   return manage(res);
 }
 
-int union_pw_aff::n_pw_aff() const
+isl_size union_pw_aff::n_pw_aff() const
 {
   auto res = isl_union_pw_aff_n_pw_aff(get());
   return res;
@@ -17471,9 +19373,15 @@
   return manage(res);
 }
 
+union_pw_aff union_pw_aff::subtract_domain(space space) const
+{
+  auto res = isl_union_pw_aff_subtract_domain_space(copy(), space.release());
+  return manage(res);
+}
+
 union_pw_aff union_pw_aff::subtract_domain(union_set uset) const
 {
-  auto res = isl_union_pw_aff_subtract_domain(copy(), uset.release());
+  auto res = isl_union_pw_aff_subtract_domain_union_set(copy(), uset.release());
   return manage(res);
 }
 
@@ -17549,6 +19457,15 @@
 ctx union_pw_aff_list::get_ctx() const {
   return ctx(isl_union_pw_aff_list_get_ctx(ptr));
 }
+std::string union_pw_aff_list::to_str() const {
+  char *Tmp = isl_union_pw_aff_list_to_str(get());
+  if (!Tmp)
+    return "";
+  std::string S(Tmp);
+  free(Tmp);
+  return S;
+}
+
 
 void union_pw_aff_list::dump() const {
   isl_union_pw_aff_list_dump(get());
@@ -17567,6 +19484,12 @@
   return manage(res);
 }
 
+union_pw_aff_list union_pw_aff_list::clear() const
+{
+  auto res = isl_union_pw_aff_list_clear(copy());
+  return manage(res);
+}
+
 union_pw_aff_list union_pw_aff_list::concat(union_pw_aff_list list2) const
 {
   auto res = isl_union_pw_aff_list_concat(copy(), list2.release());
@@ -17617,7 +19540,7 @@
   return manage(res);
 }
 
-int union_pw_aff_list::n_union_pw_aff() const
+isl_size union_pw_aff_list::n_union_pw_aff() const
 {
   auto res = isl_union_pw_aff_list_n_union_pw_aff(get());
   return res;
@@ -17635,7 +19558,7 @@
   return manage(res);
 }
 
-int union_pw_aff_list::size() const
+isl_size union_pw_aff_list::size() const
 {
   auto res = isl_union_pw_aff_list_size(get());
   return res;
@@ -17676,34 +19599,39 @@
   auto res = isl_union_pw_multi_aff_from_aff(aff.release());
   ptr = res;
 }
-union_pw_multi_aff::union_pw_multi_aff(pw_multi_aff pma)
-{
-  auto res = isl_union_pw_multi_aff_from_pw_multi_aff(pma.release());
-  ptr = res;
-}
 union_pw_multi_aff::union_pw_multi_aff(union_set uset)
 {
   auto res = isl_union_pw_multi_aff_from_domain(uset.release());
   ptr = res;
 }
+union_pw_multi_aff::union_pw_multi_aff(multi_aff ma)
+{
+  auto res = isl_union_pw_multi_aff_from_multi_aff(ma.release());
+  ptr = res;
+}
+union_pw_multi_aff::union_pw_multi_aff(multi_union_pw_aff mupa)
+{
+  auto res = isl_union_pw_multi_aff_from_multi_union_pw_aff(mupa.release());
+  ptr = res;
+}
+union_pw_multi_aff::union_pw_multi_aff(pw_multi_aff pma)
+{
+  auto res = isl_union_pw_multi_aff_from_pw_multi_aff(pma.release());
+  ptr = res;
+}
 union_pw_multi_aff::union_pw_multi_aff(union_map umap)
 {
   auto res = isl_union_pw_multi_aff_from_union_map(umap.release());
   ptr = res;
 }
-union_pw_multi_aff::union_pw_multi_aff(ctx ctx, const std::string &str)
-{
-  auto res = isl_union_pw_multi_aff_read_from_str(ctx.release(), str.c_str());
-  ptr = res;
-}
 union_pw_multi_aff::union_pw_multi_aff(union_pw_aff upa)
 {
   auto res = isl_union_pw_multi_aff_from_union_pw_aff(upa.release());
   ptr = res;
 }
-union_pw_multi_aff::union_pw_multi_aff(multi_union_pw_aff mupa)
+union_pw_multi_aff::union_pw_multi_aff(ctx ctx, const std::string &str)
 {
-  auto res = isl_union_pw_multi_aff_from_multi_union_pw_aff(mupa.release());
+  auto res = isl_union_pw_multi_aff_read_from_str(ctx.release(), str.c_str());
   ptr = res;
 }
 
@@ -17775,13 +19703,25 @@
   return manage(res);
 }
 
+union_pw_multi_aff union_pw_multi_aff::apply(union_pw_multi_aff upma2) const
+{
+  auto res = isl_union_pw_multi_aff_apply_union_pw_multi_aff(copy(), upma2.release());
+  return manage(res);
+}
+
+pw_multi_aff union_pw_multi_aff::as_pw_multi_aff() const
+{
+  auto res = isl_union_pw_multi_aff_as_pw_multi_aff(copy());
+  return manage(res);
+}
+
 union_pw_multi_aff union_pw_multi_aff::coalesce() const
 {
   auto res = isl_union_pw_multi_aff_coalesce(copy());
   return manage(res);
 }
 
-unsigned int union_pw_multi_aff::dim(isl::dim type) const
+isl_size union_pw_multi_aff::dim(isl::dim type) const
 {
   auto res = isl_union_pw_multi_aff_dim(get(), static_cast<enum isl_dim_type>(type));
   return res;
@@ -17805,6 +19745,18 @@
   return manage(res);
 }
 
+union_pw_multi_aff union_pw_multi_aff::empty(ctx ctx)
+{
+  auto res = isl_union_pw_multi_aff_empty_ctx(ctx.release());
+  return manage(res);
+}
+
+union_pw_multi_aff union_pw_multi_aff::empty_space(space space)
+{
+  auto res = isl_union_pw_multi_aff_empty_space(space.release());
+  return manage(res);
+}
+
 pw_multi_aff union_pw_multi_aff::extract_pw_multi_aff(space space) const
 {
   auto res = isl_union_pw_multi_aff_extract_pw_multi_aff(get(), space.release());
@@ -17873,9 +19825,27 @@
   return manage(res);
 }
 
+union_pw_multi_aff union_pw_multi_aff::intersect_domain(space space) const
+{
+  auto res = isl_union_pw_multi_aff_intersect_domain_space(copy(), space.release());
+  return manage(res);
+}
+
 union_pw_multi_aff union_pw_multi_aff::intersect_domain(union_set uset) const
 {
-  auto res = isl_union_pw_multi_aff_intersect_domain(copy(), uset.release());
+  auto res = isl_union_pw_multi_aff_intersect_domain_union_set(copy(), uset.release());
+  return manage(res);
+}
+
+union_pw_multi_aff union_pw_multi_aff::intersect_domain_wrapped_domain(union_set uset) const
+{
+  auto res = isl_union_pw_multi_aff_intersect_domain_wrapped_domain(copy(), uset.release());
+  return manage(res);
+}
+
+union_pw_multi_aff union_pw_multi_aff::intersect_domain_wrapped_range(union_set uset) const
+{
+  auto res = isl_union_pw_multi_aff_intersect_domain_wrapped_range(copy(), uset.release());
   return manage(res);
 }
 
@@ -17885,19 +19855,31 @@
   return manage(res);
 }
 
+boolean union_pw_multi_aff::involves_locals() const
+{
+  auto res = isl_union_pw_multi_aff_involves_locals(get());
+  return manage(res);
+}
+
 boolean union_pw_multi_aff::involves_nan() const
 {
   auto res = isl_union_pw_multi_aff_involves_nan(get());
   return manage(res);
 }
 
+boolean union_pw_multi_aff::isa_pw_multi_aff() const
+{
+  auto res = isl_union_pw_multi_aff_isa_pw_multi_aff(get());
+  return manage(res);
+}
+
 union_pw_multi_aff union_pw_multi_aff::multi_val_on_domain(union_set domain, multi_val mv)
 {
   auto res = isl_union_pw_multi_aff_multi_val_on_domain(domain.release(), mv.release());
   return manage(res);
 }
 
-int union_pw_multi_aff::n_pw_multi_aff() const
+isl_size union_pw_multi_aff::n_pw_multi_aff() const
 {
   auto res = isl_union_pw_multi_aff_n_pw_multi_aff(get());
   return res;
@@ -17909,18 +19891,48 @@
   return manage(res);
 }
 
+boolean union_pw_multi_aff::plain_is_empty() const
+{
+  auto res = isl_union_pw_multi_aff_plain_is_empty(get());
+  return manage(res);
+}
+
 boolean union_pw_multi_aff::plain_is_equal(const union_pw_multi_aff &upma2) const
 {
   auto res = isl_union_pw_multi_aff_plain_is_equal(get(), upma2.get());
   return manage(res);
 }
 
+union_pw_multi_aff union_pw_multi_aff::preimage_domain_wrapped_domain(union_pw_multi_aff upma2) const
+{
+  auto res = isl_union_pw_multi_aff_preimage_domain_wrapped_domain_union_pw_multi_aff(copy(), upma2.release());
+  return manage(res);
+}
+
 union_pw_multi_aff union_pw_multi_aff::pullback(union_pw_multi_aff upma2) const
 {
   auto res = isl_union_pw_multi_aff_pullback_union_pw_multi_aff(copy(), upma2.release());
   return manage(res);
 }
 
+union_pw_multi_aff union_pw_multi_aff::range_factor_domain() const
+{
+  auto res = isl_union_pw_multi_aff_range_factor_domain(copy());
+  return manage(res);
+}
+
+union_pw_multi_aff union_pw_multi_aff::range_factor_range() const
+{
+  auto res = isl_union_pw_multi_aff_range_factor_range(copy());
+  return manage(res);
+}
+
+union_pw_multi_aff union_pw_multi_aff::range_product(union_pw_multi_aff upma2) const
+{
+  auto res = isl_union_pw_multi_aff_range_product(copy(), upma2.release());
+  return manage(res);
+}
+
 union_pw_multi_aff union_pw_multi_aff::reset_user() const
 {
   auto res = isl_union_pw_multi_aff_reset_user(copy());
@@ -17951,9 +19963,15 @@
   return manage(res);
 }
 
+union_pw_multi_aff union_pw_multi_aff::subtract_domain(space space) const
+{
+  auto res = isl_union_pw_multi_aff_subtract_domain_space(copy(), space.release());
+  return manage(res);
+}
+
 union_pw_multi_aff union_pw_multi_aff::subtract_domain(union_set uset) const
 {
-  auto res = isl_union_pw_multi_aff_subtract_domain(copy(), uset.release());
+  auto res = isl_union_pw_multi_aff_subtract_domain_union_set(copy(), uset.release());
   return manage(res);
 }
 
@@ -18023,6 +20041,15 @@
 ctx union_pw_multi_aff_list::get_ctx() const {
   return ctx(isl_union_pw_multi_aff_list_get_ctx(ptr));
 }
+std::string union_pw_multi_aff_list::to_str() const {
+  char *Tmp = isl_union_pw_multi_aff_list_to_str(get());
+  if (!Tmp)
+    return "";
+  std::string S(Tmp);
+  free(Tmp);
+  return S;
+}
+
 
 void union_pw_multi_aff_list::dump() const {
   isl_union_pw_multi_aff_list_dump(get());
@@ -18041,6 +20068,12 @@
   return manage(res);
 }
 
+union_pw_multi_aff_list union_pw_multi_aff_list::clear() const
+{
+  auto res = isl_union_pw_multi_aff_list_clear(copy());
+  return manage(res);
+}
+
 union_pw_multi_aff_list union_pw_multi_aff_list::concat(union_pw_multi_aff_list list2) const
 {
   auto res = isl_union_pw_multi_aff_list_concat(copy(), list2.release());
@@ -18091,7 +20124,7 @@
   return manage(res);
 }
 
-int union_pw_multi_aff_list::n_union_pw_multi_aff() const
+isl_size union_pw_multi_aff_list::n_union_pw_multi_aff() const
 {
   auto res = isl_union_pw_multi_aff_list_n_union_pw_multi_aff(get());
   return res;
@@ -18109,7 +20142,7 @@
   return manage(res);
 }
 
-int union_pw_multi_aff_list::size() const
+isl_size union_pw_multi_aff_list::size() const
 {
   auto res = isl_union_pw_multi_aff_list_size(get());
   return res;
@@ -18221,7 +20254,7 @@
   return manage(res);
 }
 
-unsigned int union_pw_qpolynomial::dim(isl::dim type) const
+isl_size union_pw_qpolynomial::dim(isl::dim type) const
 {
   auto res = isl_union_pw_qpolynomial_dim(get(), static_cast<enum isl_dim_type>(type));
   return res;
@@ -18245,9 +20278,9 @@
   return manage(res);
 }
 
-pw_qpolynomial union_pw_qpolynomial::extract_pw_qpolynomial(space dim) const
+pw_qpolynomial union_pw_qpolynomial::extract_pw_qpolynomial(space space) const
 {
-  auto res = isl_union_pw_qpolynomial_extract_pw_qpolynomial(get(), dim.release());
+  auto res = isl_union_pw_qpolynomial_extract_pw_qpolynomial(get(), space.release());
   return manage(res);
 }
 
@@ -18307,6 +20340,30 @@
   return manage(res);
 }
 
+union_pw_qpolynomial union_pw_qpolynomial::intersect_domain_space(space space) const
+{
+  auto res = isl_union_pw_qpolynomial_intersect_domain_space(copy(), space.release());
+  return manage(res);
+}
+
+union_pw_qpolynomial union_pw_qpolynomial::intersect_domain_union_set(union_set uset) const
+{
+  auto res = isl_union_pw_qpolynomial_intersect_domain_union_set(copy(), uset.release());
+  return manage(res);
+}
+
+union_pw_qpolynomial union_pw_qpolynomial::intersect_domain_wrapped_domain(union_set uset) const
+{
+  auto res = isl_union_pw_qpolynomial_intersect_domain_wrapped_domain(copy(), uset.release());
+  return manage(res);
+}
+
+union_pw_qpolynomial union_pw_qpolynomial::intersect_domain_wrapped_range(union_set uset) const
+{
+  auto res = isl_union_pw_qpolynomial_intersect_domain_wrapped_range(copy(), uset.release());
+  return manage(res);
+}
+
 union_pw_qpolynomial union_pw_qpolynomial::intersect_params(set set) const
 {
   auto res = isl_union_pw_qpolynomial_intersect_params(copy(), set.release());
@@ -18325,7 +20382,7 @@
   return manage(res);
 }
 
-int union_pw_qpolynomial::n_pw_qpolynomial() const
+isl_size union_pw_qpolynomial::n_pw_qpolynomial() const
 {
   auto res = isl_union_pw_qpolynomial_n_pw_qpolynomial(get());
   return res;
@@ -18373,15 +20430,39 @@
   return manage(res);
 }
 
+union_pw_qpolynomial union_pw_qpolynomial::subtract_domain_space(space space) const
+{
+  auto res = isl_union_pw_qpolynomial_subtract_domain_space(copy(), space.release());
+  return manage(res);
+}
+
+union_pw_qpolynomial union_pw_qpolynomial::subtract_domain_union_set(union_set uset) const
+{
+  auto res = isl_union_pw_qpolynomial_subtract_domain_union_set(copy(), uset.release());
+  return manage(res);
+}
+
 union_pw_qpolynomial union_pw_qpolynomial::to_polynomial(int sign) const
 {
   auto res = isl_union_pw_qpolynomial_to_polynomial(copy(), sign);
   return manage(res);
 }
 
-union_pw_qpolynomial union_pw_qpolynomial::zero(space dim)
+union_pw_qpolynomial union_pw_qpolynomial::zero(space space)
 {
-  auto res = isl_union_pw_qpolynomial_zero(dim.release());
+  auto res = isl_union_pw_qpolynomial_zero(space.release());
+  return manage(res);
+}
+
+union_pw_qpolynomial union_pw_qpolynomial::zero_ctx(ctx ctx)
+{
+  auto res = isl_union_pw_qpolynomial_zero_ctx(ctx.release());
+  return manage(res);
+}
+
+union_pw_qpolynomial union_pw_qpolynomial::zero_space(space space)
+{
+  auto res = isl_union_pw_qpolynomial_zero_space(space.release());
   return manage(res);
 }
 
@@ -18414,16 +20495,16 @@
   auto res = isl_union_set_from_basic_set(bset.release());
   ptr = res;
 }
-union_set::union_set(set set)
-{
-  auto res = isl_union_set_from_set(set.release());
-  ptr = res;
-}
 union_set::union_set(point pnt)
 {
   auto res = isl_union_set_from_point(pnt.release());
   ptr = res;
 }
+union_set::union_set(set set)
+{
+  auto res = isl_union_set_from_set(set.release());
+  ptr = res;
+}
 union_set::union_set(ctx ctx, const std::string &str)
 {
   auto res = isl_union_set_read_from_str(ctx.release(), str.c_str());
@@ -18534,7 +20615,7 @@
   return manage(res);
 }
 
-unsigned int union_set::dim(isl::dim type) const
+isl_size union_set::dim(isl::dim type) const
 {
   auto res = isl_union_set_dim(get(), static_cast<enum isl_dim_type>(type));
   return res;
@@ -18546,9 +20627,21 @@
   return manage(res);
 }
 
-set union_set::extract_set(space dim) const
+union_set union_set::empty(ctx ctx)
 {
-  auto res = isl_union_set_extract_set(get(), dim.release());
+  auto res = isl_union_set_empty_ctx(ctx.release());
+  return manage(res);
+}
+
+union_set union_set::empty_space(space space)
+{
+  auto res = isl_union_set_empty_space(space.release());
+  return manage(res);
+}
+
+set union_set::extract_set(space space) const
+{
+  auto res = isl_union_set_extract_set(get(), space.release());
   return manage(res);
 }
 
@@ -18676,6 +20769,12 @@
   return manage(res);
 }
 
+boolean union_set::isa_set() const
+{
+  auto res = isl_union_set_isa_set(get());
+  return manage(res);
+}
+
 union_map union_set::lex_ge_union_set(union_set uset2) const
 {
   auto res = isl_union_set_lex_ge_union_set(copy(), uset2.release());
@@ -18718,7 +20817,7 @@
   return manage(res);
 }
 
-int union_set::n_set() const
+isl_size union_set::n_set() const
 {
   auto res = isl_union_set_n_set(get());
   return res;
@@ -18766,6 +20865,12 @@
   return manage(res);
 }
 
+union_set union_set::project_out_all_params() const
+{
+  auto res = isl_union_set_project_out_all_params(copy());
+  return manage(res);
+}
+
 union_set union_set::remove_divs() const
 {
   auto res = isl_union_set_remove_divs(copy());
@@ -18898,6 +21003,15 @@
 ctx union_set_list::get_ctx() const {
   return ctx(isl_union_set_list_get_ctx(ptr));
 }
+std::string union_set_list::to_str() const {
+  char *Tmp = isl_union_set_list_to_str(get());
+  if (!Tmp)
+    return "";
+  std::string S(Tmp);
+  free(Tmp);
+  return S;
+}
+
 
 void union_set_list::dump() const {
   isl_union_set_list_dump(get());
@@ -18916,6 +21030,12 @@
   return manage(res);
 }
 
+union_set_list union_set_list::clear() const
+{
+  auto res = isl_union_set_list_clear(copy());
+  return manage(res);
+}
+
 union_set_list union_set_list::concat(union_set_list list2) const
 {
   auto res = isl_union_set_list_concat(copy(), list2.release());
@@ -18966,7 +21086,7 @@
   return manage(res);
 }
 
-int union_set_list::n_union_set() const
+isl_size union_set_list::n_union_set() const
 {
   auto res = isl_union_set_list_n_union_set(get());
   return res;
@@ -18984,7 +21104,7 @@
   return manage(res);
 }
 
-int union_set_list::size() const
+isl_size union_set_list::size() const
 {
   auto res = isl_union_set_list_size(get());
   return res;
@@ -19026,16 +21146,16 @@
 val::val(__isl_take isl_val *ptr)
     : ptr(ptr) {}
 
-val::val(ctx ctx, const std::string &str)
-{
-  auto res = isl_val_read_from_str(ctx.release(), str.c_str());
-  ptr = res;
-}
 val::val(ctx ctx, long i)
 {
   auto res = isl_val_int_from_si(ctx.release(), i);
   ptr = res;
 }
+val::val(ctx ctx, const std::string &str)
+{
+  auto res = isl_val_read_from_str(ctx.release(), str.c_str());
+  ptr = res;
+}
 
 val &val::operator=(val obj) {
   std::swap(this->ptr, obj.ptr);
@@ -19141,6 +21261,12 @@
   return manage(res);
 }
 
+boolean val::eq_si(long i) const
+{
+  auto res = isl_val_eq_si(get(), i);
+  return manage(res);
+}
+
 val val::floor() const
 {
   auto res = isl_val_floor(copy());
@@ -19321,7 +21447,7 @@
   return manage(res);
 }
 
-size_t val::n_abs_num_chunks(size_t size) const
+isl_size val::n_abs_num_chunks(size_t size) const
 {
   auto res = isl_val_n_abs_num_chunks(get(), size);
   return res;
@@ -19465,6 +21591,15 @@
 ctx val_list::get_ctx() const {
   return ctx(isl_val_list_get_ctx(ptr));
 }
+std::string val_list::to_str() const {
+  char *Tmp = isl_val_list_to_str(get());
+  if (!Tmp)
+    return "";
+  std::string S(Tmp);
+  free(Tmp);
+  return S;
+}
+
 
 void val_list::dump() const {
   isl_val_list_dump(get());
@@ -19483,6 +21618,12 @@
   return manage(res);
 }
 
+val_list val_list::clear() const
+{
+  auto res = isl_val_list_clear(copy());
+  return manage(res);
+}
+
 val_list val_list::concat(val_list list2) const
 {
   auto res = isl_val_list_concat(copy(), list2.release());
@@ -19533,7 +21674,7 @@
   return manage(res);
 }
 
-int val_list::n_val() const
+isl_size val_list::n_val() const
 {
   auto res = isl_val_list_n_val(get());
   return res;
@@ -19551,7 +21692,7 @@
   return manage(res);
 }
 
-int val_list::size() const
+isl_size val_list::size() const
 {
   auto res = isl_val_list_size(get());
   return res;
@@ -19749,7 +21890,7 @@
   return manage(res);
 }
 
-int vec::size() const
+isl_size vec::size() const
 {
   auto res = isl_vec_size(get());
   return res;
diff --git a/lib/Support/ISLTools.cpp b/lib/Support/ISLTools.cpp
index ec4d46b..5ea9d0b 100644
--- a/lib/Support/ISLTools.cpp
+++ b/lib/Support/ISLTools.cpp
@@ -157,10 +157,9 @@
   return Result;
 }
 
-unsigned polly::getNumScatterDims(const isl::union_map &Schedule) {
-  unsigned Dims = 0;
+isl_size polly::getNumScatterDims(const isl::union_map &Schedule) {
+  isl_size Dims = 0;
   for (isl::map Map : Schedule.get_map_list()) {
-    // Map.dim would return UINT_MAX.
     if (!Map)
       continue;
 
diff --git a/lib/Transform/FlattenAlgo.cpp b/lib/Transform/FlattenAlgo.cpp
index c7d02c1..31f692a 100644
--- a/lib/Transform/FlattenAlgo.cpp
+++ b/lib/Transform/FlattenAlgo.cpp
@@ -129,10 +129,14 @@
 /// Because this function takes an isl_union_map, the out dimensions could be
 /// different. We return the maximum number in this case. However, a different
 /// number of dimensions is not supported by the other code in this file.
-size_t scheduleScatterDims(const isl::union_map &Schedule) {
-  unsigned Dims = 0;
-  for (isl::map Map : Schedule.get_map_list())
+isl_size scheduleScatterDims(const isl::union_map &Schedule) {
+  isl_size Dims = 0;
+  for (isl::map Map : Schedule.get_map_list()) {
+    if (!Map)
+      continue;
+
     Dims = std::max(Dims, Map.dim(isl::dim::out));
+  }
   return Dims;
 }
 
diff --git a/lib/Transform/ScheduleOptimizer.cpp b/lib/Transform/ScheduleOptimizer.cpp
index 95a881e..9e82744 100644
--- a/lib/Transform/ScheduleOptimizer.cpp
+++ b/lib/Transform/ScheduleOptimizer.cpp
@@ -55,6 +55,7 @@
 #include "polly/ScopPass.h"
 #include "polly/Simplify.h"
 #include "polly/Support/ISLOStream.h"
+#include "llvm/ADT/Sequence.h"
 #include "llvm/ADT/Statistic.h"
 #include "llvm/Analysis/TargetTransformInfo.h"
 #include "llvm/IR/Function.h"
@@ -606,8 +607,8 @@
 /// @param OutDimsNum    A number of dimensions that should belong to
 ///                      the current band node.
 static isl::union_set getIsolateOptions(isl::set IsolateDomain,
-                                        unsigned OutDimsNum) {
-  unsigned Dims = IsolateDomain.dim(isl::dim::set);
+                                        isl_size OutDimsNum) {
+  isl_size Dims = IsolateDomain.dim(isl::dim::set);
   assert(OutDimsNum <= Dims &&
          "The isl::set IsolateDomain is used to describe the range of schedule "
          "dimensions values, which should be isolated. Consequently, the "
@@ -672,7 +673,7 @@
 
 isl::set polly::getPartialTilePrefixes(isl::set ScheduleRange,
                                        int VectorWidth) {
-  unsigned Dims = ScheduleRange.dim(isl::dim::set);
+  isl_size Dims = ScheduleRange.dim(isl::dim::set);
   isl::set LoopPrefixes =
       ScheduleRange.drop_constraints_involving_dims(isl::dim::set, Dims - 1, 1);
   auto ExtentPrefixes = addExtentConstraints(LoopPrefixes, VectorWidth);
@@ -705,15 +706,15 @@
   assert(isl_schedule_node_get_type(Node.get()) == isl_schedule_node_band);
 
   auto Space = isl::manage(isl_schedule_node_band_get_space(Node.get()));
-  auto ScheduleDimensions = Space.dim(isl::dim::set);
-  assert(DimToVectorize < ScheduleDimensions);
+  isl_size ScheduleDimensions = Space.dim(isl::dim::set);
+  assert((isl_size)DimToVectorize < ScheduleDimensions);
 
   if (DimToVectorize > 0) {
     Node = isl::manage(
         isl_schedule_node_band_split(Node.release(), DimToVectorize));
     Node = Node.child(0);
   }
-  if (DimToVectorize < ScheduleDimensions - 1)
+  if ((isl_size)DimToVectorize < ScheduleDimensions - 1)
     Node = isl::manage(isl_schedule_node_band_split(Node.release(), 1));
   Space = isl::manage(isl_schedule_node_band_get_space(Node.get()));
   auto Sizes = isl::multi_val::zero(Space);
@@ -743,8 +744,9 @@
   auto Dims = Space.dim(isl::dim::set);
   auto Sizes = isl::multi_val::zero(Space);
   std::string IdentifierString(Identifier);
-  for (unsigned i = 0; i < Dims; i++) {
-    auto tileSize = i < TileSizes.size() ? TileSizes[i] : DefaultTileSize;
+  for (auto i : seq<isl_size>(0, Dims)) {
+    auto tileSize =
+        i < (isl_size)TileSizes.size() ? TileSizes[i] : DefaultTileSize;
     Sizes = Sizes.set_val(i, isl::val(Node.get_ctx(), tileSize));
   }
   auto TileLoopMarkerStr = IdentifierString + " - Tiles";
@@ -861,7 +863,8 @@
 /// @return        The modified map.
 isl::map permuteDimensions(isl::map Map, isl::dim DimType, unsigned DstPos,
                            unsigned SrcPos) {
-  assert(DstPos < Map.dim(DimType) && SrcPos < Map.dim(DimType));
+  assert((isl_size)DstPos < Map.dim(DimType) &&
+         (isl_size)SrcPos < Map.dim(DimType));
   if (DstPos == SrcPos)
     return Map;
   isl::id DimId;
@@ -989,7 +992,7 @@
                                     MatMulInfoTy &MMI) {
   auto InputDimId = PartialSchedule.get_tuple_id(isl::dim::in);
   auto *Stmt = static_cast<ScopStmt *>(InputDimId.get_user());
-  unsigned OutDimNum = PartialSchedule.dim(isl::dim::out);
+  isl_size OutDimNum = PartialSchedule.dim(isl::dim::out);
   assert(OutDimNum > 2 && "In case of the matrix multiplication the loop nest "
                           "and, consequently, the corresponding scheduling "
                           "functions have at least three dimensions.");
@@ -1035,7 +1038,7 @@
   auto DomainSpace = Schedule.get_space().domain();
   auto Space = DomainSpace.map_from_domain_and_range(DomainSpace);
   auto Deltas = Dep.extract_map(Space).deltas();
-  int DeltasDimNum = Deltas.dim(isl::dim::set);
+  isl_size DeltasDimNum = Deltas.dim(isl::dim::set);
   for (int i = 0; i < DeltasDimNum; i++) {
     auto Val = Deltas.plain_get_val_if_fixed(isl::dim::set, i);
     Pos = Pos < 0 && Val.is_one() ? i : Pos;
@@ -1503,7 +1506,7 @@
   isl::schedule_node Child = Node.get_child(0);
   isl::union_map UnMapOldIndVar = Child.get_prefix_schedule_relation();
   isl::set Prefix = isl::map::from_union_map(UnMapOldIndVar).range();
-  unsigned Dims = Prefix.dim(isl::dim::set);
+  isl_size Dims = Prefix.dim(isl::dim::set);
   Prefix = Prefix.project_out(isl::dim::set, Dims - 1, 1);
   Prefix = getPartialTilePrefixes(Prefix, MicroKernelParams.Nr);
   Prefix = getPartialTilePrefixes(Prefix, MicroKernelParams.Mr);
@@ -1562,7 +1565,7 @@
   auto Domain = Node.get_universe_domain();
   assert(isl_union_set_n_set(Domain.get()) == 1);
   if (Node.get_schedule_depth() != 0 ||
-      (static_cast<isl_size>(isl::set(Domain).dim(isl::dim::set)) !=
+      (isl::set(Domain).dim(isl::dim::set) !=
        isl_schedule_node_band_n_member(Node.get())))
     return Node;
   Node = isl::manage(isl_schedule_node_delete(Node.copy()));
diff --git a/unittests/Isl/IslTest.cpp b/unittests/Isl/IslTest.cpp
index d319c64..bb15cc1 100644
--- a/unittests/Isl/IslTest.cpp
+++ b/unittests/Isl/IslTest.cpp
@@ -656,16 +656,16 @@
                                                         &isl_ctx_free);
 
   // Basic usage
-  EXPECT_EQ(0u, getNumScatterDims(UMAP("{ [] -> [] }")));
-  EXPECT_EQ(1u, getNumScatterDims(UMAP("{ [] -> [i] }")));
-  EXPECT_EQ(2u, getNumScatterDims(UMAP("{ [] -> [i,j] }")));
-  EXPECT_EQ(3u, getNumScatterDims(UMAP("{ [] -> [i,j,k] }")));
+  EXPECT_EQ(0, getNumScatterDims(UMAP("{ [] -> [] }")));
+  EXPECT_EQ(1, getNumScatterDims(UMAP("{ [] -> [i] }")));
+  EXPECT_EQ(2, getNumScatterDims(UMAP("{ [] -> [i,j] }")));
+  EXPECT_EQ(3, getNumScatterDims(UMAP("{ [] -> [i,j,k] }")));
 
   // Different scatter spaces
-  EXPECT_EQ(0u, getNumScatterDims(UMAP("{ A[] -> []; [] -> []}")));
-  EXPECT_EQ(1u, getNumScatterDims(UMAP("{ A[] -> []; [] -> [i] }")));
-  EXPECT_EQ(2u, getNumScatterDims(UMAP("{ A[] -> [i]; [] -> [i,j] }")));
-  EXPECT_EQ(3u, getNumScatterDims(UMAP("{ A[] -> [i]; [] -> [i,j,k] }")));
+  EXPECT_EQ(0, getNumScatterDims(UMAP("{ A[] -> []; [] -> []}")));
+  EXPECT_EQ(1, getNumScatterDims(UMAP("{ A[] -> []; [] -> [i] }")));
+  EXPECT_EQ(2, getNumScatterDims(UMAP("{ A[] -> [i]; [] -> [i,j] }")));
+  EXPECT_EQ(3, getNumScatterDims(UMAP("{ A[] -> [i]; [] -> [i,j,k] }")));
 }
 
 TEST(ISLTools, getScatterSpace) {