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