export isl_map_eliminate
[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 a B<map> space as input.  An old call
72 C<isl_map_identity(space)> can be rewritten to
73 C<isl_map_identity(isl_space_map_from_set(space))>.
74
75 =item * The function C<isl_map_power> no longer takes
76 a parameter position as input.  Instead, the exponent
77 is now expressed as the domain of the resulting relation.
78
79 =back
80
81 =head3 Changes since isl-0.06
82
83 =over
84
85 =item * The format of C<isl_printer_print_qpolynomial>'s
86 C<ISL_FORMAT_ISL> output has changed.
87 Use C<ISL_FORMAT_C> to obtain the old output.
88
89 =item * The C<*_fast_*> functions have been renamed to C<*_plain_*>.
90 Some of the old names have been kept for backward compatibility,
91 but they will be removed in the future.
92
93 =back
94
95 =head3 Changes since isl-0.07
96
97 =over
98
99 =item * The function C<isl_pw_aff_max> has been renamed to
100 C<isl_pw_aff_union_max>.
101 Similarly, the function C<isl_pw_aff_add> has been renamed to
102 C<isl_pw_aff_union_add>.
103
104 =item * The C<isl_dim> type has been renamed to C<isl_space>
105 along with the associated functions.
106 Some of the old names have been kept for backward compatibility,
107 but they will be removed in the future.
108
109 =item * Spaces of maps, sets and parameter domains are now
110 treated differently.  The distinction between map spaces and set spaces
111 has always been made on a conceptual level, but proper use of such spaces
112 was never checked.  Furthermore, up until isl-0.07 there was no way
113 of explicitly creating a parameter space.  These can now be created
114 directly using C<isl_space_params_alloc> or from other spaces using
115 C<isl_space_params>.
116
117 =item * The space in which C<isl_aff>, C<isl_pw_aff>, C<isl_qpolynomial>,
118 C<isl_pw_qpolynomial>, C<isl_qpolynomial_fold> and C<isl_pw_qpolynomial_fold>
119 objects live is now a map space
120 instead of a set space.  This means, for example, that the dimensions
121 of the domain of an C<isl_aff> are now considered to be of type
122 C<isl_dim_in> instead of C<isl_dim_set>.  Extra functions have been
123 added to obtain the domain space.  Some of the constructors still
124 take a domain space and have therefore been renamed.
125
126 =item * The functions C<isl_equality_alloc> and C<isl_inequality_alloc>
127 now take an C<isl_local_space> instead of an C<isl_space>.
128 An C<isl_local_space> can be created from an C<isl_space>
129 using C<isl_local_space_from_space>.
130
131 =item * The C<isl_div> type has been removed.  Functions that used
132 to return an C<isl_div> now return an C<isl_aff>.
133 Note that the space of an C<isl_aff> is that of relation.
134 When replacing a call to C<isl_div_get_coefficient> by a call to
135 C<isl_aff_get_coefficient> any C<isl_dim_set> argument needs
136 to be replaced by C<isl_dim_in>.
137 A call to C<isl_aff_from_div> can be replaced by a call
138 to C<isl_aff_floor>.
139 A call to C<isl_qpolynomial_div(div)> call be replaced by
140 the nested call
141
142         isl_qpolynomial_from_aff(isl_aff_floor(div))
143
144 The function C<isl_constraint_div> has also been renamed
145 to C<isl_constraint_get_div>.
146
147 =item * The C<nparam> argument has been removed from
148 C<isl_map_read_from_str> and similar functions.
149 When reading input in the original PolyLib format,
150 the result will have no parameters.
151 If parameters are expected, the caller may want to perform
152 dimension manipulation on the result.
153
154 =back
155
156 =head1 Installation
157
158 The source of C<isl> can be obtained either as a tarball
159 or from the git repository.  Both are available from
160 L<http://freshmeat.net/projects/isl/>.
161 The installation process depends on how you obtained
162 the source.
163
164 =head2 Installation from the git repository
165
166 =over
167
168 =item 1 Clone or update the repository
169
170 The first time the source is obtained, you need to clone
171 the repository.
172
173         git clone git://repo.or.cz/isl.git
174
175 To obtain updates, you need to pull in the latest changes
176
177         git pull
178
179 =item 2 Generate C<configure>
180
181         ./autogen.sh
182
183 =back
184
185 After performing the above steps, continue
186 with the L<Common installation instructions>.
187
188 =head2 Common installation instructions
189
190 =over
191
192 =item 1 Obtain C<GMP>
193
194 Building C<isl> requires C<GMP>, including its headers files.
195 Your distribution may not provide these header files by default
196 and you may need to install a package called C<gmp-devel> or something
197 similar.  Alternatively, C<GMP> can be built from
198 source, available from L<http://gmplib.org/>.
199
200 =item 2 Configure
201
202 C<isl> uses the standard C<autoconf> C<configure> script.
203 To run it, just type
204
205         ./configure
206
207 optionally followed by some configure options.
208 A complete list of options can be obtained by running
209
210         ./configure --help
211
212 Below we discuss some of the more common options.
213
214 C<isl> can optionally use C<piplib>, but no
215 C<piplib> functionality is currently used by default.
216 The C<--with-piplib> option can
217 be used to specify which C<piplib>
218 library to use, either an installed version (C<system>),
219 an externally built version (C<build>)
220 or no version (C<no>).  The option C<build> is mostly useful
221 in C<configure> scripts of larger projects that bundle both C<isl>
222 and C<piplib>.
223
224 =over
225
226 =item C<--prefix>
227
228 Installation prefix for C<isl>
229
230 =item C<--with-gmp-prefix>
231
232 Installation prefix for C<GMP> (architecture-independent files).
233
234 =item C<--with-gmp-exec-prefix>
235
236 Installation prefix for C<GMP> (architecture-dependent files).
237
238 =item C<--with-piplib>
239
240 Which copy of C<piplib> to use, either C<no> (default), C<system> or C<build>.
241
242 =item C<--with-piplib-prefix>
243
244 Installation prefix for C<system> C<piplib> (architecture-independent files).
245
246 =item C<--with-piplib-exec-prefix>
247
248 Installation prefix for C<system> C<piplib> (architecture-dependent files).
249
250 =item C<--with-piplib-builddir>
251
252 Location where C<build> C<piplib> was built.
253
254 =back
255
256 =item 3 Compile
257
258         make
259
260 =item 4 Install (optional)
261
262         make install
263
264 =back
265
266 =head1 Library
267
268 =head2 Initialization
269
270 All manipulations of integer sets and relations occur within
271 the context of an C<isl_ctx>.
272 A given C<isl_ctx> can only be used within a single thread.
273 All arguments of a function are required to have been allocated
274 within the same context.
275 There are currently no functions available for moving an object
276 from one C<isl_ctx> to another C<isl_ctx>.  This means that
277 there is currently no way of safely moving an object from one
278 thread to another, unless the whole C<isl_ctx> is moved.
279
280 An C<isl_ctx> can be allocated using C<isl_ctx_alloc> and
281 freed using C<isl_ctx_free>.
282 All objects allocated within an C<isl_ctx> should be freed
283 before the C<isl_ctx> itself is freed.
284
285         isl_ctx *isl_ctx_alloc();
286         void isl_ctx_free(isl_ctx *ctx);
287
288 =head2 Integers
289
290 All operations on integers, mainly the coefficients
291 of the constraints describing the sets and relations,
292 are performed in exact integer arithmetic using C<GMP>.
293 However, to allow future versions of C<isl> to optionally
294 support fixed integer arithmetic, all calls to C<GMP>
295 are wrapped inside C<isl> specific macros.
296 The basic type is C<isl_int> and the operations below
297 are available on this type.
298 The meanings of these operations are essentially the same
299 as their C<GMP> C<mpz_> counterparts.
300 As always with C<GMP> types, C<isl_int>s need to be
301 initialized with C<isl_int_init> before they can be used
302 and they need to be released with C<isl_int_clear>
303 after the last use.
304 The user should not assume that an C<isl_int> is represented
305 as a C<mpz_t>, but should instead explicitly convert between
306 C<mpz_t>s and C<isl_int>s using C<isl_int_set_gmp> and
307 C<isl_int_get_gmp> whenever a C<mpz_t> is required.
308
309 =over
310
311 =item isl_int_init(i)
312
313 =item isl_int_clear(i)
314
315 =item isl_int_set(r,i)
316
317 =item isl_int_set_si(r,i)
318
319 =item isl_int_set_gmp(r,g)
320
321 =item isl_int_get_gmp(i,g)
322
323 =item isl_int_abs(r,i)
324
325 =item isl_int_neg(r,i)
326
327 =item isl_int_swap(i,j)
328
329 =item isl_int_swap_or_set(i,j)
330
331 =item isl_int_add_ui(r,i,j)
332
333 =item isl_int_sub_ui(r,i,j)
334
335 =item isl_int_add(r,i,j)
336
337 =item isl_int_sub(r,i,j)
338
339 =item isl_int_mul(r,i,j)
340
341 =item isl_int_mul_ui(r,i,j)
342
343 =item isl_int_addmul(r,i,j)
344
345 =item isl_int_submul(r,i,j)
346
347 =item isl_int_gcd(r,i,j)
348
349 =item isl_int_lcm(r,i,j)
350
351 =item isl_int_divexact(r,i,j)
352
353 =item isl_int_cdiv_q(r,i,j)
354
355 =item isl_int_fdiv_q(r,i,j)
356
357 =item isl_int_fdiv_r(r,i,j)
358
359 =item isl_int_fdiv_q_ui(r,i,j)
360
361 =item isl_int_read(r,s)
362
363 =item isl_int_print(out,i,width)
364
365 =item isl_int_sgn(i)
366
367 =item isl_int_cmp(i,j)
368
369 =item isl_int_cmp_si(i,si)
370
371 =item isl_int_eq(i,j)
372
373 =item isl_int_ne(i,j)
374
375 =item isl_int_lt(i,j)
376
377 =item isl_int_le(i,j)
378
379 =item isl_int_gt(i,j)
380
381 =item isl_int_ge(i,j)
382
383 =item isl_int_abs_eq(i,j)
384
385 =item isl_int_abs_ne(i,j)
386
387 =item isl_int_abs_lt(i,j)
388
389 =item isl_int_abs_gt(i,j)
390
391 =item isl_int_abs_ge(i,j)
392
393 =item isl_int_is_zero(i)
394
395 =item isl_int_is_one(i)
396
397 =item isl_int_is_negone(i)
398
399 =item isl_int_is_pos(i)
400
401 =item isl_int_is_neg(i)
402
403 =item isl_int_is_nonpos(i)
404
405 =item isl_int_is_nonneg(i)
406
407 =item isl_int_is_divisible_by(i,j)
408
409 =back
410
411 =head2 Sets and Relations
412
413 C<isl> uses six types of objects for representing sets and relations,
414 C<isl_basic_set>, C<isl_basic_map>, C<isl_set>, C<isl_map>,
415 C<isl_union_set> and C<isl_union_map>.
416 C<isl_basic_set> and C<isl_basic_map> represent sets and relations that
417 can be described as a conjunction of affine constraints, while
418 C<isl_set> and C<isl_map> represent unions of
419 C<isl_basic_set>s and C<isl_basic_map>s, respectively.
420 However, all C<isl_basic_set>s or C<isl_basic_map>s in the union need
421 to live in the same space.  C<isl_union_set>s and C<isl_union_map>s
422 represent unions of C<isl_set>s or C<isl_map>s in I<different> spaces,
423 where spaces are considered different if they have a different number
424 of dimensions and/or different names (see L<"Spaces">).
425 The difference between sets and relations (maps) is that sets have
426 one set of variables, while relations have two sets of variables,
427 input variables and output variables.
428
429 =head2 Memory Management
430
431 Since a high-level operation on sets and/or relations usually involves
432 several substeps and since the user is usually not interested in
433 the intermediate results, most functions that return a new object
434 will also release all the objects passed as arguments.
435 If the user still wants to use one or more of these arguments
436 after the function call, she should pass along a copy of the
437 object rather than the object itself.
438 The user is then responsible for making sure that the original
439 object gets used somewhere else or is explicitly freed.
440
441 The arguments and return values of all documented functions are
442 annotated to make clear which arguments are released and which
443 arguments are preserved.  In particular, the following annotations
444 are used
445
446 =over
447
448 =item C<__isl_give>
449
450 C<__isl_give> means that a new object is returned.
451 The user should make sure that the returned pointer is
452 used exactly once as a value for an C<__isl_take> argument.
453 In between, it can be used as a value for as many
454 C<__isl_keep> arguments as the user likes.
455 There is one exception, and that is the case where the
456 pointer returned is C<NULL>.  Is this case, the user
457 is free to use it as an C<__isl_take> argument or not.
458
459 =item C<__isl_take>
460
461 C<__isl_take> means that the object the argument points to
462 is taken over by the function and may no longer be used
463 by the user as an argument to any other function.
464 The pointer value must be one returned by a function
465 returning an C<__isl_give> pointer.
466 If the user passes in a C<NULL> value, then this will
467 be treated as an error in the sense that the function will
468 not perform its usual operation.  However, it will still
469 make sure that all the other C<__isl_take> arguments
470 are released.
471
472 =item C<__isl_keep>
473
474 C<__isl_keep> means that the function will only use the object
475 temporarily.  After the function has finished, the user
476 can still use it as an argument to other functions.
477 A C<NULL> value will be treated in the same way as
478 a C<NULL> value for an C<__isl_take> argument.
479
480 =back
481
482 =head2 Identifiers
483
484 Identifiers are used to identify both individual dimensions
485 and tuples of dimensions.  They consist of a name and an optional
486 pointer.  Identifiers with the same name but different pointer values
487 are considered to be distinct.
488 Identifiers can be constructed, copied, freed, inspected and printed
489 using the following functions.
490
491         #include <isl/id.h>
492         __isl_give isl_id *isl_id_alloc(isl_ctx *ctx,
493                 __isl_keep const char *name, void *user);
494         __isl_give isl_id *isl_id_copy(isl_id *id);
495         void *isl_id_free(__isl_take isl_id *id);
496
497         isl_ctx *isl_id_get_ctx(__isl_keep isl_id *id);
498         void *isl_id_get_user(__isl_keep isl_id *id);
499         __isl_keep const char *isl_id_get_name(__isl_keep isl_id *id);
500
501         __isl_give isl_printer *isl_printer_print_id(
502                 __isl_take isl_printer *p, __isl_keep isl_id *id);
503
504 Note that C<isl_id_get_name> returns a pointer to some internal
505 data structure, so the result can only be used while the
506 corresponding C<isl_id> is alive.
507
508 =head2 Spaces
509
510 Whenever a new set or relation is created from scratch,
511 the space in which it lives needs to be specified using an C<isl_space>.
512
513         #include <isl/space.h>
514         __isl_give isl_space *isl_space_alloc(isl_ctx *ctx,
515                 unsigned nparam, unsigned n_in, unsigned n_out);
516         __isl_give isl_space *isl_space_params_alloc(isl_ctx *ctx,
517                 unsigned nparam);
518         __isl_give isl_space *isl_space_set_alloc(isl_ctx *ctx,
519                 unsigned nparam, unsigned dim);
520         __isl_give isl_space *isl_space_copy(__isl_keep isl_space *space);
521         void isl_space_free(__isl_take isl_space *space);
522         unsigned isl_space_dim(__isl_keep isl_space *space,
523                 enum isl_dim_type type);
524
525 The space used for creating a parameter domain
526 needs to be created using C<isl_space_params_alloc>.
527 For other sets, the space
528 needs to be created using C<isl_space_set_alloc>, while
529 for a relation, the space
530 needs to be created using C<isl_space_alloc>.
531 C<isl_space_dim> can be used
532 to find out the number of dimensions of each type in
533 a space, where type may be
534 C<isl_dim_param>, C<isl_dim_in> (only for relations),
535 C<isl_dim_out> (only for relations), C<isl_dim_set>
536 (only for sets) or C<isl_dim_all>.
537
538 To check whether a given space is that of a set or a map
539 or whether it is a parameter space, use these functions:
540
541         #include <isl/space.h>
542         int isl_space_is_params(__isl_keep isl_space *space);
543         int isl_space_is_set(__isl_keep isl_space *space);
544
545 It is often useful to create objects that live in the
546 same space as some other object.  This can be accomplished
547 by creating the new objects
548 (see L<Creating New Sets and Relations> or
549 L<Creating New (Piecewise) Quasipolynomials>) based on the space
550 of the original object.
551
552         #include <isl/set.h>
553         __isl_give isl_space *isl_basic_set_get_space(
554                 __isl_keep isl_basic_set *bset);
555         __isl_give isl_space *isl_set_get_space(__isl_keep isl_set *set);
556
557         #include <isl/union_set.h>
558         __isl_give isl_space *isl_union_set_get_space(
559                 __isl_keep isl_union_set *uset);
560
561         #include <isl/map.h>
562         __isl_give isl_space *isl_basic_map_get_space(
563                 __isl_keep isl_basic_map *bmap);
564         __isl_give isl_space *isl_map_get_space(__isl_keep isl_map *map);
565
566         #include <isl/union_map.h>
567         __isl_give isl_space *isl_union_map_get_space(
568                 __isl_keep isl_union_map *umap);
569
570         #include <isl/constraint.h>
571         __isl_give isl_space *isl_constraint_get_space(
572                 __isl_keep isl_constraint *constraint);
573
574         #include <isl/polynomial.h>
575         __isl_give isl_space *isl_qpolynomial_get_domain_space(
576                 __isl_keep isl_qpolynomial *qp);
577         __isl_give isl_space *isl_qpolynomial_get_space(
578                 __isl_keep isl_qpolynomial *qp);
579         __isl_give isl_space *isl_qpolynomial_fold_get_space(
580                 __isl_keep isl_qpolynomial_fold *fold);
581         __isl_give isl_space *isl_pw_qpolynomial_get_domain_space(
582                 __isl_keep isl_pw_qpolynomial *pwqp);
583         __isl_give isl_space *isl_pw_qpolynomial_get_space(
584                 __isl_keep isl_pw_qpolynomial *pwqp);
585         __isl_give isl_space *isl_pw_qpolynomial_fold_get_domain_space(
586                 __isl_keep isl_pw_qpolynomial_fold *pwf);
587         __isl_give isl_space *isl_pw_qpolynomial_fold_get_space(
588                 __isl_keep isl_pw_qpolynomial_fold *pwf);
589         __isl_give isl_space *isl_union_pw_qpolynomial_get_space(
590                 __isl_keep isl_union_pw_qpolynomial *upwqp);
591         __isl_give isl_space *isl_union_pw_qpolynomial_fold_get_space(
592                 __isl_keep isl_union_pw_qpolynomial_fold *upwf);
593
594         #include <isl/aff.h>
595         __isl_give isl_space *isl_aff_get_domain_space(
596                 __isl_keep isl_aff *aff);
597         __isl_give isl_space *isl_aff_get_space(
598                 __isl_keep isl_aff *aff);
599         __isl_give isl_space *isl_pw_aff_get_domain_space(
600                 __isl_keep isl_pw_aff *pwaff);
601         __isl_give isl_space *isl_pw_aff_get_space(
602                 __isl_keep isl_pw_aff *pwaff);
603         __isl_give isl_space *isl_multi_aff_get_space(
604                 __isl_keep isl_multi_aff *maff);
605         __isl_give isl_space *isl_pw_multi_aff_get_domain_space(
606                 __isl_keep isl_pw_multi_aff *pma);
607         __isl_give isl_space *isl_pw_multi_aff_get_space(
608                 __isl_keep isl_pw_multi_aff *pma);
609
610         #include <isl/point.h>
611         __isl_give isl_space *isl_point_get_space(
612                 __isl_keep isl_point *pnt);
613
614 The identifiers or names of the individual dimensions may be set or read off
615 using the following functions.
616
617         #include <isl/space.h>
618         __isl_give isl_space *isl_space_set_dim_id(
619                 __isl_take isl_space *space,
620                 enum isl_dim_type type, unsigned pos,
621                 __isl_take isl_id *id);
622         int isl_space_has_dim_id(__isl_keep isl_space *space,
623                 enum isl_dim_type type, unsigned pos);
624         __isl_give isl_id *isl_space_get_dim_id(
625                 __isl_keep isl_space *space,
626                 enum isl_dim_type type, unsigned pos);
627         __isl_give isl_space *isl_space_set_dim_name(__isl_take isl_space *space,
628                                  enum isl_dim_type type, unsigned pos,
629                                  __isl_keep const char *name);
630         __isl_keep const char *isl_space_get_dim_name(__isl_keep isl_space *space,
631                                  enum isl_dim_type type, unsigned pos);
632
633 Note that C<isl_space_get_name> returns a pointer to some internal
634 data structure, so the result can only be used while the
635 corresponding C<isl_space> is alive.
636 Also note that every function that operates on two sets or relations
637 requires that both arguments have the same parameters.  This also
638 means that if one of the arguments has named parameters, then the
639 other needs to have named parameters too and the names need to match.
640 Pairs of C<isl_set>, C<isl_map>, C<isl_union_set> and/or C<isl_union_map>
641 arguments may have different parameters (as long as they are named),
642 in which case the result will have as parameters the union of the parameters of
643 the arguments.
644
645 Given the identifier or name of a dimension (typically a parameter),
646 its position can be obtained from the following function.
647
648         #include <isl/space.h>
649         int isl_space_find_dim_by_id(__isl_keep isl_space *space,
650                 enum isl_dim_type type, __isl_keep isl_id *id);
651         int isl_space_find_dim_by_name(__isl_keep isl_space *space,
652                 enum isl_dim_type type, const char *name);
653
654 The identifiers or names of entire spaces may be set or read off
655 using the following functions.
656
657         #include <isl/space.h>
658         __isl_give isl_space *isl_space_set_tuple_id(
659                 __isl_take isl_space *space,
660                 enum isl_dim_type type, __isl_take isl_id *id);
661         __isl_give isl_space *isl_space_reset_tuple_id(
662                 __isl_take isl_space *space, enum isl_dim_type type);
663         int isl_space_has_tuple_id(__isl_keep isl_space *space,
664                 enum isl_dim_type type);
665         __isl_give isl_id *isl_space_get_tuple_id(
666                 __isl_keep isl_space *space, enum isl_dim_type type);
667         __isl_give isl_space *isl_space_set_tuple_name(
668                 __isl_take isl_space *space,
669                 enum isl_dim_type type, const char *s);
670         const char *isl_space_get_tuple_name(__isl_keep isl_space *space,
671                 enum isl_dim_type type);
672
673 The C<type> argument needs to be one of C<isl_dim_in>, C<isl_dim_out>
674 or C<isl_dim_set>.  As with C<isl_space_get_name>,
675 the C<isl_space_get_tuple_name> function returns a pointer to some internal
676 data structure.
677 Binary operations require the corresponding spaces of their arguments
678 to have the same name.
679
680 Spaces can be nested.  In particular, the domain of a set or
681 the domain or range of a relation can be a nested relation.
682 The following functions can be used to construct and deconstruct
683 such nested spaces.
684
685         #include <isl/space.h>
686         int isl_space_is_wrapping(__isl_keep isl_space *space);
687         __isl_give isl_space *isl_space_wrap(__isl_take isl_space *space);
688         __isl_give isl_space *isl_space_unwrap(__isl_take isl_space *space);
689
690 The input to C<isl_space_is_wrapping> and C<isl_space_unwrap> should
691 be the space of a set, while that of
692 C<isl_space_wrap> should be the space of a relation.
693 Conversely, the output of C<isl_space_unwrap> is the space
694 of a relation, while that of C<isl_space_wrap> is the space of a set.
695
696 Spaces can be created from other spaces
697 using the following functions.
698
699         __isl_give isl_space *isl_space_domain(__isl_take isl_space *space);
700         __isl_give isl_space *isl_space_from_domain(__isl_take isl_space *space);
701         __isl_give isl_space *isl_space_range(__isl_take isl_space *space);
702         __isl_give isl_space *isl_space_from_range(__isl_take isl_space *space);
703         __isl_give isl_space *isl_space_params(
704                 __isl_take isl_space *space);
705         __isl_give isl_space *isl_space_set_from_params(
706                 __isl_take isl_space *space);
707         __isl_give isl_space *isl_space_reverse(__isl_take isl_space *space);
708         __isl_give isl_space *isl_space_join(__isl_take isl_space *left,
709                 __isl_take isl_space *right);
710         __isl_give isl_space *isl_space_align_params(
711                 __isl_take isl_space *space1, __isl_take isl_space *space2)
712         __isl_give isl_space *isl_space_insert_dims(__isl_take isl_space *space,
713                 enum isl_dim_type type, unsigned pos, unsigned n);
714         __isl_give isl_space *isl_space_add_dims(__isl_take isl_space *space,
715                 enum isl_dim_type type, unsigned n);
716         __isl_give isl_space *isl_space_drop_dims(__isl_take isl_space *space,
717                 enum isl_dim_type type, unsigned first, unsigned n);
718         __isl_give isl_space *isl_space_move_dims(__isl_take isl_space *space,
719                 enum isl_dim_type dst_type, unsigned dst_pos,
720                 enum isl_dim_type src_type, unsigned src_pos,
721                 unsigned n);
722         __isl_give isl_space *isl_space_map_from_set(
723                 __isl_take isl_space *space);
724         __isl_give isl_space *isl_space_zip(__isl_take isl_space *space);
725
726 Note that if dimensions are added or removed from a space, then
727 the name and the internal structure are lost.
728
729 =head2 Local Spaces
730
731 A local space is essentially a space with
732 zero or more existentially quantified variables.
733 The local space of a basic set or relation can be obtained
734 using the following functions.
735
736         #include <isl/set.h>
737         __isl_give isl_local_space *isl_basic_set_get_local_space(
738                 __isl_keep isl_basic_set *bset);
739
740         #include <isl/map.h>
741         __isl_give isl_local_space *isl_basic_map_get_local_space(
742                 __isl_keep isl_basic_map *bmap);
743
744 A new local space can be created from a space using
745
746         #include <isl/local_space.h>
747         __isl_give isl_local_space *isl_local_space_from_space(
748                 __isl_take isl_space *space);
749
750 They can be inspected, modified, copied and freed using the following functions.
751
752         #include <isl/local_space.h>
753         isl_ctx *isl_local_space_get_ctx(
754                 __isl_keep isl_local_space *ls);
755         int isl_local_space_is_set(__isl_keep isl_local_space *ls);
756         int isl_local_space_dim(__isl_keep isl_local_space *ls,
757                 enum isl_dim_type type);
758         const char *isl_local_space_get_dim_name(
759                 __isl_keep isl_local_space *ls,
760                 enum isl_dim_type type, unsigned pos);
761         __isl_give isl_local_space *isl_local_space_set_dim_name(
762                 __isl_take isl_local_space *ls,
763                 enum isl_dim_type type, unsigned pos, const char *s);
764         __isl_give isl_local_space *isl_local_space_set_dim_id(
765                 __isl_take isl_local_space *ls,
766                 enum isl_dim_type type, unsigned pos,
767                 __isl_take isl_id *id);
768         __isl_give isl_space *isl_local_space_get_space(
769                 __isl_keep isl_local_space *ls);
770         __isl_give isl_aff *isl_local_space_get_div(
771                 __isl_keep isl_local_space *ls, int pos);
772         __isl_give isl_local_space *isl_local_space_copy(
773                 __isl_keep isl_local_space *ls);
774         void *isl_local_space_free(__isl_take isl_local_space *ls);
775
776 Two local spaces can be compared using
777
778         int isl_local_space_is_equal(__isl_keep isl_local_space *ls1,
779                 __isl_keep isl_local_space *ls2);
780
781 Local spaces can be created from other local spaces
782 using the following functions.
783
784         __isl_give isl_local_space *isl_local_space_domain(
785                 __isl_take isl_local_space *ls);
786         __isl_give isl_local_space *isl_local_space_range(
787                 __isl_take isl_local_space *ls);
788         __isl_give isl_local_space *isl_local_space_from_domain(
789                 __isl_take isl_local_space *ls);
790         __isl_give isl_local_space *isl_local_space_intersect(
791                 __isl_take isl_local_space *ls1,
792                 __isl_take isl_local_space *ls2);
793         __isl_give isl_local_space *isl_local_space_add_dims(
794                 __isl_take isl_local_space *ls,
795                 enum isl_dim_type type, unsigned n);
796         __isl_give isl_local_space *isl_local_space_insert_dims(
797                 __isl_take isl_local_space *ls,
798                 enum isl_dim_type type, unsigned first, unsigned n);
799         __isl_give isl_local_space *isl_local_space_drop_dims(
800                 __isl_take isl_local_space *ls,
801                 enum isl_dim_type type, unsigned first, unsigned n);
802
803 =head2 Input and Output
804
805 C<isl> supports its own input/output format, which is similar
806 to the C<Omega> format, but also supports the C<PolyLib> format
807 in some cases.
808
809 =head3 C<isl> format
810
811 The C<isl> format is similar to that of C<Omega>, but has a different
812 syntax for describing the parameters and allows for the definition
813 of an existentially quantified variable as the integer division
814 of an affine expression.
815 For example, the set of integers C<i> between C<0> and C<n>
816 such that C<i % 10 <= 6> can be described as
817
818         [n] -> { [i] : exists (a = [i/10] : 0 <= i and i <= n and
819                                 i - 10 a <= 6) }
820
821 A set or relation can have several disjuncts, separated
822 by the keyword C<or>.  Each disjunct is either a conjunction
823 of constraints or a projection (C<exists>) of a conjunction
824 of constraints.  The constraints are separated by the keyword
825 C<and>.
826
827 =head3 C<PolyLib> format
828
829 If the represented set is a union, then the first line
830 contains a single number representing the number of disjuncts.
831 Otherwise, a line containing the number C<1> is optional.
832
833 Each disjunct is represented by a matrix of constraints.
834 The first line contains two numbers representing
835 the number of rows and columns,
836 where the number of rows is equal to the number of constraints
837 and the number of columns is equal to two plus the number of variables.
838 The following lines contain the actual rows of the constraint matrix.
839 In each row, the first column indicates whether the constraint
840 is an equality (C<0>) or inequality (C<1>).  The final column
841 corresponds to the constant term.
842
843 If the set is parametric, then the coefficients of the parameters
844 appear in the last columns before the constant column.
845 The coefficients of any existentially quantified variables appear
846 between those of the set variables and those of the parameters.
847
848 =head3 Extended C<PolyLib> format
849
850 The extended C<PolyLib> format is nearly identical to the
851 C<PolyLib> format.  The only difference is that the line
852 containing the number of rows and columns of a constraint matrix
853 also contains four additional numbers:
854 the number of output dimensions, the number of input dimensions,
855 the number of local dimensions (i.e., the number of existentially
856 quantified variables) and the number of parameters.
857 For sets, the number of ``output'' dimensions is equal
858 to the number of set dimensions, while the number of ``input''
859 dimensions is zero.
860
861 =head3 Input
862
863         #include <isl/set.h>
864         __isl_give isl_basic_set *isl_basic_set_read_from_file(
865                 isl_ctx *ctx, FILE *input);
866         __isl_give isl_basic_set *isl_basic_set_read_from_str(
867                 isl_ctx *ctx, const char *str);
868         __isl_give isl_set *isl_set_read_from_file(isl_ctx *ctx,
869                 FILE *input);
870         __isl_give isl_set *isl_set_read_from_str(isl_ctx *ctx,
871                 const char *str);
872
873         #include <isl/map.h>
874         __isl_give isl_basic_map *isl_basic_map_read_from_file(
875                 isl_ctx *ctx, FILE *input);
876         __isl_give isl_basic_map *isl_basic_map_read_from_str(
877                 isl_ctx *ctx, const char *str);
878         __isl_give isl_map *isl_map_read_from_file(
879                 isl_ctx *ctx, FILE *input);
880         __isl_give isl_map *isl_map_read_from_str(isl_ctx *ctx,
881                 const char *str);
882
883         #include <isl/union_set.h>
884         __isl_give isl_union_set *isl_union_set_read_from_file(
885                 isl_ctx *ctx, FILE *input);
886         __isl_give isl_union_set *isl_union_set_read_from_str(
887                 isl_ctx *ctx, const char *str);
888
889         #include <isl/union_map.h>
890         __isl_give isl_union_map *isl_union_map_read_from_file(
891                 isl_ctx *ctx, FILE *input);
892         __isl_give isl_union_map *isl_union_map_read_from_str(
893                 isl_ctx *ctx, const char *str);
894
895 The input format is autodetected and may be either the C<PolyLib> format
896 or the C<isl> format.
897
898 =head3 Output
899
900 Before anything can be printed, an C<isl_printer> needs to
901 be created.
902
903         __isl_give isl_printer *isl_printer_to_file(isl_ctx *ctx,
904                 FILE *file);
905         __isl_give isl_printer *isl_printer_to_str(isl_ctx *ctx);
906         void isl_printer_free(__isl_take isl_printer *printer);
907         __isl_give char *isl_printer_get_str(
908                 __isl_keep isl_printer *printer);
909
910 The behavior of the printer can be modified in various ways
911
912         __isl_give isl_printer *isl_printer_set_output_format(
913                 __isl_take isl_printer *p, int output_format);
914         __isl_give isl_printer *isl_printer_set_indent(
915                 __isl_take isl_printer *p, int indent);
916         __isl_give isl_printer *isl_printer_indent(
917                 __isl_take isl_printer *p, int indent);
918         __isl_give isl_printer *isl_printer_set_prefix(
919                 __isl_take isl_printer *p, const char *prefix);
920         __isl_give isl_printer *isl_printer_set_suffix(
921                 __isl_take isl_printer *p, const char *suffix);
922
923 The C<output_format> may be either C<ISL_FORMAT_ISL>, C<ISL_FORMAT_OMEGA>,
924 C<ISL_FORMAT_POLYLIB>, C<ISL_FORMAT_EXT_POLYLIB> or C<ISL_FORMAT_LATEX>
925 and defaults to C<ISL_FORMAT_ISL>.
926 Each line in the output is indented by C<indent> (set by
927 C<isl_printer_set_indent>) spaces
928 (default: 0), prefixed by C<prefix> and suffixed by C<suffix>.
929 In the C<PolyLib> format output,
930 the coefficients of the existentially quantified variables
931 appear between those of the set variables and those
932 of the parameters.
933 The function C<isl_printer_indent> increases the indentation
934 by the specified amount (which may be negative).
935
936 To actually print something, use
937
938         #include <isl/set.h>
939         __isl_give isl_printer *isl_printer_print_basic_set(
940                 __isl_take isl_printer *printer,
941                 __isl_keep isl_basic_set *bset);
942         __isl_give isl_printer *isl_printer_print_set(
943                 __isl_take isl_printer *printer,
944                 __isl_keep isl_set *set);
945
946         #include <isl/map.h>
947         __isl_give isl_printer *isl_printer_print_basic_map(
948                 __isl_take isl_printer *printer,
949                 __isl_keep isl_basic_map *bmap);
950         __isl_give isl_printer *isl_printer_print_map(
951                 __isl_take isl_printer *printer,
952                 __isl_keep isl_map *map);
953
954         #include <isl/union_set.h>
955         __isl_give isl_printer *isl_printer_print_union_set(
956                 __isl_take isl_printer *p,
957                 __isl_keep isl_union_set *uset);
958
959         #include <isl/union_map.h>
960         __isl_give isl_printer *isl_printer_print_union_map(
961                 __isl_take isl_printer *p,
962                 __isl_keep isl_union_map *umap);
963
964 When called on a file printer, the following function flushes
965 the file.  When called on a string printer, the buffer is cleared.
966
967         __isl_give isl_printer *isl_printer_flush(
968                 __isl_take isl_printer *p);
969
970 =head2 Creating New Sets and Relations
971
972 C<isl> has functions for creating some standard sets and relations.
973
974 =over
975
976 =item * Empty sets and relations
977
978         __isl_give isl_basic_set *isl_basic_set_empty(
979                 __isl_take isl_space *space);
980         __isl_give isl_basic_map *isl_basic_map_empty(
981                 __isl_take isl_space *space);
982         __isl_give isl_set *isl_set_empty(
983                 __isl_take isl_space *space);
984         __isl_give isl_map *isl_map_empty(
985                 __isl_take isl_space *space);
986         __isl_give isl_union_set *isl_union_set_empty(
987                 __isl_take isl_space *space);
988         __isl_give isl_union_map *isl_union_map_empty(
989                 __isl_take isl_space *space);
990
991 For C<isl_union_set>s and C<isl_union_map>s, the space
992 is only used to specify the parameters.
993
994 =item * Universe sets and relations
995
996         __isl_give isl_basic_set *isl_basic_set_universe(
997                 __isl_take isl_space *space);
998         __isl_give isl_basic_map *isl_basic_map_universe(
999                 __isl_take isl_space *space);
1000         __isl_give isl_set *isl_set_universe(
1001                 __isl_take isl_space *space);
1002         __isl_give isl_map *isl_map_universe(
1003                 __isl_take isl_space *space);
1004         __isl_give isl_union_set *isl_union_set_universe(
1005                 __isl_take isl_union_set *uset);
1006         __isl_give isl_union_map *isl_union_map_universe(
1007                 __isl_take isl_union_map *umap);
1008
1009 The sets and relations constructed by the functions above
1010 contain all integer values, while those constructed by the
1011 functions below only contain non-negative values.
1012
1013         __isl_give isl_basic_set *isl_basic_set_nat_universe(
1014                 __isl_take isl_space *space);
1015         __isl_give isl_basic_map *isl_basic_map_nat_universe(
1016                 __isl_take isl_space *space);
1017         __isl_give isl_set *isl_set_nat_universe(
1018                 __isl_take isl_space *space);
1019         __isl_give isl_map *isl_map_nat_universe(
1020                 __isl_take isl_space *space);
1021
1022 =item * Identity relations
1023
1024         __isl_give isl_basic_map *isl_basic_map_identity(
1025                 __isl_take isl_space *space);
1026         __isl_give isl_map *isl_map_identity(
1027                 __isl_take isl_space *space);
1028
1029 The number of input and output dimensions in C<space> needs
1030 to be the same.
1031
1032 =item * Lexicographic order
1033
1034         __isl_give isl_map *isl_map_lex_lt(
1035                 __isl_take isl_space *set_space);
1036         __isl_give isl_map *isl_map_lex_le(
1037                 __isl_take isl_space *set_space);
1038         __isl_give isl_map *isl_map_lex_gt(
1039                 __isl_take isl_space *set_space);
1040         __isl_give isl_map *isl_map_lex_ge(
1041                 __isl_take isl_space *set_space);
1042         __isl_give isl_map *isl_map_lex_lt_first(
1043                 __isl_take isl_space *space, unsigned n);
1044         __isl_give isl_map *isl_map_lex_le_first(
1045                 __isl_take isl_space *space, unsigned n);
1046         __isl_give isl_map *isl_map_lex_gt_first(
1047                 __isl_take isl_space *space, unsigned n);
1048         __isl_give isl_map *isl_map_lex_ge_first(
1049                 __isl_take isl_space *space, unsigned n);
1050
1051 The first four functions take a space for a B<set>
1052 and return relations that express that the elements in the domain
1053 are lexicographically less
1054 (C<isl_map_lex_lt>), less or equal (C<isl_map_lex_le>),
1055 greater (C<isl_map_lex_gt>) or greater or equal (C<isl_map_lex_ge>)
1056 than the elements in the range.
1057 The last four functions take a space for a map
1058 and return relations that express that the first C<n> dimensions
1059 in the domain are lexicographically less
1060 (C<isl_map_lex_lt_first>), less or equal (C<isl_map_lex_le_first>),
1061 greater (C<isl_map_lex_gt_first>) or greater or equal (C<isl_map_lex_ge_first>)
1062 than the first C<n> dimensions in the range.
1063
1064 =back
1065
1066 A basic set or relation can be converted to a set or relation
1067 using the following functions.
1068
1069         __isl_give isl_set *isl_set_from_basic_set(
1070                 __isl_take isl_basic_set *bset);
1071         __isl_give isl_map *isl_map_from_basic_map(
1072                 __isl_take isl_basic_map *bmap);
1073
1074 Sets and relations can be converted to union sets and relations
1075 using the following functions.
1076
1077         __isl_give isl_union_map *isl_union_map_from_map(
1078                 __isl_take isl_map *map);
1079         __isl_give isl_union_set *isl_union_set_from_set(
1080                 __isl_take isl_set *set);
1081
1082 The inverse conversions below can only be used if the input
1083 union set or relation is known to contain elements in exactly one
1084 space.
1085
1086         __isl_give isl_set *isl_set_from_union_set(
1087                 __isl_take isl_union_set *uset);
1088         __isl_give isl_map *isl_map_from_union_map(
1089                 __isl_take isl_union_map *umap);
1090
1091 A zero-dimensional set can be constructed on a given parameter domain
1092 using the following function.
1093
1094         __isl_give isl_set *isl_set_from_params(
1095                 __isl_take isl_set *set);
1096
1097 Sets and relations can be copied and freed again using the following
1098 functions.
1099
1100         __isl_give isl_basic_set *isl_basic_set_copy(
1101                 __isl_keep isl_basic_set *bset);
1102         __isl_give isl_set *isl_set_copy(__isl_keep isl_set *set);
1103         __isl_give isl_union_set *isl_union_set_copy(
1104                 __isl_keep isl_union_set *uset);
1105         __isl_give isl_basic_map *isl_basic_map_copy(
1106                 __isl_keep isl_basic_map *bmap);
1107         __isl_give isl_map *isl_map_copy(__isl_keep isl_map *map);
1108         __isl_give isl_union_map *isl_union_map_copy(
1109                 __isl_keep isl_union_map *umap);
1110         void isl_basic_set_free(__isl_take isl_basic_set *bset);
1111         void isl_set_free(__isl_take isl_set *set);
1112         void *isl_union_set_free(__isl_take isl_union_set *uset);
1113         void isl_basic_map_free(__isl_take isl_basic_map *bmap);
1114         void isl_map_free(__isl_take isl_map *map);
1115         void *isl_union_map_free(__isl_take isl_union_map *umap);
1116
1117 Other sets and relations can be constructed by starting
1118 from a universe set or relation, adding equality and/or
1119 inequality constraints and then projecting out the
1120 existentially quantified variables, if any.
1121 Constraints can be constructed, manipulated and
1122 added to (or removed from) (basic) sets and relations
1123 using the following functions.
1124
1125         #include <isl/constraint.h>
1126         __isl_give isl_constraint *isl_equality_alloc(
1127                 __isl_take isl_local_space *ls);
1128         __isl_give isl_constraint *isl_inequality_alloc(
1129                 __isl_take isl_local_space *ls);
1130         __isl_give isl_constraint *isl_constraint_set_constant(
1131                 __isl_take isl_constraint *constraint, isl_int v);
1132         __isl_give isl_constraint *isl_constraint_set_constant_si(
1133                 __isl_take isl_constraint *constraint, int v);
1134         __isl_give isl_constraint *isl_constraint_set_coefficient(
1135                 __isl_take isl_constraint *constraint,
1136                 enum isl_dim_type type, int pos, isl_int v);
1137         __isl_give isl_constraint *isl_constraint_set_coefficient_si(
1138                 __isl_take isl_constraint *constraint,
1139                 enum isl_dim_type type, int pos, int v);
1140         __isl_give isl_basic_map *isl_basic_map_add_constraint(
1141                 __isl_take isl_basic_map *bmap,
1142                 __isl_take isl_constraint *constraint);
1143         __isl_give isl_basic_set *isl_basic_set_add_constraint(
1144                 __isl_take isl_basic_set *bset,
1145                 __isl_take isl_constraint *constraint);
1146         __isl_give isl_map *isl_map_add_constraint(
1147                 __isl_take isl_map *map,
1148                 __isl_take isl_constraint *constraint);
1149         __isl_give isl_set *isl_set_add_constraint(
1150                 __isl_take isl_set *set,
1151                 __isl_take isl_constraint *constraint);
1152         __isl_give isl_basic_set *isl_basic_set_drop_constraint(
1153                 __isl_take isl_basic_set *bset,
1154                 __isl_take isl_constraint *constraint);
1155
1156 For example, to create a set containing the even integers
1157 between 10 and 42, you would use the following code.
1158
1159         isl_space *space;
1160         isl_local_space *ls;
1161         isl_constraint *c;
1162         isl_basic_set *bset;
1163
1164         space = isl_space_set_alloc(ctx, 0, 2);
1165         bset = isl_basic_set_universe(isl_space_copy(space));
1166         ls = isl_local_space_from_space(space);
1167
1168         c = isl_equality_alloc(isl_local_space_copy(ls));
1169         c = isl_constraint_set_coefficient_si(c, isl_dim_set, 0, -1);
1170         c = isl_constraint_set_coefficient_si(c, isl_dim_set, 1, 2);
1171         bset = isl_basic_set_add_constraint(bset, c);
1172
1173         c = isl_inequality_alloc(isl_local_space_copy(ls));
1174         c = isl_constraint_set_constant_si(c, -10);
1175         c = isl_constraint_set_coefficient_si(c, isl_dim_set, 0, 1);
1176         bset = isl_basic_set_add_constraint(bset, c);
1177
1178         c = isl_inequality_alloc(ls);
1179         c = isl_constraint_set_constant_si(c, 42);
1180         c = isl_constraint_set_coefficient_si(c, isl_dim_set, 0, -1);
1181         bset = isl_basic_set_add_constraint(bset, c);
1182
1183         bset = isl_basic_set_project_out(bset, isl_dim_set, 1, 1);
1184
1185 Or, alternatively,
1186
1187         isl_basic_set *bset;
1188         bset = isl_basic_set_read_from_str(ctx,
1189                 "{[i] : exists (a : i = 2a and i >= 10 and i <= 42)}");
1190
1191 A basic set or relation can also be constructed from two matrices
1192 describing the equalities and the inequalities.
1193
1194         __isl_give isl_basic_set *isl_basic_set_from_constraint_matrices(
1195                 __isl_take isl_space *space,
1196                 __isl_take isl_mat *eq, __isl_take isl_mat *ineq,
1197                 enum isl_dim_type c1,
1198                 enum isl_dim_type c2, enum isl_dim_type c3,
1199                 enum isl_dim_type c4);
1200         __isl_give isl_basic_map *isl_basic_map_from_constraint_matrices(
1201                 __isl_take isl_space *space,
1202                 __isl_take isl_mat *eq, __isl_take isl_mat *ineq,
1203                 enum isl_dim_type c1,
1204                 enum isl_dim_type c2, enum isl_dim_type c3,
1205                 enum isl_dim_type c4, enum isl_dim_type c5);
1206
1207 The C<isl_dim_type> arguments indicate the order in which
1208 different kinds of variables appear in the input matrices
1209 and should be a permutation of C<isl_dim_cst>, C<isl_dim_param>,
1210 C<isl_dim_set> and C<isl_dim_div> for sets and
1211 of C<isl_dim_cst>, C<isl_dim_param>,
1212 C<isl_dim_in>, C<isl_dim_out> and C<isl_dim_div> for relations.
1213
1214 A (basic) set or relation can also be constructed from a (piecewise)
1215 (multiple) affine expression
1216 or a list of affine expressions
1217 (See L<"Piecewise Quasi Affine Expressions"> and
1218 L<"Piecewise Multiple Quasi Affine Expressions">).
1219
1220         __isl_give isl_basic_map *isl_basic_map_from_aff(
1221                 __isl_take isl_aff *aff);
1222         __isl_give isl_set *isl_set_from_pw_aff(
1223                 __isl_take isl_pw_aff *pwaff);
1224         __isl_give isl_map *isl_map_from_pw_aff(
1225                 __isl_take isl_pw_aff *pwaff);
1226         __isl_give isl_basic_map *isl_basic_map_from_aff_list(
1227                 __isl_take isl_space *domain_space,
1228                 __isl_take isl_aff_list *list);
1229         __isl_give isl_basic_map *isl_basic_map_from_multi_aff(
1230                 __isl_take isl_multi_aff *maff)
1231         __isl_give isl_set *isl_set_from_pw_multi_aff(
1232                 __isl_take isl_pw_multi_aff *pma);
1233         __isl_give isl_map *isl_map_from_pw_multi_aff(
1234                 __isl_take isl_pw_multi_aff *pma);
1235
1236 The C<domain_dim> argument describes the domain of the resulting
1237 basic relation.  It is required because the C<list> may consist
1238 of zero affine expressions.
1239
1240 =head2 Inspecting Sets and Relations
1241
1242 Usually, the user should not have to care about the actual constraints
1243 of the sets and maps, but should instead apply the abstract operations
1244 explained in the following sections.
1245 Occasionally, however, it may be required to inspect the individual
1246 coefficients of the constraints.  This section explains how to do so.
1247 In these cases, it may also be useful to have C<isl> compute
1248 an explicit representation of the existentially quantified variables.
1249
1250         __isl_give isl_set *isl_set_compute_divs(
1251                 __isl_take isl_set *set);
1252         __isl_give isl_map *isl_map_compute_divs(
1253                 __isl_take isl_map *map);
1254         __isl_give isl_union_set *isl_union_set_compute_divs(
1255                 __isl_take isl_union_set *uset);
1256         __isl_give isl_union_map *isl_union_map_compute_divs(
1257                 __isl_take isl_union_map *umap);
1258
1259 This explicit representation defines the existentially quantified
1260 variables as integer divisions of the other variables, possibly
1261 including earlier existentially quantified variables.
1262 An explicitly represented existentially quantified variable therefore
1263 has a unique value when the values of the other variables are known.
1264 If, furthermore, the same existentials, i.e., existentials
1265 with the same explicit representations, should appear in the
1266 same order in each of the disjuncts of a set or map, then the user should call
1267 either of the following functions.
1268
1269         __isl_give isl_set *isl_set_align_divs(
1270                 __isl_take isl_set *set);
1271         __isl_give isl_map *isl_map_align_divs(
1272                 __isl_take isl_map *map);
1273
1274 Alternatively, the existentially quantified variables can be removed
1275 using the following functions, which compute an overapproximation.
1276
1277         __isl_give isl_basic_set *isl_basic_set_remove_divs(
1278                 __isl_take isl_basic_set *bset);
1279         __isl_give isl_basic_map *isl_basic_map_remove_divs(
1280                 __isl_take isl_basic_map *bmap);
1281         __isl_give isl_set *isl_set_remove_divs(
1282                 __isl_take isl_set *set);
1283         __isl_give isl_map *isl_map_remove_divs(
1284                 __isl_take isl_map *map);
1285
1286 To iterate over all the sets or maps in a union set or map, use
1287
1288         int isl_union_set_foreach_set(__isl_keep isl_union_set *uset,
1289                 int (*fn)(__isl_take isl_set *set, void *user),
1290                 void *user);
1291         int isl_union_map_foreach_map(__isl_keep isl_union_map *umap,
1292                 int (*fn)(__isl_take isl_map *map, void *user),
1293                 void *user);
1294
1295 The number of sets or maps in a union set or map can be obtained
1296 from
1297
1298         int isl_union_set_n_set(__isl_keep isl_union_set *uset);
1299         int isl_union_map_n_map(__isl_keep isl_union_map *umap);
1300
1301 To extract the set or map in a given space from a union, use
1302
1303         __isl_give isl_set *isl_union_set_extract_set(
1304                 __isl_keep isl_union_set *uset,
1305                 __isl_take isl_space *space);
1306         __isl_give isl_map *isl_union_map_extract_map(
1307                 __isl_keep isl_union_map *umap,
1308                 __isl_take isl_space *space);
1309
1310 To iterate over all the basic sets or maps in a set or map, use
1311
1312         int isl_set_foreach_basic_set(__isl_keep isl_set *set,
1313                 int (*fn)(__isl_take isl_basic_set *bset, void *user),
1314                 void *user);
1315         int isl_map_foreach_basic_map(__isl_keep isl_map *map,
1316                 int (*fn)(__isl_take isl_basic_map *bmap, void *user),
1317                 void *user);
1318
1319 The callback function C<fn> should return 0 if successful and
1320 -1 if an error occurs.  In the latter case, or if any other error
1321 occurs, the above functions will return -1.
1322
1323 It should be noted that C<isl> does not guarantee that
1324 the basic sets or maps passed to C<fn> are disjoint.
1325 If this is required, then the user should call one of
1326 the following functions first.
1327
1328         __isl_give isl_set *isl_set_make_disjoint(
1329                 __isl_take isl_set *set);
1330         __isl_give isl_map *isl_map_make_disjoint(
1331                 __isl_take isl_map *map);
1332
1333 The number of basic sets in a set can be obtained
1334 from
1335
1336         int isl_set_n_basic_set(__isl_keep isl_set *set);
1337
1338 To iterate over the constraints of a basic set or map, use
1339
1340         #include <isl/constraint.h>
1341
1342         int isl_basic_map_foreach_constraint(
1343                 __isl_keep isl_basic_map *bmap,
1344                 int (*fn)(__isl_take isl_constraint *c, void *user),
1345                 void *user);
1346         void *isl_constraint_free(__isl_take isl_constraint *c);
1347
1348 Again, the callback function C<fn> should return 0 if successful and
1349 -1 if an error occurs.  In the latter case, or if any other error
1350 occurs, the above functions will return -1.
1351 The constraint C<c> represents either an equality or an inequality.
1352 Use the following function to find out whether a constraint
1353 represents an equality.  If not, it represents an inequality.
1354
1355         int isl_constraint_is_equality(
1356                 __isl_keep isl_constraint *constraint);
1357
1358 The coefficients of the constraints can be inspected using
1359 the following functions.
1360
1361         void isl_constraint_get_constant(
1362                 __isl_keep isl_constraint *constraint, isl_int *v);
1363         void isl_constraint_get_coefficient(
1364                 __isl_keep isl_constraint *constraint,
1365                 enum isl_dim_type type, int pos, isl_int *v);
1366         int isl_constraint_involves_dims(
1367                 __isl_keep isl_constraint *constraint,
1368                 enum isl_dim_type type, unsigned first, unsigned n);
1369
1370 The explicit representations of the existentially quantified
1371 variables can be inspected using the following function.
1372 Note that the user is only allowed to use this function
1373 if the inspected set or map is the result of a call
1374 to C<isl_set_compute_divs> or C<isl_map_compute_divs>.
1375 The existentially quantified variable is equal to the floor
1376 of the returned affine expression.  The affine expression
1377 itself can be inspected using the functions in
1378 L<"Piecewise Quasi Affine Expressions">.
1379
1380         __isl_give isl_aff *isl_constraint_get_div(
1381                 __isl_keep isl_constraint *constraint, int pos);
1382
1383 To obtain the constraints of a basic set or map in matrix
1384 form, use the following functions.
1385
1386         __isl_give isl_mat *isl_basic_set_equalities_matrix(
1387                 __isl_keep isl_basic_set *bset,
1388                 enum isl_dim_type c1, enum isl_dim_type c2,
1389                 enum isl_dim_type c3, enum isl_dim_type c4);
1390         __isl_give isl_mat *isl_basic_set_inequalities_matrix(
1391                 __isl_keep isl_basic_set *bset,
1392                 enum isl_dim_type c1, enum isl_dim_type c2,
1393                 enum isl_dim_type c3, enum isl_dim_type c4);
1394         __isl_give isl_mat *isl_basic_map_equalities_matrix(
1395                 __isl_keep isl_basic_map *bmap,
1396                 enum isl_dim_type c1,
1397                 enum isl_dim_type c2, enum isl_dim_type c3,
1398                 enum isl_dim_type c4, enum isl_dim_type c5);
1399         __isl_give isl_mat *isl_basic_map_inequalities_matrix(
1400                 __isl_keep isl_basic_map *bmap,
1401                 enum isl_dim_type c1,
1402                 enum isl_dim_type c2, enum isl_dim_type c3,
1403                 enum isl_dim_type c4, enum isl_dim_type c5);
1404
1405 The C<isl_dim_type> arguments dictate the order in which
1406 different kinds of variables appear in the resulting matrix
1407 and should be a permutation of C<isl_dim_cst>, C<isl_dim_param>,
1408 C<isl_dim_in>, C<isl_dim_out> and C<isl_dim_div>.
1409
1410 The number of parameters, input, output or set dimensions can
1411 be obtained using the following functions.
1412
1413         unsigned isl_basic_set_dim(__isl_keep isl_basic_set *bset,
1414                 enum isl_dim_type type);
1415         unsigned isl_basic_map_dim(__isl_keep isl_basic_map *bmap,
1416                 enum isl_dim_type type);
1417         unsigned isl_set_dim(__isl_keep isl_set *set,
1418                 enum isl_dim_type type);
1419         unsigned isl_map_dim(__isl_keep isl_map *map,
1420                 enum isl_dim_type type);
1421
1422 To check whether the description of a set or relation depends
1423 on one or more given dimensions, it is not necessary to iterate over all
1424 constraints.  Instead the following functions can be used.
1425
1426         int isl_basic_set_involves_dims(
1427                 __isl_keep isl_basic_set *bset,
1428                 enum isl_dim_type type, unsigned first, unsigned n);
1429         int isl_set_involves_dims(__isl_keep isl_set *set,
1430                 enum isl_dim_type type, unsigned first, unsigned n);
1431         int isl_basic_map_involves_dims(
1432                 __isl_keep isl_basic_map *bmap,
1433                 enum isl_dim_type type, unsigned first, unsigned n);
1434         int isl_map_involves_dims(__isl_keep isl_map *map,
1435                 enum isl_dim_type type, unsigned first, unsigned n);
1436
1437 Similarly, the following functions can be used to check whether
1438 a given dimension is involved in any lower or upper bound.
1439
1440         int isl_set_dim_has_lower_bound(__isl_keep isl_set *set,
1441                 enum isl_dim_type type, unsigned pos);
1442         int isl_set_dim_has_upper_bound(__isl_keep isl_set *set,
1443                 enum isl_dim_type type, unsigned pos);
1444
1445 The identifiers or names of the domain and range spaces of a set
1446 or relation can be read off or set using the following functions.
1447
1448         __isl_give isl_set *isl_set_set_tuple_id(
1449                 __isl_take isl_set *set, __isl_take isl_id *id);
1450         __isl_give isl_set *isl_set_reset_tuple_id(
1451                 __isl_take isl_set *set);
1452         int isl_set_has_tuple_id(__isl_keep isl_set *set);
1453         __isl_give isl_id *isl_set_get_tuple_id(
1454                 __isl_keep isl_set *set);
1455         __isl_give isl_map *isl_map_set_tuple_id(
1456                 __isl_take isl_map *map, enum isl_dim_type type,
1457                 __isl_take isl_id *id);
1458         __isl_give isl_map *isl_map_reset_tuple_id(
1459                 __isl_take isl_map *map, enum isl_dim_type type);
1460         int isl_map_has_tuple_id(__isl_keep isl_map *map,
1461                 enum isl_dim_type type);
1462         __isl_give isl_id *isl_map_get_tuple_id(
1463                 __isl_keep isl_map *map, enum isl_dim_type type);
1464
1465         const char *isl_basic_set_get_tuple_name(
1466                 __isl_keep isl_basic_set *bset);
1467         __isl_give isl_basic_set *isl_basic_set_set_tuple_name(
1468                 __isl_take isl_basic_set *set, const char *s);
1469         const char *isl_set_get_tuple_name(
1470                 __isl_keep isl_set *set);
1471         const char *isl_basic_map_get_tuple_name(
1472                 __isl_keep isl_basic_map *bmap,
1473                 enum isl_dim_type type);
1474         __isl_give isl_basic_map *isl_basic_map_set_tuple_name(
1475                 __isl_take isl_basic_map *bmap,
1476                 enum isl_dim_type type, const char *s);
1477         const char *isl_map_get_tuple_name(
1478                 __isl_keep isl_map *map,
1479                 enum isl_dim_type type);
1480
1481 As with C<isl_space_get_tuple_name>, the value returned points to
1482 an internal data structure.
1483 The identifiers, positions or names of individual dimensions can be
1484 read off using the following functions.
1485
1486         __isl_give isl_set *isl_set_set_dim_id(
1487                 __isl_take isl_set *set, enum isl_dim_type type,
1488                 unsigned pos, __isl_take isl_id *id);
1489         int isl_set_has_dim_id(__isl_keep isl_set *set,
1490                 enum isl_dim_type type, unsigned pos);
1491         __isl_give isl_id *isl_set_get_dim_id(
1492                 __isl_keep isl_set *set, enum isl_dim_type type,
1493                 unsigned pos);
1494         int isl_basic_map_has_dim_id(
1495                 __isl_keep isl_basic_map *bmap,
1496                 enum isl_dim_type type, unsigned pos);
1497         __isl_give isl_map *isl_map_set_dim_id(
1498                 __isl_take isl_map *map, enum isl_dim_type type,
1499                 unsigned pos, __isl_take isl_id *id);
1500         int isl_map_has_dim_id(__isl_keep isl_map *map,
1501                 enum isl_dim_type type, unsigned pos);
1502         __isl_give isl_id *isl_map_get_dim_id(
1503                 __isl_keep isl_map *map, enum isl_dim_type type,
1504                 unsigned pos);
1505
1506         int isl_set_find_dim_by_id(__isl_keep isl_set *set,
1507                 enum isl_dim_type type, __isl_keep isl_id *id);
1508         int isl_map_find_dim_by_id(__isl_keep isl_map *map,
1509                 enum isl_dim_type type, __isl_keep isl_id *id);
1510         int isl_set_find_dim_by_name(__isl_keep isl_set *set,
1511                 enum isl_dim_type type, const char *name);
1512         int isl_map_find_dim_by_name(__isl_keep isl_map *map,
1513                 enum isl_dim_type type, const char *name);
1514
1515         const char *isl_constraint_get_dim_name(
1516                 __isl_keep isl_constraint *constraint,
1517                 enum isl_dim_type type, unsigned pos);
1518         const char *isl_basic_set_get_dim_name(
1519                 __isl_keep isl_basic_set *bset,
1520                 enum isl_dim_type type, unsigned pos);
1521         const char *isl_set_get_dim_name(
1522                 __isl_keep isl_set *set,
1523                 enum isl_dim_type type, unsigned pos);
1524         const char *isl_basic_map_get_dim_name(
1525                 __isl_keep isl_basic_map *bmap,
1526                 enum isl_dim_type type, unsigned pos);
1527         const char *isl_map_get_dim_name(
1528                 __isl_keep isl_map *map,
1529                 enum isl_dim_type type, unsigned pos);
1530
1531 These functions are mostly useful to obtain the identifiers, positions
1532 or names of the parameters.  Identifiers of individual dimensions are
1533 essentially only useful for printing.  They are ignored by all other
1534 operations and may not be preserved across those operations.
1535
1536 =head2 Properties
1537
1538 =head3 Unary Properties
1539
1540 =over
1541
1542 =item * Emptiness
1543
1544 The following functions test whether the given set or relation
1545 contains any integer points.  The ``plain'' variants do not perform
1546 any computations, but simply check if the given set or relation
1547 is already known to be empty.
1548
1549         int isl_basic_set_plain_is_empty(__isl_keep isl_basic_set *bset);
1550         int isl_basic_set_is_empty(__isl_keep isl_basic_set *bset);
1551         int isl_set_plain_is_empty(__isl_keep isl_set *set);
1552         int isl_set_is_empty(__isl_keep isl_set *set);
1553         int isl_union_set_is_empty(__isl_keep isl_union_set *uset);
1554         int isl_basic_map_plain_is_empty(__isl_keep isl_basic_map *bmap);
1555         int isl_basic_map_is_empty(__isl_keep isl_basic_map *bmap);
1556         int isl_map_plain_is_empty(__isl_keep isl_map *map);
1557         int isl_map_is_empty(__isl_keep isl_map *map);
1558         int isl_union_map_is_empty(__isl_keep isl_union_map *umap);
1559
1560 =item * Universality
1561
1562         int isl_basic_set_is_universe(__isl_keep isl_basic_set *bset);
1563         int isl_basic_map_is_universe(__isl_keep isl_basic_map *bmap);
1564         int isl_set_plain_is_universe(__isl_keep isl_set *set);
1565
1566 =item * Single-valuedness
1567
1568         int isl_map_is_single_valued(__isl_keep isl_map *map);
1569         int isl_union_map_is_single_valued(__isl_keep isl_union_map *umap);
1570
1571 =item * Injectivity
1572
1573         int isl_map_plain_is_injective(__isl_keep isl_map *map);
1574         int isl_map_is_injective(__isl_keep isl_map *map);
1575         int isl_union_map_plain_is_injective(
1576                 __isl_keep isl_union_map *umap);
1577         int isl_union_map_is_injective(
1578                 __isl_keep isl_union_map *umap);
1579
1580 =item * Bijectivity
1581
1582         int isl_map_is_bijective(__isl_keep isl_map *map);
1583         int isl_union_map_is_bijective(__isl_keep isl_union_map *umap);
1584
1585 =item * Position
1586
1587         int isl_basic_map_plain_is_fixed(
1588                 __isl_keep isl_basic_map *bmap,
1589                 enum isl_dim_type type, unsigned pos,
1590                 isl_int *val);
1591         int isl_set_plain_is_fixed(__isl_keep isl_set *set,
1592                 enum isl_dim_type type, unsigned pos,
1593                 isl_int *val);
1594         int isl_map_plain_is_fixed(__isl_keep isl_map *map,
1595                 enum isl_dim_type type, unsigned pos,
1596                 isl_int *val);
1597
1598 Check if the relation obviously lies on a hyperplane where the given dimension
1599 has a fixed value and if so, return that value in C<*val>.
1600
1601 =item * Space
1602
1603 To check whether a set is a parameter domain, use this function:
1604
1605         int isl_set_is_params(__isl_keep isl_set *set);
1606         int isl_union_set_is_params(
1607                 __isl_keep isl_union_set *uset);
1608
1609 =item * Wrapping
1610
1611 The following functions check whether the domain of the given
1612 (basic) set is a wrapped relation.
1613
1614         int isl_basic_set_is_wrapping(
1615                 __isl_keep isl_basic_set *bset);
1616         int isl_set_is_wrapping(__isl_keep isl_set *set);
1617
1618 =item * Internal Product
1619
1620         int isl_basic_map_can_zip(
1621                 __isl_keep isl_basic_map *bmap);
1622         int isl_map_can_zip(__isl_keep isl_map *map);
1623
1624 Check whether the product of domain and range of the given relation
1625 can be computed,
1626 i.e., whether both domain and range are nested relations.
1627
1628 =back
1629
1630 =head3 Binary Properties
1631
1632 =over
1633
1634 =item * Equality
1635
1636         int isl_set_plain_is_equal(__isl_keep isl_set *set1,
1637                 __isl_keep isl_set *set2);
1638         int isl_set_is_equal(__isl_keep isl_set *set1,
1639                 __isl_keep isl_set *set2);
1640         int isl_union_set_is_equal(
1641                 __isl_keep isl_union_set *uset1,
1642                 __isl_keep isl_union_set *uset2);
1643         int isl_basic_map_is_equal(
1644                 __isl_keep isl_basic_map *bmap1,
1645                 __isl_keep isl_basic_map *bmap2);
1646         int isl_map_is_equal(__isl_keep isl_map *map1,
1647                 __isl_keep isl_map *map2);
1648         int isl_map_plain_is_equal(__isl_keep isl_map *map1,
1649                 __isl_keep isl_map *map2);
1650         int isl_union_map_is_equal(
1651                 __isl_keep isl_union_map *umap1,
1652                 __isl_keep isl_union_map *umap2);
1653
1654 =item * Disjointness
1655
1656         int isl_set_plain_is_disjoint(__isl_keep isl_set *set1,
1657                 __isl_keep isl_set *set2);
1658
1659 =item * Subset
1660
1661         int isl_set_is_subset(__isl_keep isl_set *set1,
1662                 __isl_keep isl_set *set2);
1663         int isl_set_is_strict_subset(
1664                 __isl_keep isl_set *set1,
1665                 __isl_keep isl_set *set2);
1666         int isl_union_set_is_subset(
1667                 __isl_keep isl_union_set *uset1,
1668                 __isl_keep isl_union_set *uset2);
1669         int isl_union_set_is_strict_subset(
1670                 __isl_keep isl_union_set *uset1,
1671                 __isl_keep isl_union_set *uset2);
1672         int isl_basic_map_is_subset(
1673                 __isl_keep isl_basic_map *bmap1,
1674                 __isl_keep isl_basic_map *bmap2);
1675         int isl_basic_map_is_strict_subset(
1676                 __isl_keep isl_basic_map *bmap1,
1677                 __isl_keep isl_basic_map *bmap2);
1678         int isl_map_is_subset(
1679                 __isl_keep isl_map *map1,
1680                 __isl_keep isl_map *map2);
1681         int isl_map_is_strict_subset(
1682                 __isl_keep isl_map *map1,
1683                 __isl_keep isl_map *map2);
1684         int isl_union_map_is_subset(
1685                 __isl_keep isl_union_map *umap1,
1686                 __isl_keep isl_union_map *umap2);
1687         int isl_union_map_is_strict_subset(
1688                 __isl_keep isl_union_map *umap1,
1689                 __isl_keep isl_union_map *umap2);
1690
1691 =back
1692
1693 =head2 Unary Operations
1694
1695 =over
1696
1697 =item * Complement
1698
1699         __isl_give isl_set *isl_set_complement(
1700                 __isl_take isl_set *set);
1701
1702 =item * Inverse map
1703
1704         __isl_give isl_basic_map *isl_basic_map_reverse(
1705                 __isl_take isl_basic_map *bmap);
1706         __isl_give isl_map *isl_map_reverse(
1707                 __isl_take isl_map *map);
1708         __isl_give isl_union_map *isl_union_map_reverse(
1709                 __isl_take isl_union_map *umap);
1710
1711 =item * Projection
1712
1713         __isl_give isl_basic_set *isl_basic_set_project_out(
1714                 __isl_take isl_basic_set *bset,
1715                 enum isl_dim_type type, unsigned first, unsigned n);
1716         __isl_give isl_basic_map *isl_basic_map_project_out(
1717                 __isl_take isl_basic_map *bmap,
1718                 enum isl_dim_type type, unsigned first, unsigned n);
1719         __isl_give isl_set *isl_set_project_out(__isl_take isl_set *set,
1720                 enum isl_dim_type type, unsigned first, unsigned n);
1721         __isl_give isl_map *isl_map_project_out(__isl_take isl_map *map,
1722                 enum isl_dim_type type, unsigned first, unsigned n);
1723         __isl_give isl_basic_set *isl_basic_set_params(
1724                 __isl_take isl_basic_set *bset);
1725         __isl_give isl_basic_set *isl_basic_map_domain(
1726                 __isl_take isl_basic_map *bmap);
1727         __isl_give isl_basic_set *isl_basic_map_range(
1728                 __isl_take isl_basic_map *bmap);
1729         __isl_give isl_set *isl_set_params(__isl_take isl_set *set);
1730         __isl_give isl_set *isl_map_params(__isl_take isl_map *map);
1731         __isl_give isl_set *isl_map_domain(
1732                 __isl_take isl_map *bmap);
1733         __isl_give isl_set *isl_map_range(
1734                 __isl_take isl_map *map);
1735         __isl_give isl_set *isl_union_set_params(
1736                 __isl_take isl_union_set *uset);
1737         __isl_give isl_set *isl_union_map_params(
1738                 __isl_take isl_union_map *umap);
1739         __isl_give isl_union_set *isl_union_map_domain(
1740                 __isl_take isl_union_map *umap);
1741         __isl_give isl_union_set *isl_union_map_range(
1742                 __isl_take isl_union_map *umap);
1743
1744         __isl_give isl_basic_map *isl_basic_map_domain_map(
1745                 __isl_take isl_basic_map *bmap);
1746         __isl_give isl_basic_map *isl_basic_map_range_map(
1747                 __isl_take isl_basic_map *bmap);
1748         __isl_give isl_map *isl_map_domain_map(__isl_take isl_map *map);
1749         __isl_give isl_map *isl_map_range_map(__isl_take isl_map *map);
1750         __isl_give isl_union_map *isl_union_map_domain_map(
1751                 __isl_take isl_union_map *umap);
1752         __isl_give isl_union_map *isl_union_map_range_map(
1753                 __isl_take isl_union_map *umap);
1754
1755 The functions above construct a (basic, regular or union) relation
1756 that maps (a wrapped version of) the input relation to its domain or range.
1757
1758 =item * Elimination
1759
1760         __isl_give isl_set *isl_set_eliminate(
1761                 __isl_take isl_set *set, enum isl_dim_type type,
1762                 unsigned first, unsigned n);
1763         __isl_give isl_basic_map *isl_basic_map_eliminate(
1764                 __isl_take isl_basic_map *bmap,
1765                 enum isl_dim_type type,
1766                 unsigned first, unsigned n);
1767         __isl_give isl_map *isl_map_eliminate(
1768                 __isl_take isl_map *map, enum isl_dim_type type,
1769                 unsigned first, unsigned n);
1770
1771 Eliminate the coefficients for the given dimensions from the constraints,
1772 without removing the dimensions.
1773
1774 =item * Slicing
1775
1776         __isl_give isl_basic_set *isl_basic_set_fix(
1777                 __isl_take isl_basic_set *bset,
1778                 enum isl_dim_type type, unsigned pos,
1779                 isl_int value);
1780         __isl_give isl_basic_set *isl_basic_set_fix_si(
1781                 __isl_take isl_basic_set *bset,
1782                 enum isl_dim_type type, unsigned pos, int value);
1783         __isl_give isl_set *isl_set_fix(__isl_take isl_set *set,
1784                 enum isl_dim_type type, unsigned pos,
1785                 isl_int value);
1786         __isl_give isl_set *isl_set_fix_si(__isl_take isl_set *set,
1787                 enum isl_dim_type type, unsigned pos, int value);
1788         __isl_give isl_basic_map *isl_basic_map_fix_si(
1789                 __isl_take isl_basic_map *bmap,
1790                 enum isl_dim_type type, unsigned pos, int value);
1791         __isl_give isl_map *isl_map_fix_si(__isl_take isl_map *map,
1792                 enum isl_dim_type type, unsigned pos, int value);
1793
1794 Intersect the set or relation with the hyperplane where the given
1795 dimension has the fixed given value.
1796
1797         __isl_give isl_basic_map *isl_basic_map_lower_bound_si(
1798                 __isl_take isl_basic_map *bmap,
1799                 enum isl_dim_type type, unsigned pos, int value);
1800         __isl_give isl_set *isl_set_lower_bound_si(
1801                 __isl_take isl_set *set,
1802                 enum isl_dim_type type, unsigned pos, int value);
1803         __isl_give isl_map *isl_map_lower_bound_si(
1804                 __isl_take isl_map *map,
1805                 enum isl_dim_type type, unsigned pos, int value);
1806         __isl_give isl_set *isl_set_upper_bound_si(
1807                 __isl_take isl_set *set,
1808                 enum isl_dim_type type, unsigned pos, int value);
1809         __isl_give isl_map *isl_map_upper_bound_si(
1810                 __isl_take isl_map *map,
1811                 enum isl_dim_type type, unsigned pos, int value);
1812
1813 Intersect the set or relation with the half-space where the given
1814 dimension has a value bounded the fixed given value.
1815
1816         __isl_give isl_set *isl_set_equate(__isl_take isl_set *set,
1817                 enum isl_dim_type type1, int pos1,
1818                 enum isl_dim_type type2, int pos2);
1819         __isl_give isl_map *isl_map_equate(__isl_take isl_map *map,
1820                 enum isl_dim_type type1, int pos1,
1821                 enum isl_dim_type type2, int pos2);
1822
1823 Intersect the set or relation with the hyperplane where the given
1824 dimensions are equal to each other.
1825
1826         __isl_give isl_map *isl_map_oppose(__isl_take isl_map *map,
1827                 enum isl_dim_type type1, int pos1,
1828                 enum isl_dim_type type2, int pos2);
1829
1830 Intersect the relation with the hyperplane where the given
1831 dimensions have opposite values.
1832
1833 =item * Identity
1834
1835         __isl_give isl_map *isl_set_identity(
1836                 __isl_take isl_set *set);
1837         __isl_give isl_union_map *isl_union_set_identity(
1838                 __isl_take isl_union_set *uset);
1839
1840 Construct an identity relation on the given (union) set.
1841
1842 =item * Deltas
1843
1844         __isl_give isl_basic_set *isl_basic_map_deltas(
1845                 __isl_take isl_basic_map *bmap);
1846         __isl_give isl_set *isl_map_deltas(__isl_take isl_map *map);
1847         __isl_give isl_union_set *isl_union_map_deltas(
1848                 __isl_take isl_union_map *umap);
1849
1850 These functions return a (basic) set containing the differences
1851 between image elements and corresponding domain elements in the input.
1852
1853         __isl_give isl_basic_map *isl_basic_map_deltas_map(
1854                 __isl_take isl_basic_map *bmap);
1855         __isl_give isl_map *isl_map_deltas_map(
1856                 __isl_take isl_map *map);
1857         __isl_give isl_union_map *isl_union_map_deltas_map(
1858                 __isl_take isl_union_map *umap);
1859
1860 The functions above construct a (basic, regular or union) relation
1861 that maps (a wrapped version of) the input relation to its delta set.
1862
1863 =item * Coalescing
1864
1865 Simplify the representation of a set or relation by trying
1866 to combine pairs of basic sets or relations into a single
1867 basic set or relation.
1868
1869         __isl_give isl_set *isl_set_coalesce(__isl_take isl_set *set);
1870         __isl_give isl_map *isl_map_coalesce(__isl_take isl_map *map);
1871         __isl_give isl_union_set *isl_union_set_coalesce(
1872                 __isl_take isl_union_set *uset);
1873         __isl_give isl_union_map *isl_union_map_coalesce(
1874                 __isl_take isl_union_map *umap);
1875
1876 =item * Detecting equalities
1877
1878         __isl_give isl_basic_set *isl_basic_set_detect_equalities(
1879                 __isl_take isl_basic_set *bset);
1880         __isl_give isl_basic_map *isl_basic_map_detect_equalities(
1881                 __isl_take isl_basic_map *bmap);
1882         __isl_give isl_set *isl_set_detect_equalities(
1883                 __isl_take isl_set *set);
1884         __isl_give isl_map *isl_map_detect_equalities(
1885                 __isl_take isl_map *map);
1886         __isl_give isl_union_set *isl_union_set_detect_equalities(
1887                 __isl_take isl_union_set *uset);
1888         __isl_give isl_union_map *isl_union_map_detect_equalities(
1889                 __isl_take isl_union_map *umap);
1890
1891 Simplify the representation of a set or relation by detecting implicit
1892 equalities.
1893
1894 =item * Removing redundant constraints
1895
1896         __isl_give isl_basic_set *isl_basic_set_remove_redundancies(
1897                 __isl_take isl_basic_set *bset);
1898         __isl_give isl_set *isl_set_remove_redundancies(
1899                 __isl_take isl_set *set);
1900         __isl_give isl_basic_map *isl_basic_map_remove_redundancies(
1901                 __isl_take isl_basic_map *bmap);
1902         __isl_give isl_map *isl_map_remove_redundancies(
1903                 __isl_take isl_map *map);
1904
1905 =item * Convex hull
1906
1907         __isl_give isl_basic_set *isl_set_convex_hull(
1908                 __isl_take isl_set *set);
1909         __isl_give isl_basic_map *isl_map_convex_hull(
1910                 __isl_take isl_map *map);
1911
1912 If the input set or relation has any existentially quantified
1913 variables, then the result of these operations is currently undefined.
1914
1915 =item * Simple hull
1916
1917         __isl_give isl_basic_set *isl_set_simple_hull(
1918                 __isl_take isl_set *set);
1919         __isl_give isl_basic_map *isl_map_simple_hull(
1920                 __isl_take isl_map *map);
1921         __isl_give isl_union_map *isl_union_map_simple_hull(
1922                 __isl_take isl_union_map *umap);
1923
1924 These functions compute a single basic set or relation
1925 that contains the whole input set or relation.
1926 In particular, the output is described by translates
1927 of the constraints describing the basic sets or relations in the input.
1928
1929 =begin latex
1930
1931 (See \autoref{s:simple hull}.)
1932
1933 =end latex
1934
1935 =item * Affine hull
1936
1937         __isl_give isl_basic_set *isl_basic_set_affine_hull(
1938                 __isl_take isl_basic_set *bset);
1939         __isl_give isl_basic_set *isl_set_affine_hull(
1940                 __isl_take isl_set *set);
1941         __isl_give isl_union_set *isl_union_set_affine_hull(
1942                 __isl_take isl_union_set *uset);
1943         __isl_give isl_basic_map *isl_basic_map_affine_hull(
1944                 __isl_take isl_basic_map *bmap);
1945         __isl_give isl_basic_map *isl_map_affine_hull(
1946                 __isl_take isl_map *map);
1947         __isl_give isl_union_map *isl_union_map_affine_hull(
1948                 __isl_take isl_union_map *umap);
1949
1950 In case of union sets and relations, the affine hull is computed
1951 per space.
1952
1953 =item * Polyhedral hull
1954
1955         __isl_give isl_basic_set *isl_set_polyhedral_hull(
1956                 __isl_take isl_set *set);
1957         __isl_give isl_basic_map *isl_map_polyhedral_hull(
1958                 __isl_take isl_map *map);
1959         __isl_give isl_union_set *isl_union_set_polyhedral_hull(
1960                 __isl_take isl_union_set *uset);
1961         __isl_give isl_union_map *isl_union_map_polyhedral_hull(
1962                 __isl_take isl_union_map *umap);
1963
1964 These functions compute a single basic set or relation
1965 not involving any existentially quantified variables
1966 that contains the whole input set or relation.
1967 In case of union sets and relations, the polyhedral hull is computed
1968 per space.
1969
1970 =item * Optimization
1971
1972         #include <isl/ilp.h>
1973         enum isl_lp_result isl_basic_set_max(
1974                 __isl_keep isl_basic_set *bset,
1975                 __isl_keep isl_aff *obj, isl_int *opt)
1976         enum isl_lp_result isl_set_min(__isl_keep isl_set *set,
1977                 __isl_keep isl_aff *obj, isl_int *opt);
1978         enum isl_lp_result isl_set_max(__isl_keep isl_set *set,
1979                 __isl_keep isl_aff *obj, isl_int *opt);
1980
1981 Compute the minimum or maximum of the integer affine expression C<obj>
1982 over the points in C<set>, returning the result in C<opt>.
1983 The return value may be one of C<isl_lp_error>,
1984 C<isl_lp_ok>, C<isl_lp_unbounded> or C<isl_lp_empty>.
1985
1986 =item * Parametric optimization
1987
1988         __isl_give isl_pw_aff *isl_set_dim_min(
1989                 __isl_take isl_set *set, int pos);
1990         __isl_give isl_pw_aff *isl_set_dim_max(
1991                 __isl_take isl_set *set, int pos);
1992         __isl_give isl_pw_aff *isl_map_dim_max(
1993                 __isl_take isl_map *map, int pos);
1994
1995 Compute the minimum or maximum of the given set or output dimension
1996 as a function of the parameters (and input dimensions), but independently
1997 of the other set or output dimensions.
1998 For lexicographic optimization, see L<"Lexicographic Optimization">.
1999
2000 =item * Dual
2001
2002 The following functions compute either the set of (rational) coefficient
2003 values of valid constraints for the given set or the set of (rational)
2004 values satisfying the constraints with coefficients from the given set.
2005 Internally, these two sets of functions perform essentially the
2006 same operations, except that the set of coefficients is assumed to
2007 be a cone, while the set of values may be any polyhedron.
2008 The current implementation is based on the Farkas lemma and
2009 Fourier-Motzkin elimination, but this may change or be made optional
2010 in future.  In particular, future implementations may use different
2011 dualization algorithms or skip the elimination step.
2012
2013         __isl_give isl_basic_set *isl_basic_set_coefficients(
2014                 __isl_take isl_basic_set *bset);
2015         __isl_give isl_basic_set *isl_set_coefficients(
2016                 __isl_take isl_set *set);
2017         __isl_give isl_union_set *isl_union_set_coefficients(
2018                 __isl_take isl_union_set *bset);
2019         __isl_give isl_basic_set *isl_basic_set_solutions(
2020                 __isl_take isl_basic_set *bset);
2021         __isl_give isl_basic_set *isl_set_solutions(
2022                 __isl_take isl_set *set);
2023         __isl_give isl_union_set *isl_union_set_solutions(
2024                 __isl_take isl_union_set *bset);
2025
2026 =item * Power
2027
2028         __isl_give isl_map *isl_map_power(__isl_take isl_map *map,
2029                 int *exact);
2030         __isl_give isl_union_map *isl_union_map_power(
2031                 __isl_take isl_union_map *umap, int *exact);
2032
2033 Compute a parametric representation for all positive powers I<k> of C<map>.
2034 The result maps I<k> to a nested relation corresponding to the
2035 I<k>th power of C<map>.
2036 The result may be an overapproximation.  If the result is known to be exact,
2037 then C<*exact> is set to C<1>.
2038
2039 =item * Transitive closure
2040
2041         __isl_give isl_map *isl_map_transitive_closure(
2042                 __isl_take isl_map *map, int *exact);
2043         __isl_give isl_union_map *isl_union_map_transitive_closure(
2044                 __isl_take isl_union_map *umap, int *exact);
2045
2046 Compute the transitive closure of C<map>.
2047 The result may be an overapproximation.  If the result is known to be exact,
2048 then C<*exact> is set to C<1>.
2049
2050 =item * Reaching path lengths
2051
2052         __isl_give isl_map *isl_map_reaching_path_lengths(
2053                 __isl_take isl_map *map, int *exact);
2054
2055 Compute a relation that maps each element in the range of C<map>
2056 to the lengths of all paths composed of edges in C<map> that
2057 end up in the given element.
2058 The result may be an overapproximation.  If the result is known to be exact,
2059 then C<*exact> is set to C<1>.
2060 To compute the I<maximal> path length, the resulting relation
2061 should be postprocessed by C<isl_map_lexmax>.
2062 In particular, if the input relation is a dependence relation
2063 (mapping sources to sinks), then the maximal path length corresponds
2064 to the free schedule.
2065 Note, however, that C<isl_map_lexmax> expects the maximum to be
2066 finite, so if the path lengths are unbounded (possibly due to
2067 the overapproximation), then you will get an error message.
2068
2069 =item * Wrapping
2070
2071         __isl_give isl_basic_set *isl_basic_map_wrap(
2072                 __isl_take isl_basic_map *bmap);
2073         __isl_give isl_set *isl_map_wrap(
2074                 __isl_take isl_map *map);
2075         __isl_give isl_union_set *isl_union_map_wrap(
2076                 __isl_take isl_union_map *umap);
2077         __isl_give isl_basic_map *isl_basic_set_unwrap(
2078                 __isl_take isl_basic_set *bset);
2079         __isl_give isl_map *isl_set_unwrap(
2080                 __isl_take isl_set *set);
2081         __isl_give isl_union_map *isl_union_set_unwrap(
2082                 __isl_take isl_union_set *uset);
2083
2084 =item * Flattening
2085
2086 Remove any internal structure of domain (and range) of the given
2087 set or relation.  If there is any such internal structure in the input,
2088 then the name of the space is also removed.
2089
2090         __isl_give isl_basic_set *isl_basic_set_flatten(
2091                 __isl_take isl_basic_set *bset);
2092         __isl_give isl_set *isl_set_flatten(
2093                 __isl_take isl_set *set);
2094         __isl_give isl_basic_map *isl_basic_map_flatten_domain(
2095                 __isl_take isl_basic_map *bmap);
2096         __isl_give isl_basic_map *isl_basic_map_flatten_range(
2097                 __isl_take isl_basic_map *bmap);
2098         __isl_give isl_map *isl_map_flatten_range(
2099                 __isl_take isl_map *map);
2100         __isl_give isl_map *isl_map_flatten_domain(
2101                 __isl_take isl_map *map);
2102         __isl_give isl_basic_map *isl_basic_map_flatten(
2103                 __isl_take isl_basic_map *bmap);
2104         __isl_give isl_map *isl_map_flatten(
2105                 __isl_take isl_map *map);
2106
2107         __isl_give isl_map *isl_set_flatten_map(
2108                 __isl_take isl_set *set);
2109
2110 The function above constructs a relation
2111 that maps the input set to a flattened version of the set.
2112
2113 =item * Lifting
2114
2115 Lift the input set to a space with extra dimensions corresponding
2116 to the existentially quantified variables in the input.
2117 In particular, the result lives in a wrapped map where the domain
2118 is the original space and the range corresponds to the original
2119 existentially quantified variables.
2120
2121         __isl_give isl_basic_set *isl_basic_set_lift(
2122                 __isl_take isl_basic_set *bset);
2123         __isl_give isl_set *isl_set_lift(
2124                 __isl_take isl_set *set);
2125         __isl_give isl_union_set *isl_union_set_lift(
2126                 __isl_take isl_union_set *uset);
2127
2128 Given a local space that contains the existentially quantified
2129 variables of a set, a basic relation that, when applied to
2130 a basic set, has essentially the same effect as C<isl_basic_set_lift>,
2131 can be constructed using the following function.
2132
2133         #include <isl/local_space.h>
2134         __isl_give isl_basic_map *isl_local_space_lifting(
2135                 __isl_take isl_local_space *ls);
2136
2137 =item * Internal Product
2138
2139         __isl_give isl_basic_map *isl_basic_map_zip(
2140                 __isl_take isl_basic_map *bmap);
2141         __isl_give isl_map *isl_map_zip(
2142                 __isl_take isl_map *map);
2143         __isl_give isl_union_map *isl_union_map_zip(
2144                 __isl_take isl_union_map *umap);
2145
2146 Given a relation with nested relations for domain and range,
2147 interchange the range of the domain with the domain of the range.
2148
2149 =item * Aligning parameters
2150
2151         __isl_give isl_set *isl_set_align_params(
2152                 __isl_take isl_set *set,
2153                 __isl_take isl_space *model);
2154         __isl_give isl_map *isl_map_align_params(
2155                 __isl_take isl_map *map,
2156                 __isl_take isl_space *model);
2157
2158 Change the order of the parameters of the given set or relation
2159 such that the first parameters match those of C<model>.
2160 This may involve the introduction of extra parameters.
2161 All parameters need to be named.
2162
2163 =item * Dimension manipulation
2164
2165         __isl_give isl_set *isl_set_add_dims(
2166                 __isl_take isl_set *set,
2167                 enum isl_dim_type type, unsigned n);
2168         __isl_give isl_map *isl_map_add_dims(
2169                 __isl_take isl_map *map,
2170                 enum isl_dim_type type, unsigned n);
2171         __isl_give isl_set *isl_set_insert_dims(
2172                 __isl_take isl_set *set,
2173                 enum isl_dim_type type, unsigned pos, unsigned n);
2174         __isl_give isl_map *isl_map_insert_dims(
2175                 __isl_take isl_map *map,
2176                 enum isl_dim_type type, unsigned pos, unsigned n);
2177         __isl_give isl_basic_set *isl_basic_set_move_dims(
2178                 __isl_take isl_basic_set *bset,
2179                 enum isl_dim_type dst_type, unsigned dst_pos,
2180                 enum isl_dim_type src_type, unsigned src_pos,
2181                 unsigned n);
2182         __isl_give isl_basic_map *isl_basic_map_move_dims(
2183                 __isl_take isl_basic_map *bmap,
2184                 enum isl_dim_type dst_type, unsigned dst_pos,
2185                 enum isl_dim_type src_type, unsigned src_pos,
2186                 unsigned n);
2187         __isl_give isl_set *isl_set_move_dims(
2188                 __isl_take isl_set *set,
2189                 enum isl_dim_type dst_type, unsigned dst_pos,
2190                 enum isl_dim_type src_type, unsigned src_pos,
2191                 unsigned n);
2192         __isl_give isl_map *isl_map_move_dims(
2193                 __isl_take isl_map *map,
2194                 enum isl_dim_type dst_type, unsigned dst_pos,
2195                 enum isl_dim_type src_type, unsigned src_pos,
2196                 unsigned n);
2197
2198 It is usually not advisable to directly change the (input or output)
2199 space of a set or a relation as this removes the name and the internal
2200 structure of the space.  However, the above functions can be useful
2201 to add new parameters, assuming
2202 C<isl_set_align_params> and C<isl_map_align_params>
2203 are not sufficient.
2204
2205 =back
2206
2207 =head2 Binary Operations
2208
2209 The two arguments of a binary operation not only need to live
2210 in the same C<isl_ctx>, they currently also need to have
2211 the same (number of) parameters.
2212
2213 =head3 Basic Operations
2214
2215 =over
2216
2217 =item * Intersection
2218
2219         __isl_give isl_basic_set *isl_basic_set_intersect_params(
2220                 __isl_take isl_basic_set *bset1,
2221                 __isl_take isl_basic_set *bset2);
2222         __isl_give isl_basic_set *isl_basic_set_intersect(
2223                 __isl_take isl_basic_set *bset1,
2224                 __isl_take isl_basic_set *bset2);
2225         __isl_give isl_set *isl_set_intersect_params(
2226                 __isl_take isl_set *set,
2227                 __isl_take isl_set *params);
2228         __isl_give isl_set *isl_set_intersect(
2229                 __isl_take isl_set *set1,
2230                 __isl_take isl_set *set2);
2231         __isl_give isl_union_set *isl_union_set_intersect_params(
2232                 __isl_take isl_union_set *uset,
2233                 __isl_take isl_set *set);
2234         __isl_give isl_union_map *isl_union_map_intersect_params(
2235                 __isl_take isl_union_map *umap,
2236                 __isl_take isl_set *set);
2237         __isl_give isl_union_set *isl_union_set_intersect(
2238                 __isl_take isl_union_set *uset1,
2239                 __isl_take isl_union_set *uset2);
2240         __isl_give isl_basic_map *isl_basic_map_intersect_domain(
2241                 __isl_take isl_basic_map *bmap,
2242                 __isl_take isl_basic_set *bset);
2243         __isl_give isl_basic_map *isl_basic_map_intersect_range(
2244                 __isl_take isl_basic_map *bmap,
2245                 __isl_take isl_basic_set *bset);
2246         __isl_give isl_basic_map *isl_basic_map_intersect(
2247                 __isl_take isl_basic_map *bmap1,
2248                 __isl_take isl_basic_map *bmap2);
2249         __isl_give isl_map *isl_map_intersect_params(
2250                 __isl_take isl_map *map,
2251                 __isl_take isl_set *params);
2252         __isl_give isl_map *isl_map_intersect_domain(
2253                 __isl_take isl_map *map,
2254                 __isl_take isl_set *set);
2255         __isl_give isl_map *isl_map_intersect_range(
2256                 __isl_take isl_map *map,
2257                 __isl_take isl_set *set);
2258         __isl_give isl_map *isl_map_intersect(
2259                 __isl_take isl_map *map1,
2260                 __isl_take isl_map *map2);
2261         __isl_give isl_union_map *isl_union_map_intersect_domain(
2262                 __isl_take isl_union_map *umap,
2263                 __isl_take isl_union_set *uset);
2264         __isl_give isl_union_map *isl_union_map_intersect_range(
2265                 __isl_take isl_union_map *umap,
2266                 __isl_take isl_union_set *uset);
2267         __isl_give isl_union_map *isl_union_map_intersect(
2268                 __isl_take isl_union_map *umap1,
2269                 __isl_take isl_union_map *umap2);
2270
2271 =item * Union
2272
2273         __isl_give isl_set *isl_basic_set_union(
2274                 __isl_take isl_basic_set *bset1,
2275                 __isl_take isl_basic_set *bset2);
2276         __isl_give isl_map *isl_basic_map_union(
2277                 __isl_take isl_basic_map *bmap1,
2278                 __isl_take isl_basic_map *bmap2);
2279         __isl_give isl_set *isl_set_union(
2280                 __isl_take isl_set *set1,
2281                 __isl_take isl_set *set2);
2282         __isl_give isl_map *isl_map_union(
2283                 __isl_take isl_map *map1,
2284                 __isl_take isl_map *map2);
2285         __isl_give isl_union_set *isl_union_set_union(
2286                 __isl_take isl_union_set *uset1,
2287                 __isl_take isl_union_set *uset2);
2288         __isl_give isl_union_map *isl_union_map_union(
2289                 __isl_take isl_union_map *umap1,
2290                 __isl_take isl_union_map *umap2);
2291
2292 =item * Set difference
2293
2294         __isl_give isl_set *isl_set_subtract(
2295                 __isl_take isl_set *set1,
2296                 __isl_take isl_set *set2);
2297         __isl_give isl_map *isl_map_subtract(
2298                 __isl_take isl_map *map1,
2299                 __isl_take isl_map *map2);
2300         __isl_give isl_map *isl_map_subtract_domain(
2301                 __isl_take isl_map *map,
2302                 __isl_take isl_set *dom);
2303         __isl_give isl_map *isl_map_subtract_range(
2304                 __isl_take isl_map *map,
2305                 __isl_take isl_set *dom);
2306         __isl_give isl_union_set *isl_union_set_subtract(
2307                 __isl_take isl_union_set *uset1,
2308                 __isl_take isl_union_set *uset2);
2309         __isl_give isl_union_map *isl_union_map_subtract(
2310                 __isl_take isl_union_map *umap1,
2311                 __isl_take isl_union_map *umap2);
2312
2313 =item * Application
2314
2315         __isl_give isl_basic_set *isl_basic_set_apply(
2316                 __isl_take isl_basic_set *bset,
2317                 __isl_take isl_basic_map *bmap);
2318         __isl_give isl_set *isl_set_apply(
2319                 __isl_take isl_set *set,
2320                 __isl_take isl_map *map);
2321         __isl_give isl_union_set *isl_union_set_apply(
2322                 __isl_take isl_union_set *uset,
2323                 __isl_take isl_union_map *umap);
2324         __isl_give isl_basic_map *isl_basic_map_apply_domain(
2325                 __isl_take isl_basic_map *bmap1,
2326                 __isl_take isl_basic_map *bmap2);
2327         __isl_give isl_basic_map *isl_basic_map_apply_range(
2328                 __isl_take isl_basic_map *bmap1,
2329                 __isl_take isl_basic_map *bmap2);
2330         __isl_give isl_map *isl_map_apply_domain(
2331                 __isl_take isl_map *map1,
2332                 __isl_take isl_map *map2);
2333         __isl_give isl_union_map *isl_union_map_apply_domain(
2334                 __isl_take isl_union_map *umap1,
2335                 __isl_take isl_union_map *umap2);
2336         __isl_give isl_map *isl_map_apply_range(
2337                 __isl_take isl_map *map1,
2338                 __isl_take isl_map *map2);
2339         __isl_give isl_union_map *isl_union_map_apply_range(
2340                 __isl_take isl_union_map *umap1,
2341                 __isl_take isl_union_map *umap2);
2342
2343 =item * Cartesian Product
2344
2345         __isl_give isl_set *isl_set_product(
2346                 __isl_take isl_set *set1,
2347                 __isl_take isl_set *set2);
2348         __isl_give isl_union_set *isl_union_set_product(
2349                 __isl_take isl_union_set *uset1,
2350                 __isl_take isl_union_set *uset2);
2351         __isl_give isl_basic_map *isl_basic_map_domain_product(
2352                 __isl_take isl_basic_map *bmap1,
2353                 __isl_take isl_basic_map *bmap2);
2354         __isl_give isl_basic_map *isl_basic_map_range_product(
2355                 __isl_take isl_basic_map *bmap1,
2356                 __isl_take isl_basic_map *bmap2);
2357         __isl_give isl_map *isl_map_domain_product(
2358                 __isl_take isl_map *map1,
2359                 __isl_take isl_map *map2);
2360         __isl_give isl_map *isl_map_range_product(
2361                 __isl_take isl_map *map1,
2362                 __isl_take isl_map *map2);
2363         __isl_give isl_union_map *isl_union_map_range_product(
2364                 __isl_take isl_union_map *umap1,
2365                 __isl_take isl_union_map *umap2);
2366         __isl_give isl_map *isl_map_product(
2367                 __isl_take isl_map *map1,
2368                 __isl_take isl_map *map2);
2369         __isl_give isl_union_map *isl_union_map_product(
2370                 __isl_take isl_union_map *umap1,
2371                 __isl_take isl_union_map *umap2);
2372
2373 The above functions compute the cross product of the given
2374 sets or relations.  The domains and ranges of the results
2375 are wrapped maps between domains and ranges of the inputs.
2376 To obtain a ``flat'' product, use the following functions
2377 instead.
2378
2379         __isl_give isl_basic_set *isl_basic_set_flat_product(
2380                 __isl_take isl_basic_set *bset1,
2381                 __isl_take isl_basic_set *bset2);
2382         __isl_give isl_set *isl_set_flat_product(
2383                 __isl_take isl_set *set1,
2384                 __isl_take isl_set *set2);
2385         __isl_give isl_basic_map *isl_basic_map_flat_range_product(
2386                 __isl_take isl_basic_map *bmap1,
2387                 __isl_take isl_basic_map *bmap2);
2388         __isl_give isl_map *isl_map_flat_domain_product(
2389                 __isl_take isl_map *map1,
2390                 __isl_take isl_map *map2);
2391         __isl_give isl_map *isl_map_flat_range_product(
2392                 __isl_take isl_map *map1,
2393                 __isl_take isl_map *map2);
2394         __isl_give isl_union_map *isl_union_map_flat_range_product(
2395                 __isl_take isl_union_map *umap1,
2396                 __isl_take isl_union_map *umap2);
2397         __isl_give isl_basic_map *isl_basic_map_flat_product(
2398                 __isl_take isl_basic_map *bmap1,
2399                 __isl_take isl_basic_map *bmap2);
2400         __isl_give isl_map *isl_map_flat_product(
2401                 __isl_take isl_map *map1,
2402                 __isl_take isl_map *map2);
2403
2404 =item * Simplification
2405
2406         __isl_give isl_basic_set *isl_basic_set_gist(
2407                 __isl_take isl_basic_set *bset,
2408                 __isl_take isl_basic_set *context);
2409         __isl_give isl_set *isl_set_gist(__isl_take isl_set *set,
2410                 __isl_take isl_set *context);
2411         __isl_give isl_set *isl_set_gist_params(
2412                 __isl_take isl_set *set,
2413                 __isl_take isl_set *context);
2414         __isl_give isl_union_set *isl_union_set_gist(
2415                 __isl_take isl_union_set *uset,
2416                 __isl_take isl_union_set *context);
2417         __isl_give isl_union_set *isl_union_set_gist_params(
2418                 __isl_take isl_union_set *uset,
2419                 __isl_take isl_set *set);
2420         __isl_give isl_basic_map *isl_basic_map_gist(
2421                 __isl_take isl_basic_map *bmap,
2422                 __isl_take isl_basic_map *context);
2423         __isl_give isl_map *isl_map_gist(__isl_take isl_map *map,
2424                 __isl_take isl_map *context);
2425         __isl_give isl_map *isl_map_gist_params(
2426                 __isl_take isl_map *map,
2427                 __isl_take isl_set *context);
2428         __isl_give isl_map *isl_map_gist_domain(
2429                 __isl_take isl_map *map,
2430                 __isl_take isl_set *context);
2431         __isl_give isl_map *isl_map_gist_range(
2432                 __isl_take isl_map *map,
2433                 __isl_take isl_set *context);
2434         __isl_give isl_union_map *isl_union_map_gist(
2435                 __isl_take isl_union_map *umap,
2436                 __isl_take isl_union_map *context);
2437         __isl_give isl_union_map *isl_union_map_gist_params(
2438                 __isl_take isl_union_map *umap,
2439                 __isl_take isl_set *set);
2440         __isl_give isl_union_map *isl_union_map_gist_domain(
2441                 __isl_take isl_union_map *umap,
2442                 __isl_take isl_union_set *uset);
2443
2444 The gist operation returns a set or relation that has the
2445 same intersection with the context as the input set or relation.
2446 Any implicit equality in the intersection is made explicit in the result,
2447 while all inequalities that are redundant with respect to the intersection
2448 are removed.
2449 In case of union sets and relations, the gist operation is performed
2450 per space.
2451
2452 =back
2453
2454 =head3 Lexicographic Optimization
2455
2456 Given a (basic) set C<set> (or C<bset>) and a zero-dimensional domain C<dom>,
2457 the following functions
2458 compute a set that contains the lexicographic minimum or maximum
2459 of the elements in C<set> (or C<bset>) for those values of the parameters
2460 that satisfy C<dom>.
2461 If C<empty> is not C<NULL>, then C<*empty> is assigned a set
2462 that contains the parameter values in C<dom> for which C<set> (or C<bset>)
2463 has no elements.
2464 In other words, the union of the parameter values
2465 for which the result is non-empty and of C<*empty>
2466 is equal to C<dom>.
2467
2468         __isl_give isl_set *isl_basic_set_partial_lexmin(
2469                 __isl_take isl_basic_set *bset,
2470                 __isl_take isl_basic_set *dom,
2471                 __isl_give isl_set **empty);
2472         __isl_give isl_set *isl_basic_set_partial_lexmax(
2473                 __isl_take isl_basic_set *bset,
2474                 __isl_take isl_basic_set *dom,
2475                 __isl_give isl_set **empty);
2476         __isl_give isl_set *isl_set_partial_lexmin(
2477                 __isl_take isl_set *set, __isl_take isl_set *dom,
2478                 __isl_give isl_set **empty);
2479         __isl_give isl_set *isl_set_partial_lexmax(
2480                 __isl_take isl_set *set, __isl_take isl_set *dom,
2481                 __isl_give isl_set **empty);
2482
2483 Given a (basic) set C<set> (or C<bset>), the following functions simply
2484 return a set containing the lexicographic minimum or maximum
2485 of the elements in C<set> (or C<bset>).
2486 In case of union sets, the optimum is computed per space.
2487
2488         __isl_give isl_set *isl_basic_set_lexmin(
2489                 __isl_take isl_basic_set *bset);
2490         __isl_give isl_set *isl_basic_set_lexmax(
2491                 __isl_take isl_basic_set *bset);
2492         __isl_give isl_set *isl_set_lexmin(
2493                 __isl_take isl_set *set);
2494         __isl_give isl_set *isl_set_lexmax(
2495                 __isl_take isl_set *set);
2496         __isl_give isl_union_set *isl_union_set_lexmin(
2497                 __isl_take isl_union_set *uset);
2498         __isl_give isl_union_set *isl_union_set_lexmax(
2499                 __isl_take isl_union_set *uset);
2500
2501 Given a (basic) relation C<map> (or C<bmap>) and a domain C<dom>,
2502 the following functions
2503 compute a relation that maps each element of C<dom>
2504 to the single lexicographic minimum or maximum
2505 of the elements that are associated to that same
2506 element in C<map> (or C<bmap>).
2507 If C<empty> is not C<NULL>, then C<*empty> is assigned a set
2508 that contains the elements in C<dom> that do not map
2509 to any elements in C<map> (or C<bmap>).
2510 In other words, the union of the domain of the result and of C<*empty>
2511 is equal to C<dom>.
2512
2513         __isl_give isl_map *isl_basic_map_partial_lexmax(
2514                 __isl_take isl_basic_map *bmap,
2515                 __isl_take isl_basic_set *dom,
2516                 __isl_give isl_set **empty);
2517         __isl_give isl_map *isl_basic_map_partial_lexmin(
2518                 __isl_take isl_basic_map *bmap,
2519                 __isl_take isl_basic_set *dom,
2520                 __isl_give isl_set **empty);
2521         __isl_give isl_map *isl_map_partial_lexmax(
2522                 __isl_take isl_map *map, __isl_take isl_set *dom,
2523                 __isl_give isl_set **empty);
2524         __isl_give isl_map *isl_map_partial_lexmin(
2525                 __isl_take isl_map *map, __isl_take isl_set *dom,
2526                 __isl_give isl_set **empty);
2527
2528 Given a (basic) map C<map> (or C<bmap>), the following functions simply
2529 return a map mapping each element in the domain of
2530 C<map> (or C<bmap>) to the lexicographic minimum or maximum
2531 of all elements associated to that element.
2532 In case of union relations, the optimum is computed per space.
2533
2534         __isl_give isl_map *isl_basic_map_lexmin(
2535                 __isl_take isl_basic_map *bmap);
2536         __isl_give isl_map *isl_basic_map_lexmax(
2537                 __isl_take isl_basic_map *bmap);
2538         __isl_give isl_map *isl_map_lexmin(
2539                 __isl_take isl_map *map);
2540         __isl_give isl_map *isl_map_lexmax(
2541                 __isl_take isl_map *map);
2542         __isl_give isl_union_map *isl_union_map_lexmin(
2543                 __isl_take isl_union_map *umap);
2544         __isl_give isl_union_map *isl_union_map_lexmax(
2545                 __isl_take isl_union_map *umap);
2546
2547 The following functions return their result in the form of
2548 a piecewise multi-affine expression
2549 (See L<"Piecewise Multiple Quasi Affine Expressions">),
2550 but are otherwise equivalent to the corresponding functions
2551 returning a basic set or relation.
2552
2553         __isl_give isl_pw_multi_aff *
2554         isl_basic_map_lexmin_pw_multi_aff(
2555                 __isl_take isl_basic_map *bmap);
2556         __isl_give isl_pw_multi_aff *
2557         isl_basic_set_partial_lexmin_pw_multi_aff(
2558                 __isl_take isl_basic_set *bset,
2559                 __isl_take isl_basic_set *dom,
2560                 __isl_give isl_set **empty);
2561         __isl_give isl_pw_multi_aff *
2562         isl_basic_set_partial_lexmax_pw_multi_aff(
2563                 __isl_take isl_basic_set *bset,
2564                 __isl_take isl_basic_set *dom,
2565                 __isl_give isl_set **empty);
2566         __isl_give isl_pw_multi_aff *
2567         isl_basic_map_partial_lexmin_pw_multi_aff(
2568                 __isl_take isl_basic_map *bmap,
2569                 __isl_take isl_basic_set *dom,
2570                 __isl_give isl_set **empty);
2571         __isl_give isl_pw_multi_aff *
2572         isl_basic_map_partial_lexmax_pw_multi_aff(
2573                 __isl_take isl_basic_map *bmap,
2574                 __isl_take isl_basic_set *dom,
2575                 __isl_give isl_set **empty);
2576
2577 =head2 Lists
2578
2579 Lists are defined over several element types, including
2580 C<isl_aff>, C<isl_pw_aff>, C<isl_basic_set> and C<isl_set>.
2581 Here we take lists of C<isl_set>s as an example.
2582 Lists can be created, copied and freed using the following functions.
2583
2584         #include <isl/list.h>
2585         __isl_give isl_set_list *isl_set_list_from_set(
2586                 __isl_take isl_set *el);
2587         __isl_give isl_set_list *isl_set_list_alloc(
2588                 isl_ctx *ctx, int n);
2589         __isl_give isl_set_list *isl_set_list_copy(
2590                 __isl_keep isl_set_list *list);
2591         __isl_give isl_set_list *isl_set_list_add(
2592                 __isl_take isl_set_list *list,
2593                 __isl_take isl_set *el);
2594         __isl_give isl_set_list *isl_set_list_concat(
2595                 __isl_take isl_set_list *list1,
2596                 __isl_take isl_set_list *list2);
2597         void *isl_set_list_free(__isl_take isl_set_list *list);
2598
2599 C<isl_set_list_alloc> creates an empty list with a capacity for
2600 C<n> elements.  C<isl_set_list_from_set> creates a list with a single
2601 element.
2602
2603 Lists can be inspected using the following functions.
2604
2605         #include <isl/list.h>
2606         isl_ctx *isl_set_list_get_ctx(__isl_keep isl_set_list *list);
2607         int isl_set_list_n_set(__isl_keep isl_set_list *list);
2608         __isl_give isl_set *isl_set_list_get_set(
2609                 __isl_keep isl_set_list *list, int index);
2610         int isl_set_list_foreach(__isl_keep isl_set_list *list,
2611                 int (*fn)(__isl_take isl_set *el, void *user),
2612                 void *user);
2613
2614 Lists can be printed using
2615
2616         #include <isl/list.h>
2617         __isl_give isl_printer *isl_printer_print_set_list(
2618                 __isl_take isl_printer *p,
2619                 __isl_keep isl_set_list *list);
2620
2621 =head2 Matrices
2622
2623 Matrices can be created, copied and freed using the following functions.
2624
2625         #include <isl/mat.h>
2626         __isl_give isl_mat *isl_mat_alloc(isl_ctx *ctx,
2627                 unsigned n_row, unsigned n_col);
2628         __isl_give isl_mat *isl_mat_copy(__isl_keep isl_mat *mat);
2629         void isl_mat_free(__isl_take isl_mat *mat);
2630
2631 Note that the elements of a newly created matrix may have arbitrary values.
2632 The elements can be changed and inspected using the following functions.
2633
2634         isl_ctx *isl_mat_get_ctx(__isl_keep isl_mat *mat);
2635         int isl_mat_rows(__isl_keep isl_mat *mat);
2636         int isl_mat_cols(__isl_keep isl_mat *mat);
2637         int isl_mat_get_element(__isl_keep isl_mat *mat,
2638                 int row, int col, isl_int *v);
2639         __isl_give isl_mat *isl_mat_set_element(__isl_take isl_mat *mat,
2640                 int row, int col, isl_int v);
2641         __isl_give isl_mat *isl_mat_set_element_si(__isl_take isl_mat *mat,
2642                 int row, int col, int v);
2643
2644 C<isl_mat_get_element> will return a negative value if anything went wrong.
2645 In that case, the value of C<*v> is undefined.
2646
2647 The following function can be used to compute the (right) inverse
2648 of a matrix, i.e., a matrix such that the product of the original
2649 and the inverse (in that order) is a multiple of the identity matrix.
2650 The input matrix is assumed to be of full row-rank.
2651
2652         __isl_give isl_mat *isl_mat_right_inverse(__isl_take isl_mat *mat);
2653
2654 The following function can be used to compute the (right) kernel
2655 (or null space) of a matrix, i.e., a matrix such that the product of
2656 the original and the kernel (in that order) is the zero matrix.
2657
2658         __isl_give isl_mat *isl_mat_right_kernel(__isl_take isl_mat *mat);
2659
2660 =head2 Piecewise Quasi Affine Expressions
2661
2662 The zero quasi affine expression on a given domain can be created using
2663
2664         __isl_give isl_aff *isl_aff_zero_on_domain(
2665                 __isl_take isl_local_space *ls);
2666
2667 Note that the space in which the resulting object lives is a map space
2668 with the given space as domain and a one-dimensional range.
2669
2670 An empty piecewise quasi affine expression (one with no cells)
2671 or a piecewise quasi affine expression with a single cell can
2672 be created using the following functions.
2673
2674         #include <isl/aff.h>
2675         __isl_give isl_pw_aff *isl_pw_aff_empty(
2676                 __isl_take isl_space *space);
2677         __isl_give isl_pw_aff *isl_pw_aff_alloc(
2678                 __isl_take isl_set *set, __isl_take isl_aff *aff);
2679         __isl_give isl_pw_aff *isl_pw_aff_from_aff(
2680                 __isl_take isl_aff *aff);
2681
2682 Quasi affine expressions can be copied and freed using
2683
2684         #include <isl/aff.h>
2685         __isl_give isl_aff *isl_aff_copy(__isl_keep isl_aff *aff);
2686         void *isl_aff_free(__isl_take isl_aff *aff);
2687
2688         __isl_give isl_pw_aff *isl_pw_aff_copy(
2689                 __isl_keep isl_pw_aff *pwaff);
2690         void *isl_pw_aff_free(__isl_take isl_pw_aff *pwaff);
2691
2692 A (rational) bound on a dimension can be extracted from an C<isl_constraint>
2693 using the following function.  The constraint is required to have
2694 a non-zero coefficient for the specified dimension.
2695
2696         #include <isl/constraint.h>
2697         __isl_give isl_aff *isl_constraint_get_bound(
2698                 __isl_keep isl_constraint *constraint,
2699                 enum isl_dim_type type, int pos);
2700
2701 The entire affine expression of the constraint can also be extracted
2702 using the following function.
2703
2704         #include <isl/constraint.h>
2705         __isl_give isl_aff *isl_constraint_get_aff(
2706                 __isl_keep isl_constraint *constraint);
2707
2708 Conversely, an equality constraint equating
2709 the affine expression to zero or an inequality constraint enforcing
2710 the affine expression to be non-negative, can be constructed using
2711
2712         __isl_give isl_constraint *isl_equality_from_aff(
2713                 __isl_take isl_aff *aff);
2714         __isl_give isl_constraint *isl_inequality_from_aff(
2715                 __isl_take isl_aff *aff);
2716
2717 The expression can be inspected using
2718
2719         #include <isl/aff.h>
2720         isl_ctx *isl_aff_get_ctx(__isl_keep isl_aff *aff);
2721         int isl_aff_dim(__isl_keep isl_aff *aff,
2722                 enum isl_dim_type type);
2723         __isl_give isl_local_space *isl_aff_get_domain_local_space(
2724                 __isl_keep isl_aff *aff);
2725         __isl_give isl_local_space *isl_aff_get_local_space(
2726                 __isl_keep isl_aff *aff);
2727         const char *isl_aff_get_dim_name(__isl_keep isl_aff *aff,
2728                 enum isl_dim_type type, unsigned pos);
2729         const char *isl_pw_aff_get_dim_name(
2730                 __isl_keep isl_pw_aff *pa,
2731                 enum isl_dim_type type, unsigned pos);
2732         int isl_pw_aff_has_dim_id(__isl_keep isl_pw_aff *pa,
2733                 enum isl_dim_type type, unsigned pos);
2734         __isl_give isl_id *isl_pw_aff_get_dim_id(
2735                 __isl_keep isl_pw_aff *pa,
2736                 enum isl_dim_type type, unsigned pos);
2737         int isl_aff_get_constant(__isl_keep isl_aff *aff,
2738                 isl_int *v);
2739         int isl_aff_get_coefficient(__isl_keep isl_aff *aff,
2740                 enum isl_dim_type type, int pos, isl_int *v);
2741         int isl_aff_get_denominator(__isl_keep isl_aff *aff,
2742                 isl_int *v);
2743         __isl_give isl_aff *isl_aff_get_div(
2744                 __isl_keep isl_aff *aff, int pos);
2745
2746         int isl_pw_aff_foreach_piece(__isl_keep isl_pw_aff *pwaff,
2747                 int (*fn)(__isl_take isl_set *set,
2748                           __isl_take isl_aff *aff,
2749                           void *user), void *user);
2750
2751         int isl_aff_is_cst(__isl_keep isl_aff *aff);
2752         int isl_pw_aff_is_cst(__isl_keep isl_pw_aff *pwaff);
2753
2754         int isl_aff_involves_dims(__isl_keep isl_aff *aff,
2755                 enum isl_dim_type type, unsigned first, unsigned n);
2756         int isl_pw_aff_involves_dims(__isl_keep isl_pw_aff *pwaff,
2757                 enum isl_dim_type type, unsigned first, unsigned n);
2758
2759         isl_ctx *isl_pw_aff_get_ctx(__isl_keep isl_pw_aff *pwaff);
2760         unsigned isl_pw_aff_dim(__isl_keep isl_pw_aff *pwaff,
2761                 enum isl_dim_type type);
2762         int isl_pw_aff_is_empty(__isl_keep isl_pw_aff *pwaff);
2763
2764 It can be modified using
2765
2766         #include <isl/aff.h>
2767         __isl_give isl_pw_aff *isl_pw_aff_set_tuple_id(
2768                 __isl_take isl_pw_aff *pwaff,
2769                 enum isl_dim_type type, __isl_take isl_id *id);
2770         __isl_give isl_aff *isl_aff_set_dim_name(
2771                 __isl_take isl_aff *aff, enum isl_dim_type type,
2772                 unsigned pos, const char *s);
2773         __isl_give isl_aff *isl_aff_set_dim_id(
2774                 __isl_take isl_aff *aff, enum isl_dim_type type,
2775                 unsigned pos, __isl_take isl_id *id);
2776         __isl_give isl_pw_aff *isl_pw_aff_set_dim_id(
2777                 __isl_take isl_pw_aff *pma,
2778                 enum isl_dim_type type, unsigned pos,
2779                 __isl_take isl_id *id);
2780         __isl_give isl_aff *isl_aff_set_constant(
2781                 __isl_take isl_aff *aff, isl_int v);
2782         __isl_give isl_aff *isl_aff_set_constant_si(
2783                 __isl_take isl_aff *aff, int v);
2784         __isl_give isl_aff *isl_aff_set_coefficient(
2785                 __isl_take isl_aff *aff,
2786                 enum isl_dim_type type, int pos, isl_int v);
2787         __isl_give isl_aff *isl_aff_set_coefficient_si(
2788                 __isl_take isl_aff *aff,
2789                 enum isl_dim_type type, int pos, int v);
2790         __isl_give isl_aff *isl_aff_set_denominator(
2791                 __isl_take isl_aff *aff, isl_int v);
2792
2793         __isl_give isl_aff *isl_aff_add_constant(
2794                 __isl_take isl_aff *aff, isl_int v);
2795         __isl_give isl_aff *isl_aff_add_constant_si(
2796                 __isl_take isl_aff *aff, int v);
2797         __isl_give isl_aff *isl_aff_add_coefficient(
2798                 __isl_take isl_aff *aff,
2799                 enum isl_dim_type type, int pos, isl_int v);
2800         __isl_give isl_aff *isl_aff_add_coefficient_si(
2801                 __isl_take isl_aff *aff,
2802                 enum isl_dim_type type, int pos, int v);
2803
2804         __isl_give isl_aff *isl_aff_insert_dims(
2805                 __isl_take isl_aff *aff,
2806                 enum isl_dim_type type, unsigned first, unsigned n);
2807         __isl_give isl_pw_aff *isl_pw_aff_insert_dims(
2808                 __isl_take isl_pw_aff *pwaff,
2809                 enum isl_dim_type type, unsigned first, unsigned n);
2810         __isl_give isl_aff *isl_aff_add_dims(
2811                 __isl_take isl_aff *aff,
2812                 enum isl_dim_type type, unsigned n);
2813         __isl_give isl_pw_aff *isl_pw_aff_add_dims(
2814                 __isl_take isl_pw_aff *pwaff,
2815                 enum isl_dim_type type, unsigned n);
2816         __isl_give isl_aff *isl_aff_drop_dims(
2817                 __isl_take isl_aff *aff,
2818                 enum isl_dim_type type, unsigned first, unsigned n);
2819         __isl_give isl_pw_aff *isl_pw_aff_drop_dims(
2820                 __isl_take isl_pw_aff *pwaff,
2821                 enum isl_dim_type type, unsigned first, unsigned n);
2822
2823 Note that the C<set_constant> and C<set_coefficient> functions
2824 set the I<numerator> of the constant or coefficient, while
2825 C<add_constant> and C<add_coefficient> add an integer value to
2826 the possibly rational constant or coefficient.
2827
2828 To check whether an affine expressions is obviously zero
2829 or obviously equal to some other affine expression, use
2830
2831         #include <isl/aff.h>
2832         int isl_aff_plain_is_zero(__isl_keep isl_aff *aff);
2833         int isl_aff_plain_is_equal(__isl_keep isl_aff *aff1,
2834                 __isl_keep isl_aff *aff2);
2835         int isl_pw_aff_plain_is_equal(
2836                 __isl_keep isl_pw_aff *pwaff1,
2837                 __isl_keep isl_pw_aff *pwaff2);
2838
2839 Operations include
2840
2841         #include <isl/aff.h>
2842         __isl_give isl_aff *isl_aff_add(__isl_take isl_aff *aff1,
2843                 __isl_take isl_aff *aff2);
2844         __isl_give isl_pw_aff *isl_pw_aff_add(
2845                 __isl_take isl_pw_aff *pwaff1,
2846                 __isl_take isl_pw_aff *pwaff2);
2847         __isl_give isl_pw_aff *isl_pw_aff_min(
2848                 __isl_take isl_pw_aff *pwaff1,
2849                 __isl_take isl_pw_aff *pwaff2);
2850         __isl_give isl_pw_aff *isl_pw_aff_max(
2851                 __isl_take isl_pw_aff *pwaff1,
2852                 __isl_take isl_pw_aff *pwaff2);
2853         __isl_give isl_aff *isl_aff_sub(__isl_take isl_aff *aff1,
2854                 __isl_take isl_aff *aff2);
2855         __isl_give isl_pw_aff *isl_pw_aff_sub(
2856                 __isl_take isl_pw_aff *pwaff1,
2857                 __isl_take isl_pw_aff *pwaff2);
2858         __isl_give isl_aff *isl_aff_neg(__isl_take isl_aff *aff);
2859         __isl_give isl_pw_aff *isl_pw_aff_neg(
2860                 __isl_take isl_pw_aff *pwaff);
2861         __isl_give isl_aff *isl_aff_ceil(__isl_take isl_aff *aff);
2862         __isl_give isl_pw_aff *isl_pw_aff_ceil(
2863                 __isl_take isl_pw_aff *pwaff);
2864         __isl_give isl_aff *isl_aff_floor(__isl_take isl_aff *aff);
2865         __isl_give isl_pw_aff *isl_pw_aff_floor(
2866                 __isl_take isl_pw_aff *pwaff);
2867         __isl_give isl_aff *isl_aff_mod(__isl_take isl_aff *aff,
2868                 isl_int mod);
2869         __isl_give isl_pw_aff *isl_pw_aff_mod(
2870                 __isl_take isl_pw_aff *pwaff, isl_int mod);
2871         __isl_give isl_aff *isl_aff_scale(__isl_take isl_aff *aff,
2872                 isl_int f);
2873         __isl_give isl_pw_aff *isl_pw_aff_scale(
2874                 __isl_take isl_pw_aff *pwaff, isl_int f);
2875         __isl_give isl_aff *isl_aff_scale_down(__isl_take isl_aff *aff,
2876                 isl_int f);
2877         __isl_give isl_aff *isl_aff_scale_down_ui(
2878                 __isl_take isl_aff *aff, unsigned f);
2879         __isl_give isl_pw_aff *isl_pw_aff_scale_down(
2880                 __isl_take isl_pw_aff *pwaff, isl_int f);
2881
2882         __isl_give isl_pw_aff *isl_pw_aff_list_min(
2883                 __isl_take isl_pw_aff_list *list);
2884         __isl_give isl_pw_aff *isl_pw_aff_list_max(
2885                 __isl_take isl_pw_aff_list *list);
2886
2887         __isl_give isl_pw_aff *isl_pw_aff_coalesce(
2888                 __isl_take isl_pw_aff *pwqp);
2889
2890         __isl_give isl_pw_aff *isl_pw_aff_align_params(
2891                 __isl_take isl_pw_aff *pwaff,
2892                 __isl_take isl_space *model);
2893
2894         __isl_give isl_aff *isl_aff_gist_params(
2895                 __isl_take isl_aff *aff,
2896                 __isl_take isl_set *context);
2897         __isl_give isl_aff *isl_aff_gist(__isl_take isl_aff *aff,
2898                 __isl_take isl_set *context);
2899         __isl_give isl_pw_aff *isl_pw_aff_gist_params(
2900                 __isl_take isl_pw_aff *pwaff,
2901                 __isl_take isl_set *context);
2902         __isl_give isl_pw_aff *isl_pw_aff_gist(
2903                 __isl_take isl_pw_aff *pwaff,
2904                 __isl_take isl_set *context);
2905
2906         __isl_give isl_set *isl_pw_aff_domain(
2907                 __isl_take isl_pw_aff *pwaff);
2908         __isl_give isl_pw_aff *isl_pw_aff_intersect_domain(
2909                 __isl_take isl_pw_aff *pa,
2910                 __isl_take isl_set *set);
2911         __isl_give isl_pw_aff *isl_pw_aff_intersect_params(
2912                 __isl_take isl_pw_aff *pa,
2913                 __isl_take isl_set *set);
2914
2915         __isl_give isl_aff *isl_aff_mul(__isl_take isl_aff *aff1,
2916                 __isl_take isl_aff *aff2);
2917         __isl_give isl_pw_aff *isl_pw_aff_mul(
2918                 __isl_take isl_pw_aff *pwaff1,
2919                 __isl_take isl_pw_aff *pwaff2);
2920
2921 When multiplying two affine expressions, at least one of the two needs
2922 to be a constant.
2923
2924         #include <isl/aff.h>
2925         __isl_give isl_basic_set *isl_aff_le_basic_set(
2926                 __isl_take isl_aff *aff1, __isl_take isl_aff *aff2);
2927         __isl_give isl_basic_set *isl_aff_ge_basic_set(
2928                 __isl_take isl_aff *aff1, __isl_take isl_aff *aff2);
2929         __isl_give isl_set *isl_pw_aff_eq_set(
2930                 __isl_take isl_pw_aff *pwaff1,
2931                 __isl_take isl_pw_aff *pwaff2);
2932         __isl_give isl_set *isl_pw_aff_ne_set(
2933                 __isl_take isl_pw_aff *pwaff1,
2934                 __isl_take isl_pw_aff *pwaff2);
2935         __isl_give isl_set *isl_pw_aff_le_set(
2936                 __isl_take isl_pw_aff *pwaff1,
2937                 __isl_take isl_pw_aff *pwaff2);
2938         __isl_give isl_set *isl_pw_aff_lt_set(
2939                 __isl_take isl_pw_aff *pwaff1,
2940                 __isl_take isl_pw_aff *pwaff2);
2941         __isl_give isl_set *isl_pw_aff_ge_set(
2942                 __isl_take isl_pw_aff *pwaff1,
2943                 __isl_take isl_pw_aff *pwaff2);
2944         __isl_give isl_set *isl_pw_aff_gt_set(
2945                 __isl_take isl_pw_aff *pwaff1,
2946                 __isl_take isl_pw_aff *pwaff2);
2947
2948         __isl_give isl_set *isl_pw_aff_list_eq_set(
2949                 __isl_take isl_pw_aff_list *list1,
2950                 __isl_take isl_pw_aff_list *list2);
2951         __isl_give isl_set *isl_pw_aff_list_ne_set(
2952                 __isl_take isl_pw_aff_list *list1,
2953                 __isl_take isl_pw_aff_list *list2);
2954         __isl_give isl_set *isl_pw_aff_list_le_set(
2955                 __isl_take isl_pw_aff_list *list1,
2956                 __isl_take isl_pw_aff_list *list2);
2957         __isl_give isl_set *isl_pw_aff_list_lt_set(
2958                 __isl_take isl_pw_aff_list *list1,
2959                 __isl_take isl_pw_aff_list *list2);
2960         __isl_give isl_set *isl_pw_aff_list_ge_set(
2961                 __isl_take isl_pw_aff_list *list1,
2962                 __isl_take isl_pw_aff_list *list2);
2963         __isl_give isl_set *isl_pw_aff_list_gt_set(
2964                 __isl_take isl_pw_aff_list *list1,
2965                 __isl_take isl_pw_aff_list *list2);
2966
2967 The function C<isl_aff_ge_basic_set> returns a basic set
2968 containing those elements in the shared space
2969 of C<aff1> and C<aff2> where C<aff1> is greater than or equal to C<aff2>.
2970 The function C<isl_aff_ge_set> returns a set
2971 containing those elements in the shared domain
2972 of C<pwaff1> and C<pwaff2> where C<pwaff1> is greater than or equal to C<pwaff2>.
2973 The functions operating on C<isl_pw_aff_list> apply the corresponding
2974 C<isl_pw_aff> function to each pair of elements in the two lists.
2975
2976         #include <isl/aff.h>
2977         __isl_give isl_set *isl_pw_aff_nonneg_set(
2978                 __isl_take isl_pw_aff *pwaff);
2979         __isl_give isl_set *isl_pw_aff_zero_set(
2980                 __isl_take isl_pw_aff *pwaff);
2981         __isl_give isl_set *isl_pw_aff_non_zero_set(
2982                 __isl_take isl_pw_aff *pwaff);
2983
2984 The function C<isl_pw_aff_nonneg_set> returns a set
2985 containing those elements in the domain
2986 of C<pwaff> where C<pwaff> is non-negative.
2987
2988         #include <isl/aff.h>
2989         __isl_give isl_pw_aff *isl_pw_aff_cond(
2990                 __isl_take isl_set *cond,
2991                 __isl_take isl_pw_aff *pwaff_true,
2992                 __isl_take isl_pw_aff *pwaff_false);
2993
2994 The function C<isl_pw_aff_cond> performs a conditional operator
2995 and returns an expression that is equal to C<pwaff_true>
2996 for elements in C<cond> and equal to C<pwaff_false> for elements
2997 not in C<cond>.
2998
2999         #include <isl/aff.h>
3000         __isl_give isl_pw_aff *isl_pw_aff_union_min(
3001                 __isl_take isl_pw_aff *pwaff1,
3002                 __isl_take isl_pw_aff *pwaff2);
3003         __isl_give isl_pw_aff *isl_pw_aff_union_max(
3004                 __isl_take isl_pw_aff *pwaff1,
3005                 __isl_take isl_pw_aff *pwaff2);
3006         __isl_give isl_pw_aff *isl_pw_aff_union_add(
3007                 __isl_take isl_pw_aff *pwaff1,
3008                 __isl_take isl_pw_aff *pwaff2);
3009
3010 The function C<isl_pw_aff_union_max> computes a piecewise quasi-affine
3011 expression with a domain that is the union of those of C<pwaff1> and
3012 C<pwaff2> and such that on each cell, the quasi-affine expression is
3013 the maximum of those of C<pwaff1> and C<pwaff2>.  If only one of
3014 C<pwaff1> or C<pwaff2> is defined on a given cell, then the
3015 associated expression is the defined one.
3016
3017 An expression can be read from input using
3018
3019         #include <isl/aff.h>
3020         __isl_give isl_aff *isl_aff_read_from_str(
3021                 isl_ctx *ctx, const char *str);
3022         __isl_give isl_pw_aff *isl_pw_aff_read_from_str(
3023                 isl_ctx *ctx, const char *str);
3024
3025 An expression can be printed using
3026
3027         #include <isl/aff.h>
3028         __isl_give isl_printer *isl_printer_print_aff(
3029                 __isl_take isl_printer *p, __isl_keep isl_aff *aff);
3030
3031         __isl_give isl_printer *isl_printer_print_pw_aff(
3032                 __isl_take isl_printer *p,
3033                 __isl_keep isl_pw_aff *pwaff);
3034
3035 =head2 Piecewise Multiple Quasi Affine Expressions
3036
3037 An C<isl_multi_aff> object represents a sequence of
3038 zero or more affine expressions, all defined on the same domain space.
3039
3040 An C<isl_multi_aff> can be constructed from a C<isl_aff_list> using the
3041 following function.
3042
3043         #include <isl/aff.h>
3044         __isl_give isl_multi_aff *isl_multi_aff_from_aff_list(
3045                 __isl_take isl_space *space,
3046                 __isl_take isl_aff_list *list);
3047
3048 An empty piecewise multiple quasi affine expression (one with no cells) or
3049 a piecewise multiple quasi affine expression with a single cell can
3050 be created using the following functions.
3051
3052         #include <isl/aff.h>
3053         __isl_give isl_pw_multi_aff *isl_pw_multi_aff_empty(
3054                 __isl_take isl_space *space);
3055         __isl_give isl_pw_multi_aff *isl_pw_multi_aff_alloc(
3056                 __isl_take isl_set *set,
3057                 __isl_take isl_multi_aff *maff);
3058
3059 A piecewise multiple quasi affine expression can also be initialized
3060 from an C<isl_set> or C<isl_map>, provided the C<isl_set> is a singleton
3061 and the C<isl_map> is single-valued.
3062
3063         __isl_give isl_pw_multi_aff *isl_pw_multi_aff_from_set(
3064                 __isl_take isl_set *set);
3065         __isl_give isl_pw_multi_aff *isl_pw_multi_aff_from_map(
3066                 __isl_take isl_map *map);
3067
3068 Multiple quasi affine expressions can be copied and freed using
3069
3070         #include <isl/aff.h>
3071         __isl_give isl_multi_aff *isl_multi_aff_copy(
3072                 __isl_keep isl_multi_aff *maff);
3073         void *isl_multi_aff_free(__isl_take isl_multi_aff *maff);
3074
3075         __isl_give isl_pw_multi_aff *isl_pw_multi_aff_copy(
3076                 __isl_keep isl_pw_multi_aff *pma);
3077         void *isl_pw_multi_aff_free(
3078                 __isl_take isl_pw_multi_aff *pma);
3079
3080 The expression can be inspected using
3081
3082         #include <isl/aff.h>
3083         isl_ctx *isl_multi_aff_get_ctx(
3084                 __isl_keep isl_multi_aff *maff);
3085         isl_ctx *isl_pw_multi_aff_get_ctx(
3086                 __isl_keep isl_pw_multi_aff *pma);
3087         unsigned isl_multi_aff_dim(__isl_keep isl_multi_aff *maff,
3088                 enum isl_dim_type type);
3089         unsigned isl_pw_multi_aff_dim(
3090                 __isl_keep isl_pw_multi_aff *pma,
3091                 enum isl_dim_type type);
3092         __isl_give isl_aff *isl_multi_aff_get_aff(
3093                 __isl_keep isl_multi_aff *multi, int pos);
3094         const char *isl_pw_multi_aff_get_dim_name(
3095                 __isl_keep isl_pw_multi_aff *pma,
3096                 enum isl_dim_type type, unsigned pos);
3097         __isl_give isl_id *isl_pw_multi_aff_get_dim_id(
3098                 __isl_keep isl_pw_multi_aff *pma,
3099                 enum isl_dim_type type, unsigned pos);
3100         const char *isl_multi_aff_get_tuple_name(
3101                 __isl_keep isl_multi_aff *multi,
3102                 enum isl_dim_type type);
3103         const char *isl_pw_multi_aff_get_tuple_name(
3104                 __isl_keep isl_pw_multi_aff *pma,
3105                 enum isl_dim_type type);
3106         int isl_pw_multi_aff_has_tuple_id(
3107                 __isl_keep isl_pw_multi_aff *pma,
3108                 enum isl_dim_type type);
3109         __isl_give isl_id *isl_pw_multi_aff_get_tuple_id(
3110                 __isl_keep isl_pw_multi_aff *pma,
3111                 enum isl_dim_type type);
3112
3113         int isl_pw_multi_aff_foreach_piece(
3114                 __isl_keep isl_pw_multi_aff *pma,
3115                 int (*fn)(__isl_take isl_set *set,
3116                             __isl_take isl_multi_aff *maff,
3117                             void *user), void *user);
3118
3119 It can be modified using
3120
3121         #include <isl/aff.h>
3122         __isl_give isl_multi_aff *isl_multi_aff_set_dim_name(
3123                 __isl_take isl_multi_aff *maff,
3124                 enum isl_dim_type type, unsigned pos, const char *s);
3125         __isl_give isl_pw_multi_aff *isl_pw_multi_aff_set_tuple_id(
3126                 __isl_take isl_pw_multi_aff *pma,
3127                 enum isl_dim_type type, __isl_take isl_id *id);
3128
3129 To check whether two multiple affine expressions are
3130 obviously equal to each other, use
3131
3132         int isl_multi_aff_plain_is_equal(__isl_keep isl_multi_aff *maff1,
3133                 __isl_keep isl_multi_aff *maff2);
3134         int isl_pw_multi_aff_plain_is_equal(
3135                 __isl_keep isl_pw_multi_aff *pma1,
3136                 __isl_keep isl_pw_multi_aff *pma2);
3137
3138 Operations include
3139
3140         #include <isl/aff.h>
3141         __isl_give isl_multi_aff *isl_multi_aff_add(
3142                 __isl_take isl_multi_aff *maff1,
3143                 __isl_take isl_multi_aff *maff2);
3144         __isl_give isl_pw_multi_aff *isl_pw_multi_aff_add(
3145                 __isl_take isl_pw_multi_aff *pma1,
3146                 __isl_take isl_pw_multi_aff *pma2);
3147         __isl_give isl_pw_multi_aff *isl_pw_multi_aff_union_add(
3148                 __isl_take isl_pw_multi_aff *pma1,
3149                 __isl_take isl_pw_multi_aff *pma2);
3150         __isl_give isl_multi_aff *isl_multi_aff_scale(
3151                 __isl_take isl_multi_aff *maff,
3152                 isl_int f);
3153         __isl_give isl_pw_multi_aff *isl_pw_multi_aff_intersect_params(
3154                 __isl_take isl_pw_multi_aff *pma,
3155                 __isl_take isl_set *set);
3156         __isl_give isl_pw_multi_aff *isl_pw_multi_aff_intersect_domain(
3157                 __isl_take isl_pw_multi_aff *pma,
3158                 __isl_take isl_set *set);
3159         __isl_give isl_multi_aff *isl_multi_aff_lift(
3160                 __isl_take isl_multi_aff *maff,
3161                 __isl_give isl_local_space **ls);
3162         __isl_give isl_multi_aff *isl_multi_aff_gist_params(
3163                 __isl_take isl_multi_aff *maff,
3164                 __isl_take isl_set *context);
3165         __isl_give isl_multi_aff *isl_multi_aff_gist(
3166                 __isl_take isl_multi_aff *maff,
3167                 __isl_take isl_set *context);
3168         __isl_give isl_pw_multi_aff *isl_pw_multi_aff_gist_params(
3169                 __isl_take isl_pw_multi_aff *pma,
3170                 __isl_take isl_set *set);
3171         __isl_give isl_pw_multi_aff *isl_pw_multi_aff_gist(
3172                 __isl_take isl_pw_multi_aff *pma,
3173                 __isl_take isl_set *set);
3174
3175 If the C<ls> argument of C<isl_multi_aff_lift> is not C<NULL>,
3176 then it is assigned the local space that lies at the basis of
3177 the lifting applied.
3178
3179 An expression can be read from input using
3180
3181         #include <isl/aff.h>
3182         __isl_give isl_multi_aff *isl_multi_aff_read_from_str(
3183                 isl_ctx *ctx, const char *str);
3184         __isl_give isl_pw_multi_aff *isl_pw_multi_aff_read_from_str(
3185                 isl_ctx *ctx, const char *str);
3186
3187 An expression can be printed using
3188
3189         #include <isl/aff.h>
3190         __isl_give isl_printer *isl_printer_print_multi_aff(
3191                 __isl_take isl_printer *p,
3192                 __isl_keep isl_multi_aff *maff);
3193         __isl_give isl_printer *isl_printer_print_pw_multi_aff(
3194                 __isl_take isl_printer *p,
3195                 __isl_keep isl_pw_multi_aff *pma);
3196
3197 =head2 Points
3198
3199 Points are elements of a set.  They can be used to construct
3200 simple sets (boxes) or they can be used to represent the
3201 individual elements of a set.
3202 The zero point (the origin) can be created using
3203
3204         __isl_give isl_point *isl_point_zero(__isl_take isl_space *space);
3205
3206 The coordinates of a point can be inspected, set and changed
3207 using
3208
3209         int isl_point_get_coordinate(__isl_keep isl_point *pnt,
3210                 enum isl_dim_type type, int pos, isl_int *v);
3211         __isl_give isl_point *isl_point_set_coordinate(
3212                 __isl_take isl_point *pnt,
3213                 enum isl_dim_type type, int pos, isl_int v);
3214
3215         __isl_give isl_point *isl_point_add_ui(
3216                 __isl_take isl_point *pnt,
3217                 enum isl_dim_type type, int pos, unsigned val);
3218         __isl_give isl_point *isl_point_sub_ui(
3219                 __isl_take isl_point *pnt,
3220                 enum isl_dim_type type, int pos, unsigned val);
3221
3222 Other properties can be obtained using
3223
3224         isl_ctx *isl_point_get_ctx(__isl_keep isl_point *pnt);
3225
3226 Points can be copied or freed using
3227
3228         __isl_give isl_point *isl_point_copy(
3229                 __isl_keep isl_point *pnt);
3230         void isl_point_free(__isl_take isl_point *pnt);
3231
3232 A singleton set can be created from a point using
3233
3234         __isl_give isl_basic_set *isl_basic_set_from_point(
3235                 __isl_take isl_point *pnt);
3236         __isl_give isl_set *isl_set_from_point(
3237                 __isl_take isl_point *pnt);
3238
3239 and a box can be created from two opposite extremal points using
3240
3241         __isl_give isl_basic_set *isl_basic_set_box_from_points(
3242                 __isl_take isl_point *pnt1,
3243                 __isl_take isl_point *pnt2);
3244         __isl_give isl_set *isl_set_box_from_points(
3245                 __isl_take isl_point *pnt1,
3246                 __isl_take isl_point *pnt2);
3247
3248 All elements of a B<bounded> (union) set can be enumerated using
3249 the following functions.
3250
3251         int isl_set_foreach_point(__isl_keep isl_set *set,
3252                 int (*fn)(__isl_take isl_point *pnt, void *user),
3253                 void *user);
3254         int isl_union_set_foreach_point(__isl_keep isl_union_set *uset,
3255                 int (*fn)(__isl_take isl_point *pnt, void *user),
3256                 void *user);
3257
3258 The function C<fn> is called for each integer point in
3259 C<set> with as second argument the last argument of
3260 the C<isl_set_foreach_point> call.  The function C<fn>
3261 should return C<0> on success and C<-1> on failure.
3262 In the latter case, C<isl_set_foreach_point> will stop
3263 enumerating and return C<-1> as well.
3264 If the enumeration is performed successfully and to completion,
3265 then C<isl_set_foreach_point> returns C<0>.
3266
3267 To obtain a single point of a (basic) set, use
3268
3269         __isl_give isl_point *isl_basic_set_sample_point(
3270                 __isl_take isl_basic_set *bset);
3271         __isl_give isl_point *isl_set_sample_point(
3272                 __isl_take isl_set *set);
3273
3274 If C<set> does not contain any (integer) points, then the
3275 resulting point will be ``void'', a property that can be
3276 tested using
3277
3278         int isl_point_is_void(__isl_keep isl_point *pnt);
3279
3280 =head2 Piecewise Quasipolynomials
3281
3282 A piecewise quasipolynomial is a particular kind of function that maps
3283 a parametric point to a rational value.
3284 More specifically, a quasipolynomial is a polynomial expression in greatest
3285 integer parts of affine expressions of parameters and variables.
3286 A piecewise quasipolynomial is a subdivision of a given parametric
3287 domain into disjoint cells with a quasipolynomial associated to
3288 each cell.  The value of the piecewise quasipolynomial at a given
3289 point is the value of the quasipolynomial associated to the cell
3290 that contains the point.  Outside of the union of cells,
3291 the value is assumed to be zero.
3292 For example, the piecewise quasipolynomial
3293
3294         [n] -> { [x] -> ((1 + n) - x) : x <= n and x >= 0 }
3295
3296 maps C<x> to C<1 + n - x> for values of C<x> between C<0> and C<n>.
3297 A given piecewise quasipolynomial has a fixed domain dimension.
3298 Union piecewise quasipolynomials are used to contain piecewise quasipolynomials
3299 defined over different domains.
3300 Piecewise quasipolynomials are mainly used by the C<barvinok>
3301 library for representing the number of elements in a parametric set or map.
3302 For example, the piecewise quasipolynomial above represents
3303 the number of points in the map
3304
3305         [n] -> { [x] -> [y] : x,y >= 0 and 0 <= x + y <= n }
3306
3307 =head3 Input and Output
3308
3309 Piecewise quasipolynomials can be read from input using
3310
3311         __isl_give isl_union_pw_qpolynomial *
3312         isl_union_pw_qpolynomial_read_from_str(
3313                 isl_ctx *ctx, const char *str);
3314
3315 Quasipolynomials and piecewise quasipolynomials can be printed
3316 using the following functions.
3317
3318         __isl_give isl_printer *isl_printer_print_qpolynomial(
3319                 __isl_take isl_printer *p,
3320                 __isl_keep isl_qpolynomial *qp);
3321
3322         __isl_give isl_printer *isl_printer_print_pw_qpolynomial(
3323                 __isl_take isl_printer *p,
3324                 __isl_keep isl_pw_qpolynomial *pwqp);
3325
3326         __isl_give isl_printer *isl_printer_print_union_pw_qpolynomial(
3327                 __isl_take isl_printer *p,
3328                 __isl_keep isl_union_pw_qpolynomial *upwqp);
3329
3330 The output format of the printer
3331 needs to be set to either C<ISL_FORMAT_ISL> or C<ISL_FORMAT_C>.
3332 For C<isl_printer_print_union_pw_qpolynomial>, only C<ISL_FORMAT_ISL>
3333 is supported.
3334 In case of printing in C<ISL_FORMAT_C>, the user may want
3335 to set the names of all dimensions
3336
3337         __isl_give isl_qpolynomial *isl_qpolynomial_set_dim_name(
3338                 __isl_take isl_qpolynomial *qp,
3339                 enum isl_dim_type type, unsigned pos,
3340                 const char *s);
3341         __isl_give isl_pw_qpolynomial *
3342         isl_pw_qpolynomial_set_dim_name(
3343                 __isl_take isl_pw_qpolynomial *pwqp,
3344                 enum isl_dim_type type, unsigned pos,
3345                 const char *s);
3346
3347 =head3 Creating New (Piecewise) Quasipolynomials
3348
3349 Some simple quasipolynomials can be created using the following functions.
3350 More complicated quasipolynomials can be created by applying
3351 operations such as addition and multiplication
3352 on the resulting quasipolynomials
3353
3354         __isl_give isl_qpolynomial *isl_qpolynomial_zero_on_domain(
3355                 __isl_take isl_space *domain);
3356         __isl_give isl_qpolynomial *isl_qpolynomial_one_on_domain(
3357                 __isl_take isl_space *domain);
3358         __isl_give isl_qpolynomial *isl_qpolynomial_infty_on_domain(
3359                 __isl_take isl_space *domain);
3360         __isl_give isl_qpolynomial *isl_qpolynomial_neginfty_on_domain(
3361                 __isl_take isl_space *domain);
3362         __isl_give isl_qpolynomial *isl_qpolynomial_nan_on_domain(
3363                 __isl_take isl_space *domain);
3364         __isl_give isl_qpolynomial *isl_qpolynomial_rat_cst_on_domain(
3365                 __isl_take isl_space *domain,
3366                 const isl_int n, const isl_int d);
3367         __isl_give isl_qpolynomial *isl_qpolynomial_var_on_domain(
3368                 __isl_take isl_space *domain,
3369                 enum isl_dim_type type, unsigned pos);
3370         __isl_give isl_qpolynomial *isl_qpolynomial_from_aff(
3371                 __isl_take isl_aff *aff);
3372
3373 Note that the space in which a quasipolynomial lives is a map space
3374 with a one-dimensional range.  The C<domain> argument in some of
3375 the functions above corresponds to the domain of this map space.
3376
3377 The zero piecewise quasipolynomial or a piecewise quasipolynomial
3378 with a single cell can be created using the following functions.
3379 Multiple of these single cell piecewise quasipolynomials can
3380 be combined to create more complicated piecewise quasipolynomials.
3381
3382         __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_zero(
3383                 __isl_take isl_space *space);
3384         __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_alloc(
3385                 __isl_take isl_set *set,
3386                 __isl_take isl_qpolynomial *qp);
3387         __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_from_qpolynomial(
3388                 __isl_take isl_qpolynomial *qp);
3389         __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_from_pw_aff(
3390                 __isl_take isl_pw_aff *pwaff);
3391
3392         __isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_zero(
3393                 __isl_take isl_space *space);
3394         __isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_from_pw_qpolynomial(
3395                 __isl_take isl_pw_qpolynomial *pwqp);
3396         __isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_add_pw_qpolynomial(
3397                 __isl_take isl_union_pw_qpolynomial *upwqp,
3398                 __isl_take isl_pw_qpolynomial *pwqp);
3399
3400 Quasipolynomials can be copied and freed again using the following
3401 functions.
3402
3403         __isl_give isl_qpolynomial *isl_qpolynomial_copy(
3404                 __isl_keep isl_qpolynomial *qp);
3405         void *isl_qpolynomial_free(__isl_take isl_qpolynomial *qp);
3406
3407         __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_copy(
3408                 __isl_keep isl_pw_qpolynomial *pwqp);
3409         void *isl_pw_qpolynomial_free(
3410                 __isl_take isl_pw_qpolynomial *pwqp);
3411
3412         __isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_copy(
3413                 __isl_keep isl_union_pw_qpolynomial *upwqp);
3414         void isl_union_pw_qpolynomial_free(
3415                 __isl_take isl_union_pw_qpolynomial *upwqp);
3416
3417 =head3 Inspecting (Piecewise) Quasipolynomials
3418
3419 To iterate over all piecewise quasipolynomials in a union
3420 piecewise quasipolynomial, use the following function
3421
3422         int isl_union_pw_qpolynomial_foreach_pw_qpolynomial(
3423                 __isl_keep isl_union_pw_qpolynomial *upwqp,
3424                 int (*fn)(__isl_take isl_pw_qpolynomial *pwqp, void *user),
3425                 void *user);
3426
3427 To extract the piecewise quasipolynomial in a given space from a union, use
3428
3429         __isl_give isl_pw_qpolynomial *
3430         isl_union_pw_qpolynomial_extract_pw_qpolynomial(
3431                 __isl_keep isl_union_pw_qpolynomial *upwqp,
3432                 __isl_take isl_space *space);
3433
3434 To iterate over the cells in a piecewise quasipolynomial,
3435 use either of the following two functions
3436
3437         int isl_pw_qpolynomial_foreach_piece(
3438                 __isl_keep isl_pw_qpolynomial *pwqp,
3439                 int (*fn)(__isl_take isl_set *set,
3440                           __isl_take isl_qpolynomial *qp,
3441                           void *user), void *user);
3442         int isl_pw_qpolynomial_foreach_lifted_piece(
3443                 __isl_keep isl_pw_qpolynomial *pwqp,
3444                 int (*fn)(__isl_take isl_set *set,
3445                           __isl_take isl_qpolynomial *qp,
3446                           void *user), void *user);
3447
3448 As usual, the function C<fn> should return C<0> on success
3449 and C<-1> on failure.  The difference between
3450 C<isl_pw_qpolynomial_foreach_piece> and
3451 C<isl_pw_qpolynomial_foreach_lifted_piece> is that
3452 C<isl_pw_qpolynomial_foreach_lifted_piece> will first
3453 compute unique representations for all existentially quantified
3454 variables and then turn these existentially quantified variables
3455 into extra set variables, adapting the associated quasipolynomial
3456 accordingly.  This means that the C<set> passed to C<fn>
3457 will not have any existentially quantified variables, but that
3458 the dimensions of the sets may be different for different
3459 invocations of C<fn>.
3460
3461 To iterate over all terms in a quasipolynomial,
3462 use
3463
3464         int isl_qpolynomial_foreach_term(
3465                 __isl_keep isl_qpolynomial *qp,
3466                 int (*fn)(__isl_take isl_term *term,
3467                           void *user), void *user);
3468
3469 The terms themselves can be inspected and freed using
3470 these functions
3471
3472         unsigned isl_term_dim(__isl_keep isl_term *term,
3473                 enum isl_dim_type type);
3474         void isl_term_get_num(__isl_keep isl_term *term,
3475                 isl_int *n);
3476         void isl_term_get_den(__isl_keep isl_term *term,
3477                 isl_int *d);
3478         int isl_term_get_exp(__isl_keep isl_term *term,
3479                 enum isl_dim_type type, unsigned pos);
3480         __isl_give isl_aff *isl_term_get_div(
3481                 __isl_keep isl_term *term, unsigned pos);
3482         void isl_term_free(__isl_take isl_term *term);
3483
3484 Each term is a product of parameters, set variables and
3485 integer divisions.  The function C<isl_term_get_exp>
3486 returns the exponent of a given dimensions in the given term.
3487 The C<isl_int>s in the arguments of C<isl_term_get_num>
3488 and C<isl_term_get_den> need to have been initialized
3489 using C<isl_int_init> before calling these functions.
3490
3491 =head3 Properties of (Piecewise) Quasipolynomials
3492
3493 To check whether a quasipolynomial is actually a constant,
3494 use the following function.
3495
3496         int isl_qpolynomial_is_cst(__isl_keep isl_qpolynomial *qp,
3497                 isl_int *n, isl_int *d);
3498
3499 If C<qp> is a constant and if C<n> and C<d> are not C<NULL>
3500 then the numerator and denominator of the constant
3501 are returned in C<*n> and C<*d>, respectively.
3502
3503 To check whether two union piecewise quasipolynomials are
3504 obviously equal, use
3505
3506         int isl_union_pw_qpolynomial_plain_is_equal(
3507                 __isl_keep isl_union_pw_qpolynomial *upwqp1,
3508                 __isl_keep isl_union_pw_qpolynomial *upwqp2);
3509
3510 =head3 Operations on (Piecewise) Quasipolynomials
3511
3512         __isl_give isl_qpolynomial *isl_qpolynomial_scale(
3513                 __isl_take isl_qpolynomial *qp, isl_int v);
3514         __isl_give isl_qpolynomial *isl_qpolynomial_neg(
3515                 __isl_take isl_qpolynomial *qp);
3516         __isl_give isl_qpolynomial *isl_qpolynomial_add(
3517                 __isl_take isl_qpolynomial *qp1,
3518                 __isl_take isl_qpolynomial *qp2);
3519         __isl_give isl_qpolynomial *isl_qpolynomial_sub(
3520                 __isl_take isl_qpolynomial *qp1,
3521                 __isl_take isl_qpolynomial *qp2);
3522         __isl_give isl_qpolynomial *isl_qpolynomial_mul(
3523                 __isl_take isl_qpolynomial *qp1,
3524                 __isl_take isl_qpolynomial *qp2);
3525         __isl_give isl_qpolynomial *isl_qpolynomial_pow(
3526                 __isl_take isl_qpolynomial *qp, unsigned exponent);
3527
3528         __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_add(
3529                 __isl_take isl_pw_qpolynomial *pwqp1,
3530                 __isl_take isl_pw_qpolynomial *pwqp2);
3531         __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_sub(
3532                 __isl_take isl_pw_qpolynomial *pwqp1,
3533                 __isl_take isl_pw_qpolynomial *pwqp2);
3534         __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_add_disjoint(
3535                 __isl_take isl_pw_qpolynomial *pwqp1,
3536                 __isl_take isl_pw_qpolynomial *pwqp2);
3537         __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_neg(
3538                 __isl_take isl_pw_qpolynomial *pwqp);
3539         __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_mul(
3540                 __isl_take isl_pw_qpolynomial *pwqp1,
3541                 __isl_take isl_pw_qpolynomial *pwqp2);
3542         __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_pow(
3543                 __isl_take isl_pw_qpolynomial *pwqp, unsigned exponent);
3544
3545         __isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_add(
3546                 __isl_take isl_union_pw_qpolynomial *upwqp1,
3547                 __isl_take isl_union_pw_qpolynomial *upwqp2);
3548         __isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_sub(
3549                 __isl_take isl_union_pw_qpolynomial *upwqp1,
3550                 __isl_take isl_union_pw_qpolynomial *upwqp2);
3551         __isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_mul(
3552                 __isl_take isl_union_pw_qpolynomial *upwqp1,
3553                 __isl_take isl_union_pw_qpolynomial *upwqp2);
3554
3555         __isl_give isl_qpolynomial *isl_pw_qpolynomial_eval(
3556                 __isl_take isl_pw_qpolynomial *pwqp,
3557                 __isl_take isl_point *pnt);
3558
3559         __isl_give isl_qpolynomial *isl_union_pw_qpolynomial_eval(
3560                 __isl_take isl_union_pw_qpolynomial *upwqp,
3561                 __isl_take isl_point *pnt);
3562
3563         __isl_give isl_set *isl_pw_qpolynomial_domain(
3564                 __isl_take isl_pw_qpolynomial *pwqp);
3565         __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_intersect_domain(
3566                 __isl_take isl_pw_qpolynomial *pwpq,
3567                 __isl_take isl_set *set);
3568         __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_intersect_params(
3569                 __isl_take isl_pw_qpolynomial *pwpq,
3570                 __isl_take isl_set *set);
3571
3572         __isl_give isl_union_set *isl_union_pw_qpolynomial_domain(
3573                 __isl_take isl_union_pw_qpolynomial *upwqp);
3574         __isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_intersect_domain(
3575                 __isl_take isl_union_pw_qpolynomial *upwpq,
3576                 __isl_take isl_union_set *uset);
3577         __isl_give isl_union_pw_qpolynomial *
3578         isl_union_pw_qpolynomial_intersect_params(
3579                 __isl_take isl_union_pw_qpolynomial *upwpq,
3580                 __isl_take isl_set *set);
3581
3582         __isl_give isl_qpolynomial *isl_qpolynomial_align_params(
3583                 __isl_take isl_qpolynomial *qp,
3584                 __isl_take isl_space *model);
3585
3586         __isl_give isl_qpolynomial *isl_qpolynomial_project_domain_on_params(
3587                 __isl_take isl_qpolynomial *qp);
3588         __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_project_domain_on_params(
3589                 __isl_take isl_pw_qpolynomial *pwqp);
3590
3591         __isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_coalesce(
3592                 __isl_take isl_union_pw_qpolynomial *upwqp);
3593
3594         __isl_give isl_qpolynomial *isl_qpolynomial_gist_params(
3595                 __isl_take isl_qpolynomial *qp,
3596                 __isl_take isl_set *context);
3597         __isl_give isl_qpolynomial *isl_qpolynomial_gist(
3598                 __isl_take isl_qpolynomial *qp,
3599                 __isl_take isl_set *context);
3600
3601         __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_gist_params(
3602                 __isl_take isl_pw_qpolynomial *pwqp,
3603                 __isl_take isl_set *context);
3604         __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_gist(
3605                 __isl_take isl_pw_qpolynomial *pwqp,
3606                 __isl_take isl_set *context);
3607
3608         __isl_give isl_union_pw_qpolynomial *
3609         isl_union_pw_qpolynomial_gist_params(
3610                 __isl_take isl_union_pw_qpolynomial *upwqp,
3611                 __isl_take isl_set *context);
3612         __isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_gist(
3613                 __isl_take isl_union_pw_qpolynomial *upwqp,
3614                 __isl_take isl_union_set *context);
3615
3616 The gist operation applies the gist operation to each of
3617 the cells in the domain of the input piecewise quasipolynomial.
3618 The context is also exploited
3619 to simplify the quasipolynomials associated to each cell.
3620
3621         __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_to_polynomial(
3622                 __isl_take isl_pw_qpolynomial *pwqp, int sign);
3623         __isl_give isl_union_pw_qpolynomial *
3624         isl_union_pw_qpolynomial_to_polynomial(
3625                 __isl_take isl_union_pw_qpolynomial *upwqp, int sign);
3626
3627 Approximate each quasipolynomial by a polynomial.  If C<sign> is positive,
3628 the polynomial will be an overapproximation.  If C<sign> is negative,
3629 it will be an underapproximation.  If C<sign> is zero, the approximation
3630 will lie somewhere in between.
3631
3632 =head2 Bounds on Piecewise Quasipolynomials and Piecewise Quasipolynomial Reductions
3633
3634 A piecewise quasipolynomial reduction is a piecewise
3635 reduction (or fold) of quasipolynomials.
3636 In particular, the reduction can be maximum or a minimum.
3637 The objects are mainly used to represent the result of
3638 an upper or lower bound on a quasipolynomial over its domain,
3639 i.e., as the result of the following function.
3640
3641         __isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_bound(
3642                 __isl_take isl_pw_qpolynomial *pwqp,
3643                 enum isl_fold type, int *tight);
3644
3645         __isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_bound(
3646                 __isl_take isl_union_pw_qpolynomial *upwqp,
3647                 enum isl_fold type, int *tight);
3648
3649 The C<type> argument may be either C<isl_fold_min> or C<isl_fold_max>.
3650 If C<tight> is not C<NULL>, then C<*tight> is set to C<1>
3651 is the returned bound is known be tight, i.e., for each value
3652 of the parameters there is at least
3653 one element in the domain that reaches the bound.
3654 If the domain of C<pwqp> is not wrapping, then the bound is computed
3655 over all elements in that domain and the result has a purely parametric
3656 domain.  If the domain of C<pwqp> is wrapping, then the bound is
3657 computed over the range of the wrapped relation.  The domain of the
3658 wrapped relation becomes the domain of the result.
3659
3660 A (piecewise) quasipolynomial reduction can be copied or freed using the
3661 following functions.
3662
3663         __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_copy(
3664                 __isl_keep isl_qpolynomial_fold *fold);
3665         __isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_copy(
3666                 __isl_keep isl_pw_qpolynomial_fold *pwf);
3667         __isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_copy(
3668                 __isl_keep isl_union_pw_qpolynomial_fold *upwf);
3669         void isl_qpolynomial_fold_free(
3670                 __isl_take isl_qpolynomial_fold *fold);
3671         void *isl_pw_qpolynomial_fold_free(
3672                 __isl_take isl_pw_qpolynomial_fold *pwf);
3673         void isl_union_pw_qpolynomial_fold_free(
3674                 __isl_take isl_union_pw_qpolynomial_fold *upwf);
3675
3676 =head3 Printing Piecewise Quasipolynomial Reductions
3677
3678 Piecewise quasipolynomial reductions can be printed
3679 using the following function.
3680
3681         __isl_give isl_printer *isl_printer_print_pw_qpolynomial_fold(
3682                 __isl_take isl_printer *p,
3683                 __isl_keep isl_pw_qpolynomial_fold *pwf);
3684         __isl_give isl_printer *isl_printer_print_union_pw_qpolynomial_fold(
3685                 __isl_take isl_printer *p,
3686                 __isl_keep isl_union_pw_qpolynomial_fold *upwf);
3687
3688 For C<isl_printer_print_pw_qpolynomial_fold>,
3689 output format of the printer
3690 needs to be set to either C<ISL_FORMAT_ISL> or C<ISL_FORMAT_C>.
3691 For C<isl_printer_print_union_pw_qpolynomial_fold>,
3692 output format of the printer
3693 needs to be set to C<ISL_FORMAT_ISL>.
3694 In case of printing in C<ISL_FORMAT_C>, the user may want
3695 to set the names of all dimensions
3696
3697         __isl_give isl_pw_qpolynomial_fold *
3698         isl_pw_qpolynomial_fold_set_dim_name(
3699                 __isl_take isl_pw_qpolynomial_fold *pwf,
3700                 enum isl_dim_type type, unsigned pos,
3701                 const char *s);
3702
3703 =head3 Inspecting (Piecewise) Quasipolynomial Reductions
3704
3705 To iterate over all piecewise quasipolynomial reductions in a union
3706 piecewise quasipolynomial reduction, use the following function
3707
3708         int isl_union_pw_qpolynomial_fold_foreach_pw_qpolynomial_fold(
3709                 __isl_keep isl_union_pw_qpolynomial_fold *upwf,
3710                 int (*fn)(__isl_take isl_pw_qpolynomial_fold *pwf,
3711                             void *user), void *user);
3712
3713 To iterate over the cells in a piecewise quasipolynomial reduction,
3714 use either of the following two functions
3715
3716         int isl_pw_qpolynomial_fold_foreach_piece(
3717                 __isl_keep isl_pw_qpolynomial_fold *pwf,
3718                 int (*fn)(__isl_take isl_set *set,
3719                           __isl_take isl_qpolynomial_fold *fold,
3720                           void *user), void *user);
3721         int isl_pw_qpolynomial_fold_foreach_lifted_piece(
3722                 __isl_keep isl_pw_qpolynomial_fold *pwf,
3723                 int (*fn)(__isl_take isl_set *set,
3724                           __isl_take isl_qpolynomial_fold *fold,
3725                           void *user), void *user);
3726
3727 See L<Inspecting (Piecewise) Quasipolynomials> for an explanation
3728 of the difference between these two functions.
3729
3730 To iterate over all quasipolynomials in a reduction, use
3731
3732         int isl_qpolynomial_fold_foreach_qpolynomial(
3733                 __isl_keep isl_qpolynomial_fold *fold,
3734                 int (*fn)(__isl_take isl_qpolynomial *qp,
3735                           void *user), void *user);
3736
3737 =head3 Properties of Piecewise Quasipolynomial Reductions
3738
3739 To check whether two union piecewise quasipolynomial reductions are
3740 obviously equal, use
3741
3742         int isl_union_pw_qpolynomial_fold_plain_is_equal(
3743                 __isl_keep isl_union_pw_qpolynomial_fold *upwf1,
3744                 __isl_keep isl_union_pw_qpolynomial_fold *upwf2);
3745
3746 =head3 Operations on Piecewise Quasipolynomial Reductions
3747
3748         __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_scale(
3749                 __isl_take isl_qpolynomial_fold *fold, isl_int v);
3750
3751         __isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_add(
3752                 __isl_take isl_pw_qpolynomial_fold *pwf1,
3753                 __isl_take isl_pw_qpolynomial_fold *pwf2);
3754
3755         __isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_fold(
3756                 __isl_take isl_pw_qpolynomial_fold *pwf1,
3757                 __isl_take isl_pw_qpolynomial_fold *pwf2);
3758
3759         __isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_fold(
3760                 __isl_take isl_union_pw_qpolynomial_fold *upwf1,
3761                 __isl_take isl_union_pw_qpolynomial_fold *upwf2);
3762
3763         __isl_give isl_qpolynomial *isl_pw_qpolynomial_fold_eval(
3764                 __isl_take isl_pw_qpolynomial_fold *pwf,
3765                 __isl_take isl_point *pnt);
3766
3767         __isl_give isl_qpolynomial *isl_union_pw_qpolynomial_fold_eval(
3768                 __isl_take isl_union_pw_qpolynomial_fold *upwf,
3769                 __isl_take isl_point *pnt);
3770
3771         __isl_give isl_pw_qpolynomial_fold *
3772         sl_pw_qpolynomial_fold_intersect_params(
3773                 __isl_take isl_pw_qpolynomial_fold *pwf,
3774                 __isl_take isl_set *set);
3775
3776         __isl_give isl_union_set *isl_union_pw_qpolynomial_fold_domain(
3777                 __isl_take isl_union_pw_qpolynomial_fold *upwf);
3778         __isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_intersect_domain(
3779                 __isl_take isl_union_pw_qpolynomial_fold *upwf,
3780                 __isl_take isl_union_set *uset);
3781         __isl_give isl_union_pw_qpolynomial_fold *
3782         isl_union_pw_qpolynomial_fold_intersect_params(
3783                 __isl_take isl_union_pw_qpolynomial_fold *upwf,
3784                 __isl_take isl_set *set);
3785
3786         __isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_project_domain_on_params(
3787                 __isl_take isl_pw_qpolynomial_fold *pwf);
3788
3789         __isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_coalesce(
3790                 __isl_take isl_pw_qpolynomial_fold *pwf);
3791
3792         __isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_coalesce(
3793                 __isl_take isl_union_pw_qpolynomial_fold *upwf);
3794
3795         __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_gist_params(
3796                 __isl_take isl_qpolynomial_fold *fold,
3797                 __isl_take isl_set *context);
3798         __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_gist(
3799                 __isl_take isl_qpolynomial_fold *fold,
3800                 __isl_take isl_set *context);
3801
3802         __isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_gist(
3803                 __isl_take isl_pw_qpolynomial_fold *pwf,
3804                 __isl_take isl_set *context);
3805         __isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_gist_params(
3806                 __isl_take isl_pw_qpolynomial_fold *pwf,
3807                 __isl_take isl_set *context);
3808
3809         __isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_gist(
3810                 __isl_take isl_union_pw_qpolynomial_fold *upwf,
3811                 __isl_take isl_union_set *context);
3812         __isl_give isl_union_pw_qpolynomial_fold *
3813         isl_union_pw_qpolynomial_fold_gist_params(
3814                 __isl_take isl_union_pw_qpolynomial_fold *upwf,
3815                 __isl_take isl_set *context);
3816
3817 The gist operation applies the gist operation to each of
3818 the cells in the domain of the input piecewise quasipolynomial reduction.
3819 In future, the operation will also exploit the context
3820 to simplify the quasipolynomial reductions associated to each cell.
3821
3822         __isl_give isl_pw_qpolynomial_fold *
3823         isl_set_apply_pw_qpolynomial_fold(
3824                 __isl_take isl_set *set,
3825                 __isl_take isl_pw_qpolynomial_fold *pwf,
3826                 int *tight);
3827         __isl_give isl_pw_qpolynomial_fold *
3828         isl_map_apply_pw_qpolynomial_fold(
3829                 __isl_take isl_map *map,
3830                 __isl_take isl_pw_qpolynomial_fold *pwf,
3831                 int *tight);
3832         __isl_give isl_union_pw_qpolynomial_fold *
3833         isl_union_set_apply_union_pw_qpolynomial_fold(
3834                 __isl_take isl_union_set *uset,
3835                 __isl_take isl_union_pw_qpolynomial_fold *upwf,
3836                 int *tight);
3837         __isl_give isl_union_pw_qpolynomial_fold *
3838         isl_union_map_apply_union_pw_qpolynomial_fold(
3839                 __isl_take isl_union_map *umap,
3840                 __isl_take isl_union_pw_qpolynomial_fold *upwf,
3841                 int *tight);
3842
3843 The functions taking a map
3844 compose the given map with the given piecewise quasipolynomial reduction.
3845 That is, compute a bound (of the same type as C<pwf> or C<upwf> itself)
3846 over all elements in the intersection of the range of the map
3847 and the domain of the piecewise quasipolynomial reduction
3848 as a function of an element in the domain of the map.
3849 The functions taking a set compute a bound over all elements in the
3850 intersection of the set and the domain of the
3851 piecewise quasipolynomial reduction.
3852
3853 =head2 Dependence Analysis
3854
3855 C<isl> contains specialized functionality for performing
3856 array dataflow analysis.  That is, given a I<sink> access relation
3857 and a collection of possible I<source> access relations,
3858 C<isl> can compute relations that describe
3859 for each iteration of the sink access, which iteration
3860 of which of the source access relations was the last
3861 to access the same data element before the given iteration
3862 of the sink access.
3863 The resulting dependence relations map source iterations
3864 to the corresponding sink iterations.
3865 To compute standard flow dependences, the sink should be
3866 a read, while the sources should be writes.
3867 If any of the source accesses are marked as being I<may>
3868 accesses, then there will be a dependence from the last
3869 I<must> access B<and> from any I<may> access that follows
3870 this last I<must> access.
3871 In particular, if I<all> sources are I<may> accesses,
3872 then memory based dependence analysis is performed.
3873 If, on the other hand, all sources are I<must> accesses,
3874 then value based dependence analysis is performed.
3875
3876         #include <isl/flow.h>
3877
3878         typedef int (*isl_access_level_before)(void *first, void *second);
3879
3880         __isl_give isl_access_info *isl_access_info_alloc(
3881                 __isl_take isl_map *sink,
3882                 void *sink_user, isl_access_level_before fn,
3883                 int max_source);
3884         __isl_give isl_access_info *isl_access_info_add_source(
3885                 __isl_take isl_access_info *acc,
3886                 __isl_take isl_map *source, int must,
3887                 void *source_user);
3888         void isl_access_info_free(__isl_take isl_access_info *acc);
3889
3890         __isl_give isl_flow *isl_access_info_compute_flow(
3891                 __isl_take isl_access_info *acc);
3892
3893         int isl_flow_foreach(__isl_keep isl_flow *deps,
3894                 int (*fn)(__isl_take isl_map *dep, int must,
3895                           void *dep_user, void *user),
3896                 void *user);
3897         __isl_give isl_map *isl_flow_get_no_source(
3898                 __isl_keep isl_flow *deps, int must);
3899         void isl_flow_free(__isl_take isl_flow *deps);
3900
3901 The function C<isl_access_info_compute_flow> performs the actual
3902 dependence analysis.  The other functions are used to construct
3903 the input for this function or to read off the output.
3904
3905 The input is collected in an C<isl_access_info>, which can
3906 be created through a call to C<isl_access_info_alloc>.
3907 The arguments to this functions are the sink access relation
3908 C<sink>, a token C<sink_user> used to identify the sink
3909 access to the user, a callback function for specifying the
3910 relative order of source and sink accesses, and the number
3911 of source access relations that will be added.
3912 The callback function has type C<int (*)(void *first, void *second)>.
3913 The function is called with two user supplied tokens identifying
3914 either a source or the sink and it should return the shared nesting
3915 level and the relative order of the two accesses.
3916 In particular, let I<n> be the number of loops shared by
3917 the two accesses.  If C<first> precedes C<second> textually,
3918 then the function should return I<2 * n + 1>; otherwise,
3919 it should return I<2 * n>.
3920 The sources can be added to the C<isl_access_info> by performing
3921 (at most) C<max_source> calls to C<isl_access_info_add_source>.
3922 C<must> indicates whether the source is a I<must> access
3923 or a I<may> access.  Note that a multi-valued access relation
3924 should only be marked I<must> if every iteration in the domain
3925 of the relation accesses I<all> elements in its image.
3926 The C<source_user> token is again used to identify
3927 the source access.  The range of the source access relation
3928 C<source> should have the same dimension as the range
3929 of the sink access relation.
3930 The C<isl_access_info_free> function should usually not be
3931 called explicitly, because it is called implicitly by
3932 C<isl_access_info_compute_flow>.
3933
3934 The result of the dependence analysis is collected in an
3935 C<isl_flow>.  There may be elements of
3936 the sink access for which no preceding source access could be
3937 found or for which all preceding sources are I<may> accesses.
3938 The relations containing these elements can be obtained through
3939 calls to C<isl_flow_get_no_source>, the first with C<must> set
3940 and the second with C<must> unset.
3941 In the case of standard flow dependence analysis,
3942 with the sink a read and the sources I<must> writes,
3943 the first relation corresponds to the reads from uninitialized
3944 array elements and the second relation is empty.
3945 The actual flow dependences can be extracted using
3946 C<isl_flow_foreach>.  This function will call the user-specified
3947 callback function C<fn> for each B<non-empty> dependence between
3948 a source and the sink.  The callback function is called
3949 with four arguments, the actual flow dependence relation
3950 mapping source iterations to sink iterations, a boolean that
3951 indicates whether it is a I<must> or I<may> dependence, a token
3952 identifying the source and an additional C<void *> with value
3953 equal to the third argument of the C<isl_flow_foreach> call.
3954 A dependence is marked I<must> if it originates from a I<must>
3955 source and if it is not followed by any I<may> sources.
3956
3957 After finishing with an C<isl_flow>, the user should call
3958 C<isl_flow_free> to free all associated memory.
3959
3960 A higher-level interface to dependence analysis is provided
3961 by the following function.
3962
3963         #include <isl/flow.h>
3964
3965         int isl_union_map_compute_flow(__isl_take isl_union_map *sink,
3966                 __isl_take isl_union_map *must_source,
3967                 __isl_take isl_union_map *may_source,
3968                 __isl_take isl_union_map *schedule,
3969                 __isl_give isl_union_map **must_dep,
3970                 __isl_give isl_union_map **may_dep,
3971                 __isl_give isl_union_map **must_no_source,
3972                 __isl_give isl_union_map **may_no_source);
3973
3974 The arrays are identified by the tuple names of the ranges
3975 of the accesses.  The iteration domains by the tuple names
3976 of the domains of the accesses and of the schedule.
3977 The relative order of the iteration domains is given by the
3978 schedule.  The relations returned through C<must_no_source>
3979 and C<may_no_source> are subsets of C<sink>.
3980 Any of C<must_dep>, C<may_dep>, C<must_no_source>
3981 or C<may_no_source> may be C<NULL>, but a C<NULL> value for
3982 any of the other arguments is treated as an error.
3983
3984 =head2 Scheduling
3985
3986 B<The functionality described in this section is fairly new
3987 and may be subject to change.>
3988
3989 The following function can be used to compute a schedule
3990 for a union of domains.  The generated schedule respects
3991 all C<validity> dependences.  That is, all dependence distances
3992 over these dependences in the scheduled space are lexicographically
3993 positive.  The generated schedule schedule also tries to minimize
3994 the dependence distances over C<proximity> dependences.
3995 Moreover, it tries to obtain sequences (bands) of schedule dimensions
3996 for groups of domains where the dependence distances have only
3997 non-negative values.
3998 The algorithm used to construct the schedule is similar to that
3999 of C<Pluto>.
4000
4001         #include <isl/schedule.h>
4002         __isl_give isl_schedule *isl_union_set_compute_schedule(
4003                 __isl_take isl_union_set *domain,
4004                 __isl_take isl_union_map *validity,
4005                 __isl_take isl_union_map *proximity);
4006         void *isl_schedule_free(__isl_take isl_schedule *sched);
4007
4008 A mapping from the domains to the scheduled space can be obtained
4009 from an C<isl_schedule> using the following function.
4010
4011         __isl_give isl_union_map *isl_schedule_get_map(
4012                 __isl_keep isl_schedule *sched);
4013
4014 A representation of the schedule can be printed using
4015          
4016         __isl_give isl_printer *isl_printer_print_schedule(
4017                 __isl_take isl_printer *p,
4018                 __isl_keep isl_schedule *schedule);
4019
4020 A representation of the schedule as a forest of bands can be obtained
4021 using the following function.
4022
4023         __isl_give isl_band_list *isl_schedule_get_band_forest(
4024                 __isl_keep isl_schedule *schedule);
4025
4026 The list can be manipulated as explained in L<"Lists">.
4027 The bands inside the list can be copied and freed using the following
4028 functions.
4029
4030         #include <isl/band.h>
4031         __isl_give isl_band *isl_band_copy(
4032                 __isl_keep isl_band *band);
4033         void *isl_band_free(__isl_take isl_band *band);
4034
4035 Each band contains zero or more scheduling dimensions.
4036 These are referred to as the members of the band.
4037 The section of the schedule that corresponds to the band is
4038 referred to as the partial schedule of the band.
4039 For those nodes that participate in a band, the outer scheduling
4040 dimensions form the prefix schedule, while the inner scheduling
4041 dimensions form the suffix schedule.
4042 That is, if we take a cut of the band forest, then the union of
4043 the concatenations of the prefix, partial and suffix schedules of
4044 each band in the cut is equal to the entire schedule (modulo
4045 some possible padding at the end with zero scheduling dimensions).
4046 The properties of a band can be inspected using the following functions.
4047
4048         #include <isl/band.h>
4049         isl_ctx *isl_band_get_ctx(__isl_keep isl_band *band);
4050
4051         int isl_band_has_children(__isl_keep isl_band *band);
4052         __isl_give isl_band_list *isl_band_get_children(
4053                 __isl_keep isl_band *band);
4054
4055         __isl_give isl_union_map *isl_band_get_prefix_schedule(
4056                 __isl_keep isl_band *band);
4057         __isl_give isl_union_map *isl_band_get_partial_schedule(
4058                 __isl_keep isl_band *band);
4059         __isl_give isl_union_map *isl_band_get_suffix_schedule(
4060                 __isl_keep isl_band *band);
4061
4062         int isl_band_n_member(__isl_keep isl_band *band);
4063         int isl_band_member_is_zero_distance(
4064                 __isl_keep isl_band *band, int pos);
4065
4066 Note that a scheduling dimension is considered to be ``zero
4067 distance'' if it does not carry any proximity dependences
4068 within its band.
4069 That is, if the dependence distances of the proximity
4070 dependences are all zero in that direction (for fixed
4071 iterations of outer bands).
4072
4073 A representation of the band can be printed using
4074
4075         #include <isl/band.h>
4076         __isl_give isl_printer *isl_printer_print_band(
4077                 __isl_take isl_printer *p,
4078                 __isl_keep isl_band *band);
4079
4080 =head3 Options
4081
4082         #include <isl/schedule.h>
4083         int isl_options_set_schedule_outer_zero_distance(
4084                 isl_ctx *ctx, int val);
4085         int isl_options_get_schedule_outer_zero_distance(
4086                 isl_ctx *ctx);
4087
4088 =over
4089
4090 =item * schedule_outer_zero_distance
4091
4092 It this option is set, then we try to construct schedules
4093 where the outermost scheduling dimension in each band
4094 results in a zero dependence distance over the proximity
4095 dependences.
4096
4097 =back
4098
4099 =head2 Parametric Vertex Enumeration
4100
4101 The parametric vertex enumeration described in this section
4102 is mainly intended to be used internally and by the C<barvinok>
4103 library.
4104
4105         #include <isl/vertices.h>
4106         __isl_give isl_vertices *isl_basic_set_compute_vertices(
4107                 __isl_keep isl_basic_set *bset);
4108
4109 The function C<isl_basic_set_compute_vertices> performs the
4110 actual computation of the parametric vertices and the chamber
4111 decomposition and store the result in an C<isl_vertices> object.
4112 This information can be queried by either iterating over all
4113 the vertices or iterating over all the chambers or cells
4114 and then iterating over all vertices that are active on the chamber.
4115
4116         int isl_vertices_foreach_vertex(
4117                 __isl_keep isl_vertices *vertices,
4118                 int (*fn)(__isl_take isl_vertex *vertex, void *user),
4119                 void *user);
4120
4121         int isl_vertices_foreach_cell(
4122                 __isl_keep isl_vertices *vertices,
4123                 int (*fn)(__isl_take isl_cell *cell, void *user),
4124                 void *user);
4125         int isl_cell_foreach_vertex(__isl_keep isl_cell *cell,
4126                 int (*fn)(__isl_take isl_vertex *vertex, void *user),
4127                 void *user);
4128
4129 Other operations that can be performed on an C<isl_vertices> object are
4130 the following.
4131
4132         isl_ctx *isl_vertices_get_ctx(
4133                 __isl_keep isl_vertices *vertices);
4134         int isl_vertices_get_n_vertices(
4135                 __isl_keep isl_vertices *vertices);
4136         void isl_vertices_free(__isl_take isl_vertices *vertices);
4137
4138 Vertices can be inspected and destroyed using the following functions.
4139
4140         isl_ctx *isl_vertex_get_ctx(__isl_keep isl_vertex *vertex);
4141         int isl_vertex_get_id(__isl_keep isl_vertex *vertex);
4142         __isl_give isl_basic_set *isl_vertex_get_domain(
4143                 __isl_keep isl_vertex *vertex);
4144         __isl_give isl_basic_set *isl_vertex_get_expr(
4145                 __isl_keep isl_vertex *vertex);
4146         void isl_vertex_free(__isl_take isl_vertex *vertex);
4147
4148 C<isl_vertex_get_expr> returns a singleton parametric set describing
4149 the vertex, while C<isl_vertex_get_domain> returns the activity domain
4150 of the vertex.
4151 Note that C<isl_vertex_get_domain> and C<isl_vertex_get_expr> return
4152 B<rational> basic sets, so they should mainly be used for inspection
4153 and should not be mixed with integer sets.
4154
4155 Chambers can be inspected and destroyed using the following functions.
4156
4157         isl_ctx *isl_cell_get_ctx(__isl_keep isl_cell *cell);
4158         __isl_give isl_basic_set *isl_cell_get_domain(
4159                 __isl_keep isl_cell *cell);
4160         void isl_cell_free(__isl_take isl_cell *cell);
4161
4162 =head1 Applications
4163
4164 Although C<isl> is mainly meant to be used as a library,
4165 it also contains some basic applications that use some
4166 of the functionality of C<isl>.
4167 The input may be specified in either the L<isl format>
4168 or the L<PolyLib format>.
4169
4170 =head2 C<isl_polyhedron_sample>
4171
4172 C<isl_polyhedron_sample> takes a polyhedron as input and prints
4173 an integer element of the polyhedron, if there is any.
4174 The first column in the output is the denominator and is always
4175 equal to 1.  If the polyhedron contains no integer points,
4176 then a vector of length zero is printed.
4177
4178 =head2 C<isl_pip>
4179
4180 C<isl_pip> takes the same input as the C<example> program
4181 from the C<piplib> distribution, i.e., a set of constraints
4182 on the parameters, a line containing only -1 and finally a set
4183 of constraints on a parametric polyhedron.
4184 The coefficients of the parameters appear in the last columns
4185 (but before the final constant column).
4186 The output is the lexicographic minimum of the parametric polyhedron.
4187 As C<isl> currently does not have its own output format, the output
4188 is just a dump of the internal state.
4189
4190 =head2 C<isl_polyhedron_minimize>
4191
4192 C<isl_polyhedron_minimize> computes the minimum of some linear
4193 or affine objective function over the integer points in a polyhedron.
4194 If an affine objective function
4195 is given, then the constant should appear in the last column.
4196
4197 =head2 C<isl_polytope_scan>
4198
4199 Given a polytope, C<isl_polytope_scan> prints
4200 all integer points in the polytope.