add isl_map_equate
[platform/upstream/isl.git] / doc / user.pod
1 =head1 Introduction
2
3 C<isl> is a thread-safe C library for manipulating
4 sets and relations of integer points bounded by affine constraints.
5 The descriptions of the sets and relations may involve
6 both parameters and existentially quantified variables.
7 All computations are performed in exact integer arithmetic
8 using C<GMP>.
9 The C<isl> library offers functionality that is similar
10 to that offered by the C<Omega> and C<Omega+> libraries,
11 but the underlying algorithms are in most cases completely different.
12
13 The library is by no means complete and some fairly basic
14 functionality is still missing.
15 Still, even in its current form, the library has been successfully
16 used as a backend polyhedral library for the polyhedral
17 scanner C<CLooG> and as part of an equivalence checker of
18 static affine programs.
19 For bug reports, feature requests and questions,
20 visit the the discussion group at
21 L<http://groups.google.com/group/isl-development>.
22
23 =head2 Backward Incompatible Changes
24
25 =head3 Changes since isl-0.02
26
27 =over
28
29 =item * The old printing functions have been deprecated
30 and replaced by C<isl_printer> functions, see L<Input and Output>.
31
32 =item * Most functions related to dependence analysis have acquired
33 an extra C<must> argument.  To obtain the old behavior, this argument
34 should be given the value 1.  See L<Dependence Analysis>.
35
36 =back
37
38 =head3 Changes since isl-0.03
39
40 =over
41
42 =item * The function C<isl_pw_qpolynomial_fold_add> has been
43 renamed to C<isl_pw_qpolynomial_fold_fold>.
44 Similarly, C<isl_union_pw_qpolynomial_fold_add> has been
45 renamed to C<isl_union_pw_qpolynomial_fold_fold>.
46
47 =back
48
49 =head3 Changes since isl-0.04
50
51 =over
52
53 =item * All header files have been renamed from C<isl_header.h>
54 to C<isl/header.h>.
55
56 =back
57
58 =head3 Changes since isl-0.05
59
60 =over
61
62 =item * The functions C<isl_printer_print_basic_set> and
63 C<isl_printer_print_basic_map> no longer print a newline.
64
65 =item * The functions C<isl_flow_get_no_source>
66 and C<isl_union_map_compute_flow> now return
67 the accesses for which no source could be found instead of
68 the iterations where those accesses occur.
69
70 =item * The functions C<isl_basic_map_identity> and
71 C<isl_map_identity> now take the dimension specification
72 of a B<map> as input.  An old call
73 C<isl_map_identity(dim)> can be rewritten to
74 C<isl_map_identity(isl_dim_map_from_set(dim))>.
75
76 =item * The function C<isl_map_power> no longer takes
77 a parameter position as input.  Instead, the exponent
78 is now expressed as the domain of the resulting relation.
79
80 =back
81
82 =head3 Changes since isl-0.06
83
84 =over
85
86 =item * The format of C<isl_printer_print_qpolynomial>'s
87 C<ISL_FORMAT_ISL> output has changed.
88 Use C<ISL_FORMAT_C> to obtain the old output.
89
90 =item * The C<*_fast_*> functions have been renamed to C<*_plain_*>.
91 Some of the old names have been kept for backward compatibility,
92 but they will be removed in the future.
93
94 =back
95
96 =head1 Installation
97
98 The source of C<isl> can be obtained either as a tarball
99 or from the git repository.  Both are available from
100 L<http://freshmeat.net/projects/isl/>.
101 The installation process depends on how you obtained
102 the source.
103
104 =head2 Installation from the git repository
105
106 =over
107
108 =item 1 Clone or update the repository
109
110 The first time the source is obtained, you need to clone
111 the repository.
112
113         git clone git://repo.or.cz/isl.git
114
115 To obtain updates, you need to pull in the latest changes
116
117         git pull
118
119 =item 2 Generate C<configure>
120
121         ./autogen.sh
122
123 =back
124
125 After performing the above steps, continue
126 with the L<Common installation instructions>.
127
128 =head2 Common installation instructions
129
130 =over
131
132 =item 1 Obtain C<GMP>
133
134 Building C<isl> requires C<GMP>, including its headers files.
135 Your distribution may not provide these header files by default
136 and you may need to install a package called C<gmp-devel> or something
137 similar.  Alternatively, C<GMP> can be built from
138 source, available from L<http://gmplib.org/>.
139
140 =item 2 Configure
141
142 C<isl> uses the standard C<autoconf> C<configure> script.
143 To run it, just type
144
145         ./configure
146
147 optionally followed by some configure options.
148 A complete list of options can be obtained by running
149
150         ./configure --help
151
152 Below we discuss some of the more common options.
153
154 C<isl> can optionally use C<piplib>, but no
155 C<piplib> functionality is currently used by default.
156 The C<--with-piplib> option can
157 be used to specify which C<piplib>
158 library to use, either an installed version (C<system>),
159 an externally built version (C<build>)
160 or no version (C<no>).  The option C<build> is mostly useful
161 in C<configure> scripts of larger projects that bundle both C<isl>
162 and C<piplib>.
163
164 =over
165
166 =item C<--prefix>
167
168 Installation prefix for C<isl>
169
170 =item C<--with-gmp-prefix>
171
172 Installation prefix for C<GMP> (architecture-independent files).
173
174 =item C<--with-gmp-exec-prefix>
175
176 Installation prefix for C<GMP> (architecture-dependent files).
177
178 =item C<--with-piplib>
179
180 Which copy of C<piplib> to use, either C<no> (default), C<system> or C<build>.
181
182 =item C<--with-piplib-prefix>
183
184 Installation prefix for C<system> C<piplib> (architecture-independent files).
185
186 =item C<--with-piplib-exec-prefix>
187
188 Installation prefix for C<system> C<piplib> (architecture-dependent files).
189
190 =item C<--with-piplib-builddir>
191
192 Location where C<build> C<piplib> was built.
193
194 =back
195
196 =item 3 Compile
197
198         make
199
200 =item 4 Install (optional)
201
202         make install
203
204 =back
205
206 =head1 Library
207
208 =head2 Initialization
209
210 All manipulations of integer sets and relations occur within
211 the context of an C<isl_ctx>.
212 A given C<isl_ctx> can only be used within a single thread.
213 All arguments of a function are required to have been allocated
214 within the same context.
215 There are currently no functions available for moving an object
216 from one C<isl_ctx> to another C<isl_ctx>.  This means that
217 there is currently no way of safely moving an object from one
218 thread to another, unless the whole C<isl_ctx> is moved.
219
220 An C<isl_ctx> can be allocated using C<isl_ctx_alloc> and
221 freed using C<isl_ctx_free>.
222 All objects allocated within an C<isl_ctx> should be freed
223 before the C<isl_ctx> itself is freed.
224
225         isl_ctx *isl_ctx_alloc();
226         void isl_ctx_free(isl_ctx *ctx);
227
228 =head2 Integers
229
230 All operations on integers, mainly the coefficients
231 of the constraints describing the sets and relations,
232 are performed in exact integer arithmetic using C<GMP>.
233 However, to allow future versions of C<isl> to optionally
234 support fixed integer arithmetic, all calls to C<GMP>
235 are wrapped inside C<isl> specific macros.
236 The basic type is C<isl_int> and the operations below
237 are available on this type.
238 The meanings of these operations are essentially the same
239 as their C<GMP> C<mpz_> counterparts.
240 As always with C<GMP> types, C<isl_int>s need to be
241 initialized with C<isl_int_init> before they can be used
242 and they need to be released with C<isl_int_clear>
243 after the last use.
244 The user should not assume that an C<isl_int> is represented
245 as a C<mpz_t>, but should instead explicitly convert between
246 C<mpz_t>s and C<isl_int>s using C<isl_int_set_gmp> and
247 C<isl_int_get_gmp> whenever a C<mpz_t> is required.
248
249 =over
250
251 =item isl_int_init(i)
252
253 =item isl_int_clear(i)
254
255 =item isl_int_set(r,i)
256
257 =item isl_int_set_si(r,i)
258
259 =item isl_int_set_gmp(r,g)
260
261 =item isl_int_get_gmp(i,g)
262
263 =item isl_int_abs(r,i)
264
265 =item isl_int_neg(r,i)
266
267 =item isl_int_swap(i,j)
268
269 =item isl_int_swap_or_set(i,j)
270
271 =item isl_int_add_ui(r,i,j)
272
273 =item isl_int_sub_ui(r,i,j)
274
275 =item isl_int_add(r,i,j)
276
277 =item isl_int_sub(r,i,j)
278
279 =item isl_int_mul(r,i,j)
280
281 =item isl_int_mul_ui(r,i,j)
282
283 =item isl_int_addmul(r,i,j)
284
285 =item isl_int_submul(r,i,j)
286
287 =item isl_int_gcd(r,i,j)
288
289 =item isl_int_lcm(r,i,j)
290
291 =item isl_int_divexact(r,i,j)
292
293 =item isl_int_cdiv_q(r,i,j)
294
295 =item isl_int_fdiv_q(r,i,j)
296
297 =item isl_int_fdiv_r(r,i,j)
298
299 =item isl_int_fdiv_q_ui(r,i,j)
300
301 =item isl_int_read(r,s)
302
303 =item isl_int_print(out,i,width)
304
305 =item isl_int_sgn(i)
306
307 =item isl_int_cmp(i,j)
308
309 =item isl_int_cmp_si(i,si)
310
311 =item isl_int_eq(i,j)
312
313 =item isl_int_ne(i,j)
314
315 =item isl_int_lt(i,j)
316
317 =item isl_int_le(i,j)
318
319 =item isl_int_gt(i,j)
320
321 =item isl_int_ge(i,j)
322
323 =item isl_int_abs_eq(i,j)
324
325 =item isl_int_abs_ne(i,j)
326
327 =item isl_int_abs_lt(i,j)
328
329 =item isl_int_abs_gt(i,j)
330
331 =item isl_int_abs_ge(i,j)
332
333 =item isl_int_is_zero(i)
334
335 =item isl_int_is_one(i)
336
337 =item isl_int_is_negone(i)
338
339 =item isl_int_is_pos(i)
340
341 =item isl_int_is_neg(i)
342
343 =item isl_int_is_nonpos(i)
344
345 =item isl_int_is_nonneg(i)
346
347 =item isl_int_is_divisible_by(i,j)
348
349 =back
350
351 =head2 Sets and Relations
352
353 C<isl> uses six types of objects for representing sets and relations,
354 C<isl_basic_set>, C<isl_basic_map>, C<isl_set>, C<isl_map>,
355 C<isl_union_set> and C<isl_union_map>.
356 C<isl_basic_set> and C<isl_basic_map> represent sets and relations that
357 can be described as a conjunction of affine constraints, while
358 C<isl_set> and C<isl_map> represent unions of
359 C<isl_basic_set>s and C<isl_basic_map>s, respectively.
360 However, all C<isl_basic_set>s or C<isl_basic_map>s in the union need
361 to have the same dimension.  C<isl_union_set>s and C<isl_union_map>s
362 represent unions of C<isl_set>s or C<isl_map>s of I<different> dimensions,
363 where dimensions with different space names
364 (see L<Dimension Specifications>) are considered different as well.
365 The difference between sets and relations (maps) is that sets have
366 one set of variables, while relations have two sets of variables,
367 input variables and output variables.
368
369 =head2 Memory Management
370
371 Since a high-level operation on sets and/or relations usually involves
372 several substeps and since the user is usually not interested in
373 the intermediate results, most functions that return a new object
374 will also release all the objects passed as arguments.
375 If the user still wants to use one or more of these arguments
376 after the function call, she should pass along a copy of the
377 object rather than the object itself.
378 The user is then responsible for making sure that the original
379 object gets used somewhere else or is explicitly freed.
380
381 The arguments and return values of all documents functions are
382 annotated to make clear which arguments are released and which
383 arguments are preserved.  In particular, the following annotations
384 are used
385
386 =over
387
388 =item C<__isl_give>
389
390 C<__isl_give> means that a new object is returned.
391 The user should make sure that the returned pointer is
392 used exactly once as a value for an C<__isl_take> argument.
393 In between, it can be used as a value for as many
394 C<__isl_keep> arguments as the user likes.
395 There is one exception, and that is the case where the
396 pointer returned is C<NULL>.  Is this case, the user
397 is free to use it as an C<__isl_take> argument or not.
398
399 =item C<__isl_take>
400
401 C<__isl_take> means that the object the argument points to
402 is taken over by the function and may no longer be used
403 by the user as an argument to any other function.
404 The pointer value must be one returned by a function
405 returning an C<__isl_give> pointer.
406 If the user passes in a C<NULL> value, then this will
407 be treated as an error in the sense that the function will
408 not perform its usual operation.  However, it will still
409 make sure that all the the other C<__isl_take> arguments
410 are released.
411
412 =item C<__isl_keep>
413
414 C<__isl_keep> means that the function will only use the object
415 temporarily.  After the function has finished, the user
416 can still use it as an argument to other functions.
417 A C<NULL> value will be treated in the same way as
418 a C<NULL> value for an C<__isl_take> argument.
419
420 =back
421
422 =head2 Dimension Specifications
423
424 Whenever a new set or relation is created from scratch,
425 its dimension needs to be specified using an C<isl_dim>.
426
427         #include <isl/dim.h>
428         __isl_give isl_dim *isl_dim_alloc(isl_ctx *ctx,
429                 unsigned nparam, unsigned n_in, unsigned n_out);
430         __isl_give isl_dim *isl_dim_set_alloc(isl_ctx *ctx,
431                 unsigned nparam, unsigned dim);
432         __isl_give isl_dim *isl_dim_copy(__isl_keep isl_dim *dim);
433         void isl_dim_free(__isl_take isl_dim *dim);
434         unsigned isl_dim_size(__isl_keep isl_dim *dim,
435                 enum isl_dim_type type);
436
437 The dimension specification used for creating a set
438 needs to be created using C<isl_dim_set_alloc>, while
439 that for creating a relation
440 needs to be created using C<isl_dim_alloc>.
441 C<isl_dim_size> can be used
442 to find out the number of dimensions of each type in
443 a dimension specification, where type may be
444 C<isl_dim_param>, C<isl_dim_in> (only for relations),
445 C<isl_dim_out> (only for relations), C<isl_dim_set>
446 (only for sets) or C<isl_dim_all>.
447
448 It is often useful to create objects that live in the
449 same space as some other object.  This can be accomplished
450 by creating the new objects
451 (see L<Creating New Sets and Relations> or
452 L<Creating New (Piecewise) Quasipolynomials>) based on the dimension
453 specification of the original object.
454
455         #include <isl/set.h>
456         __isl_give isl_dim *isl_basic_set_get_dim(
457                 __isl_keep isl_basic_set *bset);
458         __isl_give isl_dim *isl_set_get_dim(__isl_keep isl_set *set);
459
460         #include <isl/union_set.h>
461         __isl_give isl_dim *isl_union_set_get_dim(
462                 __isl_keep isl_union_set *uset);
463
464         #include <isl/map.h>
465         __isl_give isl_dim *isl_basic_map_get_dim(
466                 __isl_keep isl_basic_map *bmap);
467         __isl_give isl_dim *isl_map_get_dim(__isl_keep isl_map *map);
468
469         #include <isl/union_map.h>
470         __isl_give isl_dim *isl_union_map_get_dim(
471                 __isl_keep isl_union_map *umap);
472
473         #include <isl/constraint.h>
474         __isl_give isl_dim *isl_constraint_get_dim(
475                 __isl_keep isl_constraint *constraint);
476
477         #include <isl/polynomial.h>
478         __isl_give isl_dim *isl_qpolynomial_get_dim(
479                 __isl_keep isl_qpolynomial *qp);
480         __isl_give isl_dim *isl_qpolynomial_fold_get_dim(
481                 __isl_keep isl_qpolynomial_fold *fold);
482         __isl_give isl_dim *isl_pw_qpolynomial_get_dim(
483                 __isl_keep isl_pw_qpolynomial *pwqp);
484         __isl_give isl_dim *isl_union_pw_qpolynomial_get_dim(
485                 __isl_keep isl_union_pw_qpolynomial *upwqp);
486         __isl_give isl_dim *isl_union_pw_qpolynomial_fold_get_dim(
487                 __isl_keep isl_union_pw_qpolynomial_fold *upwf);
488
489         #include <isl/aff.h>
490         __isl_give isl_dim *isl_aff_get_dim(
491                 __isl_keep isl_aff *aff);
492         __isl_give isl_dim *isl_pw_aff_get_dim(
493                 __isl_keep isl_pw_aff *pwaff);
494
495         #include <isl/point.h>
496         __isl_give isl_dim *isl_point_get_dim(
497                 __isl_keep isl_point *pnt);
498
499 The names of the individual dimensions may be set or read off
500 using the following functions.
501
502         #include <isl/dim.h>
503         __isl_give isl_dim *isl_dim_set_name(__isl_take isl_dim *dim,
504                                  enum isl_dim_type type, unsigned pos,
505                                  __isl_keep const char *name);
506         __isl_keep const char *isl_dim_get_name(__isl_keep isl_dim *dim,
507                                  enum isl_dim_type type, unsigned pos);
508
509 Note that C<isl_dim_get_name> returns a pointer to some internal
510 data structure, so the result can only be used while the
511 corresponding C<isl_dim> is alive.
512 Also note that every function that operates on two sets or relations
513 requires that both arguments have the same parameters.  This also
514 means that if one of the arguments has named parameters, then the
515 other needs to have named parameters too and the names need to match.
516 Pairs of C<isl_union_set> and/or C<isl_union_map> arguments may
517 have different parameters (as long as they are named), in which case
518 the result will have as parameters the union of the parameters of
519 the arguments.
520
521 The names of entire spaces may be set or read off
522 using the following functions.
523
524         #include <isl/dim.h>
525         __isl_give isl_dim *isl_dim_set_tuple_name(
526                 __isl_take isl_dim *dim,
527                 enum isl_dim_type type, const char *s);
528         const char *isl_dim_get_tuple_name(__isl_keep isl_dim *dim,
529                 enum isl_dim_type type);
530
531 The C<dim> argument needs to be one of C<isl_dim_in>, C<isl_dim_out>
532 or C<isl_dim_set>.  As with C<isl_dim_get_name>,
533 the C<isl_dim_get_tuple_name> function returns a pointer to some internal
534 data structure.
535 Binary operations require the corresponding spaces of their arguments
536 to have the same name.
537
538 Spaces can be nested.  In particular, the domain of a set or
539 the domain or range of a relation can be a nested relation.
540 The following functions can be used to construct and deconstruct
541 such nested dimension specifications.
542
543         #include <isl/dim.h>
544         int isl_dim_is_wrapping(__isl_keep isl_dim *dim);
545         __isl_give isl_dim *isl_dim_wrap(__isl_take isl_dim *dim);
546         __isl_give isl_dim *isl_dim_unwrap(__isl_take isl_dim *dim);
547
548 The input to C<isl_dim_is_wrapping> and C<isl_dim_unwrap> should
549 be the dimension specification of a set, while that of
550 C<isl_dim_wrap> should be the dimension specification of a relation.
551 Conversely, the output of C<isl_dim_unwrap> is the dimension specification
552 of a relation, while that of C<isl_dim_wrap> is the dimension specification
553 of a set.
554
555 Dimension specifications can be created from other dimension
556 specifications using the following functions.
557
558         __isl_give isl_dim *isl_dim_domain(__isl_take isl_dim *dim);
559         __isl_give isl_dim *isl_dim_from_domain(__isl_take isl_dim *dim);
560         __isl_give isl_dim *isl_dim_range(__isl_take isl_dim *dim);
561         __isl_give isl_dim *isl_dim_from_range(__isl_take isl_dim *dim);
562         __isl_give isl_dim *isl_dim_reverse(__isl_take isl_dim *dim);
563         __isl_give isl_dim *isl_dim_join(__isl_take isl_dim *left,
564                 __isl_take isl_dim *right);
565         __isl_give isl_dim *isl_dim_align_params(
566                 __isl_take isl_dim *dim1, __isl_take isl_dim *dim2)
567         __isl_give isl_dim *isl_dim_insert(__isl_take isl_dim *dim,
568                 enum isl_dim_type type, unsigned pos, unsigned n);
569         __isl_give isl_dim *isl_dim_add(__isl_take isl_dim *dim,
570                 enum isl_dim_type type, unsigned n);
571         __isl_give isl_dim *isl_dim_drop(__isl_take isl_dim *dim,
572                 enum isl_dim_type type, unsigned first, unsigned n);
573         __isl_give isl_dim *isl_dim_map_from_set(
574                 __isl_take isl_dim *dim);
575         __isl_give isl_dim *isl_dim_zip(__isl_take isl_dim *dim);
576
577 Note that if dimensions are added or removed from a space, then
578 the name and the internal structure are lost.
579
580 =head2 Local Spaces
581
582 A local space is essentially a dimension specification with
583 zero or more existentially quantified variables.
584 The local space of a basic set or relation can be obtained
585 using the following functions.
586
587         #include <isl/set.h>
588         __isl_give isl_local_space *isl_basic_set_get_local_space(
589                 __isl_keep isl_basic_set *bset);
590
591         #include <isl/map.h>
592         __isl_give isl_local_space *isl_basic_map_get_local_space(
593                 __isl_keep isl_basic_map *bmap);
594
595 A new local space can be created from a dimension specification using
596
597         #include <isl/local_space.h>
598         __isl_give isl_local_space *isl_local_space_from_dim(
599                 __isl_take isl_dim *dim);
600
601 They can be inspected, copied and freed using the following functions.
602
603         #include <isl/local_space.h>
604         isl_ctx *isl_local_space_get_ctx(
605                 __isl_keep isl_local_space *ls);
606         int isl_local_space_dim(__isl_keep isl_local_space *ls,
607                 enum isl_dim_type type);
608         const char *isl_local_space_get_dim_name(
609                 __isl_keep isl_local_space *ls,
610                 enum isl_dim_type type, unsigned pos);
611         __isl_give isl_local_space *isl_local_space_set_dim_name(
612                 __isl_take isl_local_space *ls,
613                 enum isl_dim_type type, unsigned pos, const char *s);
614         __isl_give isl_dim *isl_local_space_get_dim(
615                 __isl_keep isl_local_space *ls);
616         __isl_give isl_div *isl_local_space_get_div(
617                 __isl_keep isl_local_space *ls, int pos);
618         __isl_give isl_local_space *isl_local_space_copy(
619                 __isl_keep isl_local_space *ls);
620         void *isl_local_space_free(__isl_take isl_local_space *ls);
621
622 Two local spaces can be compared using
623
624         int isl_local_space_is_equal(__isl_keep isl_local_space *ls1,
625                 __isl_keep isl_local_space *ls2);
626
627 Local spaces can be created from other local spaces
628 using the following functions.
629
630         __isl_give isl_local_space *isl_local_space_from_domain(
631                 __isl_take isl_local_space *ls);
632         __isl_give isl_local_space *isl_local_space_add_dims(
633                 __isl_take isl_local_space *ls,
634                 enum isl_dim_type type, unsigned n);
635         __isl_give isl_local_space *isl_local_space_insert_dims(
636                 __isl_take isl_local_space *ls,
637                 enum isl_dim_type type, unsigned first, unsigned n);
638         __isl_give isl_local_space *isl_local_space_drop_dims(
639                 __isl_take isl_local_space *ls,
640                 enum isl_dim_type type, unsigned first, unsigned n);
641
642 =head2 Input and Output
643
644 C<isl> supports its own input/output format, which is similar
645 to the C<Omega> format, but also supports the C<PolyLib> format
646 in some cases.
647
648 =head3 C<isl> format
649
650 The C<isl> format is similar to that of C<Omega>, but has a different
651 syntax for describing the parameters and allows for the definition
652 of an existentially quantified variable as the integer division
653 of an affine expression.
654 For example, the set of integers C<i> between C<0> and C<n>
655 such that C<i % 10 <= 6> can be described as
656
657         [n] -> { [i] : exists (a = [i/10] : 0 <= i and i <= n and
658                                 i - 10 a <= 6) }
659
660 A set or relation can have several disjuncts, separated
661 by the keyword C<or>.  Each disjunct is either a conjunction
662 of constraints or a projection (C<exists>) of a conjunction
663 of constraints.  The constraints are separated by the keyword
664 C<and>.
665
666 =head3 C<PolyLib> format
667
668 If the represented set is a union, then the first line
669 contains a single number representing the number of disjuncts.
670 Otherwise, a line containing the number C<1> is optional.
671
672 Each disjunct is represented by a matrix of constraints.
673 The first line contains two numbers representing
674 the number of rows and columns,
675 where the number of rows is equal to the number of constraints
676 and the number of columns is equal to two plus the number of variables.
677 The following lines contain the actual rows of the constraint matrix.
678 In each row, the first column indicates whether the constraint
679 is an equality (C<0>) or inequality (C<1>).  The final column
680 corresponds to the constant term.
681
682 If the set is parametric, then the coefficients of the parameters
683 appear in the last columns before the constant column.
684 The coefficients of any existentially quantified variables appear
685 between those of the set variables and those of the parameters.
686
687 =head3 Extended C<PolyLib> format
688
689 The extended C<PolyLib> format is nearly identical to the
690 C<PolyLib> format.  The only difference is that the line
691 containing the number of rows and columns of a constraint matrix
692 also contains four additional numbers:
693 the number of output dimensions, the number of input dimensions,
694 the number of local dimensions (i.e., the number of existentially
695 quantified variables) and the number of parameters.
696 For sets, the number of ``output'' dimensions is equal
697 to the number of set dimensions, while the number of ``input''
698 dimensions is zero.
699
700 =head3 Input
701
702         #include <isl/set.h>
703         __isl_give isl_basic_set *isl_basic_set_read_from_file(
704                 isl_ctx *ctx, FILE *input, int nparam);
705         __isl_give isl_basic_set *isl_basic_set_read_from_str(
706                 isl_ctx *ctx, const char *str, int nparam);
707         __isl_give isl_set *isl_set_read_from_file(isl_ctx *ctx,
708                 FILE *input, int nparam);
709         __isl_give isl_set *isl_set_read_from_str(isl_ctx *ctx,
710                 const char *str, int nparam);
711
712         #include <isl/map.h>
713         __isl_give isl_basic_map *isl_basic_map_read_from_file(
714                 isl_ctx *ctx, FILE *input, int nparam);
715         __isl_give isl_basic_map *isl_basic_map_read_from_str(
716                 isl_ctx *ctx, const char *str, int nparam);
717         __isl_give isl_map *isl_map_read_from_file(
718                 struct isl_ctx *ctx, FILE *input, int nparam);
719         __isl_give isl_map *isl_map_read_from_str(isl_ctx *ctx,
720                 const char *str, int nparam);
721
722         #include <isl/union_set.h>
723         __isl_give isl_union_set *isl_union_set_read_from_file(
724                 isl_ctx *ctx, FILE *input);
725         __isl_give isl_union_set *isl_union_set_read_from_str(
726                 struct isl_ctx *ctx, const char *str);
727
728         #include <isl/union_map.h>
729         __isl_give isl_union_map *isl_union_map_read_from_file(
730                 isl_ctx *ctx, FILE *input);
731         __isl_give isl_union_map *isl_union_map_read_from_str(
732                 struct isl_ctx *ctx, const char *str);
733
734 The input format is autodetected and may be either the C<PolyLib> format
735 or the C<isl> format.
736 C<nparam> specifies how many of the final columns in
737 the C<PolyLib> format correspond to parameters.
738 If input is given in the C<isl> format, then the number
739 of parameters needs to be equal to C<nparam>.
740 If C<nparam> is negative, then any number of parameters
741 is accepted in the C<isl> format and zero parameters
742 are assumed in the C<PolyLib> format.
743
744 =head3 Output
745
746 Before anything can be printed, an C<isl_printer> needs to
747 be created.
748
749         __isl_give isl_printer *isl_printer_to_file(isl_ctx *ctx,
750                 FILE *file);
751         __isl_give isl_printer *isl_printer_to_str(isl_ctx *ctx);
752         void isl_printer_free(__isl_take isl_printer *printer);
753         __isl_give char *isl_printer_get_str(
754                 __isl_keep isl_printer *printer);
755
756 The behavior of the printer can be modified in various ways
757
758         __isl_give isl_printer *isl_printer_set_output_format(
759                 __isl_take isl_printer *p, int output_format);
760         __isl_give isl_printer *isl_printer_set_indent(
761                 __isl_take isl_printer *p, int indent);
762         __isl_give isl_printer *isl_printer_indent(
763                 __isl_take isl_printer *p, int indent);
764         __isl_give isl_printer *isl_printer_set_prefix(
765                 __isl_take isl_printer *p, const char *prefix);
766         __isl_give isl_printer *isl_printer_set_suffix(
767                 __isl_take isl_printer *p, const char *suffix);
768
769 The C<output_format> may be either C<ISL_FORMAT_ISL>, C<ISL_FORMAT_OMEGA>,
770 C<ISL_FORMAT_POLYLIB>, C<ISL_FORMAT_EXT_POLYLIB> or C<ISL_FORMAT_LATEX>
771 and defaults to C<ISL_FORMAT_ISL>.
772 Each line in the output is indented by C<indent> (set by
773 C<isl_printer_set_indent>) spaces
774 (default: 0), prefixed by C<prefix> and suffixed by C<suffix>.
775 In the C<PolyLib> format output,
776 the coefficients of the existentially quantified variables
777 appear between those of the set variables and those
778 of the parameters.
779 The function C<isl_printer_indent> increases the indentation
780 by the specified amount (which may be negative).
781
782 To actually print something, use
783
784         #include <isl/set.h>
785         __isl_give isl_printer *isl_printer_print_basic_set(
786                 __isl_take isl_printer *printer,
787                 __isl_keep isl_basic_set *bset);
788         __isl_give isl_printer *isl_printer_print_set(
789                 __isl_take isl_printer *printer,
790                 __isl_keep isl_set *set);
791
792         #include <isl/map.h>
793         __isl_give isl_printer *isl_printer_print_basic_map(
794                 __isl_take isl_printer *printer,
795                 __isl_keep isl_basic_map *bmap);
796         __isl_give isl_printer *isl_printer_print_map(
797                 __isl_take isl_printer *printer,
798                 __isl_keep isl_map *map);
799
800         #include <isl/union_set.h>
801         __isl_give isl_printer *isl_printer_print_union_set(
802                 __isl_take isl_printer *p,
803                 __isl_keep isl_union_set *uset);
804
805         #include <isl/union_map.h>
806         __isl_give isl_printer *isl_printer_print_union_map(
807                 __isl_take isl_printer *p,
808                 __isl_keep isl_union_map *umap);
809
810 When called on a file printer, the following function flushes
811 the file.  When called on a string printer, the buffer is cleared.
812
813         __isl_give isl_printer *isl_printer_flush(
814                 __isl_take isl_printer *p);
815
816 =head2 Creating New Sets and Relations
817
818 C<isl> has functions for creating some standard sets and relations.
819
820 =over
821
822 =item * Empty sets and relations
823
824         __isl_give isl_basic_set *isl_basic_set_empty(
825                 __isl_take isl_dim *dim);
826         __isl_give isl_basic_map *isl_basic_map_empty(
827                 __isl_take isl_dim *dim);
828         __isl_give isl_set *isl_set_empty(
829                 __isl_take isl_dim *dim);
830         __isl_give isl_map *isl_map_empty(
831                 __isl_take isl_dim *dim);
832         __isl_give isl_union_set *isl_union_set_empty(
833                 __isl_take isl_dim *dim);
834         __isl_give isl_union_map *isl_union_map_empty(
835                 __isl_take isl_dim *dim);
836
837 For C<isl_union_set>s and C<isl_union_map>s, the dimensions specification
838 is only used to specify the parameters.
839
840 =item * Universe sets and relations
841
842         __isl_give isl_basic_set *isl_basic_set_universe(
843                 __isl_take isl_dim *dim);
844         __isl_give isl_basic_map *isl_basic_map_universe(
845                 __isl_take isl_dim *dim);
846         __isl_give isl_set *isl_set_universe(
847                 __isl_take isl_dim *dim);
848         __isl_give isl_map *isl_map_universe(
849                 __isl_take isl_dim *dim);
850         __isl_give isl_union_set *isl_union_set_universe(
851                 __isl_take isl_union_set *uset);
852         __isl_give isl_union_map *isl_union_map_universe(
853                 __isl_take isl_union_map *umap);
854
855 The sets and relations constructed by the functions above
856 contain all integer values, while those constructed by the
857 functions below only contain non-negative values.
858
859         __isl_give isl_basic_set *isl_basic_set_nat_universe(
860                 __isl_take isl_dim *dim);
861         __isl_give isl_basic_map *isl_basic_map_nat_universe(
862                 __isl_take isl_dim *dim);
863         __isl_give isl_set *isl_set_nat_universe(
864                 __isl_take isl_dim *dim);
865         __isl_give isl_map *isl_map_nat_universe(
866                 __isl_take isl_dim *dim);
867
868 =item * Identity relations
869
870         __isl_give isl_basic_map *isl_basic_map_identity(
871                 __isl_take isl_dim *dim);
872         __isl_give isl_map *isl_map_identity(
873                 __isl_take isl_dim *dim);
874
875 The number of input and output dimensions in C<dim> needs
876 to be the same.
877
878 =item * Lexicographic order
879
880         __isl_give isl_map *isl_map_lex_lt(
881                 __isl_take isl_dim *set_dim);
882         __isl_give isl_map *isl_map_lex_le(
883                 __isl_take isl_dim *set_dim);
884         __isl_give isl_map *isl_map_lex_gt(
885                 __isl_take isl_dim *set_dim);
886         __isl_give isl_map *isl_map_lex_ge(
887                 __isl_take isl_dim *set_dim);
888         __isl_give isl_map *isl_map_lex_lt_first(
889                 __isl_take isl_dim *dim, unsigned n);
890         __isl_give isl_map *isl_map_lex_le_first(
891                 __isl_take isl_dim *dim, unsigned n);
892         __isl_give isl_map *isl_map_lex_gt_first(
893                 __isl_take isl_dim *dim, unsigned n);
894         __isl_give isl_map *isl_map_lex_ge_first(
895                 __isl_take isl_dim *dim, unsigned n);
896
897 The first four functions take a dimension specification for a B<set>
898 and return relations that express that the elements in the domain
899 are lexicographically less
900 (C<isl_map_lex_lt>), less or equal (C<isl_map_lex_le>),
901 greater (C<isl_map_lex_gt>) or greater or equal (C<isl_map_lex_ge>)
902 than the elements in the range.
903 The last four functions take a dimension specification for a map
904 and return relations that express that the first C<n> dimensions
905 in the domain are lexicographically less
906 (C<isl_map_lex_lt_first>), less or equal (C<isl_map_lex_le_first>),
907 greater (C<isl_map_lex_gt_first>) or greater or equal (C<isl_map_lex_ge_first>)
908 than the first C<n> dimensions in the range.
909
910 =back
911
912 A basic set or relation can be converted to a set or relation
913 using the following functions.
914
915         __isl_give isl_set *isl_set_from_basic_set(
916                 __isl_take isl_basic_set *bset);
917         __isl_give isl_map *isl_map_from_basic_map(
918                 __isl_take isl_basic_map *bmap);
919
920 Sets and relations can be converted to union sets and relations
921 using the following functions.
922
923         __isl_give isl_union_map *isl_union_map_from_map(
924                 __isl_take isl_map *map);
925         __isl_give isl_union_set *isl_union_set_from_set(
926                 __isl_take isl_set *set);
927
928 The inverse conversions below can only be used if the input
929 union set or relation is known to contain elements in exactly one
930 space.
931
932         __isl_give isl_set *isl_set_from_union_set(
933                 __isl_take isl_union_set *uset);
934         __isl_give isl_map *isl_map_from_union_map(
935                 __isl_take isl_union_map *umap);
936
937 Sets and relations can be copied and freed again using the following
938 functions.
939
940         __isl_give isl_basic_set *isl_basic_set_copy(
941                 __isl_keep isl_basic_set *bset);
942         __isl_give isl_set *isl_set_copy(__isl_keep isl_set *set);
943         __isl_give isl_union_set *isl_union_set_copy(
944                 __isl_keep isl_union_set *uset);
945         __isl_give isl_basic_map *isl_basic_map_copy(
946                 __isl_keep isl_basic_map *bmap);
947         __isl_give isl_map *isl_map_copy(__isl_keep isl_map *map);
948         __isl_give isl_union_map *isl_union_map_copy(
949                 __isl_keep isl_union_map *umap);
950         void isl_basic_set_free(__isl_take isl_basic_set *bset);
951         void isl_set_free(__isl_take isl_set *set);
952         void *isl_union_set_free(__isl_take isl_union_set *uset);
953         void isl_basic_map_free(__isl_take isl_basic_map *bmap);
954         void isl_map_free(__isl_take isl_map *map);
955         void *isl_union_map_free(__isl_take isl_union_map *umap);
956
957 Other sets and relations can be constructed by starting
958 from a universe set or relation, adding equality and/or
959 inequality constraints and then projecting out the
960 existentially quantified variables, if any.
961 Constraints can be constructed, manipulated and
962 added to (or removed from) (basic) sets and relations
963 using the following functions.
964
965         #include <isl/constraint.h>
966         __isl_give isl_constraint *isl_equality_alloc(
967                 __isl_take isl_dim *dim);
968         __isl_give isl_constraint *isl_inequality_alloc(
969                 __isl_take isl_dim *dim);
970         void isl_constraint_set_constant(
971                 __isl_keep isl_constraint *constraint, isl_int v);
972         void isl_constraint_set_coefficient(
973                 __isl_keep isl_constraint *constraint,
974                 enum isl_dim_type type, int pos, isl_int v);
975         __isl_give isl_basic_map *isl_basic_map_add_constraint(
976                 __isl_take isl_basic_map *bmap,
977                 __isl_take isl_constraint *constraint);
978         __isl_give isl_basic_set *isl_basic_set_add_constraint(
979                 __isl_take isl_basic_set *bset,
980                 __isl_take isl_constraint *constraint);
981         __isl_give isl_map *isl_map_add_constraint(
982                 __isl_take isl_map *map,
983                 __isl_take isl_constraint *constraint);
984         __isl_give isl_set *isl_set_add_constraint(
985                 __isl_take isl_set *set,
986                 __isl_take isl_constraint *constraint);
987         __isl_give isl_basic_set *isl_basic_set_drop_constraint(
988                 __isl_take isl_basic_set *bset,
989                 __isl_take isl_constraint *constraint);
990
991 For example, to create a set containing the even integers
992 between 10 and 42, you would use the following code.
993
994         isl_int v;
995         struct isl_dim *dim;
996         struct isl_constraint *c;
997         struct isl_basic_set *bset;
998
999         isl_int_init(v);
1000         dim = isl_dim_set_alloc(ctx, 0, 2);
1001         bset = isl_basic_set_universe(isl_dim_copy(dim));
1002
1003         c = isl_equality_alloc(isl_dim_copy(dim));
1004         isl_int_set_si(v, -1);
1005         isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
1006         isl_int_set_si(v, 2);
1007         isl_constraint_set_coefficient(c, isl_dim_set, 1, v);
1008         bset = isl_basic_set_add_constraint(bset, c);
1009
1010         c = isl_inequality_alloc(isl_dim_copy(dim));
1011         isl_int_set_si(v, -10);
1012         isl_constraint_set_constant(c, v);
1013         isl_int_set_si(v, 1);
1014         isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
1015         bset = isl_basic_set_add_constraint(bset, c);
1016
1017         c = isl_inequality_alloc(dim);
1018         isl_int_set_si(v, 42);
1019         isl_constraint_set_constant(c, v);
1020         isl_int_set_si(v, -1);
1021         isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
1022         bset = isl_basic_set_add_constraint(bset, c);
1023
1024         bset = isl_basic_set_project_out(bset, isl_dim_set, 1, 1);
1025
1026         isl_int_clear(v);
1027
1028 Or, alternatively,
1029
1030         struct isl_basic_set *bset;
1031         bset = isl_basic_set_read_from_str(ctx,
1032                 "{[i] : exists (a : i = 2a and i >= 10 and i <= 42)}", -1);
1033
1034 A basic set or relation can also be constructed from two matrices
1035 describing the equalities and the inequalities.
1036
1037         __isl_give isl_basic_set *isl_basic_set_from_constraint_matrices(
1038                 __isl_take isl_dim *dim,
1039                 __isl_take isl_mat *eq, __isl_take isl_mat *ineq,
1040                 enum isl_dim_type c1,
1041                 enum isl_dim_type c2, enum isl_dim_type c3,
1042                 enum isl_dim_type c4);
1043         __isl_give isl_basic_map *isl_basic_map_from_constraint_matrices(
1044                 __isl_take isl_dim *dim,
1045                 __isl_take isl_mat *eq, __isl_take isl_mat *ineq,
1046                 enum isl_dim_type c1,
1047                 enum isl_dim_type c2, enum isl_dim_type c3,
1048                 enum isl_dim_type c4, enum isl_dim_type c5);
1049
1050 The C<isl_dim_type> arguments indicate the order in which
1051 different kinds of variables appear in the input matrices
1052 and should be a permutation of C<isl_dim_cst>, C<isl_dim_param>,
1053 C<isl_dim_set> and C<isl_dim_div> for sets and
1054 of C<isl_dim_cst>, C<isl_dim_param>,
1055 C<isl_dim_in>, C<isl_dim_out> and C<isl_dim_div> for relations.
1056
1057 A (basic) relation can also be constructed from a (piecewise) affine expression
1058 or a list of affine expressions (See L<"Piecewise Quasi Affine Expressions">).
1059
1060         __isl_give isl_basic_map *isl_basic_map_from_aff(
1061                 __isl_take isl_aff *aff);
1062         __isl_give isl_map *isl_map_from_pw_aff(
1063                 __isl_take isl_pw_aff *pwaff);
1064         __isl_give isl_basic_map *isl_basic_map_from_aff_list(
1065                 __isl_take isl_dim *domain_dim,
1066                 __isl_take isl_aff_list *list);
1067
1068 The C<domain_dim> argument describes the domain of the resulting
1069 basic relation.  It is required because the C<list> may consist
1070 of zero affine expressions.
1071
1072 =head2 Inspecting Sets and Relations
1073
1074 Usually, the user should not have to care about the actual constraints
1075 of the sets and maps, but should instead apply the abstract operations
1076 explained in the following sections.
1077 Occasionally, however, it may be required to inspect the individual
1078 coefficients of the constraints.  This section explains how to do so.
1079 In these cases, it may also be useful to have C<isl> compute
1080 an explicit representation of the existentially quantified variables.
1081
1082         __isl_give isl_set *isl_set_compute_divs(
1083                 __isl_take isl_set *set);
1084         __isl_give isl_map *isl_map_compute_divs(
1085                 __isl_take isl_map *map);
1086         __isl_give isl_union_set *isl_union_set_compute_divs(
1087                 __isl_take isl_union_set *uset);
1088         __isl_give isl_union_map *isl_union_map_compute_divs(
1089                 __isl_take isl_union_map *umap);
1090
1091 This explicit representation defines the existentially quantified
1092 variables as integer divisions of the other variables, possibly
1093 including earlier existentially quantified variables.
1094 An explicitly represented existentially quantified variable therefore
1095 has a unique value when the values of the other variables are known.
1096 If, furthermore, the same existentials, i.e., existentials
1097 with the same explicit representations, should appear in the
1098 same order in each of the disjuncts of a set or map, then the user should call
1099 either of the following functions.
1100
1101         __isl_give isl_set *isl_set_align_divs(
1102                 __isl_take isl_set *set);
1103         __isl_give isl_map *isl_map_align_divs(
1104                 __isl_take isl_map *map);
1105
1106 Alternatively, the existentially quantified variables can be removed
1107 using the following functions, which compute an overapproximation.
1108
1109         __isl_give isl_basic_set *isl_basic_set_remove_divs(
1110                 __isl_take isl_basic_set *bset);
1111         __isl_give isl_basic_map *isl_basic_map_remove_divs(
1112                 __isl_take isl_basic_map *bmap);
1113         __isl_give isl_set *isl_set_remove_divs(
1114                 __isl_take isl_set *set);
1115         __isl_give isl_map *isl_map_remove_divs(
1116                 __isl_take isl_map *map);
1117
1118 To iterate over all the sets or maps in a union set or map, use
1119
1120         int isl_union_set_foreach_set(__isl_keep isl_union_set *uset,
1121                 int (*fn)(__isl_take isl_set *set, void *user),
1122                 void *user);
1123         int isl_union_map_foreach_map(__isl_keep isl_union_map *umap,
1124                 int (*fn)(__isl_take isl_map *map, void *user),
1125                 void *user);
1126
1127 The number of sets or maps in a union set or map can be obtained
1128 from
1129
1130         int isl_union_set_n_set(__isl_keep isl_union_set *uset);
1131         int isl_union_map_n_map(__isl_keep isl_union_map *umap);
1132
1133 To extract the set or map from a union with a given dimension
1134 specification, use
1135
1136         __isl_give isl_set *isl_union_set_extract_set(
1137                 __isl_keep isl_union_set *uset,
1138                 __isl_take isl_dim *dim);
1139         __isl_give isl_map *isl_union_map_extract_map(
1140                 __isl_keep isl_union_map *umap,
1141                 __isl_take isl_dim *dim);
1142
1143 To iterate over all the basic sets or maps in a set or map, use
1144
1145         int isl_set_foreach_basic_set(__isl_keep isl_set *set,
1146                 int (*fn)(__isl_take isl_basic_set *bset, void *user),
1147                 void *user);
1148         int isl_map_foreach_basic_map(__isl_keep isl_map *map,
1149                 int (*fn)(__isl_take isl_basic_map *bmap, void *user),
1150                 void *user);
1151
1152 The callback function C<fn> should return 0 if successful and
1153 -1 if an error occurs.  In the latter case, or if any other error
1154 occurs, the above functions will return -1.
1155
1156 It should be noted that C<isl> does not guarantee that
1157 the basic sets or maps passed to C<fn> are disjoint.
1158 If this is required, then the user should call one of
1159 the following functions first.
1160
1161         __isl_give isl_set *isl_set_make_disjoint(
1162                 __isl_take isl_set *set);
1163         __isl_give isl_map *isl_map_make_disjoint(
1164                 __isl_take isl_map *map);
1165
1166 The number of basic sets in a set can be obtained
1167 from
1168
1169         int isl_set_n_basic_set(__isl_keep isl_set *set);
1170
1171 To iterate over the constraints of a basic set or map, use
1172
1173         #include <isl/constraint.h>
1174
1175         int isl_basic_map_foreach_constraint(
1176                 __isl_keep isl_basic_map *bmap,
1177                 int (*fn)(__isl_take isl_constraint *c, void *user),
1178                 void *user);
1179         void isl_constraint_free(struct isl_constraint *c);
1180
1181 Again, the callback function C<fn> should return 0 if successful and
1182 -1 if an error occurs.  In the latter case, or if any other error
1183 occurs, the above functions will return -1.
1184 The constraint C<c> represents either an equality or an inequality.
1185 Use the following function to find out whether a constraint
1186 represents an equality.  If not, it represents an inequality.
1187
1188         int isl_constraint_is_equality(
1189                 __isl_keep isl_constraint *constraint);
1190
1191 The coefficients of the constraints can be inspected using
1192 the following functions.
1193
1194         void isl_constraint_get_constant(
1195                 __isl_keep isl_constraint *constraint, isl_int *v);
1196         void isl_constraint_get_coefficient(
1197                 __isl_keep isl_constraint *constraint,
1198                 enum isl_dim_type type, int pos, isl_int *v);
1199         int isl_constraint_involves_dims(
1200                 __isl_keep isl_constraint *constraint,
1201                 enum isl_dim_type type, unsigned first, unsigned n);
1202
1203 The explicit representations of the existentially quantified
1204 variables can be inspected using the following functions.
1205 Note that the user is only allowed to use these functions
1206 if the inspected set or map is the result of a call
1207 to C<isl_set_compute_divs> or C<isl_map_compute_divs>.
1208
1209         __isl_give isl_div *isl_constraint_div(
1210                 __isl_keep isl_constraint *constraint, int pos);
1211         isl_ctx *isl_div_get_ctx(__isl_keep isl_div *div);
1212         void isl_div_get_constant(__isl_keep isl_div *div,
1213                 isl_int *v);
1214         void isl_div_get_denominator(__isl_keep isl_div *div,
1215                 isl_int *v);
1216         void isl_div_get_coefficient(__isl_keep isl_div *div,
1217                 enum isl_dim_type type, int pos, isl_int *v);
1218
1219 To obtain the constraints of a basic set or map in matrix
1220 form, use the following functions.
1221
1222         __isl_give isl_mat *isl_basic_set_equalities_matrix(
1223                 __isl_keep isl_basic_set *bset,
1224                 enum isl_dim_type c1, enum isl_dim_type c2,
1225                 enum isl_dim_type c3, enum isl_dim_type c4);
1226         __isl_give isl_mat *isl_basic_set_inequalities_matrix(
1227                 __isl_keep isl_basic_set *bset,
1228                 enum isl_dim_type c1, enum isl_dim_type c2,
1229                 enum isl_dim_type c3, enum isl_dim_type c4);
1230         __isl_give isl_mat *isl_basic_map_equalities_matrix(
1231                 __isl_keep isl_basic_map *bmap,
1232                 enum isl_dim_type c1,
1233                 enum isl_dim_type c2, enum isl_dim_type c3,
1234                 enum isl_dim_type c4, enum isl_dim_type c5);
1235         __isl_give isl_mat *isl_basic_map_inequalities_matrix(
1236                 __isl_keep isl_basic_map *bmap,
1237                 enum isl_dim_type c1,
1238                 enum isl_dim_type c2, enum isl_dim_type c3,
1239                 enum isl_dim_type c4, enum isl_dim_type c5);
1240
1241 The C<isl_dim_type> arguments dictate the order in which
1242 different kinds of variables appear in the resulting matrix
1243 and should be a permutation of C<isl_dim_cst>, C<isl_dim_param>,
1244 C<isl_dim_in>, C<isl_dim_out> and C<isl_dim_div>.
1245
1246 To check whether the description of a set or relation depends
1247 on one or more given dimensions, it is not necessary to iterate over all
1248 constraints.  Instead the following functions can be used.
1249
1250         int isl_basic_set_involves_dims(
1251                 __isl_keep isl_basic_set *bset,
1252                 enum isl_dim_type type, unsigned first, unsigned n);
1253         int isl_set_involves_dims(__isl_keep isl_set *set,
1254                 enum isl_dim_type type, unsigned first, unsigned n);
1255         int isl_basic_map_involves_dims(
1256                 __isl_keep isl_basic_map *bmap,
1257                 enum isl_dim_type type, unsigned first, unsigned n);
1258         int isl_map_involves_dims(__isl_keep isl_map *map,
1259                 enum isl_dim_type type, unsigned first, unsigned n);
1260
1261 The names of the domain and range spaces of a set or relation can be
1262 read off or set using the following functions.
1263
1264         const char *isl_basic_set_get_tuple_name(
1265                 __isl_keep isl_basic_set *bset);
1266         __isl_give isl_basic_set *isl_basic_set_set_tuple_name(
1267                 __isl_take isl_basic_set *set, const char *s);
1268         const char *isl_set_get_tuple_name(
1269                 __isl_keep isl_set *set);
1270         const char *isl_basic_map_get_tuple_name(
1271                 __isl_keep isl_basic_map *bmap,
1272                 enum isl_dim_type type);
1273         const char *isl_map_get_tuple_name(
1274                 __isl_keep isl_map *map,
1275                 enum isl_dim_type type);
1276
1277 As with C<isl_dim_get_tuple_name>, the value returned points to
1278 an internal data structure.
1279 The names of individual dimensions can be read off using
1280 the following functions.
1281
1282         const char *isl_constraint_get_dim_name(
1283                 __isl_keep isl_constraint *constraint,
1284                 enum isl_dim_type type, unsigned pos);
1285         const char *isl_basic_set_get_dim_name(
1286                 __isl_keep isl_basic_set *bset,
1287                 enum isl_dim_type type, unsigned pos);
1288         const char *isl_set_get_dim_name(
1289                 __isl_keep isl_set *set,
1290                 enum isl_dim_type type, unsigned pos);
1291         const char *isl_basic_map_get_dim_name(
1292                 __isl_keep isl_basic_map *bmap,
1293                 enum isl_dim_type type, unsigned pos);
1294         const char *isl_map_get_dim_name(
1295                 __isl_keep isl_map *map,
1296                 enum isl_dim_type type, unsigned pos);
1297
1298 These functions are mostly useful to obtain the names
1299 of the parameters.
1300
1301 =head2 Properties
1302
1303 =head3 Unary Properties
1304
1305 =over
1306
1307 =item * Emptiness
1308
1309 The following functions test whether the given set or relation
1310 contains any integer points.  The ``plain'' variants do not perform
1311 any computations, but simply check if the given set or relation
1312 is already known to be empty.
1313
1314         int isl_basic_set_plain_is_empty(__isl_keep isl_basic_set *bset);
1315         int isl_basic_set_is_empty(__isl_keep isl_basic_set *bset);
1316         int isl_set_plain_is_empty(__isl_keep isl_set *set);
1317         int isl_set_is_empty(__isl_keep isl_set *set);
1318         int isl_union_set_is_empty(__isl_keep isl_union_set *uset);
1319         int isl_basic_map_plain_is_empty(__isl_keep isl_basic_map *bmap);
1320         int isl_basic_map_is_empty(__isl_keep isl_basic_map *bmap);
1321         int isl_map_plain_is_empty(__isl_keep isl_map *map);
1322         int isl_map_is_empty(__isl_keep isl_map *map);
1323         int isl_union_map_is_empty(__isl_keep isl_union_map *umap);
1324
1325 =item * Universality
1326
1327         int isl_basic_set_is_universe(__isl_keep isl_basic_set *bset);
1328         int isl_basic_map_is_universe(__isl_keep isl_basic_map *bmap);
1329         int isl_set_plain_is_universe(__isl_keep isl_set *set);
1330
1331 =item * Single-valuedness
1332
1333         int isl_map_is_single_valued(__isl_keep isl_map *map);
1334         int isl_union_map_is_single_valued(__isl_keep isl_union_map *umap);
1335
1336 =item * Injectivity
1337
1338         int isl_map_plain_is_injective(__isl_keep isl_map *map);
1339         int isl_map_is_injective(__isl_keep isl_map *map);
1340         int isl_union_map_plain_is_injective(
1341                 __isl_keep isl_union_map *umap);
1342         int isl_union_map_is_injective(
1343                 __isl_keep isl_union_map *umap);
1344
1345 =item * Bijectivity
1346
1347         int isl_map_is_bijective(__isl_keep isl_map *map);
1348         int isl_union_map_is_bijective(__isl_keep isl_union_map *umap);
1349
1350 =item * Wrapping
1351
1352 The following functions check whether the domain of the given
1353 (basic) set is a wrapped relation.
1354
1355         int isl_basic_set_is_wrapping(
1356                 __isl_keep isl_basic_set *bset);
1357         int isl_set_is_wrapping(__isl_keep isl_set *set);
1358
1359 =item * Internal Product
1360
1361         int isl_basic_map_can_zip(
1362                 __isl_keep isl_basic_map *bmap);
1363         int isl_map_can_zip(__isl_keep isl_map *map);
1364
1365 Check whether the product of domain and range of the given relation
1366 can be computed,
1367 i.e., whether both domain and range are nested relations.
1368
1369 =back
1370
1371 =head3 Binary Properties
1372
1373 =over
1374
1375 =item * Equality
1376
1377         int isl_set_plain_is_equal(__isl_keep isl_set *set1,
1378                 __isl_keep isl_set *set2);
1379         int isl_set_is_equal(__isl_keep isl_set *set1,
1380                 __isl_keep isl_set *set2);
1381         int isl_union_set_is_equal(
1382                 __isl_keep isl_union_set *uset1,
1383                 __isl_keep isl_union_set *uset2);
1384         int isl_basic_map_is_equal(
1385                 __isl_keep isl_basic_map *bmap1,
1386                 __isl_keep isl_basic_map *bmap2);
1387         int isl_map_is_equal(__isl_keep isl_map *map1,
1388                 __isl_keep isl_map *map2);
1389         int isl_map_plain_is_equal(__isl_keep isl_map *map1,
1390                 __isl_keep isl_map *map2);
1391         int isl_union_map_is_equal(
1392                 __isl_keep isl_union_map *umap1,
1393                 __isl_keep isl_union_map *umap2);
1394
1395 =item * Disjointness
1396
1397         int isl_set_plain_is_disjoint(__isl_keep isl_set *set1,
1398                 __isl_keep isl_set *set2);
1399
1400 =item * Subset
1401
1402         int isl_set_is_subset(__isl_keep isl_set *set1,
1403                 __isl_keep isl_set *set2);
1404         int isl_set_is_strict_subset(
1405                 __isl_keep isl_set *set1,
1406                 __isl_keep isl_set *set2);
1407         int isl_union_set_is_subset(
1408                 __isl_keep isl_union_set *uset1,
1409                 __isl_keep isl_union_set *uset2);
1410         int isl_union_set_is_strict_subset(
1411                 __isl_keep isl_union_set *uset1,
1412                 __isl_keep isl_union_set *uset2);
1413         int isl_basic_map_is_subset(
1414                 __isl_keep isl_basic_map *bmap1,
1415                 __isl_keep isl_basic_map *bmap2);
1416         int isl_basic_map_is_strict_subset(
1417                 __isl_keep isl_basic_map *bmap1,
1418                 __isl_keep isl_basic_map *bmap2);
1419         int isl_map_is_subset(
1420                 __isl_keep isl_map *map1,
1421                 __isl_keep isl_map *map2);
1422         int isl_map_is_strict_subset(
1423                 __isl_keep isl_map *map1,
1424                 __isl_keep isl_map *map2);
1425         int isl_union_map_is_subset(
1426                 __isl_keep isl_union_map *umap1,
1427                 __isl_keep isl_union_map *umap2);
1428         int isl_union_map_is_strict_subset(
1429                 __isl_keep isl_union_map *umap1,
1430                 __isl_keep isl_union_map *umap2);
1431
1432 =back
1433
1434 =head2 Unary Operations
1435
1436 =over
1437
1438 =item * Complement
1439
1440         __isl_give isl_set *isl_set_complement(
1441                 __isl_take isl_set *set);
1442
1443 =item * Inverse map
1444
1445         __isl_give isl_basic_map *isl_basic_map_reverse(
1446                 __isl_take isl_basic_map *bmap);
1447         __isl_give isl_map *isl_map_reverse(
1448                 __isl_take isl_map *map);
1449         __isl_give isl_union_map *isl_union_map_reverse(
1450                 __isl_take isl_union_map *umap);
1451
1452 =item * Projection
1453
1454         __isl_give isl_basic_set *isl_basic_set_project_out(
1455                 __isl_take isl_basic_set *bset,
1456                 enum isl_dim_type type, unsigned first, unsigned n);
1457         __isl_give isl_basic_map *isl_basic_map_project_out(
1458                 __isl_take isl_basic_map *bmap,
1459                 enum isl_dim_type type, unsigned first, unsigned n);
1460         __isl_give isl_set *isl_set_project_out(__isl_take isl_set *set,
1461                 enum isl_dim_type type, unsigned first, unsigned n);
1462         __isl_give isl_map *isl_map_project_out(__isl_take isl_map *map,
1463                 enum isl_dim_type type, unsigned first, unsigned n);
1464         __isl_give isl_basic_set *isl_basic_map_domain(
1465                 __isl_take isl_basic_map *bmap);
1466         __isl_give isl_basic_set *isl_basic_map_range(
1467                 __isl_take isl_basic_map *bmap);
1468         __isl_give isl_set *isl_map_domain(
1469                 __isl_take isl_map *bmap);
1470         __isl_give isl_set *isl_map_range(
1471                 __isl_take isl_map *map);
1472         __isl_give isl_union_set *isl_union_map_domain(
1473                 __isl_take isl_union_map *umap);
1474         __isl_give isl_union_set *isl_union_map_range(
1475                 __isl_take isl_union_map *umap);
1476
1477         __isl_give isl_basic_map *isl_basic_map_domain_map(
1478                 __isl_take isl_basic_map *bmap);
1479         __isl_give isl_basic_map *isl_basic_map_range_map(
1480                 __isl_take isl_basic_map *bmap);
1481         __isl_give isl_map *isl_map_domain_map(__isl_take isl_map *map);
1482         __isl_give isl_map *isl_map_range_map(__isl_take isl_map *map);
1483         __isl_give isl_union_map *isl_union_map_domain_map(
1484                 __isl_take isl_union_map *umap);
1485         __isl_give isl_union_map *isl_union_map_range_map(
1486                 __isl_take isl_union_map *umap);
1487
1488 The functions above construct a (basic, regular or union) relation
1489 that maps (a wrapped version of) the input relation to its domain or range.
1490
1491 =item * Elimination
1492
1493         __isl_give isl_set *isl_set_eliminate(
1494                 __isl_take isl_set *set, enum isl_dim_type type,
1495                 unsigned first, unsigned n);
1496
1497 Eliminate the coefficients for the given dimensions from the constraints,
1498 without removing the dimensions.
1499
1500 =item * Slicing
1501
1502         __isl_give isl_basic_set *isl_basic_set_fix(
1503                 __isl_take isl_basic_set *bset,
1504                 enum isl_dim_type type, unsigned pos,
1505                 isl_int value);
1506         __isl_give isl_basic_set *isl_basic_set_fix_si(
1507                 __isl_take isl_basic_set *bset,
1508                 enum isl_dim_type type, unsigned pos, int value);
1509         __isl_give isl_set *isl_set_fix(__isl_take isl_set *set,
1510                 enum isl_dim_type type, unsigned pos,
1511                 isl_int value);
1512         __isl_give isl_set *isl_set_fix_si(__isl_take isl_set *set,
1513                 enum isl_dim_type type, unsigned pos, int value);
1514         __isl_give isl_basic_map *isl_basic_map_fix_si(
1515                 __isl_take isl_basic_map *bmap,
1516                 enum isl_dim_type type, unsigned pos, int value);
1517         __isl_give isl_map *isl_map_fix_si(__isl_take isl_map *map,
1518                 enum isl_dim_type type, unsigned pos, int value);
1519
1520 Intersect the set or relation with the hyperplane where the given
1521 dimension has the fixed given value.
1522
1523         __isl_give isl_set *isl_set_equate(__isl_take isl_set *set,
1524                 enum isl_dim_type type1, int pos1,
1525                 enum isl_dim_type type2, int pos2);
1526         __isl_give isl_map *isl_map_equate(__isl_take isl_map *map,
1527                 enum isl_dim_type type1, int pos1,
1528                 enum isl_dim_type type2, int pos2);
1529
1530 Intersect the set or relation with the hyperplane where the given
1531 dimensions are equal to each other.
1532
1533 =item * Identity
1534
1535         __isl_give isl_map *isl_set_identity(
1536                 __isl_take isl_set *set);
1537         __isl_give isl_union_map *isl_union_set_identity(
1538                 __isl_take isl_union_set *uset);
1539
1540 Construct an identity relation on the given (union) set.
1541
1542 =item * Deltas
1543
1544         __isl_give isl_basic_set *isl_basic_map_deltas(
1545                 __isl_take isl_basic_map *bmap);
1546         __isl_give isl_set *isl_map_deltas(__isl_take isl_map *map);
1547         __isl_give isl_union_set *isl_union_map_deltas(
1548                 __isl_take isl_union_map *umap);
1549
1550 These functions return a (basic) set containing the differences
1551 between image elements and corresponding domain elements in the input.
1552
1553         __isl_give isl_basic_map *isl_basic_map_deltas_map(
1554                 __isl_take isl_basic_map *bmap);
1555         __isl_give isl_map *isl_map_deltas_map(
1556                 __isl_take isl_map *map);
1557         __isl_give isl_union_map *isl_union_map_deltas_map(
1558                 __isl_take isl_union_map *umap);
1559
1560 The functions above construct a (basic, regular or union) relation
1561 that maps (a wrapped version of) the input relation to its delta set.
1562
1563 =item * Coalescing
1564
1565 Simplify the representation of a set or relation by trying
1566 to combine pairs of basic sets or relations into a single
1567 basic set or relation.
1568
1569         __isl_give isl_set *isl_set_coalesce(__isl_take isl_set *set);
1570         __isl_give isl_map *isl_map_coalesce(__isl_take isl_map *map);
1571         __isl_give isl_union_set *isl_union_set_coalesce(
1572                 __isl_take isl_union_set *uset);
1573         __isl_give isl_union_map *isl_union_map_coalesce(
1574                 __isl_take isl_union_map *umap);
1575
1576 =item * Detecting equalities
1577
1578         __isl_give isl_basic_set *isl_basic_set_detect_equalities(
1579                 __isl_take isl_basic_set *bset);
1580         __isl_give isl_basic_map *isl_basic_map_detect_equalities(
1581                 __isl_take isl_basic_map *bmap);
1582         __isl_give isl_set *isl_set_detect_equalities(
1583                 __isl_take isl_set *set);
1584         __isl_give isl_map *isl_map_detect_equalities(
1585                 __isl_take isl_map *map);
1586         __isl_give isl_union_set *isl_union_set_detect_equalities(
1587                 __isl_take isl_union_set *uset);
1588         __isl_give isl_union_map *isl_union_map_detect_equalities(
1589                 __isl_take isl_union_map *umap);
1590
1591 Simplify the representation of a set or relation by detecting implicit
1592 equalities.
1593
1594 =item * Removing redundant constraints
1595
1596         __isl_give isl_basic_set *isl_basic_set_remove_redundancies(
1597                 __isl_take isl_basic_set *bset);
1598         __isl_give isl_set *isl_set_remove_redundancies(
1599                 __isl_take isl_set *set);
1600         __isl_give isl_basic_map *isl_basic_map_remove_redundancies(
1601                 __isl_take isl_basic_map *bmap);
1602         __isl_give isl_map *isl_map_remove_redundancies(
1603                 __isl_take isl_map *map);
1604
1605 =item * Convex hull
1606
1607         __isl_give isl_basic_set *isl_set_convex_hull(
1608                 __isl_take isl_set *set);
1609         __isl_give isl_basic_map *isl_map_convex_hull(
1610                 __isl_take isl_map *map);
1611
1612 If the input set or relation has any existentially quantified
1613 variables, then the result of these operations is currently undefined.
1614
1615 =item * Simple hull
1616
1617         __isl_give isl_basic_set *isl_set_simple_hull(
1618                 __isl_take isl_set *set);
1619         __isl_give isl_basic_map *isl_map_simple_hull(
1620                 __isl_take isl_map *map);
1621         __isl_give isl_union_map *isl_union_map_simple_hull(
1622                 __isl_take isl_union_map *umap);
1623
1624 These functions compute a single basic set or relation
1625 that contains the whole input set or relation.
1626 In particular, the output is described by translates
1627 of the constraints describing the basic sets or relations in the input.
1628
1629 =begin latex
1630
1631 (See \autoref{s:simple hull}.)
1632
1633 =end latex
1634
1635 =item * Affine hull
1636
1637         __isl_give isl_basic_set *isl_basic_set_affine_hull(
1638                 __isl_take isl_basic_set *bset);
1639         __isl_give isl_basic_set *isl_set_affine_hull(
1640                 __isl_take isl_set *set);
1641         __isl_give isl_union_set *isl_union_set_affine_hull(
1642                 __isl_take isl_union_set *uset);
1643         __isl_give isl_basic_map *isl_basic_map_affine_hull(
1644                 __isl_take isl_basic_map *bmap);
1645         __isl_give isl_basic_map *isl_map_affine_hull(
1646                 __isl_take isl_map *map);
1647         __isl_give isl_union_map *isl_union_map_affine_hull(
1648                 __isl_take isl_union_map *umap);
1649
1650 In case of union sets and relations, the affine hull is computed
1651 per space.
1652
1653 =item * Polyhedral hull
1654
1655         __isl_give isl_basic_set *isl_set_polyhedral_hull(
1656                 __isl_take isl_set *set);
1657         __isl_give isl_basic_map *isl_map_polyhedral_hull(
1658                 __isl_take isl_map *map);
1659         __isl_give isl_union_set *isl_union_set_polyhedral_hull(
1660                 __isl_take isl_union_set *uset);
1661         __isl_give isl_union_map *isl_union_map_polyhedral_hull(
1662                 __isl_take isl_union_map *umap);
1663
1664 These functions compute a single basic set or relation
1665 not involving any existentially quantified variables
1666 that contains the whole input set or relation.
1667 In case of union sets and relations, the polyhedral hull is computed
1668 per space.
1669
1670 =item * Optimization
1671
1672         #include <isl/ilp.h>
1673         enum isl_lp_result isl_basic_set_max(
1674                 __isl_keep isl_basic_set *bset,
1675                 __isl_keep isl_aff *obj, isl_int *opt)
1676         enum isl_lp_result isl_set_min(__isl_keep isl_set *set,
1677                 __isl_keep isl_aff *obj, isl_int *opt);
1678         enum isl_lp_result isl_set_max(__isl_keep isl_set *set,
1679                 __isl_keep isl_aff *obj, isl_int *opt);
1680
1681 Compute the minimum or maximum of the integer affine expression C<obj>
1682 over the points in C<set>, returning the result in C<opt>.
1683 The return value may be one of C<isl_lp_error>,
1684 C<isl_lp_ok>, C<isl_lp_unbounded> or C<isl_lp_empty>.
1685
1686 =item * Parametric optimization
1687
1688         __isl_give isl_pw_aff *isl_set_dim_max(
1689                 __isl_take isl_set *set, int pos);
1690
1691 Compute the maximum of the given set dimension as a function of the
1692 parameters, but independently of the other set dimensions.
1693 For lexicographic optimization, see L<"Lexicographic Optimization">.
1694
1695 =item * Dual
1696
1697 The following functions compute either the set of (rational) coefficient
1698 values of valid constraints for the given set or the set of (rational)
1699 values satisfying the constraints with coefficients from the given set.
1700 Internally, these two sets of functions perform essentially the
1701 same operations, except that the set of coefficients is assumed to
1702 be a cone, while the set of values may be any polyhedron.
1703 The current implementation is based on the Farkas lemma and
1704 Fourier-Motzkin elimination, but this may change or be made optional
1705 in future.  In particular, future implementations may use different
1706 dualization algorithms or skip the elimination step.
1707
1708         __isl_give isl_basic_set *isl_basic_set_coefficients(
1709                 __isl_take isl_basic_set *bset);
1710         __isl_give isl_basic_set *isl_set_coefficients(
1711                 __isl_take isl_set *set);
1712         __isl_give isl_union_set *isl_union_set_coefficients(
1713                 __isl_take isl_union_set *bset);
1714         __isl_give isl_basic_set *isl_basic_set_solutions(
1715                 __isl_take isl_basic_set *bset);
1716         __isl_give isl_basic_set *isl_set_solutions(
1717                 __isl_take isl_set *set);
1718         __isl_give isl_union_set *isl_union_set_solutions(
1719                 __isl_take isl_union_set *bset);
1720
1721 =item * Power
1722
1723         __isl_give isl_map *isl_map_power(__isl_take isl_map *map,
1724                 int *exact);
1725         __isl_give isl_union_map *isl_union_map_power(
1726                 __isl_take isl_union_map *umap, int *exact);
1727
1728 Compute a parametric representation for all positive powers I<k> of C<map>.
1729 The result maps I<k> to a nested relation corresponding to the
1730 I<k>th power of C<map>.
1731 The result may be an overapproximation.  If the result is known to be exact,
1732 then C<*exact> is set to C<1>.
1733
1734 =item * Transitive closure
1735
1736         __isl_give isl_map *isl_map_transitive_closure(
1737                 __isl_take isl_map *map, int *exact);
1738         __isl_give isl_union_map *isl_union_map_transitive_closure(
1739                 __isl_take isl_union_map *umap, int *exact);
1740
1741 Compute the transitive closure of C<map>.
1742 The result may be an overapproximation.  If the result is known to be exact,
1743 then C<*exact> is set to C<1>.
1744
1745 =item * Reaching path lengths
1746
1747         __isl_give isl_map *isl_map_reaching_path_lengths(
1748                 __isl_take isl_map *map, int *exact);
1749
1750 Compute a relation that maps each element in the range of C<map>
1751 to the lengths of all paths composed of edges in C<map> that
1752 end up in the given element.
1753 The result may be an overapproximation.  If the result is known to be exact,
1754 then C<*exact> is set to C<1>.
1755 To compute the I<maximal> path length, the resulting relation
1756 should be postprocessed by C<isl_map_lexmax>.
1757 In particular, if the input relation is a dependence relation
1758 (mapping sources to sinks), then the maximal path length corresponds
1759 to the free schedule.
1760 Note, however, that C<isl_map_lexmax> expects the maximum to be
1761 finite, so if the path lengths are unbounded (possibly due to
1762 the overapproximation), then you will get an error message.
1763
1764 =item * Wrapping
1765
1766         __isl_give isl_basic_set *isl_basic_map_wrap(
1767                 __isl_take isl_basic_map *bmap);
1768         __isl_give isl_set *isl_map_wrap(
1769                 __isl_take isl_map *map);
1770         __isl_give isl_union_set *isl_union_map_wrap(
1771                 __isl_take isl_union_map *umap);
1772         __isl_give isl_basic_map *isl_basic_set_unwrap(
1773                 __isl_take isl_basic_set *bset);
1774         __isl_give isl_map *isl_set_unwrap(
1775                 __isl_take isl_set *set);
1776         __isl_give isl_union_map *isl_union_set_unwrap(
1777                 __isl_take isl_union_set *uset);
1778
1779 =item * Flattening
1780
1781 Remove any internal structure of domain (and range) of the given
1782 set or relation.  If there is any such internal structure in the input,
1783 then the name of the space is also removed.
1784
1785         __isl_give isl_basic_set *isl_basic_set_flatten(
1786                 __isl_take isl_basic_set *bset);
1787         __isl_give isl_set *isl_set_flatten(
1788                 __isl_take isl_set *set);
1789         __isl_give isl_basic_map *isl_basic_map_flatten_range(
1790                 __isl_take isl_basic_map *bmap);
1791         __isl_give isl_map *isl_map_flatten_range(
1792                 __isl_take isl_map *map);
1793         __isl_give isl_basic_map *isl_basic_map_flatten(
1794                 __isl_take isl_basic_map *bmap);
1795         __isl_give isl_map *isl_map_flatten(
1796                 __isl_take isl_map *map);
1797
1798         __isl_give isl_map *isl_set_flatten_map(
1799                 __isl_take isl_set *set);
1800
1801 The function above constructs a relation
1802 that maps the input set to a flattened version of the set.
1803
1804 =item * Lifting
1805
1806 Lift the input set to a space with extra dimensions corresponding
1807 to the existentially quantified variables in the input.
1808 In particular, the result lives in a wrapped map where the domain
1809 is the original space and the range corresponds to the original
1810 existentially quantified variables.
1811
1812         __isl_give isl_basic_set *isl_basic_set_lift(
1813                 __isl_take isl_basic_set *bset);
1814         __isl_give isl_set *isl_set_lift(
1815                 __isl_take isl_set *set);
1816         __isl_give isl_union_set *isl_union_set_lift(
1817                 __isl_take isl_union_set *uset);
1818
1819 =item * Internal Product
1820
1821         __isl_give isl_basic_map *isl_basic_map_zip(
1822                 __isl_take isl_basic_map *bmap);
1823         __isl_give isl_map *isl_map_zip(
1824                 __isl_take isl_map *map);
1825         __isl_give isl_union_map *isl_union_map_zip(
1826                 __isl_take isl_union_map *umap);
1827
1828 Given a relation with nested relations for domain and range,
1829 interchange the range of the domain with the domain of the range.
1830
1831 =item * Aligning parameters
1832
1833         __isl_give isl_set *isl_set_align_params(
1834                 __isl_take isl_set *set,
1835                 __isl_take isl_dim *model);
1836         __isl_give isl_map *isl_map_align_params(
1837                 __isl_take isl_map *map,
1838                 __isl_take isl_dim *model);
1839
1840 Change the order of the parameters of the given set or relation
1841 such that the first parameters match those of C<model>.
1842 This may involve the introduction of extra parameters.
1843 All parameters need to be named.
1844
1845 =item * Dimension manipulation
1846
1847         __isl_give isl_set *isl_set_add_dims(
1848                 __isl_take isl_set *set,
1849                 enum isl_dim_type type, unsigned n);
1850         __isl_give isl_map *isl_map_add_dims(
1851                 __isl_take isl_map *map,
1852                 enum isl_dim_type type, unsigned n);
1853
1854 It is usually not advisable to directly change the (input or output)
1855 space of a set or a relation as this removes the name and the internal
1856 structure of the space.  However, the above functions can be useful
1857 to add new parameters, assuming
1858 C<isl_set_align_params> and C<isl_map_align_params>
1859 are not sufficient.
1860
1861 =back
1862
1863 =head2 Binary Operations
1864
1865 The two arguments of a binary operation not only need to live
1866 in the same C<isl_ctx>, they currently also need to have
1867 the same (number of) parameters.
1868
1869 =head3 Basic Operations
1870
1871 =over
1872
1873 =item * Intersection
1874
1875         __isl_give isl_basic_set *isl_basic_set_intersect(
1876                 __isl_take isl_basic_set *bset1,
1877                 __isl_take isl_basic_set *bset2);
1878         __isl_give isl_set *isl_set_intersect_params(
1879                 __isl_take isl_set *set,
1880                 __isl_take isl_set *params);
1881         __isl_give isl_set *isl_set_intersect(
1882                 __isl_take isl_set *set1,
1883                 __isl_take isl_set *set2);
1884         __isl_give isl_union_set *isl_union_set_intersect(
1885                 __isl_take isl_union_set *uset1,
1886                 __isl_take isl_union_set *uset2);
1887         __isl_give isl_basic_map *isl_basic_map_intersect_domain(
1888                 __isl_take isl_basic_map *bmap,
1889                 __isl_take isl_basic_set *bset);
1890         __isl_give isl_basic_map *isl_basic_map_intersect_range(
1891                 __isl_take isl_basic_map *bmap,
1892                 __isl_take isl_basic_set *bset);
1893         __isl_give isl_basic_map *isl_basic_map_intersect(
1894                 __isl_take isl_basic_map *bmap1,
1895                 __isl_take isl_basic_map *bmap2);
1896         __isl_give isl_map *isl_map_intersect_params(
1897                 __isl_take isl_map *map,
1898                 __isl_take isl_set *params);
1899         __isl_give isl_map *isl_map_intersect_domain(
1900                 __isl_take isl_map *map,
1901                 __isl_take isl_set *set);
1902         __isl_give isl_map *isl_map_intersect_range(
1903                 __isl_take isl_map *map,
1904                 __isl_take isl_set *set);
1905         __isl_give isl_map *isl_map_intersect(
1906                 __isl_take isl_map *map1,
1907                 __isl_take isl_map *map2);
1908         __isl_give isl_union_map *isl_union_map_intersect_domain(
1909                 __isl_take isl_union_map *umap,
1910                 __isl_take isl_union_set *uset);
1911         __isl_give isl_union_map *isl_union_map_intersect_range(
1912                 __isl_take isl_union_map *umap,
1913                 __isl_take isl_union_set *uset);
1914         __isl_give isl_union_map *isl_union_map_intersect(
1915                 __isl_take isl_union_map *umap1,
1916                 __isl_take isl_union_map *umap2);
1917
1918 =item * Union
1919
1920         __isl_give isl_set *isl_basic_set_union(
1921                 __isl_take isl_basic_set *bset1,
1922                 __isl_take isl_basic_set *bset2);
1923         __isl_give isl_map *isl_basic_map_union(
1924                 __isl_take isl_basic_map *bmap1,
1925                 __isl_take isl_basic_map *bmap2);
1926         __isl_give isl_set *isl_set_union(
1927                 __isl_take isl_set *set1,
1928                 __isl_take isl_set *set2);
1929         __isl_give isl_map *isl_map_union(
1930                 __isl_take isl_map *map1,
1931                 __isl_take isl_map *map2);
1932         __isl_give isl_union_set *isl_union_set_union(
1933                 __isl_take isl_union_set *uset1,
1934                 __isl_take isl_union_set *uset2);
1935         __isl_give isl_union_map *isl_union_map_union(
1936                 __isl_take isl_union_map *umap1,
1937                 __isl_take isl_union_map *umap2);
1938
1939 =item * Set difference
1940
1941         __isl_give isl_set *isl_set_subtract(
1942                 __isl_take isl_set *set1,
1943                 __isl_take isl_set *set2);
1944         __isl_give isl_map *isl_map_subtract(
1945                 __isl_take isl_map *map1,
1946                 __isl_take isl_map *map2);
1947         __isl_give isl_union_set *isl_union_set_subtract(
1948                 __isl_take isl_union_set *uset1,
1949                 __isl_take isl_union_set *uset2);
1950         __isl_give isl_union_map *isl_union_map_subtract(
1951                 __isl_take isl_union_map *umap1,
1952                 __isl_take isl_union_map *umap2);
1953
1954 =item * Application
1955
1956         __isl_give isl_basic_set *isl_basic_set_apply(
1957                 __isl_take isl_basic_set *bset,
1958                 __isl_take isl_basic_map *bmap);
1959         __isl_give isl_set *isl_set_apply(
1960                 __isl_take isl_set *set,
1961                 __isl_take isl_map *map);
1962         __isl_give isl_union_set *isl_union_set_apply(
1963                 __isl_take isl_union_set *uset,
1964                 __isl_take isl_union_map *umap);
1965         __isl_give isl_basic_map *isl_basic_map_apply_domain(
1966                 __isl_take isl_basic_map *bmap1,
1967                 __isl_take isl_basic_map *bmap2);
1968         __isl_give isl_basic_map *isl_basic_map_apply_range(
1969                 __isl_take isl_basic_map *bmap1,
1970                 __isl_take isl_basic_map *bmap2);
1971         __isl_give isl_map *isl_map_apply_domain(
1972                 __isl_take isl_map *map1,
1973                 __isl_take isl_map *map2);
1974         __isl_give isl_union_map *isl_union_map_apply_domain(
1975                 __isl_take isl_union_map *umap1,
1976                 __isl_take isl_union_map *umap2);
1977         __isl_give isl_map *isl_map_apply_range(
1978                 __isl_take isl_map *map1,
1979                 __isl_take isl_map *map2);
1980         __isl_give isl_union_map *isl_union_map_apply_range(
1981                 __isl_take isl_union_map *umap1,
1982                 __isl_take isl_union_map *umap2);
1983
1984 =item * Cartesian Product
1985
1986         __isl_give isl_set *isl_set_product(
1987                 __isl_take isl_set *set1,
1988                 __isl_take isl_set *set2);
1989         __isl_give isl_union_set *isl_union_set_product(
1990                 __isl_take isl_union_set *uset1,
1991                 __isl_take isl_union_set *uset2);
1992         __isl_give isl_basic_map *isl_basic_map_range_product(
1993                 __isl_take isl_basic_map *bmap1,
1994                 __isl_take isl_basic_map *bmap2);
1995         __isl_give isl_map *isl_map_range_product(
1996                 __isl_take isl_map *map1,
1997                 __isl_take isl_map *map2);
1998         __isl_give isl_union_map *isl_union_map_range_product(
1999                 __isl_take isl_union_map *umap1,
2000                 __isl_take isl_union_map *umap2);
2001         __isl_give isl_map *isl_map_product(
2002                 __isl_take isl_map *map1,
2003                 __isl_take isl_map *map2);
2004         __isl_give isl_union_map *isl_union_map_product(
2005                 __isl_take isl_union_map *umap1,
2006                 __isl_take isl_union_map *umap2);
2007
2008 The above functions compute the cross product of the given
2009 sets or relations.  The domains and ranges of the results
2010 are wrapped maps between domains and ranges of the inputs.
2011 To obtain a ``flat'' product, use the following functions
2012 instead.
2013
2014         __isl_give isl_basic_set *isl_basic_set_flat_product(
2015                 __isl_take isl_basic_set *bset1,
2016                 __isl_take isl_basic_set *bset2);
2017         __isl_give isl_set *isl_set_flat_product(
2018                 __isl_take isl_set *set1,
2019                 __isl_take isl_set *set2);
2020         __isl_give isl_basic_map *isl_basic_map_flat_range_product(
2021                 __isl_take isl_basic_map *bmap1,
2022                 __isl_take isl_basic_map *bmap2);
2023         __isl_give isl_map *isl_map_flat_range_product(
2024                 __isl_take isl_map *map1,
2025                 __isl_take isl_map *map2);
2026         __isl_give isl_union_map *isl_union_map_flat_range_product(
2027                 __isl_take isl_union_map *umap1,
2028                 __isl_take isl_union_map *umap2);
2029         __isl_give isl_basic_map *isl_basic_map_flat_product(
2030                 __isl_take isl_basic_map *bmap1,
2031                 __isl_take isl_basic_map *bmap2);
2032         __isl_give isl_map *isl_map_flat_product(
2033                 __isl_take isl_map *map1,
2034                 __isl_take isl_map *map2);
2035
2036 =item * Simplification
2037
2038         __isl_give isl_basic_set *isl_basic_set_gist(
2039                 __isl_take isl_basic_set *bset,
2040                 __isl_take isl_basic_set *context);
2041         __isl_give isl_set *isl_set_gist(__isl_take isl_set *set,
2042                 __isl_take isl_set *context);
2043         __isl_give isl_union_set *isl_union_set_gist(
2044                 __isl_take isl_union_set *uset,
2045                 __isl_take isl_union_set *context);
2046         __isl_give isl_basic_map *isl_basic_map_gist(
2047                 __isl_take isl_basic_map *bmap,
2048                 __isl_take isl_basic_map *context);
2049         __isl_give isl_map *isl_map_gist(__isl_take isl_map *map,
2050                 __isl_take isl_map *context);
2051         __isl_give isl_union_map *isl_union_map_gist(
2052                 __isl_take isl_union_map *umap,
2053                 __isl_take isl_union_map *context);
2054
2055 The gist operation returns a set or relation that has the
2056 same intersection with the context as the input set or relation.
2057 Any implicit equality in the intersection is made explicit in the result,
2058 while all inequalities that are redundant with respect to the intersection
2059 are removed.
2060 In case of union sets and relations, the gist operation is performed
2061 per space.
2062
2063 =back
2064
2065 =head3 Lexicographic Optimization
2066
2067 Given a (basic) set C<set> (or C<bset>) and a zero-dimensional domain C<dom>,
2068 the following functions
2069 compute a set that contains the lexicographic minimum or maximum
2070 of the elements in C<set> (or C<bset>) for those values of the parameters
2071 that satisfy C<dom>.
2072 If C<empty> is not C<NULL>, then C<*empty> is assigned a set
2073 that contains the parameter values in C<dom> for which C<set> (or C<bset>)
2074 has no elements.
2075 In other words, the union of the parameter values
2076 for which the result is non-empty and of C<*empty>
2077 is equal to C<dom>.
2078
2079         __isl_give isl_set *isl_basic_set_partial_lexmin(
2080                 __isl_take isl_basic_set *bset,
2081                 __isl_take isl_basic_set *dom,
2082                 __isl_give isl_set **empty);
2083         __isl_give isl_set *isl_basic_set_partial_lexmax(
2084                 __isl_take isl_basic_set *bset,
2085                 __isl_take isl_basic_set *dom,
2086                 __isl_give isl_set **empty);
2087         __isl_give isl_set *isl_set_partial_lexmin(
2088                 __isl_take isl_set *set, __isl_take isl_set *dom,
2089                 __isl_give isl_set **empty);
2090         __isl_give isl_set *isl_set_partial_lexmax(
2091                 __isl_take isl_set *set, __isl_take isl_set *dom,
2092                 __isl_give isl_set **empty);
2093
2094 Given a (basic) set C<set> (or C<bset>), the following functions simply
2095 return a set containing the lexicographic minimum or maximum
2096 of the elements in C<set> (or C<bset>).
2097 In case of union sets, the optimum is computed per space.
2098
2099         __isl_give isl_set *isl_basic_set_lexmin(
2100                 __isl_take isl_basic_set *bset);
2101         __isl_give isl_set *isl_basic_set_lexmax(
2102                 __isl_take isl_basic_set *bset);
2103         __isl_give isl_set *isl_set_lexmin(
2104                 __isl_take isl_set *set);
2105         __isl_give isl_set *isl_set_lexmax(
2106                 __isl_take isl_set *set);
2107         __isl_give isl_union_set *isl_union_set_lexmin(
2108                 __isl_take isl_union_set *uset);
2109         __isl_give isl_union_set *isl_union_set_lexmax(
2110                 __isl_take isl_union_set *uset);
2111
2112 Given a (basic) relation C<map> (or C<bmap>) and a domain C<dom>,
2113 the following functions
2114 compute a relation that maps each element of C<dom>
2115 to the single lexicographic minimum or maximum
2116 of the elements that are associated to that same
2117 element in C<map> (or C<bmap>).
2118 If C<empty> is not C<NULL>, then C<*empty> is assigned a set
2119 that contains the elements in C<dom> that do not map
2120 to any elements in C<map> (or C<bmap>).
2121 In other words, the union of the domain of the result and of C<*empty>
2122 is equal to C<dom>.
2123
2124         __isl_give isl_map *isl_basic_map_partial_lexmax(
2125                 __isl_take isl_basic_map *bmap,
2126                 __isl_take isl_basic_set *dom,
2127                 __isl_give isl_set **empty);
2128         __isl_give isl_map *isl_basic_map_partial_lexmin(
2129                 __isl_take isl_basic_map *bmap,
2130                 __isl_take isl_basic_set *dom,
2131                 __isl_give isl_set **empty);
2132         __isl_give isl_map *isl_map_partial_lexmax(
2133                 __isl_take isl_map *map, __isl_take isl_set *dom,
2134                 __isl_give isl_set **empty);
2135         __isl_give isl_map *isl_map_partial_lexmin(
2136                 __isl_take isl_map *map, __isl_take isl_set *dom,
2137                 __isl_give isl_set **empty);
2138
2139 Given a (basic) map C<map> (or C<bmap>), the following functions simply
2140 return a map mapping each element in the domain of
2141 C<map> (or C<bmap>) to the lexicographic minimum or maximum
2142 of all elements associated to that element.
2143 In case of union relations, the optimum is computed per space.
2144
2145         __isl_give isl_map *isl_basic_map_lexmin(
2146                 __isl_take isl_basic_map *bmap);
2147         __isl_give isl_map *isl_basic_map_lexmax(
2148                 __isl_take isl_basic_map *bmap);
2149         __isl_give isl_map *isl_map_lexmin(
2150                 __isl_take isl_map *map);
2151         __isl_give isl_map *isl_map_lexmax(
2152                 __isl_take isl_map *map);
2153         __isl_give isl_union_map *isl_union_map_lexmin(
2154                 __isl_take isl_union_map *umap);
2155         __isl_give isl_union_map *isl_union_map_lexmax(
2156                 __isl_take isl_union_map *umap);
2157
2158 =head2 Lists
2159
2160 Lists are defined over several element types, including
2161 C<isl_aff>, C<isl_basic_set> and C<isl_set>.
2162 Here we take lists of C<isl_set>s as an example.
2163 Lists can be created, copied and freed using the following functions.
2164
2165         #include <isl/list.h>
2166         __isl_give isl_set_list *isl_set_list_alloc(
2167                 isl_ctx *ctx, int n);
2168         __isl_give isl_set_list *isl_set_list_copy(
2169                 __isl_keep isl_set_list *list);
2170         __isl_give isl_set_list *isl_set_list_add(
2171                 __isl_take isl_set_list *list,
2172                 __isl_take isl_set *el);
2173         void isl_set_list_free(__isl_take isl_set_list *list);
2174
2175 C<isl_set_list_alloc> creates an empty list with a capacity for
2176 C<n> elements.
2177
2178 Lists can be inspected using the following functions.
2179
2180         #include <isl/list.h>
2181         isl_ctx *isl_set_list_get_ctx(__isl_keep isl_set_list *list);
2182         int isl_set_list_n_set(__isl_keep isl_set_list *list);
2183         __isl_give struct isl_set *isl_set_list_get_set(
2184                 __isl_keep isl_set_list *list, int index);
2185         int isl_set_list_foreach(__isl_keep isl_set_list *list,
2186                 int (*fn)(__isl_take struct isl_set *el, void *user),
2187                 void *user);
2188
2189 Lists can be printed using
2190
2191         #include <isl/list.h>
2192         __isl_give isl_printer *isl_printer_print_set_list(
2193                 __isl_take isl_printer *p,
2194                 __isl_keep isl_set_list *list);
2195
2196 =head2 Matrices
2197
2198 Matrices can be created, copied and freed using the following functions.
2199
2200         #include <isl/mat.h>
2201         __isl_give isl_mat *isl_mat_alloc(struct isl_ctx *ctx,
2202                 unsigned n_row, unsigned n_col);
2203         __isl_give isl_mat *isl_mat_copy(__isl_keep isl_mat *mat);
2204         void isl_mat_free(__isl_take isl_mat *mat);
2205
2206 Note that the elements of a newly created matrix may have arbitrary values.
2207 The elements can be changed and inspected using the following functions.
2208
2209         isl_ctx *isl_mat_get_ctx(__isl_keep isl_mat *mat);
2210         int isl_mat_rows(__isl_keep isl_mat *mat);
2211         int isl_mat_cols(__isl_keep isl_mat *mat);
2212         int isl_mat_get_element(__isl_keep isl_mat *mat,
2213                 int row, int col, isl_int *v);
2214         __isl_give isl_mat *isl_mat_set_element(__isl_take isl_mat *mat,
2215                 int row, int col, isl_int v);
2216         __isl_give isl_mat *isl_mat_set_element_si(__isl_take isl_mat *mat,
2217                 int row, int col, int v);
2218
2219 C<isl_mat_get_element> will return a negative value if anything went wrong.
2220 In that case, the value of C<*v> is undefined.
2221
2222 The following function can be used to compute the (right) inverse
2223 of a matrix, i.e., a matrix such that the product of the original
2224 and the inverse (in that order) is a multiple of the identity matrix.
2225 The input matrix is assumed to be of full row-rank.
2226
2227         __isl_give isl_mat *isl_mat_right_inverse(__isl_take isl_mat *mat);
2228
2229 The following function can be used to compute the (right) kernel
2230 (or null space) of a matrix, i.e., a matrix such that the product of
2231 the original and the kernel (in that order) is the zero matrix.
2232
2233         __isl_give isl_mat *isl_mat_right_kernel(__isl_take isl_mat *mat);
2234
2235 =head2 Piecewise Quasi Affine Expressions
2236
2237 The zero quasi affine expression can be created using
2238
2239         __isl_give isl_aff *isl_aff_zero(
2240                 __isl_take isl_local_space *ls);
2241
2242 A quasi affine expression can also be initialized from an C<isl_div>:
2243
2244         #include <isl/div.h>
2245         __isl_give isl_aff *isl_aff_from_div(__isl_take isl_div *div);
2246
2247 An empty piecewise quasi affine expression (one with no cells)
2248 or a piecewise quasi affine expression with a single cell can
2249 be created using the following functions.
2250
2251         #include <isl/aff.h>
2252         __isl_give isl_pw_aff *isl_pw_aff_empty(
2253                 __isl_take isl_dim *dim);
2254         __isl_give isl_pw_aff *isl_pw_aff_alloc(
2255                 __isl_take isl_set *set, __isl_take isl_aff *aff);
2256
2257 Quasi affine expressions can be copied and freed using
2258
2259         #include <isl/aff.h>
2260         __isl_give isl_aff *isl_aff_copy(__isl_keep isl_aff *aff);
2261         void *isl_aff_free(__isl_take isl_aff *aff);
2262
2263         __isl_give isl_pw_aff *isl_pw_aff_copy(
2264                 __isl_keep isl_pw_aff *pwaff);
2265         void *isl_pw_aff_free(__isl_take isl_pw_aff *pwaff);
2266
2267 A (rational) bound on a dimension can be extracted from an C<isl_constraint>
2268 using the following function.  The constraint is required to have
2269 a non-zero coefficient for the specified dimension.
2270
2271         #include <isl/constraint.h>
2272         __isl_give isl_aff *isl_constraint_get_bound(
2273                 __isl_keep isl_constraint *constraint,
2274                 enum isl_dim_type type, int pos);
2275
2276 The entire affine expression of the constraint can also be extracted
2277 using the following function.
2278
2279         #include <isl/constraint.h>
2280         __isl_give isl_aff *isl_constraint_get_aff(
2281                 __isl_keep isl_constraint *constraint);
2282
2283 Conversely, an equality constraint equating
2284 the affine expression to zero or an inequality constraint enforcing
2285 the affine expression to be non-negative, can be constructed using
2286
2287         __isl_give isl_constraint *isl_equality_from_aff(
2288                 __isl_take isl_aff *aff);
2289         __isl_give isl_constraint *isl_inequality_from_aff(
2290                 __isl_take isl_aff *aff);
2291
2292 The expression can be inspected using
2293
2294         #include <isl/aff.h>
2295         isl_ctx *isl_aff_get_ctx(__isl_keep isl_aff *aff);
2296         int isl_aff_dim(__isl_keep isl_aff *aff,
2297                 enum isl_dim_type type);
2298         __isl_give isl_local_space *isl_aff_get_local_space(
2299                 __isl_keep isl_aff *aff);
2300         const char *isl_aff_get_dim_name(__isl_keep isl_aff *aff,
2301                 enum isl_dim_type type, unsigned pos);
2302         int isl_aff_get_constant(__isl_keep isl_aff *aff,
2303                 isl_int *v);
2304         int isl_aff_get_coefficient(__isl_keep isl_aff *aff,
2305                 enum isl_dim_type type, int pos, isl_int *v);
2306         int isl_aff_get_denominator(__isl_keep isl_aff *aff,
2307                 isl_int *v);
2308         __isl_give isl_div *isl_aff_get_div(
2309                 __isl_keep isl_aff *aff, int pos);
2310
2311         int isl_aff_involves_dims(__isl_keep isl_aff *aff,
2312                 enum isl_dim_type type, unsigned first, unsigned n);
2313         int isl_pw_aff_involves_dims(__isl_keep isl_pw_aff *pwaff,
2314                 enum isl_dim_type type, unsigned first, unsigned n);
2315
2316         isl_ctx *isl_pw_aff_get_ctx(__isl_keep isl_pw_aff *pwaff);
2317         unsigned isl_pw_aff_dim(__isl_keep isl_pw_aff *pwaff,
2318                 enum isl_dim_type type);
2319         int isl_pw_aff_is_empty(__isl_keep isl_pw_aff *pwaff);
2320
2321 It can be modified using
2322
2323         #include <isl/aff.h>
2324         __isl_give isl_aff *isl_aff_set_dim_name(
2325                 __isl_take isl_aff *aff, enum isl_dim_type type,
2326                 unsigned pos, const char *s);
2327         __isl_give isl_aff *isl_aff_set_constant(
2328                 __isl_take isl_aff *aff, isl_int v);
2329         __isl_give isl_aff *isl_aff_set_constant_si(
2330                 __isl_take isl_aff *aff, int v);
2331         __isl_give isl_aff *isl_aff_set_coefficient(
2332                 __isl_take isl_aff *aff,
2333                 enum isl_dim_type type, int pos, isl_int v);
2334         __isl_give isl_aff *isl_aff_set_coefficient_si(
2335                 __isl_take isl_aff *aff,
2336                 enum isl_dim_type type, int pos, int v);
2337         __isl_give isl_aff *isl_aff_set_denominator(
2338                 __isl_take isl_aff *aff, isl_int v);
2339
2340         __isl_give isl_aff *isl_aff_add_constant(
2341                 __isl_take isl_aff *aff, isl_int v);
2342         __isl_give isl_aff *isl_aff_add_constant_si(
2343                 __isl_take isl_aff *aff, int v);
2344         __isl_give isl_aff *isl_aff_add_coefficient(
2345                 __isl_take isl_aff *aff,
2346                 enum isl_dim_type type, int pos, isl_int v);
2347         __isl_give isl_aff *isl_aff_add_coefficient_si(
2348                 __isl_take isl_aff *aff,
2349                 enum isl_dim_type type, int pos, int v);
2350
2351         __isl_give isl_aff *isl_aff_insert_dims(
2352                 __isl_take isl_aff *aff,
2353                 enum isl_dim_type type, unsigned first, unsigned n);
2354         __isl_give isl_pw_aff *isl_pw_aff_insert_dims(
2355                 __isl_take isl_pw_aff *pwaff,
2356                 enum isl_dim_type type, unsigned first, unsigned n);
2357         __isl_give isl_aff *isl_aff_add_dims(
2358                 __isl_take isl_aff *aff,
2359                 enum isl_dim_type type, unsigned n);
2360         __isl_give isl_pw_aff *isl_pw_aff_add_dims(
2361                 __isl_take isl_pw_aff *pwaff,
2362                 enum isl_dim_type type, unsigned n);
2363         __isl_give isl_aff *isl_aff_drop_dims(
2364                 __isl_take isl_aff *aff,
2365                 enum isl_dim_type type, unsigned first, unsigned n);
2366         __isl_give isl_pw_aff *isl_pw_aff_drop_dims(
2367                 __isl_take isl_pw_aff *pwaff,
2368                 enum isl_dim_type type, unsigned first, unsigned n);
2369
2370 Note that the C<set_constant> and C<set_coefficient> functions
2371 set the I<numerator> of the constant or coefficient, while
2372 C<add_constant> and C<add_coefficient> add an integer value to
2373 the possibly rational constant or coefficient.
2374
2375 To check whether an affine expressions is obviously zero
2376 or obviously equal to some other affine expression, use
2377
2378         #include <isl/aff.h>
2379         int isl_aff_plain_is_zero(__isl_keep isl_aff *aff);
2380         int isl_aff_plain_is_equal(__isl_keep isl_aff *aff1,
2381                 __isl_keep isl_aff *aff2);
2382
2383 Operations include
2384
2385         #include <isl/aff.h>
2386         __isl_give isl_aff *isl_aff_add(__isl_take isl_aff *aff1,
2387                 __isl_take isl_aff *aff2);
2388         __isl_give isl_pw_aff *isl_pw_aff_add(
2389                 __isl_take isl_pw_aff *pwaff1,
2390                 __isl_take isl_pw_aff *pwaff2);
2391         __isl_give isl_aff *isl_aff_sub(__isl_take isl_aff *aff1,
2392                 __isl_take isl_aff *aff2);
2393         __isl_give isl_pw_aff *isl_pw_aff_sub(
2394                 __isl_take isl_pw_aff *pwaff1,
2395                 __isl_take isl_pw_aff *pwaff2);
2396         __isl_give isl_aff *isl_aff_neg(__isl_take isl_aff *aff);
2397         __isl_give isl_pw_aff *isl_pw_aff_neg(
2398                 __isl_take isl_pw_aff *pwaff);
2399         __isl_give isl_aff *isl_aff_ceil(__isl_take isl_aff *aff);
2400         __isl_give isl_pw_aff *isl_pw_aff_ceil(
2401                 __isl_take isl_pw_aff *pwaff);
2402         __isl_give isl_aff *isl_aff_floor(__isl_take isl_aff *aff);
2403         __isl_give isl_pw_aff *isl_pw_aff_floor(
2404                 __isl_take isl_pw_aff *pwaff);
2405         __isl_give isl_aff *isl_aff_scale(__isl_take isl_aff *aff,
2406                 isl_int f);
2407         __isl_give isl_pw_aff *isl_pw_aff_scale(
2408                 __isl_take isl_pw_aff *pwaff, isl_int f);
2409         __isl_give isl_aff *isl_aff_scale_down(__isl_take isl_aff *aff,
2410                 isl_int f);
2411         __isl_give isl_aff *isl_aff_scale_down_ui(
2412                 __isl_take isl_aff *aff, unsigned f);
2413         __isl_give isl_pw_aff *isl_pw_aff_scale_down(
2414                 __isl_take isl_pw_aff *pwaff, isl_int f);
2415
2416         __isl_give isl_pw_aff *isl_pw_aff_coalesce(
2417                 __isl_take isl_pw_aff *pwqp);
2418
2419         __isl_give isl_pw_aff *isl_pw_aff_align_params(
2420                 __isl_take isl_pw_aff *pwaff,
2421                 __isl_take isl_dim *model);
2422
2423         __isl_give isl_aff *isl_aff_gist(__isl_take isl_aff *aff,
2424                 __isl_take isl_set *context);
2425         __isl_give isl_pw_aff *isl_pw_aff_gist(
2426                 __isl_take isl_pw_aff *pwaff,
2427                 __isl_take isl_set *context);
2428
2429         __isl_give isl_set *isl_pw_aff_domain(
2430                 __isl_take isl_pw_aff *pwaff);
2431
2432         __isl_give isl_basic_set *isl_aff_ge_basic_set(
2433                 __isl_take isl_aff *aff1, __isl_take isl_aff *aff2);
2434         __isl_give isl_set *isl_pw_aff_eq_set(
2435                 __isl_take isl_pw_aff *pwaff1,
2436                 __isl_take isl_pw_aff *pwaff2);
2437         __isl_give isl_set *isl_pw_aff_le_set(
2438                 __isl_take isl_pw_aff *pwaff1,
2439                 __isl_take isl_pw_aff *pwaff2);
2440         __isl_give isl_set *isl_pw_aff_lt_set(
2441                 __isl_take isl_pw_aff *pwaff1,
2442                 __isl_take isl_pw_aff *pwaff2);
2443         __isl_give isl_set *isl_pw_aff_ge_set(
2444                 __isl_take isl_pw_aff *pwaff1,
2445                 __isl_take isl_pw_aff *pwaff2);
2446         __isl_give isl_set *isl_pw_aff_gt_set(
2447                 __isl_take isl_pw_aff *pwaff1,
2448                 __isl_take isl_pw_aff *pwaff2);
2449
2450 The function C<isl_aff_ge_basic_set> returns a basic set
2451 containing those elements in the shared space
2452 of C<aff1> and C<aff2> where C<aff1> is greater than or equal to C<aff2>.
2453 The function C<isl_aff_ge_set> returns a set
2454 containing those elements in the shared domain
2455 of C<pwaff1> and C<pwaff2> where C<pwaff1> is greater than or equal to C<pwaff2>.
2456
2457         #include <isl/aff.h>
2458         __isl_give isl_set *isl_pw_aff_nonneg_set(
2459                 __isl_take isl_pw_aff *pwaff);
2460
2461 The function C<isl_pw_aff_nonneg_set> returns a set
2462 containing those elements in the domain
2463 of C<pwaff> where C<pwaff> is non-negative.
2464
2465         #include <isl/aff.h>
2466         __isl_give isl_pw_aff *isl_pw_aff_cond(
2467                 __isl_take isl_set *cond,
2468                 __isl_take isl_pw_aff *pwaff_true,
2469                 __isl_take isl_pw_aff *pwaff_false);
2470
2471 The function C<isl_pw_aff_cond> performs a conditional operator
2472 and returns an expression that is equal to C<pwaff_true>
2473 for elements in C<cond> and equal to C<pwaff_false> for elements
2474 not in C<cond>.
2475
2476         #include <isl/aff.h>
2477         __isl_give isl_pw_aff *isl_pw_aff_max(
2478                 __isl_take isl_pw_aff *pwaff1,
2479                 __isl_take isl_pw_aff *pwaff2);
2480
2481 The function C<isl_pw_aff_max> computes a piecewise quasi-affine
2482 expression with a domain that is the union of those of C<pwaff1> and
2483 C<pwaff2> and such that on each cell, the quasi-affine expression is
2484 the maximum of those of C<pwaff1> and C<pwaff2>.  If only one of
2485 C<pwaff1> or C<pwaff2> is defined on a given cell, then the
2486 associated expression is the defined one.
2487
2488 An expression can be printed using
2489
2490         #include <isl/aff.h>
2491         __isl_give isl_printer *isl_printer_print_aff(
2492                 __isl_take isl_printer *p, __isl_keep isl_aff *aff);
2493
2494         __isl_give isl_printer *isl_printer_print_pw_aff(
2495                 __isl_take isl_printer *p,
2496                 __isl_keep isl_pw_aff *pwaff);
2497
2498 =head2 Points
2499
2500 Points are elements of a set.  They can be used to construct
2501 simple sets (boxes) or they can be used to represent the
2502 individual elements of a set.
2503 The zero point (the origin) can be created using
2504
2505         __isl_give isl_point *isl_point_zero(__isl_take isl_dim *dim);
2506
2507 The coordinates of a point can be inspected, set and changed
2508 using
2509
2510         void isl_point_get_coordinate(__isl_keep isl_point *pnt,
2511                 enum isl_dim_type type, int pos, isl_int *v);
2512         __isl_give isl_point *isl_point_set_coordinate(
2513                 __isl_take isl_point *pnt,
2514                 enum isl_dim_type type, int pos, isl_int v);
2515
2516         __isl_give isl_point *isl_point_add_ui(
2517                 __isl_take isl_point *pnt,
2518                 enum isl_dim_type type, int pos, unsigned val);
2519         __isl_give isl_point *isl_point_sub_ui(
2520                 __isl_take isl_point *pnt,
2521                 enum isl_dim_type type, int pos, unsigned val);
2522
2523 Other properties can be obtained using
2524
2525         isl_ctx *isl_point_get_ctx(__isl_keep isl_point *pnt);
2526
2527 Points can be copied or freed using
2528
2529         __isl_give isl_point *isl_point_copy(
2530                 __isl_keep isl_point *pnt);
2531         void isl_point_free(__isl_take isl_point *pnt);
2532
2533 A singleton set can be created from a point using
2534
2535         __isl_give isl_basic_set *isl_basic_set_from_point(
2536                 __isl_take isl_point *pnt);
2537         __isl_give isl_set *isl_set_from_point(
2538                 __isl_take isl_point *pnt);
2539
2540 and a box can be created from two opposite extremal points using
2541
2542         __isl_give isl_basic_set *isl_basic_set_box_from_points(
2543                 __isl_take isl_point *pnt1,
2544                 __isl_take isl_point *pnt2);
2545         __isl_give isl_set *isl_set_box_from_points(
2546                 __isl_take isl_point *pnt1,
2547                 __isl_take isl_point *pnt2);
2548
2549 All elements of a B<bounded> (union) set can be enumerated using
2550 the following functions.
2551
2552         int isl_set_foreach_point(__isl_keep isl_set *set,
2553                 int (*fn)(__isl_take isl_point *pnt, void *user),
2554                 void *user);
2555         int isl_union_set_foreach_point(__isl_keep isl_union_set *uset,
2556                 int (*fn)(__isl_take isl_point *pnt, void *user),
2557                 void *user);
2558
2559 The function C<fn> is called for each integer point in
2560 C<set> with as second argument the last argument of
2561 the C<isl_set_foreach_point> call.  The function C<fn>
2562 should return C<0> on success and C<-1> on failure.
2563 In the latter case, C<isl_set_foreach_point> will stop
2564 enumerating and return C<-1> as well.
2565 If the enumeration is performed successfully and to completion,
2566 then C<isl_set_foreach_point> returns C<0>.
2567
2568 To obtain a single point of a (basic) set, use
2569
2570         __isl_give isl_point *isl_basic_set_sample_point(
2571                 __isl_take isl_basic_set *bset);
2572         __isl_give isl_point *isl_set_sample_point(
2573                 __isl_take isl_set *set);
2574
2575 If C<set> does not contain any (integer) points, then the
2576 resulting point will be ``void'', a property that can be
2577 tested using
2578
2579         int isl_point_is_void(__isl_keep isl_point *pnt);
2580
2581 =head2 Piecewise Quasipolynomials
2582
2583 A piecewise quasipolynomial is a particular kind of function that maps
2584 a parametric point to a rational value.
2585 More specifically, a quasipolynomial is a polynomial expression in greatest
2586 integer parts of affine expressions of parameters and variables.
2587 A piecewise quasipolynomial is a subdivision of a given parametric
2588 domain into disjoint cells with a quasipolynomial associated to
2589 each cell.  The value of the piecewise quasipolynomial at a given
2590 point is the value of the quasipolynomial associated to the cell
2591 that contains the point.  Outside of the union of cells,
2592 the value is assumed to be zero.
2593 For example, the piecewise quasipolynomial
2594
2595         [n] -> { [x] -> ((1 + n) - x) : x <= n and x >= 0 }
2596
2597 maps C<x> to C<1 + n - x> for values of C<x> between C<0> and C<n>.
2598 A given piecewise quasipolynomial has a fixed domain dimension.
2599 Union piecewise quasipolynomials are used to contain piecewise quasipolynomials
2600 defined over different domains.
2601 Piecewise quasipolynomials are mainly used by the C<barvinok>
2602 library for representing the number of elements in a parametric set or map.
2603 For example, the piecewise quasipolynomial above represents
2604 the number of points in the map
2605
2606         [n] -> { [x] -> [y] : x,y >= 0 and 0 <= x + y <= n }
2607
2608 =head3 Printing (Piecewise) Quasipolynomials
2609
2610 Quasipolynomials and piecewise quasipolynomials can be printed
2611 using the following functions.
2612
2613         __isl_give isl_printer *isl_printer_print_qpolynomial(
2614                 __isl_take isl_printer *p,
2615                 __isl_keep isl_qpolynomial *qp);
2616
2617         __isl_give isl_printer *isl_printer_print_pw_qpolynomial(
2618                 __isl_take isl_printer *p,
2619                 __isl_keep isl_pw_qpolynomial *pwqp);
2620
2621         __isl_give isl_printer *isl_printer_print_union_pw_qpolynomial(
2622                 __isl_take isl_printer *p,
2623                 __isl_keep isl_union_pw_qpolynomial *upwqp);
2624
2625 The output format of the printer
2626 needs to be set to either C<ISL_FORMAT_ISL> or C<ISL_FORMAT_C>.
2627 For C<isl_printer_print_union_pw_qpolynomial>, only C<ISL_FORMAT_ISL>
2628 is supported.
2629 In case of printing in C<ISL_FORMAT_C>, the user may want
2630 to set the names of all dimensions
2631
2632         __isl_give isl_qpolynomial *isl_qpolynomial_set_dim_name(
2633                 __isl_take isl_qpolynomial *qp,
2634                 enum isl_dim_type type, unsigned pos,
2635                 const char *s);
2636         __isl_give isl_pw_qpolynomial *
2637         isl_pw_qpolynomial_set_dim_name(
2638                 __isl_take isl_pw_qpolynomial *pwqp,
2639                 enum isl_dim_type type, unsigned pos,
2640                 const char *s);
2641
2642 =head3 Creating New (Piecewise) Quasipolynomials
2643
2644 Some simple quasipolynomials can be created using the following functions.
2645 More complicated quasipolynomials can be created by applying
2646 operations such as addition and multiplication
2647 on the resulting quasipolynomials
2648
2649         __isl_give isl_qpolynomial *isl_qpolynomial_zero(
2650                 __isl_take isl_dim *dim);
2651         __isl_give isl_qpolynomial *isl_qpolynomial_one(
2652                 __isl_take isl_dim *dim);
2653         __isl_give isl_qpolynomial *isl_qpolynomial_infty(
2654                 __isl_take isl_dim *dim);
2655         __isl_give isl_qpolynomial *isl_qpolynomial_neginfty(
2656                 __isl_take isl_dim *dim);
2657         __isl_give isl_qpolynomial *isl_qpolynomial_nan(
2658                 __isl_take isl_dim *dim);
2659         __isl_give isl_qpolynomial *isl_qpolynomial_rat_cst(
2660                 __isl_take isl_dim *dim,
2661                 const isl_int n, const isl_int d);
2662         __isl_give isl_qpolynomial *isl_qpolynomial_div(
2663                 __isl_take isl_div *div);
2664         __isl_give isl_qpolynomial *isl_qpolynomial_var(
2665                 __isl_take isl_dim *dim,
2666                 enum isl_dim_type type, unsigned pos);
2667         __isl_give isl_qpolynomial *isl_qpolynomial_from_aff(
2668                 __isl_take isl_aff *aff);
2669
2670 The zero piecewise quasipolynomial or a piecewise quasipolynomial
2671 with a single cell can be created using the following functions.
2672 Multiple of these single cell piecewise quasipolynomials can
2673 be combined to create more complicated piecewise quasipolynomials.
2674
2675         __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_zero(
2676                 __isl_take isl_dim *dim);
2677         __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_alloc(
2678                 __isl_take isl_set *set,
2679                 __isl_take isl_qpolynomial *qp);
2680
2681         __isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_zero(
2682                 __isl_take isl_dim *dim);
2683         __isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_from_pw_qpolynomial(
2684                 __isl_take isl_pw_qpolynomial *pwqp);
2685         __isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_add_pw_qpolynomial(
2686                 __isl_take isl_union_pw_qpolynomial *upwqp,
2687                 __isl_take isl_pw_qpolynomial *pwqp);
2688
2689 Quasipolynomials can be copied and freed again using the following
2690 functions.
2691
2692         __isl_give isl_qpolynomial *isl_qpolynomial_copy(
2693                 __isl_keep isl_qpolynomial *qp);
2694         void isl_qpolynomial_free(__isl_take isl_qpolynomial *qp);
2695
2696         __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_copy(
2697                 __isl_keep isl_pw_qpolynomial *pwqp);
2698         void *isl_pw_qpolynomial_free(
2699                 __isl_take isl_pw_qpolynomial *pwqp);
2700
2701         __isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_copy(
2702                 __isl_keep isl_union_pw_qpolynomial *upwqp);
2703         void isl_union_pw_qpolynomial_free(
2704                 __isl_take isl_union_pw_qpolynomial *upwqp);
2705
2706 =head3 Inspecting (Piecewise) Quasipolynomials
2707
2708 To iterate over all piecewise quasipolynomials in a union
2709 piecewise quasipolynomial, use the following function
2710
2711         int isl_union_pw_qpolynomial_foreach_pw_qpolynomial(
2712                 __isl_keep isl_union_pw_qpolynomial *upwqp,
2713                 int (*fn)(__isl_take isl_pw_qpolynomial *pwqp, void *user),
2714                 void *user);
2715
2716 To extract the piecewise quasipolynomial from a union with a given dimension
2717 specification, use
2718
2719         __isl_give isl_pw_qpolynomial *
2720         isl_union_pw_qpolynomial_extract_pw_qpolynomial(
2721                 __isl_keep isl_union_pw_qpolynomial *upwqp,
2722                 __isl_take isl_dim *dim);
2723
2724 To iterate over the cells in a piecewise quasipolynomial,
2725 use either of the following two functions
2726
2727         int isl_pw_qpolynomial_foreach_piece(
2728                 __isl_keep isl_pw_qpolynomial *pwqp,
2729                 int (*fn)(__isl_take isl_set *set,
2730                           __isl_take isl_qpolynomial *qp,
2731                           void *user), void *user);
2732         int isl_pw_qpolynomial_foreach_lifted_piece(
2733                 __isl_keep isl_pw_qpolynomial *pwqp,
2734                 int (*fn)(__isl_take isl_set *set,
2735                           __isl_take isl_qpolynomial *qp,
2736                           void *user), void *user);
2737
2738 As usual, the function C<fn> should return C<0> on success
2739 and C<-1> on failure.  The difference between
2740 C<isl_pw_qpolynomial_foreach_piece> and
2741 C<isl_pw_qpolynomial_foreach_lifted_piece> is that
2742 C<isl_pw_qpolynomial_foreach_lifted_piece> will first
2743 compute unique representations for all existentially quantified
2744 variables and then turn these existentially quantified variables
2745 into extra set variables, adapting the associated quasipolynomial
2746 accordingly.  This means that the C<set> passed to C<fn>
2747 will not have any existentially quantified variables, but that
2748 the dimensions of the sets may be different for different
2749 invocations of C<fn>.
2750
2751 To iterate over all terms in a quasipolynomial,
2752 use
2753
2754         int isl_qpolynomial_foreach_term(
2755                 __isl_keep isl_qpolynomial *qp,
2756                 int (*fn)(__isl_take isl_term *term,
2757                           void *user), void *user);
2758
2759 The terms themselves can be inspected and freed using
2760 these functions
2761
2762         unsigned isl_term_dim(__isl_keep isl_term *term,
2763                 enum isl_dim_type type);
2764         void isl_term_get_num(__isl_keep isl_term *term,
2765                 isl_int *n);
2766         void isl_term_get_den(__isl_keep isl_term *term,
2767                 isl_int *d);
2768         int isl_term_get_exp(__isl_keep isl_term *term,
2769                 enum isl_dim_type type, unsigned pos);
2770         __isl_give isl_div *isl_term_get_div(
2771                 __isl_keep isl_term *term, unsigned pos);
2772         void isl_term_free(__isl_take isl_term *term);
2773
2774 Each term is a product of parameters, set variables and
2775 integer divisions.  The function C<isl_term_get_exp>
2776 returns the exponent of a given dimensions in the given term.
2777 The C<isl_int>s in the arguments of C<isl_term_get_num>
2778 and C<isl_term_get_den> need to have been initialized
2779 using C<isl_int_init> before calling these functions.
2780
2781 =head3 Properties of (Piecewise) Quasipolynomials
2782
2783 To check whether a quasipolynomial is actually a constant,
2784 use the following function.
2785
2786         int isl_qpolynomial_is_cst(__isl_keep isl_qpolynomial *qp,
2787                 isl_int *n, isl_int *d);
2788
2789 If C<qp> is a constant and if C<n> and C<d> are not C<NULL>
2790 then the numerator and denominator of the constant
2791 are returned in C<*n> and C<*d>, respectively.
2792
2793 =head3 Operations on (Piecewise) Quasipolynomials
2794
2795         __isl_give isl_qpolynomial *isl_qpolynomial_scale(
2796                 __isl_take isl_qpolynomial *qp, isl_int v);
2797         __isl_give isl_qpolynomial *isl_qpolynomial_neg(
2798                 __isl_take isl_qpolynomial *qp);
2799         __isl_give isl_qpolynomial *isl_qpolynomial_add(
2800                 __isl_take isl_qpolynomial *qp1,
2801                 __isl_take isl_qpolynomial *qp2);
2802         __isl_give isl_qpolynomial *isl_qpolynomial_sub(
2803                 __isl_take isl_qpolynomial *qp1,
2804                 __isl_take isl_qpolynomial *qp2);
2805         __isl_give isl_qpolynomial *isl_qpolynomial_mul(
2806                 __isl_take isl_qpolynomial *qp1,
2807                 __isl_take isl_qpolynomial *qp2);
2808         __isl_give isl_qpolynomial *isl_qpolynomial_pow(
2809                 __isl_take isl_qpolynomial *qp, unsigned exponent);
2810
2811         __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_add(
2812                 __isl_take isl_pw_qpolynomial *pwqp1,
2813                 __isl_take isl_pw_qpolynomial *pwqp2);
2814         __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_sub(
2815                 __isl_take isl_pw_qpolynomial *pwqp1,
2816                 __isl_take isl_pw_qpolynomial *pwqp2);
2817         __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_add_disjoint(
2818                 __isl_take isl_pw_qpolynomial *pwqp1,
2819                 __isl_take isl_pw_qpolynomial *pwqp2);
2820         __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_neg(
2821                 __isl_take isl_pw_qpolynomial *pwqp);
2822         __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_mul(
2823                 __isl_take isl_pw_qpolynomial *pwqp1,
2824                 __isl_take isl_pw_qpolynomial *pwqp2);
2825
2826         __isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_add(
2827                 __isl_take isl_union_pw_qpolynomial *upwqp1,
2828                 __isl_take isl_union_pw_qpolynomial *upwqp2);
2829         __isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_sub(
2830                 __isl_take isl_union_pw_qpolynomial *upwqp1,
2831                 __isl_take isl_union_pw_qpolynomial *upwqp2);
2832         __isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_mul(
2833                 __isl_take isl_union_pw_qpolynomial *upwqp1,
2834                 __isl_take isl_union_pw_qpolynomial *upwqp2);
2835
2836         __isl_give isl_qpolynomial *isl_pw_qpolynomial_eval(
2837                 __isl_take isl_pw_qpolynomial *pwqp,
2838                 __isl_take isl_point *pnt);
2839
2840         __isl_give isl_qpolynomial *isl_union_pw_qpolynomial_eval(
2841                 __isl_take isl_union_pw_qpolynomial *upwqp,
2842                 __isl_take isl_point *pnt);
2843
2844         __isl_give isl_set *isl_pw_qpolynomial_domain(
2845                 __isl_take isl_pw_qpolynomial *pwqp);
2846         __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_intersect_domain(
2847                 __isl_take isl_pw_qpolynomial *pwpq,
2848                 __isl_take isl_set *set);
2849
2850         __isl_give isl_union_set *isl_union_pw_qpolynomial_domain(
2851                 __isl_take isl_union_pw_qpolynomial *upwqp);
2852         __isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_intersect_domain(
2853                 __isl_take isl_union_pw_qpolynomial *upwpq,
2854                 __isl_take isl_union_set *uset);
2855
2856         __isl_give isl_qpolynomial *isl_qpolynomial_align_params(
2857                 __isl_take isl_qpolynomial *qp,
2858                 __isl_take isl_dim *model);
2859
2860         __isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_coalesce(
2861                 __isl_take isl_union_pw_qpolynomial *upwqp);
2862
2863         __isl_give isl_qpolynomial *isl_qpolynomial_gist(
2864                 __isl_take isl_qpolynomial *qp,
2865                 __isl_take isl_set *context);
2866
2867         __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_gist(
2868                 __isl_take isl_pw_qpolynomial *pwqp,
2869                 __isl_take isl_set *context);
2870
2871         __isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_gist(
2872                 __isl_take isl_union_pw_qpolynomial *upwqp,
2873                 __isl_take isl_union_set *context);
2874
2875 The gist operation applies the gist operation to each of
2876 the cells in the domain of the input piecewise quasipolynomial.
2877 The context is also exploited
2878 to simplify the quasipolynomials associated to each cell.
2879
2880         __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_to_polynomial(
2881                 __isl_take isl_pw_qpolynomial *pwqp, int sign);
2882         __isl_give isl_union_pw_qpolynomial *
2883         isl_union_pw_qpolynomial_to_polynomial(
2884                 __isl_take isl_union_pw_qpolynomial *upwqp, int sign);
2885
2886 Approximate each quasipolynomial by a polynomial.  If C<sign> is positive,
2887 the polynomial will be an overapproximation.  If C<sign> is negative,
2888 it will be an underapproximation.  If C<sign> is zero, the approximation
2889 will lie somewhere in between.
2890
2891 =head2 Bounds on Piecewise Quasipolynomials and Piecewise Quasipolynomial Reductions
2892
2893 A piecewise quasipolynomial reduction is a piecewise
2894 reduction (or fold) of quasipolynomials.
2895 In particular, the reduction can be maximum or a minimum.
2896 The objects are mainly used to represent the result of
2897 an upper or lower bound on a quasipolynomial over its domain,
2898 i.e., as the result of the following function.
2899
2900         __isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_bound(
2901                 __isl_take isl_pw_qpolynomial *pwqp,
2902                 enum isl_fold type, int *tight);
2903
2904         __isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_bound(
2905                 __isl_take isl_union_pw_qpolynomial *upwqp,
2906                 enum isl_fold type, int *tight);
2907
2908 The C<type> argument may be either C<isl_fold_min> or C<isl_fold_max>.
2909 If C<tight> is not C<NULL>, then C<*tight> is set to C<1>
2910 is the returned bound is known be tight, i.e., for each value
2911 of the parameters there is at least
2912 one element in the domain that reaches the bound.
2913 If the domain of C<pwqp> is not wrapping, then the bound is computed
2914 over all elements in that domain and the result has a purely parametric
2915 domain.  If the domain of C<pwqp> is wrapping, then the bound is
2916 computed over the range of the wrapped relation.  The domain of the
2917 wrapped relation becomes the domain of the result.
2918
2919 A (piecewise) quasipolynomial reduction can be copied or freed using the
2920 following functions.
2921
2922         __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_copy(
2923                 __isl_keep isl_qpolynomial_fold *fold);
2924         __isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_copy(
2925                 __isl_keep isl_pw_qpolynomial_fold *pwf);
2926         __isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_copy(
2927                 __isl_keep isl_union_pw_qpolynomial_fold *upwf);
2928         void isl_qpolynomial_fold_free(
2929                 __isl_take isl_qpolynomial_fold *fold);
2930         void *isl_pw_qpolynomial_fold_free(
2931                 __isl_take isl_pw_qpolynomial_fold *pwf);
2932         void isl_union_pw_qpolynomial_fold_free(
2933                 __isl_take isl_union_pw_qpolynomial_fold *upwf);
2934
2935 =head3 Printing Piecewise Quasipolynomial Reductions
2936
2937 Piecewise quasipolynomial reductions can be printed
2938 using the following function.
2939
2940         __isl_give isl_printer *isl_printer_print_pw_qpolynomial_fold(
2941                 __isl_take isl_printer *p,
2942                 __isl_keep isl_pw_qpolynomial_fold *pwf);
2943         __isl_give isl_printer *isl_printer_print_union_pw_qpolynomial_fold(
2944                 __isl_take isl_printer *p,
2945                 __isl_keep isl_union_pw_qpolynomial_fold *upwf);
2946
2947 For C<isl_printer_print_pw_qpolynomial_fold>,
2948 output format of the printer
2949 needs to be set to either C<ISL_FORMAT_ISL> or C<ISL_FORMAT_C>.
2950 For C<isl_printer_print_union_pw_qpolynomial_fold>,
2951 output format of the printer
2952 needs to be set to C<ISL_FORMAT_ISL>.
2953 In case of printing in C<ISL_FORMAT_C>, the user may want
2954 to set the names of all dimensions
2955
2956         __isl_give isl_pw_qpolynomial_fold *
2957         isl_pw_qpolynomial_fold_set_dim_name(
2958                 __isl_take isl_pw_qpolynomial_fold *pwf,
2959                 enum isl_dim_type type, unsigned pos,
2960                 const char *s);
2961
2962 =head3 Inspecting (Piecewise) Quasipolynomial Reductions
2963
2964 To iterate over all piecewise quasipolynomial reductions in a union
2965 piecewise quasipolynomial reduction, use the following function
2966
2967         int isl_union_pw_qpolynomial_fold_foreach_pw_qpolynomial_fold(
2968                 __isl_keep isl_union_pw_qpolynomial_fold *upwf,
2969                 int (*fn)(__isl_take isl_pw_qpolynomial_fold *pwf,
2970                             void *user), void *user);
2971
2972 To iterate over the cells in a piecewise quasipolynomial reduction,
2973 use either of the following two functions
2974
2975         int isl_pw_qpolynomial_fold_foreach_piece(
2976                 __isl_keep isl_pw_qpolynomial_fold *pwf,
2977                 int (*fn)(__isl_take isl_set *set,
2978                           __isl_take isl_qpolynomial_fold *fold,
2979                           void *user), void *user);
2980         int isl_pw_qpolynomial_fold_foreach_lifted_piece(
2981                 __isl_keep isl_pw_qpolynomial_fold *pwf,
2982                 int (*fn)(__isl_take isl_set *set,
2983                           __isl_take isl_qpolynomial_fold *fold,
2984                           void *user), void *user);
2985
2986 See L<Inspecting (Piecewise) Quasipolynomials> for an explanation
2987 of the difference between these two functions.
2988
2989 To iterate over all quasipolynomials in a reduction, use
2990
2991         int isl_qpolynomial_fold_foreach_qpolynomial(
2992                 __isl_keep isl_qpolynomial_fold *fold,
2993                 int (*fn)(__isl_take isl_qpolynomial *qp,
2994                           void *user), void *user);
2995
2996 =head3 Operations on Piecewise Quasipolynomial Reductions
2997
2998         __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_scale(
2999                 __isl_take isl_qpolynomial_fold *fold, isl_int v);
3000
3001         __isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_add(
3002                 __isl_take isl_pw_qpolynomial_fold *pwf1,
3003                 __isl_take isl_pw_qpolynomial_fold *pwf2);
3004
3005         __isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_fold(
3006                 __isl_take isl_pw_qpolynomial_fold *pwf1,
3007                 __isl_take isl_pw_qpolynomial_fold *pwf2);
3008
3009         __isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_fold(
3010                 __isl_take isl_union_pw_qpolynomial_fold *upwf1,
3011                 __isl_take isl_union_pw_qpolynomial_fold *upwf2);
3012
3013         __isl_give isl_qpolynomial *isl_pw_qpolynomial_fold_eval(
3014                 __isl_take isl_pw_qpolynomial_fold *pwf,
3015                 __isl_take isl_point *pnt);
3016
3017         __isl_give isl_qpolynomial *isl_union_pw_qpolynomial_fold_eval(
3018                 __isl_take isl_union_pw_qpolynomial_fold *upwf,
3019                 __isl_take isl_point *pnt);
3020
3021         __isl_give isl_union_set *isl_union_pw_qpolynomial_fold_domain(
3022                 __isl_take isl_union_pw_qpolynomial_fold *upwf);
3023         __isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_intersect_domain(
3024                 __isl_take isl_union_pw_qpolynomial_fold *upwf,
3025                 __isl_take isl_union_set *uset);
3026
3027         __isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_coalesce(
3028                 __isl_take isl_pw_qpolynomial_fold *pwf);
3029
3030         __isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_coalesce(
3031                 __isl_take isl_union_pw_qpolynomial_fold *upwf);
3032
3033         __isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_gist(
3034                 __isl_take isl_pw_qpolynomial_fold *pwf,
3035                 __isl_take isl_set *context);
3036
3037         __isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_gist(
3038                 __isl_take isl_union_pw_qpolynomial_fold *upwf,
3039                 __isl_take isl_union_set *context);
3040
3041 The gist operation applies the gist operation to each of
3042 the cells in the domain of the input piecewise quasipolynomial reduction.
3043 In future, the operation will also exploit the context
3044 to simplify the quasipolynomial reductions associated to each cell.
3045
3046         __isl_give isl_pw_qpolynomial_fold *
3047         isl_set_apply_pw_qpolynomial_fold(
3048                 __isl_take isl_set *set,
3049                 __isl_take isl_pw_qpolynomial_fold *pwf,
3050                 int *tight);
3051         __isl_give isl_pw_qpolynomial_fold *
3052         isl_map_apply_pw_qpolynomial_fold(
3053                 __isl_take isl_map *map,
3054                 __isl_take isl_pw_qpolynomial_fold *pwf,
3055                 int *tight);
3056         __isl_give isl_union_pw_qpolynomial_fold *
3057         isl_union_set_apply_union_pw_qpolynomial_fold(
3058                 __isl_take isl_union_set *uset,
3059                 __isl_take isl_union_pw_qpolynomial_fold *upwf,
3060                 int *tight);
3061         __isl_give isl_union_pw_qpolynomial_fold *
3062         isl_union_map_apply_union_pw_qpolynomial_fold(
3063                 __isl_take isl_union_map *umap,
3064                 __isl_take isl_union_pw_qpolynomial_fold *upwf,
3065                 int *tight);
3066
3067 The functions taking a map
3068 compose the given map with the given piecewise quasipolynomial reduction.
3069 That is, compute a bound (of the same type as C<pwf> or C<upwf> itself)
3070 over all elements in the intersection of the range of the map
3071 and the domain of the piecewise quasipolynomial reduction
3072 as a function of an element in the domain of the map.
3073 The functions taking a set compute a bound over all elements in the
3074 intersection of the set and the domain of the
3075 piecewise quasipolynomial reduction.
3076
3077 =head2 Dependence Analysis
3078
3079 C<isl> contains specialized functionality for performing
3080 array dataflow analysis.  That is, given a I<sink> access relation
3081 and a collection of possible I<source> access relations,
3082 C<isl> can compute relations that describe
3083 for each iteration of the sink access, which iteration
3084 of which of the source access relations was the last
3085 to access the same data element before the given iteration
3086 of the sink access.
3087 To compute standard flow dependences, the sink should be
3088 a read, while the sources should be writes.
3089 If any of the source accesses are marked as being I<may>
3090 accesses, then there will be a dependence to the last
3091 I<must> access B<and> to any I<may> access that follows
3092 this last I<must> access.
3093 In particular, if I<all> sources are I<may> accesses,
3094 then memory based dependence analysis is performed.
3095 If, on the other hand, all sources are I<must> accesses,
3096 then value based dependence analysis is performed.
3097
3098         #include <isl/flow.h>
3099
3100         typedef int (*isl_access_level_before)(void *first, void *second);
3101
3102         __isl_give isl_access_info *isl_access_info_alloc(
3103                 __isl_take isl_map *sink,
3104                 void *sink_user, isl_access_level_before fn,
3105                 int max_source);
3106         __isl_give isl_access_info *isl_access_info_add_source(
3107                 __isl_take isl_access_info *acc,
3108                 __isl_take isl_map *source, int must,
3109                 void *source_user);
3110         void isl_access_info_free(__isl_take isl_access_info *acc);
3111
3112         __isl_give isl_flow *isl_access_info_compute_flow(
3113                 __isl_take isl_access_info *acc);
3114
3115         int isl_flow_foreach(__isl_keep isl_flow *deps,
3116                 int (*fn)(__isl_take isl_map *dep, int must,
3117                           void *dep_user, void *user),
3118                 void *user);
3119         __isl_give isl_map *isl_flow_get_no_source(
3120                 __isl_keep isl_flow *deps, int must);
3121         void isl_flow_free(__isl_take isl_flow *deps);
3122
3123 The function C<isl_access_info_compute_flow> performs the actual
3124 dependence analysis.  The other functions are used to construct
3125 the input for this function or to read off the output.
3126
3127 The input is collected in an C<isl_access_info>, which can
3128 be created through a call to C<isl_access_info_alloc>.
3129 The arguments to this functions are the sink access relation
3130 C<sink>, a token C<sink_user> used to identify the sink
3131 access to the user, a callback function for specifying the
3132 relative order of source and sink accesses, and the number
3133 of source access relations that will be added.
3134 The callback function has type C<int (*)(void *first, void *second)>.
3135 The function is called with two user supplied tokens identifying
3136 either a source or the sink and it should return the shared nesting
3137 level and the relative order of the two accesses.
3138 In particular, let I<n> be the number of loops shared by
3139 the two accesses.  If C<first> precedes C<second> textually,
3140 then the function should return I<2 * n + 1>; otherwise,
3141 it should return I<2 * n>.
3142 The sources can be added to the C<isl_access_info> by performing
3143 (at most) C<max_source> calls to C<isl_access_info_add_source>.
3144 C<must> indicates whether the source is a I<must> access
3145 or a I<may> access.  Note that a multi-valued access relation
3146 should only be marked I<must> if every iteration in the domain
3147 of the relation accesses I<all> elements in its image.
3148 The C<source_user> token is again used to identify
3149 the source access.  The range of the source access relation
3150 C<source> should have the same dimension as the range
3151 of the sink access relation.
3152 The C<isl_access_info_free> function should usually not be
3153 called explicitly, because it is called implicitly by
3154 C<isl_access_info_compute_flow>.
3155
3156 The result of the dependence analysis is collected in an
3157 C<isl_flow>.  There may be elements of
3158 the sink access for which no preceding source access could be
3159 found or for which all preceding sources are I<may> accesses.
3160 The relations containing these elements can be obtained through
3161 calls to C<isl_flow_get_no_source>, the first with C<must> set
3162 and the second with C<must> unset.
3163 In the case of standard flow dependence analysis,
3164 with the sink a read and the sources I<must> writes,
3165 the first relation corresponds to the reads from uninitialized
3166 array elements and the second relation is empty.
3167 The actual flow dependences can be extracted using
3168 C<isl_flow_foreach>.  This function will call the user-specified
3169 callback function C<fn> for each B<non-empty> dependence between
3170 a source and the sink.  The callback function is called
3171 with four arguments, the actual flow dependence relation
3172 mapping source iterations to sink iterations, a boolean that
3173 indicates whether it is a I<must> or I<may> dependence, a token
3174 identifying the source and an additional C<void *> with value
3175 equal to the third argument of the C<isl_flow_foreach> call.
3176 A dependence is marked I<must> if it originates from a I<must>
3177 source and if it is not followed by any I<may> sources.
3178
3179 After finishing with an C<isl_flow>, the user should call
3180 C<isl_flow_free> to free all associated memory.
3181
3182 A higher-level interface to dependence analysis is provided
3183 by the following function.
3184
3185         #include <isl/flow.h>
3186
3187         int isl_union_map_compute_flow(__isl_take isl_union_map *sink,
3188                 __isl_take isl_union_map *must_source,
3189                 __isl_take isl_union_map *may_source,
3190                 __isl_take isl_union_map *schedule,
3191                 __isl_give isl_union_map **must_dep,
3192                 __isl_give isl_union_map **may_dep,
3193                 __isl_give isl_union_map **must_no_source,
3194                 __isl_give isl_union_map **may_no_source);
3195
3196 The arrays are identified by the tuple names of the ranges
3197 of the accesses.  The iteration domains by the tuple names
3198 of the domains of the accesses and of the schedule.
3199 The relative order of the iteration domains is given by the
3200 schedule.  The relations returned through C<must_no_source>
3201 and C<may_no_source> are subsets of C<sink>.
3202 Any of C<must_dep>, C<may_dep>, C<must_no_source>
3203 or C<may_no_source> may be C<NULL>, but a C<NULL> value for
3204 any of the other arguments is treated as an error.
3205
3206 =head2 Scheduling
3207
3208 B<The functionality described in this section is fairly new
3209 and may be subject to change.>
3210
3211 The following function can be used to compute a schedule
3212 for a union of domains.  The generated schedule respects
3213 all C<validity> dependences.  That is, all dependence distances
3214 over these dependences in the scheduled space are lexicographically
3215 positive.  The generated schedule schedule also tries to minimize
3216 the dependence distances over C<proximity> dependences.
3217 Moreover, it tries to obtain sequences (bands) of schedule dimensions
3218 for groups of domains where the dependence distances have only
3219 non-negative values.
3220 The algorithm used to construct the schedule is similar to that
3221 of C<Pluto>.
3222
3223         #include <isl/schedule.h>
3224         __isl_give isl_schedule *isl_union_set_compute_schedule(
3225                 __isl_take isl_union_set *domain,
3226                 __isl_take isl_union_map *validity,
3227                 __isl_take isl_union_map *proximity);
3228         void *isl_schedule_free(__isl_take isl_schedule *sched);
3229
3230 A mapping from the domains to the scheduled space can be obtained
3231 from an C<isl_schedule> using the following function.
3232
3233         __isl_give isl_union_map *isl_schedule_get_map(
3234                 __isl_keep isl_schedule *sched);
3235
3236 A representation of the schedule can be printed using
3237          
3238         __isl_give isl_printer *isl_printer_print_schedule(
3239                 __isl_take isl_printer *p,
3240                 __isl_keep isl_schedule *schedule);
3241
3242 A representation of the schedule as a forest of bands can be obtained
3243 using the following function.
3244
3245         __isl_give isl_band_list *isl_schedule_get_band_forest(
3246                 __isl_keep isl_schedule *schedule);
3247
3248 The list can be manipulated as explained in L<"Lists">.
3249 The bands inside the list can be copied and freed using the following
3250 functions.
3251
3252         #include <isl/band.h>
3253         __isl_give isl_band *isl_band_copy(
3254                 __isl_keep isl_band *band);
3255         void *isl_band_free(__isl_take isl_band *band);
3256
3257 Each band contains zero or more scheduling dimensions.
3258 These are referred to as the members of the band.
3259 The section of the schedule that corresponds to the band is
3260 referred to as the partial schedule of the band.
3261 For those nodes that participate in a band, the outer scheduling
3262 dimensions form the prefix schedule, while the inner scheduling
3263 dimensions form the suffix schedule.
3264 That is, if we take a cut of the band forest, then the union of
3265 the concatenations of the prefix, partial and suffix schedules of
3266 each band in the cut is equal to the entire schedule (modulo
3267 some possible padding at the end with zero scheduling dimensions).
3268 The properties of a band can be inspected using the following functions.
3269
3270         #include <isl/band.h>
3271         isl_ctx *isl_band_get_ctx(__isl_keep isl_band *band);
3272
3273         int isl_band_has_children(__isl_keep isl_band *band);
3274         __isl_give isl_band_list *isl_band_get_children(
3275                 __isl_keep isl_band *band);
3276
3277         __isl_give isl_union_map *isl_band_get_prefix_schedule(
3278                 __isl_keep isl_band *band);
3279         __isl_give isl_union_map *isl_band_get_partial_schedule(
3280                 __isl_keep isl_band *band);
3281         __isl_give isl_union_map *isl_band_get_suffix_schedule(
3282                 __isl_keep isl_band *band);
3283
3284         int isl_band_n_member(__isl_keep isl_band *band);
3285         int isl_band_member_is_zero_distance(
3286                 __isl_keep isl_band *band, int pos);
3287
3288 Note that a scheduling dimension is considered to be ``zero
3289 distance'' if it does not carry any proximity dependences
3290 within its band.
3291 That is, if the dependence distances of the proximity
3292 dependences are all zero in that direction (for fixed
3293 iterations of outer bands).
3294
3295 A representation of the band can be printed using
3296
3297         #include <isl/band.h>
3298         __isl_give isl_printer *isl_printer_print_band(
3299                 __isl_take isl_printer *p,
3300                 __isl_keep isl_band *band);
3301
3302 =head2 Parametric Vertex Enumeration
3303
3304 The parametric vertex enumeration described in this section
3305 is mainly intended to be used internally and by the C<barvinok>
3306 library.
3307
3308         #include <isl/vertices.h>
3309         __isl_give isl_vertices *isl_basic_set_compute_vertices(
3310                 __isl_keep isl_basic_set *bset);
3311
3312 The function C<isl_basic_set_compute_vertices> performs the
3313 actual computation of the parametric vertices and the chamber
3314 decomposition and store the result in an C<isl_vertices> object.
3315 This information can be queried by either iterating over all
3316 the vertices or iterating over all the chambers or cells
3317 and then iterating over all vertices that are active on the chamber.
3318
3319         int isl_vertices_foreach_vertex(
3320                 __isl_keep isl_vertices *vertices,
3321                 int (*fn)(__isl_take isl_vertex *vertex, void *user),
3322                 void *user);
3323
3324         int isl_vertices_foreach_cell(
3325                 __isl_keep isl_vertices *vertices,
3326                 int (*fn)(__isl_take isl_cell *cell, void *user),
3327                 void *user);
3328         int isl_cell_foreach_vertex(__isl_keep isl_cell *cell,
3329                 int (*fn)(__isl_take isl_vertex *vertex, void *user),
3330                 void *user);
3331
3332 Other operations that can be performed on an C<isl_vertices> object are
3333 the following.
3334
3335         isl_ctx *isl_vertices_get_ctx(
3336                 __isl_keep isl_vertices *vertices);
3337         int isl_vertices_get_n_vertices(
3338                 __isl_keep isl_vertices *vertices);
3339         void isl_vertices_free(__isl_take isl_vertices *vertices);
3340
3341 Vertices can be inspected and destroyed using the following functions.
3342
3343         isl_ctx *isl_vertex_get_ctx(__isl_keep isl_vertex *vertex);
3344         int isl_vertex_get_id(__isl_keep isl_vertex *vertex);
3345         __isl_give isl_basic_set *isl_vertex_get_domain(
3346                 __isl_keep isl_vertex *vertex);
3347         __isl_give isl_basic_set *isl_vertex_get_expr(
3348                 __isl_keep isl_vertex *vertex);
3349         void isl_vertex_free(__isl_take isl_vertex *vertex);
3350
3351 C<isl_vertex_get_expr> returns a singleton parametric set describing
3352 the vertex, while C<isl_vertex_get_domain> returns the activity domain
3353 of the vertex.
3354 Note that C<isl_vertex_get_domain> and C<isl_vertex_get_expr> return
3355 B<rational> basic sets, so they should mainly be used for inspection
3356 and should not be mixed with integer sets.
3357
3358 Chambers can be inspected and destroyed using the following functions.
3359
3360         isl_ctx *isl_cell_get_ctx(__isl_keep isl_cell *cell);
3361         __isl_give isl_basic_set *isl_cell_get_domain(
3362                 __isl_keep isl_cell *cell);
3363         void isl_cell_free(__isl_take isl_cell *cell);
3364
3365 =head1 Applications
3366
3367 Although C<isl> is mainly meant to be used as a library,
3368 it also contains some basic applications that use some
3369 of the functionality of C<isl>.
3370 The input may be specified in either the L<isl format>
3371 or the L<PolyLib format>.
3372
3373 =head2 C<isl_polyhedron_sample>
3374
3375 C<isl_polyhedron_sample> takes a polyhedron as input and prints
3376 an integer element of the polyhedron, if there is any.
3377 The first column in the output is the denominator and is always
3378 equal to 1.  If the polyhedron contains no integer points,
3379 then a vector of length zero is printed.
3380
3381 =head2 C<isl_pip>
3382
3383 C<isl_pip> takes the same input as the C<example> program
3384 from the C<piplib> distribution, i.e., a set of constraints
3385 on the parameters, a line containing only -1 and finally a set
3386 of constraints on a parametric polyhedron.
3387 The coefficients of the parameters appear in the last columns
3388 (but before the final constant column).
3389 The output is the lexicographic minimum of the parametric polyhedron.
3390 As C<isl> currently does not have its own output format, the output
3391 is just a dump of the internal state.
3392
3393 =head2 C<isl_polyhedron_minimize>
3394
3395 C<isl_polyhedron_minimize> computes the minimum of some linear
3396 or affine objective function over the integer points in a polyhedron.
3397 If an affine objective function
3398 is given, then the constant should appear in the last column.
3399
3400 =head2 C<isl_polytope_scan>
3401
3402 Given a polytope, C<isl_polytope_scan> prints
3403 all integer points in the polytope.