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