94a0fd6f1761891951fb3b4641c16e9e5ec2c880
[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 =item * The first argument of C<isl_pw_aff_cond> is now
164 an C<isl_pw_aff> instead of an C<isl_set>.
165 A call C<isl_pw_aff_cond(a, b, c)> can be replaced by
166
167         isl_pw_aff_cond(isl_set_indicator_function(a), b, c)
168
169 =back
170
171 =head3 Changes since isl-0.10
172
173 =over
174
175 =item * The functions C<isl_set_dim_has_lower_bound> and
176 C<isl_set_dim_has_upper_bound> have been renamed to
177 C<isl_set_dim_has_any_lower_bound> and
178 C<isl_set_dim_has_any_upper_bound>.
179 The new C<isl_set_dim_has_lower_bound> and
180 C<isl_set_dim_has_upper_bound> have slightly different meanings.
181
182 =back
183
184 =head1 License
185
186 C<isl> is released under the MIT license.
187
188 =over
189
190 Permission is hereby granted, free of charge, to any person obtaining a copy of
191 this software and associated documentation files (the "Software"), to deal in
192 the Software without restriction, including without limitation the rights to
193 use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
194 of the Software, and to permit persons to whom the Software is furnished to do
195 so, subject to the following conditions:
196
197 The above copyright notice and this permission notice shall be included in all
198 copies or substantial portions of the Software.
199
200 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
201 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
202 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
203 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
204 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
205 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
206 SOFTWARE.
207
208 =back
209
210 Note that C<isl> currently requires C<GMP>, which is released
211 under the GNU Lesser General Public License (LGPL).  This means
212 that code linked against C<isl> is also linked against LGPL code.
213
214 =head1 Installation
215
216 The source of C<isl> can be obtained either as a tarball
217 or from the git repository.  Both are available from
218 L<http://freshmeat.net/projects/isl/>.
219 The installation process depends on how you obtained
220 the source.
221
222 =head2 Installation from the git repository
223
224 =over
225
226 =item 1 Clone or update the repository
227
228 The first time the source is obtained, you need to clone
229 the repository.
230
231         git clone git://repo.or.cz/isl.git
232
233 To obtain updates, you need to pull in the latest changes
234
235         git pull
236
237 =item 2 Generate C<configure>
238
239         ./autogen.sh
240
241 =back
242
243 After performing the above steps, continue
244 with the L<Common installation instructions>.
245
246 =head2 Common installation instructions
247
248 =over
249
250 =item 1 Obtain C<GMP>
251
252 Building C<isl> requires C<GMP>, including its headers files.
253 Your distribution may not provide these header files by default
254 and you may need to install a package called C<gmp-devel> or something
255 similar.  Alternatively, C<GMP> can be built from
256 source, available from L<http://gmplib.org/>.
257
258 =item 2 Configure
259
260 C<isl> uses the standard C<autoconf> C<configure> script.
261 To run it, just type
262
263         ./configure
264
265 optionally followed by some configure options.
266 A complete list of options can be obtained by running
267
268         ./configure --help
269
270 Below we discuss some of the more common options.
271
272 C<isl> can optionally use C<piplib>, but no
273 C<piplib> functionality is currently used by default.
274 The C<--with-piplib> option can
275 be used to specify which C<piplib>
276 library to use, either an installed version (C<system>),
277 an externally built version (C<build>)
278 or no version (C<no>).  The option C<build> is mostly useful
279 in C<configure> scripts of larger projects that bundle both C<isl>
280 and C<piplib>.
281
282 =over
283
284 =item C<--prefix>
285
286 Installation prefix for C<isl>
287
288 =item C<--with-gmp-prefix>
289
290 Installation prefix for C<GMP> (architecture-independent files).
291
292 =item C<--with-gmp-exec-prefix>
293
294 Installation prefix for C<GMP> (architecture-dependent files).
295
296 =item C<--with-piplib>
297
298 Which copy of C<piplib> to use, either C<no> (default), C<system> or C<build>.
299
300 =item C<--with-piplib-prefix>
301
302 Installation prefix for C<system> C<piplib> (architecture-independent files).
303
304 =item C<--with-piplib-exec-prefix>
305
306 Installation prefix for C<system> C<piplib> (architecture-dependent files).
307
308 =item C<--with-piplib-builddir>
309
310 Location where C<build> C<piplib> was built.
311
312 =back
313
314 =item 3 Compile
315
316         make
317
318 =item 4 Install (optional)
319
320         make install
321
322 =back
323
324 =head1 Integer Set Library
325
326 =head2 Initialization
327
328 All manipulations of integer sets and relations occur within
329 the context of an C<isl_ctx>.
330 A given C<isl_ctx> can only be used within a single thread.
331 All arguments of a function are required to have been allocated
332 within the same context.
333 There are currently no functions available for moving an object
334 from one C<isl_ctx> to another C<isl_ctx>.  This means that
335 there is currently no way of safely moving an object from one
336 thread to another, unless the whole C<isl_ctx> is moved.
337
338 An C<isl_ctx> can be allocated using C<isl_ctx_alloc> and
339 freed using C<isl_ctx_free>.
340 All objects allocated within an C<isl_ctx> should be freed
341 before the C<isl_ctx> itself is freed.
342
343         isl_ctx *isl_ctx_alloc();
344         void isl_ctx_free(isl_ctx *ctx);
345
346 =head2 Values
347
348 An C<isl_val> represents an integer value, a rational value
349 or one of three special values, infinity, negative infinity and NaN.
350 Some predefined values can be created using the following functions.
351
352         #include <isl/val.h>
353         __isl_give isl_val *isl_val_zero(isl_ctx *ctx);
354         __isl_give isl_val *isl_val_one(isl_ctx *ctx);
355         __isl_give isl_val *isl_val_nan(isl_ctx *ctx);
356         __isl_give isl_val *isl_val_infty(isl_ctx *ctx);
357         __isl_give isl_val *isl_val_neginfty(isl_ctx *ctx);
358
359 Specific integer values can be created using the following functions.
360
361         #include <isl/val.h>
362         __isl_give isl_val *isl_val_int_from_si(isl_ctx *ctx,
363                 long i);
364         __isl_give isl_val *isl_val_int_from_ui(isl_ctx *ctx,
365                 unsigned long u);
366
367 They can be copied and freed using the following functions.
368
369         #include <isl/val.h>
370         __isl_give isl_val *isl_val_copy(__isl_keep isl_val *v);
371         void *isl_val_free(__isl_take isl_val *v);
372
373 They can be inspected using the following functions.
374
375         #include <isl/val.h>
376         isl_ctx *isl_val_get_ctx(__isl_keep isl_val *val);
377         long isl_val_get_num_si(__isl_keep isl_val *v);
378         long isl_val_get_den_si(__isl_keep isl_val *v);
379         double isl_val_get_d(__isl_keep isl_val *v);
380
381 Note that C<isl_val_get_num_si>, C<isl_val_get_den_si> and
382 C<isl_val_get_d> can only be applied to rational values.
383
384 An C<isl_val> can be modified using the following function.
385
386         #include <isl/val.h>
387         __isl_give isl_val *isl_val_set_si(__isl_take isl_val *v,
388                 long i);
389
390 The following unary properties are defined on C<isl_val>s.
391
392         #include <isl/val.h>
393         int isl_val_sgn(__isl_keep isl_val *v);
394         int isl_val_is_zero(__isl_keep isl_val *v);
395         int isl_val_is_one(__isl_keep isl_val *v);
396         int isl_val_is_negone(__isl_keep isl_val *v);
397         int isl_val_is_nonneg(__isl_keep isl_val *v);
398         int isl_val_is_nonpos(__isl_keep isl_val *v);
399         int isl_val_is_pos(__isl_keep isl_val *v);
400         int isl_val_is_neg(__isl_keep isl_val *v);
401         int isl_val_is_int(__isl_keep isl_val *v);
402         int isl_val_is_rat(__isl_keep isl_val *v);
403         int isl_val_is_nan(__isl_keep isl_val *v);
404         int isl_val_is_infty(__isl_keep isl_val *v);
405         int isl_val_is_neginfty(__isl_keep isl_val *v);
406
407 Note that the sign of NaN is undefined.
408
409 The following binary properties are defined on pairs of C<isl_val>s.
410
411         #include <isl/val.h>
412         int isl_val_lt(__isl_keep isl_val *v1,
413                 __isl_keep isl_val *v2);
414         int isl_val_le(__isl_keep isl_val *v1,
415                 __isl_keep isl_val *v2);
416         int isl_val_gt(__isl_keep isl_val *v1,
417                 __isl_keep isl_val *v2);
418         int isl_val_ge(__isl_keep isl_val *v1,
419                 __isl_keep isl_val *v2);
420         int isl_val_eq(__isl_keep isl_val *v1,
421                 __isl_keep isl_val *v2);
422         int isl_val_ne(__isl_keep isl_val *v1,
423                 __isl_keep isl_val *v2);
424
425 For integer C<isl_val>s we additionally have the following binary property.
426
427         #include <isl/val.h>
428         int isl_val_is_divisible_by(__isl_keep isl_val *v1,
429                 __isl_keep isl_val *v2);
430
431 An C<isl_val> can also be compared to an integer using the following
432 function.  The result is undefined for NaN.
433
434         #include <isl/val.h>
435         int isl_val_cmp_si(__isl_keep isl_val *v, long i);
436
437 The following unary operations are available on C<isl_val>s.
438
439         #include <isl/val.h>
440         __isl_give isl_val *isl_val_abs(__isl_take isl_val *v);
441         __isl_give isl_val *isl_val_neg(__isl_take isl_val *v);
442         __isl_give isl_val *isl_val_floor(__isl_take isl_val *v);
443         __isl_give isl_val *isl_val_ceil(__isl_take isl_val *v);
444         __isl_give isl_val *isl_val_trunc(__isl_take isl_val *v);
445
446 The following binary operations are available on C<isl_val>s.
447
448         #include <isl/val.h>
449         __isl_give isl_val *isl_val_abs(__isl_take isl_val *v);
450         __isl_give isl_val *isl_val_neg(__isl_take isl_val *v);
451         __isl_give isl_val *isl_val_floor(__isl_take isl_val *v);
452         __isl_give isl_val *isl_val_ceil(__isl_take isl_val *v);
453         __isl_give isl_val *isl_val_trunc(__isl_take isl_val *v);
454         __isl_give isl_val *isl_val_2exp(__isl_take isl_val *v);
455         __isl_give isl_val *isl_val_min(__isl_take isl_val *v1,
456                 __isl_take isl_val *v2);
457         __isl_give isl_val *isl_val_max(__isl_take isl_val *v1,
458                 __isl_take isl_val *v2);
459         __isl_give isl_val *isl_val_add(__isl_take isl_val *v1,
460                 __isl_take isl_val *v2);
461         __isl_give isl_val *isl_val_add_ui(__isl_take isl_val *v1,
462                 unsigned long v2);
463         __isl_give isl_val *isl_val_sub(__isl_take isl_val *v1,
464                 __isl_take isl_val *v2);
465         __isl_give isl_val *isl_val_sub_ui(__isl_take isl_val *v1,
466                 unsigned long v2);
467         __isl_give isl_val *isl_val_mul(__isl_take isl_val *v1,
468                 __isl_take isl_val *v2);
469         __isl_give isl_val *isl_val_mul_ui(__isl_take isl_val *v1,
470                 unsigned long v2);
471         __isl_give isl_val *isl_val_div(__isl_take isl_val *v1,
472                 __isl_take isl_val *v2);
473
474 On integer values, we additionally have the following operations.
475
476         #include <isl/val.h>
477         __isl_give isl_val *isl_val_2exp(__isl_take isl_val *v);
478         __isl_give isl_val *isl_val_mod(__isl_take isl_val *v1,
479                 __isl_take isl_val *v2);
480         __isl_give isl_val *isl_val_gcd(__isl_take isl_val *v1,
481                 __isl_take isl_val *v2);
482         __isl_give isl_val *isl_val_gcdext(__isl_take isl_val *v1,
483                 __isl_take isl_val *v2, __isl_give isl_val **x,
484                 __isl_give isl_val **y);
485
486 The function C<isl_val_gcdext> returns the greatest common divisor g
487 of C<v1> and C<v2> as well as two integers C<*x> and C<*y> such
488 that C<*x> * C<v1> + C<*y> * C<v2> = g.
489
490 A value can be read from input using
491
492         #include <isl/val.h>
493         __isl_give isl_val *isl_val_read_from_str(isl_ctx *ctx,
494                 const char *str);
495
496 A value can be printed using
497
498         #include <isl/val.h>
499         __isl_give isl_printer *isl_printer_print_val(
500                 __isl_take isl_printer *p, __isl_keep isl_val *v);
501
502 =head2 Integers (obsolescent)
503
504 All operations on integers, mainly the coefficients
505 of the constraints describing the sets and relations,
506 are performed in exact integer arithmetic using C<GMP>.
507 However, to allow future versions of C<isl> to optionally
508 support fixed integer arithmetic, all calls to C<GMP>
509 are wrapped inside C<isl> specific macros.
510 The basic type is C<isl_int> and the operations below
511 are available on this type.
512 The meanings of these operations are essentially the same
513 as their C<GMP> C<mpz_> counterparts.
514 As always with C<GMP> types, C<isl_int>s need to be
515 initialized with C<isl_int_init> before they can be used
516 and they need to be released with C<isl_int_clear>
517 after the last use.
518 The user should not assume that an C<isl_int> is represented
519 as a C<mpz_t>, but should instead explicitly convert between
520 C<mpz_t>s and C<isl_int>s using C<isl_int_set_gmp> and
521 C<isl_int_get_gmp> whenever a C<mpz_t> is required.
522
523 =over
524
525 =item isl_int_init(i)
526
527 =item isl_int_clear(i)
528
529 =item isl_int_set(r,i)
530
531 =item isl_int_set_si(r,i)
532
533 =item isl_int_set_gmp(r,g)
534
535 =item isl_int_get_gmp(i,g)
536
537 =item isl_int_abs(r,i)
538
539 =item isl_int_neg(r,i)
540
541 =item isl_int_swap(i,j)
542
543 =item isl_int_swap_or_set(i,j)
544
545 =item isl_int_add_ui(r,i,j)
546
547 =item isl_int_sub_ui(r,i,j)
548
549 =item isl_int_add(r,i,j)
550
551 =item isl_int_sub(r,i,j)
552
553 =item isl_int_mul(r,i,j)
554
555 =item isl_int_mul_ui(r,i,j)
556
557 =item isl_int_addmul(r,i,j)
558
559 =item isl_int_submul(r,i,j)
560
561 =item isl_int_gcd(r,i,j)
562
563 =item isl_int_lcm(r,i,j)
564
565 =item isl_int_divexact(r,i,j)
566
567 =item isl_int_cdiv_q(r,i,j)
568
569 =item isl_int_fdiv_q(r,i,j)
570
571 =item isl_int_fdiv_r(r,i,j)
572
573 =item isl_int_fdiv_q_ui(r,i,j)
574
575 =item isl_int_read(r,s)
576
577 =item isl_int_print(out,i,width)
578
579 =item isl_int_sgn(i)
580
581 =item isl_int_cmp(i,j)
582
583 =item isl_int_cmp_si(i,si)
584
585 =item isl_int_eq(i,j)
586
587 =item isl_int_ne(i,j)
588
589 =item isl_int_lt(i,j)
590
591 =item isl_int_le(i,j)
592
593 =item isl_int_gt(i,j)
594
595 =item isl_int_ge(i,j)
596
597 =item isl_int_abs_eq(i,j)
598
599 =item isl_int_abs_ne(i,j)
600
601 =item isl_int_abs_lt(i,j)
602
603 =item isl_int_abs_gt(i,j)
604
605 =item isl_int_abs_ge(i,j)
606
607 =item isl_int_is_zero(i)
608
609 =item isl_int_is_one(i)
610
611 =item isl_int_is_negone(i)
612
613 =item isl_int_is_pos(i)
614
615 =item isl_int_is_neg(i)
616
617 =item isl_int_is_nonpos(i)
618
619 =item isl_int_is_nonneg(i)
620
621 =item isl_int_is_divisible_by(i,j)
622
623 =back
624
625 =head2 Sets and Relations
626
627 C<isl> uses six types of objects for representing sets and relations,
628 C<isl_basic_set>, C<isl_basic_map>, C<isl_set>, C<isl_map>,
629 C<isl_union_set> and C<isl_union_map>.
630 C<isl_basic_set> and C<isl_basic_map> represent sets and relations that
631 can be described as a conjunction of affine constraints, while
632 C<isl_set> and C<isl_map> represent unions of
633 C<isl_basic_set>s and C<isl_basic_map>s, respectively.
634 However, all C<isl_basic_set>s or C<isl_basic_map>s in the union need
635 to live in the same space.  C<isl_union_set>s and C<isl_union_map>s
636 represent unions of C<isl_set>s or C<isl_map>s in I<different> spaces,
637 where spaces are considered different if they have a different number
638 of dimensions and/or different names (see L<"Spaces">).
639 The difference between sets and relations (maps) is that sets have
640 one set of variables, while relations have two sets of variables,
641 input variables and output variables.
642
643 =head2 Memory Management
644
645 Since a high-level operation on sets and/or relations usually involves
646 several substeps and since the user is usually not interested in
647 the intermediate results, most functions that return a new object
648 will also release all the objects passed as arguments.
649 If the user still wants to use one or more of these arguments
650 after the function call, she should pass along a copy of the
651 object rather than the object itself.
652 The user is then responsible for making sure that the original
653 object gets used somewhere else or is explicitly freed.
654
655 The arguments and return values of all documented functions are
656 annotated to make clear which arguments are released and which
657 arguments are preserved.  In particular, the following annotations
658 are used
659
660 =over
661
662 =item C<__isl_give>
663
664 C<__isl_give> means that a new object is returned.
665 The user should make sure that the returned pointer is
666 used exactly once as a value for an C<__isl_take> argument.
667 In between, it can be used as a value for as many
668 C<__isl_keep> arguments as the user likes.
669 There is one exception, and that is the case where the
670 pointer returned is C<NULL>.  Is this case, the user
671 is free to use it as an C<__isl_take> argument or not.
672
673 =item C<__isl_take>
674
675 C<__isl_take> means that the object the argument points to
676 is taken over by the function and may no longer be used
677 by the user as an argument to any other function.
678 The pointer value must be one returned by a function
679 returning an C<__isl_give> pointer.
680 If the user passes in a C<NULL> value, then this will
681 be treated as an error in the sense that the function will
682 not perform its usual operation.  However, it will still
683 make sure that all the other C<__isl_take> arguments
684 are released.
685
686 =item C<__isl_keep>
687
688 C<__isl_keep> means that the function will only use the object
689 temporarily.  After the function has finished, the user
690 can still use it as an argument to other functions.
691 A C<NULL> value will be treated in the same way as
692 a C<NULL> value for an C<__isl_take> argument.
693
694 =back
695
696 =head2 Error Handling
697
698 C<isl> supports different ways to react in case a runtime error is triggered.
699 Runtime errors arise, e.g., if a function such as C<isl_map_intersect> is called
700 with two maps that have incompatible spaces. There are three possible ways
701 to react on error: to warn, to continue or to abort.
702
703 The default behavior is to warn. In this mode, C<isl> prints a warning, stores
704 the last error in the corresponding C<isl_ctx> and the function in which the
705 error was triggered returns C<NULL>. An error does not corrupt internal state,
706 such that isl can continue to be used. C<isl> also provides functions to
707 read the last error and to reset the memory that stores the last error. The
708 last error is only stored for information purposes. Its presence does not
709 change the behavior of C<isl>. Hence, resetting an error is not required to
710 continue to use isl, but only to observe new errors.
711
712         #include <isl/ctx.h>
713         enum isl_error isl_ctx_last_error(isl_ctx *ctx);
714         void isl_ctx_reset_error(isl_ctx *ctx);
715
716 Another option is to continue on error. This is similar to warn on error mode,
717 except that C<isl> does not print any warning. This allows a program to
718 implement its own error reporting.
719
720 The last option is to directly abort the execution of the program from within
721 the isl library. This makes it obviously impossible to recover from an error,
722 but it allows to directly spot the error location. By aborting on error,
723 debuggers break at the location the error occurred and can provide a stack
724 trace. Other tools that automatically provide stack traces on abort or that do
725 not want to continue execution after an error was triggered may also prefer to
726 abort on error.
727
728 The on error behavior of isl can be specified by calling
729 C<isl_options_set_on_error> or by setting the command line option
730 C<--isl-on-error>. Valid arguments for the function call are
731 C<ISL_ON_ERROR_WARN>, C<ISL_ON_ERROR_CONTINUE> and C<ISL_ON_ERROR_ABORT>. The
732 choices for the command line option are C<warn>, C<continue> and C<abort>.
733 It is also possible to query the current error mode.
734
735         #include <isl/options.h>
736         int isl_options_set_on_error(isl_ctx *ctx, int val);
737         int isl_options_get_on_error(isl_ctx *ctx);
738
739 =head2 Identifiers
740
741 Identifiers are used to identify both individual dimensions
742 and tuples of dimensions.  They consist of an optional name and an optional
743 user pointer.  The name and the user pointer cannot both be C<NULL>, however.
744 Identifiers with the same name but different pointer values
745 are considered to be distinct.
746 Similarly, identifiers with different names but the same pointer value
747 are also considered to be distinct.
748 Equal identifiers are represented using the same object.
749 Pairs of identifiers can therefore be tested for equality using the
750 C<==> operator.
751 Identifiers can be constructed, copied, freed, inspected and printed
752 using the following functions.
753
754         #include <isl/id.h>
755         __isl_give isl_id *isl_id_alloc(isl_ctx *ctx,
756                 __isl_keep const char *name, void *user);
757         __isl_give isl_id *isl_id_set_free_user(
758                 __isl_take isl_id *id,
759                 __isl_give void (*free_user)(void *user));
760         __isl_give isl_id *isl_id_copy(isl_id *id);
761         void *isl_id_free(__isl_take isl_id *id);
762
763         isl_ctx *isl_id_get_ctx(__isl_keep isl_id *id);
764         void *isl_id_get_user(__isl_keep isl_id *id);
765         __isl_keep const char *isl_id_get_name(__isl_keep isl_id *id);
766
767         __isl_give isl_printer *isl_printer_print_id(
768                 __isl_take isl_printer *p, __isl_keep isl_id *id);
769
770 The callback set by C<isl_id_set_free_user> is called on the user
771 pointer when the last reference to the C<isl_id> is freed.
772 Note that C<isl_id_get_name> returns a pointer to some internal
773 data structure, so the result can only be used while the
774 corresponding C<isl_id> is alive.
775
776 =head2 Spaces
777
778 Whenever a new set, relation or similiar object is created from scratch,
779 the space in which it lives needs to be specified using an C<isl_space>.
780 Each space involves zero or more parameters and zero, one or two
781 tuples of set or input/output dimensions.  The parameters and dimensions
782 are identified by an C<isl_dim_type> and a position.
783 The type C<isl_dim_param> refers to parameters,
784 the type C<isl_dim_set> refers to set dimensions (for spaces
785 with a single tuple of dimensions) and the types C<isl_dim_in>
786 and C<isl_dim_out> refer to input and output dimensions
787 (for spaces with two tuples of dimensions).
788 Local spaces (see L</"Local Spaces">) also contain dimensions
789 of type C<isl_dim_div>.
790 Note that parameters are only identified by their position within
791 a given object.  Across different objects, parameters are (usually)
792 identified by their names or identifiers.  Only unnamed parameters
793 are identified by their positions across objects.  The use of unnamed
794 parameters is discouraged.
795
796         #include <isl/space.h>
797         __isl_give isl_space *isl_space_alloc(isl_ctx *ctx,
798                 unsigned nparam, unsigned n_in, unsigned n_out);
799         __isl_give isl_space *isl_space_params_alloc(isl_ctx *ctx,
800                 unsigned nparam);
801         __isl_give isl_space *isl_space_set_alloc(isl_ctx *ctx,
802                 unsigned nparam, unsigned dim);
803         __isl_give isl_space *isl_space_copy(__isl_keep isl_space *space);
804         void *isl_space_free(__isl_take isl_space *space);
805         unsigned isl_space_dim(__isl_keep isl_space *space,
806                 enum isl_dim_type type);
807
808 The space used for creating a parameter domain
809 needs to be created using C<isl_space_params_alloc>.
810 For other sets, the space
811 needs to be created using C<isl_space_set_alloc>, while
812 for a relation, the space
813 needs to be created using C<isl_space_alloc>.
814 C<isl_space_dim> can be used
815 to find out the number of dimensions of each type in
816 a space, where type may be
817 C<isl_dim_param>, C<isl_dim_in> (only for relations),
818 C<isl_dim_out> (only for relations), C<isl_dim_set>
819 (only for sets) or C<isl_dim_all>.
820
821 To check whether a given space is that of a set or a map
822 or whether it is a parameter space, use these functions:
823
824         #include <isl/space.h>
825         int isl_space_is_params(__isl_keep isl_space *space);
826         int isl_space_is_set(__isl_keep isl_space *space);
827         int isl_space_is_map(__isl_keep isl_space *space);
828
829 Spaces can be compared using the following functions:
830
831         #include <isl/space.h>
832         int isl_space_is_equal(__isl_keep isl_space *space1,
833                 __isl_keep isl_space *space2);
834         int isl_space_is_domain(__isl_keep isl_space *space1,
835                 __isl_keep isl_space *space2);
836         int isl_space_is_range(__isl_keep isl_space *space1,
837                 __isl_keep isl_space *space2);
838
839 C<isl_space_is_domain> checks whether the first argument is equal
840 to the domain of the second argument.  This requires in particular that
841 the first argument is a set space and that the second argument
842 is a map space.
843
844 It is often useful to create objects that live in the
845 same space as some other object.  This can be accomplished
846 by creating the new objects
847 (see L<Creating New Sets and Relations> or
848 L<Creating New (Piecewise) Quasipolynomials>) based on the space
849 of the original object.
850
851         #include <isl/set.h>
852         __isl_give isl_space *isl_basic_set_get_space(
853                 __isl_keep isl_basic_set *bset);
854         __isl_give isl_space *isl_set_get_space(__isl_keep isl_set *set);
855
856         #include <isl/union_set.h>
857         __isl_give isl_space *isl_union_set_get_space(
858                 __isl_keep isl_union_set *uset);
859
860         #include <isl/map.h>
861         __isl_give isl_space *isl_basic_map_get_space(
862                 __isl_keep isl_basic_map *bmap);
863         __isl_give isl_space *isl_map_get_space(__isl_keep isl_map *map);
864
865         #include <isl/union_map.h>
866         __isl_give isl_space *isl_union_map_get_space(
867                 __isl_keep isl_union_map *umap);
868
869         #include <isl/constraint.h>
870         __isl_give isl_space *isl_constraint_get_space(
871                 __isl_keep isl_constraint *constraint);
872
873         #include <isl/polynomial.h>
874         __isl_give isl_space *isl_qpolynomial_get_domain_space(
875                 __isl_keep isl_qpolynomial *qp);
876         __isl_give isl_space *isl_qpolynomial_get_space(
877                 __isl_keep isl_qpolynomial *qp);
878         __isl_give isl_space *isl_qpolynomial_fold_get_space(
879                 __isl_keep isl_qpolynomial_fold *fold);
880         __isl_give isl_space *isl_pw_qpolynomial_get_domain_space(
881                 __isl_keep isl_pw_qpolynomial *pwqp);
882         __isl_give isl_space *isl_pw_qpolynomial_get_space(
883                 __isl_keep isl_pw_qpolynomial *pwqp);
884         __isl_give isl_space *isl_pw_qpolynomial_fold_get_domain_space(
885                 __isl_keep isl_pw_qpolynomial_fold *pwf);
886         __isl_give isl_space *isl_pw_qpolynomial_fold_get_space(
887                 __isl_keep isl_pw_qpolynomial_fold *pwf);
888         __isl_give isl_space *isl_union_pw_qpolynomial_get_space(
889                 __isl_keep isl_union_pw_qpolynomial *upwqp);
890         __isl_give isl_space *isl_union_pw_qpolynomial_fold_get_space(
891                 __isl_keep isl_union_pw_qpolynomial_fold *upwf);
892
893         #include <isl/aff.h>
894         __isl_give isl_space *isl_aff_get_domain_space(
895                 __isl_keep isl_aff *aff);
896         __isl_give isl_space *isl_aff_get_space(
897                 __isl_keep isl_aff *aff);
898         __isl_give isl_space *isl_pw_aff_get_domain_space(
899                 __isl_keep isl_pw_aff *pwaff);
900         __isl_give isl_space *isl_pw_aff_get_space(
901                 __isl_keep isl_pw_aff *pwaff);
902         __isl_give isl_space *isl_multi_aff_get_domain_space(
903                 __isl_keep isl_multi_aff *maff);
904         __isl_give isl_space *isl_multi_aff_get_space(
905                 __isl_keep isl_multi_aff *maff);
906         __isl_give isl_space *isl_pw_multi_aff_get_domain_space(
907                 __isl_keep isl_pw_multi_aff *pma);
908         __isl_give isl_space *isl_pw_multi_aff_get_space(
909                 __isl_keep isl_pw_multi_aff *pma);
910         __isl_give isl_space *isl_union_pw_multi_aff_get_space(
911                 __isl_keep isl_union_pw_multi_aff *upma);
912         __isl_give isl_space *isl_multi_pw_aff_get_domain_space(
913                 __isl_keep isl_multi_pw_aff *mpa);
914         __isl_give isl_space *isl_multi_pw_aff_get_space(
915                 __isl_keep isl_multi_pw_aff *mpa);
916
917         #include <isl/point.h>
918         __isl_give isl_space *isl_point_get_space(
919                 __isl_keep isl_point *pnt);
920
921 The identifiers or names of the individual dimensions may be set or read off
922 using the following functions.
923
924         #include <isl/space.h>
925         __isl_give isl_space *isl_space_set_dim_id(
926                 __isl_take isl_space *space,
927                 enum isl_dim_type type, unsigned pos,
928                 __isl_take isl_id *id);
929         int isl_space_has_dim_id(__isl_keep isl_space *space,
930                 enum isl_dim_type type, unsigned pos);
931         __isl_give isl_id *isl_space_get_dim_id(
932                 __isl_keep isl_space *space,
933                 enum isl_dim_type type, unsigned pos);
934         __isl_give isl_space *isl_space_set_dim_name(
935                 __isl_take isl_space *space,
936                  enum isl_dim_type type, unsigned pos,
937                  __isl_keep const char *name);
938         int isl_space_has_dim_name(__isl_keep isl_space *space,
939                 enum isl_dim_type type, unsigned pos);
940         __isl_keep const char *isl_space_get_dim_name(
941                 __isl_keep isl_space *space,
942                 enum isl_dim_type type, unsigned pos);
943
944 Note that C<isl_space_get_name> returns a pointer to some internal
945 data structure, so the result can only be used while the
946 corresponding C<isl_space> is alive.
947 Also note that every function that operates on two sets or relations
948 requires that both arguments have the same parameters.  This also
949 means that if one of the arguments has named parameters, then the
950 other needs to have named parameters too and the names need to match.
951 Pairs of C<isl_set>, C<isl_map>, C<isl_union_set> and/or C<isl_union_map>
952 arguments may have different parameters (as long as they are named),
953 in which case the result will have as parameters the union of the parameters of
954 the arguments.
955
956 Given the identifier or name of a dimension (typically a parameter),
957 its position can be obtained from the following function.
958
959         #include <isl/space.h>
960         int isl_space_find_dim_by_id(__isl_keep isl_space *space,
961                 enum isl_dim_type type, __isl_keep isl_id *id);
962         int isl_space_find_dim_by_name(__isl_keep isl_space *space,
963                 enum isl_dim_type type, const char *name);
964
965 The identifiers or names of entire spaces may be set or read off
966 using the following functions.
967
968         #include <isl/space.h>
969         __isl_give isl_space *isl_space_set_tuple_id(
970                 __isl_take isl_space *space,
971                 enum isl_dim_type type, __isl_take isl_id *id);
972         __isl_give isl_space *isl_space_reset_tuple_id(
973                 __isl_take isl_space *space, enum isl_dim_type type);
974         int isl_space_has_tuple_id(__isl_keep isl_space *space,
975                 enum isl_dim_type type);
976         __isl_give isl_id *isl_space_get_tuple_id(
977                 __isl_keep isl_space *space, enum isl_dim_type type);
978         __isl_give isl_space *isl_space_set_tuple_name(
979                 __isl_take isl_space *space,
980                 enum isl_dim_type type, const char *s);
981         int isl_space_has_tuple_name(__isl_keep isl_space *space,
982                 enum isl_dim_type type);
983         const char *isl_space_get_tuple_name(__isl_keep isl_space *space,
984                 enum isl_dim_type type);
985
986 The C<type> argument needs to be one of C<isl_dim_in>, C<isl_dim_out>
987 or C<isl_dim_set>.  As with C<isl_space_get_name>,
988 the C<isl_space_get_tuple_name> function returns a pointer to some internal
989 data structure.
990 Binary operations require the corresponding spaces of their arguments
991 to have the same name.
992
993 Spaces can be nested.  In particular, the domain of a set or
994 the domain or range of a relation can be a nested relation.
995 The following functions can be used to construct and deconstruct
996 such nested spaces.
997
998         #include <isl/space.h>
999         int isl_space_is_wrapping(__isl_keep isl_space *space);
1000         __isl_give isl_space *isl_space_wrap(__isl_take isl_space *space);
1001         __isl_give isl_space *isl_space_unwrap(__isl_take isl_space *space);
1002
1003 The input to C<isl_space_is_wrapping> and C<isl_space_unwrap> should
1004 be the space of a set, while that of
1005 C<isl_space_wrap> should be the space of a relation.
1006 Conversely, the output of C<isl_space_unwrap> is the space
1007 of a relation, while that of C<isl_space_wrap> is the space of a set.
1008
1009 Spaces can be created from other spaces
1010 using the following functions.
1011
1012         __isl_give isl_space *isl_space_domain(__isl_take isl_space *space);
1013         __isl_give isl_space *isl_space_from_domain(__isl_take isl_space *space);
1014         __isl_give isl_space *isl_space_range(__isl_take isl_space *space);
1015         __isl_give isl_space *isl_space_from_range(__isl_take isl_space *space);
1016         __isl_give isl_space *isl_space_params(
1017                 __isl_take isl_space *space);
1018         __isl_give isl_space *isl_space_set_from_params(
1019                 __isl_take isl_space *space);
1020         __isl_give isl_space *isl_space_reverse(__isl_take isl_space *space);
1021         __isl_give isl_space *isl_space_join(__isl_take isl_space *left,
1022                 __isl_take isl_space *right);
1023         __isl_give isl_space *isl_space_align_params(
1024                 __isl_take isl_space *space1, __isl_take isl_space *space2)
1025         __isl_give isl_space *isl_space_insert_dims(__isl_take isl_space *space,
1026                 enum isl_dim_type type, unsigned pos, unsigned n);
1027         __isl_give isl_space *isl_space_add_dims(__isl_take isl_space *space,
1028                 enum isl_dim_type type, unsigned n);
1029         __isl_give isl_space *isl_space_drop_dims(__isl_take isl_space *space,
1030                 enum isl_dim_type type, unsigned first, unsigned n);
1031         __isl_give isl_space *isl_space_move_dims(__isl_take isl_space *space,
1032                 enum isl_dim_type dst_type, unsigned dst_pos,
1033                 enum isl_dim_type src_type, unsigned src_pos,
1034                 unsigned n);
1035         __isl_give isl_space *isl_space_map_from_set(
1036                 __isl_take isl_space *space);
1037         __isl_give isl_space *isl_space_map_from_domain_and_range(
1038                 __isl_take isl_space *domain,
1039                 __isl_take isl_space *range);
1040         __isl_give isl_space *isl_space_zip(__isl_take isl_space *space);
1041         __isl_give isl_space *isl_space_curry(
1042                 __isl_take isl_space *space);
1043         __isl_give isl_space *isl_space_uncurry(
1044                 __isl_take isl_space *space);
1045
1046 Note that if dimensions are added or removed from a space, then
1047 the name and the internal structure are lost.
1048
1049 =head2 Local Spaces
1050
1051 A local space is essentially a space with
1052 zero or more existentially quantified variables.
1053 The local space of a (constraint of a) basic set or relation can be obtained
1054 using the following functions.
1055
1056         #include <isl/constraint.h>
1057         __isl_give isl_local_space *isl_constraint_get_local_space(
1058                 __isl_keep isl_constraint *constraint);
1059
1060         #include <isl/set.h>
1061         __isl_give isl_local_space *isl_basic_set_get_local_space(
1062                 __isl_keep isl_basic_set *bset);
1063
1064         #include <isl/map.h>
1065         __isl_give isl_local_space *isl_basic_map_get_local_space(
1066                 __isl_keep isl_basic_map *bmap);
1067
1068 A new local space can be created from a space using
1069
1070         #include <isl/local_space.h>
1071         __isl_give isl_local_space *isl_local_space_from_space(
1072                 __isl_take isl_space *space);
1073
1074 They can be inspected, modified, copied and freed using the following functions.
1075
1076         #include <isl/local_space.h>
1077         isl_ctx *isl_local_space_get_ctx(
1078                 __isl_keep isl_local_space *ls);
1079         int isl_local_space_is_set(__isl_keep isl_local_space *ls);
1080         int isl_local_space_dim(__isl_keep isl_local_space *ls,
1081                 enum isl_dim_type type);
1082         int isl_local_space_has_dim_id(
1083                 __isl_keep isl_local_space *ls,
1084                 enum isl_dim_type type, unsigned pos);
1085         __isl_give isl_id *isl_local_space_get_dim_id(
1086                 __isl_keep isl_local_space *ls,
1087                 enum isl_dim_type type, unsigned pos);
1088         int isl_local_space_has_dim_name(
1089                 __isl_keep isl_local_space *ls,
1090                 enum isl_dim_type type, unsigned pos)
1091         const char *isl_local_space_get_dim_name(
1092                 __isl_keep isl_local_space *ls,
1093                 enum isl_dim_type type, unsigned pos);
1094         __isl_give isl_local_space *isl_local_space_set_dim_name(
1095                 __isl_take isl_local_space *ls,
1096                 enum isl_dim_type type, unsigned pos, const char *s);
1097         __isl_give isl_local_space *isl_local_space_set_dim_id(
1098                 __isl_take isl_local_space *ls,
1099                 enum isl_dim_type type, unsigned pos,
1100                 __isl_take isl_id *id);
1101         __isl_give isl_space *isl_local_space_get_space(
1102                 __isl_keep isl_local_space *ls);
1103         __isl_give isl_aff *isl_local_space_get_div(
1104                 __isl_keep isl_local_space *ls, int pos);
1105         __isl_give isl_local_space *isl_local_space_copy(
1106                 __isl_keep isl_local_space *ls);
1107         void *isl_local_space_free(__isl_take isl_local_space *ls);
1108
1109 Note that C<isl_local_space_get_div> can only be used on local spaces
1110 of sets.
1111
1112 Two local spaces can be compared using
1113
1114         int isl_local_space_is_equal(__isl_keep isl_local_space *ls1,
1115                 __isl_keep isl_local_space *ls2);
1116
1117 Local spaces can be created from other local spaces
1118 using the following functions.
1119
1120         __isl_give isl_local_space *isl_local_space_domain(
1121                 __isl_take isl_local_space *ls);
1122         __isl_give isl_local_space *isl_local_space_range(
1123                 __isl_take isl_local_space *ls);
1124         __isl_give isl_local_space *isl_local_space_from_domain(
1125                 __isl_take isl_local_space *ls);
1126         __isl_give isl_local_space *isl_local_space_intersect(
1127                 __isl_take isl_local_space *ls1,
1128                 __isl_take isl_local_space *ls2);
1129         __isl_give isl_local_space *isl_local_space_add_dims(
1130                 __isl_take isl_local_space *ls,
1131                 enum isl_dim_type type, unsigned n);
1132         __isl_give isl_local_space *isl_local_space_insert_dims(
1133                 __isl_take isl_local_space *ls,
1134                 enum isl_dim_type type, unsigned first, unsigned n);
1135         __isl_give isl_local_space *isl_local_space_drop_dims(
1136                 __isl_take isl_local_space *ls,
1137                 enum isl_dim_type type, unsigned first, unsigned n);
1138
1139 =head2 Input and Output
1140
1141 C<isl> supports its own input/output format, which is similar
1142 to the C<Omega> format, but also supports the C<PolyLib> format
1143 in some cases.
1144
1145 =head3 C<isl> format
1146
1147 The C<isl> format is similar to that of C<Omega>, but has a different
1148 syntax for describing the parameters and allows for the definition
1149 of an existentially quantified variable as the integer division
1150 of an affine expression.
1151 For example, the set of integers C<i> between C<0> and C<n>
1152 such that C<i % 10 <= 6> can be described as
1153
1154         [n] -> { [i] : exists (a = [i/10] : 0 <= i and i <= n and
1155                                 i - 10 a <= 6) }
1156
1157 A set or relation can have several disjuncts, separated
1158 by the keyword C<or>.  Each disjunct is either a conjunction
1159 of constraints or a projection (C<exists>) of a conjunction
1160 of constraints.  The constraints are separated by the keyword
1161 C<and>.
1162
1163 =head3 C<PolyLib> format
1164
1165 If the represented set is a union, then the first line
1166 contains a single number representing the number of disjuncts.
1167 Otherwise, a line containing the number C<1> is optional.
1168
1169 Each disjunct is represented by a matrix of constraints.
1170 The first line contains two numbers representing
1171 the number of rows and columns,
1172 where the number of rows is equal to the number of constraints
1173 and the number of columns is equal to two plus the number of variables.
1174 The following lines contain the actual rows of the constraint matrix.
1175 In each row, the first column indicates whether the constraint
1176 is an equality (C<0>) or inequality (C<1>).  The final column
1177 corresponds to the constant term.
1178
1179 If the set is parametric, then the coefficients of the parameters
1180 appear in the last columns before the constant column.
1181 The coefficients of any existentially quantified variables appear
1182 between those of the set variables and those of the parameters.
1183
1184 =head3 Extended C<PolyLib> format
1185
1186 The extended C<PolyLib> format is nearly identical to the
1187 C<PolyLib> format.  The only difference is that the line
1188 containing the number of rows and columns of a constraint matrix
1189 also contains four additional numbers:
1190 the number of output dimensions, the number of input dimensions,
1191 the number of local dimensions (i.e., the number of existentially
1192 quantified variables) and the number of parameters.
1193 For sets, the number of ``output'' dimensions is equal
1194 to the number of set dimensions, while the number of ``input''
1195 dimensions is zero.
1196
1197 =head3 Input
1198
1199         #include <isl/set.h>
1200         __isl_give isl_basic_set *isl_basic_set_read_from_file(
1201                 isl_ctx *ctx, FILE *input);
1202         __isl_give isl_basic_set *isl_basic_set_read_from_str(
1203                 isl_ctx *ctx, const char *str);
1204         __isl_give isl_set *isl_set_read_from_file(isl_ctx *ctx,
1205                 FILE *input);
1206         __isl_give isl_set *isl_set_read_from_str(isl_ctx *ctx,
1207                 const char *str);
1208
1209         #include <isl/map.h>
1210         __isl_give isl_basic_map *isl_basic_map_read_from_file(
1211                 isl_ctx *ctx, FILE *input);
1212         __isl_give isl_basic_map *isl_basic_map_read_from_str(
1213                 isl_ctx *ctx, const char *str);
1214         __isl_give isl_map *isl_map_read_from_file(
1215                 isl_ctx *ctx, FILE *input);
1216         __isl_give isl_map *isl_map_read_from_str(isl_ctx *ctx,
1217                 const char *str);
1218
1219         #include <isl/union_set.h>
1220         __isl_give isl_union_set *isl_union_set_read_from_file(
1221                 isl_ctx *ctx, FILE *input);
1222         __isl_give isl_union_set *isl_union_set_read_from_str(
1223                 isl_ctx *ctx, const char *str);
1224
1225         #include <isl/union_map.h>
1226         __isl_give isl_union_map *isl_union_map_read_from_file(
1227                 isl_ctx *ctx, FILE *input);
1228         __isl_give isl_union_map *isl_union_map_read_from_str(
1229                 isl_ctx *ctx, const char *str);
1230
1231 The input format is autodetected and may be either the C<PolyLib> format
1232 or the C<isl> format.
1233
1234 =head3 Output
1235
1236 Before anything can be printed, an C<isl_printer> needs to
1237 be created.
1238
1239         __isl_give isl_printer *isl_printer_to_file(isl_ctx *ctx,
1240                 FILE *file);
1241         __isl_give isl_printer *isl_printer_to_str(isl_ctx *ctx);
1242         void *isl_printer_free(__isl_take isl_printer *printer);
1243         __isl_give char *isl_printer_get_str(
1244                 __isl_keep isl_printer *printer);
1245
1246 The printer can be inspected using the following functions.
1247
1248         FILE *isl_printer_get_file(
1249                 __isl_keep isl_printer *printer);
1250         int isl_printer_get_output_format(
1251                 __isl_keep isl_printer *p);
1252
1253 The behavior of the printer can be modified in various ways
1254
1255         __isl_give isl_printer *isl_printer_set_output_format(
1256                 __isl_take isl_printer *p, int output_format);
1257         __isl_give isl_printer *isl_printer_set_indent(
1258                 __isl_take isl_printer *p, int indent);
1259         __isl_give isl_printer *isl_printer_indent(
1260                 __isl_take isl_printer *p, int indent);
1261         __isl_give isl_printer *isl_printer_set_prefix(
1262                 __isl_take isl_printer *p, const char *prefix);
1263         __isl_give isl_printer *isl_printer_set_suffix(
1264                 __isl_take isl_printer *p, const char *suffix);
1265
1266 The C<output_format> may be either C<ISL_FORMAT_ISL>, C<ISL_FORMAT_OMEGA>,
1267 C<ISL_FORMAT_POLYLIB>, C<ISL_FORMAT_EXT_POLYLIB> or C<ISL_FORMAT_LATEX>
1268 and defaults to C<ISL_FORMAT_ISL>.
1269 Each line in the output is indented by C<indent> (set by
1270 C<isl_printer_set_indent>) spaces
1271 (default: 0), prefixed by C<prefix> and suffixed by C<suffix>.
1272 In the C<PolyLib> format output,
1273 the coefficients of the existentially quantified variables
1274 appear between those of the set variables and those
1275 of the parameters.
1276 The function C<isl_printer_indent> increases the indentation
1277 by the specified amount (which may be negative).
1278
1279 To actually print something, use
1280
1281         #include <isl/printer.h>
1282         __isl_give isl_printer *isl_printer_print_double(
1283                 __isl_take isl_printer *p, double d);
1284
1285         #include <isl/set.h>
1286         __isl_give isl_printer *isl_printer_print_basic_set(
1287                 __isl_take isl_printer *printer,
1288                 __isl_keep isl_basic_set *bset);
1289         __isl_give isl_printer *isl_printer_print_set(
1290                 __isl_take isl_printer *printer,
1291                 __isl_keep isl_set *set);
1292
1293         #include <isl/map.h>
1294         __isl_give isl_printer *isl_printer_print_basic_map(
1295                 __isl_take isl_printer *printer,
1296                 __isl_keep isl_basic_map *bmap);
1297         __isl_give isl_printer *isl_printer_print_map(
1298                 __isl_take isl_printer *printer,
1299                 __isl_keep isl_map *map);
1300
1301         #include <isl/union_set.h>
1302         __isl_give isl_printer *isl_printer_print_union_set(
1303                 __isl_take isl_printer *p,
1304                 __isl_keep isl_union_set *uset);
1305
1306         #include <isl/union_map.h>
1307         __isl_give isl_printer *isl_printer_print_union_map(
1308                 __isl_take isl_printer *p,
1309                 __isl_keep isl_union_map *umap);
1310
1311 When called on a file printer, the following function flushes
1312 the file.  When called on a string printer, the buffer is cleared.
1313
1314         __isl_give isl_printer *isl_printer_flush(
1315                 __isl_take isl_printer *p);
1316
1317 =head2 Creating New Sets and Relations
1318
1319 C<isl> has functions for creating some standard sets and relations.
1320
1321 =over
1322
1323 =item * Empty sets and relations
1324
1325         __isl_give isl_basic_set *isl_basic_set_empty(
1326                 __isl_take isl_space *space);
1327         __isl_give isl_basic_map *isl_basic_map_empty(
1328                 __isl_take isl_space *space);
1329         __isl_give isl_set *isl_set_empty(
1330                 __isl_take isl_space *space);
1331         __isl_give isl_map *isl_map_empty(
1332                 __isl_take isl_space *space);
1333         __isl_give isl_union_set *isl_union_set_empty(
1334                 __isl_take isl_space *space);
1335         __isl_give isl_union_map *isl_union_map_empty(
1336                 __isl_take isl_space *space);
1337
1338 For C<isl_union_set>s and C<isl_union_map>s, the space
1339 is only used to specify the parameters.
1340
1341 =item * Universe sets and relations
1342
1343         __isl_give isl_basic_set *isl_basic_set_universe(
1344                 __isl_take isl_space *space);
1345         __isl_give isl_basic_map *isl_basic_map_universe(
1346                 __isl_take isl_space *space);
1347         __isl_give isl_set *isl_set_universe(
1348                 __isl_take isl_space *space);
1349         __isl_give isl_map *isl_map_universe(
1350                 __isl_take isl_space *space);
1351         __isl_give isl_union_set *isl_union_set_universe(
1352                 __isl_take isl_union_set *uset);
1353         __isl_give isl_union_map *isl_union_map_universe(
1354                 __isl_take isl_union_map *umap);
1355
1356 The sets and relations constructed by the functions above
1357 contain all integer values, while those constructed by the
1358 functions below only contain non-negative values.
1359
1360         __isl_give isl_basic_set *isl_basic_set_nat_universe(
1361                 __isl_take isl_space *space);
1362         __isl_give isl_basic_map *isl_basic_map_nat_universe(
1363                 __isl_take isl_space *space);
1364         __isl_give isl_set *isl_set_nat_universe(
1365                 __isl_take isl_space *space);
1366         __isl_give isl_map *isl_map_nat_universe(
1367                 __isl_take isl_space *space);
1368
1369 =item * Identity relations
1370
1371         __isl_give isl_basic_map *isl_basic_map_identity(
1372                 __isl_take isl_space *space);
1373         __isl_give isl_map *isl_map_identity(
1374                 __isl_take isl_space *space);
1375
1376 The number of input and output dimensions in C<space> needs
1377 to be the same.
1378
1379 =item * Lexicographic order
1380
1381         __isl_give isl_map *isl_map_lex_lt(
1382                 __isl_take isl_space *set_space);
1383         __isl_give isl_map *isl_map_lex_le(
1384                 __isl_take isl_space *set_space);
1385         __isl_give isl_map *isl_map_lex_gt(
1386                 __isl_take isl_space *set_space);
1387         __isl_give isl_map *isl_map_lex_ge(
1388                 __isl_take isl_space *set_space);
1389         __isl_give isl_map *isl_map_lex_lt_first(
1390                 __isl_take isl_space *space, unsigned n);
1391         __isl_give isl_map *isl_map_lex_le_first(
1392                 __isl_take isl_space *space, unsigned n);
1393         __isl_give isl_map *isl_map_lex_gt_first(
1394                 __isl_take isl_space *space, unsigned n);
1395         __isl_give isl_map *isl_map_lex_ge_first(
1396                 __isl_take isl_space *space, unsigned n);
1397
1398 The first four functions take a space for a B<set>
1399 and return relations that express that the elements in the domain
1400 are lexicographically less
1401 (C<isl_map_lex_lt>), less or equal (C<isl_map_lex_le>),
1402 greater (C<isl_map_lex_gt>) or greater or equal (C<isl_map_lex_ge>)
1403 than the elements in the range.
1404 The last four functions take a space for a map
1405 and return relations that express that the first C<n> dimensions
1406 in the domain are lexicographically less
1407 (C<isl_map_lex_lt_first>), less or equal (C<isl_map_lex_le_first>),
1408 greater (C<isl_map_lex_gt_first>) or greater or equal (C<isl_map_lex_ge_first>)
1409 than the first C<n> dimensions in the range.
1410
1411 =back
1412
1413 A basic set or relation can be converted to a set or relation
1414 using the following functions.
1415
1416         __isl_give isl_set *isl_set_from_basic_set(
1417                 __isl_take isl_basic_set *bset);
1418         __isl_give isl_map *isl_map_from_basic_map(
1419                 __isl_take isl_basic_map *bmap);
1420
1421 Sets and relations can be converted to union sets and relations
1422 using the following functions.
1423
1424         __isl_give isl_union_set *isl_union_set_from_basic_set(
1425                 __isl_take isl_basic_set *bset);
1426         __isl_give isl_union_map *isl_union_map_from_basic_map(
1427                 __isl_take isl_basic_map *bmap);
1428         __isl_give isl_union_set *isl_union_set_from_set(
1429                 __isl_take isl_set *set);
1430         __isl_give isl_union_map *isl_union_map_from_map(
1431                 __isl_take isl_map *map);
1432
1433 The inverse conversions below can only be used if the input
1434 union set or relation is known to contain elements in exactly one
1435 space.
1436
1437         __isl_give isl_set *isl_set_from_union_set(
1438                 __isl_take isl_union_set *uset);
1439         __isl_give isl_map *isl_map_from_union_map(
1440                 __isl_take isl_union_map *umap);
1441
1442 A zero-dimensional (basic) set can be constructed on a given parameter domain
1443 using the following function.
1444
1445         __isl_give isl_basic_set *isl_basic_set_from_params(
1446                 __isl_take isl_basic_set *bset);
1447         __isl_give isl_set *isl_set_from_params(
1448                 __isl_take isl_set *set);
1449
1450 Sets and relations can be copied and freed again using the following
1451 functions.
1452
1453         __isl_give isl_basic_set *isl_basic_set_copy(
1454                 __isl_keep isl_basic_set *bset);
1455         __isl_give isl_set *isl_set_copy(__isl_keep isl_set *set);
1456         __isl_give isl_union_set *isl_union_set_copy(
1457                 __isl_keep isl_union_set *uset);
1458         __isl_give isl_basic_map *isl_basic_map_copy(
1459                 __isl_keep isl_basic_map *bmap);
1460         __isl_give isl_map *isl_map_copy(__isl_keep isl_map *map);
1461         __isl_give isl_union_map *isl_union_map_copy(
1462                 __isl_keep isl_union_map *umap);
1463         void *isl_basic_set_free(__isl_take isl_basic_set *bset);
1464         void *isl_set_free(__isl_take isl_set *set);
1465         void *isl_union_set_free(__isl_take isl_union_set *uset);
1466         void *isl_basic_map_free(__isl_take isl_basic_map *bmap);
1467         void *isl_map_free(__isl_take isl_map *map);
1468         void *isl_union_map_free(__isl_take isl_union_map *umap);
1469
1470 Other sets and relations can be constructed by starting
1471 from a universe set or relation, adding equality and/or
1472 inequality constraints and then projecting out the
1473 existentially quantified variables, if any.
1474 Constraints can be constructed, manipulated and
1475 added to (or removed from) (basic) sets and relations
1476 using the following functions.
1477
1478         #include <isl/constraint.h>
1479         __isl_give isl_constraint *isl_equality_alloc(
1480                 __isl_take isl_local_space *ls);
1481         __isl_give isl_constraint *isl_inequality_alloc(
1482                 __isl_take isl_local_space *ls);
1483         __isl_give isl_constraint *isl_constraint_set_constant(
1484                 __isl_take isl_constraint *constraint, isl_int v);
1485         __isl_give isl_constraint *isl_constraint_set_constant_si(
1486                 __isl_take isl_constraint *constraint, int v);
1487         __isl_give isl_constraint *isl_constraint_set_coefficient(
1488                 __isl_take isl_constraint *constraint,
1489                 enum isl_dim_type type, int pos, isl_int v);
1490         __isl_give isl_constraint *isl_constraint_set_coefficient_si(
1491                 __isl_take isl_constraint *constraint,
1492                 enum isl_dim_type type, int pos, int v);
1493         __isl_give isl_basic_map *isl_basic_map_add_constraint(
1494                 __isl_take isl_basic_map *bmap,
1495                 __isl_take isl_constraint *constraint);
1496         __isl_give isl_basic_set *isl_basic_set_add_constraint(
1497                 __isl_take isl_basic_set *bset,
1498                 __isl_take isl_constraint *constraint);
1499         __isl_give isl_map *isl_map_add_constraint(
1500                 __isl_take isl_map *map,
1501                 __isl_take isl_constraint *constraint);
1502         __isl_give isl_set *isl_set_add_constraint(
1503                 __isl_take isl_set *set,
1504                 __isl_take isl_constraint *constraint);
1505         __isl_give isl_basic_set *isl_basic_set_drop_constraint(
1506                 __isl_take isl_basic_set *bset,
1507                 __isl_take isl_constraint *constraint);
1508
1509 For example, to create a set containing the even integers
1510 between 10 and 42, you would use the following code.
1511
1512         isl_space *space;
1513         isl_local_space *ls;
1514         isl_constraint *c;
1515         isl_basic_set *bset;
1516
1517         space = isl_space_set_alloc(ctx, 0, 2);
1518         bset = isl_basic_set_universe(isl_space_copy(space));
1519         ls = isl_local_space_from_space(space);
1520
1521         c = isl_equality_alloc(isl_local_space_copy(ls));
1522         c = isl_constraint_set_coefficient_si(c, isl_dim_set, 0, -1);
1523         c = isl_constraint_set_coefficient_si(c, isl_dim_set, 1, 2);
1524         bset = isl_basic_set_add_constraint(bset, c);
1525
1526         c = isl_inequality_alloc(isl_local_space_copy(ls));
1527         c = isl_constraint_set_constant_si(c, -10);
1528         c = isl_constraint_set_coefficient_si(c, isl_dim_set, 0, 1);
1529         bset = isl_basic_set_add_constraint(bset, c);
1530
1531         c = isl_inequality_alloc(ls);
1532         c = isl_constraint_set_constant_si(c, 42);
1533         c = isl_constraint_set_coefficient_si(c, isl_dim_set, 0, -1);
1534         bset = isl_basic_set_add_constraint(bset, c);
1535
1536         bset = isl_basic_set_project_out(bset, isl_dim_set, 1, 1);
1537
1538 Or, alternatively,
1539
1540         isl_basic_set *bset;
1541         bset = isl_basic_set_read_from_str(ctx,
1542                 "{[i] : exists (a : i = 2a and i >= 10 and i <= 42)}");
1543
1544 A basic set or relation can also be constructed from two matrices
1545 describing the equalities and the inequalities.
1546
1547         __isl_give isl_basic_set *isl_basic_set_from_constraint_matrices(
1548                 __isl_take isl_space *space,
1549                 __isl_take isl_mat *eq, __isl_take isl_mat *ineq,
1550                 enum isl_dim_type c1,
1551                 enum isl_dim_type c2, enum isl_dim_type c3,
1552                 enum isl_dim_type c4);
1553         __isl_give isl_basic_map *isl_basic_map_from_constraint_matrices(
1554                 __isl_take isl_space *space,
1555                 __isl_take isl_mat *eq, __isl_take isl_mat *ineq,
1556                 enum isl_dim_type c1,
1557                 enum isl_dim_type c2, enum isl_dim_type c3,
1558                 enum isl_dim_type c4, enum isl_dim_type c5);
1559
1560 The C<isl_dim_type> arguments indicate the order in which
1561 different kinds of variables appear in the input matrices
1562 and should be a permutation of C<isl_dim_cst>, C<isl_dim_param>,
1563 C<isl_dim_set> and C<isl_dim_div> for sets and
1564 of C<isl_dim_cst>, C<isl_dim_param>,
1565 C<isl_dim_in>, C<isl_dim_out> and C<isl_dim_div> for relations.
1566
1567 A (basic or union) set or relation can also be constructed from a
1568 (union) (piecewise) (multiple) affine expression
1569 or a list of affine expressions
1570 (See L<"Piecewise Quasi Affine Expressions"> and
1571 L<"Piecewise Multiple Quasi Affine Expressions">).
1572
1573         __isl_give isl_basic_map *isl_basic_map_from_aff(
1574                 __isl_take isl_aff *aff);
1575         __isl_give isl_map *isl_map_from_aff(
1576                 __isl_take isl_aff *aff);
1577         __isl_give isl_set *isl_set_from_pw_aff(
1578                 __isl_take isl_pw_aff *pwaff);
1579         __isl_give isl_map *isl_map_from_pw_aff(
1580                 __isl_take isl_pw_aff *pwaff);
1581         __isl_give isl_basic_map *isl_basic_map_from_aff_list(
1582                 __isl_take isl_space *domain_space,
1583                 __isl_take isl_aff_list *list);
1584         __isl_give isl_basic_map *isl_basic_map_from_multi_aff(
1585                 __isl_take isl_multi_aff *maff)
1586         __isl_give isl_map *isl_map_from_multi_aff(
1587                 __isl_take isl_multi_aff *maff)
1588         __isl_give isl_set *isl_set_from_pw_multi_aff(
1589                 __isl_take isl_pw_multi_aff *pma);
1590         __isl_give isl_map *isl_map_from_pw_multi_aff(
1591                 __isl_take isl_pw_multi_aff *pma);
1592         __isl_give isl_union_map *
1593         isl_union_map_from_union_pw_multi_aff(
1594                 __isl_take isl_union_pw_multi_aff *upma);
1595
1596 The C<domain_dim> argument describes the domain of the resulting
1597 basic relation.  It is required because the C<list> may consist
1598 of zero affine expressions.
1599
1600 =head2 Inspecting Sets and Relations
1601
1602 Usually, the user should not have to care about the actual constraints
1603 of the sets and maps, but should instead apply the abstract operations
1604 explained in the following sections.
1605 Occasionally, however, it may be required to inspect the individual
1606 coefficients of the constraints.  This section explains how to do so.
1607 In these cases, it may also be useful to have C<isl> compute
1608 an explicit representation of the existentially quantified variables.
1609
1610         __isl_give isl_set *isl_set_compute_divs(
1611                 __isl_take isl_set *set);
1612         __isl_give isl_map *isl_map_compute_divs(
1613                 __isl_take isl_map *map);
1614         __isl_give isl_union_set *isl_union_set_compute_divs(
1615                 __isl_take isl_union_set *uset);
1616         __isl_give isl_union_map *isl_union_map_compute_divs(
1617                 __isl_take isl_union_map *umap);
1618
1619 This explicit representation defines the existentially quantified
1620 variables as integer divisions of the other variables, possibly
1621 including earlier existentially quantified variables.
1622 An explicitly represented existentially quantified variable therefore
1623 has a unique value when the values of the other variables are known.
1624 If, furthermore, the same existentials, i.e., existentials
1625 with the same explicit representations, should appear in the
1626 same order in each of the disjuncts of a set or map, then the user should call
1627 either of the following functions.
1628
1629         __isl_give isl_set *isl_set_align_divs(
1630                 __isl_take isl_set *set);
1631         __isl_give isl_map *isl_map_align_divs(
1632                 __isl_take isl_map *map);
1633
1634 Alternatively, the existentially quantified variables can be removed
1635 using the following functions, which compute an overapproximation.
1636
1637         __isl_give isl_basic_set *isl_basic_set_remove_divs(
1638                 __isl_take isl_basic_set *bset);
1639         __isl_give isl_basic_map *isl_basic_map_remove_divs(
1640                 __isl_take isl_basic_map *bmap);
1641         __isl_give isl_set *isl_set_remove_divs(
1642                 __isl_take isl_set *set);
1643         __isl_give isl_map *isl_map_remove_divs(
1644                 __isl_take isl_map *map);
1645
1646 It is also possible to only remove those divs that are defined
1647 in terms of a given range of dimensions or only those for which
1648 no explicit representation is known.
1649
1650         __isl_give isl_basic_set *
1651         isl_basic_set_remove_divs_involving_dims(
1652                 __isl_take isl_basic_set *bset,
1653                 enum isl_dim_type type,
1654                 unsigned first, unsigned n);
1655         __isl_give isl_basic_map *
1656         isl_basic_map_remove_divs_involving_dims(
1657                 __isl_take isl_basic_map *bmap,
1658                 enum isl_dim_type type,
1659                 unsigned first, unsigned n);
1660         __isl_give isl_set *isl_set_remove_divs_involving_dims(
1661                 __isl_take isl_set *set, enum isl_dim_type type,
1662                 unsigned first, unsigned n);
1663         __isl_give isl_map *isl_map_remove_divs_involving_dims(
1664                 __isl_take isl_map *map, enum isl_dim_type type,
1665                 unsigned first, unsigned n);
1666
1667         __isl_give isl_basic_set *
1668         isl_basic_set_remove_unknown_divs(
1669                 __isl_take isl_basic_set *bset);
1670         __isl_give isl_set *isl_set_remove_unknown_divs(
1671                 __isl_take isl_set *set);
1672         __isl_give isl_map *isl_map_remove_unknown_divs(
1673                 __isl_take isl_map *map);
1674
1675 To iterate over all the sets or maps in a union set or map, use
1676
1677         int isl_union_set_foreach_set(__isl_keep isl_union_set *uset,
1678                 int (*fn)(__isl_take isl_set *set, void *user),
1679                 void *user);
1680         int isl_union_map_foreach_map(__isl_keep isl_union_map *umap,
1681                 int (*fn)(__isl_take isl_map *map, void *user),
1682                 void *user);
1683
1684 The number of sets or maps in a union set or map can be obtained
1685 from
1686
1687         int isl_union_set_n_set(__isl_keep isl_union_set *uset);
1688         int isl_union_map_n_map(__isl_keep isl_union_map *umap);
1689
1690 To extract the set or map in a given space from a union, use
1691
1692         __isl_give isl_set *isl_union_set_extract_set(
1693                 __isl_keep isl_union_set *uset,
1694                 __isl_take isl_space *space);
1695         __isl_give isl_map *isl_union_map_extract_map(
1696                 __isl_keep isl_union_map *umap,
1697                 __isl_take isl_space *space);
1698
1699 To iterate over all the basic sets or maps in a set or map, use
1700
1701         int isl_set_foreach_basic_set(__isl_keep isl_set *set,
1702                 int (*fn)(__isl_take isl_basic_set *bset, void *user),
1703                 void *user);
1704         int isl_map_foreach_basic_map(__isl_keep isl_map *map,
1705                 int (*fn)(__isl_take isl_basic_map *bmap, void *user),
1706                 void *user);
1707
1708 The callback function C<fn> should return 0 if successful and
1709 -1 if an error occurs.  In the latter case, or if any other error
1710 occurs, the above functions will return -1.
1711
1712 It should be noted that C<isl> does not guarantee that
1713 the basic sets or maps passed to C<fn> are disjoint.
1714 If this is required, then the user should call one of
1715 the following functions first.
1716
1717         __isl_give isl_set *isl_set_make_disjoint(
1718                 __isl_take isl_set *set);
1719         __isl_give isl_map *isl_map_make_disjoint(
1720                 __isl_take isl_map *map);
1721
1722 The number of basic sets in a set can be obtained
1723 from
1724
1725         int isl_set_n_basic_set(__isl_keep isl_set *set);
1726
1727 To iterate over the constraints of a basic set or map, use
1728
1729         #include <isl/constraint.h>
1730
1731         int isl_basic_set_n_constraint(
1732                 __isl_keep isl_basic_set *bset);
1733         int isl_basic_set_foreach_constraint(
1734                 __isl_keep isl_basic_set *bset,
1735                 int (*fn)(__isl_take isl_constraint *c, void *user),
1736                 void *user);
1737         int isl_basic_map_foreach_constraint(
1738                 __isl_keep isl_basic_map *bmap,
1739                 int (*fn)(__isl_take isl_constraint *c, void *user),
1740                 void *user);
1741         void *isl_constraint_free(__isl_take isl_constraint *c);
1742
1743 Again, the callback function C<fn> should return 0 if successful and
1744 -1 if an error occurs.  In the latter case, or if any other error
1745 occurs, the above functions will return -1.
1746 The constraint C<c> represents either an equality or an inequality.
1747 Use the following function to find out whether a constraint
1748 represents an equality.  If not, it represents an inequality.
1749
1750         int isl_constraint_is_equality(
1751                 __isl_keep isl_constraint *constraint);
1752
1753 The coefficients of the constraints can be inspected using
1754 the following functions.
1755
1756         int isl_constraint_is_lower_bound(
1757                 __isl_keep isl_constraint *constraint,
1758                 enum isl_dim_type type, unsigned pos);
1759         int isl_constraint_is_upper_bound(
1760                 __isl_keep isl_constraint *constraint,
1761                 enum isl_dim_type type, unsigned pos);
1762         void isl_constraint_get_constant(
1763                 __isl_keep isl_constraint *constraint, isl_int *v);
1764         void isl_constraint_get_coefficient(
1765                 __isl_keep isl_constraint *constraint,
1766                 enum isl_dim_type type, int pos, isl_int *v);
1767         int isl_constraint_involves_dims(
1768                 __isl_keep isl_constraint *constraint,
1769                 enum isl_dim_type type, unsigned first, unsigned n);
1770
1771 The explicit representations of the existentially quantified
1772 variables can be inspected using the following function.
1773 Note that the user is only allowed to use this function
1774 if the inspected set or map is the result of a call
1775 to C<isl_set_compute_divs> or C<isl_map_compute_divs>.
1776 The existentially quantified variable is equal to the floor
1777 of the returned affine expression.  The affine expression
1778 itself can be inspected using the functions in
1779 L<"Piecewise Quasi Affine Expressions">.
1780
1781         __isl_give isl_aff *isl_constraint_get_div(
1782                 __isl_keep isl_constraint *constraint, int pos);
1783
1784 To obtain the constraints of a basic set or map in matrix
1785 form, use the following functions.
1786
1787         __isl_give isl_mat *isl_basic_set_equalities_matrix(
1788                 __isl_keep isl_basic_set *bset,
1789                 enum isl_dim_type c1, enum isl_dim_type c2,
1790                 enum isl_dim_type c3, enum isl_dim_type c4);
1791         __isl_give isl_mat *isl_basic_set_inequalities_matrix(
1792                 __isl_keep isl_basic_set *bset,
1793                 enum isl_dim_type c1, enum isl_dim_type c2,
1794                 enum isl_dim_type c3, enum isl_dim_type c4);
1795         __isl_give isl_mat *isl_basic_map_equalities_matrix(
1796                 __isl_keep isl_basic_map *bmap,
1797                 enum isl_dim_type c1,
1798                 enum isl_dim_type c2, enum isl_dim_type c3,
1799                 enum isl_dim_type c4, enum isl_dim_type c5);
1800         __isl_give isl_mat *isl_basic_map_inequalities_matrix(
1801                 __isl_keep isl_basic_map *bmap,
1802                 enum isl_dim_type c1,
1803                 enum isl_dim_type c2, enum isl_dim_type c3,
1804                 enum isl_dim_type c4, enum isl_dim_type c5);
1805
1806 The C<isl_dim_type> arguments dictate the order in which
1807 different kinds of variables appear in the resulting matrix
1808 and should be a permutation of C<isl_dim_cst>, C<isl_dim_param>,
1809 C<isl_dim_in>, C<isl_dim_out> and C<isl_dim_div>.
1810
1811 The number of parameters, input, output or set dimensions can
1812 be obtained using the following functions.
1813
1814         unsigned isl_basic_set_dim(__isl_keep isl_basic_set *bset,
1815                 enum isl_dim_type type);
1816         unsigned isl_basic_map_dim(__isl_keep isl_basic_map *bmap,
1817                 enum isl_dim_type type);
1818         unsigned isl_set_dim(__isl_keep isl_set *set,
1819                 enum isl_dim_type type);
1820         unsigned isl_map_dim(__isl_keep isl_map *map,
1821                 enum isl_dim_type type);
1822
1823 To check whether the description of a set or relation depends
1824 on one or more given dimensions, it is not necessary to iterate over all
1825 constraints.  Instead the following functions can be used.
1826
1827         int isl_basic_set_involves_dims(
1828                 __isl_keep isl_basic_set *bset,
1829                 enum isl_dim_type type, unsigned first, unsigned n);
1830         int isl_set_involves_dims(__isl_keep isl_set *set,
1831                 enum isl_dim_type type, unsigned first, unsigned n);
1832         int isl_basic_map_involves_dims(
1833                 __isl_keep isl_basic_map *bmap,
1834                 enum isl_dim_type type, unsigned first, unsigned n);
1835         int isl_map_involves_dims(__isl_keep isl_map *map,
1836                 enum isl_dim_type type, unsigned first, unsigned n);
1837
1838 Similarly, the following functions can be used to check whether
1839 a given dimension is involved in any lower or upper bound.
1840
1841         int isl_set_dim_has_any_lower_bound(__isl_keep isl_set *set,
1842                 enum isl_dim_type type, unsigned pos);
1843         int isl_set_dim_has_any_upper_bound(__isl_keep isl_set *set,
1844                 enum isl_dim_type type, unsigned pos);
1845
1846 Note that these functions return true even if there is a bound on
1847 the dimension on only some of the basic sets of C<set>.
1848 To check if they have a bound for all of the basic sets in C<set>,
1849 use the following functions instead.
1850
1851         int isl_set_dim_has_lower_bound(__isl_keep isl_set *set,
1852                 enum isl_dim_type type, unsigned pos);
1853         int isl_set_dim_has_upper_bound(__isl_keep isl_set *set,
1854                 enum isl_dim_type type, unsigned pos);
1855
1856 The identifiers or names of the domain and range spaces of a set
1857 or relation can be read off or set using the following functions.
1858
1859         __isl_give isl_set *isl_set_set_tuple_id(
1860                 __isl_take isl_set *set, __isl_take isl_id *id);
1861         __isl_give isl_set *isl_set_reset_tuple_id(
1862                 __isl_take isl_set *set);
1863         int isl_set_has_tuple_id(__isl_keep isl_set *set);
1864         __isl_give isl_id *isl_set_get_tuple_id(
1865                 __isl_keep isl_set *set);
1866         __isl_give isl_map *isl_map_set_tuple_id(
1867                 __isl_take isl_map *map, enum isl_dim_type type,
1868                 __isl_take isl_id *id);
1869         __isl_give isl_map *isl_map_reset_tuple_id(
1870                 __isl_take isl_map *map, enum isl_dim_type type);
1871         int isl_map_has_tuple_id(__isl_keep isl_map *map,
1872                 enum isl_dim_type type);
1873         __isl_give isl_id *isl_map_get_tuple_id(
1874                 __isl_keep isl_map *map, enum isl_dim_type type);
1875
1876         const char *isl_basic_set_get_tuple_name(
1877                 __isl_keep isl_basic_set *bset);
1878         __isl_give isl_basic_set *isl_basic_set_set_tuple_name(
1879                 __isl_take isl_basic_set *set, const char *s);
1880         int isl_set_has_tuple_name(__isl_keep isl_set *set);
1881         const char *isl_set_get_tuple_name(
1882                 __isl_keep isl_set *set);
1883         const char *isl_basic_map_get_tuple_name(
1884                 __isl_keep isl_basic_map *bmap,
1885                 enum isl_dim_type type);
1886         __isl_give isl_basic_map *isl_basic_map_set_tuple_name(
1887                 __isl_take isl_basic_map *bmap,
1888                 enum isl_dim_type type, const char *s);
1889         int isl_map_has_tuple_name(__isl_keep isl_map *map,
1890                 enum isl_dim_type type);
1891         const char *isl_map_get_tuple_name(
1892                 __isl_keep isl_map *map,
1893                 enum isl_dim_type type);
1894
1895 As with C<isl_space_get_tuple_name>, the value returned points to
1896 an internal data structure.
1897 The identifiers, positions or names of individual dimensions can be
1898 read off using the following functions.
1899
1900         __isl_give isl_id *isl_basic_set_get_dim_id(
1901                 __isl_keep isl_basic_set *bset,
1902                 enum isl_dim_type type, unsigned pos);
1903         __isl_give isl_set *isl_set_set_dim_id(
1904                 __isl_take isl_set *set, enum isl_dim_type type,
1905                 unsigned pos, __isl_take isl_id *id);
1906         int isl_set_has_dim_id(__isl_keep isl_set *set,
1907                 enum isl_dim_type type, unsigned pos);
1908         __isl_give isl_id *isl_set_get_dim_id(
1909                 __isl_keep isl_set *set, enum isl_dim_type type,
1910                 unsigned pos);
1911         int isl_basic_map_has_dim_id(
1912                 __isl_keep isl_basic_map *bmap,
1913                 enum isl_dim_type type, unsigned pos);
1914         __isl_give isl_map *isl_map_set_dim_id(
1915                 __isl_take isl_map *map, enum isl_dim_type type,
1916                 unsigned pos, __isl_take isl_id *id);
1917         int isl_map_has_dim_id(__isl_keep isl_map *map,
1918                 enum isl_dim_type type, unsigned pos);
1919         __isl_give isl_id *isl_map_get_dim_id(
1920                 __isl_keep isl_map *map, enum isl_dim_type type,
1921                 unsigned pos);
1922
1923         int isl_set_find_dim_by_id(__isl_keep isl_set *set,
1924                 enum isl_dim_type type, __isl_keep isl_id *id);
1925         int isl_map_find_dim_by_id(__isl_keep isl_map *map,
1926                 enum isl_dim_type type, __isl_keep isl_id *id);
1927         int isl_set_find_dim_by_name(__isl_keep isl_set *set,
1928                 enum isl_dim_type type, const char *name);
1929         int isl_map_find_dim_by_name(__isl_keep isl_map *map,
1930                 enum isl_dim_type type, const char *name);
1931
1932         const char *isl_constraint_get_dim_name(
1933                 __isl_keep isl_constraint *constraint,
1934                 enum isl_dim_type type, unsigned pos);
1935         const char *isl_basic_set_get_dim_name(
1936                 __isl_keep isl_basic_set *bset,
1937                 enum isl_dim_type type, unsigned pos);
1938         int isl_set_has_dim_name(__isl_keep isl_set *set,
1939                 enum isl_dim_type type, unsigned pos);
1940         const char *isl_set_get_dim_name(
1941                 __isl_keep isl_set *set,
1942                 enum isl_dim_type type, unsigned pos);
1943         const char *isl_basic_map_get_dim_name(
1944                 __isl_keep isl_basic_map *bmap,
1945                 enum isl_dim_type type, unsigned pos);
1946         int isl_map_has_dim_name(__isl_keep isl_map *map,
1947                 enum isl_dim_type type, unsigned pos);
1948         const char *isl_map_get_dim_name(
1949                 __isl_keep isl_map *map,
1950                 enum isl_dim_type type, unsigned pos);
1951
1952 These functions are mostly useful to obtain the identifiers, positions
1953 or names of the parameters.  Identifiers of individual dimensions are
1954 essentially only useful for printing.  They are ignored by all other
1955 operations and may not be preserved across those operations.
1956
1957 =head2 Properties
1958
1959 =head3 Unary Properties
1960
1961 =over
1962
1963 =item * Emptiness
1964
1965 The following functions test whether the given set or relation
1966 contains any integer points.  The ``plain'' variants do not perform
1967 any computations, but simply check if the given set or relation
1968 is already known to be empty.
1969
1970         int isl_basic_set_plain_is_empty(__isl_keep isl_basic_set *bset);
1971         int isl_basic_set_is_empty(__isl_keep isl_basic_set *bset);
1972         int isl_set_plain_is_empty(__isl_keep isl_set *set);
1973         int isl_set_is_empty(__isl_keep isl_set *set);
1974         int isl_union_set_is_empty(__isl_keep isl_union_set *uset);
1975         int isl_basic_map_plain_is_empty(__isl_keep isl_basic_map *bmap);
1976         int isl_basic_map_is_empty(__isl_keep isl_basic_map *bmap);
1977         int isl_map_plain_is_empty(__isl_keep isl_map *map);
1978         int isl_map_is_empty(__isl_keep isl_map *map);
1979         int isl_union_map_is_empty(__isl_keep isl_union_map *umap);
1980
1981 =item * Universality
1982
1983         int isl_basic_set_is_universe(__isl_keep isl_basic_set *bset);
1984         int isl_basic_map_is_universe(__isl_keep isl_basic_map *bmap);
1985         int isl_set_plain_is_universe(__isl_keep isl_set *set);
1986
1987 =item * Single-valuedness
1988
1989         int isl_basic_map_is_single_valued(
1990                 __isl_keep isl_basic_map *bmap);
1991         int isl_map_plain_is_single_valued(
1992                 __isl_keep isl_map *map);
1993         int isl_map_is_single_valued(__isl_keep isl_map *map);
1994         int isl_union_map_is_single_valued(__isl_keep isl_union_map *umap);
1995
1996 =item * Injectivity
1997
1998         int isl_map_plain_is_injective(__isl_keep isl_map *map);
1999         int isl_map_is_injective(__isl_keep isl_map *map);
2000         int isl_union_map_plain_is_injective(
2001                 __isl_keep isl_union_map *umap);
2002         int isl_union_map_is_injective(
2003                 __isl_keep isl_union_map *umap);
2004
2005 =item * Bijectivity
2006
2007         int isl_map_is_bijective(__isl_keep isl_map *map);
2008         int isl_union_map_is_bijective(__isl_keep isl_union_map *umap);
2009
2010 =item * Position
2011
2012         int isl_basic_map_plain_is_fixed(
2013                 __isl_keep isl_basic_map *bmap,
2014                 enum isl_dim_type type, unsigned pos,
2015                 isl_int *val);
2016         int isl_set_plain_is_fixed(__isl_keep isl_set *set,
2017                 enum isl_dim_type type, unsigned pos,
2018                 isl_int *val);
2019         int isl_map_plain_is_fixed(__isl_keep isl_map *map,
2020                 enum isl_dim_type type, unsigned pos,
2021                 isl_int *val);
2022
2023 Check if the relation obviously lies on a hyperplane where the given dimension
2024 has a fixed value and if so, return that value in C<*val>.
2025
2026 =item * Space
2027
2028 To check whether a set is a parameter domain, use this function:
2029
2030         int isl_set_is_params(__isl_keep isl_set *set);
2031         int isl_union_set_is_params(
2032                 __isl_keep isl_union_set *uset);
2033
2034 =item * Wrapping
2035
2036 The following functions check whether the domain of the given
2037 (basic) set is a wrapped relation.
2038
2039         int isl_basic_set_is_wrapping(
2040                 __isl_keep isl_basic_set *bset);
2041         int isl_set_is_wrapping(__isl_keep isl_set *set);
2042
2043 =item * Internal Product
2044
2045         int isl_basic_map_can_zip(
2046                 __isl_keep isl_basic_map *bmap);
2047         int isl_map_can_zip(__isl_keep isl_map *map);
2048
2049 Check whether the product of domain and range of the given relation
2050 can be computed,
2051 i.e., whether both domain and range are nested relations.
2052
2053 =item * Currying
2054
2055         int isl_basic_map_can_curry(
2056                 __isl_keep isl_basic_map *bmap);
2057         int isl_map_can_curry(__isl_keep isl_map *map);
2058
2059 Check whether the domain of the (basic) relation is a wrapped relation.
2060
2061         int isl_basic_map_can_uncurry(
2062                 __isl_keep isl_basic_map *bmap);
2063         int isl_map_can_uncurry(__isl_keep isl_map *map);
2064
2065 Check whether the range of the (basic) relation is a wrapped relation.
2066
2067 =back
2068
2069 =head3 Binary Properties
2070
2071 =over
2072
2073 =item * Equality
2074
2075         int isl_set_plain_is_equal(__isl_keep isl_set *set1,
2076                 __isl_keep isl_set *set2);
2077         int isl_set_is_equal(__isl_keep isl_set *set1,
2078                 __isl_keep isl_set *set2);
2079         int isl_union_set_is_equal(
2080                 __isl_keep isl_union_set *uset1,
2081                 __isl_keep isl_union_set *uset2);
2082         int isl_basic_map_is_equal(
2083                 __isl_keep isl_basic_map *bmap1,
2084                 __isl_keep isl_basic_map *bmap2);
2085         int isl_map_is_equal(__isl_keep isl_map *map1,
2086                 __isl_keep isl_map *map2);
2087         int isl_map_plain_is_equal(__isl_keep isl_map *map1,
2088                 __isl_keep isl_map *map2);
2089         int isl_union_map_is_equal(
2090                 __isl_keep isl_union_map *umap1,
2091                 __isl_keep isl_union_map *umap2);
2092
2093 =item * Disjointness
2094
2095         int isl_set_plain_is_disjoint(__isl_keep isl_set *set1,
2096                 __isl_keep isl_set *set2);
2097         int isl_set_is_disjoint(__isl_keep isl_set *set1,
2098                 __isl_keep isl_set *set2);
2099         int isl_map_is_disjoint(__isl_keep isl_map *map1,
2100                 __isl_keep isl_map *map2);
2101
2102 =item * Subset
2103
2104         int isl_basic_set_is_subset(
2105                 __isl_keep isl_basic_set *bset1,
2106                 __isl_keep isl_basic_set *bset2);
2107         int isl_set_is_subset(__isl_keep isl_set *set1,
2108                 __isl_keep isl_set *set2);
2109         int isl_set_is_strict_subset(
2110                 __isl_keep isl_set *set1,
2111                 __isl_keep isl_set *set2);
2112         int isl_union_set_is_subset(
2113                 __isl_keep isl_union_set *uset1,
2114                 __isl_keep isl_union_set *uset2);
2115         int isl_union_set_is_strict_subset(
2116                 __isl_keep isl_union_set *uset1,
2117                 __isl_keep isl_union_set *uset2);
2118         int isl_basic_map_is_subset(
2119                 __isl_keep isl_basic_map *bmap1,
2120                 __isl_keep isl_basic_map *bmap2);
2121         int isl_basic_map_is_strict_subset(
2122                 __isl_keep isl_basic_map *bmap1,
2123                 __isl_keep isl_basic_map *bmap2);
2124         int isl_map_is_subset(
2125                 __isl_keep isl_map *map1,
2126                 __isl_keep isl_map *map2);
2127         int isl_map_is_strict_subset(
2128                 __isl_keep isl_map *map1,
2129                 __isl_keep isl_map *map2);
2130         int isl_union_map_is_subset(
2131                 __isl_keep isl_union_map *umap1,
2132                 __isl_keep isl_union_map *umap2);
2133         int isl_union_map_is_strict_subset(
2134                 __isl_keep isl_union_map *umap1,
2135                 __isl_keep isl_union_map *umap2);
2136
2137 Check whether the first argument is a (strict) subset of the
2138 second argument.
2139
2140 =item * Order
2141
2142         int isl_set_plain_cmp(__isl_keep isl_set *set1,
2143                 __isl_keep isl_set *set2);
2144
2145 This function is useful for sorting C<isl_set>s.
2146 The order depends on the internal representation of the inputs.
2147 The order is fixed over different calls to the function (assuming
2148 the internal representation of the inputs has not changed), but may
2149 change over different versions of C<isl>.
2150
2151 =back
2152
2153 =head2 Unary Operations
2154
2155 =over
2156
2157 =item * Complement
2158
2159         __isl_give isl_set *isl_set_complement(
2160                 __isl_take isl_set *set);
2161         __isl_give isl_map *isl_map_complement(
2162                 __isl_take isl_map *map);
2163
2164 =item * Inverse map
2165
2166         __isl_give isl_basic_map *isl_basic_map_reverse(
2167                 __isl_take isl_basic_map *bmap);
2168         __isl_give isl_map *isl_map_reverse(
2169                 __isl_take isl_map *map);
2170         __isl_give isl_union_map *isl_union_map_reverse(
2171                 __isl_take isl_union_map *umap);
2172
2173 =item * Projection
2174
2175         __isl_give isl_basic_set *isl_basic_set_project_out(
2176                 __isl_take isl_basic_set *bset,
2177                 enum isl_dim_type type, unsigned first, unsigned n);
2178         __isl_give isl_basic_map *isl_basic_map_project_out(
2179                 __isl_take isl_basic_map *bmap,
2180                 enum isl_dim_type type, unsigned first, unsigned n);
2181         __isl_give isl_set *isl_set_project_out(__isl_take isl_set *set,
2182                 enum isl_dim_type type, unsigned first, unsigned n);
2183         __isl_give isl_map *isl_map_project_out(__isl_take isl_map *map,
2184                 enum isl_dim_type type, unsigned first, unsigned n);
2185         __isl_give isl_basic_set *isl_basic_set_params(
2186                 __isl_take isl_basic_set *bset);
2187         __isl_give isl_basic_set *isl_basic_map_domain(
2188                 __isl_take isl_basic_map *bmap);
2189         __isl_give isl_basic_set *isl_basic_map_range(
2190                 __isl_take isl_basic_map *bmap);
2191         __isl_give isl_set *isl_set_params(__isl_take isl_set *set);
2192         __isl_give isl_set *isl_map_params(__isl_take isl_map *map);
2193         __isl_give isl_set *isl_map_domain(
2194                 __isl_take isl_map *bmap);
2195         __isl_give isl_set *isl_map_range(
2196                 __isl_take isl_map *map);
2197         __isl_give isl_set *isl_union_set_params(
2198                 __isl_take isl_union_set *uset);
2199         __isl_give isl_set *isl_union_map_params(
2200                 __isl_take isl_union_map *umap);
2201         __isl_give isl_union_set *isl_union_map_domain(
2202                 __isl_take isl_union_map *umap);
2203         __isl_give isl_union_set *isl_union_map_range(
2204                 __isl_take isl_union_map *umap);
2205
2206         __isl_give isl_basic_map *isl_basic_map_domain_map(
2207                 __isl_take isl_basic_map *bmap);
2208         __isl_give isl_basic_map *isl_basic_map_range_map(
2209                 __isl_take isl_basic_map *bmap);
2210         __isl_give isl_map *isl_map_domain_map(__isl_take isl_map *map);
2211         __isl_give isl_map *isl_map_range_map(__isl_take isl_map *map);
2212         __isl_give isl_union_map *isl_union_map_domain_map(
2213                 __isl_take isl_union_map *umap);
2214         __isl_give isl_union_map *isl_union_map_range_map(
2215                 __isl_take isl_union_map *umap);
2216
2217 The functions above construct a (basic, regular or union) relation
2218 that maps (a wrapped version of) the input relation to its domain or range.
2219
2220 =item * Elimination
2221
2222         __isl_give isl_basic_set *isl_basic_set_eliminate(
2223                 __isl_take isl_basic_set *bset,
2224                 enum isl_dim_type type,
2225                 unsigned first, unsigned n);
2226         __isl_give isl_set *isl_set_eliminate(
2227                 __isl_take isl_set *set, enum isl_dim_type type,
2228                 unsigned first, unsigned n);
2229         __isl_give isl_basic_map *isl_basic_map_eliminate(
2230                 __isl_take isl_basic_map *bmap,
2231                 enum isl_dim_type type,
2232                 unsigned first, unsigned n);
2233         __isl_give isl_map *isl_map_eliminate(
2234                 __isl_take isl_map *map, enum isl_dim_type type,
2235                 unsigned first, unsigned n);
2236
2237 Eliminate the coefficients for the given dimensions from the constraints,
2238 without removing the dimensions.
2239
2240 =item * Slicing
2241
2242         __isl_give isl_basic_set *isl_basic_set_fix(
2243                 __isl_take isl_basic_set *bset,
2244                 enum isl_dim_type type, unsigned pos,
2245                 isl_int value);
2246         __isl_give isl_basic_set *isl_basic_set_fix_si(
2247                 __isl_take isl_basic_set *bset,
2248                 enum isl_dim_type type, unsigned pos, int value);
2249         __isl_give isl_set *isl_set_fix(__isl_take isl_set *set,
2250                 enum isl_dim_type type, unsigned pos,
2251                 isl_int value);
2252         __isl_give isl_set *isl_set_fix_si(__isl_take isl_set *set,
2253                 enum isl_dim_type type, unsigned pos, int value);
2254         __isl_give isl_basic_map *isl_basic_map_fix_si(
2255                 __isl_take isl_basic_map *bmap,
2256                 enum isl_dim_type type, unsigned pos, int value);
2257         __isl_give isl_map *isl_map_fix(__isl_take isl_map *map,
2258                 enum isl_dim_type type, unsigned pos,
2259                 isl_int value);
2260         __isl_give isl_map *isl_map_fix_si(__isl_take isl_map *map,
2261                 enum isl_dim_type type, unsigned pos, int value);
2262
2263 Intersect the set or relation with the hyperplane where the given
2264 dimension has the fixed given value.
2265
2266         __isl_give isl_basic_map *isl_basic_map_lower_bound_si(
2267                 __isl_take isl_basic_map *bmap,
2268                 enum isl_dim_type type, unsigned pos, int value);
2269         __isl_give isl_basic_map *isl_basic_map_upper_bound_si(
2270                 __isl_take isl_basic_map *bmap,
2271                 enum isl_dim_type type, unsigned pos, int value);
2272         __isl_give isl_set *isl_set_lower_bound(
2273                 __isl_take isl_set *set,
2274                 enum isl_dim_type type, unsigned pos,
2275                 isl_int value);
2276         __isl_give isl_set *isl_set_lower_bound_si(
2277                 __isl_take isl_set *set,
2278                 enum isl_dim_type type, unsigned pos, int value);
2279         __isl_give isl_map *isl_map_lower_bound_si(
2280                 __isl_take isl_map *map,
2281                 enum isl_dim_type type, unsigned pos, int value);
2282         __isl_give isl_set *isl_set_upper_bound(
2283                 __isl_take isl_set *set,
2284                 enum isl_dim_type type, unsigned pos,
2285                 isl_int value);
2286         __isl_give isl_set *isl_set_upper_bound_si(
2287                 __isl_take isl_set *set,
2288                 enum isl_dim_type type, unsigned pos, int value);
2289         __isl_give isl_map *isl_map_upper_bound_si(
2290                 __isl_take isl_map *map,
2291                 enum isl_dim_type type, unsigned pos, int value);
2292
2293 Intersect the set or relation with the half-space where the given
2294 dimension has a value bounded by the fixed given value.
2295
2296         __isl_give isl_set *isl_set_equate(__isl_take isl_set *set,
2297                 enum isl_dim_type type1, int pos1,
2298                 enum isl_dim_type type2, int pos2);
2299         __isl_give isl_basic_map *isl_basic_map_equate(
2300                 __isl_take isl_basic_map *bmap,
2301                 enum isl_dim_type type1, int pos1,
2302                 enum isl_dim_type type2, int pos2);
2303         __isl_give isl_map *isl_map_equate(__isl_take isl_map *map,
2304                 enum isl_dim_type type1, int pos1,
2305                 enum isl_dim_type type2, int pos2);
2306
2307 Intersect the set or relation with the hyperplane where the given
2308 dimensions are equal to each other.
2309
2310         __isl_give isl_map *isl_map_oppose(__isl_take isl_map *map,
2311                 enum isl_dim_type type1, int pos1,
2312                 enum isl_dim_type type2, int pos2);
2313
2314 Intersect the relation with the hyperplane where the given
2315 dimensions have opposite values.
2316
2317         __isl_give isl_basic_map *isl_basic_map_order_ge(
2318                 __isl_take isl_basic_map *bmap,
2319                 enum isl_dim_type type1, int pos1,
2320                 enum isl_dim_type type2, int pos2);
2321         __isl_give isl_map *isl_map_order_lt(__isl_take isl_map *map,
2322                 enum isl_dim_type type1, int pos1,
2323                 enum isl_dim_type type2, int pos2);
2324         __isl_give isl_basic_map *isl_basic_map_order_gt(
2325                 __isl_take isl_basic_map *bmap,
2326                 enum isl_dim_type type1, int pos1,
2327                 enum isl_dim_type type2, int pos2);
2328         __isl_give isl_map *isl_map_order_gt(__isl_take isl_map *map,
2329                 enum isl_dim_type type1, int pos1,
2330                 enum isl_dim_type type2, int pos2);
2331
2332 Intersect the relation with the half-space where the given
2333 dimensions satisfy the given ordering.
2334
2335 =item * Identity
2336
2337         __isl_give isl_map *isl_set_identity(
2338                 __isl_take isl_set *set);
2339         __isl_give isl_union_map *isl_union_set_identity(
2340                 __isl_take isl_union_set *uset);
2341
2342 Construct an identity relation on the given (union) set.
2343
2344 =item * Deltas
2345
2346         __isl_give isl_basic_set *isl_basic_map_deltas(
2347                 __isl_take isl_basic_map *bmap);
2348         __isl_give isl_set *isl_map_deltas(__isl_take isl_map *map);
2349         __isl_give isl_union_set *isl_union_map_deltas(
2350                 __isl_take isl_union_map *umap);
2351
2352 These functions return a (basic) set containing the differences
2353 between image elements and corresponding domain elements in the input.
2354
2355         __isl_give isl_basic_map *isl_basic_map_deltas_map(
2356                 __isl_take isl_basic_map *bmap);
2357         __isl_give isl_map *isl_map_deltas_map(
2358                 __isl_take isl_map *map);
2359         __isl_give isl_union_map *isl_union_map_deltas_map(
2360                 __isl_take isl_union_map *umap);
2361
2362 The functions above construct a (basic, regular or union) relation
2363 that maps (a wrapped version of) the input relation to its delta set.
2364
2365 =item * Coalescing
2366
2367 Simplify the representation of a set or relation by trying
2368 to combine pairs of basic sets or relations into a single
2369 basic set or relation.
2370
2371         __isl_give isl_set *isl_set_coalesce(__isl_take isl_set *set);
2372         __isl_give isl_map *isl_map_coalesce(__isl_take isl_map *map);
2373         __isl_give isl_union_set *isl_union_set_coalesce(
2374                 __isl_take isl_union_set *uset);
2375         __isl_give isl_union_map *isl_union_map_coalesce(
2376                 __isl_take isl_union_map *umap);
2377
2378 One of the methods for combining pairs of basic sets or relations
2379 can result in coefficients that are much larger than those that appear
2380 in the constraints of the input.  By default, the coefficients are
2381 not allowed to grow larger, but this can be changed by unsetting
2382 the following option.
2383
2384         int isl_options_set_coalesce_bounded_wrapping(
2385                 isl_ctx *ctx, int val);
2386         int isl_options_get_coalesce_bounded_wrapping(
2387                 isl_ctx *ctx);
2388
2389 =item * Detecting equalities
2390
2391         __isl_give isl_basic_set *isl_basic_set_detect_equalities(
2392                 __isl_take isl_basic_set *bset);
2393         __isl_give isl_basic_map *isl_basic_map_detect_equalities(
2394                 __isl_take isl_basic_map *bmap);
2395         __isl_give isl_set *isl_set_detect_equalities(
2396                 __isl_take isl_set *set);
2397         __isl_give isl_map *isl_map_detect_equalities(
2398                 __isl_take isl_map *map);
2399         __isl_give isl_union_set *isl_union_set_detect_equalities(
2400                 __isl_take isl_union_set *uset);
2401         __isl_give isl_union_map *isl_union_map_detect_equalities(
2402                 __isl_take isl_union_map *umap);
2403
2404 Simplify the representation of a set or relation by detecting implicit
2405 equalities.
2406
2407 =item * Removing redundant constraints
2408
2409         __isl_give isl_basic_set *isl_basic_set_remove_redundancies(
2410                 __isl_take isl_basic_set *bset);
2411         __isl_give isl_set *isl_set_remove_redundancies(
2412                 __isl_take isl_set *set);
2413         __isl_give isl_basic_map *isl_basic_map_remove_redundancies(
2414                 __isl_take isl_basic_map *bmap);
2415         __isl_give isl_map *isl_map_remove_redundancies(
2416                 __isl_take isl_map *map);
2417
2418 =item * Convex hull
2419
2420         __isl_give isl_basic_set *isl_set_convex_hull(
2421                 __isl_take isl_set *set);
2422         __isl_give isl_basic_map *isl_map_convex_hull(
2423                 __isl_take isl_map *map);
2424
2425 If the input set or relation has any existentially quantified
2426 variables, then the result of these operations is currently undefined.
2427
2428 =item * Simple hull
2429
2430         __isl_give isl_basic_set *
2431         isl_set_unshifted_simple_hull(
2432                 __isl_take isl_set *set);
2433         __isl_give isl_basic_map *
2434         isl_map_unshifted_simple_hull(
2435                 __isl_take isl_map *map);
2436         __isl_give isl_basic_set *isl_set_simple_hull(
2437                 __isl_take isl_set *set);
2438         __isl_give isl_basic_map *isl_map_simple_hull(
2439                 __isl_take isl_map *map);
2440         __isl_give isl_union_map *isl_union_map_simple_hull(
2441                 __isl_take isl_union_map *umap);
2442
2443 These functions compute a single basic set or relation
2444 that contains the whole input set or relation.
2445 In particular, the output is described by translates
2446 of the constraints describing the basic sets or relations in the input.
2447 In case of C<isl_set_unshifted_simple_hull>, only the original
2448 constraints are used, without any translation.
2449
2450 =begin latex
2451
2452 (See \autoref{s:simple hull}.)
2453
2454 =end latex
2455
2456 =item * Affine hull
2457
2458         __isl_give isl_basic_set *isl_basic_set_affine_hull(
2459                 __isl_take isl_basic_set *bset);
2460         __isl_give isl_basic_set *isl_set_affine_hull(
2461                 __isl_take isl_set *set);
2462         __isl_give isl_union_set *isl_union_set_affine_hull(
2463                 __isl_take isl_union_set *uset);
2464         __isl_give isl_basic_map *isl_basic_map_affine_hull(
2465                 __isl_take isl_basic_map *bmap);
2466         __isl_give isl_basic_map *isl_map_affine_hull(
2467                 __isl_take isl_map *map);
2468         __isl_give isl_union_map *isl_union_map_affine_hull(
2469                 __isl_take isl_union_map *umap);
2470
2471 In case of union sets and relations, the affine hull is computed
2472 per space.
2473
2474 =item * Polyhedral hull
2475
2476         __isl_give isl_basic_set *isl_set_polyhedral_hull(
2477                 __isl_take isl_set *set);
2478         __isl_give isl_basic_map *isl_map_polyhedral_hull(
2479                 __isl_take isl_map *map);
2480         __isl_give isl_union_set *isl_union_set_polyhedral_hull(
2481                 __isl_take isl_union_set *uset);
2482         __isl_give isl_union_map *isl_union_map_polyhedral_hull(
2483                 __isl_take isl_union_map *umap);
2484
2485 These functions compute a single basic set or relation
2486 not involving any existentially quantified variables
2487 that contains the whole input set or relation.
2488 In case of union sets and relations, the polyhedral hull is computed
2489 per space.
2490
2491 =item * Other approximations
2492
2493         __isl_give isl_basic_set *
2494         isl_basic_set_drop_constraints_involving_dims(
2495                 __isl_take isl_basic_set *bset,
2496                 enum isl_dim_type type,
2497                 unsigned first, unsigned n);
2498         __isl_give isl_basic_map *
2499         isl_basic_map_drop_constraints_involving_dims(
2500                 __isl_take isl_basic_map *bmap,
2501                 enum isl_dim_type type,
2502                 unsigned first, unsigned n);
2503         __isl_give isl_basic_set *
2504         isl_basic_set_drop_constraints_not_involving_dims(
2505                 __isl_take isl_basic_set *bset,
2506                 enum isl_dim_type type,
2507                 unsigned first, unsigned n);
2508         __isl_give isl_set *
2509         isl_set_drop_constraints_involving_dims(
2510                 __isl_take isl_set *set,
2511                 enum isl_dim_type type,
2512                 unsigned first, unsigned n);
2513         __isl_give isl_map *
2514         isl_map_drop_constraints_involving_dims(
2515                 __isl_take isl_map *map,
2516                 enum isl_dim_type type,
2517                 unsigned first, unsigned n);
2518
2519 These functions drop any constraints (not) involving the specified dimensions.
2520 Note that the result depends on the representation of the input.
2521
2522 =item * Feasibility
2523
2524         __isl_give isl_basic_set *isl_basic_set_sample(
2525                 __isl_take isl_basic_set *bset);
2526         __isl_give isl_basic_set *isl_set_sample(
2527                 __isl_take isl_set *set);
2528         __isl_give isl_basic_map *isl_basic_map_sample(
2529                 __isl_take isl_basic_map *bmap);
2530         __isl_give isl_basic_map *isl_map_sample(
2531                 __isl_take isl_map *map);
2532
2533 If the input (basic) set or relation is non-empty, then return
2534 a singleton subset of the input.  Otherwise, return an empty set.
2535
2536 =item * Optimization
2537
2538         #include <isl/ilp.h>
2539         enum isl_lp_result isl_basic_set_max(
2540                 __isl_keep isl_basic_set *bset,
2541                 __isl_keep isl_aff *obj, isl_int *opt)
2542         enum isl_lp_result isl_set_min(__isl_keep isl_set *set,
2543                 __isl_keep isl_aff *obj, isl_int *opt);
2544         enum isl_lp_result isl_set_max(__isl_keep isl_set *set,
2545                 __isl_keep isl_aff *obj, isl_int *opt);
2546
2547 Compute the minimum or maximum of the integer affine expression C<obj>
2548 over the points in C<set>, returning the result in C<opt>.
2549 The return value may be one of C<isl_lp_error>,
2550 C<isl_lp_ok>, C<isl_lp_unbounded> or C<isl_lp_empty>.
2551
2552 =item * Parametric optimization
2553
2554         __isl_give isl_pw_aff *isl_set_dim_min(
2555                 __isl_take isl_set *set, int pos);
2556         __isl_give isl_pw_aff *isl_set_dim_max(
2557                 __isl_take isl_set *set, int pos);
2558         __isl_give isl_pw_aff *isl_map_dim_max(
2559                 __isl_take isl_map *map, int pos);
2560
2561 Compute the minimum or maximum of the given set or output dimension
2562 as a function of the parameters (and input dimensions), but independently
2563 of the other set or output dimensions.
2564 For lexicographic optimization, see L<"Lexicographic Optimization">.
2565
2566 =item * Dual
2567
2568 The following functions compute either the set of (rational) coefficient
2569 values of valid constraints for the given set or the set of (rational)
2570 values satisfying the constraints with coefficients from the given set.
2571 Internally, these two sets of functions perform essentially the
2572 same operations, except that the set of coefficients is assumed to
2573 be a cone, while the set of values may be any polyhedron.
2574 The current implementation is based on the Farkas lemma and
2575 Fourier-Motzkin elimination, but this may change or be made optional
2576 in future.  In particular, future implementations may use different
2577 dualization algorithms or skip the elimination step.
2578
2579         __isl_give isl_basic_set *isl_basic_set_coefficients(
2580                 __isl_take isl_basic_set *bset);
2581         __isl_give isl_basic_set *isl_set_coefficients(
2582                 __isl_take isl_set *set);
2583         __isl_give isl_union_set *isl_union_set_coefficients(
2584                 __isl_take isl_union_set *bset);
2585         __isl_give isl_basic_set *isl_basic_set_solutions(
2586                 __isl_take isl_basic_set *bset);
2587         __isl_give isl_basic_set *isl_set_solutions(
2588                 __isl_take isl_set *set);
2589         __isl_give isl_union_set *isl_union_set_solutions(
2590                 __isl_take isl_union_set *bset);
2591
2592 =item * Power
2593
2594         __isl_give isl_map *isl_map_fixed_power(
2595                 __isl_take isl_map *map, isl_int exp);
2596         __isl_give isl_union_map *isl_union_map_fixed_power(
2597                 __isl_take isl_union_map *umap, isl_int exp);
2598
2599 Compute the given power of C<map>, where C<exp> is assumed to be non-zero.
2600 If the exponent C<exp> is negative, then the -C<exp> th power of the inverse
2601 of C<map> is computed.
2602
2603         __isl_give isl_map *isl_map_power(__isl_take isl_map *map,
2604                 int *exact);
2605         __isl_give isl_union_map *isl_union_map_power(
2606                 __isl_take isl_union_map *umap, int *exact);
2607
2608 Compute a parametric representation for all positive powers I<k> of C<map>.
2609 The result maps I<k> to a nested relation corresponding to the
2610 I<k>th power of C<map>.
2611 The result may be an overapproximation.  If the result is known to be exact,
2612 then C<*exact> is set to C<1>.
2613
2614 =item * Transitive closure
2615
2616         __isl_give isl_map *isl_map_transitive_closure(
2617                 __isl_take isl_map *map, int *exact);
2618         __isl_give isl_union_map *isl_union_map_transitive_closure(
2619                 __isl_take isl_union_map *umap, int *exact);
2620
2621 Compute the transitive closure of C<map>.
2622 The result may be an overapproximation.  If the result is known to be exact,
2623 then C<*exact> is set to C<1>.
2624
2625 =item * Reaching path lengths
2626
2627         __isl_give isl_map *isl_map_reaching_path_lengths(
2628                 __isl_take isl_map *map, int *exact);
2629
2630 Compute a relation that maps each element in the range of C<map>
2631 to the lengths of all paths composed of edges in C<map> that
2632 end up in the given element.
2633 The result may be an overapproximation.  If the result is known to be exact,
2634 then C<*exact> is set to C<1>.
2635 To compute the I<maximal> path length, the resulting relation
2636 should be postprocessed by C<isl_map_lexmax>.
2637 In particular, if the input relation is a dependence relation
2638 (mapping sources to sinks), then the maximal path length corresponds
2639 to the free schedule.
2640 Note, however, that C<isl_map_lexmax> expects the maximum to be
2641 finite, so if the path lengths are unbounded (possibly due to
2642 the overapproximation), then you will get an error message.
2643
2644 =item * Wrapping
2645
2646         __isl_give isl_basic_set *isl_basic_map_wrap(
2647                 __isl_take isl_basic_map *bmap);
2648         __isl_give isl_set *isl_map_wrap(
2649                 __isl_take isl_map *map);
2650         __isl_give isl_union_set *isl_union_map_wrap(
2651                 __isl_take isl_union_map *umap);
2652         __isl_give isl_basic_map *isl_basic_set_unwrap(
2653                 __isl_take isl_basic_set *bset);
2654         __isl_give isl_map *isl_set_unwrap(
2655                 __isl_take isl_set *set);
2656         __isl_give isl_union_map *isl_union_set_unwrap(
2657                 __isl_take isl_union_set *uset);
2658
2659 =item * Flattening
2660
2661 Remove any internal structure of domain (and range) of the given
2662 set or relation.  If there is any such internal structure in the input,
2663 then the name of the space is also removed.
2664
2665         __isl_give isl_basic_set *isl_basic_set_flatten(
2666                 __isl_take isl_basic_set *bset);
2667         __isl_give isl_set *isl_set_flatten(
2668                 __isl_take isl_set *set);
2669         __isl_give isl_basic_map *isl_basic_map_flatten_domain(
2670                 __isl_take isl_basic_map *bmap);
2671         __isl_give isl_basic_map *isl_basic_map_flatten_range(
2672                 __isl_take isl_basic_map *bmap);
2673         __isl_give isl_map *isl_map_flatten_range(
2674                 __isl_take isl_map *map);
2675         __isl_give isl_map *isl_map_flatten_domain(
2676                 __isl_take isl_map *map);
2677         __isl_give isl_basic_map *isl_basic_map_flatten(
2678                 __isl_take isl_basic_map *bmap);
2679         __isl_give isl_map *isl_map_flatten(
2680                 __isl_take isl_map *map);
2681
2682         __isl_give isl_map *isl_set_flatten_map(
2683                 __isl_take isl_set *set);
2684
2685 The function above constructs a relation
2686 that maps the input set to a flattened version of the set.
2687
2688 =item * Lifting
2689
2690 Lift the input set to a space with extra dimensions corresponding
2691 to the existentially quantified variables in the input.
2692 In particular, the result lives in a wrapped map where the domain
2693 is the original space and the range corresponds to the original
2694 existentially quantified variables.
2695
2696         __isl_give isl_basic_set *isl_basic_set_lift(
2697                 __isl_take isl_basic_set *bset);
2698         __isl_give isl_set *isl_set_lift(
2699                 __isl_take isl_set *set);
2700         __isl_give isl_union_set *isl_union_set_lift(
2701                 __isl_take isl_union_set *uset);
2702
2703 Given a local space that contains the existentially quantified
2704 variables of a set, a basic relation that, when applied to
2705 a basic set, has essentially the same effect as C<isl_basic_set_lift>,
2706 can be constructed using the following function.
2707
2708         #include <isl/local_space.h>
2709         __isl_give isl_basic_map *isl_local_space_lifting(
2710                 __isl_take isl_local_space *ls);
2711
2712 =item * Internal Product
2713
2714         __isl_give isl_basic_map *isl_basic_map_zip(
2715                 __isl_take isl_basic_map *bmap);
2716         __isl_give isl_map *isl_map_zip(
2717                 __isl_take isl_map *map);
2718         __isl_give isl_union_map *isl_union_map_zip(
2719                 __isl_take isl_union_map *umap);
2720
2721 Given a relation with nested relations for domain and range,
2722 interchange the range of the domain with the domain of the range.
2723
2724 =item * Currying
2725
2726         __isl_give isl_basic_map *isl_basic_map_curry(
2727                 __isl_take isl_basic_map *bmap);
2728         __isl_give isl_basic_map *isl_basic_map_uncurry(
2729                 __isl_take isl_basic_map *bmap);
2730         __isl_give isl_map *isl_map_curry(
2731                 __isl_take isl_map *map);
2732         __isl_give isl_map *isl_map_uncurry(
2733                 __isl_take isl_map *map);
2734         __isl_give isl_union_map *isl_union_map_curry(
2735                 __isl_take isl_union_map *umap);
2736         __isl_give isl_union_map *isl_union_map_uncurry(
2737                 __isl_take isl_union_map *umap);
2738
2739 Given a relation with a nested relation for domain,
2740 the C<curry> functions
2741 move the range of the nested relation out of the domain
2742 and use it as the domain of a nested relation in the range,
2743 with the original range as range of this nested relation.
2744 The C<uncurry> functions perform the inverse operation.
2745
2746 =item * Aligning parameters
2747
2748         __isl_give isl_basic_set *isl_basic_set_align_params(
2749                 __isl_take isl_basic_set *bset,
2750                 __isl_take isl_space *model);
2751         __isl_give isl_set *isl_set_align_params(
2752                 __isl_take isl_set *set,
2753                 __isl_take isl_space *model);
2754         __isl_give isl_basic_map *isl_basic_map_align_params(
2755                 __isl_take isl_basic_map *bmap,
2756                 __isl_take isl_space *model);
2757         __isl_give isl_map *isl_map_align_params(
2758                 __isl_take isl_map *map,
2759                 __isl_take isl_space *model);
2760
2761 Change the order of the parameters of the given set or relation
2762 such that the first parameters match those of C<model>.
2763 This may involve the introduction of extra parameters.
2764 All parameters need to be named.
2765
2766 =item * Dimension manipulation
2767
2768         __isl_give isl_basic_set *isl_basic_set_add_dims(
2769                 __isl_take isl_basic_set *bset,
2770                 enum isl_dim_type type, unsigned n);
2771         __isl_give isl_set *isl_set_add_dims(
2772                 __isl_take isl_set *set,
2773                 enum isl_dim_type type, unsigned n);
2774         __isl_give isl_map *isl_map_add_dims(
2775                 __isl_take isl_map *map,
2776                 enum isl_dim_type type, unsigned n);
2777         __isl_give isl_basic_set *isl_basic_set_insert_dims(
2778                 __isl_take isl_basic_set *bset,
2779                 enum isl_dim_type type, unsigned pos,
2780                 unsigned n);
2781         __isl_give isl_basic_map *isl_basic_map_insert_dims(
2782                 __isl_take isl_basic_map *bmap,
2783                 enum isl_dim_type type, unsigned pos,
2784                 unsigned n);
2785         __isl_give isl_set *isl_set_insert_dims(
2786                 __isl_take isl_set *set,
2787                 enum isl_dim_type type, unsigned pos, unsigned n);
2788         __isl_give isl_map *isl_map_insert_dims(
2789                 __isl_take isl_map *map,
2790                 enum isl_dim_type type, unsigned pos, unsigned n);
2791         __isl_give isl_basic_set *isl_basic_set_move_dims(
2792                 __isl_take isl_basic_set *bset,
2793                 enum isl_dim_type dst_type, unsigned dst_pos,
2794                 enum isl_dim_type src_type, unsigned src_pos,
2795                 unsigned n);
2796         __isl_give isl_basic_map *isl_basic_map_move_dims(
2797                 __isl_take isl_basic_map *bmap,
2798                 enum isl_dim_type dst_type, unsigned dst_pos,
2799                 enum isl_dim_type src_type, unsigned src_pos,
2800                 unsigned n);
2801         __isl_give isl_set *isl_set_move_dims(
2802                 __isl_take isl_set *set,
2803                 enum isl_dim_type dst_type, unsigned dst_pos,
2804                 enum isl_dim_type src_type, unsigned src_pos,
2805                 unsigned n);
2806         __isl_give isl_map *isl_map_move_dims(
2807                 __isl_take isl_map *map,
2808                 enum isl_dim_type dst_type, unsigned dst_pos,
2809                 enum isl_dim_type src_type, unsigned src_pos,
2810                 unsigned n);
2811
2812 It is usually not advisable to directly change the (input or output)
2813 space of a set or a relation as this removes the name and the internal
2814 structure of the space.  However, the above functions can be useful
2815 to add new parameters, assuming
2816 C<isl_set_align_params> and C<isl_map_align_params>
2817 are not sufficient.
2818
2819 =back
2820
2821 =head2 Binary Operations
2822
2823 The two arguments of a binary operation not only need to live
2824 in the same C<isl_ctx>, they currently also need to have
2825 the same (number of) parameters.
2826
2827 =head3 Basic Operations
2828
2829 =over
2830
2831 =item * Intersection
2832
2833         __isl_give isl_basic_set *isl_basic_set_intersect_params(
2834                 __isl_take isl_basic_set *bset1,
2835                 __isl_take isl_basic_set *bset2);
2836         __isl_give isl_basic_set *isl_basic_set_intersect(
2837                 __isl_take isl_basic_set *bset1,
2838                 __isl_take isl_basic_set *bset2);
2839         __isl_give isl_set *isl_set_intersect_params(
2840                 __isl_take isl_set *set,
2841                 __isl_take isl_set *params);
2842         __isl_give isl_set *isl_set_intersect(
2843                 __isl_take isl_set *set1,
2844                 __isl_take isl_set *set2);
2845         __isl_give isl_union_set *isl_union_set_intersect_params(
2846                 __isl_take isl_union_set *uset,
2847                 __isl_take isl_set *set);
2848         __isl_give isl_union_map *isl_union_map_intersect_params(
2849                 __isl_take isl_union_map *umap,
2850                 __isl_take isl_set *set);
2851         __isl_give isl_union_set *isl_union_set_intersect(
2852                 __isl_take isl_union_set *uset1,
2853                 __isl_take isl_union_set *uset2);
2854         __isl_give isl_basic_map *isl_basic_map_intersect_domain(
2855                 __isl_take isl_basic_map *bmap,
2856                 __isl_take isl_basic_set *bset);
2857         __isl_give isl_basic_map *isl_basic_map_intersect_range(
2858                 __isl_take isl_basic_map *bmap,
2859                 __isl_take isl_basic_set *bset);
2860         __isl_give isl_basic_map *isl_basic_map_intersect(
2861                 __isl_take isl_basic_map *bmap1,
2862                 __isl_take isl_basic_map *bmap2);
2863         __isl_give isl_map *isl_map_intersect_params(
2864                 __isl_take isl_map *map,
2865                 __isl_take isl_set *params);
2866         __isl_give isl_map *isl_map_intersect_domain(
2867                 __isl_take isl_map *map,
2868                 __isl_take isl_set *set);
2869         __isl_give isl_map *isl_map_intersect_range(
2870                 __isl_take isl_map *map,
2871                 __isl_take isl_set *set);
2872         __isl_give isl_map *isl_map_intersect(
2873                 __isl_take isl_map *map1,
2874                 __isl_take isl_map *map2);
2875         __isl_give isl_union_map *isl_union_map_intersect_domain(
2876                 __isl_take isl_union_map *umap,
2877                 __isl_take isl_union_set *uset);
2878         __isl_give isl_union_map *isl_union_map_intersect_range(
2879                 __isl_take isl_union_map *umap,
2880                 __isl_take isl_union_set *uset);
2881         __isl_give isl_union_map *isl_union_map_intersect(
2882                 __isl_take isl_union_map *umap1,
2883                 __isl_take isl_union_map *umap2);
2884
2885 The second argument to the C<_params> functions needs to be
2886 a parametric (basic) set.  For the other functions, a parametric set
2887 for either argument is only allowed if the other argument is
2888 a parametric set as well.
2889
2890 =item * Union
2891
2892         __isl_give isl_set *isl_basic_set_union(
2893                 __isl_take isl_basic_set *bset1,
2894                 __isl_take isl_basic_set *bset2);
2895         __isl_give isl_map *isl_basic_map_union(
2896                 __isl_take isl_basic_map *bmap1,
2897                 __isl_take isl_basic_map *bmap2);
2898         __isl_give isl_set *isl_set_union(
2899                 __isl_take isl_set *set1,
2900                 __isl_take isl_set *set2);
2901         __isl_give isl_map *isl_map_union(
2902                 __isl_take isl_map *map1,
2903                 __isl_take isl_map *map2);
2904         __isl_give isl_union_set *isl_union_set_union(
2905                 __isl_take isl_union_set *uset1,
2906                 __isl_take isl_union_set *uset2);
2907         __isl_give isl_union_map *isl_union_map_union(
2908                 __isl_take isl_union_map *umap1,
2909                 __isl_take isl_union_map *umap2);
2910
2911 =item * Set difference
2912
2913         __isl_give isl_set *isl_set_subtract(
2914                 __isl_take isl_set *set1,
2915                 __isl_take isl_set *set2);
2916         __isl_give isl_map *isl_map_subtract(
2917                 __isl_take isl_map *map1,
2918                 __isl_take isl_map *map2);
2919         __isl_give isl_map *isl_map_subtract_domain(
2920                 __isl_take isl_map *map,
2921                 __isl_take isl_set *dom);
2922         __isl_give isl_map *isl_map_subtract_range(
2923                 __isl_take isl_map *map,
2924                 __isl_take isl_set *dom);
2925         __isl_give isl_union_set *isl_union_set_subtract(
2926                 __isl_take isl_union_set *uset1,
2927                 __isl_take isl_union_set *uset2);
2928         __isl_give isl_union_map *isl_union_map_subtract(
2929                 __isl_take isl_union_map *umap1,
2930                 __isl_take isl_union_map *umap2);
2931         __isl_give isl_union_map *isl_union_map_subtract_domain(
2932                 __isl_take isl_union_map *umap,
2933                 __isl_take isl_union_set *dom);
2934         __isl_give isl_union_map *isl_union_map_subtract_range(
2935                 __isl_take isl_union_map *umap,
2936                 __isl_take isl_union_set *dom);
2937
2938 =item * Application
2939
2940         __isl_give isl_basic_set *isl_basic_set_apply(
2941                 __isl_take isl_basic_set *bset,
2942                 __isl_take isl_basic_map *bmap);
2943         __isl_give isl_set *isl_set_apply(
2944                 __isl_take isl_set *set,
2945                 __isl_take isl_map *map);
2946         __isl_give isl_union_set *isl_union_set_apply(
2947                 __isl_take isl_union_set *uset,
2948                 __isl_take isl_union_map *umap);
2949         __isl_give isl_basic_map *isl_basic_map_apply_domain(
2950                 __isl_take isl_basic_map *bmap1,
2951                 __isl_take isl_basic_map *bmap2);
2952         __isl_give isl_basic_map *isl_basic_map_apply_range(
2953                 __isl_take isl_basic_map *bmap1,
2954                 __isl_take isl_basic_map *bmap2);
2955         __isl_give isl_map *isl_map_apply_domain(
2956                 __isl_take isl_map *map1,
2957                 __isl_take isl_map *map2);
2958         __isl_give isl_union_map *isl_union_map_apply_domain(
2959                 __isl_take isl_union_map *umap1,
2960                 __isl_take isl_union_map *umap2);
2961         __isl_give isl_map *isl_map_apply_range(
2962                 __isl_take isl_map *map1,
2963                 __isl_take isl_map *map2);
2964         __isl_give isl_union_map *isl_union_map_apply_range(
2965                 __isl_take isl_union_map *umap1,
2966                 __isl_take isl_union_map *umap2);
2967
2968 =item * Preimage
2969
2970         __isl_give isl_basic_set *
2971         isl_basic_set_preimage_multi_aff(
2972                 __isl_take isl_basic_set *bset,
2973                 __isl_take isl_multi_aff *ma);
2974         __isl_give isl_set *isl_set_preimage_multi_aff(
2975                 __isl_take isl_set *set,
2976                 __isl_take isl_multi_aff *ma);
2977         __isl_give isl_set *isl_set_preimage_pw_multi_aff(
2978                 __isl_take isl_set *set,
2979                 __isl_take isl_pw_multi_aff *pma);
2980         __isl_give isl_map *isl_map_preimage_domain_multi_aff(
2981                 __isl_take isl_map *map,
2982                 __isl_take isl_multi_aff *ma);
2983         __isl_give isl_union_map *
2984         isl_union_map_preimage_domain_multi_aff(
2985                 __isl_take isl_union_map *umap,
2986                 __isl_take isl_multi_aff *ma);
2987
2988 These functions compute the preimage of the given set or map domain under
2989 the given function.  In other words, the expression is plugged
2990 into the set description or into the domain of the map.
2991 Objects of types C<isl_multi_aff> and C<isl_pw_multi_aff> are described in
2992 L</"Piecewise Multiple Quasi Affine Expressions">.
2993
2994 =item * Cartesian Product
2995
2996         __isl_give isl_set *isl_set_product(
2997                 __isl_take isl_set *set1,
2998                 __isl_take isl_set *set2);
2999         __isl_give isl_union_set *isl_union_set_product(
3000                 __isl_take isl_union_set *uset1,
3001                 __isl_take isl_union_set *uset2);
3002         __isl_give isl_basic_map *isl_basic_map_domain_product(
3003                 __isl_take isl_basic_map *bmap1,
3004                 __isl_take isl_basic_map *bmap2);
3005         __isl_give isl_basic_map *isl_basic_map_range_product(
3006                 __isl_take isl_basic_map *bmap1,
3007                 __isl_take isl_basic_map *bmap2);
3008         __isl_give isl_basic_map *isl_basic_map_product(
3009                 __isl_take isl_basic_map *bmap1,
3010                 __isl_take isl_basic_map *bmap2);
3011         __isl_give isl_map *isl_map_domain_product(
3012                 __isl_take isl_map *map1,
3013                 __isl_take isl_map *map2);
3014         __isl_give isl_map *isl_map_range_product(
3015                 __isl_take isl_map *map1,
3016                 __isl_take isl_map *map2);
3017         __isl_give isl_union_map *isl_union_map_domain_product(
3018                 __isl_take isl_union_map *umap1,
3019                 __isl_take isl_union_map *umap2);
3020         __isl_give isl_union_map *isl_union_map_range_product(
3021                 __isl_take isl_union_map *umap1,
3022                 __isl_take isl_union_map *umap2);
3023         __isl_give isl_map *isl_map_product(
3024                 __isl_take isl_map *map1,
3025                 __isl_take isl_map *map2);
3026         __isl_give isl_union_map *isl_union_map_product(
3027                 __isl_take isl_union_map *umap1,
3028                 __isl_take isl_union_map *umap2);
3029
3030 The above functions compute the cross product of the given
3031 sets or relations.  The domains and ranges of the results
3032 are wrapped maps between domains and ranges of the inputs.
3033 To obtain a ``flat'' product, use the following functions
3034 instead.
3035
3036         __isl_give isl_basic_set *isl_basic_set_flat_product(
3037                 __isl_take isl_basic_set *bset1,
3038                 __isl_take isl_basic_set *bset2);
3039         __isl_give isl_set *isl_set_flat_product(
3040                 __isl_take isl_set *set1,
3041                 __isl_take isl_set *set2);
3042         __isl_give isl_basic_map *isl_basic_map_flat_range_product(
3043                 __isl_take isl_basic_map *bmap1,
3044                 __isl_take isl_basic_map *bmap2);
3045         __isl_give isl_map *isl_map_flat_domain_product(
3046                 __isl_take isl_map *map1,
3047                 __isl_take isl_map *map2);
3048         __isl_give isl_map *isl_map_flat_range_product(
3049                 __isl_take isl_map *map1,
3050                 __isl_take isl_map *map2);
3051         __isl_give isl_union_map *isl_union_map_flat_range_product(
3052                 __isl_take isl_union_map *umap1,
3053                 __isl_take isl_union_map *umap2);
3054         __isl_give isl_basic_map *isl_basic_map_flat_product(
3055                 __isl_take isl_basic_map *bmap1,
3056                 __isl_take isl_basic_map *bmap2);
3057         __isl_give isl_map *isl_map_flat_product(
3058                 __isl_take isl_map *map1,
3059                 __isl_take isl_map *map2);
3060
3061 =item * Simplification
3062
3063         __isl_give isl_basic_set *isl_basic_set_gist(
3064                 __isl_take isl_basic_set *bset,
3065                 __isl_take isl_basic_set *context);
3066         __isl_give isl_set *isl_set_gist(__isl_take isl_set *set,
3067                 __isl_take isl_set *context);
3068         __isl_give isl_set *isl_set_gist_params(
3069                 __isl_take isl_set *set,
3070                 __isl_take isl_set *context);
3071         __isl_give isl_union_set *isl_union_set_gist(
3072                 __isl_take isl_union_set *uset,
3073                 __isl_take isl_union_set *context);
3074         __isl_give isl_union_set *isl_union_set_gist_params(
3075                 __isl_take isl_union_set *uset,
3076                 __isl_take isl_set *set);
3077         __isl_give isl_basic_map *isl_basic_map_gist(
3078                 __isl_take isl_basic_map *bmap,
3079                 __isl_take isl_basic_map *context);
3080         __isl_give isl_map *isl_map_gist(__isl_take isl_map *map,
3081                 __isl_take isl_map *context);
3082         __isl_give isl_map *isl_map_gist_params(
3083                 __isl_take isl_map *map,
3084                 __isl_take isl_set *context);
3085         __isl_give isl_map *isl_map_gist_domain(
3086                 __isl_take isl_map *map,
3087                 __isl_take isl_set *context);
3088         __isl_give isl_map *isl_map_gist_range(
3089                 __isl_take isl_map *map,
3090                 __isl_take isl_set *context);
3091         __isl_give isl_union_map *isl_union_map_gist(
3092                 __isl_take isl_union_map *umap,
3093                 __isl_take isl_union_map *context);
3094         __isl_give isl_union_map *isl_union_map_gist_params(
3095                 __isl_take isl_union_map *umap,
3096                 __isl_take isl_set *set);
3097         __isl_give isl_union_map *isl_union_map_gist_domain(
3098                 __isl_take isl_union_map *umap,
3099                 __isl_take isl_union_set *uset);
3100         __isl_give isl_union_map *isl_union_map_gist_range(
3101                 __isl_take isl_union_map *umap,
3102                 __isl_take isl_union_set *uset);
3103
3104 The gist operation returns a set or relation that has the
3105 same intersection with the context as the input set or relation.
3106 Any implicit equality in the intersection is made explicit in the result,
3107 while all inequalities that are redundant with respect to the intersection
3108 are removed.
3109 In case of union sets and relations, the gist operation is performed
3110 per space.
3111
3112 =back
3113
3114 =head3 Lexicographic Optimization
3115
3116 Given a (basic) set C<set> (or C<bset>) and a zero-dimensional domain C<dom>,
3117 the following functions
3118 compute a set that contains the lexicographic minimum or maximum
3119 of the elements in C<set> (or C<bset>) for those values of the parameters
3120 that satisfy C<dom>.
3121 If C<empty> is not C<NULL>, then C<*empty> is assigned a set
3122 that contains the parameter values in C<dom> for which C<set> (or C<bset>)
3123 has no elements.
3124 In other words, the union of the parameter values
3125 for which the result is non-empty and of C<*empty>
3126 is equal to C<dom>.
3127
3128         __isl_give isl_set *isl_basic_set_partial_lexmin(
3129                 __isl_take isl_basic_set *bset,
3130                 __isl_take isl_basic_set *dom,
3131                 __isl_give isl_set **empty);
3132         __isl_give isl_set *isl_basic_set_partial_lexmax(
3133                 __isl_take isl_basic_set *bset,
3134                 __isl_take isl_basic_set *dom,
3135                 __isl_give isl_set **empty);
3136         __isl_give isl_set *isl_set_partial_lexmin(
3137                 __isl_take isl_set *set, __isl_take isl_set *dom,
3138                 __isl_give isl_set **empty);
3139         __isl_give isl_set *isl_set_partial_lexmax(
3140                 __isl_take isl_set *set, __isl_take isl_set *dom,
3141                 __isl_give isl_set **empty);
3142
3143 Given a (basic) set C<set> (or C<bset>), the following functions simply
3144 return a set containing the lexicographic minimum or maximum
3145 of the elements in C<set> (or C<bset>).
3146 In case of union sets, the optimum is computed per space.
3147
3148         __isl_give isl_set *isl_basic_set_lexmin(
3149                 __isl_take isl_basic_set *bset);
3150         __isl_give isl_set *isl_basic_set_lexmax(
3151                 __isl_take isl_basic_set *bset);
3152         __isl_give isl_set *isl_set_lexmin(
3153                 __isl_take isl_set *set);
3154         __isl_give isl_set *isl_set_lexmax(
3155                 __isl_take isl_set *set);
3156         __isl_give isl_union_set *isl_union_set_lexmin(
3157                 __isl_take isl_union_set *uset);
3158         __isl_give isl_union_set *isl_union_set_lexmax(
3159                 __isl_take isl_union_set *uset);
3160
3161 Given a (basic) relation C<map> (or C<bmap>) and a domain C<dom>,
3162 the following functions
3163 compute a relation that maps each element of C<dom>
3164 to the single lexicographic minimum or maximum
3165 of the elements that are associated to that same
3166 element in C<map> (or C<bmap>).
3167 If C<empty> is not C<NULL>, then C<*empty> is assigned a set
3168 that contains the elements in C<dom> that do not map
3169 to any elements in C<map> (or C<bmap>).
3170 In other words, the union of the domain of the result and of C<*empty>
3171 is equal to C<dom>.
3172
3173         __isl_give isl_map *isl_basic_map_partial_lexmax(
3174                 __isl_take isl_basic_map *bmap,
3175                 __isl_take isl_basic_set *dom,
3176                 __isl_give isl_set **empty);
3177         __isl_give isl_map *isl_basic_map_partial_lexmin(
3178                 __isl_take isl_basic_map *bmap,
3179                 __isl_take isl_basic_set *dom,
3180                 __isl_give isl_set **empty);
3181         __isl_give isl_map *isl_map_partial_lexmax(
3182                 __isl_take isl_map *map, __isl_take isl_set *dom,
3183                 __isl_give isl_set **empty);
3184         __isl_give isl_map *isl_map_partial_lexmin(
3185                 __isl_take isl_map *map, __isl_take isl_set *dom,
3186                 __isl_give isl_set **empty);
3187
3188 Given a (basic) map C<map> (or C<bmap>), the following functions simply
3189 return a map mapping each element in the domain of
3190 C<map> (or C<bmap>) to the lexicographic minimum or maximum
3191 of all elements associated to that element.
3192 In case of union relations, the optimum is computed per space.
3193
3194         __isl_give isl_map *isl_basic_map_lexmin(
3195                 __isl_take isl_basic_map *bmap);
3196         __isl_give isl_map *isl_basic_map_lexmax(
3197                 __isl_take isl_basic_map *bmap);
3198         __isl_give isl_map *isl_map_lexmin(
3199                 __isl_take isl_map *map);
3200         __isl_give isl_map *isl_map_lexmax(
3201                 __isl_take isl_map *map);
3202         __isl_give isl_union_map *isl_union_map_lexmin(
3203                 __isl_take isl_union_map *umap);
3204         __isl_give isl_union_map *isl_union_map_lexmax(
3205                 __isl_take isl_union_map *umap);
3206
3207 The following functions return their result in the form of
3208 a piecewise multi-affine expression
3209 (See L<"Piecewise Multiple Quasi Affine Expressions">),
3210 but are otherwise equivalent to the corresponding functions
3211 returning a basic set or relation.
3212
3213         __isl_give isl_pw_multi_aff *
3214         isl_basic_map_lexmin_pw_multi_aff(
3215                 __isl_take isl_basic_map *bmap);
3216         __isl_give isl_pw_multi_aff *
3217         isl_basic_set_partial_lexmin_pw_multi_aff(
3218                 __isl_take isl_basic_set *bset,
3219                 __isl_take isl_basic_set *dom,
3220                 __isl_give isl_set **empty);
3221         __isl_give isl_pw_multi_aff *
3222         isl_basic_set_partial_lexmax_pw_multi_aff(
3223                 __isl_take isl_basic_set *bset,
3224                 __isl_take isl_basic_set *dom,
3225                 __isl_give isl_set **empty);
3226         __isl_give isl_pw_multi_aff *
3227         isl_basic_map_partial_lexmin_pw_multi_aff(
3228                 __isl_take isl_basic_map *bmap,
3229                 __isl_take isl_basic_set *dom,
3230                 __isl_give isl_set **empty);
3231         __isl_give isl_pw_multi_aff *
3232         isl_basic_map_partial_lexmax_pw_multi_aff(
3233                 __isl_take isl_basic_map *bmap,
3234                 __isl_take isl_basic_set *dom,
3235                 __isl_give isl_set **empty);
3236         __isl_give isl_pw_multi_aff *isl_set_lexmin_pw_multi_aff(
3237                 __isl_take isl_set *set);
3238         __isl_give isl_pw_multi_aff *isl_set_lexmax_pw_multi_aff(
3239                 __isl_take isl_set *set);
3240         __isl_give isl_pw_multi_aff *isl_map_lexmin_pw_multi_aff(
3241                 __isl_take isl_map *map);
3242         __isl_give isl_pw_multi_aff *isl_map_lexmax_pw_multi_aff(
3243                 __isl_take isl_map *map);
3244
3245 =head2 Lists
3246
3247 Lists are defined over several element types, including
3248 C<isl_id>, C<isl_aff>, C<isl_pw_aff>, C<isl_constraint>,
3249 C<isl_basic_set>, C<isl_set>, C<isl_ast_expr> and C<isl_ast_node>.
3250 Here we take lists of C<isl_set>s as an example.
3251 Lists can be created, copied, modified and freed using the following functions.
3252
3253         #include <isl/list.h>
3254         __isl_give isl_set_list *isl_set_list_from_set(
3255                 __isl_take isl_set *el);
3256         __isl_give isl_set_list *isl_set_list_alloc(
3257                 isl_ctx *ctx, int n);
3258         __isl_give isl_set_list *isl_set_list_copy(
3259                 __isl_keep isl_set_list *list);
3260         __isl_give isl_set_list *isl_set_list_insert(
3261                 __isl_take isl_set_list *list, unsigned pos,
3262                 __isl_take isl_set *el);
3263         __isl_give isl_set_list *isl_set_list_add(
3264                 __isl_take isl_set_list *list,
3265                 __isl_take isl_set *el);
3266         __isl_give isl_set_list *isl_set_list_drop(
3267                 __isl_take isl_set_list *list,
3268                 unsigned first, unsigned n);
3269         __isl_give isl_set_list *isl_set_list_set_set(
3270                 __isl_take isl_set_list *list, int index,
3271                 __isl_take isl_set *set);
3272         __isl_give isl_set_list *isl_set_list_concat(
3273                 __isl_take isl_set_list *list1,
3274                 __isl_take isl_set_list *list2);
3275         __isl_give isl_set_list *isl_set_list_sort(
3276                 __isl_take isl_set_list *list,
3277                 int (*cmp)(__isl_keep isl_set *a,
3278                         __isl_keep isl_set *b, void *user),
3279                 void *user);
3280         void *isl_set_list_free(__isl_take isl_set_list *list);
3281
3282 C<isl_set_list_alloc> creates an empty list with a capacity for
3283 C<n> elements.  C<isl_set_list_from_set> creates a list with a single
3284 element.
3285
3286 Lists can be inspected using the following functions.
3287
3288         #include <isl/list.h>
3289         isl_ctx *isl_set_list_get_ctx(__isl_keep isl_set_list *list);
3290         int isl_set_list_n_set(__isl_keep isl_set_list *list);
3291         __isl_give isl_set *isl_set_list_get_set(
3292                 __isl_keep isl_set_list *list, int index);
3293         int isl_set_list_foreach(__isl_keep isl_set_list *list,
3294                 int (*fn)(__isl_take isl_set *el, void *user),
3295                 void *user);
3296         int isl_set_list_foreach_scc(__isl_keep isl_set_list *list,
3297                 int (*follows)(__isl_keep isl_set *a,
3298                         __isl_keep isl_set *b, void *user),
3299                 void *follows_user
3300                 int (*fn)(__isl_take isl_set *el, void *user),
3301                 void *fn_user);
3302
3303 The function C<isl_set_list_foreach_scc> calls C<fn> on each of the
3304 strongly connected components of the graph with as vertices the elements
3305 of C<list> and a directed edge from vertex C<b> to vertex C<a>
3306 iff C<follows(a, b)> returns C<1>.  The callbacks C<follows> and C<fn>
3307 should return C<-1> on error.
3308
3309 Lists can be printed using
3310
3311         #include <isl/list.h>
3312         __isl_give isl_printer *isl_printer_print_set_list(
3313                 __isl_take isl_printer *p,
3314                 __isl_keep isl_set_list *list);
3315
3316 =head2 Vectors
3317
3318 Vectors can be created, copied and freed using the following functions.
3319
3320         #include <isl/vec.h>
3321         __isl_give isl_vec *isl_vec_alloc(isl_ctx *ctx,
3322                 unsigned size);
3323         __isl_give isl_vec *isl_vec_copy(__isl_keep isl_vec *vec);
3324         void *isl_vec_free(__isl_take isl_vec *vec);
3325
3326 Note that the elements of a newly created vector may have arbitrary values.
3327 The elements can be changed and inspected using the following functions.
3328
3329         isl_ctx *isl_vec_get_ctx(__isl_keep isl_vec *vec);
3330         int isl_vec_size(__isl_keep isl_vec *vec);
3331         int isl_vec_get_element(__isl_keep isl_vec *vec,
3332                 int pos, isl_int *v);
3333         __isl_give isl_vec *isl_vec_set_element(
3334                 __isl_take isl_vec *vec, int pos, isl_int v);
3335         __isl_give isl_vec *isl_vec_set_element_si(
3336                 __isl_take isl_vec *vec, int pos, int v);
3337         __isl_give isl_vec *isl_vec_set(__isl_take isl_vec *vec,
3338                 isl_int v);
3339         __isl_give isl_vec *isl_vec_set_si(__isl_take isl_vec *vec,
3340                 int v);
3341         __isl_give isl_vec *isl_vec_fdiv_r(__isl_take isl_vec *vec,
3342                 isl_int m);
3343
3344 C<isl_vec_get_element> will return a negative value if anything went wrong.
3345 In that case, the value of C<*v> is undefined.
3346
3347 The following function can be used to concatenate two vectors.
3348
3349         __isl_give isl_vec *isl_vec_concat(__isl_take isl_vec *vec1,
3350                 __isl_take isl_vec *vec2);
3351
3352 =head2 Matrices
3353
3354 Matrices can be created, copied and freed using the following functions.
3355
3356         #include <isl/mat.h>
3357         __isl_give isl_mat *isl_mat_alloc(isl_ctx *ctx,
3358                 unsigned n_row, unsigned n_col);
3359         __isl_give isl_mat *isl_mat_copy(__isl_keep isl_mat *mat);
3360         void *isl_mat_free(__isl_take isl_mat *mat);
3361
3362 Note that the elements of a newly created matrix may have arbitrary values.
3363 The elements can be changed and inspected using the following functions.
3364
3365         isl_ctx *isl_mat_get_ctx(__isl_keep isl_mat *mat);
3366         int isl_mat_rows(__isl_keep isl_mat *mat);
3367         int isl_mat_cols(__isl_keep isl_mat *mat);
3368         int isl_mat_get_element(__isl_keep isl_mat *mat,
3369                 int row, int col, isl_int *v);
3370         __isl_give isl_mat *isl_mat_set_element(__isl_take isl_mat *mat,
3371                 int row, int col, isl_int v);
3372         __isl_give isl_mat *isl_mat_set_element_si(__isl_take isl_mat *mat,
3373                 int row, int col, int v);
3374
3375 C<isl_mat_get_element> will return a negative value if anything went wrong.
3376 In that case, the value of C<*v> is undefined.
3377
3378 The following function can be used to compute the (right) inverse
3379 of a matrix, i.e., a matrix such that the product of the original
3380 and the inverse (in that order) is a multiple of the identity matrix.
3381 The input matrix is assumed to be of full row-rank.
3382
3383         __isl_give isl_mat *isl_mat_right_inverse(__isl_take isl_mat *mat);
3384
3385 The following function can be used to compute the (right) kernel
3386 (or null space) of a matrix, i.e., a matrix such that the product of
3387 the original and the kernel (in that order) is the zero matrix.
3388
3389         __isl_give isl_mat *isl_mat_right_kernel(__isl_take isl_mat *mat);
3390
3391 =head2 Piecewise Quasi Affine Expressions
3392
3393 The zero quasi affine expression or the quasi affine expression
3394 that is equal to a specified dimension on a given domain can be created using
3395
3396         __isl_give isl_aff *isl_aff_zero_on_domain(
3397                 __isl_take isl_local_space *ls);
3398         __isl_give isl_pw_aff *isl_pw_aff_zero_on_domain(
3399                 __isl_take isl_local_space *ls);
3400         __isl_give isl_aff *isl_aff_var_on_domain(
3401                 __isl_take isl_local_space *ls,
3402                 enum isl_dim_type type, unsigned pos);
3403         __isl_give isl_pw_aff *isl_pw_aff_var_on_domain(
3404                 __isl_take isl_local_space *ls,
3405                 enum isl_dim_type type, unsigned pos);
3406
3407 Note that the space in which the resulting objects live is a map space
3408 with the given space as domain and a one-dimensional range.
3409
3410 An empty piecewise quasi affine expression (one with no cells)
3411 or a piecewise quasi affine expression with a single cell can
3412 be created using the following functions.
3413
3414         #include <isl/aff.h>
3415         __isl_give isl_pw_aff *isl_pw_aff_empty(
3416                 __isl_take isl_space *space);
3417         __isl_give isl_pw_aff *isl_pw_aff_alloc(
3418                 __isl_take isl_set *set, __isl_take isl_aff *aff);
3419         __isl_give isl_pw_aff *isl_pw_aff_from_aff(
3420                 __isl_take isl_aff *aff);
3421
3422 A piecewise quasi affine expression that is equal to 1 on a set
3423 and 0 outside the set can be created using the following function.
3424
3425         #include <isl/aff.h>
3426         __isl_give isl_pw_aff *isl_set_indicator_function(
3427                 __isl_take isl_set *set);
3428
3429 Quasi affine expressions can be copied and freed using
3430
3431         #include <isl/aff.h>
3432         __isl_give isl_aff *isl_aff_copy(__isl_keep isl_aff *aff);
3433         void *isl_aff_free(__isl_take isl_aff *aff);
3434
3435         __isl_give isl_pw_aff *isl_pw_aff_copy(
3436                 __isl_keep isl_pw_aff *pwaff);
3437         void *isl_pw_aff_free(__isl_take isl_pw_aff *pwaff);
3438
3439 A (rational) bound on a dimension can be extracted from an C<isl_constraint>
3440 using the following function.  The constraint is required to have
3441 a non-zero coefficient for the specified dimension.
3442
3443         #include <isl/constraint.h>
3444         __isl_give isl_aff *isl_constraint_get_bound(
3445                 __isl_keep isl_constraint *constraint,
3446                 enum isl_dim_type type, int pos);
3447
3448 The entire affine expression of the constraint can also be extracted
3449 using the following function.
3450
3451         #include <isl/constraint.h>
3452         __isl_give isl_aff *isl_constraint_get_aff(
3453                 __isl_keep isl_constraint *constraint);
3454
3455 Conversely, an equality constraint equating
3456 the affine expression to zero or an inequality constraint enforcing
3457 the affine expression to be non-negative, can be constructed using
3458
3459         __isl_give isl_constraint *isl_equality_from_aff(
3460                 __isl_take isl_aff *aff);
3461         __isl_give isl_constraint *isl_inequality_from_aff(
3462                 __isl_take isl_aff *aff);
3463
3464 The expression can be inspected using
3465
3466         #include <isl/aff.h>
3467         isl_ctx *isl_aff_get_ctx(__isl_keep isl_aff *aff);
3468         int isl_aff_dim(__isl_keep isl_aff *aff,
3469                 enum isl_dim_type type);
3470         __isl_give isl_local_space *isl_aff_get_domain_local_space(
3471                 __isl_keep isl_aff *aff);
3472         __isl_give isl_local_space *isl_aff_get_local_space(
3473                 __isl_keep isl_aff *aff);
3474         const char *isl_aff_get_dim_name(__isl_keep isl_aff *aff,
3475                 enum isl_dim_type type, unsigned pos);
3476         const char *isl_pw_aff_get_dim_name(
3477                 __isl_keep isl_pw_aff *pa,
3478                 enum isl_dim_type type, unsigned pos);
3479         int isl_pw_aff_has_dim_id(__isl_keep isl_pw_aff *pa,
3480                 enum isl_dim_type type, unsigned pos);
3481         __isl_give isl_id *isl_pw_aff_get_dim_id(
3482                 __isl_keep isl_pw_aff *pa,
3483                 enum isl_dim_type type, unsigned pos);
3484         __isl_give isl_id *isl_pw_aff_get_tuple_id(
3485                 __isl_keep isl_pw_aff *pa,
3486                 enum isl_dim_type type);
3487         int isl_aff_get_constant(__isl_keep isl_aff *aff,
3488                 isl_int *v);
3489         int isl_aff_get_coefficient(__isl_keep isl_aff *aff,
3490                 enum isl_dim_type type, int pos, isl_int *v);
3491         int isl_aff_get_denominator(__isl_keep isl_aff *aff,
3492                 isl_int *v);
3493         __isl_give isl_aff *isl_aff_get_div(
3494                 __isl_keep isl_aff *aff, int pos);
3495
3496         int isl_pw_aff_n_piece(__isl_keep isl_pw_aff *pwaff);
3497         int isl_pw_aff_foreach_piece(__isl_keep isl_pw_aff *pwaff,
3498                 int (*fn)(__isl_take isl_set *set,
3499                           __isl_take isl_aff *aff,
3500                           void *user), void *user);
3501
3502         int isl_aff_is_cst(__isl_keep isl_aff *aff);
3503         int isl_pw_aff_is_cst(__isl_keep isl_pw_aff *pwaff);
3504
3505         int isl_aff_involves_dims(__isl_keep isl_aff *aff,
3506                 enum isl_dim_type type, unsigned first, unsigned n);
3507         int isl_pw_aff_involves_dims(__isl_keep isl_pw_aff *pwaff,
3508                 enum isl_dim_type type, unsigned first, unsigned n);
3509
3510         isl_ctx *isl_pw_aff_get_ctx(__isl_keep isl_pw_aff *pwaff);
3511         unsigned isl_pw_aff_dim(__isl_keep isl_pw_aff *pwaff,
3512                 enum isl_dim_type type);
3513         int isl_pw_aff_is_empty(__isl_keep isl_pw_aff *pwaff);
3514
3515 It can be modified using
3516
3517         #include <isl/aff.h>
3518         __isl_give isl_pw_aff *isl_pw_aff_set_tuple_id(
3519                 __isl_take isl_pw_aff *pwaff,
3520                 enum isl_dim_type type, __isl_take isl_id *id);
3521         __isl_give isl_aff *isl_aff_set_dim_name(
3522                 __isl_take isl_aff *aff, enum isl_dim_type type,
3523                 unsigned pos, const char *s);
3524         __isl_give isl_aff *isl_aff_set_dim_id(
3525                 __isl_take isl_aff *aff, enum isl_dim_type type,
3526                 unsigned pos, __isl_take isl_id *id);
3527         __isl_give isl_pw_aff *isl_pw_aff_set_dim_id(
3528                 __isl_take isl_pw_aff *pma,
3529                 enum isl_dim_type type, unsigned pos,
3530                 __isl_take isl_id *id);
3531         __isl_give isl_aff *isl_aff_set_constant(
3532                 __isl_take isl_aff *aff, isl_int v);
3533         __isl_give isl_aff *isl_aff_set_constant_si(
3534                 __isl_take isl_aff *aff, int v);
3535         __isl_give isl_aff *isl_aff_set_coefficient(
3536                 __isl_take isl_aff *aff,
3537                 enum isl_dim_type type, int pos, isl_int v);
3538         __isl_give isl_aff *isl_aff_set_coefficient_si(
3539                 __isl_take isl_aff *aff,
3540                 enum isl_dim_type type, int pos, int v);
3541         __isl_give isl_aff *isl_aff_set_denominator(
3542                 __isl_take isl_aff *aff, isl_int v);
3543
3544         __isl_give isl_aff *isl_aff_add_constant(
3545                 __isl_take isl_aff *aff, isl_int v);
3546         __isl_give isl_aff *isl_aff_add_constant_si(
3547                 __isl_take isl_aff *aff, int v);
3548         __isl_give isl_aff *isl_aff_add_constant_num(
3549                 __isl_take isl_aff *aff, isl_int v);
3550         __isl_give isl_aff *isl_aff_add_constant_num_si(
3551                 __isl_take isl_aff *aff, int v);
3552         __isl_give isl_aff *isl_aff_add_coefficient(
3553                 __isl_take isl_aff *aff,
3554                 enum isl_dim_type type, int pos, isl_int v);
3555         __isl_give isl_aff *isl_aff_add_coefficient_si(
3556                 __isl_take isl_aff *aff,
3557                 enum isl_dim_type type, int pos, int v);
3558
3559         __isl_give isl_aff *isl_aff_insert_dims(
3560                 __isl_take isl_aff *aff,
3561                 enum isl_dim_type type, unsigned first, unsigned n);
3562         __isl_give isl_pw_aff *isl_pw_aff_insert_dims(
3563                 __isl_take isl_pw_aff *pwaff,
3564                 enum isl_dim_type type, unsigned first, unsigned n);
3565         __isl_give isl_aff *isl_aff_add_dims(
3566                 __isl_take isl_aff *aff,
3567                 enum isl_dim_type type, unsigned n);
3568         __isl_give isl_pw_aff *isl_pw_aff_add_dims(
3569                 __isl_take isl_pw_aff *pwaff,
3570                 enum isl_dim_type type, unsigned n);
3571         __isl_give isl_aff *isl_aff_drop_dims(
3572                 __isl_take isl_aff *aff,
3573                 enum isl_dim_type type, unsigned first, unsigned n);
3574         __isl_give isl_pw_aff *isl_pw_aff_drop_dims(
3575                 __isl_take isl_pw_aff *pwaff,
3576                 enum isl_dim_type type, unsigned first, unsigned n);
3577
3578 Note that the C<set_constant> and C<set_coefficient> functions
3579 set the I<numerator> of the constant or coefficient, while
3580 C<add_constant> and C<add_coefficient> add an integer value to
3581 the possibly rational constant or coefficient.
3582 The C<add_constant_num> functions add an integer value to
3583 the numerator.
3584
3585 To check whether an affine expressions is obviously zero
3586 or obviously equal to some other affine expression, use
3587
3588         #include <isl/aff.h>
3589         int isl_aff_plain_is_zero(__isl_keep isl_aff *aff);
3590         int isl_aff_plain_is_equal(__isl_keep isl_aff *aff1,
3591                 __isl_keep isl_aff *aff2);
3592         int isl_pw_aff_plain_is_equal(
3593                 __isl_keep isl_pw_aff *pwaff1,
3594                 __isl_keep isl_pw_aff *pwaff2);
3595
3596 Operations include
3597
3598         #include <isl/aff.h>
3599         __isl_give isl_aff *isl_aff_add(__isl_take isl_aff *aff1,
3600                 __isl_take isl_aff *aff2);
3601         __isl_give isl_pw_aff *isl_pw_aff_add(
3602                 __isl_take isl_pw_aff *pwaff1,
3603                 __isl_take isl_pw_aff *pwaff2);
3604         __isl_give isl_pw_aff *isl_pw_aff_min(
3605                 __isl_take isl_pw_aff *pwaff1,
3606                 __isl_take isl_pw_aff *pwaff2);
3607         __isl_give isl_pw_aff *isl_pw_aff_max(
3608                 __isl_take isl_pw_aff *pwaff1,
3609                 __isl_take isl_pw_aff *pwaff2);
3610         __isl_give isl_aff *isl_aff_sub(__isl_take isl_aff *aff1,
3611                 __isl_take isl_aff *aff2);
3612         __isl_give isl_pw_aff *isl_pw_aff_sub(
3613                 __isl_take isl_pw_aff *pwaff1,
3614                 __isl_take isl_pw_aff *pwaff2);
3615         __isl_give isl_aff *isl_aff_neg(__isl_take isl_aff *aff);
3616         __isl_give isl_pw_aff *isl_pw_aff_neg(
3617                 __isl_take isl_pw_aff *pwaff);
3618         __isl_give isl_aff *isl_aff_ceil(__isl_take isl_aff *aff);
3619         __isl_give isl_pw_aff *isl_pw_aff_ceil(
3620                 __isl_take isl_pw_aff *pwaff);
3621         __isl_give isl_aff *isl_aff_floor(__isl_take isl_aff *aff);
3622         __isl_give isl_pw_aff *isl_pw_aff_floor(
3623                 __isl_take isl_pw_aff *pwaff);
3624         __isl_give isl_aff *isl_aff_mod(__isl_take isl_aff *aff,
3625                 isl_int mod);
3626         __isl_give isl_pw_aff *isl_pw_aff_mod(
3627                 __isl_take isl_pw_aff *pwaff, isl_int mod);
3628         __isl_give isl_aff *isl_aff_scale(__isl_take isl_aff *aff,
3629                 isl_int f);
3630         __isl_give isl_pw_aff *isl_pw_aff_scale(
3631                 __isl_take isl_pw_aff *pwaff, isl_int f);
3632         __isl_give isl_aff *isl_aff_scale_down(__isl_take isl_aff *aff,
3633                 isl_int f);
3634         __isl_give isl_aff *isl_aff_scale_down_ui(
3635                 __isl_take isl_aff *aff, unsigned f);
3636         __isl_give isl_pw_aff *isl_pw_aff_scale_down(
3637                 __isl_take isl_pw_aff *pwaff, isl_int f);
3638
3639         __isl_give isl_pw_aff *isl_pw_aff_list_min(
3640                 __isl_take isl_pw_aff_list *list);
3641         __isl_give isl_pw_aff *isl_pw_aff_list_max(
3642                 __isl_take isl_pw_aff_list *list);
3643
3644         __isl_give isl_pw_aff *isl_pw_aff_coalesce(
3645                 __isl_take isl_pw_aff *pwqp);
3646
3647         __isl_give isl_aff *isl_aff_align_params(
3648                 __isl_take isl_aff *aff,
3649                 __isl_take isl_space *model);
3650         __isl_give isl_pw_aff *isl_pw_aff_align_params(
3651                 __isl_take isl_pw_aff *pwaff,
3652                 __isl_take isl_space *model);
3653
3654         __isl_give isl_aff *isl_aff_project_domain_on_params(
3655                 __isl_take isl_aff *aff);
3656
3657         __isl_give isl_aff *isl_aff_gist_params(
3658                 __isl_take isl_aff *aff,
3659                 __isl_take isl_set *context);
3660         __isl_give isl_aff *isl_aff_gist(__isl_take isl_aff *aff,
3661                 __isl_take isl_set *context);
3662         __isl_give isl_pw_aff *isl_pw_aff_gist_params(
3663                 __isl_take isl_pw_aff *pwaff,
3664                 __isl_take isl_set *context);
3665         __isl_give isl_pw_aff *isl_pw_aff_gist(
3666                 __isl_take isl_pw_aff *pwaff,
3667                 __isl_take isl_set *context);
3668
3669         __isl_give isl_set *isl_pw_aff_domain(
3670                 __isl_take isl_pw_aff *pwaff);
3671         __isl_give isl_pw_aff *isl_pw_aff_intersect_domain(
3672                 __isl_take isl_pw_aff *pa,
3673                 __isl_take isl_set *set);
3674         __isl_give isl_pw_aff *isl_pw_aff_intersect_params(
3675                 __isl_take isl_pw_aff *pa,
3676                 __isl_take isl_set *set);
3677
3678         __isl_give isl_aff *isl_aff_mul(__isl_take isl_aff *aff1,
3679                 __isl_take isl_aff *aff2);
3680         __isl_give isl_aff *isl_aff_div(__isl_take isl_aff *aff1,
3681                 __isl_take isl_aff *aff2);
3682         __isl_give isl_pw_aff *isl_pw_aff_mul(
3683                 __isl_take isl_pw_aff *pwaff1,
3684                 __isl_take isl_pw_aff *pwaff2);
3685         __isl_give isl_pw_aff *isl_pw_aff_div(
3686                 __isl_take isl_pw_aff *pa1,
3687                 __isl_take isl_pw_aff *pa2);
3688         __isl_give isl_pw_aff *isl_pw_aff_tdiv_q(
3689                 __isl_take isl_pw_aff *pa1,
3690                 __isl_take isl_pw_aff *pa2);
3691         __isl_give isl_pw_aff *isl_pw_aff_tdiv_r(
3692                 __isl_take isl_pw_aff *pa1,
3693                 __isl_take isl_pw_aff *pa2);
3694
3695 When multiplying two affine expressions, at least one of the two needs
3696 to be a constant.  Similarly, when dividing an affine expression by another,
3697 the second expression needs to be a constant.
3698 C<isl_pw_aff_tdiv_q> computes the quotient of an integer division with
3699 rounding towards zero.  C<isl_pw_aff_tdiv_r> computes the corresponding
3700 remainder.
3701
3702         #include <isl/aff.h>
3703         __isl_give isl_aff *isl_aff_pullback_multi_aff(
3704                 __isl_take isl_aff *aff,
3705                 __isl_take isl_multi_aff *ma);
3706         __isl_give isl_pw_aff *isl_pw_aff_pullback_multi_aff(
3707                 __isl_take isl_pw_aff *pa,
3708                 __isl_take isl_multi_aff *ma);
3709         __isl_give isl_pw_aff *isl_pw_aff_pullback_pw_multi_aff(
3710                 __isl_take isl_pw_aff *pa,
3711                 __isl_take isl_pw_multi_aff *pma);
3712
3713 These functions precompose the input expression by the given
3714 C<isl_multi_aff> or C<isl_pw_multi_aff>.  In other words,
3715 the C<isl_multi_aff> or C<isl_pw_multi_aff> is plugged
3716 into the (piecewise) affine expression.
3717 Objects of type C<isl_multi_aff> are described in
3718 L</"Piecewise Multiple Quasi Affine Expressions">.
3719
3720         #include <isl/aff.h>
3721         __isl_give isl_basic_set *isl_aff_zero_basic_set(
3722                 __isl_take isl_aff *aff);
3723         __isl_give isl_basic_set *isl_aff_neg_basic_set(
3724                 __isl_take isl_aff *aff);
3725         __isl_give isl_basic_set *isl_aff_le_basic_set(
3726                 __isl_take isl_aff *aff1, __isl_take isl_aff *aff2);
3727         __isl_give isl_basic_set *isl_aff_ge_basic_set(
3728                 __isl_take isl_aff *aff1, __isl_take isl_aff *aff2);
3729         __isl_give isl_set *isl_pw_aff_eq_set(
3730                 __isl_take isl_pw_aff *pwaff1,
3731                 __isl_take isl_pw_aff *pwaff2);
3732         __isl_give isl_set *isl_pw_aff_ne_set(
3733                 __isl_take isl_pw_aff *pwaff1,
3734                 __isl_take isl_pw_aff *pwaff2);
3735         __isl_give isl_set *isl_pw_aff_le_set(
3736                 __isl_take isl_pw_aff *pwaff1,
3737                 __isl_take isl_pw_aff *pwaff2);
3738         __isl_give isl_set *isl_pw_aff_lt_set(
3739                 __isl_take isl_pw_aff *pwaff1,
3740                 __isl_take isl_pw_aff *pwaff2);
3741         __isl_give isl_set *isl_pw_aff_ge_set(
3742                 __isl_take isl_pw_aff *pwaff1,
3743                 __isl_take isl_pw_aff *pwaff2);
3744         __isl_give isl_set *isl_pw_aff_gt_set(
3745                 __isl_take isl_pw_aff *pwaff1,
3746                 __isl_take isl_pw_aff *pwaff2);
3747
3748         __isl_give isl_set *isl_pw_aff_list_eq_set(
3749                 __isl_take isl_pw_aff_list *list1,
3750                 __isl_take isl_pw_aff_list *list2);
3751         __isl_give isl_set *isl_pw_aff_list_ne_set(
3752                 __isl_take isl_pw_aff_list *list1,
3753                 __isl_take isl_pw_aff_list *list2);
3754         __isl_give isl_set *isl_pw_aff_list_le_set(
3755                 __isl_take isl_pw_aff_list *list1,
3756                 __isl_take isl_pw_aff_list *list2);
3757         __isl_give isl_set *isl_pw_aff_list_lt_set(
3758                 __isl_take isl_pw_aff_list *list1,
3759                 __isl_take isl_pw_aff_list *list2);
3760         __isl_give isl_set *isl_pw_aff_list_ge_set(
3761                 __isl_take isl_pw_aff_list *list1,
3762                 __isl_take isl_pw_aff_list *list2);
3763         __isl_give isl_set *isl_pw_aff_list_gt_set(
3764                 __isl_take isl_pw_aff_list *list1,
3765                 __isl_take isl_pw_aff_list *list2);
3766
3767 The function C<isl_aff_neg_basic_set> returns a basic set
3768 containing those elements in the domain space
3769 of C<aff> where C<aff> is negative.
3770 The function C<isl_aff_ge_basic_set> returns a basic set
3771 containing those elements in the shared space
3772 of C<aff1> and C<aff2> where C<aff1> is greater than or equal to C<aff2>.
3773 The function C<isl_pw_aff_ge_set> returns a set
3774 containing those elements in the shared domain
3775 of C<pwaff1> and C<pwaff2> where C<pwaff1> is greater than or equal to C<pwaff2>.
3776 The functions operating on C<isl_pw_aff_list> apply the corresponding
3777 C<isl_pw_aff> function to each pair of elements in the two lists.
3778
3779         #include <isl/aff.h>
3780         __isl_give isl_set *isl_pw_aff_nonneg_set(
3781                 __isl_take isl_pw_aff *pwaff);
3782         __isl_give isl_set *isl_pw_aff_zero_set(
3783                 __isl_take isl_pw_aff *pwaff);
3784         __isl_give isl_set *isl_pw_aff_non_zero_set(
3785                 __isl_take isl_pw_aff *pwaff);
3786
3787 The function C<isl_pw_aff_nonneg_set> returns a set
3788 containing those elements in the domain
3789 of C<pwaff> where C<pwaff> is non-negative.
3790
3791         #include <isl/aff.h>
3792         __isl_give isl_pw_aff *isl_pw_aff_cond(
3793                 __isl_take isl_pw_aff *cond,
3794                 __isl_take isl_pw_aff *pwaff_true,
3795                 __isl_take isl_pw_aff *pwaff_false);
3796
3797 The function C<isl_pw_aff_cond> performs a conditional operator
3798 and returns an expression that is equal to C<pwaff_true>
3799 for elements where C<cond> is non-zero and equal to C<pwaff_false> for elements
3800 where C<cond> is zero.
3801
3802         #include <isl/aff.h>
3803         __isl_give isl_pw_aff *isl_pw_aff_union_min(
3804                 __isl_take isl_pw_aff *pwaff1,
3805                 __isl_take isl_pw_aff *pwaff2);
3806         __isl_give isl_pw_aff *isl_pw_aff_union_max(
3807                 __isl_take isl_pw_aff *pwaff1,
3808                 __isl_take isl_pw_aff *pwaff2);
3809         __isl_give isl_pw_aff *isl_pw_aff_union_add(
3810                 __isl_take isl_pw_aff *pwaff1,
3811                 __isl_take isl_pw_aff *pwaff2);
3812
3813 The function C<isl_pw_aff_union_max> computes a piecewise quasi-affine
3814 expression with a domain that is the union of those of C<pwaff1> and
3815 C<pwaff2> and such that on each cell, the quasi-affine expression is
3816 the maximum of those of C<pwaff1> and C<pwaff2>.  If only one of
3817 C<pwaff1> or C<pwaff2> is defined on a given cell, then the
3818 associated expression is the defined one.
3819
3820 An expression can be read from input using
3821
3822         #include <isl/aff.h>
3823         __isl_give isl_aff *isl_aff_read_from_str(
3824                 isl_ctx *ctx, const char *str);
3825         __isl_give isl_pw_aff *isl_pw_aff_read_from_str(
3826                 isl_ctx *ctx, const char *str);
3827
3828 An expression can be printed using
3829
3830         #include <isl/aff.h>
3831         __isl_give isl_printer *isl_printer_print_aff(
3832                 __isl_take isl_printer *p, __isl_keep isl_aff *aff);
3833
3834         __isl_give isl_printer *isl_printer_print_pw_aff(
3835                 __isl_take isl_printer *p,
3836                 __isl_keep isl_pw_aff *pwaff);
3837
3838 =head2 Piecewise Multiple Quasi Affine Expressions
3839
3840 An C<isl_multi_aff> object represents a sequence of
3841 zero or more affine expressions, all defined on the same domain space.
3842 Similarly, an C<isl_multi_pw_aff> object represents a sequence of
3843 zero or more piecewise affine expressions.
3844
3845 An C<isl_multi_aff> can be constructed from a single
3846 C<isl_aff> or an C<isl_aff_list> using the
3847 following functions.  Similarly for C<isl_multi_pw_aff>.
3848
3849         #include <isl/aff.h>
3850         __isl_give isl_multi_aff *isl_multi_aff_from_aff(
3851                 __isl_take isl_aff *aff);
3852         __isl_give isl_multi_pw_aff *isl_multi_pw_aff_from_pw_aff(
3853                 __isl_take isl_pw_aff *pa);
3854         __isl_give isl_multi_aff *isl_multi_aff_from_aff_list(
3855                 __isl_take isl_space *space,
3856                 __isl_take isl_aff_list *list);
3857
3858 An empty piecewise multiple quasi affine expression (one with no cells),
3859 the zero piecewise multiple quasi affine expression (with value zero
3860 for each output dimension),
3861 a piecewise multiple quasi affine expression with a single cell (with
3862 either a universe or a specified domain) or
3863 a zero-dimensional piecewise multiple quasi affine expression
3864 on a given domain
3865 can be created using the following functions.
3866
3867         #include <isl/aff.h>
3868         __isl_give isl_pw_multi_aff *isl_pw_multi_aff_empty(
3869                 __isl_take isl_space *space);
3870         __isl_give isl_multi_aff *isl_multi_aff_zero(
3871                 __isl_take isl_space *space);
3872         __isl_give isl_multi_pw_aff *isl_multi_pw_aff_zero(
3873                 __isl_take isl_space *space);
3874         __isl_give isl_multi_aff *isl_multi_aff_identity(
3875                 __isl_take isl_space *space);
3876         __isl_give isl_pw_multi_aff *isl_pw_multi_aff_identity(
3877                 __isl_take isl_space *space);
3878         __isl_give isl_multi_pw_aff *isl_multi_pw_aff_identity(
3879                 __isl_take isl_space *space);
3880         __isl_give isl_pw_multi_aff *
3881         isl_pw_multi_aff_from_multi_aff(
3882                 __isl_take isl_multi_aff *ma);
3883         __isl_give isl_pw_multi_aff *isl_pw_multi_aff_alloc(
3884                 __isl_take isl_set *set,
3885                 __isl_take isl_multi_aff *maff);
3886         __isl_give isl_pw_multi_aff *isl_pw_multi_aff_from_domain(
3887                 __isl_take isl_set *set);
3888
3889         __isl_give isl_union_pw_multi_aff *
3890         isl_union_pw_multi_aff_empty(
3891                 __isl_take isl_space *space);
3892         __isl_give isl_union_pw_multi_aff *
3893         isl_union_pw_multi_aff_add_pw_multi_aff(
3894                 __isl_take isl_union_pw_multi_aff *upma,
3895                 __isl_take isl_pw_multi_aff *pma);
3896         __isl_give isl_union_pw_multi_aff *
3897         isl_union_pw_multi_aff_from_domain(
3898                 __isl_take isl_union_set *uset);
3899
3900 A piecewise multiple quasi affine expression can also be initialized
3901 from an C<isl_set> or C<isl_map>, provided the C<isl_set> is a singleton
3902 and the C<isl_map> is single-valued.
3903 In case of a conversion from an C<isl_union_set> or an C<isl_union_map>
3904 to an C<isl_union_pw_multi_aff>, these properties need to hold in each space.
3905
3906         __isl_give isl_pw_multi_aff *isl_pw_multi_aff_from_set(
3907                 __isl_take isl_set *set);
3908         __isl_give isl_pw_multi_aff *isl_pw_multi_aff_from_map(
3909                 __isl_take isl_map *map);
3910
3911         __isl_give isl_union_pw_multi_aff *
3912         isl_union_pw_multi_aff_from_union_set(
3913                 __isl_take isl_union_set *uset);
3914         __isl_give isl_union_pw_multi_aff *
3915         isl_union_pw_multi_aff_from_union_map(
3916                 __isl_take isl_union_map *umap);
3917
3918 Multiple quasi affine expressions can be copied and freed using
3919
3920         #include <isl/aff.h>
3921         __isl_give isl_multi_aff *isl_multi_aff_copy(
3922                 __isl_keep isl_multi_aff *maff);
3923         void *isl_multi_aff_free(__isl_take isl_multi_aff *maff);
3924
3925         __isl_give isl_pw_multi_aff *isl_pw_multi_aff_copy(
3926                 __isl_keep isl_pw_multi_aff *pma);
3927         void *isl_pw_multi_aff_free(
3928                 __isl_take isl_pw_multi_aff *pma);
3929
3930         __isl_give isl_union_pw_multi_aff *
3931         isl_union_pw_multi_aff_copy(
3932                 __isl_keep isl_union_pw_multi_aff *upma);
3933         void *isl_union_pw_multi_aff_free(
3934                 __isl_take isl_union_pw_multi_aff *upma);
3935
3936         __isl_give isl_multi_pw_aff *isl_multi_pw_aff_copy(
3937                 __isl_keep isl_multi_pw_aff *mpa);
3938         void *isl_multi_pw_aff_free(
3939                 __isl_take isl_multi_pw_aff *mpa);
3940
3941 The expression can be inspected using
3942
3943         #include <isl/aff.h>
3944         isl_ctx *isl_multi_aff_get_ctx(
3945                 __isl_keep isl_multi_aff *maff);
3946         isl_ctx *isl_pw_multi_aff_get_ctx(
3947                 __isl_keep isl_pw_multi_aff *pma);
3948         isl_ctx *isl_union_pw_multi_aff_get_ctx(
3949                 __isl_keep isl_union_pw_multi_aff *upma);
3950         isl_ctx *isl_multi_pw_aff_get_ctx(
3951                 __isl_keep isl_multi_pw_aff *mpa);
3952         unsigned isl_multi_aff_dim(__isl_keep isl_multi_aff *maff,
3953                 enum isl_dim_type type);
3954         unsigned isl_pw_multi_aff_dim(
3955                 __isl_keep isl_pw_multi_aff *pma,
3956                 enum isl_dim_type type);
3957         unsigned isl_multi_pw_aff_dim(
3958                 __isl_keep isl_multi_pw_aff *mpa,
3959                 enum isl_dim_type type);
3960         __isl_give isl_aff *isl_multi_aff_get_aff(
3961                 __isl_keep isl_multi_aff *multi, int pos);
3962         __isl_give isl_pw_aff *isl_pw_multi_aff_get_pw_aff(
3963                 __isl_keep isl_pw_multi_aff *pma, int pos);
3964         __isl_give isl_pw_aff *isl_multi_pw_aff_get_pw_aff(
3965                 __isl_keep isl_multi_pw_aff *mpa, int pos);
3966         const char *isl_pw_multi_aff_get_dim_name(
3967                 __isl_keep isl_pw_multi_aff *pma,
3968                 enum isl_dim_type type, unsigned pos);
3969         __isl_give isl_id *isl_pw_multi_aff_get_dim_id(
3970                 __isl_keep isl_pw_multi_aff *pma,
3971                 enum isl_dim_type type, unsigned pos);
3972         const char *isl_multi_aff_get_tuple_name(
3973                 __isl_keep isl_multi_aff *multi,
3974                 enum isl_dim_type type);
3975         int isl_pw_multi_aff_has_tuple_name(
3976                 __isl_keep isl_pw_multi_aff *pma,
3977                 enum isl_dim_type type);
3978         const char *isl_pw_multi_aff_get_tuple_name(
3979                 __isl_keep isl_pw_multi_aff *pma,
3980                 enum isl_dim_type type);
3981         int isl_pw_multi_aff_has_tuple_id(
3982                 __isl_keep isl_pw_multi_aff *pma,
3983                 enum isl_dim_type type);
3984         __isl_give isl_id *isl_pw_multi_aff_get_tuple_id(
3985                 __isl_keep isl_pw_multi_aff *pma,
3986                 enum isl_dim_type type);
3987
3988         int isl_pw_multi_aff_foreach_piece(
3989                 __isl_keep isl_pw_multi_aff *pma,
3990                 int (*fn)(__isl_take isl_set *set,
3991                             __isl_take isl_multi_aff *maff,
3992                             void *user), void *user);
3993
3994         int isl_union_pw_multi_aff_foreach_pw_multi_aff(
3995                 __isl_keep isl_union_pw_multi_aff *upma,
3996                 int (*fn)(__isl_take isl_pw_multi_aff *pma,
3997                             void *user), void *user);
3998
3999 It can be modified using
4000
4001         #include <isl/aff.h>
4002         __isl_give isl_multi_aff *isl_multi_aff_set_aff(
4003                 __isl_take isl_multi_aff *multi, int pos,
4004                 __isl_take isl_aff *aff);
4005         __isl_give isl_pw_multi_aff *isl_pw_multi_aff_set_pw_aff(
4006                 __isl_take isl_pw_multi_aff *pma, unsigned pos,
4007                 __isl_take isl_pw_aff *pa);
4008         __isl_give isl_multi_aff *isl_multi_aff_set_dim_name(
4009                 __isl_take isl_multi_aff *maff,
4010                 enum isl_dim_type type, unsigned pos, const char *s);
4011         __isl_give isl_multi_aff *isl_multi_aff_set_tuple_name(
4012                 __isl_take isl_multi_aff *maff,
4013                 enum isl_dim_type type, const char *s);
4014         __isl_give isl_multi_aff *isl_multi_aff_set_tuple_id(
4015                 __isl_take isl_multi_aff *maff,
4016                 enum isl_dim_type type, __isl_take isl_id *id);
4017         __isl_give isl_pw_multi_aff *isl_pw_multi_aff_set_tuple_id(
4018                 __isl_take isl_pw_multi_aff *pma,
4019                 enum isl_dim_type type, __isl_take isl_id *id);
4020
4021         __isl_give isl_multi_pw_aff *
4022         isl_multi_pw_aff_set_dim_name(
4023                 __isl_take isl_multi_pw_aff *mpa,
4024                 enum isl_dim_type type, unsigned pos, const char *s);
4025         __isl_give isl_multi_pw_aff *
4026         isl_multi_pw_aff_set_tuple_name(
4027                 __isl_take isl_multi_pw_aff *mpa,
4028                 enum isl_dim_type type, const char *s);
4029
4030         __isl_give isl_multi_aff *isl_multi_aff_insert_dims(
4031                 __isl_take isl_multi_aff *ma,
4032                 enum isl_dim_type type, unsigned first, unsigned n);
4033         __isl_give isl_multi_aff *isl_multi_aff_add_dims(
4034                 __isl_take isl_multi_aff *ma,
4035                 enum isl_dim_type type, unsigned n);
4036         __isl_give isl_multi_aff *isl_multi_aff_drop_dims(
4037                 __isl_take isl_multi_aff *maff,
4038                 enum isl_dim_type type, unsigned first, unsigned n);
4039         __isl_give isl_pw_multi_aff *isl_pw_multi_aff_drop_dims(
4040                 __isl_take isl_pw_multi_aff *pma,
4041                 enum isl_dim_type type, unsigned first, unsigned n);
4042
4043         __isl_give isl_multi_pw_aff *isl_multi_pw_aff_insert_dims(
4044                 __isl_take isl_multi_pw_aff *mpa,
4045                 enum isl_dim_type type, unsigned first, unsigned n);
4046         __isl_give isl_multi_pw_aff *isl_multi_pw_aff_add_dims(
4047                 __isl_take isl_multi_pw_aff *mpa,
4048                 enum isl_dim_type type, unsigned n);
4049
4050 To check whether two multiple affine expressions are
4051 obviously equal to each other, use
4052
4053         int isl_multi_aff_plain_is_equal(__isl_keep isl_multi_aff *maff1,
4054                 __isl_keep isl_multi_aff *maff2);
4055         int isl_pw_multi_aff_plain_is_equal(
4056                 __isl_keep isl_pw_multi_aff *pma1,
4057                 __isl_keep isl_pw_multi_aff *pma2);
4058
4059 Operations include
4060
4061         #include <isl/aff.h>
4062         __isl_give isl_pw_multi_aff *isl_pw_multi_aff_union_lexmin(
4063                 __isl_take isl_pw_multi_aff *pma1,
4064                 __isl_take isl_pw_multi_aff *pma2);
4065         __isl_give isl_pw_multi_aff *isl_pw_multi_aff_union_lexmax(
4066                 __isl_take isl_pw_multi_aff *pma1,
4067                 __isl_take isl_pw_multi_aff *pma2);
4068         __isl_give isl_multi_aff *isl_multi_aff_add(
4069                 __isl_take isl_multi_aff *maff1,
4070                 __isl_take isl_multi_aff *maff2);
4071         __isl_give isl_pw_multi_aff *isl_pw_multi_aff_add(
4072                 __isl_take isl_pw_multi_aff *pma1,
4073                 __isl_take isl_pw_multi_aff *pma2);
4074         __isl_give isl_union_pw_multi_aff *isl_union_pw_multi_aff_add(
4075                 __isl_take isl_union_pw_multi_aff *upma1,
4076                 __isl_take isl_union_pw_multi_aff *upma2);
4077         __isl_give isl_pw_multi_aff *isl_pw_multi_aff_union_add(
4078                 __isl_take isl_pw_multi_aff *pma1,
4079                 __isl_take isl_pw_multi_aff *pma2);
4080         __isl_give isl_multi_aff *isl_multi_aff_sub(
4081                 __isl_take isl_multi_aff *ma1,
4082                 __isl_take isl_multi_aff *ma2);
4083         __isl_give isl_pw_multi_aff *isl_pw_multi_aff_sub(
4084                 __isl_take isl_pw_multi_aff *pma1,
4085                 __isl_take isl_pw_multi_aff *pma2);
4086         __isl_give isl_union_pw_multi_aff *isl_union_pw_multi_aff_sub(
4087                 __isl_take isl_union_pw_multi_aff *upma1,
4088                 __isl_take isl_union_pw_multi_aff *upma2);
4089
4090 C<isl_multi_aff_sub> subtracts the second argument from the first.
4091
4092         __isl_give isl_multi_aff *isl_multi_aff_scale(
4093                 __isl_take isl_multi_aff *maff,
4094                 isl_int f);
4095         __isl_give isl_multi_aff *isl_multi_aff_scale_vec(
4096                 __isl_take isl_multi_aff *ma,
4097                 __isl_take isl_vec *v);
4098         __isl_give isl_pw_multi_aff *isl_pw_multi_aff_scale_vec(
4099                 __isl_take isl_pw_multi_aff *pma,
4100                 __isl_take isl_vec *v);
4101         __isl_give isl_union_pw_multi_aff *isl_union_pw_multi_aff_scale_vec(
4102                 __isl_take isl_union_pw_multi_aff *upma,
4103                 __isl_take isl_vec *v);
4104
4105 C<isl_multi_aff_scale_vec> scales the first elements of C<ma>
4106 by the corresponding elements of C<v>.
4107
4108         __isl_give isl_pw_multi_aff *isl_pw_multi_aff_intersect_params(
4109                 __isl_take isl_pw_multi_aff *pma,
4110                 __isl_take isl_set *set);
4111         __isl_give isl_pw_multi_aff *isl_pw_multi_aff_intersect_domain(
4112                 __isl_take isl_pw_multi_aff *pma,
4113                 __isl_take isl_set *set);
4114         __isl_give isl_union_pw_multi_aff *
4115         isl_union_pw_multi_aff_intersect_domain(
4116                 __isl_take isl_union_pw_multi_aff *upma,
4117                 __isl_take isl_union_set *uset);
4118         __isl_give isl_multi_aff *isl_multi_aff_lift(
4119                 __isl_take isl_multi_aff *maff,
4120                 __isl_give isl_local_space **ls);
4121         __isl_give isl_pw_multi_aff *isl_pw_multi_aff_coalesce(
4122                 __isl_take isl_pw_multi_aff *pma);
4123         __isl_give isl_multi_aff *isl_multi_aff_align_params(
4124                 __isl_take isl_multi_aff *multi,
4125                 __isl_take isl_space *model);
4126         __isl_give isl_pw_multi_aff *isl_pw_multi_aff_align_params(
4127                 __isl_take isl_pw_multi_aff *pma,
4128                 __isl_take isl_space *model);
4129         __isl_give isl_pw_multi_aff *
4130         isl_pw_multi_aff_project_domain_on_params(
4131                 __isl_take isl_pw_multi_aff *pma);
4132         __isl_give isl_multi_aff *isl_multi_aff_gist_params(
4133                 __isl_take isl_multi_aff *maff,
4134                 __isl_take isl_set *context);
4135         __isl_give isl_multi_aff *isl_multi_aff_gist(
4136                 __isl_take isl_multi_aff *maff,
4137                 __isl_take isl_set *context);
4138         __isl_give isl_pw_multi_aff *isl_pw_multi_aff_gist_params(
4139                 __isl_take isl_pw_multi_aff *pma,
4140                 __isl_take isl_set *set);
4141         __isl_give isl_pw_multi_aff *isl_pw_multi_aff_gist(
4142                 __isl_take isl_pw_multi_aff *pma,
4143                 __isl_take isl_set *set);
4144         __isl_give isl_set *isl_pw_multi_aff_domain(
4145                 __isl_take isl_pw_multi_aff *pma);
4146         __isl_give isl_union_set *isl_union_pw_multi_aff_domain(
4147                 __isl_take isl_union_pw_multi_aff *upma);
4148         __isl_give isl_multi_aff *isl_multi_aff_range_splice(
4149                 __isl_take isl_multi_aff *ma1, unsigned pos,
4150                 __isl_take isl_multi_aff *ma2);
4151         __isl_give isl_multi_aff *isl_multi_aff_splice(
4152                 __isl_take isl_multi_aff *ma1,
4153                 unsigned in_pos, unsigned out_pos,
4154                 __isl_take isl_multi_aff *ma2);
4155         __isl_give isl_multi_aff *isl_multi_aff_range_product(
4156                 __isl_take isl_multi_aff *ma1,
4157                 __isl_take isl_multi_aff *ma2);
4158         __isl_give isl_multi_aff *isl_multi_aff_flat_range_product(
4159                 __isl_take isl_multi_aff *ma1,
4160                 __isl_take isl_multi_aff *ma2);
4161         __isl_give isl_multi_aff *isl_multi_aff_product(
4162                 __isl_take isl_multi_aff *ma1,
4163                 __isl_take isl_multi_aff *ma2);
4164         __isl_give isl_pw_multi_aff *
4165         isl_pw_multi_aff_range_product(
4166                 __isl_take isl_pw_multi_aff *pma1,
4167                 __isl_take isl_pw_multi_aff *pma2);
4168         __isl_give isl_pw_multi_aff *
4169         isl_pw_multi_aff_flat_range_product(
4170                 __isl_take isl_pw_multi_aff *pma1,
4171                 __isl_take isl_pw_multi_aff *pma2);
4172         __isl_give isl_pw_multi_aff *isl_pw_multi_aff_product(
4173                 __isl_take isl_pw_multi_aff *pma1,
4174                 __isl_take isl_pw_multi_aff *pma2);
4175         __isl_give isl_union_pw_multi_aff *
4176         isl_union_pw_multi_aff_flat_range_product(
4177                 __isl_take isl_union_pw_multi_aff *upma1,
4178                 __isl_take isl_union_pw_multi_aff *upma2);
4179         __isl_give isl_multi_pw_aff *
4180         isl_multi_pw_aff_range_splice(
4181                 __isl_take isl_multi_pw_aff *mpa1, unsigned pos,
4182                 __isl_take isl_multi_pw_aff *mpa2);
4183         __isl_give isl_multi_pw_aff *isl_multi_pw_aff_splice(
4184                 __isl_take isl_multi_pw_aff *mpa1,
4185                 unsigned in_pos, unsigned out_pos,
4186                 __isl_take isl_multi_pw_aff *mpa2);
4187         __isl_give isl_multi_pw_aff *
4188         isl_multi_pw_aff_range_product(
4189                 __isl_take isl_multi_pw_aff *mpa1,
4190                 __isl_take isl_multi_pw_aff *mpa2);
4191         __isl_give isl_multi_pw_aff *
4192         isl_multi_pw_aff_flat_range_product(
4193                 __isl_take isl_multi_pw_aff *mpa1,
4194                 __isl_take isl_multi_pw_aff *mpa2);
4195
4196 If the C<ls> argument of C<isl_multi_aff_lift> is not C<NULL>,
4197 then it is assigned the local space that lies at the basis of
4198 the lifting applied.
4199
4200         #include <isl/aff.h>
4201         __isl_give isl_multi_aff *isl_multi_aff_pullback_multi_aff(
4202                 __isl_take isl_multi_aff *ma1,
4203                 __isl_take isl_multi_aff *ma2);
4204         __isl_give isl_pw_multi_aff *
4205         isl_pw_multi_aff_pullback_multi_aff(
4206                 __isl_take isl_pw_multi_aff *pma,
4207                 __isl_take isl_multi_aff *ma);
4208         __isl_give isl_pw_multi_aff *
4209         isl_pw_multi_aff_pullback_pw_multi_aff(
4210                 __isl_take isl_pw_multi_aff *pma1,
4211                 __isl_take isl_pw_multi_aff *pma2);
4212
4213 The function C<isl_multi_aff_pullback_multi_aff> precomposes C<ma1> by C<ma2>.
4214 In other words, C<ma2> is plugged
4215 into C<ma1>.
4216
4217         __isl_give isl_set *isl_multi_aff_lex_le_set(
4218                 __isl_take isl_multi_aff *ma1,
4219                 __isl_take isl_multi_aff *ma2);
4220         __isl_give isl_set *isl_multi_aff_lex_ge_set(
4221                 __isl_take isl_multi_aff *ma1,
4222                 __isl_take isl_multi_aff *ma2);
4223
4224 The function C<isl_multi_aff_lex_le_set> returns a set
4225 containing those elements in the shared domain space
4226 where C<ma1> is lexicographically smaller than or
4227 equal to C<ma2>.
4228
4229 An expression can be read from input using
4230
4231         #include <isl/aff.h>
4232         __isl_give isl_multi_aff *isl_multi_aff_read_from_str(
4233                 isl_ctx *ctx, const char *str);
4234         __isl_give isl_pw_multi_aff *isl_pw_multi_aff_read_from_str(
4235                 isl_ctx *ctx, const char *str);
4236         __isl_give isl_union_pw_multi_aff *
4237         isl_union_pw_multi_aff_read_from_str(
4238                 isl_ctx *ctx, const char *str);
4239
4240 An expression can be printed using
4241
4242         #include <isl/aff.h>
4243         __isl_give isl_printer *isl_printer_print_multi_aff(
4244                 __isl_take isl_printer *p,
4245                 __isl_keep isl_multi_aff *maff);
4246         __isl_give isl_printer *isl_printer_print_pw_multi_aff(
4247                 __isl_take isl_printer *p,
4248                 __isl_keep isl_pw_multi_aff *pma);
4249         __isl_give isl_printer *isl_printer_print_union_pw_multi_aff(
4250                 __isl_take isl_printer *p,
4251                 __isl_keep isl_union_pw_multi_aff *upma);
4252         __isl_give isl_printer *isl_printer_print_multi_pw_aff(
4253                 __isl_take isl_printer *p,
4254                 __isl_keep isl_multi_pw_aff *mpa);
4255
4256 =head2 Points
4257
4258 Points are elements of a set.  They can be used to construct
4259 simple sets (boxes) or they can be used to represent the
4260 individual elements of a set.
4261 The zero point (the origin) can be created using
4262
4263         __isl_give isl_point *isl_point_zero(__isl_take isl_space *space);
4264
4265 The coordinates of a point can be inspected, set and changed
4266 using
4267
4268         int isl_point_get_coordinate(__isl_keep isl_point *pnt,
4269                 enum isl_dim_type type, int pos, isl_int *v);
4270         __isl_give isl_point *isl_point_set_coordinate(
4271                 __isl_take isl_point *pnt,
4272                 enum isl_dim_type type, int pos, isl_int v);
4273
4274         __isl_give isl_point *isl_point_add_ui(
4275                 __isl_take isl_point *pnt,
4276                 enum isl_dim_type type, int pos, unsigned val);
4277         __isl_give isl_point *isl_point_sub_ui(
4278                 __isl_take isl_point *pnt,
4279                 enum isl_dim_type type, int pos, unsigned val);
4280
4281 Other properties can be obtained using
4282
4283         isl_ctx *isl_point_get_ctx(__isl_keep isl_point *pnt);
4284
4285 Points can be copied or freed using
4286
4287         __isl_give isl_point *isl_point_copy(
4288                 __isl_keep isl_point *pnt);
4289         void isl_point_free(__isl_take isl_point *pnt);
4290
4291 A singleton set can be created from a point using
4292
4293         __isl_give isl_basic_set *isl_basic_set_from_point(
4294                 __isl_take isl_point *pnt);
4295         __isl_give isl_set *isl_set_from_point(
4296                 __isl_take isl_point *pnt);
4297
4298 and a box can be created from two opposite extremal points using
4299
4300         __isl_give isl_basic_set *isl_basic_set_box_from_points(
4301                 __isl_take isl_point *pnt1,
4302                 __isl_take isl_point *pnt2);
4303         __isl_give isl_set *isl_set_box_from_points(
4304                 __isl_take isl_point *pnt1,
4305                 __isl_take isl_point *pnt2);
4306
4307 All elements of a B<bounded> (union) set can be enumerated using
4308 the following functions.
4309
4310         int isl_set_foreach_point(__isl_keep isl_set *set,
4311                 int (*fn)(__isl_take isl_point *pnt, void *user),
4312                 void *user);
4313         int isl_union_set_foreach_point(__isl_keep isl_union_set *uset,
4314                 int (*fn)(__isl_take isl_point *pnt, void *user),
4315                 void *user);
4316
4317 The function C<fn> is called for each integer point in
4318 C<set> with as second argument the last argument of
4319 the C<isl_set_foreach_point> call.  The function C<fn>
4320 should return C<0> on success and C<-1> on failure.
4321 In the latter case, C<isl_set_foreach_point> will stop
4322 enumerating and return C<-1> as well.
4323 If the enumeration is performed successfully and to completion,
4324 then C<isl_set_foreach_point> returns C<0>.
4325
4326 To obtain a single point of a (basic) set, use
4327
4328         __isl_give isl_point *isl_basic_set_sample_point(
4329                 __isl_take isl_basic_set *bset);
4330         __isl_give isl_point *isl_set_sample_point(
4331                 __isl_take isl_set *set);
4332
4333 If C<set> does not contain any (integer) points, then the
4334 resulting point will be ``void'', a property that can be
4335 tested using
4336
4337         int isl_point_is_void(__isl_keep isl_point *pnt);
4338
4339 =head2 Piecewise Quasipolynomials
4340
4341 A piecewise quasipolynomial is a particular kind of function that maps
4342 a parametric point to a rational value.
4343 More specifically, a quasipolynomial is a polynomial expression in greatest
4344 integer parts of affine expressions of parameters and variables.
4345 A piecewise quasipolynomial is a subdivision of a given parametric
4346 domain into disjoint cells with a quasipolynomial associated to
4347 each cell.  The value of the piecewise quasipolynomial at a given
4348 point is the value of the quasipolynomial associated to the cell
4349 that contains the point.  Outside of the union of cells,
4350 the value is assumed to be zero.
4351 For example, the piecewise quasipolynomial
4352
4353         [n] -> { [x] -> ((1 + n) - x) : x <= n and x >= 0 }
4354
4355 maps C<x> to C<1 + n - x> for values of C<x> between C<0> and C<n>.
4356 A given piecewise quasipolynomial has a fixed domain dimension.
4357 Union piecewise quasipolynomials are used to contain piecewise quasipolynomials
4358 defined over different domains.
4359 Piecewise quasipolynomials are mainly used by the C<barvinok>
4360 library for representing the number of elements in a parametric set or map.
4361 For example, the piecewise quasipolynomial above represents
4362 the number of points in the map
4363
4364         [n] -> { [x] -> [y] : x,y >= 0 and 0 <= x + y <= n }
4365
4366 =head3 Input and Output
4367
4368 Piecewise quasipolynomials can be read from input using
4369
4370         __isl_give isl_union_pw_qpolynomial *
4371         isl_union_pw_qpolynomial_read_from_str(
4372                 isl_ctx *ctx, const char *str);
4373
4374 Quasipolynomials and piecewise quasipolynomials can be printed
4375 using the following functions.
4376
4377         __isl_give isl_printer *isl_printer_print_qpolynomial(
4378                 __isl_take isl_printer *p,
4379                 __isl_keep isl_qpolynomial *qp);
4380
4381         __isl_give isl_printer *isl_printer_print_pw_qpolynomial(
4382                 __isl_take isl_printer *p,
4383                 __isl_keep isl_pw_qpolynomial *pwqp);
4384
4385         __isl_give isl_printer *isl_printer_print_union_pw_qpolynomial(
4386                 __isl_take isl_printer *p,
4387                 __isl_keep isl_union_pw_qpolynomial *upwqp);
4388
4389 The output format of the printer
4390 needs to be set to either C<ISL_FORMAT_ISL> or C<ISL_FORMAT_C>.
4391 For C<isl_printer_print_union_pw_qpolynomial>, only C<ISL_FORMAT_ISL>
4392 is supported.
4393 In case of printing in C<ISL_FORMAT_C>, the user may want
4394 to set the names of all dimensions
4395
4396         __isl_give isl_qpolynomial *isl_qpolynomial_set_dim_name(
4397                 __isl_take isl_qpolynomial *qp,
4398                 enum isl_dim_type type, unsigned pos,
4399                 const char *s);
4400         __isl_give isl_pw_qpolynomial *
4401         isl_pw_qpolynomial_set_dim_name(
4402                 __isl_take isl_pw_qpolynomial *pwqp,
4403                 enum isl_dim_type type, unsigned pos,
4404                 const char *s);
4405
4406 =head3 Creating New (Piecewise) Quasipolynomials
4407
4408 Some simple quasipolynomials can be created using the following functions.
4409 More complicated quasipolynomials can be created by applying
4410 operations such as addition and multiplication
4411 on the resulting quasipolynomials
4412
4413         __isl_give isl_qpolynomial *isl_qpolynomial_zero_on_domain(
4414                 __isl_take isl_space *domain);
4415         __isl_give isl_qpolynomial *isl_qpolynomial_one_on_domain(
4416                 __isl_take isl_space *domain);
4417         __isl_give isl_qpolynomial *isl_qpolynomial_infty_on_domain(
4418                 __isl_take isl_space *domain);
4419         __isl_give isl_qpolynomial *isl_qpolynomial_neginfty_on_domain(
4420                 __isl_take isl_space *domain);
4421         __isl_give isl_qpolynomial *isl_qpolynomial_nan_on_domain(
4422                 __isl_take isl_space *domain);
4423         __isl_give isl_qpolynomial *isl_qpolynomial_rat_cst_on_domain(
4424                 __isl_take isl_space *domain,
4425                 const isl_int n, const isl_int d);
4426         __isl_give isl_qpolynomial *isl_qpolynomial_var_on_domain(
4427                 __isl_take isl_space *domain,
4428                 enum isl_dim_type type, unsigned pos);
4429         __isl_give isl_qpolynomial *isl_qpolynomial_from_aff(
4430                 __isl_take isl_aff *aff);
4431
4432 Note that the space in which a quasipolynomial lives is a map space
4433 with a one-dimensional range.  The C<domain> argument in some of
4434 the functions above corresponds to the domain of this map space.
4435
4436 The zero piecewise quasipolynomial or a piecewise quasipolynomial
4437 with a single cell can be created using the following functions.
4438 Multiple of these single cell piecewise quasipolynomials can
4439 be combined to create more complicated piecewise quasipolynomials.
4440
4441         __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_zero(
4442                 __isl_take isl_space *space);
4443         __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_alloc(
4444                 __isl_take isl_set *set,
4445                 __isl_take isl_qpolynomial *qp);
4446         __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_from_qpolynomial(
4447                 __isl_take isl_qpolynomial *qp);
4448         __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_from_pw_aff(
4449                 __isl_take isl_pw_aff *pwaff);
4450
4451         __isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_zero(
4452                 __isl_take isl_space *space);
4453         __isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_from_pw_qpolynomial(
4454                 __isl_take isl_pw_qpolynomial *pwqp);
4455         __isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_add_pw_qpolynomial(
4456                 __isl_take isl_union_pw_qpolynomial *upwqp,
4457                 __isl_take isl_pw_qpolynomial *pwqp);
4458
4459 Quasipolynomials can be copied and freed again using the following
4460 functions.
4461
4462         __isl_give isl_qpolynomial *isl_qpolynomial_copy(
4463                 __isl_keep isl_qpolynomial *qp);
4464         void *isl_qpolynomial_free(__isl_take isl_qpolynomial *qp);
4465
4466         __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_copy(
4467                 __isl_keep isl_pw_qpolynomial *pwqp);
4468         void *isl_pw_qpolynomial_free(
4469                 __isl_take isl_pw_qpolynomial *pwqp);
4470
4471         __isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_copy(
4472                 __isl_keep isl_union_pw_qpolynomial *upwqp);
4473         void *isl_union_pw_qpolynomial_free(
4474                 __isl_take isl_union_pw_qpolynomial *upwqp);
4475
4476 =head3 Inspecting (Piecewise) Quasipolynomials
4477
4478 To iterate over all piecewise quasipolynomials in a union
4479 piecewise quasipolynomial, use the following function
4480
4481         int isl_union_pw_qpolynomial_foreach_pw_qpolynomial(
4482                 __isl_keep isl_union_pw_qpolynomial *upwqp,
4483                 int (*fn)(__isl_take isl_pw_qpolynomial *pwqp, void *user),
4484                 void *user);
4485
4486 To extract the piecewise quasipolynomial in a given space from a union, use
4487
4488         __isl_give isl_pw_qpolynomial *
4489         isl_union_pw_qpolynomial_extract_pw_qpolynomial(
4490                 __isl_keep isl_union_pw_qpolynomial *upwqp,
4491                 __isl_take isl_space *space);
4492
4493 To iterate over the cells in a piecewise quasipolynomial,
4494 use either of the following two functions
4495
4496         int isl_pw_qpolynomial_foreach_piece(
4497                 __isl_keep isl_pw_qpolynomial *pwqp,
4498                 int (*fn)(__isl_take isl_set *set,
4499                           __isl_take isl_qpolynomial *qp,
4500                           void *user), void *user);
4501         int isl_pw_qpolynomial_foreach_lifted_piece(
4502                 __isl_keep isl_pw_qpolynomial *pwqp,
4503                 int (*fn)(__isl_take isl_set *set,
4504                           __isl_take isl_qpolynomial *qp,
4505                           void *user), void *user);
4506
4507 As usual, the function C<fn> should return C<0> on success
4508 and C<-1> on failure.  The difference between
4509 C<isl_pw_qpolynomial_foreach_piece> and
4510 C<isl_pw_qpolynomial_foreach_lifted_piece> is that
4511 C<isl_pw_qpolynomial_foreach_lifted_piece> will first
4512 compute unique representations for all existentially quantified
4513 variables and then turn these existentially quantified variables
4514 into extra set variables, adapting the associated quasipolynomial
4515 accordingly.  This means that the C<set> passed to C<fn>
4516 will not have any existentially quantified variables, but that
4517 the dimensions of the sets may be different for different
4518 invocations of C<fn>.
4519
4520 To iterate over all terms in a quasipolynomial,
4521 use
4522
4523         int isl_qpolynomial_foreach_term(
4524                 __isl_keep isl_qpolynomial *qp,
4525                 int (*fn)(__isl_take isl_term *term,
4526                           void *user), void *user);
4527
4528 The terms themselves can be inspected and freed using
4529 these functions
4530
4531         unsigned isl_term_dim(__isl_keep isl_term *term,
4532                 enum isl_dim_type type);
4533         void isl_term_get_num(__isl_keep isl_term *term,
4534                 isl_int *n);
4535         void isl_term_get_den(__isl_keep isl_term *term,
4536                 isl_int *d);
4537         int isl_term_get_exp(__isl_keep isl_term *term,
4538                 enum isl_dim_type type, unsigned pos);
4539         __isl_give isl_aff *isl_term_get_div(
4540                 __isl_keep isl_term *term, unsigned pos);
4541         void isl_term_free(__isl_take isl_term *term);
4542
4543 Each term is a product of parameters, set variables and
4544 integer divisions.  The function C<isl_term_get_exp>
4545 returns the exponent of a given dimensions in the given term.
4546 The C<isl_int>s in the arguments of C<isl_term_get_num>
4547 and C<isl_term_get_den> need to have been initialized
4548 using C<isl_int_init> before calling these functions.
4549
4550 =head3 Properties of (Piecewise) Quasipolynomials
4551
4552 To check whether a quasipolynomial is actually a constant,
4553 use the following function.
4554
4555         int isl_qpolynomial_is_cst(__isl_keep isl_qpolynomial *qp,
4556                 isl_int *n, isl_int *d);
4557
4558 If C<qp> is a constant and if C<n> and C<d> are not C<NULL>
4559 then the numerator and denominator of the constant
4560 are returned in C<*n> and C<*d>, respectively.
4561
4562 To check whether two union piecewise quasipolynomials are
4563 obviously equal, use
4564
4565         int isl_union_pw_qpolynomial_plain_is_equal(
4566                 __isl_keep isl_union_pw_qpolynomial *upwqp1,
4567                 __isl_keep isl_union_pw_qpolynomial *upwqp2);
4568
4569 =head3 Operations on (Piecewise) Quasipolynomials
4570
4571         __isl_give isl_qpolynomial *isl_qpolynomial_scale(
4572                 __isl_take isl_qpolynomial *qp, isl_int v);
4573         __isl_give isl_qpolynomial *isl_qpolynomial_neg(
4574                 __isl_take isl_qpolynomial *qp);
4575         __isl_give isl_qpolynomial *isl_qpolynomial_add(
4576                 __isl_take isl_qpolynomial *qp1,
4577                 __isl_take isl_qpolynomial *qp2);
4578         __isl_give isl_qpolynomial *isl_qpolynomial_sub(
4579                 __isl_take isl_qpolynomial *qp1,
4580                 __isl_take isl_qpolynomial *qp2);
4581         __isl_give isl_qpolynomial *isl_qpolynomial_mul(
4582                 __isl_take isl_qpolynomial *qp1,
4583                 __isl_take isl_qpolynomial *qp2);
4584         __isl_give isl_qpolynomial *isl_qpolynomial_pow(
4585                 __isl_take isl_qpolynomial *qp, unsigned exponent);
4586
4587         __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_add(
4588                 __isl_take isl_pw_qpolynomial *pwqp1,
4589                 __isl_take isl_pw_qpolynomial *pwqp2);
4590         __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_sub(
4591                 __isl_take isl_pw_qpolynomial *pwqp1,
4592                 __isl_take isl_pw_qpolynomial *pwqp2);
4593         __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_add_disjoint(
4594                 __isl_take isl_pw_qpolynomial *pwqp1,
4595                 __isl_take isl_pw_qpolynomial *pwqp2);
4596         __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_neg(
4597                 __isl_take isl_pw_qpolynomial *pwqp);
4598         __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_mul(
4599                 __isl_take isl_pw_qpolynomial *pwqp1,
4600                 __isl_take isl_pw_qpolynomial *pwqp2);
4601         __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_pow(
4602                 __isl_take isl_pw_qpolynomial *pwqp, unsigned exponent);
4603
4604         __isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_add(
4605                 __isl_take isl_union_pw_qpolynomial *upwqp1,
4606                 __isl_take isl_union_pw_qpolynomial *upwqp2);
4607         __isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_sub(
4608                 __isl_take isl_union_pw_qpolynomial *upwqp1,
4609                 __isl_take isl_union_pw_qpolynomial *upwqp2);
4610         __isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_mul(
4611                 __isl_take isl_union_pw_qpolynomial *upwqp1,
4612                 __isl_take isl_union_pw_qpolynomial *upwqp2);
4613
4614         __isl_give isl_qpolynomial *isl_pw_qpolynomial_eval(
4615                 __isl_take isl_pw_qpolynomial *pwqp,
4616                 __isl_take isl_point *pnt);
4617
4618         __isl_give isl_qpolynomial *isl_union_pw_qpolynomial_eval(
4619                 __isl_take isl_union_pw_qpolynomial *upwqp,
4620                 __isl_take isl_point *pnt);
4621
4622         __isl_give isl_set *isl_pw_qpolynomial_domain(
4623                 __isl_take isl_pw_qpolynomial *pwqp);
4624         __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_intersect_domain(
4625                 __isl_take isl_pw_qpolynomial *pwpq,
4626                 __isl_take isl_set *set);
4627         __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_intersect_params(
4628                 __isl_take isl_pw_qpolynomial *pwpq,
4629                 __isl_take isl_set *set);
4630
4631         __isl_give isl_union_set *isl_union_pw_qpolynomial_domain(
4632                 __isl_take isl_union_pw_qpolynomial *upwqp);
4633         __isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_intersect_domain(
4634                 __isl_take isl_union_pw_qpolynomial *upwpq,
4635                 __isl_take isl_union_set *uset);
4636         __isl_give isl_union_pw_qpolynomial *
4637         isl_union_pw_qpolynomial_intersect_params(
4638                 __isl_take isl_union_pw_qpolynomial *upwpq,
4639                 __isl_take isl_set *set);
4640
4641         __isl_give isl_qpolynomial *isl_qpolynomial_align_params(
4642                 __isl_take isl_qpolynomial *qp,
4643                 __isl_take isl_space *model);
4644
4645         __isl_give isl_qpolynomial *isl_qpolynomial_project_domain_on_params(
4646                 __isl_take isl_qpolynomial *qp);
4647         __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_project_domain_on_params(
4648                 __isl_take isl_pw_qpolynomial *pwqp);
4649
4650         __isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_coalesce(
4651                 __isl_take isl_union_pw_qpolynomial *upwqp);
4652
4653         __isl_give isl_qpolynomial *isl_qpolynomial_gist_params(
4654                 __isl_take isl_qpolynomial *qp,
4655                 __isl_take isl_set *context);
4656         __isl_give isl_qpolynomial *isl_qpolynomial_gist(
4657                 __isl_take isl_qpolynomial *qp,
4658                 __isl_take isl_set *context);
4659
4660         __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_gist_params(
4661                 __isl_take isl_pw_qpolynomial *pwqp,
4662                 __isl_take isl_set *context);
4663         __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_gist(
4664                 __isl_take isl_pw_qpolynomial *pwqp,
4665                 __isl_take isl_set *context);
4666
4667         __isl_give isl_union_pw_qpolynomial *
4668         isl_union_pw_qpolynomial_gist_params(
4669                 __isl_take isl_union_pw_qpolynomial *upwqp,
4670                 __isl_take isl_set *context);
4671         __isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_gist(
4672                 __isl_take isl_union_pw_qpolynomial *upwqp,
4673                 __isl_take isl_union_set *context);
4674
4675 The gist operation applies the gist operation to each of
4676 the cells in the domain of the input piecewise quasipolynomial.
4677 The context is also exploited
4678 to simplify the quasipolynomials associated to each cell.
4679
4680         __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_to_polynomial(
4681                 __isl_take isl_pw_qpolynomial *pwqp, int sign);
4682         __isl_give isl_union_pw_qpolynomial *
4683         isl_union_pw_qpolynomial_to_polynomial(
4684                 __isl_take isl_union_pw_qpolynomial *upwqp, int sign);
4685
4686 Approximate each quasipolynomial by a polynomial.  If C<sign> is positive,
4687 the polynomial will be an overapproximation.  If C<sign> is negative,
4688 it will be an underapproximation.  If C<sign> is zero, the approximation
4689 will lie somewhere in between.
4690
4691 =head2 Bounds on Piecewise Quasipolynomials and Piecewise Quasipolynomial Reductions
4692
4693 A piecewise quasipolynomial reduction is a piecewise
4694 reduction (or fold) of quasipolynomials.
4695 In particular, the reduction can be maximum or a minimum.
4696 The objects are mainly used to represent the result of
4697 an upper or lower bound on a quasipolynomial over its domain,
4698 i.e., as the result of the following function.
4699
4700         __isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_bound(
4701                 __isl_take isl_pw_qpolynomial *pwqp,
4702                 enum isl_fold type, int *tight);
4703
4704         __isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_bound(
4705                 __isl_take isl_union_pw_qpolynomial *upwqp,
4706                 enum isl_fold type, int *tight);
4707
4708 The C<type> argument may be either C<isl_fold_min> or C<isl_fold_max>.
4709 If C<tight> is not C<NULL>, then C<*tight> is set to C<1>
4710 is the returned bound is known be tight, i.e., for each value
4711 of the parameters there is at least
4712 one element in the domain that reaches the bound.
4713 If the domain of C<pwqp> is not wrapping, then the bound is computed
4714 over all elements in that domain and the result has a purely parametric
4715 domain.  If the domain of C<pwqp> is wrapping, then the bound is
4716 computed over the range of the wrapped relation.  The domain of the
4717 wrapped relation becomes the domain of the result.
4718
4719 A (piecewise) quasipolynomial reduction can be copied or freed using the
4720 following functions.
4721
4722         __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_copy(
4723                 __isl_keep isl_qpolynomial_fold *fold);
4724         __isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_copy(
4725                 __isl_keep isl_pw_qpolynomial_fold *pwf);
4726         __isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_copy(
4727                 __isl_keep isl_union_pw_qpolynomial_fold *upwf);
4728         void isl_qpolynomial_fold_free(
4729                 __isl_take isl_qpolynomial_fold *fold);
4730         void *isl_pw_qpolynomial_fold_free(
4731                 __isl_take isl_pw_qpolynomial_fold *pwf);
4732         void *isl_union_pw_qpolynomial_fold_free(
4733                 __isl_take isl_union_pw_qpolynomial_fold *upwf);
4734
4735 =head3 Printing Piecewise Quasipolynomial Reductions
4736
4737 Piecewise quasipolynomial reductions can be printed
4738 using the following function.
4739
4740         __isl_give isl_printer *isl_printer_print_pw_qpolynomial_fold(
4741                 __isl_take isl_printer *p,
4742                 __isl_keep isl_pw_qpolynomial_fold *pwf);
4743         __isl_give isl_printer *isl_printer_print_union_pw_qpolynomial_fold(
4744                 __isl_take isl_printer *p,
4745                 __isl_keep isl_union_pw_qpolynomial_fold *upwf);
4746
4747 For C<isl_printer_print_pw_qpolynomial_fold>,
4748 output format of the printer
4749 needs to be set to either C<ISL_FORMAT_ISL> or C<ISL_FORMAT_C>.
4750 For C<isl_printer_print_union_pw_qpolynomial_fold>,
4751 output format of the printer
4752 needs to be set to C<ISL_FORMAT_ISL>.
4753 In case of printing in C<ISL_FORMAT_C>, the user may want
4754 to set the names of all dimensions
4755
4756         __isl_give isl_pw_qpolynomial_fold *
4757         isl_pw_qpolynomial_fold_set_dim_name(
4758                 __isl_take isl_pw_qpolynomial_fold *pwf,
4759                 enum isl_dim_type type, unsigned pos,
4760                 const char *s);
4761
4762 =head3 Inspecting (Piecewise) Quasipolynomial Reductions
4763
4764 To iterate over all piecewise quasipolynomial reductions in a union
4765 piecewise quasipolynomial reduction, use the following function
4766
4767         int isl_union_pw_qpolynomial_fold_foreach_pw_qpolynomial_fold(
4768                 __isl_keep isl_union_pw_qpolynomial_fold *upwf,
4769                 int (*fn)(__isl_take isl_pw_qpolynomial_fold *pwf,
4770                             void *user), void *user);
4771
4772 To iterate over the cells in a piecewise quasipolynomial reduction,
4773 use either of the following two functions
4774
4775         int isl_pw_qpolynomial_fold_foreach_piece(
4776                 __isl_keep isl_pw_qpolynomial_fold *pwf,
4777                 int (*fn)(__isl_take isl_set *set,
4778                           __isl_take isl_qpolynomial_fold *fold,
4779                           void *user), void *user);
4780         int isl_pw_qpolynomial_fold_foreach_lifted_piece(
4781                 __isl_keep isl_pw_qpolynomial_fold *pwf,
4782                 int (*fn)(__isl_take isl_set *set,
4783                           __isl_take isl_qpolynomial_fold *fold,
4784                           void *user), void *user);
4785
4786 See L<Inspecting (Piecewise) Quasipolynomials> for an explanation
4787 of the difference between these two functions.
4788
4789 To iterate over all quasipolynomials in a reduction, use
4790
4791         int isl_qpolynomial_fold_foreach_qpolynomial(
4792                 __isl_keep isl_qpolynomial_fold *fold,
4793                 int (*fn)(__isl_take isl_qpolynomial *qp,
4794                           void *user), void *user);
4795
4796 =head3 Properties of Piecewise Quasipolynomial Reductions
4797
4798 To check whether two union piecewise quasipolynomial reductions are
4799 obviously equal, use
4800
4801         int isl_union_pw_qpolynomial_fold_plain_is_equal(
4802                 __isl_keep isl_union_pw_qpolynomial_fold *upwf1,
4803                 __isl_keep isl_union_pw_qpolynomial_fold *upwf2);
4804
4805 =head3 Operations on Piecewise Quasipolynomial Reductions
4806
4807         __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_scale(
4808                 __isl_take isl_qpolynomial_fold *fold, isl_int v);
4809
4810         __isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_add(
4811                 __isl_take isl_pw_qpolynomial_fold *pwf1,
4812                 __isl_take isl_pw_qpolynomial_fold *pwf2);
4813
4814         __isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_fold(
4815                 __isl_take isl_pw_qpolynomial_fold *pwf1,
4816                 __isl_take isl_pw_qpolynomial_fold *pwf2);
4817
4818         __isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_fold(
4819                 __isl_take isl_union_pw_qpolynomial_fold *upwf1,
4820                 __isl_take isl_union_pw_qpolynomial_fold *upwf2);
4821
4822         __isl_give isl_qpolynomial *isl_pw_qpolynomial_fold_eval(
4823                 __isl_take isl_pw_qpolynomial_fold *pwf,
4824                 __isl_take isl_point *pnt);
4825
4826         __isl_give isl_qpolynomial *isl_union_pw_qpolynomial_fold_eval(
4827                 __isl_take isl_union_pw_qpolynomial_fold *upwf,
4828                 __isl_take isl_point *pnt);
4829
4830         __isl_give isl_pw_qpolynomial_fold *
4831         isl_pw_qpolynomial_fold_intersect_params(
4832                 __isl_take isl_pw_qpolynomial_fold *pwf,
4833                 __isl_take isl_set *set);
4834
4835         __isl_give isl_union_set *isl_union_pw_qpolynomial_fold_domain(
4836                 __isl_take isl_union_pw_qpolynomial_fold *upwf);
4837         __isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_intersect_domain(
4838                 __isl_take isl_union_pw_qpolynomial_fold *upwf,
4839                 __isl_take isl_union_set *uset);
4840         __isl_give isl_union_pw_qpolynomial_fold *
4841         isl_union_pw_qpolynomial_fold_intersect_params(
4842                 __isl_take isl_union_pw_qpolynomial_fold *upwf,
4843                 __isl_take isl_set *set);
4844
4845         __isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_project_domain_on_params(
4846                 __isl_take isl_pw_qpolynomial_fold *pwf);
4847
4848         __isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_coalesce(
4849                 __isl_take isl_pw_qpolynomial_fold *pwf);
4850
4851         __isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_coalesce(
4852                 __isl_take isl_union_pw_qpolynomial_fold *upwf);
4853
4854         __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_gist_params(
4855                 __isl_take isl_qpolynomial_fold *fold,
4856                 __isl_take isl_set *context);
4857         __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_gist(
4858                 __isl_take isl_qpolynomial_fold *fold,
4859                 __isl_take isl_set *context);
4860
4861         __isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_gist(
4862                 __isl_take isl_pw_qpolynomial_fold *pwf,
4863                 __isl_take isl_set *context);
4864         __isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_gist_params(
4865                 __isl_take isl_pw_qpolynomial_fold *pwf,
4866                 __isl_take isl_set *context);
4867
4868         __isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_gist(
4869                 __isl_take isl_union_pw_qpolynomial_fold *upwf,
4870                 __isl_take isl_union_set *context);
4871         __isl_give isl_union_pw_qpolynomial_fold *
4872         isl_union_pw_qpolynomial_fold_gist_params(
4873                 __isl_take isl_union_pw_qpolynomial_fold *upwf,
4874                 __isl_take isl_set *context);
4875
4876 The gist operation applies the gist operation to each of
4877 the cells in the domain of the input piecewise quasipolynomial reduction.
4878 In future, the operation will also exploit the context
4879 to simplify the quasipolynomial reductions associated to each cell.
4880
4881         __isl_give isl_pw_qpolynomial_fold *
4882         isl_set_apply_pw_qpolynomial_fold(
4883                 __isl_take isl_set *set,
4884                 __isl_take isl_pw_qpolynomial_fold *pwf,
4885                 int *tight);
4886         __isl_give isl_pw_qpolynomial_fold *
4887         isl_map_apply_pw_qpolynomial_fold(
4888                 __isl_take isl_map *map,
4889                 __isl_take isl_pw_qpolynomial_fold *pwf,
4890                 int *tight);
4891         __isl_give isl_union_pw_qpolynomial_fold *
4892         isl_union_set_apply_union_pw_qpolynomial_fold(
4893                 __isl_take isl_union_set *uset,
4894                 __isl_take isl_union_pw_qpolynomial_fold *upwf,
4895                 int *tight);
4896         __isl_give isl_union_pw_qpolynomial_fold *
4897         isl_union_map_apply_union_pw_qpolynomial_fold(
4898                 __isl_take isl_union_map *umap,
4899                 __isl_take isl_union_pw_qpolynomial_fold *upwf,
4900                 int *tight);
4901
4902 The functions taking a map
4903 compose the given map with the given piecewise quasipolynomial reduction.
4904 That is, compute a bound (of the same type as C<pwf> or C<upwf> itself)
4905 over all elements in the intersection of the range of the map
4906 and the domain of the piecewise quasipolynomial reduction
4907 as a function of an element in the domain of the map.
4908 The functions taking a set compute a bound over all elements in the
4909 intersection of the set and the domain of the
4910 piecewise quasipolynomial reduction.
4911
4912 =head2 Parametric Vertex Enumeration
4913
4914 The parametric vertex enumeration described in this section
4915 is mainly intended to be used internally and by the C<barvinok>
4916 library.
4917
4918         #include <isl/vertices.h>
4919         __isl_give isl_vertices *isl_basic_set_compute_vertices(
4920                 __isl_keep isl_basic_set *bset);
4921
4922 The function C<isl_basic_set_compute_vertices> performs the
4923 actual computation of the parametric vertices and the chamber
4924 decomposition and store the result in an C<isl_vertices> object.
4925 This information can be queried by either iterating over all
4926 the vertices or iterating over all the chambers or cells
4927 and then iterating over all vertices that are active on the chamber.
4928
4929         int isl_vertices_foreach_vertex(
4930                 __isl_keep isl_vertices *vertices,
4931                 int (*fn)(__isl_take isl_vertex *vertex, void *user),
4932                 void *user);
4933
4934         int isl_vertices_foreach_cell(
4935                 __isl_keep isl_vertices *vertices,
4936                 int (*fn)(__isl_take isl_cell *cell, void *user),
4937                 void *user);
4938         int isl_cell_foreach_vertex(__isl_keep isl_cell *cell,
4939                 int (*fn)(__isl_take isl_vertex *vertex, void *user),
4940                 void *user);
4941
4942 Other operations that can be performed on an C<isl_vertices> object are
4943 the following.
4944
4945         isl_ctx *isl_vertices_get_ctx(
4946                 __isl_keep isl_vertices *vertices);
4947         int isl_vertices_get_n_vertices(
4948                 __isl_keep isl_vertices *vertices);
4949         void isl_vertices_free(__isl_take isl_vertices *vertices);
4950
4951 Vertices can be inspected and destroyed using the following functions.
4952
4953         isl_ctx *isl_vertex_get_ctx(__isl_keep isl_vertex *vertex);
4954         int isl_vertex_get_id(__isl_keep isl_vertex *vertex);
4955         __isl_give isl_basic_set *isl_vertex_get_domain(
4956                 __isl_keep isl_vertex *vertex);
4957         __isl_give isl_basic_set *isl_vertex_get_expr(
4958                 __isl_keep isl_vertex *vertex);
4959         void isl_vertex_free(__isl_take isl_vertex *vertex);
4960
4961 C<isl_vertex_get_expr> returns a singleton parametric set describing
4962 the vertex, while C<isl_vertex_get_domain> returns the activity domain
4963 of the vertex.
4964 Note that C<isl_vertex_get_domain> and C<isl_vertex_get_expr> return
4965 B<rational> basic sets, so they should mainly be used for inspection
4966 and should not be mixed with integer sets.
4967
4968 Chambers can be inspected and destroyed using the following functions.
4969
4970         isl_ctx *isl_cell_get_ctx(__isl_keep isl_cell *cell);
4971         __isl_give isl_basic_set *isl_cell_get_domain(
4972                 __isl_keep isl_cell *cell);
4973         void isl_cell_free(__isl_take isl_cell *cell);
4974
4975 =head1 Polyhedral Compilation Library
4976
4977 This section collects functionality in C<isl> that has been specifically
4978 designed for use during polyhedral compilation.
4979
4980 =head2 Dependence Analysis
4981
4982 C<isl> contains specialized functionality for performing
4983 array dataflow analysis.  That is, given a I<sink> access relation
4984 and a collection of possible I<source> access relations,
4985 C<isl> can compute relations that describe
4986 for each iteration of the sink access, which iteration
4987 of which of the source access relations was the last
4988 to access the same data element before the given iteration
4989 of the sink access.
4990 The resulting dependence relations map source iterations
4991 to the corresponding sink iterations.
4992 To compute standard flow dependences, the sink should be
4993 a read, while the sources should be writes.
4994 If any of the source accesses are marked as being I<may>
4995 accesses, then there will be a dependence from the last
4996 I<must> access B<and> from any I<may> access that follows
4997 this last I<must> access.
4998 In particular, if I<all> sources are I<may> accesses,
4999 then memory based dependence analysis is performed.
5000 If, on the other hand, all sources are I<must> accesses,
5001 then value based dependence analysis is performed.
5002
5003         #include <isl/flow.h>
5004
5005         typedef int (*isl_access_level_before)(void *first, void *second);
5006
5007         __isl_give isl_access_info *isl_access_info_alloc(
5008                 __isl_take isl_map *sink,
5009                 void *sink_user, isl_access_level_before fn,
5010                 int max_source);
5011         __isl_give isl_access_info *isl_access_info_add_source(
5012                 __isl_take isl_access_info *acc,
5013                 __isl_take isl_map *source, int must,
5014                 void *source_user);
5015         void *isl_access_info_free(__isl_take isl_access_info *acc);
5016
5017         __isl_give isl_flow *isl_access_info_compute_flow(
5018                 __isl_take isl_access_info *acc);
5019
5020         int isl_flow_foreach(__isl_keep isl_flow *deps,
5021                 int (*fn)(__isl_take isl_map *dep, int must,
5022                           void *dep_user, void *user),
5023                 void *user);
5024         __isl_give isl_map *isl_flow_get_no_source(
5025                 __isl_keep isl_flow *deps, int must);
5026         void isl_flow_free(__isl_take isl_flow *deps);
5027
5028 The function C<isl_access_info_compute_flow> performs the actual
5029 dependence analysis.  The other functions are used to construct
5030 the input for this function or to read off the output.
5031
5032 The input is collected in an C<isl_access_info>, which can
5033 be created through a call to C<isl_access_info_alloc>.
5034 The arguments to this functions are the sink access relation
5035 C<sink>, a token C<sink_user> used to identify the sink
5036 access to the user, a callback function for specifying the
5037 relative order of source and sink accesses, and the number
5038 of source access relations that will be added.
5039 The callback function has type C<int (*)(void *first, void *second)>.
5040 The function is called with two user supplied tokens identifying
5041 either a source or the sink and it should return the shared nesting
5042 level and the relative order of the two accesses.
5043 In particular, let I<n> be the number of loops shared by
5044 the two accesses.  If C<first> precedes C<second> textually,
5045 then the function should return I<2 * n + 1>; otherwise,
5046 it should return I<2 * n>.
5047 The sources can be added to the C<isl_access_info> by performing
5048 (at most) C<max_source> calls to C<isl_access_info_add_source>.
5049 C<must> indicates whether the source is a I<must> access
5050 or a I<may> access.  Note that a multi-valued access relation
5051 should only be marked I<must> if every iteration in the domain
5052 of the relation accesses I<all> elements in its image.
5053 The C<source_user> token is again used to identify
5054 the source access.  The range of the source access relation
5055 C<source> should have the same dimension as the range
5056 of the sink access relation.
5057 The C<isl_access_info_free> function should usually not be
5058 called explicitly, because it is called implicitly by
5059 C<isl_access_info_compute_flow>.
5060
5061 The result of the dependence analysis is collected in an
5062 C<isl_flow>.  There may be elements of
5063 the sink access for which no preceding source access could be
5064 found or for which all preceding sources are I<may> accesses.
5065 The relations containing these elements can be obtained through
5066 calls to C<isl_flow_get_no_source>, the first with C<must> set
5067 and the second with C<must> unset.
5068 In the case of standard flow dependence analysis,
5069 with the sink a read and the sources I<must> writes,
5070 the first relation corresponds to the reads from uninitialized
5071 array elements and the second relation is empty.
5072 The actual flow dependences can be extracted using
5073 C<isl_flow_foreach>.  This function will call the user-specified
5074 callback function C<fn> for each B<non-empty> dependence between
5075 a source and the sink.  The callback function is called
5076 with four arguments, the actual flow dependence relation
5077 mapping source iterations to sink iterations, a boolean that
5078 indicates whether it is a I<must> or I<may> dependence, a token
5079 identifying the source and an additional C<void *> with value
5080 equal to the third argument of the C<isl_flow_foreach> call.
5081 A dependence is marked I<must> if it originates from a I<must>
5082 source and if it is not followed by any I<may> sources.
5083
5084 After finishing with an C<isl_flow>, the user should call
5085 C<isl_flow_free> to free all associated memory.
5086
5087 A higher-level interface to dependence analysis is provided
5088 by the following function.
5089
5090         #include <isl/flow.h>
5091
5092         int isl_union_map_compute_flow(__isl_take isl_union_map *sink,
5093                 __isl_take isl_union_map *must_source,
5094                 __isl_take isl_union_map *may_source,
5095                 __isl_take isl_union_map *schedule,
5096                 __isl_give isl_union_map **must_dep,
5097                 __isl_give isl_union_map **may_dep,
5098                 __isl_give isl_union_map **must_no_source,
5099                 __isl_give isl_union_map **may_no_source);
5100
5101 The arrays are identified by the tuple names of the ranges
5102 of the accesses.  The iteration domains by the tuple names
5103 of the domains of the accesses and of the schedule.
5104 The relative order of the iteration domains is given by the
5105 schedule.  The relations returned through C<must_no_source>
5106 and C<may_no_source> are subsets of C<sink>.
5107 Any of C<must_dep>, C<may_dep>, C<must_no_source>
5108 or C<may_no_source> may be C<NULL>, but a C<NULL> value for
5109 any of the other arguments is treated as an error.
5110
5111 =head3 Interaction with Dependence Analysis
5112
5113 During the dependence analysis, we frequently need to perform
5114 the following operation.  Given a relation between sink iterations
5115 and potential source iterations from a particular source domain,
5116 what is the last potential source iteration corresponding to each
5117 sink iteration.  It can sometimes be convenient to adjust
5118 the set of potential source iterations before or after each such operation.
5119 The prototypical example is fuzzy array dataflow analysis,
5120 where we need to analyze if, based on data-dependent constraints,
5121 the sink iteration can ever be executed without one or more of
5122 the corresponding potential source iterations being executed.
5123 If so, we can introduce extra parameters and select an unknown
5124 but fixed source iteration from the potential source iterations.
5125 To be able to perform such manipulations, C<isl> provides the following
5126 function.
5127
5128         #include <isl/flow.h>
5129
5130         typedef __isl_give isl_restriction *(*isl_access_restrict)(
5131                 __isl_keep isl_map *source_map,
5132                 __isl_keep isl_set *sink, void *source_user,
5133                 void *user);
5134         __isl_give isl_access_info *isl_access_info_set_restrict(
5135                 __isl_take isl_access_info *acc,
5136                 isl_access_restrict fn, void *user);
5137
5138 The function C<isl_access_info_set_restrict> should be called
5139 before calling C<isl_access_info_compute_flow> and registers a callback function
5140 that will be called any time C<isl> is about to compute the last
5141 potential source.  The first argument is the (reverse) proto-dependence,
5142 mapping sink iterations to potential source iterations.
5143 The second argument represents the sink iterations for which
5144 we want to compute the last source iteration.
5145 The third argument is the token corresponding to the source
5146 and the final argument is the token passed to C<isl_access_info_set_restrict>.
5147 The callback is expected to return a restriction on either the input or
5148 the output of the operation computing the last potential source.
5149 If the input needs to be restricted then restrictions are needed
5150 for both the source and the sink iterations.  The sink iterations
5151 and the potential source iterations will be intersected with these sets.
5152 If the output needs to be restricted then only a restriction on the source
5153 iterations is required.
5154 If any error occurs, the callback should return C<NULL>.
5155 An C<isl_restriction> object can be created, freed and inspected
5156 using the following functions.
5157
5158         #include <isl/flow.h>
5159
5160         __isl_give isl_restriction *isl_restriction_input(
5161                 __isl_take isl_set *source_restr,
5162                 __isl_take isl_set *sink_restr);
5163         __isl_give isl_restriction *isl_restriction_output(
5164                 __isl_take isl_set *source_restr);
5165         __isl_give isl_restriction *isl_restriction_none(
5166                 __isl_take isl_map *source_map);
5167         __isl_give isl_restriction *isl_restriction_empty(
5168                 __isl_take isl_map *source_map);
5169         void *isl_restriction_free(
5170                 __isl_take isl_restriction *restr);
5171         isl_ctx *isl_restriction_get_ctx(
5172                 __isl_keep isl_restriction *restr);
5173
5174 C<isl_restriction_none> and C<isl_restriction_empty> are special
5175 cases of C<isl_restriction_input>.  C<isl_restriction_none>
5176 is essentially equivalent to
5177
5178         isl_restriction_input(isl_set_universe(
5179             isl_space_range(isl_map_get_space(source_map))),
5180                             isl_set_universe(
5181             isl_space_domain(isl_map_get_space(source_map))));
5182
5183 whereas C<isl_restriction_empty> is essentially equivalent to
5184
5185         isl_restriction_input(isl_set_empty(
5186             isl_space_range(isl_map_get_space(source_map))),
5187                             isl_set_universe(
5188             isl_space_domain(isl_map_get_space(source_map))));
5189
5190 =head2 Scheduling
5191
5192 B<The functionality described in this section is fairly new
5193 and may be subject to change.>
5194
5195 The following function can be used to compute a schedule
5196 for a union of domains.
5197 By default, the algorithm used to construct the schedule is similar
5198 to that of C<Pluto>.
5199 Alternatively, Feautrier's multi-dimensional scheduling algorithm can
5200 be selected.
5201 The generated schedule respects all C<validity> dependences.
5202 That is, all dependence distances over these dependences in the
5203 scheduled space are lexicographically positive.
5204 The default algorithm tries to minimize the dependence distances over
5205 C<proximity> dependences.
5206 Moreover, it tries to obtain sequences (bands) of schedule dimensions
5207 for groups of domains where the dependence distances have only
5208 non-negative values.
5209 When using Feautrier's algorithm, the C<proximity> dependence
5210 distances are only minimized during the extension to a
5211 full-dimensional schedule.
5212
5213         #include <isl/schedule.h>
5214         __isl_give isl_schedule *isl_union_set_compute_schedule(
5215                 __isl_take isl_union_set *domain,
5216                 __isl_take isl_union_map *validity,
5217                 __isl_take isl_union_map *proximity);
5218         void *isl_schedule_free(__isl_take isl_schedule *sched);
5219
5220 A mapping from the domains to the scheduled space can be obtained
5221 from an C<isl_schedule> using the following function.
5222
5223         __isl_give isl_union_map *isl_schedule_get_map(
5224                 __isl_keep isl_schedule *sched);
5225
5226 A representation of the schedule can be printed using
5227          
5228         __isl_give isl_printer *isl_printer_print_schedule(
5229                 __isl_take isl_printer *p,
5230                 __isl_keep isl_schedule *schedule);
5231
5232 A representation of the schedule as a forest of bands can be obtained
5233 using the following function.
5234
5235         __isl_give isl_band_list *isl_schedule_get_band_forest(
5236                 __isl_keep isl_schedule *schedule);
5237
5238 The individual bands can be visited in depth-first post-order
5239 using the following function.
5240
5241         #include <isl/schedule.h>
5242         int isl_schedule_foreach_band(
5243                 __isl_keep isl_schedule *sched,
5244                 int (*fn)(__isl_keep isl_band *band, void *user),
5245                 void *user);
5246
5247 The list can be manipulated as explained in L<"Lists">.
5248 The bands inside the list can be copied and freed using the following
5249 functions.
5250
5251         #include <isl/band.h>
5252         __isl_give isl_band *isl_band_copy(
5253                 __isl_keep isl_band *band);
5254         void *isl_band_free(__isl_take isl_band *band);
5255
5256 Each band contains zero or more scheduling dimensions.
5257 These are referred to as the members of the band.
5258 The section of the schedule that corresponds to the band is
5259 referred to as the partial schedule of the band.
5260 For those nodes that participate in a band, the outer scheduling
5261 dimensions form the prefix schedule, while the inner scheduling
5262 dimensions form the suffix schedule.
5263 That is, if we take a cut of the band forest, then the union of
5264 the concatenations of the prefix, partial and suffix schedules of
5265 each band in the cut is equal to the entire schedule (modulo
5266 some possible padding at the end with zero scheduling dimensions).
5267 The properties of a band can be inspected using the following functions.
5268
5269         #include <isl/band.h>
5270         isl_ctx *isl_band_get_ctx(__isl_keep isl_band *band);
5271
5272         int isl_band_has_children(__isl_keep isl_band *band);
5273         __isl_give isl_band_list *isl_band_get_children(
5274                 __isl_keep isl_band *band);
5275
5276         __isl_give isl_union_map *isl_band_get_prefix_schedule(
5277                 __isl_keep isl_band *band);
5278         __isl_give isl_union_map *isl_band_get_partial_schedule(
5279                 __isl_keep isl_band *band);
5280         __isl_give isl_union_map *isl_band_get_suffix_schedule(
5281                 __isl_keep isl_band *band);
5282
5283         int isl_band_n_member(__isl_keep isl_band *band);
5284         int isl_band_member_is_zero_distance(
5285                 __isl_keep isl_band *band, int pos);
5286
5287         int isl_band_list_foreach_band(
5288                 __isl_keep isl_band_list *list,
5289                 int (*fn)(__isl_keep isl_band *band, void *user),
5290                 void *user);
5291
5292 Note that a scheduling dimension is considered to be ``zero
5293 distance'' if it does not carry any proximity dependences
5294 within its band.
5295 That is, if the dependence distances of the proximity
5296 dependences are all zero in that direction (for fixed
5297 iterations of outer bands).
5298 Like C<isl_schedule_foreach_band>,
5299 the function C<isl_band_list_foreach_band> calls C<fn> on the bands
5300 in depth-first post-order.
5301
5302 A band can be tiled using the following function.
5303
5304         #include <isl/band.h>
5305         int isl_band_tile(__isl_keep isl_band *band,
5306                 __isl_take isl_vec *sizes);
5307
5308         int isl_options_set_tile_scale_tile_loops(isl_ctx *ctx,
5309                 int val);
5310         int isl_options_get_tile_scale_tile_loops(isl_ctx *ctx);
5311         int isl_options_set_tile_shift_point_loops(isl_ctx *ctx,
5312                 int val);
5313         int isl_options_get_tile_shift_point_loops(isl_ctx *ctx);
5314
5315 The C<isl_band_tile> function tiles the band using the given tile sizes
5316 inside its schedule.
5317 A new child band is created to represent the point loops and it is
5318 inserted between the modified band and its children.
5319 The C<tile_scale_tile_loops> option specifies whether the tile
5320 loops iterators should be scaled by the tile sizes.
5321 If the C<tile_shift_point_loops> option is set, then the point loops
5322 are shifted to start at zero.
5323
5324 A band can be split into two nested bands using the following function.
5325
5326         int isl_band_split(__isl_keep isl_band *band, int pos);
5327
5328 The resulting outer band contains the first C<pos> dimensions of C<band>
5329 while the inner band contains the remaining dimensions.
5330
5331 A representation of the band can be printed using
5332
5333         #include <isl/band.h>
5334         __isl_give isl_printer *isl_printer_print_band(
5335                 __isl_take isl_printer *p,
5336                 __isl_keep isl_band *band);
5337
5338 =head3 Options
5339
5340         #include <isl/schedule.h>
5341         int isl_options_set_schedule_max_coefficient(
5342                 isl_ctx *ctx, int val);
5343         int isl_options_get_schedule_max_coefficient(
5344                 isl_ctx *ctx);
5345         int isl_options_set_schedule_max_constant_term(
5346                 isl_ctx *ctx, int val);
5347         int isl_options_get_schedule_max_constant_term(
5348                 isl_ctx *ctx);
5349         int isl_options_set_schedule_fuse(isl_ctx *ctx, int val);
5350         int isl_options_get_schedule_fuse(isl_ctx *ctx);
5351         int isl_options_set_schedule_maximize_band_depth(
5352                 isl_ctx *ctx, int val);
5353         int isl_options_get_schedule_maximize_band_depth(
5354                 isl_ctx *ctx);
5355         int isl_options_set_schedule_outer_zero_distance(
5356                 isl_ctx *ctx, int val);
5357         int isl_options_get_schedule_outer_zero_distance(
5358                 isl_ctx *ctx);
5359         int isl_options_set_schedule_split_scaled(
5360                 isl_ctx *ctx, int val);
5361         int isl_options_get_schedule_split_scaled(
5362                 isl_ctx *ctx);
5363         int isl_options_set_schedule_algorithm(
5364                 isl_ctx *ctx, int val);
5365         int isl_options_get_schedule_algorithm(
5366                 isl_ctx *ctx);
5367         int isl_options_set_schedule_separate_components(
5368                 isl_ctx *ctx, int val);
5369         int isl_options_get_schedule_separate_components(
5370                 isl_ctx *ctx);
5371
5372 =over
5373
5374 =item * schedule_max_coefficient
5375
5376 This option enforces that the coefficients for variable and parameter
5377 dimensions in the calculated schedule are not larger than the specified value.
5378 This option can significantly increase the speed of the scheduling calculation
5379 and may also prevent fusing of unrelated dimensions. A value of -1 means that
5380 this option does not introduce bounds on the variable or parameter
5381 coefficients.
5382
5383 =item * schedule_max_constant_term
5384
5385 This option enforces that the constant coefficients in the calculated schedule
5386 are not larger than the maximal constant term. This option can significantly
5387 increase the speed of the scheduling calculation and may also prevent fusing of
5388 unrelated dimensions. A value of -1 means that this option does not introduce
5389 bounds on the constant coefficients.
5390
5391 =item * schedule_fuse
5392
5393 This option controls the level of fusion.
5394 If this option is set to C<ISL_SCHEDULE_FUSE_MIN>, then loops in the
5395 resulting schedule will be distributed as much as possible.
5396 If this option is set to C<ISL_SCHEDULE_FUSE_MAX>, then C<isl> will
5397 try to fuse loops in the resulting schedule.
5398
5399 =item * schedule_maximize_band_depth
5400
5401 If this option is set, we do not split bands at the point
5402 where we detect splitting is necessary. Instead, we
5403 backtrack and split bands as early as possible. This
5404 reduces the number of splits and maximizes the width of
5405 the bands. Wider bands give more possibilities for tiling.
5406 Note that if the C<schedule_fuse> option is set to C<ISL_SCHEDULE_FUSE_MIN>,
5407 then bands will be split as early as possible, even if there is no need.
5408 The C<schedule_maximize_band_depth> option therefore has no effect in this case.
5409
5410 =item * schedule_outer_zero_distance
5411
5412 If this option is set, then we try to construct schedules
5413 where the outermost scheduling dimension in each band
5414 results in a zero dependence distance over the proximity
5415 dependences.
5416
5417 =item * schedule_split_scaled
5418
5419 If this option is set, then we try to construct schedules in which the
5420 constant term is split off from the linear part if the linear parts of
5421 the scheduling rows for all nodes in the graphs have a common non-trivial
5422 divisor.
5423 The constant term is then placed in a separate band and the linear
5424 part is reduced.
5425
5426 =item * schedule_algorithm
5427
5428 Selects the scheduling algorithm to be used.
5429 Available scheduling algorithms are C<ISL_SCHEDULE_ALGORITHM_ISL>
5430 and C<ISL_SCHEDULE_ALGORITHM_FEAUTRIER>.
5431
5432 =item * schedule_separate_components
5433
5434 If at any point the dependence graph contains any (weakly connected) components,
5435 then these components are scheduled separately.
5436 If this option is not set, then some iterations of the domains
5437 in these components may be scheduled together.
5438 If this option is set, then the components are given consecutive
5439 schedules.
5440
5441 =back
5442
5443 =head2 AST Generation
5444
5445 This section describes the C<isl> functionality for generating
5446 ASTs that visit all the elements
5447 in a domain in an order specified by a schedule.
5448 In particular, given a C<isl_union_map>, an AST is generated
5449 that visits all the elements in the domain of the C<isl_union_map>
5450 according to the lexicographic order of the corresponding image
5451 element(s).  If the range of the C<isl_union_map> consists of
5452 elements in more than one space, then each of these spaces is handled
5453 separately in an arbitrary order.
5454 It should be noted that the image elements only specify the I<order>
5455 in which the corresponding domain elements should be visited.
5456 No direct relation between the image elements and the loop iterators
5457 in the generated AST should be assumed.
5458
5459 Each AST is generated within a build.  The initial build
5460 simply specifies the constraints on the parameters (if any)
5461 and can be created, inspected, copied and freed using the following functions.
5462
5463         #include <isl/ast_build.h>
5464         __isl_give isl_ast_build *isl_ast_build_from_context(
5465                 __isl_take isl_set *set);
5466         isl_ctx *isl_ast_build_get_ctx(
5467                 __isl_keep isl_ast_build *build);
5468         __isl_give isl_ast_build *isl_ast_build_copy(
5469                 __isl_keep isl_ast_build *build);
5470         void *isl_ast_build_free(
5471                 __isl_take isl_ast_build *build);
5472
5473 The C<set> argument is usually a parameter set with zero or more parameters.
5474 More C<isl_ast_build> functions are described in L</"Nested AST Generation">
5475 and L</"Fine-grained Control over AST Generation">.
5476 Finally, the AST itself can be constructed using the following
5477 function.
5478
5479         #include <isl/ast_build.h>
5480         __isl_give isl_ast_node *isl_ast_build_ast_from_schedule(
5481                 __isl_keep isl_ast_build *build,
5482                 __isl_take isl_union_map *schedule);
5483
5484 =head3 Inspecting the AST
5485
5486 The basic properties of an AST node can be obtained as follows.
5487
5488         #include <isl/ast.h>
5489         isl_ctx *isl_ast_node_get_ctx(
5490                 __isl_keep isl_ast_node *node);
5491         enum isl_ast_node_type isl_ast_node_get_type(
5492                 __isl_keep isl_ast_node *node);
5493
5494 The type of an AST node is one of
5495 C<isl_ast_node_for>,
5496 C<isl_ast_node_if>,
5497 C<isl_ast_node_block> or
5498 C<isl_ast_node_user>.
5499 An C<isl_ast_node_for> represents a for node.
5500 An C<isl_ast_node_if> represents an if node.
5501 An C<isl_ast_node_block> represents a compound node.
5502 An C<isl_ast_node_user> represents an expression statement.
5503 An expression statement typically corresponds to a domain element, i.e.,
5504 one of the elements that is visited by the AST.
5505
5506 Each type of node has its own additional properties.
5507
5508         #include <isl/ast.h>
5509         __isl_give isl_ast_expr *isl_ast_node_for_get_iterator(
5510                 __isl_keep isl_ast_node *node);
5511         __isl_give isl_ast_expr *isl_ast_node_for_get_init(
5512                 __isl_keep isl_ast_node *node);
5513         __isl_give isl_ast_expr *isl_ast_node_for_get_cond(
5514                 __isl_keep isl_ast_node *node);
5515         __isl_give isl_ast_expr *isl_ast_node_for_get_inc(
5516                 __isl_keep isl_ast_node *node);
5517         __isl_give isl_ast_node *isl_ast_node_for_get_body(
5518                 __isl_keep isl_ast_node *node);
5519         int isl_ast_node_for_is_degenerate(
5520                 __isl_keep isl_ast_node *node);
5521
5522 An C<isl_ast_for> is considered degenerate if it is known to execute
5523 exactly once.
5524
5525         #include <isl/ast.h>
5526         __isl_give isl_ast_expr *isl_ast_node_if_get_cond(
5527                 __isl_keep isl_ast_node *node);
5528         __isl_give isl_ast_node *isl_ast_node_if_get_then(
5529                 __isl_keep isl_ast_node *node);
5530         int isl_ast_node_if_has_else(
5531                 __isl_keep isl_ast_node *node);
5532         __isl_give isl_ast_node *isl_ast_node_if_get_else(
5533                 __isl_keep isl_ast_node *node);
5534
5535         __isl_give isl_ast_node_list *
5536         isl_ast_node_block_get_children(
5537                 __isl_keep isl_ast_node *node);
5538
5539         __isl_give isl_ast_expr *isl_ast_node_user_get_expr(
5540                 __isl_keep isl_ast_node *node);
5541
5542 Each of the returned C<isl_ast_expr>s can in turn be inspected using
5543 the following functions.
5544
5545         #include <isl/ast.h>
5546         isl_ctx *isl_ast_expr_get_ctx(
5547                 __isl_keep isl_ast_expr *expr);
5548         enum isl_ast_expr_type isl_ast_expr_get_type(
5549                 __isl_keep isl_ast_expr *expr);
5550
5551 The type of an AST expression is one of
5552 C<isl_ast_expr_op>,
5553 C<isl_ast_expr_id> or
5554 C<isl_ast_expr_int>.
5555 An C<isl_ast_expr_op> represents the result of an operation.
5556 An C<isl_ast_expr_id> represents an identifier.
5557 An C<isl_ast_expr_int> represents an integer value.
5558
5559 Each type of expression has its own additional properties.
5560
5561         #include <isl/ast.h>
5562         enum isl_ast_op_type isl_ast_expr_get_op_type(
5563                 __isl_keep isl_ast_expr *expr);
5564         int isl_ast_expr_get_op_n_arg(__isl_keep isl_ast_expr *expr);
5565         __isl_give isl_ast_expr *isl_ast_expr_get_op_arg(
5566                 __isl_keep isl_ast_expr *expr, int pos);
5567         int isl_ast_node_foreach_ast_op_type(
5568                 __isl_keep isl_ast_node *node,
5569                 int (*fn)(enum isl_ast_op_type type, void *user),
5570                 void *user);
5571
5572 C<isl_ast_expr_get_op_type> returns the type of the operation
5573 performed.  C<isl_ast_expr_get_op_n_arg> returns the number of
5574 arguments.  C<isl_ast_expr_get_op_arg> returns the specified
5575 argument.
5576 C<isl_ast_node_foreach_ast_op_type> calls C<fn> for each distinct
5577 C<isl_ast_op_type> that appears in C<node>.
5578 The operation type is one of the following.
5579
5580 =over
5581
5582 =item C<isl_ast_op_and>
5583
5584 Logical I<and> of two arguments.
5585 Both arguments can be evaluated.
5586
5587 =item C<isl_ast_op_and_then>
5588
5589 Logical I<and> of two arguments.
5590 The second argument can only be evaluated if the first evaluates to true.
5591
5592 =item C<isl_ast_op_or>
5593
5594 Logical I<or> of two arguments.
5595 Both arguments can be evaluated.
5596
5597 =item C<isl_ast_op_or_else>
5598
5599 Logical I<or> of two arguments.
5600 The second argument can only be evaluated if the first evaluates to false.
5601
5602 =item C<isl_ast_op_max>
5603
5604 Maximum of two or more arguments.
5605
5606 =item C<isl_ast_op_min>
5607
5608 Minimum of two or more arguments.
5609
5610 =item C<isl_ast_op_minus>
5611
5612 Change sign.
5613
5614 =item C<isl_ast_op_add>
5615
5616 Sum of two arguments.
5617
5618 =item C<isl_ast_op_sub>
5619
5620 Difference of two arguments.
5621
5622 =item C<isl_ast_op_mul>
5623
5624 Product of two arguments.
5625
5626 =item C<isl_ast_op_div>
5627
5628 Exact division.  That is, the result is known to be an integer.
5629
5630 =item C<isl_ast_op_fdiv_q>
5631
5632 Result of integer division, rounded towards negative
5633 infinity.
5634
5635 =item C<isl_ast_op_pdiv_q>
5636
5637 Result of integer division, where dividend is known to be non-negative.
5638
5639 =item C<isl_ast_op_pdiv_r>
5640
5641 Remainder of integer division, where dividend is known to be non-negative.
5642
5643 =item C<isl_ast_op_cond>
5644
5645 Conditional operator defined on three arguments.
5646 If the first argument evaluates to true, then the result
5647 is equal to the second argument.  Otherwise, the result
5648 is equal to the third argument.
5649 The second and third argument may only be evaluated if
5650 the first argument evaluates to true and false, respectively.
5651 Corresponds to C<a ? b : c> in C.
5652
5653 =item C<isl_ast_op_select>
5654
5655 Conditional operator defined on three arguments.
5656 If the first argument evaluates to true, then the result
5657 is equal to the second argument.  Otherwise, the result
5658 is equal to the third argument.
5659 The second and third argument may be evaluated independently
5660 of the value of the first argument.
5661 Corresponds to C<a * b + (1 - a) * c> in C.
5662
5663 =item C<isl_ast_op_eq>
5664
5665 Equality relation.
5666
5667 =item C<isl_ast_op_le>
5668
5669 Less than or equal relation.
5670
5671 =item C<isl_ast_op_lt>
5672
5673 Less than relation.
5674
5675 =item C<isl_ast_op_ge>
5676
5677 Greater than or equal relation.
5678
5679 =item C<isl_ast_op_gt>
5680
5681 Greater than relation.
5682
5683 =item C<isl_ast_op_call>
5684
5685 A function call.
5686 The number of arguments of the C<isl_ast_expr> is one more than
5687 the number of arguments in the function call, the first argument
5688 representing the function being called.
5689
5690 =back
5691
5692         #include <isl/ast.h>
5693         __isl_give isl_id *isl_ast_expr_get_id(
5694                 __isl_keep isl_ast_expr *expr);
5695
5696 Return the identifier represented by the AST expression.
5697
5698         #include <isl/ast.h>
5699         int isl_ast_expr_get_int(__isl_keep isl_ast_expr *expr,
5700                 isl_int *v);
5701
5702 Return the integer represented by the AST expression.
5703 Note that the integer is returned through the C<v> argument.
5704 The return value of the function itself indicates whether the
5705 operation was performed successfully.
5706
5707 =head3 Manipulating and printing the AST
5708
5709 AST nodes can be copied and freed using the following functions.
5710
5711         #include <isl/ast.h>
5712         __isl_give isl_ast_node *isl_ast_node_copy(
5713                 __isl_keep isl_ast_node *node);
5714         void *isl_ast_node_free(__isl_take isl_ast_node *node);
5715
5716 AST expressions can be copied and freed using the following functions.
5717
5718         #include <isl/ast.h>
5719         __isl_give isl_ast_expr *isl_ast_expr_copy(
5720                 __isl_keep isl_ast_expr *expr);
5721         void *isl_ast_expr_free(__isl_take isl_ast_expr *expr);
5722
5723 New AST expressions can be created either directly or within
5724 the context of an C<isl_ast_build>.
5725
5726         #include <isl/ast.h>
5727         __isl_give isl_ast_expr *isl_ast_expr_from_id(
5728                 __isl_take isl_id *id);
5729         __isl_give isl_ast_expr *isl_ast_expr_neg(
5730                 __isl_take isl_ast_expr *expr);
5731         __isl_give isl_ast_expr *isl_ast_expr_add(
5732                 __isl_take isl_ast_expr *expr1,
5733                 __isl_take isl_ast_expr *expr2);
5734         __isl_give isl_ast_expr *isl_ast_expr_sub(
5735                 __isl_take isl_ast_expr *expr1,
5736                 __isl_take isl_ast_expr *expr2);
5737         __isl_give isl_ast_expr *isl_ast_expr_mul(
5738                 __isl_take isl_ast_expr *expr1,
5739                 __isl_take isl_ast_expr *expr2);
5740         __isl_give isl_ast_expr *isl_ast_expr_div(
5741                 __isl_take isl_ast_expr *expr1,
5742                 __isl_take isl_ast_expr *expr2);
5743         __isl_give isl_ast_expr *isl_ast_expr_and(
5744                 __isl_take isl_ast_expr *expr1,
5745                 __isl_take isl_ast_expr *expr2)
5746         __isl_give isl_ast_expr *isl_ast_expr_or(
5747                 __isl_take isl_ast_expr *expr1,
5748                 __isl_take isl_ast_expr *expr2)
5749
5750         #include <isl/ast_build.h>
5751         __isl_give isl_ast_expr *isl_ast_build_expr_from_pw_aff(
5752                 __isl_keep isl_ast_build *build,
5753                 __isl_take isl_pw_aff *pa);
5754         __isl_give isl_ast_expr *
5755         isl_ast_build_call_from_pw_multi_aff(
5756                 __isl_keep isl_ast_build *build,
5757                 __isl_take isl_pw_multi_aff *pma);
5758
5759 The domains of C<pa> and C<pma> should correspond
5760 to the schedule space of C<build>.
5761 The tuple id of C<pma> is used as the function being called.
5762
5763 User specified data can be attached to an C<isl_ast_node> and obtained
5764 from the same C<isl_ast_node> using the following functions.
5765
5766         #include <isl/ast.h>
5767         __isl_give isl_ast_node *isl_ast_node_set_annotation(
5768                 __isl_take isl_ast_node *node,
5769                 __isl_take isl_id *annotation);
5770         __isl_give isl_id *isl_ast_node_get_annotation(
5771                 __isl_keep isl_ast_node *node);
5772
5773 Basic printing can be performed using the following functions.
5774
5775         #include <isl/ast.h>
5776         __isl_give isl_printer *isl_printer_print_ast_expr(
5777                 __isl_take isl_printer *p,
5778                 __isl_keep isl_ast_expr *expr);
5779         __isl_give isl_printer *isl_printer_print_ast_node(
5780                 __isl_take isl_printer *p,
5781                 __isl_keep isl_ast_node *node);
5782
5783 More advanced printing can be performed using the following functions.
5784
5785         #include <isl/ast.h>
5786         __isl_give isl_printer *isl_ast_op_type_print_macro(
5787                 enum isl_ast_op_type type,
5788                 __isl_take isl_printer *p);
5789         __isl_give isl_printer *isl_ast_node_print_macros(
5790                 __isl_keep isl_ast_node *node,
5791                 __isl_take isl_printer *p);
5792         __isl_give isl_printer *isl_ast_node_print(
5793                 __isl_keep isl_ast_node *node,
5794                 __isl_take isl_printer *p,
5795                 __isl_take isl_ast_print_options *options);
5796         __isl_give isl_printer *isl_ast_node_for_print(
5797                 __isl_keep isl_ast_node *node,
5798                 __isl_take isl_printer *p,
5799                 __isl_take isl_ast_print_options *options);
5800         __isl_give isl_printer *isl_ast_node_if_print(
5801                 __isl_keep isl_ast_node *node,
5802                 __isl_take isl_printer *p,
5803                 __isl_take isl_ast_print_options *options);
5804
5805 While printing an C<isl_ast_node> in C<ISL_FORMAT_C>,
5806 C<isl> may print out an AST that makes use of macros such
5807 as C<floord>, C<min> and C<max>.
5808 C<isl_ast_op_type_print_macro> prints out the macro
5809 corresponding to a specific C<isl_ast_op_type>.
5810 C<isl_ast_node_print_macros> scans the C<isl_ast_node>
5811 for expressions where these macros would be used and prints
5812 out the required macro definitions.
5813 Essentially, C<isl_ast_node_print_macros> calls
5814 C<isl_ast_node_foreach_ast_op_type> with C<isl_ast_op_type_print_macro>
5815 as function argument.
5816 C<isl_ast_node_print>, C<isl_ast_node_for_print> and
5817 C<isl_ast_node_if_print> print an C<isl_ast_node>
5818 in C<ISL_FORMAT_C>, but allow for some extra control
5819 through an C<isl_ast_print_options> object.
5820 This object can be created using the following functions.
5821
5822         #include <isl/ast.h>
5823         __isl_give isl_ast_print_options *
5824         isl_ast_print_options_alloc(isl_ctx *ctx);
5825         __isl_give isl_ast_print_options *
5826         isl_ast_print_options_copy(
5827                 __isl_keep isl_ast_print_options *options);
5828         void *isl_ast_print_options_free(
5829                 __isl_take isl_ast_print_options *options);
5830
5831         __isl_give isl_ast_print_options *
5832         isl_ast_print_options_set_print_user(
5833                 __isl_take isl_ast_print_options *options,
5834                 __isl_give isl_printer *(*print_user)(
5835                         __isl_take isl_printer *p,
5836                         __isl_take isl_ast_print_options *options,
5837                         __isl_keep isl_ast_node *node, void *user),
5838                 void *user);
5839         __isl_give isl_ast_print_options *
5840         isl_ast_print_options_set_print_for(
5841                 __isl_take isl_ast_print_options *options,
5842                 __isl_give isl_printer *(*print_for)(
5843                         __isl_take isl_printer *p,
5844                         __isl_take isl_ast_print_options *options,
5845                         __isl_keep isl_ast_node *node, void *user),
5846                 void *user);
5847
5848 The callback set by C<isl_ast_print_options_set_print_user>
5849 is called whenever a node of type C<isl_ast_node_user> needs to
5850 be printed.
5851 The callback set by C<isl_ast_print_options_set_print_for>
5852 is called whenever a node of type C<isl_ast_node_for> needs to
5853 be printed.
5854 Note that C<isl_ast_node_for_print> will I<not> call the
5855 callback set by C<isl_ast_print_options_set_print_for> on the node
5856 on which C<isl_ast_node_for_print> is called, but only on nested
5857 nodes of type C<isl_ast_node_for>.  It is therefore safe to
5858 call C<isl_ast_node_for_print> from within the callback set by
5859 C<isl_ast_print_options_set_print_for>.
5860
5861 The following option determines the type to be used for iterators
5862 while printing the AST.
5863
5864         int isl_options_set_ast_iterator_type(
5865                 isl_ctx *ctx, const char *val);
5866         const char *isl_options_get_ast_iterator_type(
5867                 isl_ctx *ctx);
5868
5869 =head3 Options
5870
5871         #include <isl/ast_build.h>
5872         int isl_options_set_ast_build_atomic_upper_bound(
5873                 isl_ctx *ctx, int val);
5874         int isl_options_get_ast_build_atomic_upper_bound(
5875                 isl_ctx *ctx);
5876         int isl_options_set_ast_build_prefer_pdiv(isl_ctx *ctx,
5877                 int val);
5878         int isl_options_get_ast_build_prefer_pdiv(isl_ctx *ctx);
5879         int isl_options_set_ast_build_exploit_nested_bounds(
5880                 isl_ctx *ctx, int val);
5881         int isl_options_get_ast_build_exploit_nested_bounds(
5882                 isl_ctx *ctx);
5883         int isl_options_set_ast_build_group_coscheduled(
5884                 isl_ctx *ctx, int val);
5885         int isl_options_get_ast_build_group_coscheduled(
5886                 isl_ctx *ctx);
5887         int isl_options_set_ast_build_scale_strides(
5888                 isl_ctx *ctx, int val);
5889         int isl_options_get_ast_build_scale_strides(
5890                 isl_ctx *ctx);
5891         int isl_options_set_ast_build_allow_else(isl_ctx *ctx,
5892                 int val);
5893         int isl_options_get_ast_build_allow_else(isl_ctx *ctx);
5894         int isl_options_set_ast_build_allow_or(isl_ctx *ctx,
5895                 int val);
5896         int isl_options_get_ast_build_allow_or(isl_ctx *ctx);
5897
5898 =over
5899
5900 =item * ast_build_atomic_upper_bound
5901
5902 Generate loop upper bounds that consist of the current loop iterator,
5903 an operator and an expression not involving the iterator.
5904 If this option is not set, then the current loop iterator may appear
5905 several times in the upper bound.
5906 For example, when this option is turned off, AST generation
5907 for the schedule
5908
5909         [n] -> { A[i] -> [i] : 0 <= i <= 100, n }
5910
5911 produces
5912
5913         for (int c0 = 0; c0 <= 100 && n >= c0; c0 += 1)
5914           A(c0);
5915
5916 When the option is turned on, the following AST is generated
5917
5918         for (int c0 = 0; c0 <= min(100, n); c0 += 1)
5919           A(c0);
5920
5921 =item * ast_build_prefer_pdiv
5922
5923 If this option is turned off, then the AST generation will
5924 produce ASTs that may only contain C<isl_ast_op_fdiv_q>
5925 operators, but no C<isl_ast_op_pdiv_q> or
5926 C<isl_ast_op_pdiv_r> operators.
5927 If this options is turned on, then C<isl> will try to convert
5928 some of the C<isl_ast_op_fdiv_q> operators to (expressions containing)
5929 C<isl_ast_op_pdiv_q> or C<isl_ast_op_pdiv_r> operators.
5930
5931 =item * ast_build_exploit_nested_bounds
5932
5933 Simplify conditions based on bounds of nested for loops.
5934 In particular, remove conditions that are implied by the fact
5935 that one or more nested loops have at least one iteration,
5936 meaning that the upper bound is at least as large as the lower bound.
5937 For example, when this option is turned off, AST generation
5938 for the schedule
5939
5940         [N,M] -> { A[i,j] -> [i,j] : 0 <= i <= N and
5941                                         0 <= j <= M }
5942
5943 produces
5944
5945         if (M >= 0)
5946           for (int c0 = 0; c0 <= N; c0 += 1)
5947             for (int c1 = 0; c1 <= M; c1 += 1)
5948               A(c0, c1);
5949
5950 When the option is turned on, the following AST is generated
5951
5952         for (int c0 = 0; c0 <= N; c0 += 1)
5953           for (int c1 = 0; c1 <= M; c1 += 1)
5954             A(c0, c1);
5955
5956 =item * ast_build_group_coscheduled
5957
5958 If two domain elements are assigned the same schedule point, then
5959 they may be executed in any order and they may even appear in different
5960 loops.  If this options is set, then the AST generator will make
5961 sure that coscheduled domain elements do not appear in separate parts
5962 of the AST.  This is useful in case of nested AST generation
5963 if the outer AST generation is given only part of a schedule
5964 and the inner AST generation should handle the domains that are
5965 coscheduled by this initial part of the schedule together.
5966 For example if an AST is generated for a schedule
5967
5968         { A[i] -> [0]; B[i] -> [0] }
5969
5970 then the C<isl_ast_build_set_create_leaf> callback described
5971 below may get called twice, once for each domain.
5972 Setting this option ensures that the callback is only called once
5973 on both domains together.
5974
5975 =item * ast_build_separation_bounds
5976
5977 This option specifies which bounds to use during separation.
5978 If this option is set to C<ISL_AST_BUILD_SEPARATION_BOUNDS_IMPLICIT>
5979 then all (possibly implicit) bounds on the current dimension will
5980 be used during separation.
5981 If this option is set to C<ISL_AST_BUILD_SEPARATION_BOUNDS_EXPLICIT>
5982 then only those bounds that are explicitly available will
5983 be used during separation.
5984
5985 =item * ast_build_scale_strides
5986
5987 This option specifies whether the AST generator is allowed
5988 to scale down iterators of strided loops.
5989
5990 =item * ast_build_allow_else
5991
5992 This option specifies whether the AST generator is allowed
5993 to construct if statements with else branches.
5994
5995 =item * ast_build_allow_or
5996
5997 This option specifies whether the AST generator is allowed
5998 to construct if conditions with disjunctions.
5999
6000 =back
6001
6002 =head3 Fine-grained Control over AST Generation
6003
6004 Besides specifying the constraints on the parameters,
6005 an C<isl_ast_build> object can be used to control
6006 various aspects of the AST generation process.
6007 The most prominent way of control is through ``options'',
6008 which can be set using the following function.
6009
6010         #include <isl/ast_build.h>
6011         __isl_give isl_ast_build *
6012         isl_ast_build_set_options(
6013                 __isl_take isl_ast_build *control,
6014                 __isl_take isl_union_map *options);
6015
6016 The options are encoded in an <isl_union_map>.
6017 The domain of this union relation refers to the schedule domain,
6018 i.e., the range of the schedule passed to C<isl_ast_build_ast_from_schedule>.
6019 In the case of nested AST generation (see L</"Nested AST Generation">),
6020 the domain of C<options> should refer to the extra piece of the schedule.
6021 That is, it should be equal to the range of the wrapped relation in the
6022 range of the schedule.
6023 The range of the options can consist of elements in one or more spaces,
6024 the names of which determine the effect of the option.
6025 The values of the range typically also refer to the schedule dimension
6026 to which the option applies.  In case of nested AST generation
6027 (see L</"Nested AST Generation">), these values refer to the position
6028 of the schedule dimension within the innermost AST generation.
6029 The constraints on the domain elements of
6030 the option should only refer to this dimension and earlier dimensions.
6031 We consider the following spaces.
6032
6033 =over
6034
6035 =item C<separation_class>
6036
6037 This space is a wrapped relation between two one dimensional spaces.
6038 The input space represents the schedule dimension to which the option
6039 applies and the output space represents the separation class.
6040 While constructing a loop corresponding to the specified schedule
6041 dimension(s), the AST generator will try to generate separate loops
6042 for domain elements that are assigned different classes.
6043 If only some of the elements are assigned a class, then those elements
6044 that are not assigned any class will be treated as belonging to a class
6045 that is separate from the explicitly assigned classes.
6046 The typical use case for this option is to separate full tiles from
6047 partial tiles.
6048 The other options, described below, are applied after the separation
6049 into classes.
6050
6051 As an example, consider the separation into full and partial tiles
6052 of a tiling of a triangular domain.
6053 Take, for example, the domain
6054
6055         { A[i,j] : 0 <= i,j and i + j <= 100 }
6056
6057 and a tiling into tiles of 10 by 10.  The input to the AST generator
6058 is then the schedule
6059
6060         { A[i,j] -> [([i/10]),[j/10],i,j] : 0 <= i,j and
6061                                                 i + j <= 100 }
6062
6063 Without any options, the following AST is generated
6064
6065         for (int c0 = 0; c0 <= 10; c0 += 1)
6066           for (int c1 = 0; c1 <= -c0 + 10; c1 += 1)
6067             for (int c2 = 10 * c0;
6068                  c2 <= min(-10 * c1 + 100, 10 * c0 + 9);
6069                  c2 += 1)
6070               for (int c3 = 10 * c1;
6071                    c3 <= min(10 * c1 + 9, -c2 + 100);
6072                    c3 += 1)
6073                 A(c2, c3);
6074
6075 Separation into full and partial tiles can be obtained by assigning
6076 a class, say C<0>, to the full tiles.  The full tiles are represented by those
6077 values of the first and second schedule dimensions for which there are
6078 values of the third and fourth dimensions to cover an entire tile.
6079 That is, we need to specify the following option
6080
6081         { [a,b,c,d] -> separation_class[[0]->[0]] :
6082                 exists b': 0 <= 10a,10b' and
6083                            10a+9+10b'+9 <= 100;
6084           [a,b,c,d] -> separation_class[[1]->[0]] :
6085                 0 <= 10a,10b and 10a+9+10b+9 <= 100 }
6086
6087 which simplifies to
6088
6089         { [a, b, c, d] -> separation_class[[1] -> [0]] :
6090                 a >= 0 and b >= 0 and b <= 8 - a;
6091           [a, b, c, d] -> separation_class[[0] -> [0]] :
6092                 a >= 0 and a <= 8 }
6093
6094 With this option, the generated AST is as follows
6095
6096         {
6097           for (int c0 = 0; c0 <= 8; c0 += 1) {
6098             for (int c1 = 0; c1 <= -c0 + 8; c1 += 1)
6099               for (int c2 = 10 * c0;
6100                    c2 <= 10 * c0 + 9; c2 += 1)
6101                 for (int c3 = 10 * c1;
6102                      c3 <= 10 * c1 + 9; c3 += 1)
6103                   A(c2, c3);
6104             for (int c1 = -c0 + 9; c1 <= -c0 + 10; c1 += 1)
6105               for (int c2 = 10 * c0;
6106                    c2 <= min(-10 * c1 + 100, 10 * c0 + 9);
6107                    c2 += 1)
6108                 for (int c3 = 10 * c1;
6109                      c3 <= min(-c2 + 100, 10 * c1 + 9);
6110                      c3 += 1)
6111                   A(c2, c3);
6112           }
6113           for (int c0 = 9; c0 <= 10; c0 += 1)
6114             for (int c1 = 0; c1 <= -c0 + 10; c1 += 1)
6115               for (int c2 = 10 * c0;
6116                    c2 <= min(-10 * c1 + 100, 10 * c0 + 9);
6117                    c2 += 1)
6118                 for (int c3 = 10 * c1;
6119                      c3 <= min(10 * c1 + 9, -c2 + 100);
6120                      c3 += 1)
6121                   A(c2, c3);
6122         }
6123
6124 =item C<separate>
6125
6126 This is a single-dimensional space representing the schedule dimension(s)
6127 to which ``separation'' should be applied.  Separation tries to split
6128 a loop into several pieces if this can avoid the generation of guards
6129 inside the loop.
6130 See also the C<atomic> option.
6131
6132 =item C<atomic>
6133
6134 This is a single-dimensional space representing the schedule dimension(s)
6135 for which the domains should be considered ``atomic''.  That is, the
6136 AST generator will make sure that any given domain space will only appear
6137 in a single loop at the specified level.
6138
6139 Consider the following schedule
6140
6141         { a[i] -> [i] : 0 <= i < 10;
6142           b[i] -> [i+1] : 0 <= i < 10 }
6143
6144 If the following option is specified
6145
6146         { [i] -> separate[x] }
6147
6148 then the following AST will be generated
6149
6150         {
6151           a(0);
6152           for (int c0 = 1; c0 <= 9; c0 += 1) {
6153             a(c0);
6154             b(c0 - 1);
6155           }
6156           b(9);
6157         }
6158
6159 If, on the other hand, the following option is specified
6160
6161         { [i] -> atomic[x] }
6162
6163 then the following AST will be generated
6164
6165         for (int c0 = 0; c0 <= 10; c0 += 1) {
6166           if (c0 <= 9)
6167             a(c0);
6168           if (c0 >= 1)
6169             b(c0 - 1);
6170         }
6171
6172 If neither C<atomic> nor C<separate> is specified, then the AST generator
6173 may produce either of these two results or some intermediate form.
6174
6175 =item C<unroll>
6176
6177 This is a single-dimensional space representing the schedule dimension(s)
6178 that should be I<completely> unrolled.
6179 To obtain a partial unrolling, the user should apply an additional
6180 strip-mining to the schedule and fully unroll the inner loop.
6181
6182 =back
6183
6184 Additional control is available through the following functions.
6185
6186         #include <isl/ast_build.h>
6187         __isl_give isl_ast_build *
6188         isl_ast_build_set_iterators(
6189                 __isl_take isl_ast_build *control,
6190                 __isl_take isl_id_list *iterators);
6191
6192 The function C<isl_ast_build_set_iterators> allows the user to
6193 specify a list of iterator C<isl_id>s to be used as iterators.
6194 If the input schedule is injective, then
6195 the number of elements in this list should be as large as the dimension
6196 of the schedule space, but no direct correspondence should be assumed
6197 between dimensions and elements.
6198 If the input schedule is not injective, then an additional number
6199 of C<isl_id>s equal to the largest dimension of the input domains
6200 may be required.
6201 If the number of provided C<isl_id>s is insufficient, then additional
6202 names are automatically generated.
6203
6204         #include <isl/ast_build.h>
6205         __isl_give isl_ast_build *
6206         isl_ast_build_set_create_leaf(
6207                 __isl_take isl_ast_build *control,
6208                 __isl_give isl_ast_node *(*fn)(
6209                         __isl_take isl_ast_build *build,
6210                         void *user), void *user);
6211
6212 The
6213 C<isl_ast_build_set_create_leaf> function allows for the
6214 specification of a callback that should be called whenever the AST
6215 generator arrives at an element of the schedule domain.
6216 The callback should return an AST node that should be inserted
6217 at the corresponding position of the AST.  The default action (when
6218 the callback is not set) is to continue generating parts of the AST to scan
6219 all the domain elements associated to the schedule domain element
6220 and to insert user nodes, ``calling'' the domain element, for each of them.
6221 The C<build> argument contains the current state of the C<isl_ast_build>.
6222 To ease nested AST generation (see L</"Nested AST Generation">),
6223 all control information that is
6224 specific to the current AST generation such as the options and
6225 the callbacks has been removed from this C<isl_ast_build>.
6226 The callback would typically return the result of a nested
6227 AST generation or a
6228 user defined node created using the following function.
6229
6230         #include <isl/ast.h>
6231         __isl_give isl_ast_node *isl_ast_node_alloc_user(
6232                 __isl_take isl_ast_expr *expr);
6233
6234         #include <isl/ast_build.h>
6235         __isl_give isl_ast_build *
6236         isl_ast_build_set_at_each_domain(
6237                 __isl_take isl_ast_build *build,
6238                 __isl_give isl_ast_node *(*fn)(
6239                         __isl_take isl_ast_node *node,
6240                         __isl_keep isl_ast_build *build,
6241                         void *user), void *user);
6242         __isl_give isl_ast_build *
6243         isl_ast_build_set_before_each_for(
6244                 __isl_take isl_ast_build *build,
6245                 __isl_give isl_id *(*fn)(
6246                         __isl_keep isl_ast_build *build,
6247                         void *user), void *user);
6248         __isl_give isl_ast_build *
6249         isl_ast_build_set_after_each_for(
6250                 __isl_take isl_ast_build *build,
6251                 __isl_give isl_ast_node *(*fn)(
6252                         __isl_take isl_ast_node *node,
6253                         __isl_keep isl_ast_build *build,
6254                         void *user), void *user);
6255
6256 The callback set by C<isl_ast_build_set_at_each_domain> will
6257 be called for each domain AST node.
6258 The callbacks set by C<isl_ast_build_set_before_each_for>
6259 and C<isl_ast_build_set_after_each_for> will be called
6260 for each for AST node.  The first will be called in depth-first
6261 pre-order, while the second will be called in depth-first post-order.
6262 Since C<isl_ast_build_set_before_each_for> is called before the for
6263 node is actually constructed, it is only passed an C<isl_ast_build>.
6264 The returned C<isl_id> will be added as an annotation (using
6265 C<isl_ast_node_set_annotation>) to the constructed for node.
6266 In particular, if the user has also specified an C<after_each_for>
6267 callback, then the annotation can be retrieved from the node passed to
6268 that callback using C<isl_ast_node_get_annotation>.
6269 All callbacks should C<NULL> on failure.
6270 The given C<isl_ast_build> can be used to create new
6271 C<isl_ast_expr> objects using C<isl_ast_build_expr_from_pw_aff>
6272 or C<isl_ast_build_call_from_pw_multi_aff>.
6273
6274 =head3 Nested AST Generation
6275
6276 C<isl> allows the user to create an AST within the context
6277 of another AST.  These nested ASTs are created using the
6278 same C<isl_ast_build_ast_from_schedule> function that is used to create the
6279 outer AST.  The C<build> argument should be an C<isl_ast_build>
6280 passed to a callback set by
6281 C<isl_ast_build_set_create_leaf>.
6282 The space of the range of the C<schedule> argument should refer
6283 to this build.  In particular, the space should be a wrapped
6284 relation and the domain of this wrapped relation should be the
6285 same as that of the range of the schedule returned by
6286 C<isl_ast_build_get_schedule> below.
6287 In practice, the new schedule is typically
6288 created by calling C<isl_union_map_range_product> on the old schedule
6289 and some extra piece of the schedule.
6290 The space of the schedule domain is also available from
6291 the C<isl_ast_build>.
6292
6293         #include <isl/ast_build.h>
6294         __isl_give isl_union_map *isl_ast_build_get_schedule(
6295                 __isl_keep isl_ast_build *build);
6296         __isl_give isl_space *isl_ast_build_get_schedule_space(
6297                 __isl_keep isl_ast_build *build);
6298         __isl_give isl_ast_build *isl_ast_build_restrict(
6299                 __isl_take isl_ast_build *build,
6300                 __isl_take isl_set *set);
6301
6302 The C<isl_ast_build_get_schedule> function returns a (partial)
6303 schedule for the domains elements for which part of the AST still needs to
6304 be generated in the current build.
6305 In particular, the domain elements are mapped to those iterations of the loops
6306 enclosing the current point of the AST generation inside which
6307 the domain elements are executed.
6308 No direct correspondence between
6309 the input schedule and this schedule should be assumed.
6310 The space obtained from C<isl_ast_build_get_schedule_space> can be used
6311 to create a set for C<isl_ast_build_restrict> to intersect
6312 with the current build.  In particular, the set passed to
6313 C<isl_ast_build_restrict> can have additional parameters.
6314 The ids of the set dimensions in the space returned by
6315 C<isl_ast_build_get_schedule_space> correspond to the
6316 iterators of the already generated loops.
6317 The user should not rely on the ids of the output dimensions
6318 of the relations in the union relation returned by
6319 C<isl_ast_build_get_schedule> having any particular value.
6320
6321 =head1 Applications
6322
6323 Although C<isl> is mainly meant to be used as a library,
6324 it also contains some basic applications that use some
6325 of the functionality of C<isl>.
6326 The input may be specified in either the L<isl format>
6327 or the L<PolyLib format>.
6328
6329 =head2 C<isl_polyhedron_sample>
6330
6331 C<isl_polyhedron_sample> takes a polyhedron as input and prints
6332 an integer element of the polyhedron, if there is any.
6333 The first column in the output is the denominator and is always
6334 equal to 1.  If the polyhedron contains no integer points,
6335 then a vector of length zero is printed.
6336
6337 =head2 C<isl_pip>
6338
6339 C<isl_pip> takes the same input as the C<example> program
6340 from the C<piplib> distribution, i.e., a set of constraints
6341 on the parameters, a line containing only -1 and finally a set
6342 of constraints on a parametric polyhedron.
6343 The coefficients of the parameters appear in the last columns
6344 (but before the final constant column).
6345 The output is the lexicographic minimum of the parametric polyhedron.
6346 As C<isl> currently does not have its own output format, the output
6347 is just a dump of the internal state.
6348
6349 =head2 C<isl_polyhedron_minimize>
6350
6351 C<isl_polyhedron_minimize> computes the minimum of some linear
6352 or affine objective function over the integer points in a polyhedron.
6353 If an affine objective function
6354 is given, then the constant should appear in the last column.
6355
6356 =head2 C<isl_polytope_scan>
6357
6358 Given a polytope, C<isl_polytope_scan> prints
6359 all integer points in the polytope.
6360
6361 =head2 C<isl_codegen>
6362
6363 Given a schedule, a context set and an options relation,
6364 C<isl_codegen> prints out an AST that scans the domain elements
6365 of the schedule in the order of their image(s) taking into account
6366 the constraints in the context set.