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