xref: /llvm-project/polly/lib/External/isl/doc/user.pod (revision a749e09e184b2b0b6dde71af01c82dd427b3e3e2)
1=head1 Introduction
2
3C<isl> is a thread-safe C library for manipulating
4sets and relations of integer points bounded by affine constraints.
5The descriptions of the sets and relations may involve
6both parameters and existentially quantified variables.
7All computations are performed in exact integer arithmetic
8using C<GMP> or C<imath>.
9The C<isl> library offers functionality that is similar
10to that offered by the C<Omega> and C<Omega+> libraries,
11but the underlying algorithms are in most cases completely different.
12
13The library is by no means complete and some fairly basic
14functionality is still missing.
15Still, even in its current form, the library has been successfully
16used as a backend polyhedral library for the polyhedral
17scanner C<CLooG> and as part of an equivalence checker of
18static affine programs.
19For bug reports, feature requests and questions,
20visit the discussion group at
21L<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
30and replaced by C<isl_printer> functions, see L<Input and Output>.
31
32=item * Most functions related to dependence analysis have acquired
33an extra C<must> argument.  To obtain the old behavior, this argument
34should 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
43renamed to C<isl_pw_qpolynomial_fold_fold>.
44Similarly, C<isl_union_pw_qpolynomial_fold_add> has been
45renamed 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>
54to 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
63C<isl_printer_print_basic_map> no longer print a newline.
64
65=item * The functions C<isl_flow_get_no_source>
66and C<isl_union_map_compute_flow> now return
67the accesses for which no source could be found instead of
68the iterations where those accesses occur.
69
70=item * The functions C<isl_basic_map_identity> and
71C<isl_map_identity> now take a B<map> space as input.  An old call
72C<isl_map_identity(space)> can be rewritten to
73C<isl_map_identity(isl_space_map_from_set(space))>.
74
75=item * The function C<isl_map_power> no longer takes
76a parameter position as input.  Instead, the exponent
77is 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
86C<ISL_FORMAT_ISL> output has changed.
87Use C<ISL_FORMAT_C> to obtain the old output.
88
89=item * The C<*_fast_*> functions have been renamed to C<*_plain_*>.
90Some of the old names have been kept for backward compatibility,
91but 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
100C<isl_pw_aff_union_max>.
101Similarly, the function C<isl_pw_aff_add> has been renamed to
102C<isl_pw_aff_union_add>.
103
104=item * The C<isl_dim> type has been renamed to C<isl_space>
105along with the associated functions.
106Some of the old names have been kept for backward compatibility,
107but they will be removed in the future.
108
109=item * Spaces of maps, sets and parameter domains are now
110treated differently.  The distinction between map spaces and set spaces
111has always been made on a conceptual level, but proper use of such spaces
112was never checked.  Furthermore, up until isl-0.07 there was no way
113of explicitly creating a parameter space.  These can now be created
114directly using C<isl_space_params_alloc> or from other spaces using
115C<isl_space_params>.
116
117=item * The space in which C<isl_aff>, C<isl_pw_aff>, C<isl_qpolynomial>,
118C<isl_pw_qpolynomial>, C<isl_qpolynomial_fold> and C<isl_pw_qpolynomial_fold>
119objects live is now a map space
120instead of a set space.  This means, for example, that the dimensions
121of the domain of an C<isl_aff> are now considered to be of type
122C<isl_dim_in> instead of C<isl_dim_set>.  Extra functions have been
123added to obtain the domain space.  Some of the constructors still
124take a domain space and have therefore been renamed.
125
126=item * The functions C<isl_equality_alloc> and C<isl_inequality_alloc>
127now take an C<isl_local_space> instead of an C<isl_space>.
128An C<isl_local_space> can be created from an C<isl_space>
129using C<isl_local_space_from_space>.
130
131=item * The C<isl_div> type has been removed.  Functions that used
132to return an C<isl_div> now return an C<isl_aff>.
133Note that the space of an C<isl_aff> is that of relation.
134When replacing a call to C<isl_div_get_coefficient> by a call to
135C<isl_aff_get_coefficient> any C<isl_dim_set> argument needs
136to be replaced by C<isl_dim_in>.
137A call to C<isl_aff_from_div> can be replaced by a call
138to C<isl_aff_floor>.
139A call to C<isl_qpolynomial_div(div)> call be replaced by
140the nested call
141
142	isl_qpolynomial_from_aff(isl_aff_floor(div))
143
144The function C<isl_constraint_div> has also been renamed
145to C<isl_constraint_get_div>.
146
147=item * The C<nparam> argument has been removed from
148C<isl_map_read_from_str> and similar functions.
149When reading input in the original PolyLib format,
150the result will have no parameters.
151If parameters are expected, the caller may want to perform
152dimension 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
161by the C<schedule_split_scaled> option.
162
163=item * The first argument of C<isl_pw_aff_cond> is now
164an C<isl_pw_aff> instead of an C<isl_set>.
165A 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
176C<isl_set_dim_has_upper_bound> have been renamed to
177C<isl_set_dim_has_any_lower_bound> and
178C<isl_set_dim_has_any_upper_bound>.
179The new C<isl_set_dim_has_lower_bound> and
180C<isl_set_dim_has_upper_bound> have slightly different meanings.
181
182=back
183
184=head3 Changes since isl-0.12
185
186=over
187
188=item * C<isl_int> has been replaced by C<isl_val>.
189Some of the old functions are still available in C<isl/deprecated/*.h>
190but they will be removed in the future.
191
192=item * The functions C<isl_pw_qpolynomial_eval>,
193C<isl_union_pw_qpolynomial_eval>, C<isl_pw_qpolynomial_fold_eval>
194and C<isl_union_pw_qpolynomial_fold_eval> have been changed to return
195an C<isl_val> instead of an C<isl_qpolynomial>.
196
197=item * The function C<isl_band_member_is_zero_distance>
198has been removed.  Essentially the same functionality is available
199through C<isl_band_member_is_coincident>, except that it requires
200setting up coincidence constraints.
201The option C<schedule_outer_zero_distance> has accordingly been
202replaced by the option C<schedule_outer_coincidence>.
203
204=item * The function C<isl_vertex_get_expr> has been changed
205to return an C<isl_multi_aff> instead of a rational C<isl_basic_set>.
206The function C<isl_vertex_get_domain> has been changed to return
207a regular basic set, rather than a rational basic set.
208
209=back
210
211=head3 Changes since isl-0.14
212
213=over
214
215=item * The function C<isl_union_pw_multi_aff_add> now consistently
216computes the sum on the shared definition domain.
217The function C<isl_union_pw_multi_aff_union_add> has been added
218to compute the sum on the union of definition domains.
219The original behavior of C<isl_union_pw_multi_aff_add> was
220confused and is no longer available.
221
222=item * Band forests have been replaced by schedule trees.
223
224=item * The function C<isl_union_map_compute_flow> has been
225replaced by the function C<isl_union_access_info_compute_flow>.
226Note that the may dependence relation returned by
227C<isl_union_flow_get_may_dependence> is the union of
228the two dependence relations returned by
229C<isl_union_map_compute_flow>.  Similarly for the no source relations.
230The function C<isl_union_map_compute_flow> is still available
231for backward compatibility, but it will be removed in the future.
232
233=item * The function C<isl_basic_set_drop_constraint> has been
234deprecated.
235
236=item * The function C<isl_ast_build_ast_from_schedule> has been
237renamed to C<isl_ast_build_node_from_schedule_map>.
238The original name is still available
239for backward compatibility, but it will be removed in the future.
240
241=item * The C<separation_class> AST generation option has been
242deprecated.
243
244=item * The functions C<isl_equality_alloc> and C<isl_inequality_alloc>
245have been renamed to C<isl_constraint_alloc_equality> and
246C<isl_constraint_alloc_inequality>.  The original names have been
247kept for backward compatibility, but they will be removed in the future.
248
249=item * The C<schedule_fuse> option has been replaced
250by the C<schedule_serialize_sccs> option.  The effect
251of setting the C<schedule_fuse> option to C<ISL_SCHEDULE_FUSE_MIN>
252is now obtained by turning on the C<schedule_serialize_sccs> option.
253
254=back
255
256=head3 Changes since isl-0.17
257
258=over
259
260=item * The function C<isl_printer_print_ast_expr> no longer prints
261in C format by default.  To print in C format, the output format
262of the printer needs to have been explicitly set to C<ISL_FORMAT_C>.
263As a result, the function C<isl_ast_expr_to_str> no longer prints
264the expression in C format.  Use C<isl_ast_expr_to_C_str> instead.
265
266=item * The functions C<isl_set_align_divs> and C<isl_map_align_divs>
267have been deprecated.  The function C<isl_set_lift> has an effect
268that is similar to C<isl_set_align_divs> and could in some cases
269be used as an alternative.
270
271=back
272
273=head3 Changes since isl-0.19
274
275=over
276
277=item * Zero-dimensional objects of type C<isl_multi_pw_aff> or
278C<isl_multi_union_pw_aff> can now keep track of an explicit domain.
279This explicit domain, if present, is taken into account
280by various operations that take such objects as input.
281
282=back
283
284=head3 Changes since isl-0.20
285
286=over
287
288=item * Several functions that used to return C<unsigned>
289now return C<isl_size>.  This means that these functions may
290now return a negative value in case an error occurred.
291The same holds for functions that used to return C<int>,
292although some of those were already returning
293a negative value in case of error.
294
295=item * The C<isl_ast_op_type> enumeration type has been
296renamed to C<isl_ast_expr_op_type>.  The corresponding
297enumeration constants have been similarly renamed.
298The old names are defined to the new names for backward
299compatibility.
300
301=item * Several functions returning an extra boolean value
302through an C<int *> argument now do so through an C<isl_bool *>
303argument.  The returned values are the same, only the type
304of the pointer has been changed.
305
306=back
307
308=head1 License
309
310C<isl> is released under the MIT license.
311
312=over
313
314Permission is hereby granted, free of charge, to any person obtaining a copy of
315this software and associated documentation files (the "Software"), to deal in
316the Software without restriction, including without limitation the rights to
317use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
318of the Software, and to permit persons to whom the Software is furnished to do
319so, subject to the following conditions:
320
321The above copyright notice and this permission notice shall be included in all
322copies or substantial portions of the Software.
323
324THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
325IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
326FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
327AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
328LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
329OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
330SOFTWARE.
331
332=back
333
334Note that by default C<isl> requires C<GMP>, which is released
335under the GNU Lesser General Public License (LGPL).  This means
336that code linked against C<isl> is also linked against LGPL code.
337
338When configuring with C<--with-int=imath> or C<--with-int=imath-32>, C<isl>
339will link against C<imath>, a library for exact integer arithmetic released
340under the MIT license.
341
342=head1 Installation
343
344The source of C<isl> can be obtained either as a tarball
345or from the git repository.  Both are available from
346L<https://libisl.sourceforge.io/>.
347The installation process depends on how you obtained
348the source.
349
350=head2 Installation from the git repository
351
352=over
353
354=item 1 Clone or update the repository
355
356The first time the source is obtained, you need to clone
357the repository.
358
359	git clone git://repo.or.cz/isl.git
360
361To obtain updates, you need to pull in the latest changes
362
363	git pull
364
365=item 2 Optionally get C<imath> submodule
366
367To build C<isl> with C<imath>, you need to obtain the C<imath>
368submodule by running in the git source tree of C<isl>
369
370       git submodule init
371       git submodule update
372
373This will fetch the required version of C<imath> in a subdirectory of C<isl>.
374
375=item 2 Generate C<configure>
376
377	./autogen.sh
378
379=back
380
381After performing the above steps, continue
382with the L<Common installation instructions>.
383
384=head2 Common installation instructions
385
386=over
387
388=item 1 Obtain C<GMP>
389
390By default, building C<isl> requires C<GMP>, including its headers files.
391Your distribution may not provide these header files by default
392and you may need to install a package called C<gmp-devel> or something
393similar.  Alternatively, C<GMP> can be built from
394source, available from L<http://gmplib.org/>.
395C<GMP> is not needed if you build C<isl> with C<imath>.
396
397=item 2 Configure
398
399C<isl> uses the standard C<autoconf> C<configure> script.
400To run it, just type
401
402	./configure
403
404optionally followed by some configure options.
405A complete list of options can be obtained by running
406
407	./configure --help
408
409Below we discuss some of the more common options.
410
411=over
412
413=item C<--prefix>
414
415Installation prefix for C<isl>
416
417=item C<--with-int=[gmp|imath|imath-32]>
418
419Select the integer library to be used by C<isl>, the default is C<gmp>.
420With C<imath-32>, C<isl> will use 32 bit integers, but fall back to C<imath>
421for values out of the 32 bit range. In most applications, C<isl> will run
422fastest with the C<imath-32> option, followed by C<gmp> and C<imath>, the
423slowest.
424
425=item C<--with-gmp-prefix=>I<path>
426
427Installation prefix for C<GMP> (architecture-independent files).
428
429=item C<--with-gmp-exec-prefix=>I<path>
430
431Installation prefix for C<GMP> (architecture-dependent files).
432
433=back
434
435=item 3 Compile
436
437	make
438
439=item 4 Test (optional)
440
441	make check
442
443=item 5 Install (optional)
444
445	make install
446
447=back
448
449=head2 Building the foreign language bindings
450
451The tarball already contains the generated foreign language bindings,
452but they are not included in the git repository.
453Building the C++ and Python bindings relies on the LLVM/clang libraries,
454see C<http://clang.llvm.org/get_started.html>.
455The C<configure> script will not assume that these are available
456on the system.
457To enable building the foreign language bindings,
458one of the following options needs to be specified.
459
460=over
461
462=item C<--with-clang=system>
463
464Use the system clang libraries (installed in a default location).
465
466=item C<--with-clang-prefix=>I<path>
467
468Use the system clang libraries installed in I<path>.
469
470=back
471
472It is best to use the latest release of the clang libraries (14.0),
473although any release since 2.9 should work as well.
474Note that if you build the clang libraries from source,
475then you need to make sure they are also installed (using C<make install>).
476If the compiler that was used to compile the clang libraries
477is different from the default C++ compiler, then use C<CXX_FOR_BUILD>
478to specify this non-default C++ compiler when running C<isl>'s C<./configure>.
479
480=head1 Integer Set Library
481
482=head2 Memory Management
483
484Since a high-level operation on isl objects usually involves
485several substeps and since the user is usually not interested in
486the intermediate results, most functions that return a new object
487will also release all the objects passed as arguments.
488If the user still wants to use one or more of these arguments
489after the function call, she should pass along a copy of the
490object rather than the object itself.
491The user is then responsible for making sure that the original
492object gets used somewhere else or is explicitly freed.
493
494The arguments and return values of all documented functions are
495annotated to make clear which arguments are released and which
496arguments are preserved.  In particular, the following annotations
497are used
498
499=over
500
501=item C<__isl_give>
502
503C<__isl_give> means that a new object is returned.
504The user should make sure that the returned pointer is
505used exactly once as a value for an C<__isl_take> argument.
506In between, it can be used as a value for as many
507C<__isl_keep> arguments as the user likes.
508There is one exception, and that is the case where the
509pointer returned is C<NULL>.  In this case, the user
510is free to use it as an C<__isl_take> argument or not.
511When applied to a C<char *>, the returned pointer needs to be
512freed using C<free>.
513
514=item C<__isl_null>
515
516C<__isl_null> means that a C<NULL> value is returned.
517
518=item C<__isl_take>
519
520C<__isl_take> means that the object the argument points to
521is taken over by the function and may no longer be used
522by the user as an argument to any other function.
523The pointer value must be one returned by a function
524returning an C<__isl_give> pointer.
525If the user passes in a C<NULL> value, then this will
526be treated as an error in the sense that the function will
527not perform its usual operation.  However, it will still
528make sure that all the other C<__isl_take> arguments
529are released.
530
531=item C<__isl_keep>
532
533C<__isl_keep> means that the function will only use the object
534temporarily.  After the function has finished, the user
535can still use it as an argument to other functions.
536A C<NULL> value will be treated in the same way as
537a C<NULL> value for an C<__isl_take> argument.
538This annotation may also be used on return values of
539type C<const char *>, in which case the returned pointer should
540not be freed by the user and is only valid until the object
541from which it was derived is updated or freed.
542
543=back
544
545=head2 Initialization
546
547All manipulations of integer sets and relations occur within
548the context of an C<isl_ctx>.
549A given C<isl_ctx> can only be used within a single thread.
550All arguments of a function are required to have been allocated
551within the same context.
552There are currently no functions available for moving an object
553from one C<isl_ctx> to another C<isl_ctx>.  This means that
554there is currently no way of safely moving an object from one
555thread to another, unless the whole C<isl_ctx> is moved.
556
557An C<isl_ctx> can be allocated using C<isl_ctx_alloc> and
558freed using C<isl_ctx_free>.
559All objects allocated within an C<isl_ctx> should be freed
560before the C<isl_ctx> itself is freed.
561
562	isl_ctx *isl_ctx_alloc();
563	void isl_ctx_free(isl_ctx *ctx);
564
565The user can impose a bound on the number of low-level I<operations>
566that can be performed by an C<isl_ctx>.  This bound can be set and
567retrieved using the following functions.  A bound of zero means that
568no bound is imposed.  The number of operations performed can be
569reset using C<isl_ctx_reset_operations>.  Note that the number
570of low-level operations needed to perform a high-level computation
571may differ significantly across different versions
572of C<isl>, but it should be the same across different platforms
573for the same version of C<isl>.
574
575Warning: This feature is experimental.  C<isl> has good support to abort and
576bail out during the computation, but this feature may exercise error code paths
577that are normally not used that much. Consequently, it is not unlikely that
578hidden bugs will be exposed.
579
580	void isl_ctx_set_max_operations(isl_ctx *ctx,
581		unsigned long max_operations);
582	unsigned long isl_ctx_get_max_operations(isl_ctx *ctx);
583	void isl_ctx_reset_operations(isl_ctx *ctx);
584
585In order to be able to create an object in the same context
586as another object, most object types (described later in
587this document) provide a function to obtain the context
588in which the object was created.
589
590	#include <isl/val.h>
591	isl_ctx *isl_val_get_ctx(__isl_keep isl_val *val);
592	isl_ctx *isl_multi_val_get_ctx(
593		__isl_keep isl_multi_val *mv);
594
595	#include <isl/id.h>
596	isl_ctx *isl_id_get_ctx(__isl_keep isl_id *id);
597	isl_ctx *isl_multi_id_get_ctx(
598		__isl_keep isl_multi_id *mi);
599
600	#include <isl/local_space.h>
601	isl_ctx *isl_local_space_get_ctx(
602		__isl_keep isl_local_space *ls);
603
604	#include <isl/set.h>
605	isl_ctx *isl_set_list_get_ctx(
606		__isl_keep isl_set_list *list);
607
608	#include <isl/aff.h>
609	isl_ctx *isl_aff_get_ctx(__isl_keep isl_aff *aff);
610	isl_ctx *isl_multi_aff_get_ctx(
611		__isl_keep isl_multi_aff *maff);
612	isl_ctx *isl_pw_aff_get_ctx(__isl_keep isl_pw_aff *pa);
613	isl_ctx *isl_pw_multi_aff_get_ctx(
614		__isl_keep isl_pw_multi_aff *pma);
615	isl_ctx *isl_multi_pw_aff_get_ctx(
616		__isl_keep isl_multi_pw_aff *mpa);
617	isl_ctx *isl_union_pw_aff_get_ctx(
618		__isl_keep isl_union_pw_aff *upa);
619	isl_ctx *isl_union_pw_multi_aff_get_ctx(
620		__isl_keep isl_union_pw_multi_aff *upma);
621	isl_ctx *isl_multi_union_pw_aff_get_ctx(
622		__isl_keep isl_multi_union_pw_aff *mupa);
623
624	#include <isl/id_to_ast_expr.h>
625	isl_ctx *isl_id_to_ast_expr_get_ctx(
626		__isl_keep isl_id_to_ast_expr *id2expr);
627
628	#include <isl/point.h>
629	isl_ctx *isl_point_get_ctx(__isl_keep isl_point *pnt);
630
631	#include <isl/vec.h>
632	isl_ctx *isl_vec_get_ctx(__isl_keep isl_vec *vec);
633
634	#include <isl/mat.h>
635	isl_ctx *isl_mat_get_ctx(__isl_keep isl_mat *mat);
636
637	#include <isl/vertices.h>
638	isl_ctx *isl_vertices_get_ctx(
639		__isl_keep isl_vertices *vertices);
640	isl_ctx *isl_vertex_get_ctx(__isl_keep isl_vertex *vertex);
641	isl_ctx *isl_cell_get_ctx(__isl_keep isl_cell *cell);
642
643	#include <isl/flow.h>
644	isl_ctx *isl_restriction_get_ctx(
645		__isl_keep isl_restriction *restr);
646	isl_ctx *isl_union_access_info_get_ctx(
647		__isl_keep isl_union_access_info *access);
648	isl_ctx *isl_union_flow_get_ctx(
649		__isl_keep isl_union_flow *flow);
650
651	#include <isl/schedule.h>
652	isl_ctx *isl_schedule_get_ctx(
653		__isl_keep isl_schedule *sched);
654	isl_ctx *isl_schedule_constraints_get_ctx(
655		__isl_keep isl_schedule_constraints *sc);
656
657	#include <isl/schedule_node.h>
658	isl_ctx *isl_schedule_node_get_ctx(
659		__isl_keep isl_schedule_node *node);
660
661	#include <isl/ast_build.h>
662	isl_ctx *isl_ast_build_get_ctx(
663		__isl_keep isl_ast_build *build);
664
665	#include <isl/ast.h>
666	isl_ctx *isl_ast_expr_get_ctx(
667		__isl_keep isl_ast_expr *expr);
668	isl_ctx *isl_ast_node_get_ctx(
669		__isl_keep isl_ast_node *node);
670
671	#include <isl/stride_info.h>
672	isl_ctx *isl_stride_info_get_ctx(
673		__isl_keep isl_stride_info *si);
674
675	#include <isl/fixed_box.h>
676	isl_ctx *isl_fixed_box_get_ctx(
677		__isl_keep isl_fixed_box *box);
678
679=head2 Return Types
680
681C<isl> uses the special return type C<isl_size> for functions
682that return a non-negative value, typically a number or a position.
683Besides the regular non-negative return values, a special (negative)
684value C<isl_size_error> may be returned, indicating that something
685went wrong.
686
687C<isl> also uses two special return types for functions that either return
688a boolean or that in principle do not return anything.
689In particular, the C<isl_bool> type has three possible values:
690C<isl_bool_true> (a positive integer value), indicating I<true> or I<yes>;
691C<isl_bool_false> (the integer value zero), indicating I<false> or I<no>; and
692C<isl_bool_error> (a negative integer value), indicating that something
693went wrong.  The following operations are defined on C<isl_bool>. The function
694C<isl_bool_not> can be used to negate an C<isl_bool>, where the negation of
695C<isl_bool_error> is C<isl_bool_error> again. The function C<isl_bool_ok>
696converts an integer to an C<isl_bool>. Any non-zero values yields
697C<isl_bool_true> and zero yields C<isl_bool_false>.
698
699	#include <isl/ctx.h>
700	isl_bool isl_bool_not(isl_bool b);
701	isl_bool isl_bool_ok(int b);
702
703The C<isl_stat> type has two possible values:
704C<isl_stat_ok> (the integer value zero), indicating a successful
705operation; and
706C<isl_stat_error> (a negative integer value), indicating that something
707went wrong.
708The function C<isl_stat_non_null> converts an isl object pointer
709to an C<isl_stat>, returning C<isl_stat_ok> if the object pointer is valid and
710C<isl_stat_error> if it is C<NULL>.
711
712	#include <isl/ctx.h>
713	isl_stat isl_stat_non_null(void *obj);
714
715See L</"Error Handling"> for more information on
716C<isl_size_error>, C<isl_bool_error> and C<isl_stat_error>.
717
718=head2 Values
719
720An C<isl_val> represents an integer value, a rational value
721or one of three special values, infinity, negative infinity and NaN.
722Some predefined values can be created using the following functions.
723
724	#include <isl/val.h>
725	__isl_give isl_val *isl_val_zero(isl_ctx *ctx);
726	__isl_give isl_val *isl_val_one(isl_ctx *ctx);
727	__isl_give isl_val *isl_val_negone(isl_ctx *ctx);
728	__isl_give isl_val *isl_val_nan(isl_ctx *ctx);
729	__isl_give isl_val *isl_val_infty(isl_ctx *ctx);
730	__isl_give isl_val *isl_val_neginfty(isl_ctx *ctx);
731
732Specific integer values can be created using the following functions.
733
734	#include <isl/val.h>
735	__isl_give isl_val *isl_val_int_from_si(isl_ctx *ctx,
736		long i);
737	__isl_give isl_val *isl_val_int_from_ui(isl_ctx *ctx,
738		unsigned long u);
739	__isl_give isl_val *isl_val_int_from_chunks(isl_ctx *ctx,
740		size_t n, size_t size, const void *chunks);
741
742The function C<isl_val_int_from_chunks> constructs an C<isl_val>
743from the C<n> I<digits>, each consisting of C<size> bytes, stored at C<chunks>.
744The least significant digit is assumed to be stored first.
745
746Value objects can be copied and freed using the following functions.
747
748	#include <isl/val.h>
749	__isl_give isl_val *isl_val_copy(__isl_keep isl_val *v);
750	__isl_null isl_val *isl_val_free(__isl_take isl_val *v);
751
752They can be inspected using the following functions.
753
754	#include <isl/val.h>
755	long isl_val_get_num_si(__isl_keep isl_val *v);
756	long isl_val_get_den_si(__isl_keep isl_val *v);
757	__isl_give isl_val *isl_val_get_den_val(
758		__isl_keep isl_val *v);
759	double isl_val_get_d(__isl_keep isl_val *v);
760	isl_size isl_val_n_abs_num_chunks(__isl_keep isl_val *v,
761		size_t size);
762	isl_stat isl_val_get_abs_num_chunks(__isl_keep isl_val *v,
763		size_t size, void *chunks);
764
765C<isl_val_n_abs_num_chunks> returns the number of I<digits>
766of C<size> bytes needed to store the absolute value of the
767numerator of C<v>.
768C<isl_val_get_abs_num_chunks> stores these digits at C<chunks>,
769which is assumed to have been preallocated by the caller.
770The least significant digit is stored first.
771Note that C<isl_val_get_num_si>, C<isl_val_get_den_si>,
772C<isl_val_get_d>, C<isl_val_n_abs_num_chunks>
773and C<isl_val_get_abs_num_chunks> can only be applied to rational values.
774
775An C<isl_val> can be modified using the following function.
776
777	#include <isl/val.h>
778	__isl_give isl_val *isl_val_set_si(__isl_take isl_val *v,
779		long i);
780
781The following unary properties are defined on C<isl_val>s.
782
783	#include <isl/val.h>
784	int isl_val_sgn(__isl_keep isl_val *v);
785	isl_bool isl_val_is_zero(__isl_keep isl_val *v);
786	isl_bool isl_val_is_one(__isl_keep isl_val *v);
787	isl_bool isl_val_is_negone(__isl_keep isl_val *v);
788	isl_bool isl_val_is_nonneg(__isl_keep isl_val *v);
789	isl_bool isl_val_is_nonpos(__isl_keep isl_val *v);
790	isl_bool isl_val_is_pos(__isl_keep isl_val *v);
791	isl_bool isl_val_is_neg(__isl_keep isl_val *v);
792	isl_bool isl_val_is_int(__isl_keep isl_val *v);
793	isl_bool isl_val_is_rat(__isl_keep isl_val *v);
794	isl_bool isl_val_is_nan(__isl_keep isl_val *v);
795	isl_bool isl_val_is_infty(__isl_keep isl_val *v);
796	isl_bool isl_val_is_neginfty(__isl_keep isl_val *v);
797
798Note that the sign of NaN is undefined.
799
800The following binary properties are defined on pairs of C<isl_val>s.
801
802	#include <isl/val.h>
803	isl_bool isl_val_lt(__isl_keep isl_val *v1,
804		__isl_keep isl_val *v2);
805	isl_bool isl_val_le(__isl_keep isl_val *v1,
806		__isl_keep isl_val *v2);
807	isl_bool isl_val_gt(__isl_keep isl_val *v1,
808		__isl_keep isl_val *v2);
809	isl_bool isl_val_ge(__isl_keep isl_val *v1,
810		__isl_keep isl_val *v2);
811	isl_bool isl_val_eq(__isl_keep isl_val *v1,
812		__isl_keep isl_val *v2);
813	isl_bool isl_val_ne(__isl_keep isl_val *v1,
814		__isl_keep isl_val *v2);
815	isl_bool isl_val_abs_eq(__isl_keep isl_val *v1,
816		__isl_keep isl_val *v2);
817
818Comparisons to NaN always return false.
819That is, a NaN is not considered to hold any relative position
820with respect to any value.  In particular, a NaN
821is neither considered to be equal to nor to be different from
822any value (including another NaN).
823The function C<isl_val_abs_eq> checks whether its two arguments
824are equal in absolute value.
825
826For integer C<isl_val>s we additionally have the following binary property.
827
828	#include <isl/val.h>
829	isl_bool isl_val_is_divisible_by(__isl_keep isl_val *v1,
830		__isl_keep isl_val *v2);
831
832An C<isl_val> can also be compared to an integer using the following
833functions.  The result of C<isl_val_cmp_si> is undefined for NaN.
834
835	#include <isl/val.h>
836	isl_bool isl_val_gt_si(__isl_keep isl_val *v, long i);
837	isl_bool isl_val_eq_si(__isl_keep isl_val *v, long i);
838	int isl_val_cmp_si(__isl_keep isl_val *v, long i);
839
840The following unary operations are available on C<isl_val>s.
841
842	#include <isl/val.h>
843	__isl_give isl_val *isl_val_abs(__isl_take isl_val *v);
844	__isl_give isl_val *isl_val_neg(__isl_take isl_val *v);
845	__isl_give isl_val *isl_val_floor(__isl_take isl_val *v);
846	__isl_give isl_val *isl_val_ceil(__isl_take isl_val *v);
847	__isl_give isl_val *isl_val_trunc(__isl_take isl_val *v);
848	__isl_give isl_val *isl_val_inv(__isl_take isl_val *v);
849
850The following binary operations are available on C<isl_val>s.
851
852	#include <isl/val.h>
853	__isl_give isl_val *isl_val_min(__isl_take isl_val *v1,
854		__isl_take isl_val *v2);
855	__isl_give isl_val *isl_val_max(__isl_take isl_val *v1,
856		__isl_take isl_val *v2);
857	__isl_give isl_val *isl_val_add(__isl_take isl_val *v1,
858		__isl_take isl_val *v2);
859	__isl_give isl_val *isl_val_add_ui(__isl_take isl_val *v1,
860		unsigned long v2);
861	__isl_give isl_val *isl_val_sub(__isl_take isl_val *v1,
862		__isl_take isl_val *v2);
863	__isl_give isl_val *isl_val_sub_ui(__isl_take isl_val *v1,
864		unsigned long v2);
865	__isl_give isl_val *isl_val_mul(__isl_take isl_val *v1,
866		__isl_take isl_val *v2);
867	__isl_give isl_val *isl_val_mul_ui(__isl_take isl_val *v1,
868		unsigned long v2);
869	__isl_give isl_val *isl_val_div(__isl_take isl_val *v1,
870		__isl_take isl_val *v2);
871	__isl_give isl_val *isl_val_div_ui(__isl_take isl_val *v1,
872		unsigned long v2);
873
874On integer values, we additionally have the following operations.
875
876	#include <isl/val.h>
877	__isl_give isl_val *isl_val_pow2(__isl_take isl_val *v);
878	__isl_give isl_val *isl_val_2exp(__isl_take isl_val *v);
879	__isl_give isl_val *isl_val_mod(__isl_take isl_val *v1,
880		__isl_take isl_val *v2);
881	__isl_give isl_val *isl_val_gcd(__isl_take isl_val *v1,
882		__isl_take isl_val *v2);
883	__isl_give isl_val *isl_val_gcdext(__isl_take isl_val *v1,
884		__isl_take isl_val *v2, __isl_give isl_val **x,
885		__isl_give isl_val **y);
886
887C<isl_val_2exp> is an alternative name for C<isl_val_pow2>.
888The function C<isl_val_gcdext> returns the greatest common divisor g
889of C<v1> and C<v2> as well as two integers C<*x> and C<*y> such
890that C<*x> * C<v1> + C<*y> * C<v2> = g.
891
892=head3 GMP specific functions
893
894These functions are only available if C<isl> has been compiled with C<GMP>
895support.
896
897Specific integer and rational values can be created from C<GMP> values using
898the following functions.
899
900	#include <isl/val_gmp.h>
901	__isl_give isl_val *isl_val_int_from_gmp(isl_ctx *ctx,
902		mpz_t z);
903	__isl_give isl_val *isl_val_from_gmp(isl_ctx *ctx,
904		const mpz_t n, const mpz_t d);
905
906The numerator and denominator of a rational value can be extracted as
907C<GMP> values using the following functions.
908
909	#include <isl/val_gmp.h>
910	int isl_val_get_num_gmp(__isl_keep isl_val *v, mpz_t z);
911	int isl_val_get_den_gmp(__isl_keep isl_val *v, mpz_t z);
912
913=head2 Sets and Relations
914
915C<isl> uses six types of objects for representing sets and relations,
916C<isl_basic_set>, C<isl_basic_map>, C<isl_set>, C<isl_map>,
917C<isl_union_set> and C<isl_union_map>.
918C<isl_basic_set> and C<isl_basic_map> represent sets and relations that
919can be described as a conjunction of affine constraints, while
920C<isl_set> and C<isl_map> represent unions of
921C<isl_basic_set>s and C<isl_basic_map>s, respectively.
922However, all C<isl_basic_set>s or C<isl_basic_map>s in the union need
923to live in the same space.  C<isl_union_set>s and C<isl_union_map>s
924represent unions of C<isl_set>s or C<isl_map>s in I<different> spaces,
925where spaces are considered different if they have a different number
926of dimensions and/or different names (see L<"Spaces">).
927The difference between sets and relations (maps) is that sets have
928one set of variables, while relations have two sets of variables,
929input variables and output variables.
930
931=head2 Error Handling
932
933C<isl> supports different ways to react in case a runtime error is triggered.
934Runtime errors arise, e.g., if a function such as C<isl_map_intersect> is called
935with two maps that have incompatible spaces. There are three possible ways
936to react on error: to warn, to continue or to abort.
937
938The default behavior is to warn. In this mode, C<isl> prints a warning, stores
939the last error in the corresponding C<isl_ctx> and the function in which the
940error was triggered returns a value indicating that some error has
941occurred.  In case of functions returning a pointer, this value is
942C<NULL>.  In case of functions returning an C<isl_size>, C<isl_bool> or an
943C<isl_stat>, this value is C<isl_size_error>,
944C<isl_bool_error> or C<isl_stat_error>.
945An error does not corrupt internal state,
946such that isl can continue to be used. C<isl> also provides functions to
947read the last error, including the specific error message,
948the isl source file where the error occurred and the line number,
949and to reset all information about the last error. The
950last error is only stored for information purposes. Its presence does not
951change the behavior of C<isl>. Hence, resetting an error is not required to
952continue to use isl, but only to observe new errors.
953
954	#include <isl/ctx.h>
955	enum isl_error isl_ctx_last_error(isl_ctx *ctx);
956	const char *isl_ctx_last_error_msg(isl_ctx *ctx);
957	const char *isl_ctx_last_error_file(isl_ctx *ctx);
958	int isl_ctx_last_error_line(isl_ctx *ctx);
959	void isl_ctx_reset_error(isl_ctx *ctx);
960
961If no error has occurred since the last call to C<isl_ctx_reset_error>,
962then the functions C<isl_ctx_last_error_msg> and
963C<isl_ctx_last_error_file> return C<NULL>.
964
965Another option is to continue on error. This is similar to warn on error mode,
966except that C<isl> does not print any warning. This allows a program to
967implement its own error reporting.
968
969The last option is to directly abort the execution of the program from within
970the isl library. This makes it obviously impossible to recover from an error,
971but it allows to directly spot the error location. By aborting on error,
972debuggers break at the location the error occurred and can provide a stack
973trace. Other tools that automatically provide stack traces on abort or that do
974not want to continue execution after an error was triggered may also prefer to
975abort on error.
976
977The on error behavior of isl can be specified by calling
978C<isl_options_set_on_error> or by setting the command line option
979C<--isl-on-error>. Valid arguments for the function call are
980C<ISL_ON_ERROR_WARN>, C<ISL_ON_ERROR_CONTINUE> and C<ISL_ON_ERROR_ABORT>. The
981choices for the command line option are C<warn>, C<continue> and C<abort>.
982It is also possible to query the current error mode.
983
984	#include <isl/options.h>
985	isl_stat isl_options_set_on_error(isl_ctx *ctx, int val);
986	int isl_options_get_on_error(isl_ctx *ctx);
987
988=head2 Identifiers
989
990Identifiers are used to identify both individual dimensions
991and tuples of dimensions.  They consist of an optional name and an optional
992user pointer.  The name and the user pointer cannot both be C<NULL>, however.
993Identifiers with the same name but different pointer values
994are considered to be distinct.
995Similarly, identifiers with different names but the same pointer value
996are also considered to be distinct.
997Equal identifiers are represented using the same object.
998Pairs of identifiers can therefore be tested for equality using the
999C<==> operator.
1000Identifiers can be constructed, copied, freed, inspected and printed
1001using the following functions.
1002
1003	#include <isl/id.h>
1004	__isl_give isl_id *isl_id_alloc(isl_ctx *ctx,
1005		__isl_keep const char *name, void *user);
1006	__isl_give isl_id *isl_id_set_free_user(
1007		__isl_take isl_id *id,
1008		void (*free_user)(void *user));
1009	void (*isl_id_get_free_user(__isl_keep isl_id *id))
1010		(void *user);
1011	__isl_give isl_id *isl_id_copy(isl_id *id);
1012	__isl_null isl_id *isl_id_free(__isl_take isl_id *id);
1013
1014	void *isl_id_get_user(__isl_keep isl_id *id);
1015	__isl_keep const char *isl_id_get_name(__isl_keep isl_id *id);
1016
1017	__isl_give isl_printer *isl_printer_print_id(
1018		__isl_take isl_printer *p, __isl_keep isl_id *id);
1019
1020The callback set by C<isl_id_set_free_user> is called on the user
1021pointer when the last reference to the C<isl_id> is freed.
1022This callback can be retrieved using C<isl_id_get_free_user>.
1023Note that C<isl_id_get_name> returns a pointer to some internal
1024data structure, so the result can only be used while the
1025corresponding C<isl_id> is alive.
1026
1027=head2 Spaces
1028
1029Whenever a new set, relation or similar object is created from scratch,
1030the space in which it lives needs to be specified using an C<isl_space>.
1031Each space involves zero or more parameters and zero, one or two
1032tuples of set or input/output dimensions.  The parameters and dimensions
1033are identified by an C<isl_dim_type> and a position.
1034The type C<isl_dim_param> refers to parameters,
1035the type C<isl_dim_set> refers to set dimensions (for spaces
1036with a single tuple of dimensions) and the types C<isl_dim_in>
1037and C<isl_dim_out> refer to input and output dimensions
1038(for spaces with two tuples of dimensions).
1039Local spaces (see L</"Local Spaces">) also contain dimensions
1040of type C<isl_dim_div>.
1041Note that parameters are only identified by their position within
1042a given object.  Across different objects, parameters are (usually)
1043identified by their names or identifiers.  Only unnamed parameters
1044are identified by their positions across objects.  The use of unnamed
1045parameters is discouraged.
1046
1047	#include <isl/space.h>
1048	__isl_give isl_space *isl_space_unit(isl_ctx *ctx);
1049	__isl_give isl_space *isl_space_alloc(isl_ctx *ctx,
1050		unsigned nparam, unsigned n_in, unsigned n_out);
1051	__isl_give isl_space *isl_space_params_alloc(isl_ctx *ctx,
1052		unsigned nparam);
1053	__isl_give isl_space *isl_space_set_alloc(isl_ctx *ctx,
1054		unsigned nparam, unsigned dim);
1055	__isl_give isl_space *isl_space_copy(__isl_keep isl_space *space);
1056	__isl_null isl_space *isl_space_free(__isl_take isl_space *space);
1057
1058The space used for creating a parameter domain
1059needs to be created using C<isl_space_unit> or C<isl_space_params_alloc>.
1060For other sets, the space
1061needs to be created using C<isl_space_set_alloc>, while
1062for a relation, the space
1063needs to be created using C<isl_space_alloc>.
1064The use of C<isl_space_params_alloc>,
1065C<isl_space_set_alloc> and C<isl_space_alloc> is discouraged as they allow
1066for the introduction of unnamed parameters.
1067
1068To check whether a given space is that of a set or a map
1069or whether it is a parameter space, use these functions:
1070
1071	#include <isl/space.h>
1072	isl_bool isl_space_is_params(__isl_keep isl_space *space);
1073	isl_bool isl_space_is_set(__isl_keep isl_space *space);
1074	isl_bool isl_space_is_map(__isl_keep isl_space *space);
1075
1076Spaces can be compared using the following functions:
1077
1078	#include <isl/space.h>
1079	isl_bool isl_space_is_equal(__isl_keep isl_space *space1,
1080		__isl_keep isl_space *space2);
1081	isl_bool isl_space_has_equal_params(
1082		__isl_keep isl_space *space1,
1083		__isl_keep isl_space *space2);
1084	isl_bool isl_space_has_equal_tuples(
1085		__isl_keep isl_space *space1,
1086		__isl_keep isl_space *space2);
1087	isl_bool isl_space_is_domain(__isl_keep isl_space *space1,
1088		__isl_keep isl_space *space2);
1089	isl_bool isl_space_is_range(__isl_keep isl_space *space1,
1090		__isl_keep isl_space *space2);
1091	isl_bool isl_space_tuple_is_equal(
1092		__isl_keep isl_space *space1,
1093		enum isl_dim_type type1,
1094		__isl_keep isl_space *space2,
1095		enum isl_dim_type type2);
1096
1097C<isl_space_is_domain> checks whether the first argument is equal
1098to the domain of the second argument.  This requires in particular that
1099the first argument is a set space and that the second argument
1100is a map space.  C<isl_space_tuple_is_equal> checks whether the given
1101tuples (C<isl_dim_in>, C<isl_dim_out> or C<isl_dim_set>) of the given
1102spaces are the same.  That is, it checks if they have the same
1103identifier (if any), the same dimension and the same internal structure
1104(if any).
1105The function
1106C<isl_space_has_equal_params> checks whether two spaces
1107have the same parameters in the same order.
1108C<isl_space_has_equal_tuples> check whether two spaces have
1109the same tuples.  In contrast to C<isl_space_is_equal> below,
1110it does not check the
1111parameters.  This is useful because many C<isl> functions align the
1112parameters before they perform their operations, such that equivalence
1113is not necessary.
1114C<isl_space_is_equal> checks whether two spaces are identical,
1115meaning that they have the same parameters and the same tuples.
1116That is, it checks whether both C<isl_space_has_equal_params> and
1117C<isl_space_has_equal_tuples> hold.
1118
1119It is often useful to create objects that live in the
1120same space as some other object.  This can be accomplished
1121by creating the new objects
1122(see L</"Creating New Sets and Relations"> or
1123L</"Functions">) based on the space
1124of the original object.
1125
1126	#include <isl/set.h>
1127	__isl_give isl_space *isl_basic_set_get_space(
1128		__isl_keep isl_basic_set *bset);
1129	__isl_give isl_space *isl_set_get_space(__isl_keep isl_set *set);
1130
1131	#include <isl/union_set.h>
1132	__isl_give isl_space *isl_union_set_get_space(
1133		__isl_keep isl_union_set *uset);
1134
1135	#include <isl/map.h>
1136	__isl_give isl_space *isl_basic_map_get_space(
1137		__isl_keep isl_basic_map *bmap);
1138	__isl_give isl_space *isl_map_get_space(__isl_keep isl_map *map);
1139
1140	#include <isl/union_map.h>
1141	__isl_give isl_space *isl_union_map_get_space(
1142		__isl_keep isl_union_map *umap);
1143
1144	#include <isl/constraint.h>
1145	__isl_give isl_space *isl_constraint_get_space(
1146		__isl_keep isl_constraint *constraint);
1147
1148	#include <isl/polynomial.h>
1149	__isl_give isl_space *isl_qpolynomial_get_domain_space(
1150		__isl_keep isl_qpolynomial *qp);
1151	__isl_give isl_space *isl_qpolynomial_get_space(
1152		__isl_keep isl_qpolynomial *qp);
1153	__isl_give isl_space *
1154	isl_qpolynomial_fold_get_domain_space(
1155		__isl_keep isl_qpolynomial_fold *fold);
1156	__isl_give isl_space *isl_qpolynomial_fold_get_space(
1157		__isl_keep isl_qpolynomial_fold *fold);
1158	__isl_give isl_space *isl_pw_qpolynomial_get_domain_space(
1159		__isl_keep isl_pw_qpolynomial *pwqp);
1160	__isl_give isl_space *isl_pw_qpolynomial_get_space(
1161		__isl_keep isl_pw_qpolynomial *pwqp);
1162	__isl_give isl_space *isl_pw_qpolynomial_fold_get_domain_space(
1163		__isl_keep isl_pw_qpolynomial_fold *pwf);
1164	__isl_give isl_space *isl_pw_qpolynomial_fold_get_space(
1165		__isl_keep isl_pw_qpolynomial_fold *pwf);
1166	__isl_give isl_space *isl_union_pw_qpolynomial_get_space(
1167		__isl_keep isl_union_pw_qpolynomial *upwqp);
1168	__isl_give isl_space *isl_union_pw_qpolynomial_fold_get_space(
1169		__isl_keep isl_union_pw_qpolynomial_fold *upwf);
1170
1171	#include <isl/id.h>
1172	__isl_give isl_space *isl_multi_id_get_space(
1173		__isl_keep isl_multi_id *mi);
1174
1175	#include <isl/val.h>
1176	__isl_give isl_space *isl_multi_val_get_space(
1177		__isl_keep isl_multi_val *mv);
1178
1179	#include <isl/aff.h>
1180	__isl_give isl_space *isl_aff_get_domain_space(
1181		__isl_keep isl_aff *aff);
1182	__isl_give isl_space *isl_aff_get_space(
1183		__isl_keep isl_aff *aff);
1184	__isl_give isl_space *isl_pw_aff_get_domain_space(
1185		__isl_keep isl_pw_aff *pwaff);
1186	__isl_give isl_space *isl_pw_aff_get_space(
1187		__isl_keep isl_pw_aff *pwaff);
1188	__isl_give isl_space *isl_multi_aff_get_domain_space(
1189		__isl_keep isl_multi_aff *maff);
1190	__isl_give isl_space *isl_multi_aff_get_space(
1191		__isl_keep isl_multi_aff *maff);
1192	__isl_give isl_space *isl_pw_multi_aff_get_domain_space(
1193		__isl_keep isl_pw_multi_aff *pma);
1194	__isl_give isl_space *isl_pw_multi_aff_get_space(
1195		__isl_keep isl_pw_multi_aff *pma);
1196	__isl_give isl_space *isl_union_pw_aff_get_space(
1197		__isl_keep isl_union_pw_aff *upa);
1198	__isl_give isl_space *isl_union_pw_multi_aff_get_space(
1199		__isl_keep isl_union_pw_multi_aff *upma);
1200	__isl_give isl_space *isl_multi_pw_aff_get_domain_space(
1201		__isl_keep isl_multi_pw_aff *mpa);
1202	__isl_give isl_space *isl_multi_pw_aff_get_space(
1203		__isl_keep isl_multi_pw_aff *mpa);
1204	__isl_give isl_space *
1205	isl_multi_union_pw_aff_get_domain_space(
1206		__isl_keep isl_multi_union_pw_aff *mupa);
1207	__isl_give isl_space *
1208	isl_multi_union_pw_aff_get_space(
1209		__isl_keep isl_multi_union_pw_aff *mupa);
1210
1211	#include <isl/point.h>
1212	__isl_give isl_space *isl_point_get_space(
1213		__isl_keep isl_point *pnt);
1214
1215	#include <isl/fixed_box.h>
1216	__isl_give isl_space *isl_fixed_box_get_space(
1217		__isl_keep isl_fixed_box *box);
1218
1219The number of dimensions of a given type of space
1220may be read off from a space or an object that lives
1221in a space using the following functions.
1222In case of C<isl_space_dim>, type may be
1223C<isl_dim_param>, C<isl_dim_in> (only for relations),
1224C<isl_dim_out> (only for relations), C<isl_dim_set>
1225(only for sets) or C<isl_dim_all>.
1226
1227	#include <isl/space.h>
1228	isl_size isl_space_dim(__isl_keep isl_space *space,
1229		enum isl_dim_type type);
1230
1231	#include <isl/local_space.h>
1232	isl_size isl_local_space_dim(__isl_keep isl_local_space *ls,
1233		enum isl_dim_type type);
1234
1235	#include <isl/set.h>
1236	isl_size isl_basic_set_dim(__isl_keep isl_basic_set *bset,
1237		enum isl_dim_type type);
1238	isl_size isl_set_tuple_dim(__isl_keep isl_set *set);
1239	isl_size isl_set_dim(__isl_keep isl_set *set,
1240		enum isl_dim_type type);
1241
1242	#include <isl/union_set.h>
1243	isl_size isl_union_set_dim(__isl_keep isl_union_set *uset,
1244		enum isl_dim_type type);
1245
1246	#include <isl/map.h>
1247	isl_size isl_basic_map_dim(__isl_keep isl_basic_map *bmap,
1248		enum isl_dim_type type);
1249	isl_size isl_map_domain_tuple_dim(
1250		__isl_keep isl_map *map);
1251	isl_size isl_map_range_tuple_dim(
1252		__isl_keep isl_map *map);
1253	isl_size isl_map_dim(__isl_keep isl_map *map,
1254		enum isl_dim_type type);
1255
1256	#include <isl/union_map.h>
1257	isl_size isl_union_map_dim(__isl_keep isl_union_map *umap,
1258		enum isl_dim_type type);
1259
1260	#include <isl/val.h>
1261	isl_size isl_multi_val_dim(__isl_keep isl_multi_val *mv,
1262		enum isl_dim_type type);
1263
1264	#include <isl/aff.h>
1265	isl_size isl_aff_dim(__isl_keep isl_aff *aff,
1266		enum isl_dim_type type);
1267	isl_size isl_multi_aff_dim(__isl_keep isl_multi_aff *maff,
1268		enum isl_dim_type type);
1269	isl_size isl_pw_aff_dim(__isl_keep isl_pw_aff *pwaff,
1270		enum isl_dim_type type);
1271	isl_size isl_pw_multi_aff_dim(
1272		__isl_keep isl_pw_multi_aff *pma,
1273		enum isl_dim_type type);
1274	isl_size isl_multi_pw_aff_dim(
1275		__isl_keep isl_multi_pw_aff *mpa,
1276		enum isl_dim_type type);
1277	isl_size isl_union_pw_aff_dim(
1278		__isl_keep isl_union_pw_aff *upa,
1279		enum isl_dim_type type);
1280	isl_size isl_union_pw_multi_aff_dim(
1281		__isl_keep isl_union_pw_multi_aff *upma,
1282		enum isl_dim_type type);
1283	isl_size isl_multi_union_pw_aff_dim(
1284		__isl_keep isl_multi_union_pw_aff *mupa,
1285		enum isl_dim_type type);
1286
1287	#include <isl/polynomial.h>
1288	isl_size isl_union_pw_qpolynomial_dim(
1289		__isl_keep isl_union_pw_qpolynomial *upwqp,
1290		enum isl_dim_type type);
1291	isl_size isl_union_pw_qpolynomial_fold_dim(
1292		__isl_keep isl_union_pw_qpolynomial_fold *upwf,
1293		enum isl_dim_type type);
1294
1295Note that an C<isl_union_set>, an C<isl_union_map>,
1296an C<isl_union_pw_multi_aff>,
1297an C<isl_union_pw_qpolynomial> and
1298an C<isl_union_pw_qpolynomial_fold>
1299only have parameters.
1300
1301Additional parameters can be added to a space using the following function.
1302
1303	#include <isl/space.h>
1304	__isl_give isl_space *isl_space_add_param_id(
1305		__isl_take isl_space *space,
1306		__isl_take isl_id *id);
1307
1308If a parameter with the given identifier already appears in the space,
1309then it is not added again.
1310
1311Conversely, all parameters can be removed from a space
1312using the following function.
1313
1314	#include <isl/space.h>
1315	__isl_give isl_space *isl_space_drop_all_params(
1316		__isl_take isl_space *space);
1317
1318The identifiers or names of the individual dimensions of spaces
1319may be set or read off using the following functions on spaces
1320or objects that live in spaces.
1321These functions are mostly useful to obtain the identifiers, positions
1322or names of the parameters.  Identifiers of individual dimensions are
1323essentially only useful for printing.  They are ignored by all other
1324operations and may not be preserved across those operations.
1325To keep track of a space along with names/identifiers of
1326the set dimensions, use an C<isl_multi_id> as described in
1327L</"Functions">.
1328
1329	#include <isl/space.h>
1330	__isl_give isl_space *isl_space_set_dim_id(
1331		__isl_take isl_space *space,
1332		enum isl_dim_type type, unsigned pos,
1333		__isl_take isl_id *id);
1334	isl_bool isl_space_has_dim_id(__isl_keep isl_space *space,
1335		enum isl_dim_type type, unsigned pos);
1336	__isl_give isl_id *isl_space_get_dim_id(
1337		__isl_keep isl_space *space,
1338		enum isl_dim_type type, unsigned pos);
1339	__isl_give isl_space *isl_space_set_dim_name(
1340		__isl_take isl_space *space,
1341		 enum isl_dim_type type, unsigned pos,
1342		 __isl_keep const char *name);
1343	isl_bool isl_space_has_dim_name(__isl_keep isl_space *space,
1344		enum isl_dim_type type, unsigned pos);
1345	__isl_keep const char *isl_space_get_dim_name(
1346		__isl_keep isl_space *space,
1347		enum isl_dim_type type, unsigned pos);
1348
1349	#include <isl/local_space.h>
1350	__isl_give isl_local_space *isl_local_space_set_dim_id(
1351		__isl_take isl_local_space *ls,
1352		enum isl_dim_type type, unsigned pos,
1353		__isl_take isl_id *id);
1354	isl_bool isl_local_space_has_dim_id(
1355		__isl_keep isl_local_space *ls,
1356		enum isl_dim_type type, unsigned pos);
1357	__isl_give isl_id *isl_local_space_get_dim_id(
1358		__isl_keep isl_local_space *ls,
1359		enum isl_dim_type type, unsigned pos);
1360	__isl_give isl_local_space *isl_local_space_set_dim_name(
1361		__isl_take isl_local_space *ls,
1362		enum isl_dim_type type, unsigned pos, const char *s);
1363	isl_bool isl_local_space_has_dim_name(
1364		__isl_keep isl_local_space *ls,
1365		enum isl_dim_type type, unsigned pos)
1366	const char *isl_local_space_get_dim_name(
1367		__isl_keep isl_local_space *ls,
1368		enum isl_dim_type type, unsigned pos);
1369
1370	#include <isl/constraint.h>
1371	const char *isl_constraint_get_dim_name(
1372		__isl_keep isl_constraint *constraint,
1373		enum isl_dim_type type, unsigned pos);
1374
1375	#include <isl/set.h>
1376	__isl_give isl_id *isl_basic_set_get_dim_id(
1377		__isl_keep isl_basic_set *bset,
1378		enum isl_dim_type type, unsigned pos);
1379	__isl_give isl_set *isl_set_set_dim_id(
1380		__isl_take isl_set *set, enum isl_dim_type type,
1381		unsigned pos, __isl_take isl_id *id);
1382	isl_bool isl_set_has_dim_id(__isl_keep isl_set *set,
1383		enum isl_dim_type type, unsigned pos);
1384	__isl_give isl_id *isl_set_get_dim_id(
1385		__isl_keep isl_set *set, enum isl_dim_type type,
1386		unsigned pos);
1387	const char *isl_basic_set_get_dim_name(
1388		__isl_keep isl_basic_set *bset,
1389		enum isl_dim_type type, unsigned pos);
1390	isl_bool isl_set_has_dim_name(__isl_keep isl_set *set,
1391		enum isl_dim_type type, unsigned pos);
1392	const char *isl_set_get_dim_name(
1393		__isl_keep isl_set *set,
1394		enum isl_dim_type type, unsigned pos);
1395
1396	#include <isl/map.h>
1397	__isl_give isl_map *isl_map_set_dim_id(
1398		__isl_take isl_map *map, enum isl_dim_type type,
1399		unsigned pos, __isl_take isl_id *id);
1400	isl_bool isl_basic_map_has_dim_id(
1401		__isl_keep isl_basic_map *bmap,
1402		enum isl_dim_type type, unsigned pos);
1403	isl_bool isl_map_has_dim_id(__isl_keep isl_map *map,
1404		enum isl_dim_type type, unsigned pos);
1405	__isl_give isl_id *isl_map_get_dim_id(
1406		__isl_keep isl_map *map, enum isl_dim_type type,
1407		unsigned pos);
1408	__isl_give isl_id *isl_union_map_get_dim_id(
1409		__isl_keep isl_union_map *umap,
1410		enum isl_dim_type type, unsigned pos);
1411	const char *isl_basic_map_get_dim_name(
1412		__isl_keep isl_basic_map *bmap,
1413		enum isl_dim_type type, unsigned pos);
1414	isl_bool isl_map_has_dim_name(__isl_keep isl_map *map,
1415		enum isl_dim_type type, unsigned pos);
1416	const char *isl_map_get_dim_name(
1417		__isl_keep isl_map *map,
1418		enum isl_dim_type type, unsigned pos);
1419
1420	#include <isl/val.h>
1421	__isl_give isl_multi_val *isl_multi_val_set_dim_id(
1422		__isl_take isl_multi_val *mv,
1423		enum isl_dim_type type, unsigned pos,
1424		__isl_take isl_id *id);
1425	__isl_give isl_id *isl_multi_val_get_dim_id(
1426		__isl_keep isl_multi_val *mv,
1427		enum isl_dim_type type, unsigned pos);
1428	__isl_give isl_multi_val *isl_multi_val_set_dim_name(
1429		__isl_take isl_multi_val *mv,
1430		enum isl_dim_type type, unsigned pos, const char *s);
1431
1432	#include <isl/aff.h>
1433	__isl_give isl_aff *isl_aff_set_dim_id(
1434		__isl_take isl_aff *aff, enum isl_dim_type type,
1435		unsigned pos, __isl_take isl_id *id);
1436	__isl_give isl_multi_aff *isl_multi_aff_set_dim_id(
1437		__isl_take isl_multi_aff *maff,
1438		enum isl_dim_type type, unsigned pos,
1439		__isl_take isl_id *id);
1440	__isl_give isl_pw_aff *isl_pw_aff_set_dim_id(
1441		__isl_take isl_pw_aff *pma,
1442		enum isl_dim_type type, unsigned pos,
1443		__isl_take isl_id *id);
1444	__isl_give isl_multi_pw_aff *
1445	isl_multi_pw_aff_set_dim_id(
1446		__isl_take isl_multi_pw_aff *mpa,
1447		enum isl_dim_type type, unsigned pos,
1448		__isl_take isl_id *id);
1449	__isl_give isl_multi_union_pw_aff *
1450	isl_multi_union_pw_aff_set_dim_id(
1451		__isl_take isl_multi_union_pw_aff *mupa,
1452		enum isl_dim_type type, unsigned pos,
1453		__isl_take isl_id *id);
1454	__isl_give isl_id *isl_multi_aff_get_dim_id(
1455		__isl_keep isl_multi_aff *ma,
1456		enum isl_dim_type type, unsigned pos);
1457	isl_bool isl_pw_aff_has_dim_id(__isl_keep isl_pw_aff *pa,
1458		enum isl_dim_type type, unsigned pos);
1459	__isl_give isl_id *isl_pw_aff_get_dim_id(
1460		__isl_keep isl_pw_aff *pa,
1461		enum isl_dim_type type, unsigned pos);
1462	__isl_give isl_id *isl_pw_multi_aff_get_dim_id(
1463		__isl_keep isl_pw_multi_aff *pma,
1464		enum isl_dim_type type, unsigned pos);
1465	__isl_give isl_id *isl_multi_pw_aff_get_dim_id(
1466		__isl_keep isl_multi_pw_aff *mpa,
1467		enum isl_dim_type type, unsigned pos);
1468	__isl_give isl_id *isl_multi_union_pw_aff_get_dim_id(
1469		__isl_keep isl_multi_union_pw_aff *mupa,
1470		enum isl_dim_type type, unsigned pos);
1471	__isl_give isl_aff *isl_aff_set_dim_name(
1472		__isl_take isl_aff *aff, enum isl_dim_type type,
1473		unsigned pos, const char *s);
1474	__isl_give isl_multi_aff *isl_multi_aff_set_dim_name(
1475		__isl_take isl_multi_aff *maff,
1476		enum isl_dim_type type, unsigned pos, const char *s);
1477	__isl_give isl_multi_pw_aff *
1478	isl_multi_pw_aff_set_dim_name(
1479		__isl_take isl_multi_pw_aff *mpa,
1480		enum isl_dim_type type, unsigned pos, const char *s);
1481	__isl_give isl_union_pw_aff *
1482	isl_union_pw_aff_set_dim_name(
1483		__isl_take isl_union_pw_aff *upa,
1484		enum isl_dim_type type, unsigned pos,
1485		const char *s);
1486	__isl_give isl_union_pw_multi_aff *
1487	isl_union_pw_multi_aff_set_dim_name(
1488		__isl_take isl_union_pw_multi_aff *upma,
1489		enum isl_dim_type type, unsigned pos,
1490		const char *s);
1491	__isl_give isl_multi_union_pw_aff *
1492	isl_multi_union_pw_aff_set_dim_name(
1493		__isl_take isl_multi_union_pw_aff *mupa,
1494		enum isl_dim_type type, unsigned pos,
1495		const char *s);
1496	const char *isl_aff_get_dim_name(__isl_keep isl_aff *aff,
1497		enum isl_dim_type type, unsigned pos);
1498	const char *isl_pw_aff_get_dim_name(
1499		__isl_keep isl_pw_aff *pa,
1500		enum isl_dim_type type, unsigned pos);
1501	const char *isl_pw_multi_aff_get_dim_name(
1502		__isl_keep isl_pw_multi_aff *pma,
1503		enum isl_dim_type type, unsigned pos);
1504
1505	#include <isl/polynomial.h>
1506	__isl_give isl_qpolynomial *isl_qpolynomial_set_dim_name(
1507		__isl_take isl_qpolynomial *qp,
1508		enum isl_dim_type type, unsigned pos,
1509		const char *s);
1510	__isl_give isl_pw_qpolynomial *
1511	isl_pw_qpolynomial_set_dim_name(
1512		__isl_take isl_pw_qpolynomial *pwqp,
1513		enum isl_dim_type type, unsigned pos,
1514		const char *s);
1515	__isl_give isl_pw_qpolynomial_fold *
1516	isl_pw_qpolynomial_fold_set_dim_name(
1517		__isl_take isl_pw_qpolynomial_fold *pwf,
1518		enum isl_dim_type type, unsigned pos,
1519		const char *s);
1520	__isl_give isl_union_pw_qpolynomial *
1521	isl_union_pw_qpolynomial_set_dim_name(
1522		__isl_take isl_union_pw_qpolynomial *upwqp,
1523		enum isl_dim_type type, unsigned pos,
1524		const char *s);
1525	__isl_give isl_union_pw_qpolynomial_fold *
1526	isl_union_pw_qpolynomial_fold_set_dim_name(
1527		__isl_take isl_union_pw_qpolynomial_fold *upwf,
1528		enum isl_dim_type type, unsigned pos,
1529		const char *s);
1530
1531Note that C<isl_space_get_name> returns a pointer to some internal
1532data structure, so the result can only be used while the
1533corresponding C<isl_space> is alive.
1534Also note that every function that operates on two sets or relations
1535requires that both arguments have the same parameters.  This also
1536means that if one of the arguments has named parameters, then the
1537other needs to have named parameters too and the names need to match.
1538Pairs of C<isl_set>, C<isl_map>, C<isl_union_set> and/or C<isl_union_map>
1539arguments may have different parameters (as long as they are named),
1540in which case the result will have as parameters the union of the parameters of
1541the arguments.
1542
1543Given the identifier or name of a dimension (typically a parameter),
1544its position can be obtained from the following functions.
1545
1546	#include <isl/space.h>
1547	int isl_space_find_dim_by_id(__isl_keep isl_space *space,
1548		enum isl_dim_type type, __isl_keep isl_id *id);
1549	int isl_space_find_dim_by_name(__isl_keep isl_space *space,
1550		enum isl_dim_type type, const char *name);
1551
1552	#include <isl/local_space.h>
1553	int isl_local_space_find_dim_by_name(
1554		__isl_keep isl_local_space *ls,
1555		enum isl_dim_type type, const char *name);
1556
1557	#include <isl/val.h>
1558	int isl_multi_val_find_dim_by_id(
1559		__isl_keep isl_multi_val *mv,
1560		enum isl_dim_type type, __isl_keep isl_id *id);
1561	int isl_multi_val_find_dim_by_name(
1562		__isl_keep isl_multi_val *mv,
1563		enum isl_dim_type type, const char *name);
1564
1565	#include <isl/set.h>
1566	int isl_set_find_dim_by_id(__isl_keep isl_set *set,
1567		enum isl_dim_type type, __isl_keep isl_id *id);
1568	int isl_set_find_dim_by_name(__isl_keep isl_set *set,
1569		enum isl_dim_type type, const char *name);
1570
1571	#include <isl/map.h>
1572	int isl_map_find_dim_by_id(__isl_keep isl_map *map,
1573		enum isl_dim_type type, __isl_keep isl_id *id);
1574	int isl_basic_map_find_dim_by_name(
1575		__isl_keep isl_basic_map *bmap,
1576		enum isl_dim_type type, const char *name);
1577	int isl_map_find_dim_by_name(__isl_keep isl_map *map,
1578		enum isl_dim_type type, const char *name);
1579	int isl_union_map_find_dim_by_name(
1580		__isl_keep isl_union_map *umap,
1581		enum isl_dim_type type, const char *name);
1582
1583	#include <isl/aff.h>
1584	int isl_multi_aff_find_dim_by_id(
1585		__isl_keep isl_multi_aff *ma,
1586		enum isl_dim_type type, __isl_keep isl_id *id);
1587	int isl_multi_pw_aff_find_dim_by_id(
1588		__isl_keep isl_multi_pw_aff *mpa,
1589		enum isl_dim_type type, __isl_keep isl_id *id);
1590	int isl_multi_union_pw_aff_find_dim_by_id(
1591		__isl_keep isl_multi_union_pw_aff *mupa,
1592		enum isl_dim_type type, __isl_keep isl_id *id);
1593	int isl_aff_find_dim_by_name(__isl_keep isl_aff *aff,
1594		enum isl_dim_type type, const char *name);
1595	int isl_multi_aff_find_dim_by_name(
1596		__isl_keep isl_multi_aff *ma,
1597		enum isl_dim_type type, const char *name);
1598	int isl_pw_aff_find_dim_by_name(__isl_keep isl_pw_aff *pa,
1599		enum isl_dim_type type, const char *name);
1600	int isl_multi_pw_aff_find_dim_by_name(
1601		__isl_keep isl_multi_pw_aff *mpa,
1602		enum isl_dim_type type, const char *name);
1603	int isl_pw_multi_aff_find_dim_by_name(
1604		__isl_keep isl_pw_multi_aff *pma,
1605		enum isl_dim_type type, const char *name);
1606	int isl_union_pw_aff_find_dim_by_name(
1607		__isl_keep isl_union_pw_aff *upa,
1608		enum isl_dim_type type, const char *name);
1609	int isl_union_pw_multi_aff_find_dim_by_name(
1610		__isl_keep isl_union_pw_multi_aff *upma,
1611		enum isl_dim_type type, const char *name);
1612	int isl_multi_union_pw_aff_find_dim_by_name(
1613		__isl_keep isl_multi_union_pw_aff *mupa,
1614		enum isl_dim_type type, const char *name);
1615
1616	#include <isl/polynomial.h>
1617	int isl_pw_qpolynomial_find_dim_by_name(
1618		__isl_keep isl_pw_qpolynomial *pwqp,
1619		enum isl_dim_type type, const char *name);
1620	int isl_pw_qpolynomial_fold_find_dim_by_name(
1621		__isl_keep isl_pw_qpolynomial_fold *pwf,
1622		enum isl_dim_type type, const char *name);
1623	int isl_union_pw_qpolynomial_find_dim_by_name(
1624		__isl_keep isl_union_pw_qpolynomial *upwqp,
1625		enum isl_dim_type type, const char *name);
1626	int isl_union_pw_qpolynomial_fold_find_dim_by_name(
1627		__isl_keep isl_union_pw_qpolynomial_fold *upwf,
1628		enum isl_dim_type type, const char *name);
1629
1630The identifiers or names of entire spaces may be set or read off
1631using the following functions.
1632
1633	#include <isl/space.h>
1634	__isl_give isl_space *isl_space_set_domain_tuple_id(
1635		__isl_take isl_space *space,
1636		__isl_take isl_id *id);
1637	__isl_give isl_space *isl_space_set_range_tuple_id(
1638		__isl_take isl_space *space,
1639		__isl_take isl_id *id);
1640	__isl_give isl_space *isl_space_set_tuple_id(
1641		__isl_take isl_space *space,
1642		enum isl_dim_type type, __isl_take isl_id *id);
1643	__isl_give isl_space *isl_space_reset_tuple_id(
1644		__isl_take isl_space *space, enum isl_dim_type type);
1645	isl_bool isl_space_has_domain_tuple_id(
1646		__isl_keep isl_space *space);
1647	isl_bool isl_space_has_range_tuple_id(
1648		__isl_keep isl_space *space);
1649	isl_bool isl_space_has_tuple_id(
1650		__isl_keep isl_space *space,
1651		enum isl_dim_type type);
1652	__isl_give isl_id *isl_space_get_domain_tuple_id(
1653		__isl_keep isl_space *space);
1654	__isl_give isl_id *isl_space_get_range_tuple_id(
1655		__isl_keep isl_space *space);
1656	__isl_give isl_id *isl_space_get_tuple_id(
1657		__isl_keep isl_space *space, enum isl_dim_type type);
1658	__isl_give isl_space *isl_space_set_tuple_name(
1659		__isl_take isl_space *space,
1660		enum isl_dim_type type, const char *s);
1661	isl_bool isl_space_has_tuple_name(
1662		__isl_keep isl_space *space,
1663		enum isl_dim_type type);
1664	__isl_keep const char *isl_space_get_tuple_name(
1665		__isl_keep isl_space *space,
1666		enum isl_dim_type type);
1667
1668	#include <isl/local_space.h>
1669	__isl_give isl_local_space *isl_local_space_set_tuple_id(
1670		__isl_take isl_local_space *ls,
1671		enum isl_dim_type type, __isl_take isl_id *id);
1672
1673	#include <isl/set.h>
1674	__isl_give isl_basic_set *isl_basic_set_set_tuple_id(
1675		__isl_take isl_basic_set *bset,
1676		__isl_take isl_id *id);
1677	__isl_give isl_set *isl_set_set_tuple_id(
1678		__isl_take isl_set *set, __isl_take isl_id *id);
1679	__isl_give isl_set *isl_set_reset_tuple_id(
1680		__isl_take isl_set *set);
1681	isl_bool isl_set_has_tuple_id(__isl_keep isl_set *set);
1682	__isl_give isl_id *isl_set_get_tuple_id(
1683		__isl_keep isl_set *set);
1684	__isl_give isl_basic_set *isl_basic_set_set_tuple_name(
1685		__isl_take isl_basic_set *set, const char *s);
1686	__isl_give isl_set *isl_set_set_tuple_name(
1687		__isl_take isl_set *set, const char *s);
1688	const char *isl_basic_set_get_tuple_name(
1689		__isl_keep isl_basic_set *bset);
1690	isl_bool isl_set_has_tuple_name(__isl_keep isl_set *set);
1691	const char *isl_set_get_tuple_name(
1692		__isl_keep isl_set *set);
1693
1694	#include <isl/map.h>
1695	__isl_give isl_basic_map *isl_basic_map_set_tuple_id(
1696		__isl_take isl_basic_map *bmap,
1697		enum isl_dim_type type, __isl_take isl_id *id);
1698	__isl_give isl_map *isl_map_set_domain_tuple_id(
1699		__isl_take isl_map *map, __isl_take isl_id *id);
1700	__isl_give isl_map *isl_map_set_range_tuple_id(
1701		__isl_take isl_map *map, __isl_take isl_id *id);
1702	__isl_give isl_map *isl_map_set_tuple_id(
1703		__isl_take isl_map *map, enum isl_dim_type type,
1704		__isl_take isl_id *id);
1705	__isl_give isl_map *isl_map_reset_tuple_id(
1706		__isl_take isl_map *map, enum isl_dim_type type);
1707	isl_bool isl_map_has_domain_tuple_id(
1708		__isl_keep isl_map *map);
1709	isl_bool isl_map_has_range_tuple_id(
1710		__isl_keep isl_map *map);
1711	isl_bool isl_map_has_tuple_id(__isl_keep isl_map *map,
1712		enum isl_dim_type type);
1713	__isl_give isl_id *isl_map_get_domain_tuple_id(
1714		__isl_keep isl_map *map);
1715	__isl_give isl_id *isl_map_get_range_tuple_id(
1716		__isl_keep isl_map *map);
1717	__isl_give isl_id *isl_map_get_tuple_id(
1718		__isl_keep isl_map *map, enum isl_dim_type type);
1719	__isl_give isl_map *isl_map_set_tuple_name(
1720		__isl_take isl_map *map,
1721		enum isl_dim_type type, const char *s);
1722	const char *isl_basic_map_get_tuple_name(
1723		__isl_keep isl_basic_map *bmap,
1724		enum isl_dim_type type);
1725	__isl_give isl_basic_map *isl_basic_map_set_tuple_name(
1726		__isl_take isl_basic_map *bmap,
1727		enum isl_dim_type type, const char *s);
1728	isl_bool isl_map_has_tuple_name(__isl_keep isl_map *map,
1729		enum isl_dim_type type);
1730	const char *isl_map_get_tuple_name(
1731		__isl_keep isl_map *map,
1732		enum isl_dim_type type);
1733
1734	#include <isl/val.h>
1735	__isl_give isl_multi_val *isl_multi_val_set_range_tuple_id(
1736		__isl_take isl_multi_val *mv,
1737		__isl_take isl_id *id);
1738	__isl_give isl_multi_val *isl_multi_val_set_tuple_id(
1739		__isl_take isl_multi_val *mv,
1740		enum isl_dim_type type, __isl_take isl_id *id);
1741	__isl_give isl_multi_val *
1742	isl_multi_val_reset_range_tuple_id(
1743		__isl_take isl_multi_val *mv);
1744	__isl_give isl_multi_val *isl_multi_val_reset_tuple_id(
1745		__isl_take isl_multi_val *mv,
1746		enum isl_dim_type type);
1747	isl_bool isl_multi_val_has_range_tuple_id(
1748		__isl_keep isl_multi_val *mv);
1749	__isl_give isl_id *isl_multi_val_get_range_tuple_id(
1750		__isl_keep isl_multi_val *mv);
1751	isl_bool isl_multi_val_has_tuple_id(
1752		__isl_keep isl_multi_val *mv,
1753		enum isl_dim_type type);
1754	__isl_give isl_id *isl_multi_val_get_tuple_id(
1755		__isl_keep isl_multi_val *mv,
1756		enum isl_dim_type type);
1757	__isl_give isl_multi_val *isl_multi_val_set_tuple_name(
1758		__isl_take isl_multi_val *mv,
1759		enum isl_dim_type type, const char *s);
1760	const char *isl_multi_val_get_tuple_name(
1761		__isl_keep isl_multi_val *mv,
1762		enum isl_dim_type type);
1763
1764	#include <isl/aff.h>
1765	__isl_give isl_aff *isl_aff_set_tuple_id(
1766		__isl_take isl_aff *aff,
1767		enum isl_dim_type type, __isl_take isl_id *id);
1768	__isl_give isl_multi_aff *isl_multi_aff_set_range_tuple_id(
1769		__isl_take isl_multi_aff *ma,
1770		__isl_take isl_id *id);
1771	__isl_give isl_multi_aff *isl_multi_aff_set_tuple_id(
1772		__isl_take isl_multi_aff *maff,
1773		enum isl_dim_type type, __isl_take isl_id *id);
1774	__isl_give isl_pw_aff *isl_pw_aff_set_tuple_id(
1775		__isl_take isl_pw_aff *pwaff,
1776		enum isl_dim_type type, __isl_take isl_id *id);
1777	__isl_give isl_pw_multi_aff *
1778	isl_pw_multi_aff_set_range_tuple_id(
1779		__isl_take isl_pw_multi_aff *pma,
1780		__isl_take isl_id *id);
1781	__isl_give isl_pw_multi_aff *isl_pw_multi_aff_set_tuple_id(
1782		__isl_take isl_pw_multi_aff *pma,
1783		enum isl_dim_type type, __isl_take isl_id *id);
1784	__isl_give isl_multi_pw_aff *
1785	isl_multi_pw_aff_set_range_tuple_id(
1786		__isl_take isl_multi_pw_aff *mpa,
1787		__isl_take isl_id *id);
1788	__isl_give isl_multi_union_pw_aff *
1789	isl_multi_union_pw_aff_set_range_tuple_id(
1790		__isl_take isl_multi_union_pw_aff *mupa,
1791		__isl_take isl_id *id);
1792	__isl_give isl_multi_union_pw_aff *
1793	isl_multi_union_pw_aff_set_tuple_id(
1794		__isl_take isl_multi_union_pw_aff *mupa,
1795		enum isl_dim_type type, __isl_take isl_id *id);
1796	__isl_give isl_multi_aff *
1797	isl_multi_aff_reset_range_tuple_id(
1798		__isl_take isl_multi_aff *ma);
1799	__isl_give isl_multi_pw_aff *
1800	isl_multi_pw_aff_reset_range_tuple_id(
1801		__isl_take isl_multi_pw_aff *mpa);
1802	__isl_give isl_multi_union_pw_aff *
1803	isl_multi_union_pw_aff_reset_range_tuple_id(
1804		__isl_take isl_multi_union_pw_aff *mupa);
1805	__isl_give isl_multi_aff *isl_multi_aff_reset_tuple_id(
1806		__isl_take isl_multi_aff *ma,
1807		enum isl_dim_type type);
1808	__isl_give isl_pw_aff *isl_pw_aff_reset_tuple_id(
1809		__isl_take isl_pw_aff *pa,
1810		enum isl_dim_type type);
1811	__isl_give isl_multi_pw_aff *
1812	isl_multi_pw_aff_reset_tuple_id(
1813		__isl_take isl_multi_pw_aff *mpa,
1814		enum isl_dim_type type);
1815	__isl_give isl_pw_multi_aff *
1816	isl_pw_multi_aff_reset_tuple_id(
1817		__isl_take isl_pw_multi_aff *pma,
1818		enum isl_dim_type type);
1819	__isl_give isl_multi_union_pw_aff *
1820	isl_multi_union_pw_aff_reset_tuple_id(
1821		__isl_take isl_multi_union_pw_aff *mupa,
1822		enum isl_dim_type type);
1823	isl_bool isl_multi_aff_has_range_tuple_id(
1824		__isl_keep isl_multi_aff *ma);
1825	__isl_give isl_id *isl_multi_aff_get_range_tuple_id(
1826		__isl_keep isl_multi_aff *ma);
1827	isl_bool isl_multi_aff_has_tuple_id(
1828		__isl_keep isl_multi_aff *ma,
1829		enum isl_dim_type type);
1830	__isl_give isl_id *isl_multi_aff_get_tuple_id(
1831		__isl_keep isl_multi_aff *ma,
1832		enum isl_dim_type type);
1833	isl_bool isl_pw_aff_has_tuple_id(__isl_keep isl_pw_aff *pa,
1834		enum isl_dim_type type);
1835	__isl_give isl_id *isl_pw_aff_get_tuple_id(
1836		__isl_keep isl_pw_aff *pa,
1837		enum isl_dim_type type);
1838	isl_bool isl_pw_multi_aff_has_range_tuple_id(
1839		__isl_keep isl_pw_multi_aff *pma);
1840	isl_bool isl_pw_multi_aff_has_tuple_id(
1841		__isl_keep isl_pw_multi_aff *pma,
1842		enum isl_dim_type type);
1843	__isl_give isl_id *isl_pw_multi_aff_get_range_tuple_id(
1844		__isl_keep isl_pw_multi_aff *pma);
1845	__isl_give isl_id *isl_pw_multi_aff_get_tuple_id(
1846		__isl_keep isl_pw_multi_aff *pma,
1847		enum isl_dim_type type);
1848	isl_bool isl_multi_pw_aff_has_range_tuple_id(
1849		__isl_keep isl_multi_pw_aff *mpa);
1850	__isl_give isl_id *isl_multi_pw_aff_get_range_tuple_id(
1851		__isl_keep isl_multi_pw_aff *mpa);
1852	isl_bool isl_multi_pw_aff_has_tuple_id(
1853		__isl_keep isl_multi_pw_aff *mpa,
1854		enum isl_dim_type type);
1855	__isl_give isl_id *isl_multi_pw_aff_get_tuple_id(
1856		__isl_keep isl_multi_pw_aff *mpa,
1857		enum isl_dim_type type);
1858	isl_bool isl_multi_union_pw_aff_has_range_tuple_id(
1859		__isl_keep isl_multi_union_pw_aff *mupa);
1860	__isl_give isl_id *
1861	isl_multi_union_pw_aff_get_range_tuple_id(
1862		__isl_keep isl_multi_union_pw_aff *mupa);
1863	isl_bool isl_multi_union_pw_aff_has_tuple_id(
1864		__isl_keep isl_multi_union_pw_aff *mupa,
1865		enum isl_dim_type type);
1866	__isl_give isl_id *isl_multi_union_pw_aff_get_tuple_id(
1867		__isl_keep isl_multi_union_pw_aff *mupa,
1868		enum isl_dim_type type);
1869	__isl_give isl_multi_aff *isl_multi_aff_set_tuple_name(
1870		__isl_take isl_multi_aff *maff,
1871		enum isl_dim_type type, const char *s);
1872	__isl_give isl_multi_pw_aff *
1873	isl_multi_pw_aff_set_tuple_name(
1874		__isl_take isl_multi_pw_aff *mpa,
1875		enum isl_dim_type type, const char *s);
1876	__isl_give isl_multi_union_pw_aff *
1877	isl_multi_union_pw_aff_set_tuple_name(
1878		__isl_take isl_multi_union_pw_aff *mupa,
1879		enum isl_dim_type type, const char *s);
1880	const char *isl_multi_aff_get_tuple_name(
1881		__isl_keep isl_multi_aff *multi,
1882		enum isl_dim_type type);
1883	isl_bool isl_pw_multi_aff_has_tuple_name(
1884		__isl_keep isl_pw_multi_aff *pma,
1885		enum isl_dim_type type);
1886	const char *isl_pw_multi_aff_get_tuple_name(
1887		__isl_keep isl_pw_multi_aff *pma,
1888		enum isl_dim_type type);
1889	const char *isl_multi_union_pw_aff_get_tuple_name(
1890		__isl_keep isl_multi_union_pw_aff *mupa,
1891		enum isl_dim_type type);
1892
1893The C<type> argument needs to be one of C<isl_dim_in>, C<isl_dim_out>
1894or C<isl_dim_set>.  As with C<isl_space_get_name>,
1895the C<isl_space_get_tuple_name> function returns a pointer to some internal
1896data structure.
1897Binary operations require the corresponding spaces of their arguments
1898to have the same name.
1899
1900To keep the names of all parameters and tuples, but reset the user pointers
1901of all the corresponding identifiers, use the following function.
1902
1903	#include <isl/space.h>
1904	__isl_give isl_space *isl_space_reset_user(
1905		__isl_take isl_space *space);
1906
1907	#include <isl/set.h>
1908	__isl_give isl_set *isl_set_reset_user(
1909		__isl_take isl_set *set);
1910
1911	#include <isl/map.h>
1912	__isl_give isl_map *isl_map_reset_user(
1913		__isl_take isl_map *map);
1914
1915	#include <isl/union_set.h>
1916	__isl_give isl_union_set *isl_union_set_reset_user(
1917		__isl_take isl_union_set *uset);
1918
1919	#include <isl/union_map.h>
1920	__isl_give isl_union_map *isl_union_map_reset_user(
1921		__isl_take isl_union_map *umap);
1922
1923	#include <isl/id.h>
1924	__isl_give isl_multi_id *isl_multi_id_reset_user(
1925		__isl_take isl_multi_id *mi);
1926
1927	#include <isl/val.h>
1928	__isl_give isl_multi_val *isl_multi_val_reset_user(
1929		__isl_take isl_multi_val *mv);
1930
1931	#include <isl/aff.h>
1932	__isl_give isl_multi_aff *isl_multi_aff_reset_user(
1933		__isl_take isl_multi_aff *ma);
1934	__isl_give isl_pw_aff *isl_pw_aff_reset_user(
1935		__isl_take isl_pw_aff *pa);
1936	__isl_give isl_multi_pw_aff *isl_multi_pw_aff_reset_user(
1937		__isl_take isl_multi_pw_aff *mpa);
1938	__isl_give isl_pw_multi_aff *isl_pw_multi_aff_reset_user(
1939		__isl_take isl_pw_multi_aff *pma);
1940	__isl_give isl_union_pw_aff *isl_union_pw_aff_reset_user(
1941		__isl_take isl_union_pw_aff *upa);
1942	__isl_give isl_multi_union_pw_aff *
1943	isl_multi_union_pw_aff_reset_user(
1944		__isl_take isl_multi_union_pw_aff *mupa);
1945	__isl_give isl_union_pw_multi_aff *
1946	isl_union_pw_multi_aff_reset_user(
1947		__isl_take isl_union_pw_multi_aff *upma);
1948
1949	#include <isl/polynomial.h>
1950	__isl_give isl_pw_qpolynomial *
1951	isl_pw_qpolynomial_reset_user(
1952		__isl_take isl_pw_qpolynomial *pwqp);
1953	__isl_give isl_union_pw_qpolynomial *
1954	isl_union_pw_qpolynomial_reset_user(
1955		__isl_take isl_union_pw_qpolynomial *upwqp);
1956	__isl_give isl_pw_qpolynomial_fold *
1957	isl_pw_qpolynomial_fold_reset_user(
1958		__isl_take isl_pw_qpolynomial_fold *pwf);
1959	__isl_give isl_union_pw_qpolynomial_fold *
1960	isl_union_pw_qpolynomial_fold_reset_user(
1961		__isl_take isl_union_pw_qpolynomial_fold *upwf);
1962
1963Spaces can be nested.  In particular, the domain of a set or
1964the domain or range of a relation can be a nested relation.
1965This process is also called I<wrapping>.
1966The functions for detecting, constructing and deconstructing
1967such nested spaces can be found in the wrapping properties
1968of L</"Unary Properties">, the wrapping operations
1969of L</"Unary Operations"> and the Cartesian product operations
1970of L</"Basic Operations">.
1971
1972Spaces can be created from other spaces
1973using the functions described in L</"Unary Operations">
1974and L</"Binary Operations">.
1975
1976=head2 Local Spaces
1977
1978A local space is essentially a space with
1979zero or more existentially quantified variables.
1980The local space of various objects can be obtained
1981using the following functions.
1982
1983	#include <isl/constraint.h>
1984	__isl_give isl_local_space *isl_constraint_get_local_space(
1985		__isl_keep isl_constraint *constraint);
1986
1987	#include <isl/set.h>
1988	__isl_give isl_local_space *isl_basic_set_get_local_space(
1989		__isl_keep isl_basic_set *bset);
1990
1991	#include <isl/map.h>
1992	__isl_give isl_local_space *isl_basic_map_get_local_space(
1993		__isl_keep isl_basic_map *bmap);
1994
1995	#include <isl/aff.h>
1996	__isl_give isl_local_space *isl_aff_get_domain_local_space(
1997		__isl_keep isl_aff *aff);
1998	__isl_give isl_local_space *isl_aff_get_local_space(
1999		__isl_keep isl_aff *aff);
2000
2001A new local space can be created from a space using
2002
2003	#include <isl/local_space.h>
2004	__isl_give isl_local_space *isl_local_space_from_space(
2005		__isl_take isl_space *space);
2006
2007They can be inspected, modified, copied and freed using the following functions.
2008
2009	#include <isl/local_space.h>
2010	isl_bool isl_local_space_is_params(
2011		__isl_keep isl_local_space *ls);
2012	isl_bool isl_local_space_is_set(
2013		__isl_keep isl_local_space *ls);
2014	__isl_give isl_space *isl_local_space_get_space(
2015		__isl_keep isl_local_space *ls);
2016	__isl_give isl_aff *isl_local_space_get_div(
2017		__isl_keep isl_local_space *ls, int pos);
2018	__isl_give isl_local_space *isl_local_space_copy(
2019		__isl_keep isl_local_space *ls);
2020	__isl_null isl_local_space *isl_local_space_free(
2021		__isl_take isl_local_space *ls);
2022
2023Note that C<isl_local_space_get_div> can only be used on local spaces
2024of sets.
2025
2026Two local spaces can be compared using
2027
2028	isl_bool isl_local_space_is_equal(
2029		__isl_keep isl_local_space *ls1,
2030		__isl_keep isl_local_space *ls2);
2031
2032Local spaces can be created from other local spaces
2033using the functions described in L</"Unary Operations">
2034and L</"Binary Operations">.
2035
2036=head2 Creating New Sets and Relations
2037
2038C<isl> has functions for creating some standard sets and relations.
2039
2040=over
2041
2042=item * Empty sets and relations
2043
2044	__isl_give isl_basic_set *isl_basic_set_empty(
2045		__isl_take isl_space *space);
2046	__isl_give isl_basic_map *isl_basic_map_empty(
2047		__isl_take isl_space *space);
2048	__isl_give isl_set *isl_set_empty(
2049		__isl_take isl_space *space);
2050	__isl_give isl_map *isl_map_empty(
2051		__isl_take isl_space *space);
2052	__isl_give isl_union_set *isl_union_set_empty_ctx(
2053		isl_ctx *ctx);
2054	__isl_give isl_union_set *isl_union_set_empty_space(
2055		__isl_take isl_space *space);
2056	__isl_give isl_union_set *isl_union_set_empty(
2057		__isl_take isl_space *space);
2058	__isl_give isl_union_map *isl_union_map_empty_ctx(
2059		isl_ctx *ctx);
2060	__isl_give isl_union_map *isl_union_map_empty_space(
2061		__isl_take isl_space *space);
2062	__isl_give isl_union_map *isl_union_map_empty(
2063		__isl_take isl_space *space);
2064
2065For C<isl_union_set>s and C<isl_union_map>s, the space
2066is only used to specify the parameters.
2067C<isl_union_set_empty> is an alternative name for
2068C<isl_union_set_empty_space>.
2069Similarly for the other pair of functions.
2070
2071=item * Universe sets and relations
2072
2073	#include <isl/set.h>
2074	__isl_give isl_basic_set *isl_basic_set_universe(
2075		__isl_take isl_space *space);
2076	__isl_give isl_set *isl_set_universe(
2077		__isl_take isl_space *space);
2078	__isl_give isl_set *isl_space_universe_set(
2079		__isl_take isl_space *space);
2080
2081	#include <isl/map.h>
2082	__isl_give isl_basic_map *isl_basic_map_universe(
2083		__isl_take isl_space *space);
2084	__isl_give isl_map *isl_map_universe(
2085		__isl_take isl_space *space);
2086	__isl_give isl_map *isl_space_universe_map(
2087		__isl_take isl_space *space);
2088
2089	#include <isl/union_set.h>
2090	__isl_give isl_union_set *isl_union_set_universe(
2091		__isl_take isl_union_set *uset);
2092
2093	#include <isl/union_map.h>
2094	__isl_give isl_union_map *isl_union_map_universe(
2095		__isl_take isl_union_map *umap);
2096
2097C<isl_set_universe> and C<isl_space_universe_set>
2098perform the same operation.
2099Similarly
2100for the pair C<isl_map_universe> and C<isl_space_universe_map>.
2101
2102The sets and relations constructed by the functions above
2103contain all integer values, while those constructed by the
2104functions below only contain non-negative values.
2105
2106	__isl_give isl_basic_set *isl_basic_set_nat_universe(
2107		__isl_take isl_space *space);
2108	__isl_give isl_basic_map *isl_basic_map_nat_universe(
2109		__isl_take isl_space *space);
2110	__isl_give isl_set *isl_set_nat_universe(
2111		__isl_take isl_space *space);
2112	__isl_give isl_map *isl_map_nat_universe(
2113		__isl_take isl_space *space);
2114
2115=item * Identity relations
2116
2117	__isl_give isl_basic_map *isl_basic_map_identity(
2118		__isl_take isl_space *space);
2119	__isl_give isl_map *isl_map_identity(
2120		__isl_take isl_space *space);
2121
2122The number of input and output dimensions in C<space> needs
2123to be the same.
2124
2125=item * Lexicographic order
2126
2127	__isl_give isl_map *isl_map_lex_lt(
2128		__isl_take isl_space *set_space);
2129	__isl_give isl_map *isl_map_lex_le(
2130		__isl_take isl_space *set_space);
2131	__isl_give isl_map *isl_map_lex_gt(
2132		__isl_take isl_space *set_space);
2133	__isl_give isl_map *isl_map_lex_ge(
2134		__isl_take isl_space *set_space);
2135	__isl_give isl_map *isl_map_lex_lt_first(
2136		__isl_take isl_space *space, unsigned n);
2137	__isl_give isl_map *isl_map_lex_le_first(
2138		__isl_take isl_space *space, unsigned n);
2139	__isl_give isl_map *isl_map_lex_gt_first(
2140		__isl_take isl_space *space, unsigned n);
2141	__isl_give isl_map *isl_map_lex_ge_first(
2142		__isl_take isl_space *space, unsigned n);
2143
2144The first four functions take a space for a B<set>
2145and return relations that express that the elements in the domain
2146are lexicographically less
2147(C<isl_map_lex_lt>), less or equal (C<isl_map_lex_le>),
2148greater (C<isl_map_lex_gt>) or greater or equal (C<isl_map_lex_ge>)
2149than the elements in the range.
2150The last four functions take a space for a map
2151and return relations that express that the first C<n> dimensions
2152in the domain are lexicographically less
2153(C<isl_map_lex_lt_first>), less or equal (C<isl_map_lex_le_first>),
2154greater (C<isl_map_lex_gt_first>) or greater or equal (C<isl_map_lex_ge_first>)
2155than the first C<n> dimensions in the range.
2156
2157=back
2158
2159A basic set or relation can be converted to a set or relation
2160using the following functions.
2161
2162	__isl_give isl_set *isl_basic_set_to_set(
2163		__isl_take isl_basic_set *bset);
2164	__isl_give isl_set *isl_set_from_basic_set(
2165		__isl_take isl_basic_set *bset);
2166	__isl_give isl_map *isl_map_from_basic_map(
2167		__isl_take isl_basic_map *bmap);
2168
2169C<isl_basic_set_to_set> and C<isl_set_from_basic_set> perform
2170the same operation.
2171
2172Sets and relations can be converted to union sets and relations
2173using the following functions.
2174
2175	__isl_give isl_union_set *isl_union_set_from_basic_set(
2176		__isl_take isl_basic_set *bset);
2177	__isl_give isl_union_map *isl_union_map_from_basic_map(
2178		__isl_take isl_basic_map *bmap);
2179	__isl_give isl_union_set *isl_set_to_union_set(
2180		__isl_take isl_set *set);
2181	__isl_give isl_union_set *isl_union_set_from_set(
2182		__isl_take isl_set *set);
2183	__isl_give isl_union_map *isl_map_to_union_map(
2184		__isl_take isl_map *map);
2185	__isl_give isl_union_map *isl_union_map_from_map(
2186		__isl_take isl_map *map);
2187
2188C<isl_map_to_union_map> and C<isl_union_map_from_map> perform
2189the same operation.
2190Similarly for C<isl_set_to_union_set> and C<isl_union_set_from_set>.
2191
2192The inverse conversions below can only be used if the input
2193union set or relation is known to contain elements in exactly one
2194space.
2195
2196	#include <isl/union_set.h>
2197	isl_bool isl_union_set_isa_set(
2198		__isl_keep isl_union_set *uset);
2199	__isl_give isl_set *isl_union_set_as_set(
2200		__isl_take isl_union_set *uset);
2201	__isl_give isl_set *isl_set_from_union_set(
2202		__isl_take isl_union_set *uset);
2203
2204	#include <isl/union_map.h>
2205	isl_bool isl_union_map_isa_map(
2206		__isl_keep isl_union_map *umap);
2207	__isl_give isl_map *isl_union_map_as_map(
2208		__isl_take isl_union_map *umap);
2209	__isl_give isl_map *isl_map_from_union_map(
2210		__isl_take isl_union_map *umap);
2211
2212C<isl_union_map_as_map> and C<isl_map_from_union_map> perform
2213the same operation.
2214Similarly for C<isl_union_set_as_set> and C<isl_set_from_union_set>.
2215
2216Sets and relations can be copied and freed again using the following
2217functions.
2218
2219	__isl_give isl_basic_set *isl_basic_set_copy(
2220		__isl_keep isl_basic_set *bset);
2221	__isl_give isl_set *isl_set_copy(__isl_keep isl_set *set);
2222	__isl_give isl_union_set *isl_union_set_copy(
2223		__isl_keep isl_union_set *uset);
2224	__isl_give isl_basic_map *isl_basic_map_copy(
2225		__isl_keep isl_basic_map *bmap);
2226	__isl_give isl_map *isl_map_copy(__isl_keep isl_map *map);
2227	__isl_give isl_union_map *isl_union_map_copy(
2228		__isl_keep isl_union_map *umap);
2229	__isl_null isl_basic_set *isl_basic_set_free(
2230		__isl_take isl_basic_set *bset);
2231	__isl_null isl_set *isl_set_free(__isl_take isl_set *set);
2232	__isl_null isl_union_set *isl_union_set_free(
2233		__isl_take isl_union_set *uset);
2234	__isl_null isl_basic_map *isl_basic_map_free(
2235		__isl_take isl_basic_map *bmap);
2236	__isl_null isl_map *isl_map_free(__isl_take isl_map *map);
2237	__isl_null isl_union_map *isl_union_map_free(
2238		__isl_take isl_union_map *umap);
2239
2240Other sets and relations can be constructed by starting
2241from a universe set or relation, adding equality and/or
2242inequality constraints and then projecting out the
2243existentially quantified variables, if any.
2244Constraints can be constructed, manipulated and
2245added to (or removed from) (basic) sets and relations
2246using the following functions.
2247
2248	#include <isl/constraint.h>
2249	__isl_give isl_constraint *isl_constraint_alloc_equality(
2250		__isl_take isl_local_space *ls);
2251	__isl_give isl_constraint *isl_constraint_alloc_inequality(
2252		__isl_take isl_local_space *ls);
2253	__isl_give isl_constraint *isl_constraint_set_constant_si(
2254		__isl_take isl_constraint *constraint, int v);
2255	__isl_give isl_constraint *isl_constraint_set_constant_val(
2256		__isl_take isl_constraint *constraint,
2257		__isl_take isl_val *v);
2258	__isl_give isl_constraint *isl_constraint_set_coefficient_si(
2259		__isl_take isl_constraint *constraint,
2260		enum isl_dim_type type, int pos, int v);
2261	__isl_give isl_constraint *
2262	isl_constraint_set_coefficient_val(
2263		__isl_take isl_constraint *constraint,
2264		enum isl_dim_type type, int pos,
2265		__isl_take isl_val *v);
2266	__isl_give isl_basic_map *isl_basic_map_add_constraint(
2267		__isl_take isl_basic_map *bmap,
2268		__isl_take isl_constraint *constraint);
2269	__isl_give isl_basic_set *isl_basic_set_add_constraint(
2270		__isl_take isl_basic_set *bset,
2271		__isl_take isl_constraint *constraint);
2272	__isl_give isl_map *isl_map_add_constraint(
2273		__isl_take isl_map *map,
2274		__isl_take isl_constraint *constraint);
2275	__isl_give isl_set *isl_set_add_constraint(
2276		__isl_take isl_set *set,
2277		__isl_take isl_constraint *constraint);
2278
2279For example, to create a set containing the even integers
2280between 10 and 42, you could use the following code.
2281
2282	isl_space *space;
2283	isl_local_space *ls;
2284	isl_constraint *c;
2285	isl_basic_set *bset;
2286
2287	space = isl_space_set_alloc(ctx, 0, 2);
2288	bset = isl_basic_set_universe(isl_space_copy(space));
2289	ls = isl_local_space_from_space(space);
2290
2291	c = isl_constraint_alloc_equality(isl_local_space_copy(ls));
2292	c = isl_constraint_set_coefficient_si(c, isl_dim_set, 0, -1);
2293	c = isl_constraint_set_coefficient_si(c, isl_dim_set, 1, 2);
2294	bset = isl_basic_set_add_constraint(bset, c);
2295
2296	c = isl_constraint_alloc_inequality(isl_local_space_copy(ls));
2297	c = isl_constraint_set_constant_si(c, -10);
2298	c = isl_constraint_set_coefficient_si(c, isl_dim_set, 0, 1);
2299	bset = isl_basic_set_add_constraint(bset, c);
2300
2301	c = isl_constraint_alloc_inequality(ls);
2302	c = isl_constraint_set_constant_si(c, 42);
2303	c = isl_constraint_set_coefficient_si(c, isl_dim_set, 0, -1);
2304	bset = isl_basic_set_add_constraint(bset, c);
2305
2306	bset = isl_basic_set_project_out(bset, isl_dim_set, 1, 1);
2307
2308However, this is considered to be a fairly low-level approach.
2309It is more appropriate to construct a (basic) set by means
2310of affine expressions (defined below in L</"Functions">).
2311For example, the same set could be constructed as follows.
2312
2313	isl_val *v, *two;
2314	isl_space *space;
2315	isl_multi_aff *ma;
2316	isl_aff *var, *cst;
2317	isl_basic_set *bset;
2318
2319	space = isl_space_unit(ctx);
2320	space = isl_space_add_unnamed_tuple_ui(space, 1);
2321	ma = isl_multi_aff_identity_on_domain_space(
2322		isl_space_copy(space));
2323	var = isl_multi_aff_get_at(ma, 0);
2324	v = isl_val_int_from_si(ctx, 10);
2325	cst = isl_aff_val_on_domain_space(isl_space_copy(space), v);
2326	bset = isl_aff_ge_basic_set(isl_aff_copy(var), cst);
2327
2328	v = isl_val_int_from_si(ctx, 42);
2329	cst = isl_aff_val_on_domain_space(space, v);
2330	bset = isl_basic_set_intersect(bset,
2331		isl_aff_le_basic_set(var, cst));
2332
2333	two = isl_val_int_from_si(ctx, 2);
2334	ma = isl_multi_aff_scale_val(ma, isl_val_copy(two));
2335	bset = isl_basic_set_preimage_multi_aff(bset,
2336		isl_multi_aff_copy(ma));
2337	ma = isl_multi_aff_scale_down_val(ma, isl_val_copy(two));
2338	ma = isl_multi_aff_scale_down_val(ma, two);
2339	bset = isl_basic_set_preimage_multi_aff(bset, ma);
2340
2341Alternatively, the set can be parsed from a string representation.
2342
2343	isl_basic_set *bset;
2344	bset = isl_basic_set_read_from_str(ctx,
2345		"{[i] : exists (a : i = 2a and i >= 10 and i <= 42)}");
2346
2347A basic set or relation can also be constructed from two matrices
2348describing the equalities and the inequalities.
2349
2350	__isl_give isl_basic_set *isl_basic_set_from_constraint_matrices(
2351		__isl_take isl_space *space,
2352		__isl_take isl_mat *eq, __isl_take isl_mat *ineq,
2353		enum isl_dim_type c1,
2354		enum isl_dim_type c2, enum isl_dim_type c3,
2355		enum isl_dim_type c4);
2356	__isl_give isl_basic_map *isl_basic_map_from_constraint_matrices(
2357		__isl_take isl_space *space,
2358		__isl_take isl_mat *eq, __isl_take isl_mat *ineq,
2359		enum isl_dim_type c1,
2360		enum isl_dim_type c2, enum isl_dim_type c3,
2361		enum isl_dim_type c4, enum isl_dim_type c5);
2362
2363The C<isl_dim_type> arguments indicate the order in which
2364different kinds of variables appear in the input matrices
2365and should be a permutation of C<isl_dim_cst> (the constant term),
2366C<isl_dim_param>, C<isl_dim_set> and C<isl_dim_div> for sets and
2367of C<isl_dim_cst>, C<isl_dim_param>,
2368C<isl_dim_in>, C<isl_dim_out> and C<isl_dim_div> for relations.
2369
2370A (basic or union) set or relation can also be constructed from a
2371(union) (piecewise) (multiple) affine expression
2372or a list of affine expressions
2373(See L</"Functions">), provided these affine expressions do not
2374involve any NaN.
2375
2376	#include <isl/set.h>
2377	__isl_give isl_basic_set *isl_basic_set_from_multi_aff(
2378		__isl_take isl_multi_aff *ma);
2379	__isl_give isl_set *isl_multi_aff_as_set(
2380		__isl_take isl_multi_aff *ma);
2381	__isl_give isl_set *isl_set_from_multi_aff(
2382		__isl_take isl_multi_aff *ma);
2383
2384	#include <isl/map.h>
2385	__isl_give isl_basic_map *isl_basic_map_from_aff(
2386		__isl_take isl_aff *aff);
2387	__isl_give isl_map *isl_map_from_aff(
2388		__isl_take isl_aff *aff);
2389	__isl_give isl_basic_map *isl_basic_map_from_aff_list(
2390		__isl_take isl_space *domain_space,
2391		__isl_take isl_aff_list *list);
2392	__isl_give isl_basic_map *isl_basic_map_from_multi_aff(
2393		__isl_take isl_multi_aff *maff)
2394	__isl_give isl_map *isl_multi_aff_as_map(
2395		__isl_take isl_multi_aff *ma);
2396	__isl_give isl_map *isl_map_from_multi_aff(
2397		__isl_take isl_multi_aff *maff)
2398
2399	#include <isl/aff.h>
2400	__isl_give isl_set *isl_set_from_pw_aff(
2401		__isl_take isl_pw_aff *pwaff);
2402	__isl_give isl_map *isl_pw_aff_as_map(
2403		__isl_take isl_pw_aff *pa);
2404	__isl_give isl_map *isl_map_from_pw_aff(
2405		__isl_take isl_pw_aff *pwaff);
2406	__isl_give isl_set *isl_pw_multi_aff_as_set(
2407		__isl_take isl_pw_multi_aff *pma);
2408	__isl_give isl_set *isl_set_from_pw_multi_aff(
2409		__isl_take isl_pw_multi_aff *pma);
2410	__isl_give isl_map *isl_pw_multi_aff_as_map(
2411		__isl_take isl_pw_multi_aff *pma);
2412	__isl_give isl_map *isl_map_from_pw_multi_aff(
2413		__isl_take isl_pw_multi_aff *pma);
2414	__isl_give isl_set *isl_multi_pw_aff_as_set(
2415		__isl_take isl_multi_pw_aff *mpa);
2416	__isl_give isl_set *isl_set_from_multi_pw_aff(
2417		__isl_take isl_multi_pw_aff *mpa);
2418	__isl_give isl_map *isl_multi_pw_aff_as_map(
2419		__isl_take isl_multi_pw_aff *mpa);
2420	__isl_give isl_map *isl_map_from_multi_pw_aff(
2421		__isl_take isl_multi_pw_aff *mpa);
2422	__isl_give isl_union_map *isl_union_map_from_union_pw_aff(
2423		__isl_take isl_union_pw_aff *upa);
2424	__isl_give isl_union_map *
2425	isl_union_pw_multi_aff_as_union_map(
2426		__isl_take isl_union_pw_multi_aff *upma);
2427	__isl_give isl_union_map *
2428	isl_union_map_from_union_pw_multi_aff(
2429		__isl_take isl_union_pw_multi_aff *upma);
2430	__isl_give isl_union_map *
2431	isl_union_map_from_multi_union_pw_aff(
2432		__isl_take isl_multi_union_pw_aff *mupa);
2433
2434The C<domain_space> argument describes the domain of the resulting
2435basic relation.  It is required because the C<list> may consist
2436of zero affine expressions.
2437The C<mupa> passed to C<isl_union_map_from_multi_union_pw_aff>
2438is not allowed to be zero-dimensional.  The domain of the result
2439is the shared domain of the union piecewise affine elements.
2440C<isl_multi_aff_as_set> and C<isl_set_from_multi_aff> perform
2441the same operation.
2442Similarly for the pair C<isl_multi_aff_as_map> and C<isl_map_from_multi_aff>,
2443for the pair C<isl_pw_aff_as_map> and C<isl_map_from_pw_aff>,
2444for the pair C<isl_pw_multi_aff_as_set> and C<isl_set_from_pw_multi_aff>,
2445for the pair C<isl_pw_multi_aff_as_map> and C<isl_map_from_pw_multi_aff>,
2446the pair C<isl_multi_pw_aff_as_set> and C<isl_set_from_multi_pw_aff>,
2447the pair C<isl_multi_pw_aff_as_map> and C<isl_map_from_multi_pw_aff>,
2448and
2449C<isl_union_pw_multi_aff_as_union_map> and
2450C<isl_union_map_from_union_pw_multi_aff>.
2451
2452=head2 Inspecting Sets and Relations
2453
2454Usually, the user should not have to care about the actual constraints
2455of the sets and maps, but should instead apply the abstract operations
2456explained in the following sections.
2457Occasionally, however, it may be required to inspect the individual
2458coefficients of the constraints.  This section explains how to do so.
2459In these cases, it may also be useful to have C<isl> compute
2460an explicit representation of the existentially quantified variables.
2461
2462	__isl_give isl_set *isl_set_compute_divs(
2463		__isl_take isl_set *set);
2464	__isl_give isl_map *isl_map_compute_divs(
2465		__isl_take isl_map *map);
2466	__isl_give isl_union_set *isl_union_set_compute_divs(
2467		__isl_take isl_union_set *uset);
2468	__isl_give isl_union_map *isl_union_map_compute_divs(
2469		__isl_take isl_union_map *umap);
2470
2471This explicit representation defines the existentially quantified
2472variables as integer divisions of the other variables, possibly
2473including earlier existentially quantified variables.
2474An explicitly represented existentially quantified variable therefore
2475has a unique value when the values of the other variables are known.
2476
2477Alternatively, the existentially quantified variables can be removed
2478using the following functions, which compute an overapproximation.
2479
2480	#include <isl/set.h>
2481	__isl_give isl_basic_set *isl_basic_set_remove_divs(
2482		__isl_take isl_basic_set *bset);
2483	__isl_give isl_set *isl_set_remove_divs(
2484		__isl_take isl_set *set);
2485
2486	#include <isl/map.h>
2487	__isl_give isl_basic_map *isl_basic_map_remove_divs(
2488		__isl_take isl_basic_map *bmap);
2489	__isl_give isl_map *isl_map_remove_divs(
2490		__isl_take isl_map *map);
2491
2492	#include <isl/union_set.h>
2493	__isl_give isl_union_set *isl_union_set_remove_divs(
2494		__isl_take isl_union_set *bset);
2495
2496	#include <isl/union_map.h>
2497	__isl_give isl_union_map *isl_union_map_remove_divs(
2498		__isl_take isl_union_map *bmap);
2499
2500It is also possible to only remove those divs that are defined
2501in terms of a given range of dimensions or only those for which
2502no explicit representation is known.
2503
2504	__isl_give isl_basic_set *
2505	isl_basic_set_remove_divs_involving_dims(
2506		__isl_take isl_basic_set *bset,
2507		enum isl_dim_type type,
2508		unsigned first, unsigned n);
2509	__isl_give isl_basic_map *
2510	isl_basic_map_remove_divs_involving_dims(
2511		__isl_take isl_basic_map *bmap,
2512		enum isl_dim_type type,
2513		unsigned first, unsigned n);
2514	__isl_give isl_set *isl_set_remove_divs_involving_dims(
2515		__isl_take isl_set *set, enum isl_dim_type type,
2516		unsigned first, unsigned n);
2517	__isl_give isl_map *isl_map_remove_divs_involving_dims(
2518		__isl_take isl_map *map, enum isl_dim_type type,
2519		unsigned first, unsigned n);
2520
2521	__isl_give isl_basic_set *
2522	isl_basic_set_remove_unknown_divs(
2523		__isl_take isl_basic_set *bset);
2524	__isl_give isl_set *isl_set_remove_unknown_divs(
2525		__isl_take isl_set *set);
2526	__isl_give isl_map *isl_map_remove_unknown_divs(
2527		__isl_take isl_map *map);
2528
2529To iterate over all the sets or maps in a union set or map, use
2530
2531	#include <isl/union_set.h>
2532	isl_stat isl_union_set_foreach_set(
2533		__isl_keep isl_union_set *uset,
2534		isl_stat (*fn)(__isl_take isl_set *set, void *user),
2535		void *user);
2536	isl_bool isl_union_set_every_set(
2537		__isl_keep isl_union_set *uset,
2538		isl_bool (*test)(__isl_keep isl_set *set,
2539			void *user),
2540		void *user);
2541
2542	#include <isl/union_map.h>
2543	isl_stat isl_union_map_foreach_map(
2544		__isl_keep isl_union_map *umap,
2545		isl_stat (*fn)(__isl_take isl_map *map, void *user),
2546		void *user);
2547	isl_bool isl_union_map_every_map(
2548		__isl_keep isl_union_map *umap,
2549		isl_bool (*test)(__isl_keep isl_map *map,
2550			void *user),
2551		void *user);
2552
2553These functions call the callback function once for each
2554(pair of) space(s) for which there are elements in the input.
2555The argument to the callback contains all elements in the input
2556with that (pair of) space(s).
2557The C<isl_union_set_every_set> and
2558C<isl_union_map_every_map> variants check whether each
2559call to the callback returns true and stops checking as soon as one
2560of these calls returns false.
2561
2562The number of sets or maps in a union set or map can be obtained
2563from
2564
2565	isl_size isl_union_set_n_set(__isl_keep isl_union_set *uset);
2566	isl_size isl_union_map_n_map(__isl_keep isl_union_map *umap);
2567
2568To extract the set or map in a given space from a union, use
2569
2570	__isl_give isl_set *isl_union_set_extract_set(
2571		__isl_keep isl_union_set *uset,
2572		__isl_take isl_space *space);
2573	__isl_give isl_map *isl_union_map_extract_map(
2574		__isl_keep isl_union_map *umap,
2575		__isl_take isl_space *space);
2576
2577To iterate over all the basic sets or maps in a set or map, use
2578
2579	isl_stat isl_set_foreach_basic_set(__isl_keep isl_set *set,
2580		isl_stat (*fn)(__isl_take isl_basic_set *bset,
2581			void *user),
2582		void *user);
2583	isl_stat isl_map_foreach_basic_map(__isl_keep isl_map *map,
2584		isl_stat (*fn)(__isl_take isl_basic_map *bmap,
2585			void *user),
2586		void *user);
2587
2588The callback function C<fn> should return C<isl_stat_ok> if successful and
2589C<isl_stat_error> if an error occurs.  In the latter case, or if any other error
2590occurs, the above functions will return C<isl_stat_error>.
2591
2592It should be noted that C<isl> does not guarantee that
2593the basic sets or maps passed to C<fn> are disjoint.
2594If this is required, then the user should call one of
2595the following functions first.
2596
2597	__isl_give isl_set *isl_set_make_disjoint(
2598		__isl_take isl_set *set);
2599	__isl_give isl_map *isl_map_make_disjoint(
2600		__isl_take isl_map *map);
2601
2602The number of basic sets in a set can be obtained
2603or the number of basic maps in a map can be obtained
2604from
2605
2606	#include <isl/set.h>
2607	isl_size isl_set_n_basic_set(__isl_keep isl_set *set);
2608
2609	#include <isl/map.h>
2610	isl_size isl_map_n_basic_map(__isl_keep isl_map *map);
2611
2612It is also possible to obtain a list of (basic) sets from a set
2613or union set, a list of basic maps from a map and a list of maps from a union
2614map.
2615
2616	#include <isl/set.h>
2617	__isl_give isl_basic_set_list *isl_set_get_basic_set_list(
2618		__isl_keep isl_set *set);
2619
2620	#include <isl/union_set.h>
2621	__isl_give isl_basic_set_list *
2622	isl_union_set_get_basic_set_list(
2623		__isl_keep isl_union_set *uset);
2624	__isl_give isl_set_list *isl_union_set_get_set_list(
2625		__isl_keep isl_union_set *uset);
2626
2627	#include <isl/map.h>
2628	__isl_give isl_basic_map_list *isl_map_get_basic_map_list(
2629		__isl_keep isl_map *map);
2630
2631	#include <isl/union_map.h>
2632	__isl_give isl_map_list *isl_union_map_get_map_list(
2633		__isl_keep isl_union_map *umap);
2634
2635The returned list can be manipulated using the functions in L<"Lists">.
2636
2637To iterate over the constraints of a basic set or map, use
2638
2639	#include <isl/constraint.h>
2640
2641	isl_size isl_basic_set_n_constraint(
2642		__isl_keep isl_basic_set *bset);
2643	isl_stat isl_basic_set_foreach_constraint(
2644		__isl_keep isl_basic_set *bset,
2645		isl_stat (*fn)(__isl_take isl_constraint *c,
2646			void *user),
2647		void *user);
2648	isl_size isl_basic_map_n_constraint(
2649		__isl_keep isl_basic_map *bmap);
2650	isl_stat isl_basic_map_foreach_constraint(
2651		__isl_keep isl_basic_map *bmap,
2652		isl_stat (*fn)(__isl_take isl_constraint *c,
2653			void *user),
2654		void *user);
2655	__isl_null isl_constraint *isl_constraint_free(
2656		__isl_take isl_constraint *c);
2657
2658Again, the callback function C<fn> should return C<isl_stat_ok>
2659if successful and
2660C<isl_stat_error> if an error occurs.  In the latter case, or if any other error
2661occurs, the above functions will return C<isl_stat_error>.
2662The constraint C<c> represents either an equality or an inequality.
2663Use the following function to find out whether a constraint
2664represents an equality.  If not, it represents an inequality.
2665
2666	isl_bool isl_constraint_is_equality(
2667		__isl_keep isl_constraint *constraint);
2668
2669It is also possible to obtain a list of constraints from a basic
2670map or set
2671
2672	#include <isl/constraint.h>
2673	__isl_give isl_constraint_list *
2674	isl_basic_map_get_constraint_list(
2675		__isl_keep isl_basic_map *bmap);
2676	__isl_give isl_constraint_list *
2677	isl_basic_set_get_constraint_list(
2678		__isl_keep isl_basic_set *bset);
2679
2680These functions require that all existentially quantified variables
2681have an explicit representation.
2682The returned list can be manipulated using the functions in L<"Lists">.
2683
2684The coefficients of the constraints can be inspected using
2685the following functions.
2686
2687	isl_bool isl_constraint_is_lower_bound(
2688		__isl_keep isl_constraint *constraint,
2689		enum isl_dim_type type, unsigned pos);
2690	isl_bool isl_constraint_is_upper_bound(
2691		__isl_keep isl_constraint *constraint,
2692		enum isl_dim_type type, unsigned pos);
2693	__isl_give isl_val *isl_constraint_get_constant_val(
2694		__isl_keep isl_constraint *constraint);
2695	__isl_give isl_val *isl_constraint_get_coefficient_val(
2696		__isl_keep isl_constraint *constraint,
2697		enum isl_dim_type type, int pos);
2698
2699The explicit representations of the existentially quantified
2700variables can be inspected using the following function.
2701Note that the user is only allowed to use this function
2702if the inspected set or map is the result of a call
2703to C<isl_set_compute_divs> or C<isl_map_compute_divs>.
2704The existentially quantified variable is equal to the floor
2705of the returned affine expression.  The affine expression
2706itself can be inspected using the functions in
2707L</"Functions">.
2708
2709	__isl_give isl_aff *isl_constraint_get_div(
2710		__isl_keep isl_constraint *constraint, int pos);
2711
2712To obtain the constraints of a basic set or map in matrix
2713form, use the following functions.
2714
2715	__isl_give isl_mat *isl_basic_set_equalities_matrix(
2716		__isl_keep isl_basic_set *bset,
2717		enum isl_dim_type c1, enum isl_dim_type c2,
2718		enum isl_dim_type c3, enum isl_dim_type c4);
2719	__isl_give isl_mat *isl_basic_set_inequalities_matrix(
2720		__isl_keep isl_basic_set *bset,
2721		enum isl_dim_type c1, enum isl_dim_type c2,
2722		enum isl_dim_type c3, enum isl_dim_type c4);
2723	__isl_give isl_mat *isl_basic_map_equalities_matrix(
2724		__isl_keep isl_basic_map *bmap,
2725		enum isl_dim_type c1,
2726		enum isl_dim_type c2, enum isl_dim_type c3,
2727		enum isl_dim_type c4, enum isl_dim_type c5);
2728	__isl_give isl_mat *isl_basic_map_inequalities_matrix(
2729		__isl_keep isl_basic_map *bmap,
2730		enum isl_dim_type c1,
2731		enum isl_dim_type c2, enum isl_dim_type c3,
2732		enum isl_dim_type c4, enum isl_dim_type c5);
2733
2734The C<isl_dim_type> arguments dictate the order in which
2735different kinds of variables appear in the resulting matrix.
2736For set inputs, they should be a permutation of
2737C<isl_dim_cst> (the constant term), C<isl_dim_param>, C<isl_dim_set> and
2738C<isl_dim_div>.
2739For map inputs, they should be a permutation of
2740C<isl_dim_cst>, C<isl_dim_param>,
2741C<isl_dim_in>, C<isl_dim_out> and C<isl_dim_div>.
2742
2743=head2 Points
2744
2745Points are elements of a set.  They can be used to construct
2746simple sets (boxes) or they can be used to represent the
2747individual elements of a set.
2748The zero point (the origin) can be created using
2749
2750	__isl_give isl_point *isl_point_zero(__isl_take isl_space *space);
2751
2752The coordinates of a point can be inspected, set and changed
2753using
2754
2755	#include <isl/point.h>
2756	__isl_give isl_multi_val *isl_point_get_multi_val(
2757		__isl_keep isl_point *pnt);
2758	__isl_give isl_val *isl_point_get_coordinate_val(
2759		__isl_keep isl_point *pnt,
2760		enum isl_dim_type type, int pos);
2761	__isl_give isl_point *isl_point_set_coordinate_val(
2762		__isl_take isl_point *pnt,
2763		enum isl_dim_type type, int pos,
2764		__isl_take isl_val *v);
2765
2766	__isl_give isl_point *isl_point_add_ui(
2767		__isl_take isl_point *pnt,
2768		enum isl_dim_type type, int pos, unsigned val);
2769	__isl_give isl_point *isl_point_sub_ui(
2770		__isl_take isl_point *pnt,
2771		enum isl_dim_type type, int pos, unsigned val);
2772
2773Points can be copied or freed using
2774
2775	__isl_give isl_point *isl_point_copy(
2776		__isl_keep isl_point *pnt);
2777	__isl_null isl_point *isl_point_free(
2778		__isl_take isl_point *pnt);
2779
2780A singleton set can be created from a point using the following functions.
2781
2782	__isl_give isl_basic_set *isl_basic_set_from_point(
2783		__isl_take isl_point *pnt);
2784	__isl_give isl_set *isl_point_to_set(
2785		__isl_take isl_point *pnt);
2786	__isl_give isl_set *isl_set_from_point(
2787		__isl_take isl_point *pnt);
2788	__isl_give isl_union_set *isl_union_set_from_point(
2789		__isl_take isl_point *pnt);
2790
2791C<isl_point_to_set> and C<isl_set_from_point> perform
2792the same operation.
2793
2794A box can be created from two opposite extremal points using
2795
2796	__isl_give isl_basic_set *isl_basic_set_box_from_points(
2797		__isl_take isl_point *pnt1,
2798		__isl_take isl_point *pnt2);
2799	__isl_give isl_set *isl_set_box_from_points(
2800		__isl_take isl_point *pnt1,
2801		__isl_take isl_point *pnt2);
2802
2803All elements of a B<bounded> (union) set can be enumerated using
2804the following functions.
2805
2806	isl_stat isl_set_foreach_point(__isl_keep isl_set *set,
2807		isl_stat (*fn)(__isl_take isl_point *pnt,
2808			void *user),
2809		void *user);
2810	isl_stat isl_union_set_foreach_point(
2811		__isl_keep isl_union_set *uset,
2812		isl_stat (*fn)(__isl_take isl_point *pnt,
2813			void *user),
2814		void *user);
2815
2816The function C<fn> is called for each integer point in
2817C<set> with as second argument the last argument of
2818the C<isl_set_foreach_point> call.  The function C<fn>
2819should return C<isl_stat_ok> on success and C<isl_stat_error> on failure.
2820In the latter case, C<isl_set_foreach_point> will stop
2821enumerating and return C<isl_stat_error> as well.
2822If the enumeration is performed successfully and to completion,
2823then C<isl_set_foreach_point> returns C<isl_stat_ok>.
2824
2825To obtain a single point of a (basic or union) set, use
2826
2827	__isl_give isl_point *isl_basic_set_sample_point(
2828		__isl_take isl_basic_set *bset);
2829	__isl_give isl_point *isl_set_sample_point(
2830		__isl_take isl_set *set);
2831	__isl_give isl_point *isl_union_set_sample_point(
2832		__isl_take isl_union_set *uset);
2833
2834If C<set> does not contain any (integer) points, then the
2835resulting point will be ``void'', a property that can be
2836tested using
2837
2838	isl_bool isl_point_is_void(__isl_keep isl_point *pnt);
2839
2840=head2 Functions
2841
2842Besides sets and relation, C<isl> also supports various types of functions.
2843Each of these types is derived from the value type (see L</"Values">)
2844or from one of two primitive function types
2845through the application of zero or more type constructors.
2846As a special case, a multiple expression can also be derived
2847from an identifier (see L</"Identifiers">) although the result
2848is not really a function.
2849We first describe the primitive type and then we describe
2850the types derived from these primitive types.
2851
2852=head3 Primitive Functions
2853
2854C<isl> support two primitive function types, quasi-affine
2855expressions and quasipolynomials.
2856A quasi-affine expression is defined either over a parameter
2857space or over a set and is composed of integer constants,
2858parameters and set variables, addition, subtraction and
2859integer division by an integer constant.
2860For example, the quasi-affine expression
2861
2862	[n] -> { [x] -> [2*floor((4 n + x)/9)] }
2863
2864maps C<x> to C<2*floor((4 n + x)/9>.
2865A quasipolynomial is a polynomial expression in quasi-affine
2866expression.  That is, it additionally allows for multiplication.
2867Note, though, that it is not allowed to construct an integer
2868division of an expression involving multiplications.
2869Here is an example of a quasipolynomial that is not
2870quasi-affine expression
2871
2872	[n] -> { [x] -> (n*floor((4 n + x)/9)) }
2873
2874Note that the external representations of quasi-affine expressions
2875and quasipolynomials are different.  Quasi-affine expressions
2876use a notation with square brackets just like binary relations,
2877while quasipolynomials do not.  This might change at some point.
2878
2879If a primitive function is defined over a parameter space,
2880then the space of the function itself is that of a set.
2881If it is defined over a set, then the space of the function
2882is that of a relation.  In both cases, the set space (or
2883the output space) is single-dimensional, anonymous and unstructured.
2884To create functions with multiple dimensions or with other kinds
2885of set or output spaces, use multiple expressions
2886(see L</"Multiple Expressions">).
2887
2888=over
2889
2890=item * Quasi-affine Expressions
2891
2892Besides the expressions described above, a quasi-affine
2893expression can also be set to NaN.  Such expressions
2894typically represent a failure to represent a result
2895as a quasi-affine expression.
2896
2897The zero quasi affine expression or the quasi affine expression
2898that is equal to a given value, parameter or
2899a specified dimension on a given domain can be created using
2900
2901	#include <isl/aff.h>
2902	__isl_give isl_aff *isl_aff_zero_on_domain_space(
2903		__isl_take isl_space *space);
2904	__isl_give isl_aff *isl_space_zero_aff_on_domain(
2905		__isl_take isl_space *space);
2906	__isl_give isl_aff *isl_aff_zero_on_domain(
2907		__isl_take isl_local_space *ls);
2908	__isl_give isl_aff *isl_aff_val_on_domain_space(
2909		__isl_take isl_space *space,
2910		__isl_take isl_val *val);
2911	__isl_give isl_aff *isl_aff_val_on_domain(
2912		__isl_take isl_local_space *ls,
2913		__isl_take isl_val *val);
2914	__isl_give isl_aff *isl_aff_param_on_domain_space_id(
2915		__isl_take isl_space *space,
2916		__isl_take isl_id *id);
2917	__isl_give isl_aff *isl_space_param_aff_on_domain_id(
2918		__isl_take isl_space *space,
2919		__isl_take isl_id *id);
2920	__isl_give isl_aff *isl_aff_var_on_domain(
2921		__isl_take isl_local_space *ls,
2922		enum isl_dim_type type, unsigned pos);
2923	__isl_give isl_aff *isl_aff_nan_on_domain_space(
2924		__isl_take isl_space *space);
2925	__isl_give isl_aff *isl_aff_nan_on_domain(
2926		__isl_take isl_local_space *ls);
2927
2928The space passed to C<isl_aff_param_on_domain_space_id>
2929is required to have a parameter with the given identifier.
2930C<isl_aff_param_on_domain_space_id> and
2931C<isl_space_param_aff_on_domain_id> perform the same operation.
2932
2933C<isl_aff_zero_on_domain_space> and C<isl_space_zero_aff_on_domain>
2934perform the same operation.
2935
2936Quasi affine expressions can be copied and freed using
2937
2938	#include <isl/aff.h>
2939	__isl_give isl_aff *isl_aff_copy(
2940		__isl_keep isl_aff *aff);
2941	__isl_null isl_aff *isl_aff_free(
2942		__isl_take isl_aff *aff);
2943
2944A (rational) bound on a dimension can be extracted from an C<isl_constraint>
2945using the following function.  The constraint is required to have
2946a non-zero coefficient for the specified dimension.
2947
2948	#include <isl/constraint.h>
2949	__isl_give isl_aff *isl_constraint_get_bound(
2950		__isl_keep isl_constraint *constraint,
2951		enum isl_dim_type type, int pos);
2952
2953The entire affine expression of the constraint can also be extracted
2954using the following function.
2955
2956	#include <isl/constraint.h>
2957	__isl_give isl_aff *isl_constraint_get_aff(
2958		__isl_keep isl_constraint *constraint);
2959
2960Conversely, an equality constraint equating
2961the affine expression to zero or an inequality constraint enforcing
2962the affine expression to be non-negative, can be constructed using
2963
2964	__isl_give isl_constraint *isl_equality_from_aff(
2965		__isl_take isl_aff *aff);
2966	__isl_give isl_constraint *isl_inequality_from_aff(
2967		__isl_take isl_aff *aff);
2968
2969The coefficients and the integer divisions of an affine expression
2970can be inspected using the following functions.
2971
2972	#include <isl/aff.h>
2973	__isl_give isl_val *isl_aff_get_constant_val(
2974		__isl_keep isl_aff *aff);
2975	__isl_give isl_val *isl_aff_get_coefficient_val(
2976		__isl_keep isl_aff *aff,
2977		enum isl_dim_type type, int pos);
2978	int isl_aff_coefficient_sgn(__isl_keep isl_aff *aff,
2979		enum isl_dim_type type, int pos);
2980	__isl_give isl_val *isl_aff_get_denominator_val(
2981		__isl_keep isl_aff *aff);
2982	__isl_give isl_aff *isl_aff_get_div(
2983		__isl_keep isl_aff *aff, int pos);
2984
2985They can be modified using the following functions.
2986
2987	#include <isl/aff.h>
2988	__isl_give isl_aff *isl_aff_set_constant_si(
2989		__isl_take isl_aff *aff, int v);
2990	__isl_give isl_aff *isl_aff_set_constant_val(
2991		__isl_take isl_aff *aff, __isl_take isl_val *v);
2992	__isl_give isl_aff *isl_aff_set_coefficient_si(
2993		__isl_take isl_aff *aff,
2994		enum isl_dim_type type, int pos, int v);
2995	__isl_give isl_aff *isl_aff_set_coefficient_val(
2996		__isl_take isl_aff *aff,
2997		enum isl_dim_type type, int pos,
2998		__isl_take isl_val *v);
2999
3000	__isl_give isl_aff *isl_aff_add_constant_si(
3001		__isl_take isl_aff *aff, int v);
3002	__isl_give isl_aff *isl_aff_add_constant_val(
3003		__isl_take isl_aff *aff, __isl_take isl_val *v);
3004	__isl_give isl_aff *isl_aff_add_constant_num_si(
3005		__isl_take isl_aff *aff, int v);
3006	__isl_give isl_aff *isl_aff_add_coefficient_si(
3007		__isl_take isl_aff *aff,
3008		enum isl_dim_type type, int pos, int v);
3009	__isl_give isl_aff *isl_aff_add_coefficient_val(
3010		__isl_take isl_aff *aff,
3011		enum isl_dim_type type, int pos,
3012		__isl_take isl_val *v);
3013
3014Note that C<isl_aff_set_constant_si> and C<isl_aff_set_coefficient_si>
3015set the I<numerator> of the constant or coefficient, while
3016C<isl_aff_set_constant_val> and C<isl_aff_set_coefficient_val> set
3017the constant or coefficient as a whole.
3018The C<add_constant> and C<add_coefficient> functions add an integer
3019or rational value to
3020the possibly rational constant or coefficient.
3021The C<add_constant_num> functions add an integer value to
3022the numerator.
3023
3024=item * Quasipolynomials
3025
3026Some simple quasipolynomials can be created using the following functions.
3027
3028	#include <isl/polynomial.h>
3029	__isl_give isl_qpolynomial *isl_qpolynomial_zero_on_domain(
3030		__isl_take isl_space *domain);
3031	__isl_give isl_qpolynomial *isl_qpolynomial_one_on_domain(
3032		__isl_take isl_space *domain);
3033	__isl_give isl_qpolynomial *isl_qpolynomial_infty_on_domain(
3034		__isl_take isl_space *domain);
3035	__isl_give isl_qpolynomial *isl_qpolynomial_neginfty_on_domain(
3036		__isl_take isl_space *domain);
3037	__isl_give isl_qpolynomial *isl_qpolynomial_nan_on_domain(
3038		__isl_take isl_space *domain);
3039	__isl_give isl_qpolynomial *isl_qpolynomial_val_on_domain(
3040		__isl_take isl_space *domain,
3041		__isl_take isl_val *val);
3042	__isl_give isl_qpolynomial *isl_qpolynomial_var_on_domain(
3043		__isl_take isl_space *domain,
3044		enum isl_dim_type type, unsigned pos);
3045	__isl_give isl_qpolynomial *isl_qpolynomial_from_aff(
3046		__isl_take isl_aff *aff);
3047
3048Recall that the space in which a quasipolynomial lives is a map space
3049with a one-dimensional range.  The C<domain> argument in some of
3050the functions above corresponds to the domain of this map space.
3051
3052Quasipolynomials can be copied and freed again using the following
3053functions.
3054
3055	#include <isl/polynomial.h>
3056	__isl_give isl_qpolynomial *isl_qpolynomial_copy(
3057		__isl_keep isl_qpolynomial *qp);
3058	__isl_null isl_qpolynomial *isl_qpolynomial_free(
3059		__isl_take isl_qpolynomial *qp);
3060
3061The constant term of a quasipolynomial can be extracted using
3062
3063	__isl_give isl_val *isl_qpolynomial_get_constant_val(
3064		__isl_keep isl_qpolynomial *qp);
3065
3066To iterate over all terms in a quasipolynomial,
3067use
3068
3069	isl_stat isl_qpolynomial_foreach_term(
3070		__isl_keep isl_qpolynomial *qp,
3071		isl_stat (*fn)(__isl_take isl_term *term,
3072			  void *user), void *user);
3073
3074The terms themselves can be inspected and freed using
3075these functions
3076
3077	isl_size isl_term_dim(__isl_keep isl_term *term,
3078		enum isl_dim_type type);
3079	__isl_give isl_val *isl_term_get_coefficient_val(
3080		__isl_keep isl_term *term);
3081	isl_size isl_term_get_exp(__isl_keep isl_term *term,
3082		enum isl_dim_type type, unsigned pos);
3083	__isl_give isl_aff *isl_term_get_div(
3084		__isl_keep isl_term *term, unsigned pos);
3085	__isl_null isl_term *isl_term_free(
3086		__isl_take isl_term *term);
3087
3088Each term is a product of parameters, set variables and
3089integer divisions.  The function C<isl_term_get_exp>
3090returns the exponent of a given dimensions in the given term.
3091
3092=back
3093
3094=head3 Reductions
3095
3096A reduction represents a maximum or a minimum of its
3097base expressions.
3098The only reduction type defined by C<isl> is
3099C<isl_qpolynomial_fold>.
3100
3101There are currently no functions to directly create such
3102objects, but they do appear in the piecewise quasipolynomial
3103reductions returned by the C<isl_pw_qpolynomial_bound> function.
3104See
3105L</"Bounds on Piecewise Quasipolynomials and Piecewise Quasipolynomial Reductions">.
3106
3107Reductions can be copied and freed using
3108the following functions.
3109
3110	#include <isl/polynomial.h>
3111	__isl_give isl_qpolynomial_fold *
3112	isl_qpolynomial_fold_copy(
3113		__isl_keep isl_qpolynomial_fold *fold);
3114	__isl_null isl_qpolynomial_fold *
3115	isl_qpolynomial_fold_free(
3116		__isl_take isl_qpolynomial_fold *fold);
3117
3118The type of a (union piecewise) reduction
3119can be obtained using the following functions.
3120
3121	#include <isl/polynomial.h>
3122	enum isl_fold isl_qpolynomial_fold_get_type(
3123		__isl_keep isl_qpolynomial_fold *fold);
3124	enum isl_fold isl_pw_qpolynomial_fold_get_type(
3125		__isl_keep isl_pw_qpolynomial_fold *pwf);
3126	enum isl_fold isl_union_pw_qpolynomial_fold_get_type(
3127		__isl_keep isl_union_pw_qpolynomial_fold *upwf);
3128
3129The type may be either C<isl_fold_min> or C<isl_fold_max>
3130(or C<isl_fold_error> in case of error).
3131
3132To iterate over all quasipolynomials in a reduction, use
3133
3134	isl_stat isl_qpolynomial_fold_foreach_qpolynomial(
3135		__isl_keep isl_qpolynomial_fold *fold,
3136		isl_stat (*fn)(__isl_take isl_qpolynomial *qp,
3137			  void *user), void *user);
3138
3139=head3 Multiple Expressions
3140
3141A multiple expression represents a sequence of zero or
3142more base expressions, all defined on the same domain space.
3143The domain space of the multiple expression is the same
3144as that of the base expressions, but the range space
3145can be any space.  In case the base expressions have
3146a set space, the corresponding multiple expression
3147also has a set space.
3148Objects of the value or identifier type do not have an associated space.
3149The space of a multiple value or
3150multiple identifier is therefore always a set space.
3151Similarly, the space of a multiple union piecewise
3152affine expression is always a set space.
3153If the base expressions are not total, then
3154a corresponding zero-dimensional multiple expression may
3155have an explicit domain that keeps track of the domain
3156outside of any base expressions.
3157
3158The multiple expression types defined by C<isl>
3159are C<isl_multi_val>, C<isl_multi_id>, C<isl_multi_aff>, C<isl_multi_pw_aff>,
3160C<isl_multi_union_pw_aff>.
3161
3162A multiple expression with the value zero for
3163each output (or set) dimension can be created
3164using the following functions.
3165
3166	#include <isl/val.h>
3167	__isl_give isl_multi_val *isl_multi_val_zero(
3168		__isl_take isl_space *space);
3169	__isl_give isl_multi_val *isl_space_zero_multi_val(
3170		__isl_take isl_space *space);
3171
3172	#include <isl/aff.h>
3173	__isl_give isl_multi_aff *isl_multi_aff_zero(
3174		__isl_take isl_space *space);
3175	__isl_give isl_multi_aff *isl_space_zero_multi_aff(
3176		__isl_take isl_space *space);
3177	__isl_give isl_multi_pw_aff *isl_multi_pw_aff_zero(
3178		__isl_take isl_space *space);
3179	__isl_give isl_multi_pw_aff *isl_space_zero_multi_pw_aff(
3180		__isl_take isl_space *space);
3181	__isl_give isl_multi_union_pw_aff *
3182	isl_multi_union_pw_aff_zero(
3183		__isl_take isl_space *space);
3184	__isl_give isl_multi_union_pw_aff *
3185	isl_space_zero_multi_union_pw_aff(
3186		__isl_take isl_space *space);
3187
3188Since there is no canonical way of representing a zero
3189value of type C<isl_union_pw_aff>, the space passed
3190to C<isl_multi_union_pw_aff_zero> needs to be zero-dimensional.
3191C<isl_multi_val_zero> and C<isl_space_zero_multi_val>
3192perform the same operation.
3193Similarly
3194for the pair C<isl_multi_aff_zero> and C<isl_space_zero_multi_aff>,
3195for the pair C<isl_multi_pw_aff_zero> and C<isl_space_zero_multi_pw_aff> and
3196for the pair C<isl_multi_union_pw_aff_zero> and
3197C<isl_space_zero_multi_union_pw_aff>.
3198
3199
3200An identity function can be created using the following
3201functions.
3202For the first group of functions, the space needs to be that of a set.
3203For the second group,
3204the space needs to be that of a relation
3205with the same number of input and output dimensions.
3206For the third group, the input function needs to live in a space
3207with the same number of input and output dimensions and
3208the identity function is created in that space.
3209
3210	#include <isl/aff.h>
3211	__isl_give isl_multi_aff *
3212	isl_multi_aff_identity_on_domain_space(
3213		__isl_take isl_space *space);
3214	__isl_give isl_multi_aff *
3215	isl_space_identity_multi_aff_on_domain(
3216		__isl_take isl_space *space);
3217	__isl_give isl_multi_pw_aff *
3218	isl_multi_pw_aff_identity_on_domain_space(
3219		__isl_take isl_space *space);
3220	__isl_give isl_multi_pw_aff *
3221	isl_space_identity_multi_pw_aff_on_domain(
3222		__isl_take isl_space *space);
3223	__isl_give isl_multi_aff *isl_multi_aff_identity(
3224		__isl_take isl_space *space);
3225	__isl_give isl_multi_pw_aff *isl_multi_pw_aff_identity(
3226		__isl_take isl_space *space);
3227	__isl_give isl_multi_aff *
3228	isl_multi_aff_identity_multi_aff(
3229		__isl_take isl_multi_aff *ma);
3230	__isl_give isl_multi_pw_aff *
3231	isl_multi_pw_aff_identity_multi_pw_aff(
3232		__isl_take isl_multi_pw_aff *mpa);
3233
3234C<isl_multi_aff_identity_on_domain_space> and
3235C<isl_space_identity_multi_aff_on_domain>
3236perform the same operation.
3237Similarly
3238for the pair C<isl_multi_pw_aff_identity_on_domain_space> and
3239C<isl_space_identity_multi_pw_aff_on_domain>.
3240
3241A function that performs a projection on a universe
3242relation or set can be created using the following functions.
3243See also the corresponding
3244projection operations in L</"Unary Operations">.
3245
3246	#include <isl/aff.h>
3247	__isl_give isl_multi_aff *isl_multi_aff_domain_map(
3248		__isl_take isl_space *space);
3249	__isl_give isl_multi_aff *isl_space_domain_map_multi_aff(
3250		__isl_take isl_space *space);
3251	__isl_give isl_multi_aff *isl_multi_aff_range_map(
3252		__isl_take isl_space *space);
3253	__isl_give isl_multi_aff *isl_space_range_map_multi_aff(
3254		__isl_take isl_space *space);
3255	__isl_give isl_multi_aff *isl_multi_aff_project_out_map(
3256		__isl_take isl_space *space,
3257		enum isl_dim_type type,
3258		unsigned first, unsigned n);
3259
3260C<isl_multi_aff_domain_map> and C<isl_space_domain_map_multi_aff> perform
3261the same operation.
3262Similarly
3263for the pair C<isl_multi_aff_range_map> and C<isl_space_range_map_multi_aff>.
3264
3265A multiple expression can be created from a single
3266base expression using the following functions.
3267The space of the created multiple expression is the same
3268as that of the base expression, except for
3269C<isl_multi_union_pw_aff_from_union_pw_aff> where the input
3270lives in a parameter space and the output lives
3271in a single-dimensional set space.
3272
3273	#include <isl/aff.h>
3274	__isl_give isl_multi_aff *isl_multi_aff_from_aff(
3275		__isl_take isl_aff *aff);
3276	__isl_give isl_multi_pw_aff *isl_multi_pw_aff_from_pw_aff(
3277		__isl_take isl_pw_aff *pa);
3278	__isl_give isl_multi_union_pw_aff *
3279	isl_multi_union_pw_aff_from_union_pw_aff(
3280		__isl_take isl_union_pw_aff *upa);
3281
3282A multiple expression can be created from a list
3283of base expression in a specified space.
3284The domain of this space needs to be the same
3285as the domains of the base expressions in the list.
3286If the base expressions have a set space (or no associated space),
3287then this space also needs to be a set space.
3288
3289	#include <isl/id.h>
3290	__isl_give isl_multi_id *isl_multi_id_from_id_list(
3291		__isl_take isl_space *space,
3292		__isl_take isl_id_list *list);
3293	__isl_give isl_multi_id *isl_space_multi_id(
3294		__isl_take isl_space *space,
3295		__isl_take isl_id_list *list);
3296
3297	#include <isl/val.h>
3298	__isl_give isl_multi_val *isl_multi_val_from_val_list(
3299		__isl_take isl_space *space,
3300		__isl_take isl_val_list *list);
3301	__isl_give isl_multi_val *isl_space_multi_val(
3302		__isl_take isl_space *space,
3303		__isl_take isl_val_list *list);
3304
3305	#include <isl/aff.h>
3306	__isl_give isl_multi_aff *isl_multi_aff_from_aff_list(
3307		__isl_take isl_space *space,
3308		__isl_take isl_aff_list *list);
3309	__isl_give isl_multi_aff *isl_space_multi_aff(
3310		__isl_take isl_space *space,
3311		__isl_take isl_aff_list *list);
3312	__isl_give isl_multi_pw_aff *
3313	isl_multi_pw_aff_from_pw_aff_list(
3314		__isl_take isl_space *space,
3315		__isl_take isl_pw_aff_list *list);
3316	__isl_give isl_multi_pw_aff *
3317	isl_space_multi_pw_aff(
3318		__isl_take isl_space *space,
3319		__isl_take isl_pw_aff_list *list);
3320	__isl_give isl_multi_union_pw_aff *
3321	isl_multi_union_pw_aff_from_union_pw_aff_list(
3322		__isl_take isl_space *space,
3323		__isl_take isl_union_pw_aff_list *list);
3324	__isl_give isl_multi_union_pw_aff *
3325	isl_space_multi_union_pw_aff(
3326		__isl_take isl_space *space,
3327		__isl_take isl_union_pw_aff_list *list);
3328
3329C<isl_multi_id_from_id_list> and C<isl_space_multi_id> perform
3330the same operation.
3331Similarly for the pair C<isl_multi_val_from_val_list> and
3332C<isl_space_multi_val>,
3333for the pair C<isl_multi_aff_from_aff_list> and
3334C<isl_space_multi_aff>,
3335for the pair C<isl_multi_pw_aff_from_pw_aff_list> and
3336C<isl_space_multi_pw_aff> and
3337for the pair C<isl_multi_union_pw_aff_from_union_pw_aff_list> and
3338C<isl_space_multi_union_pw_aff>.
3339
3340As a convenience, a multiple piecewise expression can
3341also be created from a multiple expression,
3342or even directly from a single base expression.
3343Each piecewise expression in the result has a single
3344universe cell.
3345
3346	#include <isl/aff.h>
3347	__isl_give isl_multi_pw_aff *isl_multi_pw_aff_from_aff(
3348		__isl_take isl_aff *aff);
3349	__isl_give isl_multi_pw_aff *
3350	isl_multi_aff_to_multi_pw_aff(
3351		__isl_take isl_multi_aff *ma);
3352	__isl_give isl_multi_pw_aff *
3353	isl_multi_pw_aff_from_multi_aff(
3354		__isl_take isl_multi_aff *ma);
3355
3356C<isl_multi_aff_to_multi_pw_aff> and
3357C<isl_multi_pw_aff_from_multi_aff> perform the same operation.
3358
3359Similarly, a multiple union expression can be
3360created from a multiple expression.
3361
3362	#include <isl/aff.h>
3363	__isl_give isl_multi_union_pw_aff *
3364	isl_multi_union_pw_aff_from_multi_aff(
3365		__isl_take isl_multi_aff *ma);
3366	__isl_give isl_multi_union_pw_aff *
3367	isl_multi_aff_to_multi_union_pw_aff(
3368		__isl_take isl_multi_aff *ma);
3369	__isl_give isl_multi_union_pw_aff *
3370	isl_multi_union_pw_aff_from_multi_pw_aff(
3371		__isl_take isl_multi_pw_aff *mpa);
3372
3373C<isl_multi_aff_to_multi_union_pw_aff> and
3374C<isl_multi_union_pw_aff_from_multi_aff> perform the same operation.
3375
3376A multiple quasi-affine expression can be created from
3377a multiple value with a given domain space using the following
3378function.
3379
3380	#include <isl/aff.h>
3381	__isl_give isl_multi_aff *
3382	isl_multi_aff_multi_val_on_domain_space(
3383		__isl_take isl_space *space,
3384		__isl_take isl_multi_val *mv);
3385	__isl_give isl_multi_aff *
3386	isl_space_multi_aff_on_domain_multi_val(
3387		__isl_take isl_space *space,
3388		__isl_take isl_multi_val *mv);
3389	__isl_give isl_multi_aff *
3390	isl_multi_aff_multi_val_on_space(
3391		__isl_take isl_space *space,
3392		__isl_take isl_multi_val *mv);
3393
3394C<isl_space_multi_aff_on_domain_multi_val> and
3395C<isl_multi_aff_multi_val_on_space> are alternative names
3396for C<isl_multi_aff_multi_val_on_domain_space>.
3397
3398Similarly,
3399a multiple union piecewise affine expression can be created from
3400a multiple value with a given domain or
3401a (piecewise) multiple affine expression with a given domain
3402using the following functions.
3403
3404	#include <isl/aff.h>
3405	__isl_give isl_multi_union_pw_aff *
3406	isl_multi_union_pw_aff_multi_val_on_domain(
3407		__isl_take isl_union_set *domain,
3408		__isl_take isl_multi_val *mv);
3409	__isl_give isl_multi_union_pw_aff *
3410	isl_multi_union_pw_aff_multi_aff_on_domain(
3411		__isl_take isl_union_set *domain,
3412		__isl_take isl_multi_aff *ma);
3413	__isl_give isl_multi_union_pw_aff *
3414	isl_multi_union_pw_aff_pw_multi_aff_on_domain(
3415		__isl_take isl_union_set *domain,
3416		__isl_take isl_pw_multi_aff *pma);
3417
3418Multiple expressions can be copied and freed using
3419the following functions.
3420
3421	#include <isl/id.h>
3422	__isl_give isl_multi_id *isl_multi_id_copy(
3423		__isl_keep isl_multi_id *mi);
3424	__isl_null isl_multi_id *isl_multi_id_free(
3425		__isl_take isl_multi_id *mi);
3426
3427	#include <isl/val.h>
3428	__isl_give isl_multi_val *isl_multi_val_copy(
3429		__isl_keep isl_multi_val *mv);
3430	__isl_null isl_multi_val *isl_multi_val_free(
3431		__isl_take isl_multi_val *mv);
3432
3433	#include <isl/aff.h>
3434	__isl_give isl_multi_aff *isl_multi_aff_copy(
3435		__isl_keep isl_multi_aff *maff);
3436	__isl_null isl_multi_aff *isl_multi_aff_free(
3437		__isl_take isl_multi_aff *maff);
3438	__isl_give isl_multi_pw_aff *isl_multi_pw_aff_copy(
3439		__isl_keep isl_multi_pw_aff *mpa);
3440	__isl_null isl_multi_pw_aff *isl_multi_pw_aff_free(
3441		__isl_take isl_multi_pw_aff *mpa);
3442	__isl_give isl_multi_union_pw_aff *
3443	isl_multi_union_pw_aff_copy(
3444		__isl_keep isl_multi_union_pw_aff *mupa);
3445	__isl_null isl_multi_union_pw_aff *
3446	isl_multi_union_pw_aff_free(
3447		__isl_take isl_multi_union_pw_aff *mupa);
3448
3449The number of base expressions in a multiple
3450expression can be obtained using the following functions.
3451
3452	#include <isl/id.h>
3453	int isl_multi_id_size(__isl_keep isl_multi_id *mi);
3454
3455	#include <isl/val.h>
3456	isl_size isl_multi_val_size(__isl_keep isl_multi_val *mv);
3457
3458	#include <isl/aff.h>
3459	isl_size isl_multi_aff_size(
3460		__isl_keep isl_multi_aff *multi);
3461	isl_size isl_multi_pw_aff_size(
3462		__isl_keep isl_multi_pw_aff *mpa);
3463	isl_size isl_multi_union_pw_aff_size(
3464		__isl_keep isl_multi_union_pw_aff *mupa);
3465
3466The base expression at a given position of a multiple
3467expression can be extracted using the following functions.
3468
3469	#include <isl/id.h>
3470	__isl_give isl_id *isl_multi_id_get_at(
3471		__isl_keep isl_multi_id *mi, int pos);
3472	__isl_give isl_id *isl_multi_id_get_id(
3473		__isl_keep isl_multi_id *mi, int pos);
3474
3475	#include <isl/val.h>
3476	__isl_give isl_val *isl_multi_val_get_at(
3477		__isl_keep isl_multi_val *mv, int pos);
3478	__isl_give isl_val *isl_multi_val_get_val(
3479		__isl_keep isl_multi_val *mv, int pos);
3480
3481	#include <isl/aff.h>
3482	__isl_give isl_aff *isl_multi_aff_get_at(
3483		__isl_keep isl_multi_aff *ma, int pos);
3484	__isl_give isl_aff *isl_multi_aff_get_aff(
3485		__isl_keep isl_multi_aff *multi, int pos);
3486	__isl_give isl_pw_aff *isl_multi_pw_aff_get_at(
3487		__isl_keep isl_multi_pw_aff *mpa, int pos);
3488	__isl_give isl_pw_aff *isl_multi_pw_aff_get_pw_aff(
3489		__isl_keep isl_multi_pw_aff *mpa, int pos);
3490	__isl_give isl_union_pw_aff *
3491	isl_multi_union_pw_aff_get_at(
3492		__isl_keep isl_multi_union_pw_aff *mupa, int pos);
3493	__isl_give isl_union_pw_aff *
3494	isl_multi_union_pw_aff_get_union_pw_aff(
3495		__isl_keep isl_multi_union_pw_aff *mupa, int pos);
3496
3497C<isl_multi_id_get_id> is an alternative name for C<isl_multi_id_get_at>.
3498Similarly for the other pairs of functions.
3499
3500The base expression can be replaced using the following functions.
3501
3502	#include <isl/id.h>
3503	__isl_give isl_multi_id *isl_multi_id_set_at(
3504		__isl_take isl_multi_id *mi, int pos,
3505		__isl_take isl_id *id);
3506	__isl_give isl_multi_id *isl_multi_id_set_id(
3507		__isl_take isl_multi_id *mi, int pos,
3508		__isl_take isl_id *id);
3509
3510	#include <isl/val.h>
3511	__isl_give isl_multi_val *isl_multi_val_set_at(
3512		__isl_take isl_multi_val *mv, int pos,
3513		__isl_take isl_val *val);
3514	__isl_give isl_multi_val *isl_multi_val_set_val(
3515		__isl_take isl_multi_val *mv, int pos,
3516		__isl_take isl_val *val);
3517
3518	#include <isl/aff.h>
3519	__isl_give isl_multi_aff *isl_multi_aff_set_at(
3520		__isl_take isl_multi_aff *ma, int pos,
3521		__isl_take isl_aff *aff);
3522	__isl_give isl_multi_aff *isl_multi_aff_set_aff(
3523		__isl_take isl_multi_aff *multi, int pos,
3524		__isl_take isl_aff *aff);
3525	__isl_give isl_multi_pw_aff *isl_multi_pw_aff_set_at(
3526		__isl_take isl_multi_pw_aff *mpa, int pos,
3527		__isl_take isl_pw_aff *pa);
3528	__isl_give isl_multi_pw_aff *isl_multi_pw_aff_set_pw_aff(
3529		__isl_take isl_multi_pw_aff *mpa, int pos,
3530		__isl_take isl_pw_aff *pa);
3531	__isl_give isl_multi_union_pw_aff *
3532	isl_multi_union_pw_aff_set_at(
3533		__isl_take isl_multi_union_pw_aff *mupa, int pos,
3534		__isl_take isl_union_pw_aff *upa);
3535	__isl_give isl_multi_union_pw_aff *
3536	isl_multi_union_pw_aff_set_union_pw_aff(
3537		__isl_take isl_multi_union_pw_aff *mupa, int pos,
3538		__isl_take isl_union_pw_aff *upa);
3539
3540C<isl_multi_id_set_id> is an alternative name for C<isl_multi_id_set_at>.
3541Similarly for the other pairs of functions.
3542
3543A list of all base expressions of a multiple
3544expression can be extracted using the following functions.
3545
3546	#include <isl/id.h>
3547	__isl_give isl_id_list *isl_multi_id_get_list(
3548		__isl_keep isl_multi_id *mi);
3549
3550	#include <isl/val.h>
3551	__isl_give isl_val_list *isl_multi_val_get_list(
3552		__isl_keep isl_multi_val *mv);
3553
3554	#include <isl/aff.h>
3555	__isl_give isl_aff_list *isl_multi_aff_get_list(
3556		__isl_keep isl_multi_aff *multi);
3557	__isl_give isl_pw_aff_list *isl_multi_pw_aff_get_list(
3558		__isl_keep isl_multi_pw_aff *mpa);
3559	__isl_give isl_union_pw_aff_list *
3560	isl_multi_union_pw_aff_list(
3561		__isl_keep isl_multi_union_pw_aff *mupa);
3562
3563The constant terms of the base expressions can be obtained using
3564the following function.
3565
3566	#include <isl/aff.h>
3567	__isl_give isl_multi_val *
3568	isl_multi_aff_get_constant_multi_val(
3569		__isl_keep isl_multi_aff *ma);
3570
3571As a convenience, a sequence of base expressions that have
3572their domains in a given space can be extracted from a sequence
3573of union expressions using the following function.
3574
3575	#include <isl/aff.h>
3576	__isl_give isl_multi_pw_aff *
3577	isl_multi_union_pw_aff_extract_multi_pw_aff(
3578		__isl_keep isl_multi_union_pw_aff *mupa,
3579		__isl_take isl_space *space);
3580
3581Note that there is a difference between C<isl_multi_union_pw_aff>
3582and C<isl_union_pw_multi_aff> objects.  The first is a sequence
3583of unions of piecewise expressions, while the second is a union
3584of piecewise sequences.  In particular, multiple affine expressions
3585in an C<isl_union_pw_multi_aff> may live in different spaces,
3586while there is only a single multiple expression in
3587an C<isl_multi_union_pw_aff>, which can therefore only live
3588in a single space.  This means that not every
3589C<isl_union_pw_multi_aff> can be converted to
3590an C<isl_multi_union_pw_aff>.  Conversely, the elements
3591of an C<isl_multi_union_pw_aff> may be defined over different domains,
3592while each multiple expression inside an C<isl_union_pw_multi_aff>
3593has a single domain.  The conversion of an C<isl_union_pw_multi_aff>
3594of dimension greater than one may therefore not be exact.
3595The following functions can
3596be used to perform these conversions when they are possible.
3597
3598	#include <isl/aff.h>
3599	__isl_give isl_multi_union_pw_aff *
3600	isl_union_pw_multi_aff_as_multi_union_pw_aff(
3601		__isl_take isl_union_pw_multi_aff *upma);
3602	__isl_give isl_multi_union_pw_aff *
3603	isl_multi_union_pw_aff_from_union_pw_multi_aff(
3604		__isl_take isl_union_pw_multi_aff *upma);
3605	__isl_give isl_union_pw_multi_aff *
3606	isl_union_pw_multi_aff_from_multi_union_pw_aff(
3607		__isl_take isl_multi_union_pw_aff *mupa);
3608
3609C<isl_union_pw_multi_aff_as_multi_union_pw_aff> and
3610C<isl_multi_union_pw_aff_from_union_pw_multi_aff>
3611perform the same operation.
3612
3613=head3 Piecewise Expressions
3614
3615A piecewise expression is an expression that is described
3616using zero or more base expression defined over the same
3617number of cells in the domain space of the base expressions.
3618All base expressions are defined over the same
3619domain space and the cells are disjoint.
3620The space of a piecewise expression is the same as
3621that of the base expressions.
3622If the union of the cells is a strict subset of the domain
3623space, then the value of the piecewise expression outside
3624this union is different for types derived from quasi-affine
3625expressions and those derived from quasipolynomials.
3626Piecewise expressions derived from quasi-affine expressions
3627are considered to be undefined outside the union of their cells.
3628Piecewise expressions derived from quasipolynomials
3629are considered to be zero outside the union of their cells.
3630
3631Piecewise quasipolynomials are mainly used by the C<barvinok>
3632library for representing the number of elements in a parametric set or map.
3633For example, the piecewise quasipolynomial
3634
3635	[n] -> { [x] -> ((1 + n) - x) : x <= n and x >= 0 }
3636
3637represents the number of points in the map
3638
3639	[n] -> { [x] -> [y] : x,y >= 0 and 0 <= x + y <= n }
3640
3641The piecewise expression types defined by C<isl>
3642are C<isl_pw_aff>, C<isl_pw_multi_aff>,
3643C<isl_pw_qpolynomial> and C<isl_pw_qpolynomial_fold>.
3644
3645A piecewise expression with no cells can be created using
3646the following functions.
3647
3648	#include <isl/aff.h>
3649	__isl_give isl_pw_aff *isl_pw_aff_empty(
3650		__isl_take isl_space *space);
3651	__isl_give isl_pw_multi_aff *isl_pw_multi_aff_empty(
3652		__isl_take isl_space *space);
3653
3654A piecewise expression with a single universe cell can be
3655created using the following functions.
3656
3657	#include <isl/aff.h>
3658	__isl_give isl_pw_aff *isl_pw_aff_from_aff(
3659		__isl_take isl_aff *aff);
3660	__isl_give isl_pw_multi_aff *
3661	isl_multi_aff_to_pw_multi_aff(
3662		__isl_take isl_multi_aff *ma);
3663	__isl_give isl_pw_multi_aff *
3664	isl_pw_multi_aff_from_multi_aff(
3665		__isl_take isl_multi_aff *ma);
3666
3667	#include <isl/polynomial.h>
3668	__isl_give isl_pw_qpolynomial *
3669	isl_pw_qpolynomial_from_qpolynomial(
3670		__isl_take isl_qpolynomial *qp);
3671	__isl_give isl_pw_qpolynomial_fold *
3672	isl_pw_qpolynomial_fold_from_qpolynomial_fold(
3673		__isl_take isl_qpolynomial_fold *fold);
3674
3675C<isl_multi_aff_to_pw_multi_aff> and C<isl_pw_multi_aff_from_multi_aff> perform
3676the same operation.
3677
3678The inverse conversions below can only be used if the input
3679expression is known to be defined over a single universe domain.
3680
3681	#include <isl/aff.h>
3682	isl_bool isl_pw_aff_isa_aff(__isl_keep isl_pw_aff *pa);
3683	__isl_give isl_aff *isl_pw_aff_as_aff(
3684		__isl_take isl_pw_aff *pa);
3685	isl_bool isl_multi_pw_aff_isa_multi_aff(
3686		__isl_keep isl_multi_pw_aff *mpa);
3687	__isl_give isl_multi_aff *isl_multi_pw_aff_as_multi_aff(
3688		__isl_take isl_multi_pw_aff *mpa);
3689	isl_bool isl_pw_multi_aff_isa_multi_aff(
3690		__isl_keep isl_pw_multi_aff *pma);
3691	__isl_give isl_multi_aff *isl_pw_multi_aff_as_multi_aff(
3692		__isl_take isl_pw_multi_aff *pma);
3693
3694	#include <isl/polynomial.h>
3695	isl_bool isl_pw_qpolynomial_isa_qpolynomial(
3696		__isl_keep isl_pw_qpolynomial *pwqp);
3697	__isl_give isl_qpolynomial *
3698	isl_pw_qpolynomial_as_qpolynomial(
3699		__isl_take isl_pw_qpolynomial *pwqp);
3700	isl_bool isl_pw_qpolynomial_fold_isa_qpolynomial_fold(
3701		__isl_keep isl_pw_qpolynomial_fold *pwf);
3702	__isl_give isl_qpolynomial_fold *
3703	isl_pw_qpolynomial_fold_as_qpolynomial_fold(
3704		__isl_take isl_pw_qpolynomial_fold *pwf);
3705
3706A piecewise expression with a single specified cell can be
3707created using the following functions.
3708
3709	#include <isl/aff.h>
3710	__isl_give isl_pw_aff *isl_pw_aff_alloc(
3711		__isl_take isl_set *set, __isl_take isl_aff *aff);
3712	__isl_give isl_pw_multi_aff *isl_pw_multi_aff_alloc(
3713		__isl_take isl_set *set,
3714		__isl_take isl_multi_aff *maff);
3715
3716	#include <isl/polynomial.h>
3717	__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_alloc(
3718		__isl_take isl_set *set,
3719		__isl_take isl_qpolynomial *qp);
3720
3721The following convenience functions first create a base expression and
3722then create a piecewise expression over a universe domain.
3723
3724	#include <isl/aff.h>
3725	__isl_give isl_pw_aff *isl_pw_aff_zero_on_domain(
3726		__isl_take isl_local_space *ls);
3727	__isl_give isl_pw_aff *isl_pw_aff_var_on_domain(
3728		__isl_take isl_local_space *ls,
3729		enum isl_dim_type type, unsigned pos);
3730	__isl_give isl_pw_aff *isl_pw_aff_nan_on_domain_space(
3731		__isl_take isl_space *space);
3732	__isl_give isl_pw_aff *isl_pw_aff_nan_on_domain(
3733		__isl_take isl_local_space *ls);
3734	__isl_give isl_pw_multi_aff *isl_pw_multi_aff_zero(
3735		__isl_take isl_space *space);
3736	__isl_give isl_pw_multi_aff *
3737	isl_pw_multi_aff_identity_on_domain_space(
3738		__isl_take isl_space *space)
3739	__isl_give isl_pw_multi_aff *
3740	isl_space_identity_pw_multi_aff_on_domain(
3741		__isl_take isl_space *space)
3742	__isl_give isl_pw_multi_aff *isl_pw_multi_aff_identity(
3743		__isl_take isl_space *space);
3744	__isl_give isl_pw_multi_aff *isl_pw_multi_aff_domain_map(
3745		__isl_take isl_space *space);
3746	__isl_give isl_pw_multi_aff *
3747	isl_space_domain_map_pw_multi_aff(
3748		__isl_take isl_space *space);
3749	__isl_give isl_pw_multi_aff *isl_pw_multi_aff_range_map(
3750		__isl_take isl_space *space);
3751	__isl_give isl_pw_multi_aff *
3752	isl_space_range_map_pw_multi_aff(
3753		__isl_take isl_space *space);
3754	__isl_give isl_pw_multi_aff *
3755	isl_pw_multi_aff_project_out_map(
3756		__isl_take isl_space *space,
3757		enum isl_dim_type type,
3758		unsigned first, unsigned n);
3759
3760	#include <isl/polynomial.h>
3761	__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_zero(
3762		__isl_take isl_space *space);
3763
3764C<isl_pw_multi_aff_identity_on_domain_space> and
3765C<isl_space_identity_pw_multi_aff_on_domain>
3766perform the same operation.
3767Similarly
3768for the pair C<isl_pw_multi_aff_domain_map> and
3769C<isl_space_domain_map_pw_multi_aff> and
3770for the pair C<isl_pw_multi_aff_range_map> and
3771C<isl_space_range_map_pw_multi_aff>.
3772
3773The following convenience functions first create a base expression and
3774then create a piecewise expression over a given domain.
3775
3776	#include <isl/aff.h>
3777	__isl_give isl_pw_aff *isl_pw_aff_val_on_domain(
3778		__isl_take isl_set *domain,
3779		__isl_take isl_val *v);
3780	__isl_give isl_pw_aff *isl_set_pw_aff_on_domain_val(
3781		__isl_take isl_set *domain,
3782		__isl_take isl_val *v);
3783	__isl_give isl_pw_multi_aff *
3784	isl_pw_multi_aff_multi_val_on_domain(
3785		__isl_take isl_set *domain,
3786		__isl_take isl_multi_val *mv);
3787	__isl_give isl_pw_multi_aff *
3788	isl_set_pw_multi_aff_on_domain_multi_val(
3789		__isl_take isl_set *domain,
3790		__isl_take isl_multi_val *mv);
3791	__isl_give isl_pw_aff *isl_pw_aff_param_on_domain_id(
3792		__isl_take isl_set *domain,
3793		__isl_take isl_id *id);
3794	__isl_give isl_pw_aff *isl_set_param_pw_aff_on_domain_id(
3795		__isl_take isl_set *domain,
3796		__isl_take isl_id *id);
3797
3798C<isl_set_pw_aff_on_domain_val> is an alternative name
3799for C<isl_pw_aff_val_on_domain>.
3800Similarly for the pair
3801C<isl_set_pw_multi_aff_on_domain_multi_val> and
3802C<isl_pw_multi_aff_multi_val_on_domain> and
3803for the pair C<isl_set_param_pw_aff_on_domain_id> and
3804C<isl_pw_aff_param_on_domain_id>.
3805
3806As a convenience, a piecewise multiple expression can
3807also be created from a piecewise expression.
3808Each multiple expression in the result is derived
3809from the corresponding base expression.
3810
3811	#include <isl/aff.h>
3812	__isl_give isl_pw_multi_aff *isl_pw_multi_aff_from_pw_aff(
3813		__isl_take isl_pw_aff *pa);
3814
3815Similarly, a piecewise quasipolynomial can be
3816created from a piecewise quasi-affine expression using
3817the following function.
3818
3819	#include <isl/polynomial.h>
3820	__isl_give isl_pw_qpolynomial *
3821	isl_pw_qpolynomial_from_pw_aff(
3822		__isl_take isl_pw_aff *pwaff);
3823
3824Piecewise expressions can be copied and freed using the following functions.
3825
3826	#include <isl/aff.h>
3827	__isl_give isl_pw_aff *isl_pw_aff_copy(
3828		__isl_keep isl_pw_aff *pwaff);
3829	__isl_null isl_pw_aff *isl_pw_aff_free(
3830		__isl_take isl_pw_aff *pwaff);
3831	__isl_give isl_pw_multi_aff *isl_pw_multi_aff_copy(
3832		__isl_keep isl_pw_multi_aff *pma);
3833	__isl_null isl_pw_multi_aff *isl_pw_multi_aff_free(
3834		__isl_take isl_pw_multi_aff *pma);
3835
3836	#include <isl/polynomial.h>
3837	__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_copy(
3838		__isl_keep isl_pw_qpolynomial *pwqp);
3839	__isl_null isl_pw_qpolynomial *isl_pw_qpolynomial_free(
3840		__isl_take isl_pw_qpolynomial *pwqp);
3841	__isl_give isl_pw_qpolynomial_fold *
3842	isl_pw_qpolynomial_fold_copy(
3843		__isl_keep isl_pw_qpolynomial_fold *pwf);
3844	__isl_null isl_pw_qpolynomial_fold *
3845	isl_pw_qpolynomial_fold_free(
3846		__isl_take isl_pw_qpolynomial_fold *pwf);
3847
3848To iterate over the different cells of a piecewise expression,
3849use the following functions.
3850
3851	#include <isl/aff.h>
3852	isl_bool isl_pw_aff_is_empty(__isl_keep isl_pw_aff *pwaff);
3853	isl_size isl_pw_aff_n_piece(__isl_keep isl_pw_aff *pwaff);
3854	isl_stat isl_pw_aff_foreach_piece(
3855		__isl_keep isl_pw_aff *pwaff,
3856		isl_stat (*fn)(__isl_take isl_set *set,
3857			  __isl_take isl_aff *aff,
3858			  void *user), void *user);
3859	isl_bool isl_pw_aff_every_piece(__isl_keep isl_pw_aff *pa,
3860		isl_bool (*test)(__isl_keep isl_set *set,
3861			__isl_keep isl_aff *aff, void *user),
3862			void *user);
3863	isl_size isl_pw_multi_aff_n_piece(
3864		__isl_keep isl_pw_multi_aff *pma);
3865	isl_stat isl_pw_multi_aff_foreach_piece(
3866		__isl_keep isl_pw_multi_aff *pma,
3867		isl_stat (*fn)(__isl_take isl_set *set,
3868			    __isl_take isl_multi_aff *maff,
3869			    void *user), void *user);
3870	isl_bool isl_pw_multi_aff_every_piece(
3871		__isl_keep isl_pw_multi_aff *pma,
3872		isl_bool (*test)(__isl_keep isl_set *set,
3873			__isl_keep isl_multi_aff *ma, void *user),
3874			void *user);
3875
3876	#include <isl/polynomial.h>
3877	isl_size isl_pw_qpolynomial_n_piece(
3878		__isl_keep isl_pw_qpolynomial *pwqp);
3879	isl_stat isl_pw_qpolynomial_foreach_piece(
3880		__isl_keep isl_pw_qpolynomial *pwqp,
3881		isl_stat (*fn)(__isl_take isl_set *set,
3882			  __isl_take isl_qpolynomial *qp,
3883			  void *user), void *user);
3884	isl_bool isl_pw_qpolynomial_every_piece(
3885		__isl_keep isl_pw_qpolynomial *pwqp,
3886		isl_bool (*test)(__isl_keep isl_set *set,
3887			__isl_keep isl_qpolynomial *qp,
3888			void *user), void *user);
3889	isl_stat isl_pw_qpolynomial_foreach_lifted_piece(
3890		__isl_keep isl_pw_qpolynomial *pwqp,
3891		isl_stat (*fn)(__isl_take isl_set *set,
3892			  __isl_take isl_qpolynomial *qp,
3893			  void *user), void *user);
3894	isl_size isl_pw_qpolynomial_fold_n_piece(
3895		__isl_keep isl_pw_qpolynomial_fold *pwf);
3896	isl_stat isl_pw_qpolynomial_fold_foreach_piece(
3897		__isl_keep isl_pw_qpolynomial_fold *pwf,
3898		isl_stat (*fn)(__isl_take isl_set *set,
3899			  __isl_take isl_qpolynomial_fold *fold,
3900			  void *user), void *user);
3901	isl_bool isl_pw_qpolynomial_fold_every_piece(
3902		__isl_keep isl_pw_qpolynomial_fold *pwf,
3903		isl_bool (*test)(__isl_keep isl_set *set,
3904			__isl_keep isl_qpolynomial_fold *fold,
3905			void *user), void *user);
3906	isl_stat isl_pw_qpolynomial_fold_foreach_lifted_piece(
3907		__isl_keep isl_pw_qpolynomial_fold *pwf,
3908		isl_stat (*fn)(__isl_take isl_set *set,
3909			  __isl_take isl_qpolynomial_fold *fold,
3910			  void *user), void *user);
3911
3912As usual, the function C<fn> should return C<isl_stat_ok> on success
3913and C<isl_stat_error> on failure.  The difference between
3914C<isl_pw_qpolynomial_foreach_piece> and
3915C<isl_pw_qpolynomial_foreach_lifted_piece> is that
3916C<isl_pw_qpolynomial_foreach_lifted_piece> will first
3917compute unique representations for all existentially quantified
3918variables and then turn these existentially quantified variables
3919into extra set variables, adapting the associated quasipolynomial
3920accordingly.  This means that the C<set> passed to C<fn>
3921will not have any existentially quantified variables, but that
3922the dimensions of the sets may be different for different
3923invocations of C<fn>.
3924Similarly for C<isl_pw_qpolynomial_fold_foreach_piece>
3925and C<isl_pw_qpolynomial_fold_foreach_lifted_piece>.
3926The function C<isl_pw_aff_every_piece> and its variants
3927check whether each call to the callback returns true and
3928stop checking as soon as one of these calls returns false (or error).
3929
3930A piecewise expression consisting of the expressions at a given
3931position of a piecewise multiple expression can be extracted
3932using the following function.
3933
3934	#include <isl/aff.h>
3935	__isl_give isl_pw_aff *isl_pw_multi_aff_get_at(
3936		__isl_keep isl_pw_multi_aff *pma, int pos);
3937	__isl_give isl_pw_aff *isl_pw_multi_aff_get_pw_aff(
3938		__isl_keep isl_pw_multi_aff *pma, int pos);
3939
3940C<isl_pw_multi_aff_get_pw_aff> is an alternative name for
3941C<isl_pw_multi_aff_get_at>.
3942
3943These expressions can be replaced using the following function.
3944
3945	#include <isl/aff.h>
3946	__isl_give isl_pw_multi_aff *isl_pw_multi_aff_set_pw_aff(
3947		__isl_take isl_pw_multi_aff *pma, unsigned pos,
3948		__isl_take isl_pw_aff *pa);
3949
3950Note that there is a difference between C<isl_multi_pw_aff> and
3951C<isl_pw_multi_aff> objects.  The first is a sequence of piecewise
3952affine expressions, while the second is a piecewise sequence
3953of affine expressions.  In particular, each of the piecewise
3954affine expressions in an C<isl_multi_pw_aff> may have a different
3955domain, while all multiple expressions associated to a cell
3956in an C<isl_pw_multi_aff> have the same domain.
3957It is possible to convert between the two, but when converting
3958an C<isl_multi_pw_aff> to an C<isl_pw_multi_aff>, the domain
3959of the result is the intersection of the domains of the input.
3960The reverse conversion is exact.
3961
3962	#include <isl/aff.h>
3963	__isl_give isl_pw_multi_aff *
3964	isl_pw_multi_aff_from_multi_pw_aff(
3965		__isl_take isl_multi_pw_aff *mpa);
3966	__isl_give isl_multi_pw_aff *
3967	isl_pw_multi_aff_to_multi_pw_aff(
3968		__isl_take isl_pw_multi_aff *pma);
3969	__isl_give isl_multi_pw_aff *
3970	isl_multi_pw_aff_from_pw_multi_aff(
3971		__isl_take isl_pw_multi_aff *pma);
3972
3973C<isl_pw_multi_aff_to_multi_pw_aff> and
3974C<isl_multi_pw_aff_from_pw_multi_aff> perform the same operation.
3975
3976=head3 Union Expressions
3977
3978A union expression collects base expressions defined
3979over different domains.  The space of a union expression
3980is that of the shared parameter space.
3981
3982The union expression types defined by C<isl>
3983are C<isl_union_pw_aff>, C<isl_union_pw_multi_aff>,
3984C<isl_union_pw_qpolynomial> and C<isl_union_pw_qpolynomial_fold>.
3985In case of
3986C<isl_union_pw_aff>,
3987C<isl_union_pw_qpolynomial> and C<isl_union_pw_qpolynomial_fold>,
3988there can be at most one base expression for a given domain space.
3989In case of
3990C<isl_union_pw_multi_aff>,
3991there can be multiple such expressions for a given domain space,
3992but the domains of these expressions need to be disjoint.
3993
3994An empty union expression can be created using the following functions.
3995
3996	#include <isl/aff.h>
3997	__isl_give isl_union_pw_aff *
3998	isl_union_pw_aff_empty_ctx(
3999		isl_ctx *ctx);
4000	__isl_give isl_union_pw_aff *
4001	isl_union_pw_aff_empty_space(
4002		__isl_take isl_space *space);
4003	__isl_give isl_union_pw_aff *isl_union_pw_aff_empty(
4004		__isl_take isl_space *space);
4005	__isl_give isl_union_pw_multi_aff *
4006	isl_union_pw_multi_aff_empty_ctx(
4007		isl_ctx *ctx);
4008	__isl_give isl_union_pw_multi_aff *
4009	isl_union_pw_multi_aff_empty_space(
4010		__isl_take isl_space *space);
4011	__isl_give isl_union_pw_multi_aff *
4012	isl_union_pw_multi_aff_empty(
4013		__isl_take isl_space *space);
4014
4015	#include <isl/polynomial.h>
4016	__isl_give isl_union_pw_qpolynomial *
4017	isl_union_pw_qpolynomial_zero_ctx(
4018		isl_ctx *ctx);
4019	__isl_give isl_union_pw_qpolynomial *
4020	isl_union_pw_qpolynomial_zero_space(
4021		__isl_take isl_space *space);
4022	__isl_give isl_union_pw_qpolynomial *
4023	isl_union_pw_qpolynomial_zero(
4024		__isl_take isl_space *space);
4025
4026C<isl_union_pw_aff_empty> is an alternative name for
4027C<isl_union_pw_aff_empty_space>.
4028Similarly for the other pairs of functions.
4029
4030A union expression containing a single base expression
4031can be created using the following functions.
4032
4033	#include <isl/aff.h>
4034	__isl_give isl_union_pw_aff *
4035	isl_pw_aff_to_union_pw_aff(
4036		__isl_take isl_pw_aff *pa);
4037	__isl_give isl_union_pw_aff *
4038	isl_union_pw_aff_from_pw_aff(
4039		__isl_take isl_pw_aff *pa);
4040	__isl_give isl_union_pw_multi_aff *
4041	isl_union_pw_multi_aff_from_aff(
4042		__isl_take isl_aff *aff);
4043	__isl_give isl_union_pw_multi_aff *
4044	isl_pw_multi_aff_to_union_pw_multi_aff(
4045		__isl_take isl_pw_multi_aff *pma);
4046	__isl_give isl_union_pw_multi_aff *
4047	isl_union_pw_multi_aff_from_pw_multi_aff(
4048		__isl_take isl_pw_multi_aff *pma);
4049
4050	#include <isl/polynomial.h>
4051	__isl_give isl_union_pw_qpolynomial *
4052	isl_pw_qpolynomial_to_union_pw_qpolynomial(
4053		__isl_take isl_pw_qpolynomial *pwqp);
4054	__isl_give isl_union_pw_qpolynomial *
4055	isl_union_pw_qpolynomial_from_pw_qpolynomial(
4056		__isl_take isl_pw_qpolynomial *pwqp);
4057	__isl_give isl_union_pw_qpolynomial_fold *
4058	isl_pw_qpolynomial_fold_to_union_pw_qpolynomial_fold(
4059		__isl_take isl_pw_qpolynomial_fold *pwf);
4060	__isl_give isl_union_pw_qpolynomial_fold *
4061	isl_union_pw_qpolynomial_fold_from_pw_qpolynomial_fold(
4062		__isl_take isl_pw_qpolynomial_fold *pwf);
4063
4064C<isl_pw_aff_to_union_pw_aff> and C<isl_union_pw_aff_from_pw_aff> perform
4065the same operation.
4066Similarly for C<isl_pw_multi_aff_to_union_pw_multi_aff> and
4067C<isl_union_pw_multi_aff_from_pw_multi_aff>,
4068for
4069C<isl_pw_qpolynomial_to_union_pw_qpolynomial> and
4070C<isl_union_pw_qpolynomial_from_pw_qpolynomial>, and
4071for
4072C<isl_pw_qpolynomial_fold_to_union_pw_qpolynomial_fold> and
4073C<isl_union_pw_qpolynomial_fold_from_pw_qpolynomial_fold>.
4074
4075The inverse conversions below can only be used if the input
4076expression is known to live in exactly one space.
4077
4078	#include <isl/aff.h>
4079	isl_bool isl_union_pw_multi_aff_isa_pw_multi_aff(
4080		__isl_keep isl_union_pw_multi_aff *upma);
4081	__isl_give isl_pw_multi_aff *
4082	isl_union_pw_multi_aff_as_pw_multi_aff(
4083		__isl_take isl_union_pw_multi_aff *upma);
4084
4085A union piecewise expression containing a single base expression
4086on a universe domain can also be created directly from
4087a base expression using the following functions.
4088
4089	#include <isl/aff.h>
4090	__isl_give isl_union_pw_aff *isl_union_pw_aff_from_aff(
4091		__isl_take isl_aff *aff);
4092	__isl_give isl_union_pw_multi_aff *
4093	isl_union_pw_multi_aff_from_multi_aff(
4094		__isl_take isl_multi_aff *ma);
4095
4096The following functions create a base expression on each
4097of the sets in the union set and collect the results.
4098
4099	#include <isl/aff.h>
4100	__isl_give isl_union_pw_multi_aff *
4101	isl_union_pw_multi_aff_from_union_pw_aff(
4102		__isl_take isl_union_pw_aff *upa);
4103	__isl_give isl_union_pw_aff *
4104	isl_union_pw_multi_aff_get_union_pw_aff(
4105		__isl_keep isl_union_pw_multi_aff *upma, int pos);
4106	__isl_give isl_union_pw_aff *
4107	isl_union_pw_aff_val_on_domain(
4108		__isl_take isl_union_set *domain,
4109		__isl_take isl_val *v);
4110	__isl_give isl_union_pw_multi_aff *
4111	isl_union_pw_multi_aff_multi_val_on_domain(
4112		__isl_take isl_union_set *domain,
4113		__isl_take isl_multi_val *mv);
4114	__isl_give isl_union_pw_aff *
4115	isl_union_pw_aff_param_on_domain_id(
4116		__isl_take isl_union_set *domain,
4117		__isl_take isl_id *id);
4118
4119The C<id> argument of C<isl_union_pw_aff_param_on_domain_id>
4120is the identifier of a parameter that may or may not already
4121be present in C<domain>.
4122
4123An C<isl_union_pw_aff> that is equal to a (parametric) affine
4124or piecewise affine
4125expression on a given domain can be created using the following
4126functions.
4127
4128	#include <isl/aff.h>
4129	__isl_give isl_union_pw_aff *
4130	isl_union_pw_aff_aff_on_domain(
4131		__isl_take isl_union_set *domain,
4132		__isl_take isl_aff *aff);
4133	__isl_give isl_union_pw_aff *
4134	isl_union_pw_aff_pw_aff_on_domain(
4135		__isl_take isl_union_set *domain,
4136		__isl_take isl_pw_aff *pa);
4137
4138A base expression can be added to a union expression using
4139the following functions.
4140
4141	#include <isl/aff.h>
4142	__isl_give isl_union_pw_aff *
4143	isl_union_pw_aff_add_pw_aff(
4144		__isl_take isl_union_pw_aff *upa,
4145		__isl_take isl_pw_aff *pa);
4146	__isl_give isl_union_pw_multi_aff *
4147	isl_union_pw_multi_aff_add_pw_multi_aff(
4148		__isl_take isl_union_pw_multi_aff *upma,
4149		__isl_take isl_pw_multi_aff *pma);
4150
4151	#include <isl/polynomial.h>
4152	__isl_give isl_union_pw_qpolynomial *
4153	isl_union_pw_qpolynomial_add_pw_qpolynomial(
4154		__isl_take isl_union_pw_qpolynomial *upwqp,
4155		__isl_take isl_pw_qpolynomial *pwqp);
4156
4157Union expressions can be copied and freed using
4158the following functions.
4159
4160	#include <isl/aff.h>
4161	__isl_give isl_union_pw_aff *isl_union_pw_aff_copy(
4162		__isl_keep isl_union_pw_aff *upa);
4163	__isl_null isl_union_pw_aff *isl_union_pw_aff_free(
4164		__isl_take isl_union_pw_aff *upa);
4165	__isl_give isl_union_pw_multi_aff *
4166	isl_union_pw_multi_aff_copy(
4167		__isl_keep isl_union_pw_multi_aff *upma);
4168	__isl_null isl_union_pw_multi_aff *
4169	isl_union_pw_multi_aff_free(
4170		__isl_take isl_union_pw_multi_aff *upma);
4171
4172	#include <isl/polynomial.h>
4173	__isl_give isl_union_pw_qpolynomial *
4174	isl_union_pw_qpolynomial_copy(
4175		__isl_keep isl_union_pw_qpolynomial *upwqp);
4176	__isl_null isl_union_pw_qpolynomial *
4177	isl_union_pw_qpolynomial_free(
4178		__isl_take isl_union_pw_qpolynomial *upwqp);
4179	__isl_give isl_union_pw_qpolynomial_fold *
4180	isl_union_pw_qpolynomial_fold_copy(
4181		__isl_keep isl_union_pw_qpolynomial_fold *upwf);
4182	__isl_null isl_union_pw_qpolynomial_fold *
4183	isl_union_pw_qpolynomial_fold_free(
4184		__isl_take isl_union_pw_qpolynomial_fold *upwf);
4185
4186To iterate over the base expressions in a union expression,
4187use the following functions.
4188
4189	#include <isl/aff.h>
4190	isl_size isl_union_pw_aff_n_pw_aff(
4191		__isl_keep isl_union_pw_aff *upa);
4192	isl_stat isl_union_pw_aff_foreach_pw_aff(
4193		__isl_keep isl_union_pw_aff *upa,
4194		isl_stat (*fn)(__isl_take isl_pw_aff *pa,
4195			void *user), void *user);
4196	isl_bool isl_union_pw_aff_every_pw_aff(
4197		__isl_keep isl_union_pw_aff *upa,
4198		isl_bool (*test)(__isl_keep isl_pw_aff *pa,
4199			void *user), void *user);
4200	isl_size isl_union_pw_multi_aff_n_pw_multi_aff(
4201		__isl_keep isl_union_pw_multi_aff *upma);
4202	isl_stat isl_union_pw_multi_aff_foreach_pw_multi_aff(
4203		__isl_keep isl_union_pw_multi_aff *upma,
4204		isl_stat (*fn)(__isl_take isl_pw_multi_aff *pma,
4205			    void *user), void *user);
4206	isl_bool isl_union_pw_multi_aff_every_pw_multi_aff(
4207		__isl_keep isl_union_pw_multi_aff *upma,
4208		isl_bool (*test)(
4209			__isl_keep isl_pw_multi_aff *pma,
4210			void *user), void *user);
4211
4212	#include <isl/polynomial.h>
4213	isl_size isl_union_pw_qpolynomial_n_pw_qpolynomial(
4214		__isl_keep isl_union_pw_qpolynomial *upwqp);
4215	isl_stat isl_union_pw_qpolynomial_foreach_pw_qpolynomial(
4216		__isl_keep isl_union_pw_qpolynomial *upwqp,
4217		isl_stat (*fn)(__isl_take isl_pw_qpolynomial *pwqp,
4218			    void *user), void *user);
4219	isl_bool isl_union_pw_qpolynomial_every_pw_qpolynomial(
4220		__isl_keep isl_union_pw_qpolynomial *upwqp,
4221		isl_bool (*test)(
4222			__isl_keep isl_pw_qpolynomial *pwqp,
4223			void *user), void *user);
4224	isl_size isl_union_pw_qpolynomial_fold_n_pw_qpolynomial_fold(
4225		__isl_keep isl_union_pw_qpolynomial_fold *upwf);
4226	isl_stat isl_union_pw_qpolynomial_fold_foreach_pw_qpolynomial_fold(
4227		__isl_keep isl_union_pw_qpolynomial_fold *upwf,
4228		isl_stat (*fn)(__isl_take isl_pw_qpolynomial_fold *pwf,
4229			    void *user), void *user);
4230	isl_bool
4231	isl_union_pw_qpolynomial_fold_every_pw_qpolynomial_fold(
4232		__isl_keep isl_union_pw_qpolynomial_fold *upwf,
4233		isl_bool (*test)(
4234			__isl_keep isl_pw_qpolynomial_fold *pwf,
4235			void *user), void *user);
4236
4237To extract the base expression in a given space from a union, use
4238the following functions.
4239
4240	#include <isl/aff.h>
4241	__isl_give isl_pw_aff *isl_union_pw_aff_extract_pw_aff(
4242		__isl_keep isl_union_pw_aff *upa,
4243		__isl_take isl_space *space);
4244	__isl_give isl_pw_multi_aff *
4245	isl_union_pw_multi_aff_extract_pw_multi_aff(
4246		__isl_keep isl_union_pw_multi_aff *upma,
4247		__isl_take isl_space *space);
4248
4249	#include <isl/polynomial.h>
4250	__isl_give isl_pw_qpolynomial *
4251	isl_union_pw_qpolynomial_extract_pw_qpolynomial(
4252		__isl_keep isl_union_pw_qpolynomial *upwqp,
4253		__isl_take isl_space *space);
4254
4255It is also possible to obtain a list of the base expressions using
4256the following functions.
4257
4258	#include <isl/aff.h>
4259	__isl_give isl_pw_aff_list *
4260	isl_union_pw_aff_get_pw_aff_list(
4261		__isl_keep isl_union_pw_aff *upa);
4262	__isl_give isl_pw_multi_aff_list *
4263	isl_union_pw_multi_aff_get_pw_multi_aff_list(
4264		__isl_keep isl_union_pw_multi_aff *upma);
4265
4266	#include <isl/polynomial.h>
4267	__isl_give isl_pw_qpolynomial_list *
4268	isl_union_pw_qpolynomial_get_pw_qpolynomial_list(
4269		__isl_keep isl_union_pw_qpolynomial *upwqp);
4270	__isl_give isl_pw_qpolynomial_fold_list *
4271	isl_union_pw_qpolynomial_fold_get_pw_qpolynomial_fold_list(
4272		__isl_keep isl_union_pw_qpolynomial_fold *upwf);
4273
4274The returned list can be manipulated using the functions in L<"Lists">.
4275
4276=head2 Input and Output
4277
4278For set and relation,
4279C<isl> supports its own input/output format, which is similar
4280to the C<Omega> format, but also supports the C<PolyLib> format
4281in some cases.
4282For other object types, typically only an C<isl> format is supported.
4283
4284=head3 C<isl> format
4285
4286The C<isl> format is similar to that of C<Omega>, but has a different
4287syntax for describing the parameters and allows for the definition
4288of an existentially quantified variable as the integer division
4289of an affine expression.
4290For example, the set of integers C<i> between C<0> and C<n>
4291such that C<i % 10 <= 6> can be described as
4292
4293	[n] -> { [i] : exists (a = [i/10] : 0 <= i and i <= n and
4294				i - 10 a <= 6) }
4295
4296A set or relation can have several disjuncts, separated
4297by the keyword C<or>.  Each disjunct is either a conjunction
4298of constraints or a projection (C<exists>) of a conjunction
4299of constraints.  The constraints are separated by the keyword
4300C<and>.
4301
4302=head3 C<PolyLib> format
4303
4304If the represented set is a union, then the first line
4305contains a single number representing the number of disjuncts.
4306Otherwise, a line containing the number C<1> is optional.
4307
4308Each disjunct is represented by a matrix of constraints.
4309The first line contains two numbers representing
4310the number of rows and columns,
4311where the number of rows is equal to the number of constraints
4312and the number of columns is equal to two plus the number of variables.
4313The following lines contain the actual rows of the constraint matrix.
4314In each row, the first column indicates whether the constraint
4315is an equality (C<0>) or inequality (C<1>).  The final column
4316corresponds to the constant term.
4317
4318If the set is parametric, then the coefficients of the parameters
4319appear in the last columns before the constant column.
4320The coefficients of any existentially quantified variables appear
4321between those of the set variables and those of the parameters.
4322
4323=head3 Extended C<PolyLib> format
4324
4325The extended C<PolyLib> format is nearly identical to the
4326C<PolyLib> format.  The only difference is that the line
4327containing the number of rows and columns of a constraint matrix
4328also contains four additional numbers:
4329the number of output dimensions, the number of input dimensions,
4330the number of local dimensions (i.e., the number of existentially
4331quantified variables) and the number of parameters.
4332For sets, the number of ``output'' dimensions is equal
4333to the number of set dimensions, while the number of ``input''
4334dimensions is zero.
4335
4336=head3 Input
4337
4338Objects can be read from input using the following functions.
4339
4340	#include <isl/id.h>
4341	__isl_give isl_id *isl_id_read_from_str(isl_ctx *ctx,
4342		const char *str);
4343	__isl_give isl_multi_id *isl_multi_id_read_from_str(
4344		isl_ctx *ctx, const char *str);
4345
4346	#include <isl/val.h>
4347	__isl_give isl_val *isl_val_read_from_str(isl_ctx *ctx,
4348		const char *str);
4349	__isl_give isl_multi_val *isl_multi_val_read_from_str(
4350		isl_ctx *ctx, const char *str);
4351
4352	#include <isl/space.h>
4353	__isl_give isl_space *isl_space_read_from_str(
4354		isl_ctx *ctx, const char *str);
4355
4356	#include <isl/set.h>
4357	__isl_give isl_basic_set *isl_basic_set_read_from_file(
4358		isl_ctx *ctx, FILE *input);
4359	__isl_give isl_basic_set *isl_basic_set_read_from_str(
4360		isl_ctx *ctx, const char *str);
4361	__isl_give isl_set *isl_set_read_from_file(isl_ctx *ctx,
4362		FILE *input);
4363	__isl_give isl_set *isl_set_read_from_str(isl_ctx *ctx,
4364		const char *str);
4365
4366	#include <isl/map.h>
4367	__isl_give isl_basic_map *isl_basic_map_read_from_file(
4368		isl_ctx *ctx, FILE *input);
4369	__isl_give isl_basic_map *isl_basic_map_read_from_str(
4370		isl_ctx *ctx, const char *str);
4371	__isl_give isl_map *isl_map_read_from_file(
4372		isl_ctx *ctx, FILE *input);
4373	__isl_give isl_map *isl_map_read_from_str(isl_ctx *ctx,
4374		const char *str);
4375
4376	#include <isl/union_set.h>
4377	__isl_give isl_union_set *isl_union_set_read_from_file(
4378		isl_ctx *ctx, FILE *input);
4379	__isl_give isl_union_set *isl_union_set_read_from_str(
4380		isl_ctx *ctx, const char *str);
4381
4382	#include <isl/union_map.h>
4383	__isl_give isl_union_map *isl_union_map_read_from_file(
4384		isl_ctx *ctx, FILE *input);
4385	__isl_give isl_union_map *isl_union_map_read_from_str(
4386		isl_ctx *ctx, const char *str);
4387
4388	#include <isl/aff.h>
4389	__isl_give isl_aff *isl_aff_read_from_str(
4390		isl_ctx *ctx, const char *str);
4391	__isl_give isl_multi_aff *isl_multi_aff_read_from_str(
4392		isl_ctx *ctx, const char *str);
4393	__isl_give isl_pw_aff *isl_pw_aff_read_from_str(
4394		isl_ctx *ctx, const char *str);
4395	__isl_give isl_pw_multi_aff *isl_pw_multi_aff_read_from_str(
4396		isl_ctx *ctx, const char *str);
4397	__isl_give isl_multi_pw_aff *isl_multi_pw_aff_read_from_str(
4398		isl_ctx *ctx, const char *str);
4399	__isl_give isl_union_pw_aff *
4400	isl_union_pw_aff_read_from_str(
4401		isl_ctx *ctx, const char *str);
4402	__isl_give isl_union_pw_multi_aff *
4403	isl_union_pw_multi_aff_read_from_str(
4404		isl_ctx *ctx, const char *str);
4405	__isl_give isl_multi_union_pw_aff *
4406	isl_multi_union_pw_aff_read_from_str(
4407		isl_ctx *ctx, const char *str);
4408
4409	#include <isl/polynomial.h>
4410	__isl_give isl_union_pw_qpolynomial *
4411	isl_union_pw_qpolynomial_read_from_str(
4412		isl_ctx *ctx, const char *str);
4413
4414	__isl_give isl_pw_qpolynomial_fold *
4415	isl_pw_qpolynomial_fold_read_from_str(
4416		isl_ctx *ctx, const char *str);
4417
4418For sets and relations,
4419the input format is autodetected and may be either the C<PolyLib> format
4420or the C<isl> format.
4421
4422=head3 Output
4423
4424Before anything can be printed, an C<isl_printer> needs to
4425be created.
4426
4427	__isl_give isl_printer *isl_printer_to_file(isl_ctx *ctx,
4428		FILE *file);
4429	__isl_give isl_printer *isl_printer_to_str(isl_ctx *ctx);
4430	__isl_null isl_printer *isl_printer_free(
4431		__isl_take isl_printer *printer);
4432
4433C<isl_printer_to_file> prints to the given file, while
4434C<isl_printer_to_str> prints to a string that can be extracted
4435using the following function.
4436
4437	#include <isl/printer.h>
4438	__isl_give char *isl_printer_get_str(
4439		__isl_keep isl_printer *printer);
4440
4441The printer can be inspected using the following functions.
4442
4443	FILE *isl_printer_get_file(
4444		__isl_keep isl_printer *printer);
4445	int isl_printer_get_output_format(
4446		__isl_keep isl_printer *p);
4447	int isl_printer_get_yaml_style(__isl_keep isl_printer *p);
4448
4449The behavior of the printer can be modified in various ways
4450
4451	__isl_give isl_printer *isl_printer_set_output_format(
4452		__isl_take isl_printer *p, int output_format);
4453	__isl_give isl_printer *isl_printer_set_indent(
4454		__isl_take isl_printer *p, int indent);
4455	__isl_give isl_printer *isl_printer_set_indent_prefix(
4456		__isl_take isl_printer *p, const char *prefix);
4457	__isl_give isl_printer *isl_printer_indent(
4458		__isl_take isl_printer *p, int indent);
4459	__isl_give isl_printer *isl_printer_set_prefix(
4460		__isl_take isl_printer *p, const char *prefix);
4461	__isl_give isl_printer *isl_printer_set_suffix(
4462		__isl_take isl_printer *p, const char *suffix);
4463	__isl_give isl_printer *isl_printer_set_yaml_style(
4464		__isl_take isl_printer *p, int yaml_style);
4465
4466The C<output_format> may be either C<ISL_FORMAT_ISL>, C<ISL_FORMAT_OMEGA>,
4467C<ISL_FORMAT_POLYLIB>, C<ISL_FORMAT_EXT_POLYLIB> or C<ISL_FORMAT_LATEX>
4468and defaults to C<ISL_FORMAT_ISL>.
4469Each line in the output is prefixed by C<indent_prefix>,
4470indented by C<indent> (set by C<isl_printer_set_indent>) spaces
4471(default: 0), prefixed by C<prefix> and suffixed by C<suffix>.
4472In the C<PolyLib> format output,
4473the coefficients of the existentially quantified variables
4474appear between those of the set variables and those
4475of the parameters.
4476The function C<isl_printer_indent> increases the indentation
4477by the specified amount (which may be negative).
4478The YAML style may be either C<ISL_YAML_STYLE_BLOCK> or
4479C<ISL_YAML_STYLE_FLOW> and when we are printing something
4480in YAML format.
4481
4482To actually print something, use
4483
4484	#include <isl/printer.h>
4485	__isl_give isl_printer *isl_printer_print_double(
4486		__isl_take isl_printer *p, double d);
4487
4488	#include <isl/val.h>
4489	__isl_give isl_printer *isl_printer_print_val(
4490		__isl_take isl_printer *p, __isl_keep isl_val *v);
4491	__isl_give isl_printer *isl_printer_print_multi_val(
4492		__isl_take isl_printer *p,
4493		__isl_keep isl_multi_val *mv);
4494
4495	#include <isl/set.h>
4496	__isl_give isl_printer *isl_printer_print_basic_set(
4497		__isl_take isl_printer *printer,
4498		__isl_keep isl_basic_set *bset);
4499	__isl_give isl_printer *isl_printer_print_set(
4500		__isl_take isl_printer *printer,
4501		__isl_keep isl_set *set);
4502
4503	#include <isl/map.h>
4504	__isl_give isl_printer *isl_printer_print_basic_map(
4505		__isl_take isl_printer *printer,
4506		__isl_keep isl_basic_map *bmap);
4507	__isl_give isl_printer *isl_printer_print_map(
4508		__isl_take isl_printer *printer,
4509		__isl_keep isl_map *map);
4510
4511	#include <isl/union_set.h>
4512	__isl_give isl_printer *isl_printer_print_union_set(
4513		__isl_take isl_printer *p,
4514		__isl_keep isl_union_set *uset);
4515
4516	#include <isl/union_map.h>
4517	__isl_give isl_printer *isl_printer_print_union_map(
4518		__isl_take isl_printer *p,
4519		__isl_keep isl_union_map *umap);
4520
4521	#include <isl/id.h>
4522	__isl_give isl_printer *isl_printer_print_multi_id(
4523		__isl_take isl_printer *p,
4524		__isl_keep isl_multi_id *mi);
4525
4526	#include <isl/aff.h>
4527	__isl_give isl_printer *isl_printer_print_aff(
4528		__isl_take isl_printer *p, __isl_keep isl_aff *aff);
4529	__isl_give isl_printer *isl_printer_print_multi_aff(
4530		__isl_take isl_printer *p,
4531		__isl_keep isl_multi_aff *maff);
4532	__isl_give isl_printer *isl_printer_print_pw_aff(
4533		__isl_take isl_printer *p,
4534		__isl_keep isl_pw_aff *pwaff);
4535	__isl_give isl_printer *isl_printer_print_pw_multi_aff(
4536		__isl_take isl_printer *p,
4537		__isl_keep isl_pw_multi_aff *pma);
4538	__isl_give isl_printer *isl_printer_print_multi_pw_aff(
4539		__isl_take isl_printer *p,
4540		__isl_keep isl_multi_pw_aff *mpa);
4541	__isl_give isl_printer *isl_printer_print_union_pw_aff(
4542		__isl_take isl_printer *p,
4543		__isl_keep isl_union_pw_aff *upa);
4544	__isl_give isl_printer *isl_printer_print_union_pw_multi_aff(
4545		__isl_take isl_printer *p,
4546		__isl_keep isl_union_pw_multi_aff *upma);
4547	__isl_give isl_printer *
4548	isl_printer_print_multi_union_pw_aff(
4549		__isl_take isl_printer *p,
4550		__isl_keep isl_multi_union_pw_aff *mupa);
4551
4552	#include <isl/polynomial.h>
4553	__isl_give isl_printer *isl_printer_print_qpolynomial(
4554		__isl_take isl_printer *p,
4555		__isl_keep isl_qpolynomial *qp);
4556	__isl_give isl_printer *isl_printer_print_pw_qpolynomial(
4557		__isl_take isl_printer *p,
4558		__isl_keep isl_pw_qpolynomial *pwqp);
4559	__isl_give isl_printer *isl_printer_print_union_pw_qpolynomial(
4560		__isl_take isl_printer *p,
4561		__isl_keep isl_union_pw_qpolynomial *upwqp);
4562
4563	__isl_give isl_printer *
4564	isl_printer_print_pw_qpolynomial_fold(
4565		__isl_take isl_printer *p,
4566		__isl_keep isl_pw_qpolynomial_fold *pwf);
4567	__isl_give isl_printer *
4568	isl_printer_print_union_pw_qpolynomial_fold(
4569		__isl_take isl_printer *p,
4570		__isl_keep isl_union_pw_qpolynomial_fold *upwf);
4571
4572For C<isl_printer_print_qpolynomial>,
4573C<isl_printer_print_pw_qpolynomial> and
4574C<isl_printer_print_pw_qpolynomial_fold>,
4575the output format of the printer
4576needs to be set to either C<ISL_FORMAT_ISL> or C<ISL_FORMAT_C>.
4577For C<isl_printer_print_union_pw_qpolynomial> and
4578C<isl_printer_print_union_pw_qpolynomial_fold>, only C<ISL_FORMAT_ISL>
4579is supported.
4580In case of printing in C<ISL_FORMAT_C>, the user may want
4581to set the names of all dimensions first.
4582
4583C<isl> also provides limited support for printing YAML documents,
4584just enough for the internal use for printing such documents.
4585
4586	#include <isl/printer.h>
4587	__isl_give isl_printer *isl_printer_yaml_start_mapping(
4588		__isl_take isl_printer *p);
4589	__isl_give isl_printer *isl_printer_yaml_end_mapping(
4590		__isl_take isl_printer *p);
4591	__isl_give isl_printer *isl_printer_yaml_start_sequence(
4592		__isl_take isl_printer *p);
4593	__isl_give isl_printer *isl_printer_yaml_end_sequence(
4594		__isl_take isl_printer *p);
4595	__isl_give isl_printer *isl_printer_yaml_next(
4596		__isl_take isl_printer *p);
4597
4598A document is started by a call to either
4599C<isl_printer_yaml_start_mapping> or C<isl_printer_yaml_start_sequence>.
4600Anything printed to the printer after such a call belong to the
4601first key of the mapping or the first element in the sequence.
4602The function C<isl_printer_yaml_next> moves to the value if
4603we are currently printing a mapping key, the next key if we
4604are printing a value or the next element if we are printing
4605an element in a sequence.
4606Nested mappings and sequences are initiated by the same
4607C<isl_printer_yaml_start_mapping> or C<isl_printer_yaml_start_sequence>.
4608Each call to these functions needs to have a corresponding call to
4609C<isl_printer_yaml_end_mapping> or C<isl_printer_yaml_end_sequence>.
4610
4611When called on a file printer, the following function flushes
4612the file.  When called on a string printer, the buffer is cleared.
4613
4614	__isl_give isl_printer *isl_printer_flush(
4615		__isl_take isl_printer *p);
4616
4617The following functions allow the user to attach
4618notes to a printer in order to keep track of additional state.
4619
4620	#include <isl/printer.h>
4621	isl_bool isl_printer_has_note(__isl_keep isl_printer *p,
4622		__isl_keep isl_id *id);
4623	__isl_give isl_id *isl_printer_get_note(
4624		__isl_keep isl_printer *p, __isl_take isl_id *id);
4625	__isl_give isl_printer *isl_printer_set_note(
4626		__isl_take isl_printer *p,
4627		__isl_take isl_id *id, __isl_take isl_id *note);
4628
4629C<isl_printer_set_note> associates the given note to the given
4630identifier in the printer.
4631C<isl_printer_get_note> retrieves a note associated to an
4632identifier, while
4633C<isl_printer_has_note> checks if there is such a note.
4634C<isl_printer_get_note> fails if the requested note does not exist.
4635
4636Alternatively, a string representation can be obtained
4637directly using the following functions, which always print
4638in isl format.
4639
4640	#include <isl/id.h>
4641	__isl_give char *isl_id_to_str(
4642		__isl_keep isl_id *id);
4643	__isl_give char *isl_multi_id_to_str(
4644		__isl_keep isl_multi_id *mi);
4645
4646	#include <isl/space.h>
4647	__isl_give char *isl_space_to_str(
4648		__isl_keep isl_space *space);
4649
4650	#include <isl/val.h>
4651	__isl_give char *isl_val_to_str(__isl_keep isl_val *v);
4652	__isl_give char *isl_multi_val_to_str(
4653		__isl_keep isl_multi_val *mv);
4654
4655	#include <isl/set.h>
4656	__isl_give char *isl_basic_set_to_str(
4657		__isl_keep isl_basic_set *bset);
4658	__isl_give char *isl_set_to_str(
4659		__isl_keep isl_set *set);
4660
4661	#include <isl/union_set.h>
4662	__isl_give char *isl_union_set_to_str(
4663		__isl_keep isl_union_set *uset);
4664
4665	#include <isl/map.h>
4666	__isl_give char *isl_basic_map_to_str(
4667		__isl_keep isl_basic_map *bmap);
4668	__isl_give char *isl_map_to_str(
4669		__isl_keep isl_map *map);
4670
4671	#include <isl/union_map.h>
4672	__isl_give char *isl_union_map_to_str(
4673		__isl_keep isl_union_map *umap);
4674
4675	#include <isl/aff.h>
4676	__isl_give char *isl_aff_to_str(__isl_keep isl_aff *aff);
4677	__isl_give char *isl_pw_aff_to_str(
4678		__isl_keep isl_pw_aff *pa);
4679	__isl_give char *isl_multi_aff_to_str(
4680		__isl_keep isl_multi_aff *ma);
4681	__isl_give char *isl_pw_multi_aff_to_str(
4682		__isl_keep isl_pw_multi_aff *pma);
4683	__isl_give char *isl_multi_pw_aff_to_str(
4684		__isl_keep isl_multi_pw_aff *mpa);
4685	__isl_give char *isl_union_pw_aff_to_str(
4686		__isl_keep isl_union_pw_aff *upa);
4687	__isl_give char *isl_union_pw_multi_aff_to_str(
4688		__isl_keep isl_union_pw_multi_aff *upma);
4689	__isl_give char *isl_multi_union_pw_aff_to_str(
4690		__isl_keep isl_multi_union_pw_aff *mupa);
4691
4692	#include <isl/point.h>
4693	__isl_give char *isl_point_to_str(
4694		__isl_keep isl_point *pnt);
4695
4696	#include <isl/polynomial.h>
4697	__isl_give char *isl_pw_qpolynomial_to_str(
4698		__isl_keep isl_pw_qpolynomial *pwqp);
4699	__isl_give char *isl_union_pw_qpolynomial_to_str(
4700		__isl_keep isl_union_pw_qpolynomial *upwqp);
4701
4702=head2 Properties
4703
4704=head3 Unary Properties
4705
4706=over
4707
4708=item * Emptiness
4709
4710The following functions test whether the given set or relation
4711contains any integer points.  The ``plain'' variants do not perform
4712any computations, but simply check if the given set or relation
4713is already known to be empty.
4714
4715	#include <isl/set.h>
4716	isl_bool isl_basic_set_plain_is_empty(
4717		__isl_keep isl_basic_set *bset);
4718	isl_bool isl_basic_set_is_empty(
4719		__isl_keep isl_basic_set *bset);
4720	isl_bool isl_set_plain_is_empty(
4721		__isl_keep isl_set *set);
4722	isl_bool isl_set_is_empty(__isl_keep isl_set *set);
4723
4724	#include <isl/union_set.h>
4725	isl_bool isl_union_set_is_empty(
4726		__isl_keep isl_union_set *uset);
4727
4728	#include <isl/map.h>
4729	isl_bool isl_basic_map_plain_is_empty(
4730		__isl_keep isl_basic_map *bmap);
4731	isl_bool isl_basic_map_is_empty(
4732		__isl_keep isl_basic_map *bmap);
4733	isl_bool isl_map_plain_is_empty(
4734		__isl_keep isl_map *map);
4735	isl_bool isl_map_is_empty(__isl_keep isl_map *map);
4736
4737	#include <isl/union_map.h>
4738	isl_bool isl_union_map_plain_is_empty(
4739		__isl_keep isl_union_map *umap);
4740	isl_bool isl_union_map_is_empty(
4741		__isl_keep isl_union_map *umap);
4742
4743	#include <isl/aff.h>
4744	isl_bool isl_union_pw_multi_aff_plain_is_empty(
4745		__isl_keep isl_union_pw_multi_aff *upma);
4746
4747=item * Universality
4748
4749	isl_bool isl_basic_set_plain_is_universe(
4750		__isl_keep isl_basic_set *bset);
4751	isl_bool isl_basic_set_is_universe(
4752		__isl_keep isl_basic_set *bset);
4753	isl_bool isl_basic_map_plain_is_universe(
4754		__isl_keep isl_basic_map *bmap);
4755	isl_bool isl_basic_map_is_universe(
4756		__isl_keep isl_basic_map *bmap);
4757	isl_bool isl_set_plain_is_universe(
4758		__isl_keep isl_set *set);
4759	isl_bool isl_map_plain_is_universe(
4760		__isl_keep isl_map *map);
4761
4762=item * Single-valuedness
4763
4764	#include <isl/set.h>
4765	isl_bool isl_set_is_singleton(__isl_keep isl_set *set);
4766
4767	#include <isl/map.h>
4768	isl_bool isl_basic_map_is_single_valued(
4769		__isl_keep isl_basic_map *bmap);
4770	isl_bool isl_map_plain_is_single_valued(
4771		__isl_keep isl_map *map);
4772	isl_bool isl_map_is_single_valued(__isl_keep isl_map *map);
4773
4774	#include <isl/union_map.h>
4775	isl_bool isl_union_map_is_single_valued(
4776		__isl_keep isl_union_map *umap);
4777
4778=item * Injectivity
4779
4780	isl_bool isl_map_plain_is_injective(
4781		__isl_keep isl_map *map);
4782	isl_bool isl_map_is_injective(
4783		__isl_keep isl_map *map);
4784	isl_bool isl_union_map_plain_is_injective(
4785		__isl_keep isl_union_map *umap);
4786	isl_bool isl_union_map_is_injective(
4787		__isl_keep isl_union_map *umap);
4788
4789=item * Bijectivity
4790
4791	isl_bool isl_map_is_bijective(
4792		__isl_keep isl_map *map);
4793	isl_bool isl_union_map_is_bijective(
4794		__isl_keep isl_union_map *umap);
4795
4796=item * Identity
4797
4798The following functions test whether the given relation
4799only maps elements to themselves.
4800
4801	#include <isl/map.h>
4802	isl_bool isl_map_is_identity(
4803		__isl_keep isl_map *map);
4804
4805	#include <isl/union_map.h>
4806	isl_bool isl_union_map_is_identity(
4807		__isl_keep isl_union_map *umap);
4808
4809=item * Position
4810
4811	__isl_give isl_val *
4812	isl_basic_map_plain_get_val_if_fixed(
4813		__isl_keep isl_basic_map *bmap,
4814		enum isl_dim_type type, unsigned pos);
4815	__isl_give isl_val *isl_set_plain_get_val_if_fixed(
4816		__isl_keep isl_set *set,
4817		enum isl_dim_type type, unsigned pos);
4818	__isl_give isl_multi_val *
4819	isl_set_get_plain_multi_val_if_fixed(
4820		__isl_keep isl_set *set);
4821	__isl_give isl_val *isl_map_plain_get_val_if_fixed(
4822		__isl_keep isl_map *map,
4823		enum isl_dim_type type, unsigned pos);
4824
4825If the set or relation obviously lies on a hyperplane where the given dimension
4826has a fixed value, then return that value.
4827Otherwise return NaN.
4828C<isl_set_get_plain_multi_val_if_fixed> collects the results over
4829all set dimensions.
4830
4831=item * Stride
4832
4833Stride detection is based on heuristics.
4834The strides returned by the functions below are always valid,
4835but there may be larger valid strides that are not detected.
4836
4837	isl_stat isl_set_dim_residue_class_val(
4838		__isl_keep isl_set *set,
4839		int pos, __isl_give isl_val **modulo,
4840		__isl_give isl_val **residue);
4841
4842Check if the values of the given set dimension are equal to a fixed
4843value modulo some integer value.  If so, assign the modulo to C<*modulo>
4844and the fixed value to C<*residue>.  If the given dimension attains only
4845a single value, then assign C<0> to C<*modulo> and the fixed value to
4846C<*residue>.
4847If the dimension does not attain only a single value and if no modulo
4848can be found then assign C<1> to C<*modulo> and C<1> to C<*residue>.
4849
4850	#include <isl/set.h>
4851	__isl_give isl_stride_info *isl_set_get_stride_info(
4852		__isl_keep isl_set *set, int pos);
4853	__isl_give isl_val *isl_set_get_stride(
4854		__isl_keep isl_set *set, int pos);
4855	__isl_give isl_fixed_box *isl_set_get_lattice_tile(
4856		__isl_keep isl_set *set);
4857
4858	#include <isl/map.h>
4859	__isl_give isl_stride_info *
4860	isl_map_get_range_stride_info(
4861		__isl_keep isl_map *map, int pos);
4862	__isl_give isl_fixed_box *
4863	isl_map_get_range_lattice_tile(
4864		__isl_keep isl_map *map);
4865
4866Check if the values of the given set dimension are equal to
4867some affine expression of the other dimensions (the offset)
4868modulo some integer stride or
4869check if the values of the given output dimensions are equal to
4870some affine expression of the input dimensions (the offset)
4871modulo some integer stride.
4872If no more specific information can be found, then the stride
4873is taken to be one and the offset is taken to be the zero expression.
4874The function C<isl_set_get_stride> performs the same
4875computation as C<isl_set_get_stride_info> but only returns the stride.
4876The function C<isl_map_get_range_lattice_tile> collects the stride
4877information over all output dimensions.
4878In particular, it returns a tile of a rectangular lattice
4879(possibly of size 1 in all directions)
4880containing the output in terms of the parameters and the input dimensions.
4881The size and the offset of this tile correspond to
4882the strides and the offsets of the stride information and
4883can be extracted from the returned
4884C<isl_fixed_box> using the functions described under "Box hull" in
4885L</"Unary Operations">.  Note that the C<isl_fixed_box> object returned by
4886C<isl_map_get_range_lattice_tile> is always valid.
4887The function C<isl_set_get_lattice_tile> collects the same stride
4888information over all set dimensions.
4889For the other functions,
4890the stride and offset can be extracted from the returned object
4891using the following functions.
4892
4893	#include <isl/stride_info.h>
4894	__isl_give isl_val *isl_stride_info_get_stride(
4895		__isl_keep isl_stride_info *si);
4896	__isl_give isl_aff *isl_stride_info_get_offset(
4897		__isl_keep isl_stride_info *si);
4898
4899The stride info object can be copied and released using the following
4900functions.
4901
4902	#include <isl/stride_info.h>
4903	__isl_give isl_stride_info *isl_stride_info_copy(
4904		__isl_keep isl_stride_info *si);
4905	__isl_null isl_stride_info *isl_stride_info_free(
4906		__isl_take isl_stride_info *si);
4907
4908=item * Dependence
4909
4910To check whether a function involves any local variables,
4911i.e., integer divisions,
4912the following functions can be used.
4913
4914	#include <isl/set.h>
4915	isl_bool isl_set_involves_locals(
4916		__isl_keep isl_set *set);
4917
4918	#include <isl/aff.h>
4919	isl_bool isl_aff_involves_locals(
4920		__isl_keep isl_aff *aff);
4921	isl_bool isl_multi_aff_involves_locals(
4922		__isl_keep isl_multi_aff *ma);
4923	isl_bool isl_pw_multi_aff_involves_locals(
4924		__isl_keep isl_pw_multi_aff *pma);
4925	isl_bool isl_union_pw_multi_aff_involves_locals(
4926		__isl_keep isl_union_pw_multi_aff *upma);
4927
4928To check whether the description of a set, relation or function depends
4929on a parameter or one or more given dimensions,
4930the following functions can be used.
4931
4932	#include <isl/constraint.h>
4933	isl_bool isl_constraint_involves_dims(
4934		__isl_keep isl_constraint *constraint,
4935		enum isl_dim_type type, unsigned first, unsigned n);
4936
4937	#include <isl/set.h>
4938	isl_bool isl_basic_set_involves_dims(
4939		__isl_keep isl_basic_set *bset,
4940		enum isl_dim_type type, unsigned first, unsigned n);
4941	isl_bool isl_set_involves_dims(__isl_keep isl_set *set,
4942		enum isl_dim_type type, unsigned first, unsigned n);
4943
4944	#include <isl/map.h>
4945	isl_bool isl_basic_map_involves_dims(
4946		__isl_keep isl_basic_map *bmap,
4947		enum isl_dim_type type, unsigned first, unsigned n);
4948	isl_bool isl_map_involves_dims(__isl_keep isl_map *map,
4949		enum isl_dim_type type, unsigned first, unsigned n);
4950
4951	#include <isl/union_map.h>
4952	isl_bool isl_union_map_involves_dims(
4953		__isl_keep isl_union_map *umap,
4954		enum isl_dim_type type, unsigned first, unsigned n);
4955
4956	#include <isl/aff.h>
4957	isl_bool isl_aff_involves_dims(__isl_keep isl_aff *aff,
4958		enum isl_dim_type type, unsigned first, unsigned n);
4959	isl_bool isl_pw_aff_involves_param_id(
4960		__isl_keep isl_pw_aff *pa,
4961		__isl_keep isl_id *id);
4962	isl_bool isl_pw_aff_involves_dims(
4963		__isl_keep isl_pw_aff *pwaff,
4964		enum isl_dim_type type, unsigned first, unsigned n);
4965	isl_bool isl_multi_aff_involves_dims(
4966		__isl_keep isl_multi_aff *ma,
4967		enum isl_dim_type type, unsigned first, unsigned n);
4968	isl_bool isl_pw_multi_aff_involves_param_id(
4969		__isl_keep isl_pw_multi_aff *pma,
4970		__isl_keep isl_id *id);
4971	isl_bool isl_pw_multi_aff_involves_dims(
4972		__isl_keep isl_pw_multi_aff *pma,
4973		enum isl_dim_type type, unsigned first, unsigned n);
4974	isl_bool isl_multi_pw_aff_involves_dims(
4975		__isl_keep isl_multi_pw_aff *mpa,
4976		enum isl_dim_type type, unsigned first, unsigned n);
4977	isl_bool isl_multi_pw_aff_involves_param_id(
4978		__isl_keep isl_multi_pw_aff *mpa,
4979		__isl_keep isl_id *id);
4980	isl_bool isl_multi_pw_aff_involves_param_id_list(
4981		__isl_keep isl_multi_pw_aff *mpa,
4982		__isl_keep isl_id_list *list);
4983
4984	#include <isl/polynomial.h>
4985	isl_bool isl_qpolynomial_involves_dims(
4986		__isl_keep isl_qpolynomial *qp,
4987		enum isl_dim_type type, unsigned first, unsigned n);
4988	isl_bool isl_pw_qpolynomial_involves_param_id(
4989		__isl_keep isl_pw_qpolynomial *pwqp,
4990		__isl_keep isl_id *id);
4991	isl_bool isl_pw_qpolynomial_fold_involves_param_id(
4992		__isl_keep isl_pw_qpolynomial_fold *pwf,
4993		__isl_keep isl_id *id);
4994
4995Similarly, the following functions can be used to check whether
4996a given dimension is involved in any lower or upper bound.
4997
4998	#include <isl/set.h>
4999	isl_bool isl_set_dim_has_any_lower_bound(
5000		__isl_keep isl_set *set,
5001		enum isl_dim_type type, unsigned pos);
5002	isl_bool isl_set_dim_has_any_upper_bound(
5003		__isl_keep isl_set *set,
5004		enum isl_dim_type type, unsigned pos);
5005
5006Note that these functions return true even if there is a bound on
5007the dimension on only some of the basic sets of C<set>.
5008To check if they have a bound for all of the basic sets in C<set>,
5009use the following functions instead.
5010
5011	#include <isl/set.h>
5012	isl_bool isl_set_dim_has_lower_bound(
5013		__isl_keep isl_set *set,
5014		enum isl_dim_type type, unsigned pos);
5015	isl_bool isl_set_dim_has_upper_bound(
5016		__isl_keep isl_set *set,
5017		enum isl_dim_type type, unsigned pos);
5018
5019=item * Space
5020
5021To check whether a set is a parameter domain, use this function:
5022
5023	isl_bool isl_set_is_params(__isl_keep isl_set *set);
5024	isl_bool isl_union_set_is_params(
5025		__isl_keep isl_union_set *uset);
5026
5027=item * Wrapping
5028
5029The following functions check whether the space of the given
5030(basic) set or relation domain and/or range is a wrapped relation.
5031
5032	#include <isl/space.h>
5033	isl_bool isl_space_is_wrapping(
5034		__isl_keep isl_space *space);
5035	isl_bool isl_space_domain_is_wrapping(
5036		__isl_keep isl_space *space);
5037	isl_bool isl_space_range_is_wrapping(
5038		__isl_keep isl_space *space);
5039	isl_bool isl_space_is_product(
5040		__isl_keep isl_space *space);
5041
5042	#include <isl/set.h>
5043	isl_bool isl_basic_set_is_wrapping(
5044		__isl_keep isl_basic_set *bset);
5045	isl_bool isl_set_is_wrapping(__isl_keep isl_set *set);
5046
5047	#include <isl/map.h>
5048	isl_bool isl_map_domain_is_wrapping(
5049		__isl_keep isl_map *map);
5050	isl_bool isl_map_range_is_wrapping(
5051		__isl_keep isl_map *map);
5052	isl_bool isl_map_is_product(__isl_keep isl_map *map);
5053
5054	#include <isl/id.h>
5055	isl_bool isl_multi_id_range_is_wrapping(
5056		__isl_keep isl_multi_id *mi);
5057
5058	#include <isl/val.h>
5059	isl_bool isl_multi_val_range_is_wrapping(
5060		__isl_keep isl_multi_val *mv);
5061
5062	#include <isl/aff.h>
5063	isl_bool isl_multi_aff_range_is_wrapping(
5064		__isl_keep isl_multi_aff *ma);
5065	isl_bool isl_multi_pw_aff_range_is_wrapping(
5066		__isl_keep isl_multi_pw_aff *mpa);
5067	isl_bool isl_multi_union_pw_aff_range_is_wrapping(
5068		__isl_keep isl_multi_union_pw_aff *mupa);
5069
5070The input to C<isl_space_is_wrapping> should
5071be the space of a set, while that of
5072C<isl_space_domain_is_wrapping> and
5073C<isl_space_range_is_wrapping> should be the space of a relation.
5074The input to C<isl_space_is_product> can be either the space
5075of a set or that of a binary relation.
5076In case the input is the space of a binary relation, it checks
5077whether both domain and range are wrapping.
5078
5079=item * Internal Product
5080
5081	isl_bool isl_basic_map_can_zip(
5082		__isl_keep isl_basic_map *bmap);
5083	isl_bool isl_map_can_zip(__isl_keep isl_map *map);
5084
5085Check whether the product of domain and range of the given relation
5086can be computed,
5087i.e., whether both domain and range are nested relations.
5088
5089=item * Currying
5090
5091	#include <isl/space.h>
5092	isl_bool isl_space_can_curry(
5093		__isl_keep isl_space *space);
5094
5095	#include <isl/map.h>
5096	isl_bool isl_basic_map_can_curry(
5097		__isl_keep isl_basic_map *bmap);
5098	isl_bool isl_map_can_curry(__isl_keep isl_map *map);
5099
5100Check whether the domain of the (basic) relation is a wrapped relation.
5101
5102	#include <isl/space.h>
5103	isl_bool isl_space_can_uncurry(
5104		__isl_keep isl_space *space);
5105
5106	#include <isl/map.h>
5107	isl_bool isl_basic_map_can_uncurry(
5108		__isl_keep isl_basic_map *bmap);
5109	isl_bool isl_map_can_uncurry(__isl_keep isl_map *map);
5110
5111Check whether the range of the (basic) relation is a wrapped relation.
5112
5113	#include <isl/space.h>
5114	isl_bool isl_space_can_range_curry(
5115		__isl_keep isl_space *space);
5116
5117	#include <isl/map.h>
5118	isl_bool isl_map_can_range_curry(
5119		__isl_keep isl_map *map);
5120
5121Check whether the domain of the relation wrapped in the range of
5122the input is itself a wrapped relation.
5123
5124=item * Special Values
5125
5126	#include <isl/aff.h>
5127	isl_bool isl_aff_is_cst(__isl_keep isl_aff *aff);
5128	isl_bool isl_pw_aff_is_cst(__isl_keep isl_pw_aff *pwaff);
5129	isl_bool isl_multi_pw_aff_is_cst(
5130		__isl_keep isl_multi_pw_aff *mpa);
5131
5132Check whether the given expression is a constant.
5133
5134	#include <isl/val.h>
5135	isl_bool isl_multi_val_involves_nan(
5136		__isl_keep isl_multi_val *mv);
5137
5138	#include <isl/aff.h>
5139	isl_bool isl_aff_is_nan(__isl_keep isl_aff *aff);
5140	isl_bool isl_multi_aff_involves_nan(
5141		__isl_keep isl_multi_aff *ma);
5142	isl_bool isl_pw_aff_involves_nan(
5143		__isl_keep isl_pw_aff *pa);
5144	isl_bool isl_pw_multi_aff_involves_nan(
5145		__isl_keep isl_pw_multi_aff *pma);
5146	isl_bool isl_multi_pw_aff_involves_nan(
5147		__isl_keep isl_multi_pw_aff *mpa);
5148	isl_bool isl_union_pw_aff_involves_nan(
5149		__isl_keep isl_union_pw_aff *upa);
5150	isl_bool isl_union_pw_multi_aff_involves_nan(
5151		__isl_keep isl_union_pw_multi_aff *upma);
5152	isl_bool isl_multi_union_pw_aff_involves_nan(
5153		__isl_keep isl_multi_union_pw_aff *mupa);
5154
5155	#include <isl/polynomial.h>
5156	isl_bool isl_qpolynomial_is_nan(
5157		__isl_keep isl_qpolynomial *qp);
5158	isl_bool isl_qpolynomial_fold_is_nan(
5159		__isl_keep isl_qpolynomial_fold *fold);
5160	isl_bool isl_pw_qpolynomial_involves_nan(
5161		__isl_keep isl_pw_qpolynomial *pwqp);
5162	isl_bool isl_pw_qpolynomial_fold_involves_nan(
5163		__isl_keep isl_pw_qpolynomial_fold *pwf);
5164	isl_bool isl_union_pw_qpolynomial_involves_nan(
5165		__isl_keep isl_union_pw_qpolynomial *upwqp);
5166	isl_bool isl_union_pw_qpolynomial_fold_involves_nan(
5167		__isl_keep isl_union_pw_qpolynomial_fold *upwf);
5168
5169Check whether the given expression is equal to or involves NaN.
5170
5171	#include <isl/val.h>
5172	isl_bool isl_multi_val_is_zero(
5173		__isl_keep isl_multi_val *mv);
5174
5175Check whether the multiple value is zero.
5176
5177	#include <isl/aff.h>
5178	isl_bool isl_aff_plain_is_zero(
5179		__isl_keep isl_aff *aff);
5180
5181Check whether the affine expression is obviously zero.
5182
5183=back
5184
5185=head3 Binary Properties
5186
5187=over
5188
5189=item * Equality
5190
5191The following functions check whether two objects
5192represent the same set, relation or function.
5193The C<plain> variants only return true if the objects
5194are obviously the same.  That is, they may return false
5195even if the objects are the same, but they will never
5196return true if the objects are not the same.
5197
5198	#include <isl/set.h>
5199	isl_bool isl_basic_set_plain_is_equal(
5200		__isl_keep isl_basic_set *bset1,
5201		__isl_keep isl_basic_set *bset2);
5202	isl_bool isl_basic_set_is_equal(
5203		__isl_keep isl_basic_set *bset1,
5204		__isl_keep isl_basic_set *bset2);
5205	isl_bool isl_set_plain_is_equal(
5206		__isl_keep isl_set *set1,
5207		__isl_keep isl_set *set2);
5208	isl_bool isl_set_is_equal(__isl_keep isl_set *set1,
5209		__isl_keep isl_set *set2);
5210
5211	#include <isl/map.h>
5212	isl_bool isl_basic_map_is_equal(
5213		__isl_keep isl_basic_map *bmap1,
5214		__isl_keep isl_basic_map *bmap2);
5215	isl_bool isl_map_is_equal(__isl_keep isl_map *map1,
5216		__isl_keep isl_map *map2);
5217	isl_bool isl_map_plain_is_equal(
5218		__isl_keep isl_map *map1,
5219		__isl_keep isl_map *map2);
5220
5221	#include <isl/union_set.h>
5222	isl_bool isl_union_set_is_equal(
5223		__isl_keep isl_union_set *uset1,
5224		__isl_keep isl_union_set *uset2);
5225
5226	#include <isl/union_map.h>
5227	isl_bool isl_union_map_is_equal(
5228		__isl_keep isl_union_map *umap1,
5229		__isl_keep isl_union_map *umap2);
5230
5231	#include <isl/id.h>
5232	isl_bool isl_multi_id_plain_is_equal(
5233		__isl_keep isl_multi_id *mi1,
5234		__isl_keep isl_multi_id *mi2);
5235
5236	#include <isl/val.h>
5237	isl_bool isl_multi_val_plain_is_equal(
5238		__isl_keep isl_multi_val *mv1,
5239		__isl_keep isl_multi_val *mv2);
5240
5241	#include <isl/aff.h>
5242	isl_bool isl_aff_plain_is_equal(
5243		__isl_keep isl_aff *aff1,
5244		__isl_keep isl_aff *aff2);
5245	isl_bool isl_multi_aff_plain_is_equal(
5246		__isl_keep isl_multi_aff *maff1,
5247		__isl_keep isl_multi_aff *maff2);
5248	isl_bool isl_pw_aff_plain_is_equal(
5249		__isl_keep isl_pw_aff *pwaff1,
5250		__isl_keep isl_pw_aff *pwaff2);
5251	isl_bool isl_pw_aff_is_equal(
5252		__isl_keep isl_pw_aff *pa1,
5253		__isl_keep isl_pw_aff *pa2);
5254	isl_bool isl_pw_multi_aff_plain_is_equal(
5255		__isl_keep isl_pw_multi_aff *pma1,
5256		__isl_keep isl_pw_multi_aff *pma2);
5257	isl_bool isl_pw_multi_aff_is_equal(
5258		__isl_keep isl_pw_multi_aff *pma1,
5259		__isl_keep isl_pw_multi_aff *pma2);
5260	isl_bool isl_multi_pw_aff_plain_is_equal(
5261		__isl_keep isl_multi_pw_aff *mpa1,
5262		__isl_keep isl_multi_pw_aff *mpa2);
5263	isl_bool isl_multi_pw_aff_is_equal(
5264		__isl_keep isl_multi_pw_aff *mpa1,
5265		__isl_keep isl_multi_pw_aff *mpa2);
5266	isl_bool isl_union_pw_aff_plain_is_equal(
5267		__isl_keep isl_union_pw_aff *upa1,
5268		__isl_keep isl_union_pw_aff *upa2);
5269	isl_bool isl_union_pw_multi_aff_plain_is_equal(
5270		__isl_keep isl_union_pw_multi_aff *upma1,
5271		__isl_keep isl_union_pw_multi_aff *upma2);
5272	isl_bool isl_multi_union_pw_aff_plain_is_equal(
5273		__isl_keep isl_multi_union_pw_aff *mupa1,
5274		__isl_keep isl_multi_union_pw_aff *mupa2);
5275
5276	#include <isl/polynomial.h>
5277	isl_bool isl_union_pw_qpolynomial_plain_is_equal(
5278		__isl_keep isl_union_pw_qpolynomial *upwqp1,
5279		__isl_keep isl_union_pw_qpolynomial *upwqp2);
5280	isl_bool isl_union_pw_qpolynomial_fold_plain_is_equal(
5281		__isl_keep isl_union_pw_qpolynomial_fold *upwf1,
5282		__isl_keep isl_union_pw_qpolynomial_fold *upwf2);
5283
5284=item * Disjointness
5285
5286	#include <isl/set.h>
5287	isl_bool isl_basic_set_is_disjoint(
5288		__isl_keep isl_basic_set *bset1,
5289		__isl_keep isl_basic_set *bset2);
5290	isl_bool isl_set_plain_is_disjoint(
5291		__isl_keep isl_set *set1,
5292		__isl_keep isl_set *set2);
5293	isl_bool isl_set_is_disjoint(__isl_keep isl_set *set1,
5294		__isl_keep isl_set *set2);
5295
5296	#include <isl/map.h>
5297	isl_bool isl_basic_map_is_disjoint(
5298		__isl_keep isl_basic_map *bmap1,
5299		__isl_keep isl_basic_map *bmap2);
5300	isl_bool isl_map_is_disjoint(__isl_keep isl_map *map1,
5301		__isl_keep isl_map *map2);
5302
5303	#include <isl/union_set.h>
5304	isl_bool isl_union_set_is_disjoint(
5305		__isl_keep isl_union_set *uset1,
5306		__isl_keep isl_union_set *uset2);
5307
5308	#include <isl/union_map.h>
5309	isl_bool isl_union_map_is_disjoint(
5310		__isl_keep isl_union_map *umap1,
5311		__isl_keep isl_union_map *umap2);
5312
5313=item * Subset
5314
5315	isl_bool isl_basic_set_is_subset(
5316		__isl_keep isl_basic_set *bset1,
5317		__isl_keep isl_basic_set *bset2);
5318	isl_bool isl_set_is_subset(__isl_keep isl_set *set1,
5319		__isl_keep isl_set *set2);
5320	isl_bool isl_set_is_strict_subset(
5321		__isl_keep isl_set *set1,
5322		__isl_keep isl_set *set2);
5323	isl_bool isl_union_set_is_subset(
5324		__isl_keep isl_union_set *uset1,
5325		__isl_keep isl_union_set *uset2);
5326	isl_bool isl_union_set_is_strict_subset(
5327		__isl_keep isl_union_set *uset1,
5328		__isl_keep isl_union_set *uset2);
5329	isl_bool isl_basic_map_is_subset(
5330		__isl_keep isl_basic_map *bmap1,
5331		__isl_keep isl_basic_map *bmap2);
5332	isl_bool isl_basic_map_is_strict_subset(
5333		__isl_keep isl_basic_map *bmap1,
5334		__isl_keep isl_basic_map *bmap2);
5335	isl_bool isl_map_is_subset(
5336		__isl_keep isl_map *map1,
5337		__isl_keep isl_map *map2);
5338	isl_bool isl_map_is_strict_subset(
5339		__isl_keep isl_map *map1,
5340		__isl_keep isl_map *map2);
5341	isl_bool isl_union_map_is_subset(
5342		__isl_keep isl_union_map *umap1,
5343		__isl_keep isl_union_map *umap2);
5344	isl_bool isl_union_map_is_strict_subset(
5345		__isl_keep isl_union_map *umap1,
5346		__isl_keep isl_union_map *umap2);
5347
5348Check whether the first argument is a (strict) subset of the
5349second argument.
5350
5351=item * Order
5352
5353Every comparison function returns a negative value if the first
5354argument is considered smaller than the second, a positive value
5355if the first argument is considered greater and zero if the two
5356constraints are considered the same by the comparison criterion.
5357
5358	#include <isl/constraint.h>
5359	int isl_constraint_plain_cmp(
5360		__isl_keep isl_constraint *c1,
5361		__isl_keep isl_constraint *c2);
5362
5363This function is useful for sorting C<isl_constraint>s.
5364The order depends on the internal representation of the inputs.
5365The order is fixed over different calls to the function (assuming
5366the internal representation of the inputs has not changed), but may
5367change over different versions of C<isl>.
5368
5369	#include <isl/constraint.h>
5370	int isl_constraint_cmp_last_non_zero(
5371		__isl_keep isl_constraint *c1,
5372		__isl_keep isl_constraint *c2);
5373
5374This function can be used to sort constraints that live in the same
5375local space.  Constraints that involve ``earlier'' dimensions or
5376that have a smaller coefficient for the shared latest dimension
5377are considered smaller than other constraints.
5378This function only defines a B<partial> order.
5379
5380	#include <isl/set.h>
5381	int isl_set_plain_cmp(__isl_keep isl_set *set1,
5382		__isl_keep isl_set *set2);
5383
5384This function is useful for sorting C<isl_set>s.
5385The order depends on the internal representation of the inputs.
5386The order is fixed over different calls to the function (assuming
5387the internal representation of the inputs has not changed), but may
5388change over different versions of C<isl>.
5389
5390	#include <isl/aff.h>
5391	int isl_multi_aff_plain_cmp(
5392		__isl_keep isl_multi_aff *ma1,
5393		__isl_keep isl_multi_aff *ma2);
5394	int isl_pw_aff_plain_cmp(__isl_keep isl_pw_aff *pa1,
5395		__isl_keep isl_pw_aff *pa2);
5396
5397The functions C<isl_multi_aff_plain_cmp> and
5398C<isl_pw_aff_plain_cmp> can be used to sort C<isl_multi_aff>s and
5399C<isl_pw_aff>s.  The order is not strictly defined.
5400The current order sorts expressions that only involve
5401earlier dimensions before those that involve later dimensions.
5402
5403=back
5404
5405=head2 Unary Operations
5406
5407=over
5408
5409=item * Complement
5410
5411	__isl_give isl_set *isl_set_complement(
5412		__isl_take isl_set *set);
5413	__isl_give isl_map *isl_map_complement(
5414		__isl_take isl_map *map);
5415
5416=item * Inverse map
5417
5418	#include <isl/space.h>
5419	__isl_give isl_space *isl_space_reverse(
5420		__isl_take isl_space *space);
5421	__isl_give isl_space *isl_space_range_reverse(
5422		__isl_take isl_space *space);
5423
5424	#include <isl/map.h>
5425	__isl_give isl_basic_map *isl_basic_map_reverse(
5426		__isl_take isl_basic_map *bmap);
5427	__isl_give isl_map *isl_map_reverse(
5428		__isl_take isl_map *map);
5429	__isl_give isl_map *isl_map_range_reverse(
5430		__isl_take isl_map *map);
5431
5432	#include <isl/union_map.h>
5433	__isl_give isl_union_map *isl_union_map_reverse(
5434		__isl_take isl_union_map *umap);
5435	__isl_give isl_union_map *isl_union_map_range_reverse(
5436		__isl_take isl_union_map *umap);
5437
5438The function C<isl_space_range_reverse> reverses the relation
5439that is embedded in the range of the input map space.
5440The identifier of the range, if any, is only preserved
5441if this embedded relation has identical input and output tuples.
5442
5443=item * Tuple binding
5444
5445The following function binds
5446a tuple to a sequence of parameter identifiers, equating
5447the tuple dimensions to the parameters with those identifiers and
5448subsequently projecting out the tuple.
5449If the original object did not reference any such parameters,
5450then this means that the tuple dimensions are reinterpreted
5451as parameters.
5452The space of C<tuple> needs to match that of the bound tuple.
5453
5454	#include <isl/set.h>
5455	__isl_give isl_set *isl_set_bind(
5456		__isl_take isl_set *set,
5457		__isl_take isl_multi_id *tuple);
5458
5459	#include <isl/map.h>
5460	__isl_give isl_set *isl_map_bind_domain(
5461		__isl_take isl_map *map,
5462		__isl_take isl_multi_id *tuple);
5463	__isl_give isl_set *isl_map_bind_range(
5464		__isl_take isl_map *map,
5465		__isl_take isl_multi_id *tuple);
5466
5467	#include <isl/union_map.h>
5468	__isl_give isl_union_set *isl_union_map_bind_range(
5469		__isl_take isl_union_map *umap,
5470		__isl_take isl_multi_id *tuple);
5471
5472	#include <isl/aff.h>
5473	__isl_give isl_pw_aff *isl_pw_aff_bind_domain(
5474		__isl_take isl_pw_aff *pa,
5475		__isl_take isl_multi_id *tuple);
5476	__isl_give isl_multi_aff *isl_multi_aff_bind_domain(
5477		__isl_take isl_multi_aff *ma,
5478		__isl_take isl_multi_id *tuple);
5479	__isl_give isl_pw_multi_aff *
5480	isl_pw_multi_aff_bind_domain(
5481		__isl_take isl_pw_multi_aff *pma,
5482		__isl_take isl_multi_id *tuple);
5483	__isl_give isl_multi_pw_aff *
5484	isl_multi_pw_aff_bind_domain(
5485		__isl_take isl_multi_pw_aff *mpa,
5486		__isl_take isl_multi_id *tuple);
5487	__isl_give isl_pw_aff *
5488	isl_pw_aff_bind_domain_wrapped_domain(
5489		__isl_take isl_pw_aff *pa,
5490		__isl_take isl_multi_id *tuple);
5491	__isl_give isl_multi_aff *
5492	isl_multi_aff_bind_domain_wrapped_domain(
5493		__isl_take isl_multi_aff *ma,
5494		__isl_take isl_multi_id *tuple);
5495	__isl_give isl_pw_multi_aff *
5496	isl_pw_multi_aff_bind_domain_wrapped_domain(
5497		__isl_take isl_pw_multi_aff *pma,
5498		__isl_take isl_multi_id *tuple);
5499	__isl_give isl_multi_pw_aff *
5500	isl_multi_pw_aff_bind_domain_wrapped_domain(
5501		__isl_take isl_multi_pw_aff *mpa,
5502		__isl_take isl_multi_id *tuple);
5503	__isl_give isl_basic_set *isl_aff_bind_id(
5504		__isl_take isl_aff *aff,
5505		__isl_take isl_id *id);
5506	__isl_give isl_set *isl_pw_aff_bind_id(
5507		__isl_take isl_pw_aff *pa,
5508		__isl_take isl_id *id);
5509	__isl_give isl_basic_set *isl_multi_aff_bind(
5510		__isl_take isl_multi_aff *ma,
5511		__isl_take isl_multi_id *tuple);
5512	__isl_give isl_set *isl_multi_pw_aff_bind(
5513		__isl_take isl_multi_pw_aff *mpa,
5514		__isl_take isl_multi_id *tuple);
5515	__isl_give isl_union_set *isl_union_pw_aff_bind_id(
5516		__isl_take isl_union_pw_aff *upa,
5517		__isl_take isl_id *id);
5518	__isl_give isl_union_set *
5519	isl_multi_union_pw_aff_bind(
5520		__isl_take isl_multi_union_pw_aff *mupa,
5521		__isl_take isl_multi_id *tuple);
5522
5523Projecting out the domain of the wrapped relation in the domain
5524of a function leaves the range of that wrapped relation
5525in the domain of the resulting function.
5526In the case of C<isl_aff_bind_id>, C<isl_pw_aff_bind_id>,
5527C<isl_multi_aff_bind>, C<isl_multi_pw_aff_bind>,
5528C<isl_union_pw_aff_bind_id> and
5529C<isl_multi_union_pw_aff_bind>, the parameters
5530are bound to the function values and the result lives
5531in the domain of the input function.
5532
5533=item * Projection
5534
5535	#include <isl/space.h>
5536	__isl_give isl_space *isl_space_domain(
5537		__isl_take isl_space *space);
5538	__isl_give isl_space *isl_space_range(
5539		__isl_take isl_space *space);
5540	__isl_give isl_space *isl_space_params(
5541		__isl_take isl_space *space);
5542	__isl_give isl_space *
5543	isl_space_domain_wrapped_domain(
5544		__isl_take isl_space *space);
5545	__isl_give isl_space *
5546	isl_space_domain_wrapped_range(
5547		__isl_take isl_space *space);
5548	__isl_give isl_space *
5549	isl_space_range_wrapped_domain(
5550		__isl_take isl_space *space);
5551	__isl_give isl_space *
5552	isl_space_range_wrapped_range(
5553		__isl_take isl_space *space);
5554
5555	#include <isl/local_space.h>
5556	__isl_give isl_local_space *isl_local_space_domain(
5557		__isl_take isl_local_space *ls);
5558	__isl_give isl_local_space *isl_local_space_range(
5559		__isl_take isl_local_space *ls);
5560
5561	#include <isl/set.h>
5562	__isl_give isl_basic_set *isl_basic_set_project_out(
5563		__isl_take isl_basic_set *bset,
5564		enum isl_dim_type type, unsigned first, unsigned n);
5565	__isl_give isl_set *isl_set_project_out_param_id(
5566		__isl_take isl_set *set,
5567		__isl_take isl_id *id);
5568	__isl_give isl_set *
5569	isl_set_project_out_param_id_list(
5570		__isl_take isl_set *set,
5571		__isl_take isl_id_list *list);
5572	__isl_give isl_set *isl_set_project_out(__isl_take isl_set *set,
5573		enum isl_dim_type type, unsigned first, unsigned n);
5574	__isl_give isl_set *isl_set_project_out_all_params(
5575		__isl_take isl_set *set);
5576	__isl_give isl_map *isl_set_project_onto_map(
5577		__isl_take isl_set *set,
5578		enum isl_dim_type type, unsigned first,
5579		unsigned n);
5580	__isl_give isl_basic_set *isl_basic_set_params(
5581		__isl_take isl_basic_set *bset);
5582	__isl_give isl_set *isl_set_params(__isl_take isl_set *set);
5583
5584The function C<isl_space_domain_wrapped_domain> returns the domain
5585of the binary relation wrapped inside the domain of the input.
5586The function C<isl_set_project_onto_map> returns a relation
5587that projects the input set onto the given set dimensions.
5588
5589	#include <isl/map.h>
5590	__isl_give isl_basic_map *isl_basic_map_project_out(
5591		__isl_take isl_basic_map *bmap,
5592		enum isl_dim_type type, unsigned first, unsigned n);
5593	__isl_give isl_map *isl_map_project_out_param_id(
5594		__isl_take isl_map *map,
5595		__isl_take isl_id *id);
5596	__isl_give isl_map *isl_map_project_out_param_id_list(
5597		__isl_take isl_map *map,
5598		__isl_take isl_id_list *list);
5599	__isl_give isl_map *isl_map_project_out(__isl_take isl_map *map,
5600		enum isl_dim_type type, unsigned first, unsigned n);
5601	__isl_give isl_map *isl_map_project_out_all_params(
5602		__isl_take isl_map *map);
5603	__isl_give isl_basic_set *isl_basic_map_domain(
5604		__isl_take isl_basic_map *bmap);
5605	__isl_give isl_basic_set *isl_basic_map_range(
5606		__isl_take isl_basic_map *bmap);
5607	__isl_give isl_set *isl_map_params(__isl_take isl_map *map);
5608	__isl_give isl_set *isl_map_domain(
5609		__isl_take isl_map *bmap);
5610	__isl_give isl_set *isl_map_range(
5611		__isl_take isl_map *map);
5612
5613	#include <isl/union_set.h>
5614	__isl_give isl_union_set *isl_union_set_project_out(
5615		__isl_take isl_union_set *uset,
5616		enum isl_dim_type type,
5617		unsigned first, unsigned n);
5618	__isl_give isl_union_set *
5619	isl_union_set_project_out_all_params(
5620		__isl_take isl_union_set *uset);
5621	__isl_give isl_set *isl_union_set_params(
5622		__isl_take isl_union_set *uset);
5623
5624The function C<isl_union_set_project_out> can only project out
5625parameters.
5626
5627	#include <isl/union_map.h>
5628	__isl_give isl_union_map *
5629	isl_union_map_project_out_param_id(
5630		__isl_take isl_union_map *umap,
5631		__isl_take isl_id *id);
5632	__isl_give isl_union_map *
5633	isl_union_map_project_out_param_id_list(
5634		__isl_take isl_union_map *umap,
5635		__isl_take isl_id_list *list);
5636	__isl_give isl_union_map *isl_union_map_project_out(
5637		__isl_take isl_union_map *umap,
5638		enum isl_dim_type type, unsigned first, unsigned n);
5639	__isl_give isl_union_map *
5640	isl_union_map_project_out_all_params(
5641		__isl_take isl_union_map *umap);
5642	__isl_give isl_set *isl_union_map_params(
5643		__isl_take isl_union_map *umap);
5644	__isl_give isl_union_set *isl_union_map_domain(
5645		__isl_take isl_union_map *umap);
5646	__isl_give isl_union_set *isl_union_map_range(
5647		__isl_take isl_union_map *umap);
5648
5649The function C<isl_union_map_project_out> can only project out
5650parameters.
5651
5652	#include <isl/aff.h>
5653	__isl_give isl_aff *isl_aff_project_domain_on_params(
5654		__isl_take isl_aff *aff);
5655	__isl_give isl_multi_aff *
5656	isl_multi_aff_project_domain_on_params(
5657		__isl_take isl_multi_aff *ma);
5658	__isl_give isl_pw_aff *
5659	isl_pw_aff_project_domain_on_params(
5660		__isl_take isl_pw_aff *pa);
5661	__isl_give isl_multi_pw_aff *
5662	isl_multi_pw_aff_project_domain_on_params(
5663		__isl_take isl_multi_pw_aff *mpa);
5664	__isl_give isl_pw_multi_aff *
5665	isl_pw_multi_aff_project_domain_on_params(
5666		__isl_take isl_pw_multi_aff *pma);
5667	__isl_give isl_set *isl_pw_aff_domain(
5668		__isl_take isl_pw_aff *pwaff);
5669	__isl_give isl_set *isl_pw_multi_aff_domain(
5670		__isl_take isl_pw_multi_aff *pma);
5671	__isl_give isl_set *isl_multi_pw_aff_domain(
5672		__isl_take isl_multi_pw_aff *mpa);
5673	__isl_give isl_union_set *isl_union_pw_aff_domain(
5674		__isl_take isl_union_pw_aff *upa);
5675	__isl_give isl_union_set *isl_union_pw_multi_aff_domain(
5676		__isl_take isl_union_pw_multi_aff *upma);
5677	__isl_give isl_union_set *
5678	isl_multi_union_pw_aff_domain(
5679		__isl_take isl_multi_union_pw_aff *mupa);
5680	__isl_give isl_set *isl_pw_aff_params(
5681		__isl_take isl_pw_aff *pwa);
5682
5683If no explicit domain was set on a zero-dimensional input to
5684C<isl_multi_union_pw_aff_domain>, then this function will
5685return a parameter set.
5686
5687	#include <isl/polynomial.h>
5688	__isl_give isl_qpolynomial *
5689	isl_qpolynomial_project_domain_on_params(
5690		__isl_take isl_qpolynomial *qp);
5691	__isl_give isl_pw_qpolynomial *
5692	isl_pw_qpolynomial_project_domain_on_params(
5693		__isl_take isl_pw_qpolynomial *pwqp);
5694	__isl_give isl_pw_qpolynomial_fold *
5695	isl_pw_qpolynomial_fold_project_domain_on_params(
5696		__isl_take isl_pw_qpolynomial_fold *pwf);
5697	__isl_give isl_set *isl_pw_qpolynomial_domain(
5698		__isl_take isl_pw_qpolynomial *pwqp);
5699	__isl_give isl_union_set *isl_union_pw_qpolynomial_fold_domain(
5700		__isl_take isl_union_pw_qpolynomial_fold *upwf);
5701	__isl_give isl_union_set *isl_union_pw_qpolynomial_domain(
5702		__isl_take isl_union_pw_qpolynomial *upwqp);
5703
5704	#include <isl/space.h>
5705	__isl_give isl_space *isl_space_domain_map(
5706		__isl_take isl_space *space);
5707	__isl_give isl_space *isl_space_range_map(
5708		__isl_take isl_space *space);
5709
5710	#include <isl/map.h>
5711	__isl_give isl_map *isl_set_wrapped_domain_map(
5712		__isl_take isl_set *set);
5713	__isl_give isl_basic_map *isl_basic_map_domain_map(
5714		__isl_take isl_basic_map *bmap);
5715	__isl_give isl_basic_map *isl_basic_map_range_map(
5716		__isl_take isl_basic_map *bmap);
5717	__isl_give isl_map *isl_map_domain_map(__isl_take isl_map *map);
5718	__isl_give isl_map *isl_map_range_map(__isl_take isl_map *map);
5719
5720	#include <isl/union_map.h>
5721	__isl_give isl_union_map *isl_union_map_domain_map(
5722		__isl_take isl_union_map *umap);
5723	__isl_give isl_union_pw_multi_aff *
5724	isl_union_map_domain_map_union_pw_multi_aff(
5725		__isl_take isl_union_map *umap);
5726	__isl_give isl_union_map *isl_union_map_range_map(
5727		__isl_take isl_union_map *umap);
5728	__isl_give isl_union_map *
5729	isl_union_set_wrapped_domain_map(
5730		__isl_take isl_union_set *uset);
5731
5732The functions above construct a (basic, regular or union) relation
5733that maps (a wrapped version of) the input relation to its domain or range.
5734C<isl_set_wrapped_domain_map> maps the input set to the domain
5735of its wrapped relation.
5736
5737=item * Elimination
5738
5739	__isl_give isl_basic_set *isl_basic_set_eliminate(
5740		__isl_take isl_basic_set *bset,
5741		enum isl_dim_type type,
5742		unsigned first, unsigned n);
5743	__isl_give isl_set *isl_set_eliminate(
5744		__isl_take isl_set *set, enum isl_dim_type type,
5745		unsigned first, unsigned n);
5746	__isl_give isl_basic_map *isl_basic_map_eliminate(
5747		__isl_take isl_basic_map *bmap,
5748		enum isl_dim_type type,
5749		unsigned first, unsigned n);
5750	__isl_give isl_map *isl_map_eliminate(
5751		__isl_take isl_map *map, enum isl_dim_type type,
5752		unsigned first, unsigned n);
5753
5754Eliminate the coefficients for the given dimensions from the constraints,
5755without removing the dimensions.
5756
5757=item * Constructing a set from a parameter domain
5758
5759A set space of a given dimension and with an optional name
5760can be created from a parameter space using the following functions.
5761
5762	#include <isl/space.h>
5763	__isl_give isl_space *isl_space_add_unnamed_tuple_ui(
5764		__isl_take isl_space *space, unsigned dim);
5765	__isl_give isl_space *
5766	isl_space_add_named_tuple_id_ui(
5767		__isl_take isl_space *space,
5768		__isl_take isl_id *tuple_id, unsigned dim);
5769
5770A set with a given tuple can be created from a parameter domain
5771using the following function.
5772
5773	#include <isl/set.h>
5774	__isl_give isl_set *isl_set_unbind_params(
5775		__isl_take isl_set *set,
5776		__isl_take isl_multi_id *tuple);
5777
5778Any parameters with identifiers in C<tuple> are reinterpreted
5779as the corresponding set dimensions.
5780
5781A zero-dimensional (local) space or (basic) set can be constructed
5782on a given parameter domain using the following functions.
5783
5784	#include <isl/space.h>
5785	__isl_give isl_space *isl_space_set_from_params(
5786		__isl_take isl_space *space);
5787
5788	#include <isl/local_space.h>
5789	__isl_give isl_local_space *
5790	isl_local_space_set_from_params(
5791		__isl_take isl_local_space *ls);
5792
5793	#include <isl/set.h>
5794	__isl_give isl_basic_set *isl_basic_set_from_params(
5795		__isl_take isl_basic_set *bset);
5796	__isl_give isl_set *isl_set_from_params(
5797		__isl_take isl_set *set);
5798
5799=item * Constructing a relation from one or two sets
5800
5801A map space with a range of a given dimension and with an optional name
5802can be created from a domain space using the functions
5803C<isl_space_add_unnamed_tuple_ui> and C<isl_space_add_named_tuple_id_ui>
5804described above.
5805
5806A relation with a given domain tuple can be created from a set
5807that will become the range of the relation
5808using the following function.
5809
5810	#include <isl/set.h>
5811	__isl_give isl_map *
5812	isl_set_unbind_params_insert_domain(
5813		__isl_take isl_set *set,
5814		__isl_take isl_multi_id *domain);
5815
5816Any parameters with identifiers in C<domain> are reinterpreted
5817as the corresponding input dimensions.
5818
5819Similarly, a function defined over a parameter domain can
5820be converted into one defined over a set domain
5821using the following functions.
5822
5823	#include <isl/aff.h>
5824	__isl_give isl_aff *
5825	isl_aff_unbind_params_insert_domain(
5826		__isl_take isl_aff *aff,
5827		__isl_take isl_multi_id *domain);
5828	__isl_give isl_multi_aff *
5829	isl_multi_aff_unbind_params_insert_domain(
5830		__isl_take isl_multi_aff *ma,
5831		__isl_take isl_multi_id *domain);
5832	__isl_give isl_multi_pw_aff *
5833	isl_multi_pw_aff_unbind_params_insert_domain(
5834		__isl_take isl_multi_pw_aff *mpa,
5835		__isl_take isl_multi_id *domain);
5836
5837Again,
5838any parameters with identifiers in C<domain> are reinterpreted
5839as the corresponding input dimensions.
5840
5841Create a relation with the given set(s) as domain and/or range.
5842If only the domain or the range is specified, then
5843the range or domain of the created relation is a zero-dimensional
5844flat anonymous space.
5845If the case of C<isl_space_map_from_set>, the input space
5846specifies both the domain and the range of the result.
5847
5848	#include <isl/space.h>
5849	__isl_give isl_space *isl_space_from_domain(
5850		__isl_take isl_space *space);
5851	__isl_give isl_space *isl_space_from_range(
5852		__isl_take isl_space *space);
5853	__isl_give isl_space *isl_space_map_from_set(
5854		__isl_take isl_space *space);
5855	__isl_give isl_space *isl_space_map_from_domain_and_range(
5856		__isl_take isl_space *domain,
5857		__isl_take isl_space *range);
5858
5859	#include <isl/local_space.h>
5860	__isl_give isl_local_space *isl_local_space_from_domain(
5861		__isl_take isl_local_space *ls);
5862
5863	#include <isl/map.h>
5864	__isl_give isl_map *isl_set_insert_domain(
5865		__isl_take isl_set *set,
5866		__isl_take isl_space *domain);
5867	__isl_give isl_map *isl_map_from_domain(
5868		__isl_take isl_set *set);
5869	__isl_give isl_map *isl_map_from_range(
5870		__isl_take isl_set *set);
5871
5872	#include <isl/union_map.h>
5873	__isl_give isl_union_map *isl_union_map_from_domain(
5874		__isl_take isl_union_set *uset);
5875	__isl_give isl_union_map *isl_union_map_from_range(
5876		__isl_take isl_union_set *uset);
5877	__isl_give isl_union_map *
5878	isl_union_map_from_domain_and_range(
5879		__isl_take isl_union_set *domain,
5880		__isl_take isl_union_set *range);
5881
5882	#include <isl/id.h>
5883	__isl_give isl_multi_id *isl_multi_id_from_range(
5884		__isl_take isl_multi_id *mi);
5885
5886	#include <isl/val.h>
5887	__isl_give isl_multi_val *isl_multi_val_from_range(
5888		__isl_take isl_multi_val *mv);
5889
5890	#include <isl/aff.h>
5891	__isl_give isl_multi_aff *
5892	isl_multi_aff_insert_domain(
5893		__isl_take isl_multi_aff *ma,
5894		__isl_take isl_space *domain);
5895	__isl_give isl_pw_aff *isl_pw_aff_insert_domain(
5896		__isl_take isl_pw_aff *pa,
5897		__isl_take isl_space *domain);
5898	__isl_give isl_pw_multi_aff *
5899	isl_pw_multi_aff_insert_domain(
5900		__isl_take isl_pw_multi_aff *pma,
5901		__isl_take isl_space *domain);
5902	__isl_give isl_multi_pw_aff *
5903	isl_multi_pw_aff_insert_domain(
5904		__isl_take isl_multi_pw_aff *mpa,
5905		__isl_take isl_space *domain);
5906	__isl_give isl_aff *isl_aff_from_range(
5907		__isl_take isl_aff *aff);
5908	__isl_give isl_multi_aff *isl_multi_aff_from_range(
5909		__isl_take isl_multi_aff *ma);
5910	__isl_give isl_pw_aff *isl_pw_aff_from_range(
5911		__isl_take isl_pw_aff *pwa);
5912	__isl_give isl_multi_pw_aff *isl_multi_pw_aff_from_range(
5913		__isl_take isl_multi_pw_aff *mpa);
5914	__isl_give isl_multi_union_pw_aff *
5915	isl_multi_union_pw_aff_from_range(
5916		__isl_take isl_multi_union_pw_aff *mupa);
5917	__isl_give isl_pw_multi_aff *isl_pw_multi_aff_from_domain(
5918		__isl_take isl_set *set);
5919	__isl_give isl_union_pw_multi_aff *
5920	isl_union_pw_multi_aff_from_domain(
5921		__isl_take isl_union_set *uset);
5922
5923	#include <isl/polynomial.h>
5924	__isl_give isl_pw_qpolynomial *
5925	isl_pw_qpolynomial_from_range(
5926		__isl_take isl_pw_qpolynomial *pwqp);
5927	__isl_give isl_pw_qpolynomial_fold *
5928	isl_pw_qpolynomial_fold_from_range(
5929		__isl_take isl_pw_qpolynomial_fold *pwf);
5930
5931=item * Slicing
5932
5933	#include <isl/set.h>
5934	__isl_give isl_basic_set *isl_basic_set_fix_si(
5935		__isl_take isl_basic_set *bset,
5936		enum isl_dim_type type, unsigned pos, int value);
5937	__isl_give isl_basic_set *isl_basic_set_fix_val(
5938		__isl_take isl_basic_set *bset,
5939		enum isl_dim_type type, unsigned pos,
5940		__isl_take isl_val *v);
5941	__isl_give isl_set *isl_set_fix_si(__isl_take isl_set *set,
5942		enum isl_dim_type type, unsigned pos, int value);
5943	__isl_give isl_set *isl_set_fix_val(
5944		__isl_take isl_set *set,
5945		enum isl_dim_type type, unsigned pos,
5946		__isl_take isl_val *v);
5947
5948	#include <isl/map.h>
5949	__isl_give isl_basic_map *isl_basic_map_fix_si(
5950		__isl_take isl_basic_map *bmap,
5951		enum isl_dim_type type, unsigned pos, int value);
5952	__isl_give isl_basic_map *isl_basic_map_fix_val(
5953		__isl_take isl_basic_map *bmap,
5954		enum isl_dim_type type, unsigned pos,
5955		__isl_take isl_val *v);
5956	__isl_give isl_map *isl_map_fix_si(__isl_take isl_map *map,
5957		enum isl_dim_type type, unsigned pos, int value);
5958	__isl_give isl_map *isl_map_fix_val(
5959		__isl_take isl_map *map,
5960		enum isl_dim_type type, unsigned pos,
5961		__isl_take isl_val *v);
5962
5963	#include <isl/aff.h>
5964	__isl_give isl_pw_multi_aff *isl_pw_multi_aff_fix_si(
5965		__isl_take isl_pw_multi_aff *pma,
5966		enum isl_dim_type type, unsigned pos, int value);
5967
5968	#include <isl/polynomial.h>
5969	__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_fix_val(
5970		__isl_take isl_pw_qpolynomial *pwqp,
5971		enum isl_dim_type type, unsigned n,
5972		__isl_take isl_val *v);
5973	__isl_give isl_pw_qpolynomial_fold *
5974	isl_pw_qpolynomial_fold_fix_val(
5975		__isl_take isl_pw_qpolynomial_fold *pwf,
5976		enum isl_dim_type type, unsigned n,
5977		__isl_take isl_val *v);
5978
5979Intersect the set, relation or function domain
5980with the hyperplane where the given
5981dimension has the fixed given value.
5982
5983	#include <isl/set.h>
5984	__isl_give isl_basic_set *
5985	isl_basic_set_lower_bound_val(
5986		__isl_take isl_basic_set *bset,
5987		enum isl_dim_type type, unsigned pos,
5988		__isl_take isl_val *value);
5989	__isl_give isl_basic_set *
5990	isl_basic_set_upper_bound_val(
5991		__isl_take isl_basic_set *bset,
5992		enum isl_dim_type type, unsigned pos,
5993		__isl_take isl_val *value);
5994	__isl_give isl_set *isl_set_lower_bound_si(
5995		__isl_take isl_set *set,
5996		enum isl_dim_type type, unsigned pos, int value);
5997	__isl_give isl_set *isl_set_lower_bound_val(
5998		__isl_take isl_set *set,
5999		enum isl_dim_type type, unsigned pos,
6000		__isl_take isl_val *value);
6001	__isl_give isl_set *isl_set_upper_bound_si(
6002		__isl_take isl_set *set,
6003		enum isl_dim_type type, unsigned pos, int value);
6004	__isl_give isl_set *isl_set_upper_bound_val(
6005		__isl_take isl_set *set,
6006		enum isl_dim_type type, unsigned pos,
6007		__isl_take isl_val *value);
6008	__isl_give isl_set *isl_set_lower_bound_multi_val(
6009		__isl_take isl_set *set,
6010		__isl_take isl_multi_val *lower);
6011	__isl_give isl_set *isl_set_upper_bound_multi_val(
6012		__isl_take isl_set *set,
6013		__isl_take isl_multi_val *upper);
6014	__isl_give isl_set *isl_set_lower_bound_multi_pw_aff(
6015		__isl_take isl_set *set,
6016		__isl_take isl_multi_pw_aff *lower);
6017	__isl_give isl_set *isl_set_upper_bound_multi_pw_aff(
6018		__isl_take isl_set *set,
6019		__isl_take isl_multi_pw_aff *upper);
6020
6021	#include <isl/map.h>
6022	__isl_give isl_basic_map *isl_basic_map_lower_bound_si(
6023		__isl_take isl_basic_map *bmap,
6024		enum isl_dim_type type, unsigned pos, int value);
6025	__isl_give isl_basic_map *isl_basic_map_upper_bound_si(
6026		__isl_take isl_basic_map *bmap,
6027		enum isl_dim_type type, unsigned pos, int value);
6028	__isl_give isl_map *isl_map_lower_bound_si(
6029		__isl_take isl_map *map,
6030		enum isl_dim_type type, unsigned pos, int value);
6031	__isl_give isl_map *isl_map_upper_bound_si(
6032		__isl_take isl_map *map,
6033		enum isl_dim_type type, unsigned pos, int value);
6034	__isl_give isl_map *isl_map_lower_bound_val(
6035		__isl_take isl_map *map,
6036		enum isl_dim_type type, unsigned pos,
6037		__isl_take isl_val *value);
6038	__isl_give isl_map *isl_map_upper_bound_val(
6039		__isl_take isl_map *map,
6040		enum isl_dim_type type, unsigned pos,
6041		__isl_take isl_val *value);
6042	__isl_give isl_map *isl_map_lower_bound_multi_pw_aff(
6043		__isl_take isl_map *map,
6044		__isl_take isl_multi_pw_aff *lower);
6045	__isl_give isl_map *isl_map_upper_bound_multi_pw_aff(
6046		__isl_take isl_map *map,
6047		__isl_take isl_multi_pw_aff *upper);
6048
6049Intersect the set or relation with the half-space where the given
6050dimension has a value bounded by the given fixed integer value or
6051symbolic constant expression.
6052For functions taking a multi expression,
6053this applies to all set dimensions.
6054Those that bound a map, bound the range of that map.
6055If the multi expression is zero-dimensional but has an explicit domain,
6056then the (parameter) domain of the set or map is intersected
6057with this explicit domain.
6058
6059	__isl_give isl_set *isl_set_equate(__isl_take isl_set *set,
6060		enum isl_dim_type type1, int pos1,
6061		enum isl_dim_type type2, int pos2);
6062	__isl_give isl_basic_map *isl_basic_map_equate(
6063		__isl_take isl_basic_map *bmap,
6064		enum isl_dim_type type1, int pos1,
6065		enum isl_dim_type type2, int pos2);
6066	__isl_give isl_map *isl_map_equate(__isl_take isl_map *map,
6067		enum isl_dim_type type1, int pos1,
6068		enum isl_dim_type type2, int pos2);
6069
6070Intersect the set or relation with the hyperplane where the given
6071dimensions are equal to each other.
6072
6073	__isl_give isl_map *isl_map_oppose(__isl_take isl_map *map,
6074		enum isl_dim_type type1, int pos1,
6075		enum isl_dim_type type2, int pos2);
6076
6077Intersect the relation with the hyperplane where the given
6078dimensions have opposite values.
6079
6080	__isl_give isl_map *isl_map_order_le(
6081		__isl_take isl_map *map,
6082		enum isl_dim_type type1, int pos1,
6083		enum isl_dim_type type2, int pos2);
6084	__isl_give isl_basic_map *isl_basic_map_order_ge(
6085		__isl_take isl_basic_map *bmap,
6086		enum isl_dim_type type1, int pos1,
6087		enum isl_dim_type type2, int pos2);
6088	__isl_give isl_map *isl_map_order_ge(
6089		__isl_take isl_map *map,
6090		enum isl_dim_type type1, int pos1,
6091		enum isl_dim_type type2, int pos2);
6092	__isl_give isl_map *isl_map_order_lt(__isl_take isl_map *map,
6093		enum isl_dim_type type1, int pos1,
6094		enum isl_dim_type type2, int pos2);
6095	__isl_give isl_basic_map *isl_basic_map_order_gt(
6096		__isl_take isl_basic_map *bmap,
6097		enum isl_dim_type type1, int pos1,
6098		enum isl_dim_type type2, int pos2);
6099	__isl_give isl_map *isl_map_order_gt(__isl_take isl_map *map,
6100		enum isl_dim_type type1, int pos1,
6101		enum isl_dim_type type2, int pos2);
6102
6103Intersect the relation with the half-space where the given
6104dimensions satisfy the given ordering.
6105
6106	#include <isl/union_set.h>
6107	__isl_give isl_union_map *isl_union_map_remove_map_if(
6108		__isl_take isl_union_map *umap,
6109		isl_bool (*fn)(__isl_keep isl_map *map,
6110			void *user), void *user);
6111
6112This function calls the callback function once for each
6113pair of spaces for which there are elements in the input.
6114If the callback returns C<isl_bool_true>, then all those elements
6115are removed from the result.  The only remaining elements in the output
6116are then those for which the callback returns C<isl_bool_false>.
6117
6118=item * Locus
6119
6120	#include <isl/aff.h>
6121	__isl_give isl_basic_set *isl_aff_zero_basic_set(
6122		__isl_take isl_aff *aff);
6123	__isl_give isl_basic_set *isl_aff_neg_basic_set(
6124		__isl_take isl_aff *aff);
6125	__isl_give isl_set *isl_pw_aff_pos_set(
6126		__isl_take isl_pw_aff *pa);
6127	__isl_give isl_set *isl_pw_aff_nonneg_set(
6128		__isl_take isl_pw_aff *pwaff);
6129	__isl_give isl_set *isl_pw_aff_zero_set(
6130		__isl_take isl_pw_aff *pwaff);
6131	__isl_give isl_set *isl_pw_aff_non_zero_set(
6132		__isl_take isl_pw_aff *pwaff);
6133	__isl_give isl_union_set *
6134	isl_union_pw_aff_zero_union_set(
6135		__isl_take isl_union_pw_aff *upa);
6136	__isl_give isl_union_set *
6137	isl_multi_union_pw_aff_zero_union_set(
6138		__isl_take isl_multi_union_pw_aff *mupa);
6139
6140The function C<isl_aff_neg_basic_set> returns a basic set
6141containing those elements in the domain space
6142of C<aff> where C<aff> is negative.
6143The function C<isl_pw_aff_nonneg_set> returns a set
6144containing those elements in the domain
6145of C<pwaff> where C<pwaff> is non-negative.
6146The function C<isl_multi_union_pw_aff_zero_union_set>
6147returns a union set containing those elements
6148in the domains of its elements where they are all zero.
6149
6150=item * Identity
6151
6152	__isl_give isl_map *isl_set_identity(
6153		__isl_take isl_set *set);
6154	__isl_give isl_union_map *isl_union_set_identity(
6155		__isl_take isl_union_set *uset);
6156	__isl_give isl_union_pw_multi_aff *
6157	isl_union_set_identity_union_pw_multi_aff(
6158		__isl_take isl_union_set *uset);
6159
6160Construct an identity relation on the given (union) set.
6161
6162=item * Function Extraction
6163
6164A piecewise quasi affine expression that is equal to 1 on a set
6165and 0 outside the set can be created using the following function.
6166
6167	#include <isl/aff.h>
6168	__isl_give isl_pw_aff *isl_set_indicator_function(
6169		__isl_take isl_set *set);
6170
6171A piecewise multiple quasi affine expression can be extracted
6172from an C<isl_set> or C<isl_map>, provided the C<isl_set> is a singleton
6173and the C<isl_map> is single-valued.
6174In case of a conversion from an C<isl_union_map>
6175to an C<isl_union_pw_multi_aff>, these properties need to hold
6176in each domain space.
6177A conversion to a C<isl_multi_union_pw_aff> additionally
6178requires that the input is non-empty and involves only a single
6179range space.
6180
6181	#include <isl/aff.h>
6182	__isl_give isl_pw_multi_aff *isl_set_as_pw_multi_aff(
6183		__isl_take isl_set *set);
6184	__isl_give isl_pw_multi_aff *isl_pw_multi_aff_from_set(
6185		__isl_take isl_set *set);
6186	__isl_give isl_pw_multi_aff *isl_map_as_pw_multi_aff(
6187		__isl_take isl_map *map);
6188	__isl_give isl_pw_multi_aff *isl_pw_multi_aff_from_map(
6189		__isl_take isl_map *map);
6190
6191	__isl_give isl_union_pw_multi_aff *
6192	isl_union_pw_multi_aff_from_union_set(
6193		__isl_take isl_union_set *uset);
6194	__isl_give isl_union_pw_multi_aff *
6195	isl_union_map_as_union_pw_multi_aff(
6196		__isl_take isl_union_map *umap);
6197	__isl_give isl_union_pw_multi_aff *
6198	isl_union_pw_multi_aff_from_union_map(
6199		__isl_take isl_union_map *umap);
6200
6201	__isl_give isl_multi_union_pw_aff *
6202	isl_union_map_as_multi_union_pw_aff(
6203		__isl_take isl_union_map *umap);
6204	__isl_give isl_multi_union_pw_aff *
6205	isl_multi_union_pw_aff_from_union_map(
6206		__isl_take isl_union_map *umap);
6207
6208C<isl_map_as_pw_multi_aff> and C<isl_pw_multi_aff_from_map> perform
6209the same operation.
6210Similarly for C<isl_set_as_pw_multi_aff> and
6211C<isl_pw_multi_aff_from_set>,
6212for C<isl_union_map_as_union_pw_multi_aff> and
6213C<isl_union_pw_multi_aff_from_union_map> and
6214for C<isl_union_map_as_multi_union_pw_aff> and
6215C<isl_multi_union_pw_aff_from_union_map>.
6216
6217=item * Deltas
6218
6219	__isl_give isl_basic_set *isl_basic_map_deltas(
6220		__isl_take isl_basic_map *bmap);
6221	__isl_give isl_set *isl_map_deltas(__isl_take isl_map *map);
6222	__isl_give isl_union_set *isl_union_map_deltas(
6223		__isl_take isl_union_map *umap);
6224
6225These functions return a (basic) set containing the differences
6226between image elements and corresponding domain elements in the input.
6227
6228	__isl_give isl_basic_map *isl_basic_map_deltas_map(
6229		__isl_take isl_basic_map *bmap);
6230	__isl_give isl_map *isl_map_deltas_map(
6231		__isl_take isl_map *map);
6232	__isl_give isl_union_map *isl_union_map_deltas_map(
6233		__isl_take isl_union_map *umap);
6234
6235The functions above construct a (basic, regular or union) relation
6236that maps (a wrapped version of) the input relation to its delta set.
6237
6238=item * Translation
6239
6240	#include <isl/map.h>
6241	__isl_give isl_map *isl_set_translation(
6242		__isl_take isl_set *deltas);
6243
6244This function performs essentially the opposite operation
6245of C<isl_map_deltas>.  In particular, it returns pairs
6246of elements in the same space that have a difference in C<deltas>.
6247
6248=item * Coalescing
6249
6250Simplify the representation of a set, relation or functions by trying
6251to combine pairs of basic sets or relations into a single
6252basic set or relation.
6253
6254	#include <isl/set.h>
6255	__isl_give isl_set *isl_set_coalesce(__isl_take isl_set *set);
6256
6257	#include <isl/map.h>
6258	__isl_give isl_map *isl_map_coalesce(__isl_take isl_map *map);
6259
6260	#include <isl/union_set.h>
6261	__isl_give isl_union_set *isl_union_set_coalesce(
6262		__isl_take isl_union_set *uset);
6263
6264	#include <isl/union_map.h>
6265	__isl_give isl_union_map *isl_union_map_coalesce(
6266		__isl_take isl_union_map *umap);
6267
6268	#include <isl/aff.h>
6269	__isl_give isl_pw_aff *isl_pw_aff_coalesce(
6270		__isl_take isl_pw_aff *pa);
6271	__isl_give isl_pw_multi_aff *isl_pw_multi_aff_coalesce(
6272		__isl_take isl_pw_multi_aff *pma);
6273	__isl_give isl_multi_pw_aff *isl_multi_pw_aff_coalesce(
6274		__isl_take isl_multi_pw_aff *mpa);
6275	__isl_give isl_union_pw_aff *isl_union_pw_aff_coalesce(
6276		__isl_take isl_union_pw_aff *upa);
6277	__isl_give isl_union_pw_multi_aff *
6278	isl_union_pw_multi_aff_coalesce(
6279		__isl_take isl_union_pw_multi_aff *upma);
6280	__isl_give isl_multi_union_pw_aff *
6281	isl_multi_union_pw_aff_coalesce(
6282		__isl_take isl_multi_union_pw_aff *mupa);
6283
6284	#include <isl/polynomial.h>
6285	__isl_give isl_pw_qpolynomial_fold *
6286	isl_pw_qpolynomial_fold_coalesce(
6287		__isl_take isl_pw_qpolynomial_fold *pwf);
6288	__isl_give isl_union_pw_qpolynomial *
6289	isl_union_pw_qpolynomial_coalesce(
6290		__isl_take isl_union_pw_qpolynomial *upwqp);
6291	__isl_give isl_union_pw_qpolynomial_fold *
6292	isl_union_pw_qpolynomial_fold_coalesce(
6293		__isl_take isl_union_pw_qpolynomial_fold *upwf);
6294
6295One of the methods for combining pairs of basic sets or relations
6296can result in coefficients that are much larger than those that appear
6297in the constraints of the input.  By default, the coefficients are
6298not allowed to grow larger, but this can be changed by unsetting
6299the following option.
6300
6301	isl_stat isl_options_set_coalesce_bounded_wrapping(
6302		isl_ctx *ctx, int val);
6303	int isl_options_get_coalesce_bounded_wrapping(
6304		isl_ctx *ctx);
6305
6306One of the other methods tries to combine pairs of basic sets
6307with different local variables, treating them as existentially
6308quantified variables even if they have known (but different)
6309integer division expressions.  The result may then also have
6310existentially quantified variables.  Turning on the following
6311option prevents this from happening.
6312
6313	isl_stat isl_options_set_coalesce_preserve_locals(
6314		isl_ctx *ctx, int val);
6315	int isl_options_get_coalesce_preserve_locals(isl_ctx *ctx);
6316
6317=item * Detecting equalities
6318
6319	__isl_give isl_basic_set *isl_basic_set_detect_equalities(
6320                __isl_take isl_basic_set *bset);
6321	__isl_give isl_basic_map *isl_basic_map_detect_equalities(
6322                __isl_take isl_basic_map *bmap);
6323	__isl_give isl_set *isl_set_detect_equalities(
6324		__isl_take isl_set *set);
6325	__isl_give isl_map *isl_map_detect_equalities(
6326		__isl_take isl_map *map);
6327	__isl_give isl_union_set *isl_union_set_detect_equalities(
6328		__isl_take isl_union_set *uset);
6329	__isl_give isl_union_map *isl_union_map_detect_equalities(
6330		__isl_take isl_union_map *umap);
6331
6332Simplify the representation of a set or relation by detecting implicit
6333equalities.
6334
6335=item * Removing redundant constraints
6336
6337	#include <isl/set.h>
6338	__isl_give isl_basic_set *isl_basic_set_remove_redundancies(
6339		__isl_take isl_basic_set *bset);
6340	__isl_give isl_set *isl_set_remove_redundancies(
6341		__isl_take isl_set *set);
6342
6343	#include <isl/union_set.h>
6344	__isl_give isl_union_set *
6345	isl_union_set_remove_redundancies(
6346		__isl_take isl_union_set *uset);
6347
6348	#include <isl/map.h>
6349	__isl_give isl_basic_map *isl_basic_map_remove_redundancies(
6350		__isl_take isl_basic_map *bmap);
6351	__isl_give isl_map *isl_map_remove_redundancies(
6352		__isl_take isl_map *map);
6353
6354	#include <isl/union_map.h>
6355	__isl_give isl_union_map *
6356	isl_union_map_remove_redundancies(
6357		__isl_take isl_union_map *umap);
6358
6359=item * Convex hull
6360
6361	__isl_give isl_basic_set *isl_set_convex_hull(
6362		__isl_take isl_set *set);
6363	__isl_give isl_basic_map *isl_map_convex_hull(
6364		__isl_take isl_map *map);
6365
6366If the input set or relation has any existentially quantified
6367variables, then the result of these operations is currently undefined.
6368
6369=item * Simple hull
6370
6371	#include <isl/set.h>
6372	__isl_give isl_basic_set *
6373	isl_set_unshifted_simple_hull(
6374		__isl_take isl_set *set);
6375	__isl_give isl_basic_set *isl_set_simple_hull(
6376		__isl_take isl_set *set);
6377	__isl_give isl_basic_set *
6378	isl_set_plain_unshifted_simple_hull(
6379		__isl_take isl_set *set);
6380	__isl_give isl_basic_set *
6381	isl_set_unshifted_simple_hull_from_set_list(
6382		__isl_take isl_set *set,
6383		__isl_take isl_set_list *list);
6384
6385	#include <isl/map.h>
6386	__isl_give isl_basic_map *
6387	isl_map_unshifted_simple_hull(
6388		__isl_take isl_map *map);
6389	__isl_give isl_basic_map *isl_map_simple_hull(
6390		__isl_take isl_map *map);
6391	__isl_give isl_basic_map *
6392	isl_map_plain_unshifted_simple_hull(
6393		__isl_take isl_map *map);
6394		__isl_give isl_basic_map *
6395	isl_map_unshifted_simple_hull_from_map_list(
6396		__isl_take isl_map *map,
6397		__isl_take isl_map_list *list);
6398
6399	#include <isl/union_map.h>
6400	__isl_give isl_union_map *isl_union_map_simple_hull(
6401		__isl_take isl_union_map *umap);
6402
6403These functions compute a single basic set or relation
6404that contains the whole input set or relation.
6405In particular, the output is described by translates
6406of the constraints describing the basic sets or relations in the input.
6407In case of C<isl_set_unshifted_simple_hull>, only the original
6408constraints are used, without any translation.
6409In case of C<isl_set_plain_unshifted_simple_hull> and
6410C<isl_map_plain_unshifted_simple_hull>, the result is described
6411by original constraints that are obviously satisfied
6412by the entire input set or relation.
6413In case of C<isl_set_unshifted_simple_hull_from_set_list> and
6414C<isl_map_unshifted_simple_hull_from_map_list>, the
6415constraints are taken from the elements of the second argument.
6416
6417=begin latex
6418
6419(See \autoref{s:simple hull}.)
6420
6421=end latex
6422
6423=item * Affine hull
6424
6425	__isl_give isl_basic_set *isl_basic_set_affine_hull(
6426		__isl_take isl_basic_set *bset);
6427	__isl_give isl_basic_set *isl_set_affine_hull(
6428		__isl_take isl_set *set);
6429	__isl_give isl_union_set *isl_union_set_affine_hull(
6430		__isl_take isl_union_set *uset);
6431	__isl_give isl_basic_map *isl_basic_map_affine_hull(
6432		__isl_take isl_basic_map *bmap);
6433	__isl_give isl_basic_map *isl_map_affine_hull(
6434		__isl_take isl_map *map);
6435	__isl_give isl_union_map *isl_union_map_affine_hull(
6436		__isl_take isl_union_map *umap);
6437
6438In case of union sets and relations, the affine hull is computed
6439per space.
6440
6441=item * Polyhedral hull
6442
6443	__isl_give isl_basic_set *isl_set_polyhedral_hull(
6444		__isl_take isl_set *set);
6445	__isl_give isl_basic_map *isl_map_polyhedral_hull(
6446		__isl_take isl_map *map);
6447	__isl_give isl_union_set *isl_union_set_polyhedral_hull(
6448		__isl_take isl_union_set *uset);
6449	__isl_give isl_union_map *isl_union_map_polyhedral_hull(
6450		__isl_take isl_union_map *umap);
6451
6452These functions compute a single basic set or relation
6453not involving any existentially quantified variables
6454that contains the whole input set or relation.
6455In case of union sets and relations, the polyhedral hull is computed
6456per space.
6457
6458=item * Box hull
6459
6460	#include <isl/set.h>
6461	__isl_give isl_fixed_box *
6462	isl_set_get_simple_fixed_box_hull(
6463		__isl_keep isl_set *set)
6464
6465	#include <isl/map.h>
6466	__isl_give isl_fixed_box *
6467	isl_map_get_range_simple_fixed_box_hull(
6468		__isl_keep isl_map *map);
6469
6470These functions try to approximate the set or
6471the range of the map by a box of fixed size.
6472The box is described in terms of an offset living in the same space as
6473the input and a size living in the set or range space.  For any element
6474in the input map, the range value is greater than or equal to
6475the offset applied to the domain value and the difference with
6476this offset is strictly smaller than the size.
6477The same holds for the elements of the input set, where
6478the offset is a parametric constant value.
6479If no fixed-size approximation can be found,
6480an I<invalid> box is returned, i.e., one for which
6481C<isl_fixed_box_is_valid> below returns false.
6482
6483The validity, the offset and the size of the box can be obtained using
6484the following functions.
6485
6486	#include <isl/fixed_box.h>
6487	isl_bool isl_fixed_box_is_valid(
6488		__isl_keep isl_fixed_box *box);
6489	__isl_give isl_multi_aff *isl_fixed_box_get_offset(
6490		__isl_keep isl_fixed_box *box);
6491	__isl_give isl_multi_val *isl_fixed_box_get_size(
6492		__isl_keep isl_fixed_box *box);
6493
6494The box can be copied and freed using the following functions.
6495
6496	#include <isl/fixed_box.h>
6497	__isl_give isl_fixed_box *isl_fixed_box_copy(
6498		__isl_keep isl_fixed_box *box);
6499	__isl_null isl_fixed_box *isl_fixed_box_free(
6500		__isl_take isl_fixed_box *box);
6501
6502A representation of the information contained in an object
6503of type C<isl_fixed_box> can be obtained using
6504
6505	#include <isl/fixed_box.h>
6506	__isl_give isl_printer *isl_printer_print_fixed_box(
6507		__isl_take isl_printer *p,
6508		__isl_keep isl_fixed_box *box);
6509	__isl_give char *isl_fixed_box_to_str(
6510		__isl_keep isl_fixed_box *box);
6511
6512C<isl_fixed_box_to_str> prints the information in flow format.
6513
6514=item * Other approximations
6515
6516	#include <isl/set.h>
6517	__isl_give isl_basic_set *
6518	isl_basic_set_drop_constraints_involving_dims(
6519		__isl_take isl_basic_set *bset,
6520		enum isl_dim_type type,
6521		unsigned first, unsigned n);
6522	__isl_give isl_basic_set *
6523	isl_basic_set_drop_constraints_not_involving_dims(
6524		__isl_take isl_basic_set *bset,
6525		enum isl_dim_type type,
6526		unsigned first, unsigned n);
6527	__isl_give isl_set *
6528	isl_set_drop_constraints_involving_dims(
6529		__isl_take isl_set *set,
6530		enum isl_dim_type type,
6531		unsigned first, unsigned n);
6532	__isl_give isl_set *
6533	isl_set_drop_constraints_not_involving_dims(
6534		__isl_take isl_set *set,
6535		enum isl_dim_type type,
6536		unsigned first, unsigned n);
6537
6538	#include <isl/map.h>
6539	__isl_give isl_basic_map *
6540	isl_basic_map_drop_constraints_involving_dims(
6541		__isl_take isl_basic_map *bmap,
6542		enum isl_dim_type type,
6543		unsigned first, unsigned n);
6544	__isl_give isl_basic_map *
6545	isl_basic_map_drop_constraints_not_involving_dims(
6546		__isl_take isl_basic_map *bmap,
6547		enum isl_dim_type type,
6548		unsigned first, unsigned n);
6549	__isl_give isl_map *
6550	isl_map_drop_constraints_involving_dims(
6551		__isl_take isl_map *map,
6552		enum isl_dim_type type,
6553		unsigned first, unsigned n);
6554	__isl_give isl_map *
6555	isl_map_drop_constraints_not_involving_dims(
6556		__isl_take isl_map *map,
6557		enum isl_dim_type type,
6558		unsigned first, unsigned n);
6559
6560These functions drop any constraints (not) involving the specified dimensions.
6561Note that the result depends on the representation of the input.
6562
6563	#include <isl/polynomial.h>
6564	__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_to_polynomial(
6565		__isl_take isl_pw_qpolynomial *pwqp, int sign);
6566	__isl_give isl_union_pw_qpolynomial *
6567	isl_union_pw_qpolynomial_to_polynomial(
6568		__isl_take isl_union_pw_qpolynomial *upwqp, int sign);
6569
6570Approximate each quasipolynomial by a polynomial.  If C<sign> is positive,
6571the polynomial will be an overapproximation.  If C<sign> is negative,
6572it will be an underapproximation.  If C<sign> is zero, the approximation
6573will lie somewhere in between.
6574
6575=item * Feasibility
6576
6577	__isl_give isl_basic_set *isl_basic_set_sample(
6578		__isl_take isl_basic_set *bset);
6579	__isl_give isl_basic_set *isl_set_sample(
6580		__isl_take isl_set *set);
6581	__isl_give isl_basic_map *isl_basic_map_sample(
6582		__isl_take isl_basic_map *bmap);
6583	__isl_give isl_basic_map *isl_map_sample(
6584		__isl_take isl_map *map);
6585
6586If the input (basic) set or relation is non-empty, then return
6587a singleton subset of the input.  Otherwise, return an empty set.
6588
6589=item * Optimization
6590
6591	#include <isl/ilp.h>
6592	__isl_give isl_val *isl_basic_set_max_val(
6593		__isl_keep isl_basic_set *bset,
6594		__isl_keep isl_aff *obj);
6595	__isl_give isl_val *isl_set_min_val(
6596		__isl_keep isl_set *set,
6597		__isl_keep isl_aff *obj);
6598	__isl_give isl_val *isl_set_max_val(
6599		__isl_keep isl_set *set,
6600		__isl_keep isl_aff *obj);
6601	__isl_give isl_multi_val *
6602	isl_union_set_min_multi_union_pw_aff(
6603		__isl_keep isl_union_set *uset,
6604		__isl_keep isl_multi_union_pw_aff *obj);
6605
6606Compute the minimum or maximum of the integer affine expression C<obj>
6607over the points in C<set>.
6608The result is C<NULL> in case of an error, the optimal value in case
6609there is one, negative infinity or infinity if the problem is unbounded and
6610NaN if the problem is empty.
6611
6612	#include <isl/ilp.h>
6613	__isl_give isl_val *isl_pw_aff_min_val(
6614		__isl_take isl_pw_aff *pa);
6615	__isl_give isl_val *isl_pw_aff_max_val(
6616		__isl_take isl_pw_aff *pa);
6617	__isl_give isl_multi_val *
6618	isl_pw_multi_aff_min_multi_val(
6619		__isl_take isl_pw_multi_aff *pma);
6620	__isl_give isl_multi_val *
6621	isl_pw_multi_aff_max_multi_val(
6622		__isl_take isl_pw_multi_aff *pma);
6623	__isl_give isl_multi_val *
6624	isl_multi_pw_aff_min_multi_val(
6625		__isl_take isl_multi_pw_aff *mpa);
6626	__isl_give isl_multi_val *
6627	isl_multi_pw_aff_max_multi_val(
6628		__isl_take isl_multi_pw_aff *mpa);
6629	__isl_give isl_val *isl_union_pw_aff_min_val(
6630		__isl_take isl_union_pw_aff *upa);
6631	__isl_give isl_val *isl_union_pw_aff_max_val(
6632		__isl_take isl_union_pw_aff *upa);
6633	__isl_give isl_multi_val *
6634	isl_multi_union_pw_aff_min_multi_val(
6635		__isl_take isl_multi_union_pw_aff *mupa);
6636	__isl_give isl_multi_val *
6637	isl_multi_union_pw_aff_max_multi_val(
6638		__isl_take isl_multi_union_pw_aff *mupa);
6639
6640Compute the minimum or maximum of the integer affine expression
6641over its definition domain.
6642The result is C<NULL> in case of an error, the optimal value in case
6643there is one, negative infinity or infinity if the problem is unbounded and
6644NaN if the problem is empty.
6645
6646	#include <isl/ilp.h>
6647	__isl_give isl_val *isl_basic_set_dim_max_val(
6648		__isl_take isl_basic_set *bset, int pos);
6649	__isl_give isl_val *isl_set_dim_min_val(
6650		__isl_take isl_set *set, int pos);
6651	__isl_give isl_val *isl_set_dim_max_val(
6652		__isl_take isl_set *set, int pos);
6653
6654Return the minimal or maximal value attained by the given set dimension,
6655independently of the parameter values and of any other dimensions.
6656The result is C<NULL> in case of an error, the optimal value in case
6657there is one, (negative) infinity if the problem is unbounded and
6658NaN if the input is empty.
6659
6660=item * Parametric optimization
6661
6662	__isl_give isl_pw_aff *isl_set_dim_min(
6663		__isl_take isl_set *set, int pos);
6664	__isl_give isl_pw_aff *isl_set_dim_max(
6665		__isl_take isl_set *set, int pos);
6666	__isl_give isl_pw_aff *isl_map_dim_min(
6667		__isl_take isl_map *map, int pos);
6668	__isl_give isl_pw_aff *isl_map_dim_max(
6669		__isl_take isl_map *map, int pos);
6670	__isl_give isl_multi_pw_aff *
6671	isl_set_min_multi_pw_aff(
6672		__isl_take isl_set *set);
6673	__isl_give isl_multi_pw_aff *
6674	isl_set_max_multi_pw_aff(
6675		__isl_take isl_set *set);
6676	__isl_give isl_multi_pw_aff *
6677	isl_map_min_multi_pw_aff(
6678		__isl_take isl_map *map);
6679	__isl_give isl_multi_pw_aff *
6680	isl_map_max_multi_pw_aff(
6681		__isl_take isl_map *map);
6682
6683Compute the minimum or maximum of the (given) set or output dimension(s)
6684as a function of the parameters (and input dimensions), but independently
6685of the other set or output dimensions.
6686For lexicographic optimization, see L<"Lexicographic Optimization">.
6687
6688=item * Dual
6689
6690The following functions compute either the set of (rational) coefficient
6691values of valid constraints for the given set or the set of (rational)
6692values satisfying the constraints with coefficients from the given set.
6693Internally, these two sets of functions perform essentially the
6694same operations, except that the set of coefficients is assumed to
6695be a cone, while the set of values may be any polyhedron.
6696The current implementation is based on the Farkas lemma and
6697Fourier-Motzkin elimination, but this may change or be made optional
6698in future.  In particular, future implementations may use different
6699dualization algorithms or skip the elimination step.
6700
6701	#include <isl/set.h>
6702	__isl_give isl_basic_set *isl_basic_set_coefficients(
6703		__isl_take isl_basic_set *bset);
6704	__isl_give isl_basic_set_list *
6705	isl_basic_set_list_coefficients(
6706		__isl_take isl_basic_set_list *list);
6707	__isl_give isl_basic_set *isl_set_coefficients(
6708		__isl_take isl_set *set);
6709	__isl_give isl_union_set *isl_union_set_coefficients(
6710		__isl_take isl_union_set *bset);
6711	__isl_give isl_basic_set *isl_basic_set_solutions(
6712		__isl_take isl_basic_set *bset);
6713	__isl_give isl_basic_set *isl_set_solutions(
6714		__isl_take isl_set *set);
6715	__isl_give isl_union_set *isl_union_set_solutions(
6716		__isl_take isl_union_set *bset);
6717
6718=item * Power
6719
6720	__isl_give isl_map *isl_map_fixed_power_val(
6721		__isl_take isl_map *map,
6722		__isl_take isl_val *exp);
6723	__isl_give isl_union_map *
6724	isl_union_map_fixed_power_val(
6725		__isl_take isl_union_map *umap,
6726		__isl_take isl_val *exp);
6727
6728Compute the given power of C<map>, where C<exp> is assumed to be non-zero.
6729If the exponent C<exp> is negative, then the -C<exp> th power of the inverse
6730of C<map> is computed.
6731
6732	__isl_give isl_map *isl_map_power(__isl_take isl_map *map,
6733		isl_bool *exact);
6734	__isl_give isl_union_map *isl_union_map_power(
6735		__isl_take isl_union_map *umap, isl_bool *exact);
6736
6737Compute a parametric representation for all positive powers I<k> of C<map>.
6738The result maps I<k> to a nested relation corresponding to the
6739I<k>th power of C<map>.
6740The result may be an overapproximation.  If the result is known to be exact,
6741then C<*exact> is set to C<1>.
6742
6743=item * Transitive closure
6744
6745	__isl_give isl_map *isl_map_transitive_closure(
6746		__isl_take isl_map *map, isl_bool *exact);
6747	__isl_give isl_union_map *isl_union_map_transitive_closure(
6748		__isl_take isl_union_map *umap, isl_bool *exact);
6749
6750Compute the transitive closure of C<map>.
6751The result may be an overapproximation.  If the result is known to be exact,
6752then C<*exact> is set to C<1>.
6753
6754=item * Reaching path lengths
6755
6756	__isl_give isl_map *isl_map_reaching_path_lengths(
6757		__isl_take isl_map *map, isl_bool *exact);
6758
6759Compute a relation that maps each element in the range of C<map>
6760to the lengths of all paths composed of edges in C<map> that
6761end up in the given element.
6762The result may be an overapproximation.  If the result is known to be exact,
6763then C<*exact> is set to C<1>.
6764To compute the I<maximal> path length, the resulting relation
6765should be postprocessed by C<isl_map_lexmax>.
6766In particular, if the input relation is a dependence relation
6767(mapping sources to sinks), then the maximal path length corresponds
6768to the free schedule.
6769Note, however, that C<isl_map_lexmax> expects the maximum to be
6770finite, so if the path lengths are unbounded (possibly due to
6771the overapproximation), then you will get an error message.
6772
6773=item * Wrapping
6774
6775	#include <isl/space.h>
6776	__isl_give isl_space *isl_space_wrap(
6777		__isl_take isl_space *space);
6778	__isl_give isl_space *isl_space_unwrap(
6779		__isl_take isl_space *space);
6780
6781	#include <isl/local_space.h>
6782	__isl_give isl_local_space *isl_local_space_wrap(
6783		__isl_take isl_local_space *ls);
6784
6785	#include <isl/set.h>
6786	__isl_give isl_basic_map *isl_basic_set_unwrap(
6787		__isl_take isl_basic_set *bset);
6788	__isl_give isl_map *isl_set_unwrap(
6789		__isl_take isl_set *set);
6790
6791	#include <isl/map.h>
6792	__isl_give isl_basic_set *isl_basic_map_wrap(
6793		__isl_take isl_basic_map *bmap);
6794	__isl_give isl_set *isl_map_wrap(
6795		__isl_take isl_map *map);
6796
6797	#include <isl/union_set.h>
6798	__isl_give isl_union_map *isl_union_set_unwrap(
6799		__isl_take isl_union_set *uset);
6800
6801	#include <isl/union_map.h>
6802	__isl_give isl_union_set *isl_union_map_wrap(
6803		__isl_take isl_union_map *umap);
6804
6805The input to C<isl_space_unwrap> should
6806be the space of a set, while that of
6807C<isl_space_wrap> should be the space of a relation.
6808Conversely, the output of C<isl_space_unwrap> is the space
6809of a relation, while that of C<isl_space_wrap> is the space of a set.
6810
6811=item * Flattening
6812
6813Remove any internal structure of domain (and range) of the given
6814set or relation.  If there is any such internal structure in the input,
6815then the name of the space is also removed.
6816
6817	#include <isl/space.h>
6818	__isl_give isl_space *isl_space_flatten_domain(
6819		__isl_take isl_space *space);
6820	__isl_give isl_space *isl_space_flatten_range(
6821		__isl_take isl_space *space);
6822
6823	#include <isl/local_space.h>
6824	__isl_give isl_local_space *
6825	isl_local_space_flatten_domain(
6826		__isl_take isl_local_space *ls);
6827	__isl_give isl_local_space *
6828	isl_local_space_flatten_range(
6829		__isl_take isl_local_space *ls);
6830
6831	#include <isl/set.h>
6832	__isl_give isl_basic_set *isl_basic_set_flatten(
6833		__isl_take isl_basic_set *bset);
6834	__isl_give isl_set *isl_set_flatten(
6835		__isl_take isl_set *set);
6836
6837	#include <isl/map.h>
6838	__isl_give isl_basic_map *isl_basic_map_flatten_domain(
6839		__isl_take isl_basic_map *bmap);
6840	__isl_give isl_basic_map *isl_basic_map_flatten_range(
6841		__isl_take isl_basic_map *bmap);
6842	__isl_give isl_map *isl_map_flatten_range(
6843		__isl_take isl_map *map);
6844	__isl_give isl_map *isl_map_flatten_domain(
6845		__isl_take isl_map *map);
6846	__isl_give isl_basic_map *isl_basic_map_flatten(
6847		__isl_take isl_basic_map *bmap);
6848	__isl_give isl_map *isl_map_flatten(
6849		__isl_take isl_map *map);
6850
6851	#include <isl/id.h>
6852	__isl_give isl_multi_id *isl_multi_id_flatten_range(
6853		__isl_take isl_multi_id *mi);
6854
6855	#include <isl/val.h>
6856	__isl_give isl_multi_val *isl_multi_val_flatten_range(
6857		__isl_take isl_multi_val *mv);
6858
6859	#include <isl/aff.h>
6860	__isl_give isl_multi_aff *isl_multi_aff_flatten_domain(
6861		__isl_take isl_multi_aff *ma);
6862	__isl_give isl_multi_aff *isl_multi_aff_flatten_range(
6863		__isl_take isl_multi_aff *ma);
6864	__isl_give isl_multi_pw_aff *
6865	isl_multi_pw_aff_flatten_range(
6866		__isl_take isl_multi_pw_aff *mpa);
6867	__isl_give isl_multi_union_pw_aff *
6868	isl_multi_union_pw_aff_flatten_range(
6869		__isl_take isl_multi_union_pw_aff *mupa);
6870
6871	#include <isl/map.h>
6872	__isl_give isl_map *isl_set_flatten_map(
6873		__isl_take isl_set *set);
6874
6875The function above constructs a relation
6876that maps the input set to a flattened version of the set.
6877
6878=item * Lifting
6879
6880Lift the input set to a space with extra dimensions corresponding
6881to the existentially quantified variables in the input.
6882In particular, the result lives in a wrapped map where the domain
6883is the original space and the range corresponds to the original
6884existentially quantified variables.
6885
6886	#include <isl/set.h>
6887	__isl_give isl_basic_set *isl_basic_set_lift(
6888		__isl_take isl_basic_set *bset);
6889	__isl_give isl_set *isl_set_lift(
6890		__isl_take isl_set *set);
6891	__isl_give isl_union_set *isl_union_set_lift(
6892		__isl_take isl_union_set *uset);
6893
6894Given a local space that contains the existentially quantified
6895variables of a set, a basic relation that, when applied to
6896a basic set, has essentially the same effect as C<isl_basic_set_lift>,
6897can be constructed using the following function.
6898
6899	#include <isl/local_space.h>
6900	__isl_give isl_basic_map *isl_local_space_lifting(
6901		__isl_take isl_local_space *ls);
6902
6903	#include <isl/aff.h>
6904	__isl_give isl_multi_aff *isl_multi_aff_lift(
6905		__isl_take isl_multi_aff *maff,
6906		__isl_give isl_local_space **ls);
6907
6908If the C<ls> argument of C<isl_multi_aff_lift> is not C<NULL>,
6909then it is assigned the local space that lies at the basis of
6910the lifting applied.
6911
6912=item * Internal Product
6913
6914	#include <isl/space.h>
6915	__isl_give isl_space *isl_space_zip(
6916		__isl_take isl_space *space);
6917
6918	#include <isl/map.h>
6919	__isl_give isl_basic_map *isl_basic_map_zip(
6920		__isl_take isl_basic_map *bmap);
6921	__isl_give isl_map *isl_map_zip(
6922		__isl_take isl_map *map);
6923
6924	#include <isl/union_map.h>
6925	__isl_give isl_union_map *isl_union_map_zip(
6926		__isl_take isl_union_map *umap);
6927
6928Given a relation with nested relations for domain and range,
6929interchange the range of the domain with the domain of the range.
6930
6931=item * Currying
6932
6933	#include <isl/space.h>
6934	__isl_give isl_space *isl_space_curry(
6935		__isl_take isl_space *space);
6936	__isl_give isl_space *isl_space_uncurry(
6937		__isl_take isl_space *space);
6938
6939	#include <isl/map.h>
6940	__isl_give isl_basic_map *isl_basic_map_curry(
6941		__isl_take isl_basic_map *bmap);
6942	__isl_give isl_basic_map *isl_basic_map_uncurry(
6943		__isl_take isl_basic_map *bmap);
6944	__isl_give isl_map *isl_map_curry(
6945		__isl_take isl_map *map);
6946	__isl_give isl_map *isl_map_uncurry(
6947		__isl_take isl_map *map);
6948
6949	#include <isl/union_map.h>
6950	__isl_give isl_union_map *isl_union_map_curry(
6951		__isl_take isl_union_map *umap);
6952	__isl_give isl_union_map *isl_union_map_uncurry(
6953		__isl_take isl_union_map *umap);
6954
6955Given a relation with a nested relation for domain,
6956the C<curry> functions
6957move the range of the nested relation out of the domain
6958and use it as the domain of a nested relation in the range,
6959with the original range as range of this nested relation.
6960The C<uncurry> functions perform the inverse operation.
6961
6962	#include <isl/space.h>
6963	__isl_give isl_space *isl_space_range_curry(
6964		__isl_take isl_space *space);
6965
6966	#include <isl/map.h>
6967	__isl_give isl_map *isl_map_range_curry(
6968		__isl_take isl_map *map);
6969
6970	#include <isl/union_map.h>
6971	__isl_give isl_union_map *isl_union_map_range_curry(
6972		__isl_take isl_union_map *umap);
6973
6974These functions apply the currying to the relation that
6975is nested inside the range of the input.
6976
6977=item * Aligning parameters
6978
6979Change the order of the parameters of the given set, relation
6980or function
6981such that the first parameters match those of C<model>.
6982This may involve the introduction of extra parameters.
6983All parameters need to be named.
6984
6985	#include <isl/space.h>
6986	__isl_give isl_space *isl_space_align_params(
6987		__isl_take isl_space *space1,
6988		__isl_take isl_space *space2)
6989
6990	#include <isl/set.h>
6991	__isl_give isl_basic_set *isl_basic_set_align_params(
6992		__isl_take isl_basic_set *bset,
6993		__isl_take isl_space *model);
6994	__isl_give isl_set *isl_set_align_params(
6995		__isl_take isl_set *set,
6996		__isl_take isl_space *model);
6997
6998	#include <isl/map.h>
6999	__isl_give isl_basic_map *isl_basic_map_align_params(
7000		__isl_take isl_basic_map *bmap,
7001		__isl_take isl_space *model);
7002	__isl_give isl_map *isl_map_align_params(
7003		__isl_take isl_map *map,
7004		__isl_take isl_space *model);
7005
7006	#include <isl/id.h>
7007	__isl_give isl_multi_id *isl_multi_id_align_params(
7008		__isl_take isl_multi_id *mi,
7009		__isl_take isl_space *model);
7010
7011	#include <isl/val.h>
7012	__isl_give isl_multi_val *isl_multi_val_align_params(
7013		__isl_take isl_multi_val *mv,
7014		__isl_take isl_space *model);
7015
7016	#include <isl/aff.h>
7017	__isl_give isl_aff *isl_aff_align_params(
7018		__isl_take isl_aff *aff,
7019		__isl_take isl_space *model);
7020	__isl_give isl_multi_aff *isl_multi_aff_align_params(
7021		__isl_take isl_multi_aff *multi,
7022		__isl_take isl_space *model);
7023	__isl_give isl_pw_aff *isl_pw_aff_align_params(
7024		__isl_take isl_pw_aff *pwaff,
7025		__isl_take isl_space *model);
7026	__isl_give isl_pw_multi_aff *isl_pw_multi_aff_align_params(
7027		__isl_take isl_pw_multi_aff *pma,
7028		__isl_take isl_space *model);
7029	__isl_give isl_union_pw_aff *
7030	isl_union_pw_aff_align_params(
7031		__isl_take isl_union_pw_aff *upa,
7032		__isl_take isl_space *model);
7033	__isl_give isl_union_pw_multi_aff *
7034	isl_union_pw_multi_aff_align_params(
7035		__isl_take isl_union_pw_multi_aff *upma,
7036		__isl_take isl_space *model);
7037	__isl_give isl_multi_union_pw_aff *
7038	isl_multi_union_pw_aff_align_params(
7039		__isl_take isl_multi_union_pw_aff *mupa,
7040		__isl_take isl_space *model);
7041
7042	#include <isl/polynomial.h>
7043	__isl_give isl_qpolynomial *isl_qpolynomial_align_params(
7044		__isl_take isl_qpolynomial *qp,
7045		__isl_take isl_space *model);
7046
7047=item * Drop unused parameters
7048
7049Drop parameters that are not referenced by the isl object.
7050All parameters need to be named.
7051
7052	#include <isl/set.h>
7053	__isl_give isl_basic_set *
7054	isl_basic_set_drop_unused_params(
7055		__isl_take isl_basic_set *bset);
7056	__isl_give isl_set *isl_set_drop_unused_params(
7057		__isl_take isl_set *set);
7058
7059	#include <isl/map.h>
7060	__isl_give isl_basic_map *
7061	isl_basic_map_drop_unused_params(
7062		__isl_take isl_basic_map *bmap);
7063	__isl_give isl_map *isl_map_drop_unused_params(
7064		__isl_take isl_map *map);
7065
7066	#include <isl/aff.h>
7067	__isl_give isl_pw_aff *isl_pw_aff_drop_unused_params(
7068		__isl_take isl_pw_aff *pa);
7069	__isl_give isl_pw_multi_aff *
7070	isl_pw_multi_aff_drop_unused_params(
7071		__isl_take isl_pw_multi_aff *pma);
7072
7073	#include <isl/polynomial.h>
7074	__isl_give isl_pw_qpolynomial *
7075	isl_pw_qpolynomial_drop_unused_params(
7076		__isl_take isl_pw_qpolynomial *pwqp);
7077	__isl_give isl_pw_qpolynomial_fold *
7078	isl_pw_qpolynomial_fold_drop_unused_params(
7079		__isl_take isl_pw_qpolynomial_fold *pwf);
7080
7081=item * Unary Arithmetic Operations
7082
7083	#include <isl/set.h>
7084	__isl_give isl_set *isl_set_neg(
7085		__isl_take isl_set *set);
7086	#include <isl/map.h>
7087	__isl_give isl_map *isl_map_neg(
7088		__isl_take isl_map *map);
7089
7090C<isl_set_neg> constructs a set containing the opposites of
7091the elements in its argument.
7092The domain of the result of C<isl_map_neg> is the same
7093as the domain of its argument.  The corresponding range
7094elements are the opposites of the corresponding range
7095elements in the argument.
7096
7097	#include <isl/val.h>
7098	__isl_give isl_multi_val *isl_multi_val_neg(
7099		__isl_take isl_multi_val *mv);
7100
7101	#include <isl/aff.h>
7102	__isl_give isl_aff *isl_aff_neg(
7103		__isl_take isl_aff *aff);
7104	__isl_give isl_multi_aff *isl_multi_aff_neg(
7105		__isl_take isl_multi_aff *ma);
7106	__isl_give isl_pw_aff *isl_pw_aff_neg(
7107		__isl_take isl_pw_aff *pwaff);
7108	__isl_give isl_pw_multi_aff *isl_pw_multi_aff_neg(
7109		__isl_take isl_pw_multi_aff *pma);
7110	__isl_give isl_multi_pw_aff *isl_multi_pw_aff_neg(
7111		__isl_take isl_multi_pw_aff *mpa);
7112	__isl_give isl_union_pw_aff *isl_union_pw_aff_neg(
7113		__isl_take isl_union_pw_aff *upa);
7114	__isl_give isl_union_pw_multi_aff *
7115	isl_union_pw_multi_aff_neg(
7116		__isl_take isl_union_pw_multi_aff *upma);
7117	__isl_give isl_multi_union_pw_aff *
7118	isl_multi_union_pw_aff_neg(
7119		__isl_take isl_multi_union_pw_aff *mupa);
7120	__isl_give isl_aff *isl_aff_ceil(
7121		__isl_take isl_aff *aff);
7122	__isl_give isl_pw_aff *isl_pw_aff_ceil(
7123		__isl_take isl_pw_aff *pwaff);
7124	__isl_give isl_aff *isl_aff_floor(
7125		__isl_take isl_aff *aff);
7126	__isl_give isl_multi_aff *isl_multi_aff_floor(
7127		__isl_take isl_multi_aff *ma);
7128	__isl_give isl_pw_aff *isl_pw_aff_floor(
7129		__isl_take isl_pw_aff *pwaff);
7130	__isl_give isl_union_pw_aff *isl_union_pw_aff_floor(
7131		__isl_take isl_union_pw_aff *upa);
7132	__isl_give isl_multi_union_pw_aff *
7133	isl_multi_union_pw_aff_floor(
7134		__isl_take isl_multi_union_pw_aff *mupa);
7135
7136	#include <isl/aff.h>
7137	__isl_give isl_pw_aff *isl_pw_aff_list_min(
7138		__isl_take isl_pw_aff_list *list);
7139	__isl_give isl_pw_aff *isl_pw_aff_list_max(
7140		__isl_take isl_pw_aff_list *list);
7141
7142	#include <isl/polynomial.h>
7143	__isl_give isl_qpolynomial *isl_qpolynomial_neg(
7144		__isl_take isl_qpolynomial *qp);
7145	__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_neg(
7146		__isl_take isl_pw_qpolynomial *pwqp);
7147	__isl_give isl_union_pw_qpolynomial *
7148	isl_union_pw_qpolynomial_neg(
7149		__isl_take isl_union_pw_qpolynomial *upwqp);
7150	__isl_give isl_qpolynomial *isl_qpolynomial_pow(
7151		__isl_take isl_qpolynomial *qp,
7152		unsigned exponent);
7153	__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_pow(
7154		__isl_take isl_pw_qpolynomial *pwqp,
7155		unsigned exponent);
7156
7157=item * Evaluation
7158
7159The following functions evaluate a function in a point.
7160
7161	#include <isl/aff.h>
7162	__isl_give isl_val *isl_aff_eval(
7163		__isl_take isl_aff *aff,
7164		__isl_take isl_point *pnt);
7165	__isl_give isl_val *isl_pw_aff_eval(
7166		__isl_take isl_pw_aff *pa,
7167		__isl_take isl_point *pnt);
7168
7169	#include <isl/polynomial.h>
7170	__isl_give isl_val *isl_pw_qpolynomial_eval(
7171		__isl_take isl_pw_qpolynomial *pwqp,
7172		__isl_take isl_point *pnt);
7173	__isl_give isl_val *isl_pw_qpolynomial_fold_eval(
7174		__isl_take isl_pw_qpolynomial_fold *pwf,
7175		__isl_take isl_point *pnt);
7176	__isl_give isl_val *isl_union_pw_qpolynomial_eval(
7177		__isl_take isl_union_pw_qpolynomial *upwqp,
7178		__isl_take isl_point *pnt);
7179	__isl_give isl_val *isl_union_pw_qpolynomial_fold_eval(
7180		__isl_take isl_union_pw_qpolynomial_fold *upwf,
7181		__isl_take isl_point *pnt);
7182
7183These functions return NaN when evaluated at a void point.
7184Note that C<isl_pw_aff_eval> returns NaN when the function is evaluated outside
7185its definition domain, while C<isl_pw_qpolynomial_eval> returns zero
7186when the function is evaluated outside its explicit domain.
7187
7188=item * Dimension manipulation
7189
7190It is usually not advisable to directly change the (input or output)
7191space of a set or a relation as this removes the name and the internal
7192structure of the space.  However, the functions below can be useful
7193to add new parameters, assuming
7194C<isl_set_align_params> and C<isl_map_align_params>
7195are not sufficient.
7196
7197	#include <isl/space.h>
7198	__isl_give isl_space *isl_space_add_dims(
7199		__isl_take isl_space *space,
7200		enum isl_dim_type type, unsigned n);
7201	__isl_give isl_space *isl_space_insert_dims(
7202		__isl_take isl_space *space,
7203		enum isl_dim_type type, unsigned pos, unsigned n);
7204	__isl_give isl_space *isl_space_drop_dims(
7205		__isl_take isl_space *space,
7206		enum isl_dim_type type, unsigned first, unsigned n);
7207	__isl_give isl_space *isl_space_move_dims(
7208		__isl_take isl_space *space,
7209		enum isl_dim_type dst_type, unsigned dst_pos,
7210		enum isl_dim_type src_type, unsigned src_pos,
7211		unsigned n);
7212
7213	#include <isl/local_space.h>
7214	__isl_give isl_local_space *isl_local_space_add_dims(
7215		__isl_take isl_local_space *ls,
7216		enum isl_dim_type type, unsigned n);
7217	__isl_give isl_local_space *isl_local_space_insert_dims(
7218		__isl_take isl_local_space *ls,
7219		enum isl_dim_type type, unsigned first, unsigned n);
7220	__isl_give isl_local_space *isl_local_space_drop_dims(
7221		__isl_take isl_local_space *ls,
7222		enum isl_dim_type type, unsigned first, unsigned n);
7223
7224	#include <isl/set.h>
7225	__isl_give isl_basic_set *isl_basic_set_add_dims(
7226		__isl_take isl_basic_set *bset,
7227		enum isl_dim_type type, unsigned n);
7228	__isl_give isl_set *isl_set_add_dims(
7229		__isl_take isl_set *set,
7230		enum isl_dim_type type, unsigned n);
7231	__isl_give isl_basic_set *isl_basic_set_insert_dims(
7232		__isl_take isl_basic_set *bset,
7233		enum isl_dim_type type, unsigned pos,
7234		unsigned n);
7235	__isl_give isl_set *isl_set_insert_dims(
7236		__isl_take isl_set *set,
7237		enum isl_dim_type type, unsigned pos, unsigned n);
7238	__isl_give isl_basic_set *isl_basic_set_move_dims(
7239		__isl_take isl_basic_set *bset,
7240		enum isl_dim_type dst_type, unsigned dst_pos,
7241		enum isl_dim_type src_type, unsigned src_pos,
7242		unsigned n);
7243	__isl_give isl_set *isl_set_move_dims(
7244		__isl_take isl_set *set,
7245		enum isl_dim_type dst_type, unsigned dst_pos,
7246		enum isl_dim_type src_type, unsigned src_pos,
7247		unsigned n);
7248
7249	#include <isl/map.h>
7250	__isl_give isl_basic_map *isl_basic_map_add_dims(
7251		__isl_take isl_basic_map *bmap,
7252		enum isl_dim_type type, unsigned n);
7253	__isl_give isl_map *isl_map_add_dims(
7254		__isl_take isl_map *map,
7255		enum isl_dim_type type, unsigned n);
7256	__isl_give isl_basic_map *isl_basic_map_insert_dims(
7257		__isl_take isl_basic_map *bmap,
7258		enum isl_dim_type type, unsigned pos,
7259		unsigned n);
7260	__isl_give isl_map *isl_map_insert_dims(
7261		__isl_take isl_map *map,
7262		enum isl_dim_type type, unsigned pos, unsigned n);
7263	__isl_give isl_basic_map *isl_basic_map_move_dims(
7264		__isl_take isl_basic_map *bmap,
7265		enum isl_dim_type dst_type, unsigned dst_pos,
7266		enum isl_dim_type src_type, unsigned src_pos,
7267		unsigned n);
7268	__isl_give isl_map *isl_map_move_dims(
7269		__isl_take isl_map *map,
7270		enum isl_dim_type dst_type, unsigned dst_pos,
7271		enum isl_dim_type src_type, unsigned src_pos,
7272		unsigned n);
7273
7274	#include <isl/val.h>
7275	__isl_give isl_multi_val *isl_multi_val_insert_dims(
7276		__isl_take isl_multi_val *mv,
7277		enum isl_dim_type type, unsigned first, unsigned n);
7278	__isl_give isl_multi_val *isl_multi_val_add_dims(
7279		__isl_take isl_multi_val *mv,
7280		enum isl_dim_type type, unsigned n);
7281	__isl_give isl_multi_val *isl_multi_val_drop_dims(
7282		__isl_take isl_multi_val *mv,
7283		enum isl_dim_type type, unsigned first, unsigned n);
7284
7285	#include <isl/aff.h>
7286	__isl_give isl_aff *isl_aff_insert_dims(
7287		__isl_take isl_aff *aff,
7288		enum isl_dim_type type, unsigned first, unsigned n);
7289	__isl_give isl_multi_aff *isl_multi_aff_insert_dims(
7290		__isl_take isl_multi_aff *ma,
7291		enum isl_dim_type type, unsigned first, unsigned n);
7292	__isl_give isl_pw_aff *isl_pw_aff_insert_dims(
7293		__isl_take isl_pw_aff *pwaff,
7294		enum isl_dim_type type, unsigned first, unsigned n);
7295	__isl_give isl_multi_pw_aff *isl_multi_pw_aff_insert_dims(
7296		__isl_take isl_multi_pw_aff *mpa,
7297		enum isl_dim_type type, unsigned first, unsigned n);
7298	__isl_give isl_aff *isl_aff_add_dims(
7299		__isl_take isl_aff *aff,
7300		enum isl_dim_type type, unsigned n);
7301	__isl_give isl_multi_aff *isl_multi_aff_add_dims(
7302		__isl_take isl_multi_aff *ma,
7303		enum isl_dim_type type, unsigned n);
7304	__isl_give isl_pw_aff *isl_pw_aff_add_dims(
7305		__isl_take isl_pw_aff *pwaff,
7306		enum isl_dim_type type, unsigned n);
7307	__isl_give isl_multi_pw_aff *isl_multi_pw_aff_add_dims(
7308		__isl_take isl_multi_pw_aff *mpa,
7309		enum isl_dim_type type, unsigned n);
7310	__isl_give isl_aff *isl_aff_drop_dims(
7311		__isl_take isl_aff *aff,
7312		enum isl_dim_type type, unsigned first, unsigned n);
7313	__isl_give isl_multi_aff *isl_multi_aff_drop_dims(
7314		__isl_take isl_multi_aff *maff,
7315		enum isl_dim_type type, unsigned first, unsigned n);
7316	__isl_give isl_pw_aff *isl_pw_aff_drop_dims(
7317		__isl_take isl_pw_aff *pwaff,
7318		enum isl_dim_type type, unsigned first, unsigned n);
7319	__isl_give isl_pw_multi_aff *isl_pw_multi_aff_drop_dims(
7320		__isl_take isl_pw_multi_aff *pma,
7321		enum isl_dim_type type, unsigned first, unsigned n);
7322	__isl_give isl_union_pw_aff *isl_union_pw_aff_drop_dims(
7323		__isl_take isl_union_pw_aff *upa,
7324		enum isl_dim_type type, unsigned first, unsigned n);
7325	__isl_give isl_union_pw_multi_aff *
7326		isl_union_pw_multi_aff_drop_dims(
7327		__isl_take isl_union_pw_multi_aff *upma,
7328		enum isl_dim_type type,
7329		unsigned first, unsigned n);
7330	__isl_give isl_multi_union_pw_aff *
7331	isl_multi_union_pw_aff_drop_dims(
7332		__isl_take isl_multi_union_pw_aff *mupa,
7333		enum isl_dim_type type, unsigned first,
7334		unsigned n);
7335	__isl_give isl_aff *isl_aff_move_dims(
7336		__isl_take isl_aff *aff,
7337		enum isl_dim_type dst_type, unsigned dst_pos,
7338		enum isl_dim_type src_type, unsigned src_pos,
7339		unsigned n);
7340	__isl_give isl_multi_aff *isl_multi_aff_move_dims(
7341		__isl_take isl_multi_aff *ma,
7342		enum isl_dim_type dst_type, unsigned dst_pos,
7343		enum isl_dim_type src_type, unsigned src_pos,
7344		unsigned n);
7345	__isl_give isl_pw_aff *isl_pw_aff_move_dims(
7346		__isl_take isl_pw_aff *pa,
7347		enum isl_dim_type dst_type, unsigned dst_pos,
7348		enum isl_dim_type src_type, unsigned src_pos,
7349		unsigned n);
7350	__isl_give isl_multi_pw_aff *isl_multi_pw_aff_move_dims(
7351		__isl_take isl_multi_pw_aff *pma,
7352		enum isl_dim_type dst_type, unsigned dst_pos,
7353		enum isl_dim_type src_type, unsigned src_pos,
7354		unsigned n);
7355
7356	#include <isl/polynomial.h>
7357	__isl_give isl_union_pw_qpolynomial *
7358	isl_union_pw_qpolynomial_drop_dims(
7359		__isl_take isl_union_pw_qpolynomial *upwqp,
7360		enum isl_dim_type type,
7361		unsigned first, unsigned n);
7362	__isl_give isl_union_pw_qpolynomial_fold *
7363		isl_union_pw_qpolynomial_fold_drop_dims(
7364		__isl_take isl_union_pw_qpolynomial_fold *upwf,
7365		enum isl_dim_type type,
7366		unsigned first, unsigned n);
7367
7368The operations on union expressions can only manipulate parameters.
7369
7370=back
7371
7372=head2 Binary Operations
7373
7374The two arguments of a binary operation not only need to live
7375in the same C<isl_ctx>, they currently also need to have
7376the same (number of) parameters.
7377
7378=head3 Basic Operations
7379
7380=over
7381
7382=item * Intersection
7383
7384	#include <isl/local_space.h>
7385	__isl_give isl_local_space *isl_local_space_intersect(
7386		__isl_take isl_local_space *ls1,
7387		__isl_take isl_local_space *ls2);
7388
7389	#include <isl/set.h>
7390	__isl_give isl_basic_set *isl_basic_set_intersect_params(
7391		__isl_take isl_basic_set *bset1,
7392		__isl_take isl_basic_set *bset2);
7393	__isl_give isl_basic_set *isl_basic_set_intersect(
7394		__isl_take isl_basic_set *bset1,
7395		__isl_take isl_basic_set *bset2);
7396	__isl_give isl_basic_set *isl_basic_set_list_intersect(
7397		__isl_take struct isl_basic_set_list *list);
7398	__isl_give isl_set *isl_set_intersect_params(
7399		__isl_take isl_set *set,
7400		__isl_take isl_set *params);
7401	__isl_give isl_set *isl_set_intersect(
7402		__isl_take isl_set *set1,
7403		__isl_take isl_set *set2);
7404	__isl_give isl_set *isl_set_intersect_factor_domain(
7405		__isl_take isl_set *set,
7406		__isl_take isl_set *domain);
7407	__isl_give isl_set *isl_set_intersect_factor_range(
7408		__isl_take isl_set *set,
7409		__isl_take isl_set *range);
7410
7411	#include <isl/map.h>
7412	__isl_give isl_basic_map *isl_basic_map_intersect_domain(
7413		__isl_take isl_basic_map *bmap,
7414		__isl_take isl_basic_set *bset);
7415	__isl_give isl_basic_map *isl_basic_map_intersect_range(
7416		__isl_take isl_basic_map *bmap,
7417		__isl_take isl_basic_set *bset);
7418	__isl_give isl_basic_map *isl_basic_map_intersect(
7419		__isl_take isl_basic_map *bmap1,
7420		__isl_take isl_basic_map *bmap2);
7421	__isl_give isl_basic_map *isl_basic_map_list_intersect(
7422		__isl_take isl_basic_map_list *list);
7423	__isl_give isl_map *isl_map_intersect_params(
7424		__isl_take isl_map *map,
7425		__isl_take isl_set *params);
7426	__isl_give isl_map *isl_map_intersect_domain(
7427		__isl_take isl_map *map,
7428		__isl_take isl_set *set);
7429	__isl_give isl_map *isl_map_intersect_range(
7430		__isl_take isl_map *map,
7431		__isl_take isl_set *set);
7432	__isl_give isl_map *isl_map_intersect(
7433		__isl_take isl_map *map1,
7434		__isl_take isl_map *map2);
7435	__isl_give isl_map *
7436	isl_map_intersect_domain_factor_domain(
7437		__isl_take isl_map *map,
7438		__isl_take isl_map *factor);
7439	__isl_give isl_map *
7440	isl_map_intersect_domain_factor_range(
7441		__isl_take isl_map *map,
7442		__isl_take isl_map *factor);
7443	__isl_give isl_map *
7444	isl_map_intersect_range_factor_domain(
7445		__isl_take isl_map *map,
7446		__isl_take isl_map *factor);
7447	__isl_give isl_map *
7448	isl_map_intersect_range_factor_range(
7449		__isl_take isl_map *map,
7450		__isl_take isl_map *factor);
7451	__isl_give isl_map *
7452	isl_map_intersect_domain_wrapped_domain(
7453		__isl_take isl_map *map,
7454		__isl_take isl_set *domain);
7455	__isl_give isl_map *
7456	isl_map_intersect_range_wrapped_domain(
7457		__isl_take isl_map *map,
7458		__isl_take isl_set *domain);
7459
7460	#include <isl/union_set.h>
7461	__isl_give isl_union_set *isl_union_set_intersect_params(
7462		__isl_take isl_union_set *uset,
7463		__isl_take isl_set *set);
7464	__isl_give isl_union_set *isl_union_set_intersect(
7465		__isl_take isl_union_set *uset1,
7466		__isl_take isl_union_set *uset2);
7467
7468	#include <isl/union_map.h>
7469	__isl_give isl_union_map *isl_union_map_intersect_params(
7470		__isl_take isl_union_map *umap,
7471		__isl_take isl_set *set);
7472	__isl_give isl_union_map *
7473	isl_union_map_intersect_domain_union_set(
7474		__isl_take isl_union_map *umap,
7475		__isl_take isl_union_set *uset);
7476	__isl_give isl_union_map *
7477	isl_union_map_intersect_domain_space(
7478		__isl_take isl_union_map *umap,
7479		__isl_take isl_space *space);
7480	__isl_give isl_union_map *isl_union_map_intersect_domain(
7481		__isl_take isl_union_map *umap,
7482		__isl_take isl_union_set *uset);
7483	__isl_give isl_union_map *
7484	isl_union_map_intersect_range_union_set(
7485		__isl_take isl_union_map *umap,
7486		__isl_take isl_union_set *uset);
7487	__isl_give isl_union_map *
7488	isl_union_map_intersect_range_space(
7489		__isl_take isl_union_map *umap,
7490		__isl_take isl_space *space);
7491	__isl_give isl_union_map *isl_union_map_intersect_range(
7492		__isl_take isl_union_map *umap,
7493		__isl_take isl_union_set *uset);
7494	__isl_give isl_union_map *isl_union_map_intersect(
7495		__isl_take isl_union_map *umap1,
7496		__isl_take isl_union_map *umap2);
7497	__isl_give isl_union_map *
7498	isl_union_map_intersect_domain_factor_domain(
7499		__isl_take isl_union_map *umap,
7500		__isl_take isl_union_map *factor);
7501	__isl_give isl_union_map *
7502	isl_union_map_intersect_domain_factor_range(
7503		__isl_take isl_union_map *umap,
7504		__isl_take isl_union_map *factor);
7505	__isl_give isl_union_map *
7506	isl_union_map_intersect_range_factor_domain(
7507		__isl_take isl_union_map *umap,
7508		__isl_take isl_union_map *factor);
7509	__isl_give isl_union_map *
7510	isl_union_map_intersect_range_factor_range(
7511		__isl_take isl_union_map *umap,
7512		__isl_take isl_union_map *factor);
7513	__isl_give isl_union_map *
7514	isl_union_map_intersect_domain_wrapped_domain_union_set(
7515		__isl_take isl_union_map *umap,
7516		__isl_take isl_union_set *domain);
7517	__isl_give isl_union_map *
7518	isl_union_map_intersect_range_wrapped_domain_union_set(
7519		__isl_take isl_union_map *umap,
7520		__isl_take isl_union_set *domain);
7521
7522	#include <isl/aff.h>
7523	__isl_give isl_pw_aff *isl_pw_aff_intersect_domain(
7524		__isl_take isl_pw_aff *pa,
7525		__isl_take isl_set *set);
7526	__isl_give isl_multi_pw_aff *
7527	isl_multi_pw_aff_intersect_domain(
7528		__isl_take isl_multi_pw_aff *mpa,
7529		__isl_take isl_set *domain);
7530	__isl_give isl_pw_multi_aff *isl_pw_multi_aff_intersect_domain(
7531		__isl_take isl_pw_multi_aff *pma,
7532		__isl_take isl_set *set);
7533	__isl_give isl_union_pw_aff *
7534	isl_union_pw_aff_intersect_domain_space(
7535		__isl_take isl_union_pw_aff *upa,
7536		__isl_take isl_space *space);
7537	__isl_give isl_union_pw_aff *
7538	isl_union_pw_aff_intersect_domain_union_set(
7539		__isl_take isl_union_pw_aff *upa,
7540		__isl_take isl_union_set *uset);
7541	__isl_give isl_union_pw_aff *isl_union_pw_aff_intersect_domain(
7542		__isl_take isl_union_pw_aff *upa,
7543		__isl_take isl_union_set *uset);
7544	__isl_give isl_union_pw_multi_aff *
7545	isl_union_pw_multi_aff_intersect_domain_space(
7546		__isl_take isl_union_pw_multi_aff *upma,
7547		__isl_take isl_space *space);
7548	__isl_give isl_union_pw_multi_aff *
7549	isl_union_pw_multi_aff_intersect_domain_union_set(
7550		__isl_take isl_union_pw_multi_aff *upma,
7551		__isl_take isl_union_set *uset);
7552	__isl_give isl_union_pw_multi_aff *
7553	isl_union_pw_multi_aff_intersect_domain(
7554		__isl_take isl_union_pw_multi_aff *upma,
7555		__isl_take isl_union_set *uset);
7556	__isl_give isl_multi_union_pw_aff *
7557	isl_multi_union_pw_aff_intersect_domain(
7558		__isl_take isl_multi_union_pw_aff *mupa,
7559		__isl_take isl_union_set *uset);
7560	__isl_give isl_pw_aff *
7561	isl_pw_aff_intersect_domain_wrapped_domain(
7562		__isl_take isl_pw_aff *pa,
7563		__isl_take isl_set *set);
7564	__isl_give isl_pw_multi_aff *
7565	isl_pw_multi_aff_intersect_domain_wrapped_domain(
7566		__isl_take isl_pw_multi_aff *pma,
7567		__isl_take isl_set *set);
7568	__isl_give isl_union_pw_aff *
7569	isl_union_pw_aff_intersect_domain_wrapped_domain(
7570		__isl_take isl_union_pw_aff *upa,
7571		__isl_take isl_union_set *uset);
7572	__isl_give isl_union_pw_multi_aff *
7573	isl_union_pw_multi_aff_intersect_domain_wrapped_domain(
7574		__isl_take isl_union_pw_multi_aff *upma,
7575		__isl_take isl_union_set *uset);
7576	__isl_give isl_pw_aff *
7577	isl_pw_aff_intersect_domain_wrapped_range(
7578		__isl_take isl_pw_aff *pa,
7579		__isl_take isl_set *set);
7580	__isl_give isl_pw_multi_aff *
7581	isl_pw_multi_aff_intersect_domain_wrapped_range(
7582		__isl_take isl_pw_multi_aff *pma,
7583		__isl_take isl_set *set);
7584	__isl_give isl_union_pw_multi_aff *
7585	isl_union_pw_multi_aff_intersect_domain_wrapped_range(
7586		__isl_take isl_union_pw_multi_aff *upma,
7587		__isl_take isl_union_set *uset);
7588	__isl_give isl_union_pw_aff *
7589	isl_union_pw_aff_intersect_domain_wrapped_range(
7590		__isl_take isl_union_pw_aff *upa,
7591		__isl_take isl_union_set *uset);
7592	__isl_give isl_pw_aff *isl_pw_aff_intersect_params(
7593		__isl_take isl_pw_aff *pa,
7594		__isl_take isl_set *set);
7595	__isl_give isl_multi_pw_aff *
7596	isl_multi_pw_aff_intersect_params(
7597		__isl_take isl_multi_pw_aff *mpa,
7598		__isl_take isl_set *set);
7599	__isl_give isl_pw_multi_aff *isl_pw_multi_aff_intersect_params(
7600		__isl_take isl_pw_multi_aff *pma,
7601		__isl_take isl_set *set);
7602	__isl_give isl_union_pw_aff *
7603	isl_union_pw_aff_intersect_params(
7604		__isl_take isl_union_pw_aff *upa,
7605		__isl_take isl_set *set);
7606	__isl_give isl_union_pw_multi_aff *
7607	isl_union_pw_multi_aff_intersect_params(
7608		__isl_take isl_union_pw_multi_aff *upma,
7609		__isl_take isl_set *set);
7610	__isl_give isl_multi_union_pw_aff *
7611	isl_multi_union_pw_aff_intersect_params(
7612		__isl_take isl_multi_union_pw_aff *mupa,
7613		__isl_take isl_set *params);
7614	__isl_give isl_multi_union_pw_aff *
7615	isl_multi_union_pw_aff_intersect_range(
7616		__isl_take isl_multi_union_pw_aff *mupa,
7617		__isl_take isl_set *set);
7618
7619	#include <isl/polynomial.h>
7620	__isl_give isl_pw_qpolynomial *
7621	isl_pw_qpolynomial_intersect_domain(
7622		__isl_take isl_pw_qpolynomial *pwpq,
7623		__isl_take isl_set *set);
7624	__isl_give isl_union_pw_qpolynomial *
7625	isl_union_pw_qpolynomial_intersect_domain_space(
7626		__isl_take isl_union_pw_qpolynomial *upwpq,
7627		__isl_take isl_space *space);
7628	__isl_give isl_union_pw_qpolynomial *
7629	isl_union_pw_qpolynomial_intersect_domain_union_set(
7630		__isl_take isl_union_pw_qpolynomial *upwpq,
7631		__isl_take isl_union_set *uset);
7632	__isl_give isl_union_pw_qpolynomial *
7633	isl_union_pw_qpolynomial_intersect_domain(
7634		__isl_take isl_union_pw_qpolynomial *upwpq,
7635		__isl_take isl_union_set *uset);
7636	__isl_give isl_union_pw_qpolynomial_fold *
7637	isl_union_pw_qpolynomial_fold_intersect_domain_space(
7638		__isl_take isl_union_pw_qpolynomial_fold *upwf,
7639		__isl_take isl_space *space);
7640	__isl_give isl_union_pw_qpolynomial_fold *
7641	isl_union_pw_qpolynomial_fold_intersect_domain_union_set(
7642		__isl_take isl_union_pw_qpolynomial_fold *upwf,
7643		__isl_take isl_union_set *uset);
7644	__isl_give isl_union_pw_qpolynomial_fold *
7645	isl_union_pw_qpolynomial_fold_intersect_domain(
7646		__isl_take isl_union_pw_qpolynomial_fold *upwf,
7647		__isl_take isl_union_set *uset);
7648	__isl_give isl_pw_qpolynomial *
7649	isl_pw_qpolynomial_intersect_domain_wrapped_domain(
7650		__isl_take isl_pw_qpolynomial *pwpq,
7651		__isl_take isl_set *set);
7652	__isl_give isl_pw_qpolynomial_fold *
7653	isl_pw_qpolynomial_fold_intersect_domain_wrapped_domain(
7654		__isl_take isl_pw_qpolynomial_fold *pwf,
7655		__isl_take isl_set *set);
7656	__isl_give isl_union_pw_qpolynomial *
7657	isl_union_pw_qpolynomial_intersect_domain_wrapped_domain(
7658		__isl_take isl_union_pw_qpolynomial *upwpq,
7659		__isl_take isl_union_set *uset);
7660	__isl_give isl_union_pw_qpolynomial_fold *
7661	isl_union_pw_qpolynomial_fold_intersect_domain_wrapped_domain(
7662		__isl_take isl_union_pw_qpolynomial_fold *upwf,
7663		__isl_take isl_union_set *uset);
7664	__isl_give isl_pw_qpolynomial *
7665	isl_pw_qpolynomial_intersect_domain_wrapped_range(
7666		__isl_take isl_pw_qpolynomial *pwpq,
7667		__isl_take isl_set *set);
7668	__isl_give isl_pw_qpolynomial_fold *
7669	isl_pw_qpolynomial_fold_intersect_domain_wrapped_range(
7670		__isl_take isl_pw_qpolynomial_fold *pwf,
7671		__isl_take isl_set *set);
7672	__isl_give isl_union_pw_qpolynomial *
7673	isl_union_pw_qpolynomial_intersect_domain_wrapped_range(
7674		__isl_take isl_union_pw_qpolynomial *upwpq,
7675		__isl_take isl_union_set *uset);
7676	__isl_give isl_union_pw_qpolynomial_fold *
7677	isl_union_pw_qpolynomial_fold_intersect_domain_wrapped_range(
7678		__isl_take isl_union_pw_qpolynomial_fold *upwf,
7679		__isl_take isl_union_set *uset);
7680	__isl_give isl_pw_qpolynomial *
7681	isl_pw_qpolynomial_intersect_params(
7682		__isl_take isl_pw_qpolynomial *pwpq,
7683		__isl_take isl_set *set);
7684	__isl_give isl_pw_qpolynomial_fold *
7685	isl_pw_qpolynomial_fold_intersect_params(
7686		__isl_take isl_pw_qpolynomial_fold *pwf,
7687		__isl_take isl_set *set);
7688	__isl_give isl_union_pw_qpolynomial *
7689	isl_union_pw_qpolynomial_intersect_params(
7690		__isl_take isl_union_pw_qpolynomial *upwpq,
7691		__isl_take isl_set *set);
7692	__isl_give isl_union_pw_qpolynomial_fold *
7693	isl_union_pw_qpolynomial_fold_intersect_params(
7694		__isl_take isl_union_pw_qpolynomial_fold *upwf,
7695		__isl_take isl_set *set);
7696
7697The second argument to the C<_params> functions needs to be
7698a parametric (basic) set.  For the other functions, a parametric set
7699for either argument is only allowed if the other argument is
7700a parametric set as well.
7701The list passed to C<isl_basic_set_list_intersect> needs to have
7702at least one element and all elements need to live in the same space.
7703The function C<isl_multi_union_pw_aff_intersect_range>
7704restricts the input function to those shared domain elements
7705that map to the specified range.
7706C<isl_union_map_intersect_domain> is an alternative name for
7707C<isl_union_map_intersect_domain_union_set>.
7708Similarly for the other pairs of functions.
7709
7710=item * Union
7711
7712	#include <isl/set.h>
7713	__isl_give isl_set *isl_basic_set_union(
7714		__isl_take isl_basic_set *bset1,
7715		__isl_take isl_basic_set *bset2);
7716	__isl_give isl_set *isl_set_union(
7717		__isl_take isl_set *set1,
7718		__isl_take isl_set *set2);
7719	__isl_give isl_set *isl_set_list_union(
7720		__isl_take isl_set_list *list);
7721
7722	#include <isl/map.h>
7723	__isl_give isl_map *isl_basic_map_union(
7724		__isl_take isl_basic_map *bmap1,
7725		__isl_take isl_basic_map *bmap2);
7726	__isl_give isl_map *isl_map_union(
7727		__isl_take isl_map *map1,
7728		__isl_take isl_map *map2);
7729
7730	#include <isl/union_set.h>
7731	__isl_give isl_union_set *isl_union_set_union(
7732		__isl_take isl_union_set *uset1,
7733		__isl_take isl_union_set *uset2);
7734	__isl_give isl_union_set *isl_union_set_list_union(
7735		__isl_take isl_union_set_list *list);
7736
7737	#include <isl/union_map.h>
7738	__isl_give isl_union_map *isl_union_map_union(
7739		__isl_take isl_union_map *umap1,
7740		__isl_take isl_union_map *umap2);
7741
7742The list passed to C<isl_set_list_union> needs to have
7743at least one element and all elements need to live in the same space.
7744
7745=item * Set difference
7746
7747	#include <isl/set.h>
7748	__isl_give isl_set *isl_set_subtract(
7749		__isl_take isl_set *set1,
7750		__isl_take isl_set *set2);
7751
7752	#include <isl/map.h>
7753	__isl_give isl_map *isl_map_subtract(
7754		__isl_take isl_map *map1,
7755		__isl_take isl_map *map2);
7756	__isl_give isl_map *isl_map_subtract_domain(
7757		__isl_take isl_map *map,
7758		__isl_take isl_set *dom);
7759	__isl_give isl_map *isl_map_subtract_range(
7760		__isl_take isl_map *map,
7761		__isl_take isl_set *dom);
7762
7763	#include <isl/union_set.h>
7764	__isl_give isl_union_set *isl_union_set_subtract(
7765		__isl_take isl_union_set *uset1,
7766		__isl_take isl_union_set *uset2);
7767
7768	#include <isl/union_map.h>
7769	__isl_give isl_union_map *isl_union_map_subtract(
7770		__isl_take isl_union_map *umap1,
7771		__isl_take isl_union_map *umap2);
7772	__isl_give isl_union_map *isl_union_map_subtract_domain(
7773		__isl_take isl_union_map *umap,
7774		__isl_take isl_union_set *dom);
7775	__isl_give isl_union_map *isl_union_map_subtract_range(
7776		__isl_take isl_union_map *umap,
7777		__isl_take isl_union_set *dom);
7778
7779	#include <isl/aff.h>
7780	__isl_give isl_pw_aff *isl_pw_aff_subtract_domain(
7781		__isl_take isl_pw_aff *pa,
7782		__isl_take isl_set *set);
7783	__isl_give isl_pw_multi_aff *
7784	isl_pw_multi_aff_subtract_domain(
7785		__isl_take isl_pw_multi_aff *pma,
7786		__isl_take isl_set *set);
7787	__isl_give isl_union_pw_aff *
7788	isl_union_pw_aff_subtract_domain_union_set(
7789		__isl_take isl_union_pw_aff *upa,
7790		__isl_take isl_union_set *uset);
7791	__isl_give isl_union_pw_aff *
7792	isl_union_pw_aff_subtract_domain_space(
7793		__isl_take isl_union_pw_aff *upa,
7794		__isl_take isl_space *space);
7795	__isl_give isl_union_pw_aff *
7796	isl_union_pw_aff_subtract_domain(
7797		__isl_take isl_union_pw_aff *upa,
7798		__isl_take isl_union_set *uset);
7799	__isl_give isl_union_pw_multi_aff *
7800	isl_union_pw_multi_aff_subtract_domain_union_set(
7801		__isl_take isl_union_pw_multi_aff *upma,
7802		__isl_take isl_set *set);
7803	__isl_give isl_union_pw_multi_aff *
7804	isl_union_pw_multi_aff_subtract_domain_space(
7805		__isl_take isl_union_pw_multi_aff *upma,
7806		__isl_take isl_space *space);
7807	__isl_give isl_union_pw_multi_aff *
7808	isl_union_pw_multi_aff_subtract_domain(
7809		__isl_take isl_union_pw_multi_aff *upma,
7810		__isl_take isl_union_set *uset);
7811
7812	#include <isl/polynomial.h>
7813	__isl_give isl_pw_qpolynomial *
7814	isl_pw_qpolynomial_subtract_domain(
7815		__isl_take isl_pw_qpolynomial *pwpq,
7816		__isl_take isl_set *set);
7817	__isl_give isl_pw_qpolynomial_fold *
7818	isl_pw_qpolynomial_fold_subtract_domain(
7819		__isl_take isl_pw_qpolynomial_fold *pwf,
7820		__isl_take isl_set *set);
7821	__isl_give isl_union_pw_qpolynomial *
7822	isl_union_pw_qpolynomial_subtract_domain_union_set(
7823		__isl_take isl_union_pw_qpolynomial *upwpq,
7824		__isl_take isl_union_set *uset);
7825	__isl_give isl_union_pw_qpolynomial *
7826	isl_union_pw_qpolynomial_subtract_domain_space(
7827		__isl_take isl_union_pw_qpolynomial *upwpq,
7828		__isl_take isl_space *space);
7829	__isl_give isl_union_pw_qpolynomial *
7830	isl_union_pw_qpolynomial_subtract_domain(
7831		__isl_take isl_union_pw_qpolynomial *upwpq,
7832		__isl_take isl_union_set *uset);
7833	__isl_give isl_union_pw_qpolynomial_fold *
7834	isl_union_pw_qpolynomial_fold_subtract_domain_union_set(
7835		__isl_take isl_union_pw_qpolynomial_fold *upwf,
7836		__isl_take isl_union_set *uset);
7837	__isl_give isl_union_pw_qpolynomial_fold *
7838	isl_union_pw_qpolynomial_fold_subtract_domain_space(
7839		__isl_take isl_union_pw_qpolynomial_fold *upwf,
7840		__isl_take isl_space *space);
7841	__isl_give isl_union_pw_qpolynomial_fold *
7842	isl_union_pw_qpolynomial_fold_subtract_domain(
7843		__isl_take isl_union_pw_qpolynomial_fold *upwf,
7844		__isl_take isl_union_set *uset);
7845
7846C<isl_union_pw_aff_subtract_domain> is an alternative name for
7847C<isl_union_pw_aff_subtract_domain_union_set>.
7848Similarly for the other pairs of functions.
7849
7850=item * Application
7851
7852	#include <isl/space.h>
7853	__isl_give isl_space *isl_space_join(
7854		__isl_take isl_space *left,
7855		__isl_take isl_space *right);
7856
7857	#include <isl/set.h>
7858	__isl_give isl_basic_set *isl_basic_set_apply(
7859		__isl_take isl_basic_set *bset,
7860		__isl_take isl_basic_map *bmap);
7861	__isl_give isl_set *isl_set_apply(
7862		__isl_take isl_set *set,
7863		__isl_take isl_map *map);
7864
7865	#include <isl/union_set.h>
7866	__isl_give isl_union_set *isl_union_set_apply(
7867		__isl_take isl_union_set *uset,
7868		__isl_take isl_union_map *umap);
7869
7870	#include <isl/map.h>
7871	__isl_give isl_basic_map *isl_basic_map_apply_domain(
7872		__isl_take isl_basic_map *bmap1,
7873		__isl_take isl_basic_map *bmap2);
7874	__isl_give isl_basic_map *isl_basic_map_apply_range(
7875		__isl_take isl_basic_map *bmap1,
7876		__isl_take isl_basic_map *bmap2);
7877	__isl_give isl_map *isl_map_apply_domain(
7878		__isl_take isl_map *map1,
7879		__isl_take isl_map *map2);
7880	__isl_give isl_map *isl_map_apply_range(
7881		__isl_take isl_map *map1,
7882		__isl_take isl_map *map2);
7883
7884	#include <isl/union_map.h>
7885	__isl_give isl_union_map *isl_union_map_apply_domain(
7886		__isl_take isl_union_map *umap1,
7887		__isl_take isl_union_map *umap2);
7888	__isl_give isl_union_map *isl_union_map_apply_range(
7889		__isl_take isl_union_map *umap1,
7890		__isl_take isl_union_map *umap2);
7891
7892	#include <isl/aff.h>
7893	__isl_give isl_union_pw_multi_aff *
7894	isl_union_pw_multi_aff_apply_union_pw_multi_aff(
7895		__isl_take isl_union_pw_multi_aff *upma1,
7896		__isl_take isl_union_pw_multi_aff *upma2);
7897	__isl_give isl_union_pw_aff *
7898	isl_multi_union_pw_aff_apply_aff(
7899		__isl_take isl_multi_union_pw_aff *mupa,
7900		__isl_take isl_aff *aff);
7901	__isl_give isl_union_pw_aff *
7902	isl_multi_union_pw_aff_apply_pw_aff(
7903		__isl_take isl_multi_union_pw_aff *mupa,
7904		__isl_take isl_pw_aff *pa);
7905	__isl_give isl_multi_union_pw_aff *
7906	isl_multi_union_pw_aff_apply_multi_aff(
7907		__isl_take isl_multi_union_pw_aff *mupa,
7908		__isl_take isl_multi_aff *ma);
7909	__isl_give isl_multi_union_pw_aff *
7910	isl_multi_union_pw_aff_apply_pw_multi_aff(
7911		__isl_take isl_multi_union_pw_aff *mupa,
7912		__isl_take isl_pw_multi_aff *pma);
7913
7914The result of C<isl_multi_union_pw_aff_apply_aff> is defined
7915over the shared domain of the elements of the input.  The dimension is
7916required to be greater than zero.
7917The C<isl_multi_union_pw_aff> argument of
7918C<isl_multi_union_pw_aff_apply_multi_aff> is allowed to be zero-dimensional,
7919but only if the range of the C<isl_multi_aff> argument
7920is also zero-dimensional.
7921Similarly for C<isl_multi_union_pw_aff_apply_pw_multi_aff>.
7922
7923	#include <isl/polynomial.h>
7924	__isl_give isl_pw_qpolynomial_fold *
7925	isl_set_apply_pw_qpolynomial_fold(
7926		__isl_take isl_set *set,
7927		__isl_take isl_pw_qpolynomial_fold *pwf,
7928		isl_bool *tight);
7929	__isl_give isl_pw_qpolynomial_fold *
7930	isl_map_apply_pw_qpolynomial_fold(
7931		__isl_take isl_map *map,
7932		__isl_take isl_pw_qpolynomial_fold *pwf,
7933		isl_bool *tight);
7934	__isl_give isl_union_pw_qpolynomial_fold *
7935	isl_union_set_apply_union_pw_qpolynomial_fold(
7936		__isl_take isl_union_set *uset,
7937		__isl_take isl_union_pw_qpolynomial_fold *upwf,
7938		isl_bool *tight);
7939	__isl_give isl_union_pw_qpolynomial_fold *
7940	isl_union_map_apply_union_pw_qpolynomial_fold(
7941		__isl_take isl_union_map *umap,
7942		__isl_take isl_union_pw_qpolynomial_fold *upwf,
7943		isl_bool *tight);
7944
7945The functions taking a map
7946compose the given map with the given piecewise quasipolynomial reduction.
7947That is, compute a bound (of the same type as C<pwf> or C<upwf> itself)
7948over all elements in the intersection of the range of the map
7949and the domain of the piecewise quasipolynomial reduction
7950as a function of an element in the domain of the map.
7951The functions taking a set compute a bound over all elements in the
7952intersection of the set and the domain of the
7953piecewise quasipolynomial reduction.
7954
7955=item * Preimage
7956
7957	#include <isl/set.h>
7958	__isl_give isl_basic_set *
7959	isl_basic_set_preimage_multi_aff(
7960		__isl_take isl_basic_set *bset,
7961		__isl_take isl_multi_aff *ma);
7962	__isl_give isl_set *isl_set_preimage_multi_aff(
7963		__isl_take isl_set *set,
7964		__isl_take isl_multi_aff *ma);
7965	__isl_give isl_set *isl_set_preimage_pw_multi_aff(
7966		__isl_take isl_set *set,
7967		__isl_take isl_pw_multi_aff *pma);
7968	__isl_give isl_set *isl_set_preimage_multi_pw_aff(
7969		__isl_take isl_set *set,
7970		__isl_take isl_multi_pw_aff *mpa);
7971
7972	#include <isl/union_set.h>
7973	__isl_give isl_union_set *
7974	isl_union_set_preimage_multi_aff(
7975		__isl_take isl_union_set *uset,
7976		__isl_take isl_multi_aff *ma);
7977	__isl_give isl_union_set *
7978	isl_union_set_preimage_pw_multi_aff(
7979		__isl_take isl_union_set *uset,
7980		__isl_take isl_pw_multi_aff *pma);
7981	__isl_give isl_union_set *
7982	isl_union_set_preimage_union_pw_multi_aff(
7983		__isl_take isl_union_set *uset,
7984		__isl_take isl_union_pw_multi_aff *upma);
7985
7986	#include <isl/map.h>
7987	__isl_give isl_basic_map *
7988	isl_basic_map_preimage_domain_multi_aff(
7989		__isl_take isl_basic_map *bmap,
7990		__isl_take isl_multi_aff *ma);
7991	__isl_give isl_map *isl_map_preimage_domain_multi_aff(
7992		__isl_take isl_map *map,
7993		__isl_take isl_multi_aff *ma);
7994	__isl_give isl_map *isl_map_preimage_range_multi_aff(
7995		__isl_take isl_map *map,
7996		__isl_take isl_multi_aff *ma);
7997	__isl_give isl_map *
7998	isl_map_preimage_domain_pw_multi_aff(
7999		__isl_take isl_map *map,
8000		__isl_take isl_pw_multi_aff *pma);
8001	__isl_give isl_map *
8002	isl_map_preimage_range_pw_multi_aff(
8003		__isl_take isl_map *map,
8004		__isl_take isl_pw_multi_aff *pma);
8005	__isl_give isl_map *
8006	isl_map_preimage_domain_multi_pw_aff(
8007		__isl_take isl_map *map,
8008		__isl_take isl_multi_pw_aff *mpa);
8009	__isl_give isl_basic_map *
8010	isl_basic_map_preimage_range_multi_aff(
8011		__isl_take isl_basic_map *bmap,
8012		__isl_take isl_multi_aff *ma);
8013
8014	#include <isl/union_map.h>
8015	__isl_give isl_union_map *
8016	isl_union_map_preimage_domain_multi_aff(
8017		__isl_take isl_union_map *umap,
8018		__isl_take isl_multi_aff *ma);
8019	__isl_give isl_union_map *
8020	isl_union_map_preimage_range_multi_aff(
8021		__isl_take isl_union_map *umap,
8022		__isl_take isl_multi_aff *ma);
8023	__isl_give isl_union_map *
8024	isl_union_map_preimage_domain_pw_multi_aff(
8025		__isl_take isl_union_map *umap,
8026		__isl_take isl_pw_multi_aff *pma);
8027	__isl_give isl_union_map *
8028	isl_union_map_preimage_range_pw_multi_aff(
8029		__isl_take isl_union_map *umap,
8030		__isl_take isl_pw_multi_aff *pma);
8031	__isl_give isl_union_map *
8032	isl_union_map_preimage_domain_union_pw_multi_aff(
8033		__isl_take isl_union_map *umap,
8034		__isl_take isl_union_pw_multi_aff *upma);
8035	__isl_give isl_union_map *
8036	isl_union_map_preimage_range_union_pw_multi_aff(
8037		__isl_take isl_union_map *umap,
8038		__isl_take isl_union_pw_multi_aff *upma);
8039
8040	#include <isl/aff.h>
8041	__isl_give isl_pw_multi_aff *
8042	isl_pw_multi_aff_preimage_domain_wrapped_domain_pw_multi_aff(
8043		__isl_take isl_pw_multi_aff *pma1,
8044		__isl_take isl_pw_multi_aff *pma2);
8045	__isl_give isl_union_pw_multi_aff *
8046	isl_union_pw_multi_aff_preimage_domain_wrapped_domain_union_pw_multi_aff(
8047		__isl_take isl_union_pw_multi_aff *upma1,
8048		__isl_take isl_union_pw_multi_aff *upma2);
8049
8050These functions compute the preimage of the given set or map domain/range under
8051the given function.  In other words, the expression is plugged
8052into the set description or into the domain/range of the map or function.
8053
8054=item * Pullback
8055
8056	#include <isl/aff.h>
8057	__isl_give isl_aff *isl_aff_pullback_aff(
8058		__isl_take isl_aff *aff1,
8059		__isl_take isl_aff *aff2);
8060	__isl_give isl_aff *isl_aff_pullback_multi_aff(
8061		__isl_take isl_aff *aff,
8062		__isl_take isl_multi_aff *ma);
8063	__isl_give isl_pw_aff *isl_pw_aff_pullback_multi_aff(
8064		__isl_take isl_pw_aff *pa,
8065		__isl_take isl_multi_aff *ma);
8066	__isl_give isl_pw_aff *isl_pw_aff_pullback_pw_multi_aff(
8067		__isl_take isl_pw_aff *pa,
8068		__isl_take isl_pw_multi_aff *pma);
8069	__isl_give isl_pw_aff *isl_pw_aff_pullback_multi_pw_aff(
8070		__isl_take isl_pw_aff *pa,
8071		__isl_take isl_multi_pw_aff *mpa);
8072	__isl_give isl_multi_aff *isl_multi_aff_pullback_multi_aff(
8073		__isl_take isl_multi_aff *ma1,
8074		__isl_take isl_multi_aff *ma2);
8075	__isl_give isl_pw_multi_aff *
8076	isl_pw_multi_aff_pullback_multi_aff(
8077		__isl_take isl_pw_multi_aff *pma,
8078		__isl_take isl_multi_aff *ma);
8079	__isl_give isl_multi_pw_aff *
8080	isl_multi_pw_aff_pullback_multi_aff(
8081		__isl_take isl_multi_pw_aff *mpa,
8082		__isl_take isl_multi_aff *ma);
8083	__isl_give isl_pw_multi_aff *
8084	isl_pw_multi_aff_pullback_pw_multi_aff(
8085		__isl_take isl_pw_multi_aff *pma1,
8086		__isl_take isl_pw_multi_aff *pma2);
8087	__isl_give isl_multi_pw_aff *
8088	isl_multi_pw_aff_pullback_pw_multi_aff(
8089		__isl_take isl_multi_pw_aff *mpa,
8090		__isl_take isl_pw_multi_aff *pma);
8091	__isl_give isl_multi_pw_aff *
8092	isl_multi_pw_aff_pullback_multi_pw_aff(
8093		__isl_take isl_multi_pw_aff *mpa1,
8094		__isl_take isl_multi_pw_aff *mpa2);
8095	__isl_give isl_union_pw_aff *
8096	isl_union_pw_aff_pullback_union_pw_multi_aff(
8097		__isl_take isl_union_pw_aff *upa,
8098		__isl_take isl_union_pw_multi_aff *upma);
8099	__isl_give isl_union_pw_multi_aff *
8100	isl_union_pw_multi_aff_pullback_union_pw_multi_aff(
8101		__isl_take isl_union_pw_multi_aff *upma1,
8102		__isl_take isl_union_pw_multi_aff *upma2);
8103	__isl_give isl_multi_union_pw_aff *
8104	isl_multi_union_pw_aff_pullback_union_pw_multi_aff(
8105		__isl_take isl_multi_union_pw_aff *mupa,
8106		__isl_take isl_union_pw_multi_aff *upma);
8107
8108These functions precompose the first expression by the second function.
8109In other words, the second function is plugged
8110into the first expression.
8111
8112=item * Locus
8113
8114	#include <isl/aff.h>
8115	__isl_give isl_basic_set *isl_aff_eq_basic_set(
8116		__isl_take isl_aff *aff1,
8117		__isl_take isl_aff *aff2);
8118	__isl_give isl_set *isl_aff_eq_set(
8119		__isl_take isl_aff *aff1,
8120		__isl_take isl_aff *aff2);
8121	__isl_give isl_set *isl_aff_ne_set(
8122		__isl_take isl_aff *aff1,
8123		__isl_take isl_aff *aff2);
8124	__isl_give isl_basic_set *isl_aff_le_basic_set(
8125		__isl_take isl_aff *aff1,
8126		__isl_take isl_aff *aff2);
8127	__isl_give isl_set *isl_aff_le_set(
8128		__isl_take isl_aff *aff1,
8129		__isl_take isl_aff *aff2);
8130	__isl_give isl_basic_set *isl_aff_lt_basic_set(
8131		__isl_take isl_aff *aff1,
8132		__isl_take isl_aff *aff2);
8133	__isl_give isl_set *isl_aff_lt_set(
8134		__isl_take isl_aff *aff1,
8135		__isl_take isl_aff *aff2);
8136	__isl_give isl_basic_set *isl_aff_ge_basic_set(
8137		__isl_take isl_aff *aff1,
8138		__isl_take isl_aff *aff2);
8139	__isl_give isl_set *isl_aff_ge_set(
8140		__isl_take isl_aff *aff1,
8141		__isl_take isl_aff *aff2);
8142	__isl_give isl_basic_set *isl_aff_gt_basic_set(
8143		__isl_take isl_aff *aff1,
8144		__isl_take isl_aff *aff2);
8145	__isl_give isl_set *isl_aff_gt_set(
8146		__isl_take isl_aff *aff1,
8147		__isl_take isl_aff *aff2);
8148	__isl_give isl_set *isl_pw_aff_eq_set(
8149		__isl_take isl_pw_aff *pwaff1,
8150		__isl_take isl_pw_aff *pwaff2);
8151	__isl_give isl_set *isl_pw_aff_ne_set(
8152		__isl_take isl_pw_aff *pwaff1,
8153		__isl_take isl_pw_aff *pwaff2);
8154	__isl_give isl_set *isl_pw_aff_le_set(
8155		__isl_take isl_pw_aff *pwaff1,
8156		__isl_take isl_pw_aff *pwaff2);
8157	__isl_give isl_set *isl_pw_aff_lt_set(
8158		__isl_take isl_pw_aff *pwaff1,
8159		__isl_take isl_pw_aff *pwaff2);
8160	__isl_give isl_set *isl_pw_aff_ge_set(
8161		__isl_take isl_pw_aff *pwaff1,
8162		__isl_take isl_pw_aff *pwaff2);
8163	__isl_give isl_set *isl_pw_aff_gt_set(
8164		__isl_take isl_pw_aff *pwaff1,
8165		__isl_take isl_pw_aff *pwaff2);
8166
8167	__isl_give isl_set *isl_multi_aff_lex_le_set(
8168		__isl_take isl_multi_aff *ma1,
8169		__isl_take isl_multi_aff *ma2);
8170	__isl_give isl_set *isl_multi_aff_lex_lt_set(
8171		__isl_take isl_multi_aff *ma1,
8172		__isl_take isl_multi_aff *ma2);
8173	__isl_give isl_set *isl_multi_aff_lex_ge_set(
8174		__isl_take isl_multi_aff *ma1,
8175		__isl_take isl_multi_aff *ma2);
8176	__isl_give isl_set *isl_multi_aff_lex_gt_set(
8177		__isl_take isl_multi_aff *ma1,
8178		__isl_take isl_multi_aff *ma2);
8179
8180	__isl_give isl_set *isl_pw_aff_list_eq_set(
8181		__isl_take isl_pw_aff_list *list1,
8182		__isl_take isl_pw_aff_list *list2);
8183	__isl_give isl_set *isl_pw_aff_list_ne_set(
8184		__isl_take isl_pw_aff_list *list1,
8185		__isl_take isl_pw_aff_list *list2);
8186	__isl_give isl_set *isl_pw_aff_list_le_set(
8187		__isl_take isl_pw_aff_list *list1,
8188		__isl_take isl_pw_aff_list *list2);
8189	__isl_give isl_set *isl_pw_aff_list_lt_set(
8190		__isl_take isl_pw_aff_list *list1,
8191		__isl_take isl_pw_aff_list *list2);
8192	__isl_give isl_set *isl_pw_aff_list_ge_set(
8193		__isl_take isl_pw_aff_list *list1,
8194		__isl_take isl_pw_aff_list *list2);
8195	__isl_give isl_set *isl_pw_aff_list_gt_set(
8196		__isl_take isl_pw_aff_list *list1,
8197		__isl_take isl_pw_aff_list *list2);
8198
8199The function C<isl_aff_ge_basic_set> returns a basic set
8200containing those elements in the shared space
8201of C<aff1> and C<aff2> where C<aff1> is greater than or equal to C<aff2>.
8202The function C<isl_pw_aff_ge_set> returns a set
8203containing those elements in the shared domain
8204of C<pwaff1> and C<pwaff2> where C<pwaff1> is
8205greater than or equal to C<pwaff2>.
8206The function C<isl_multi_aff_lex_le_set> returns a set
8207containing those elements in the shared domain space
8208where C<ma1> is lexicographically smaller than or
8209equal to C<ma2>.
8210The functions operating on C<isl_pw_aff_list> apply the corresponding
8211C<isl_pw_aff> function to each pair of elements in the two lists.
8212
8213	#include <isl/aff.h>
8214	__isl_give isl_map *isl_pw_aff_eq_map(
8215		__isl_take isl_pw_aff *pa1,
8216		__isl_take isl_pw_aff *pa2);
8217	__isl_give isl_map *isl_pw_aff_le_map(
8218		__isl_take isl_pw_aff *pa1,
8219		__isl_take isl_pw_aff *pa2);
8220	__isl_give isl_map *isl_pw_aff_lt_map(
8221		__isl_take isl_pw_aff *pa1,
8222		__isl_take isl_pw_aff *pa2);
8223	__isl_give isl_map *isl_pw_aff_ge_map(
8224		__isl_take isl_pw_aff *pa1,
8225		__isl_take isl_pw_aff *pa2);
8226	__isl_give isl_map *isl_pw_aff_gt_map(
8227		__isl_take isl_pw_aff *pa1,
8228		__isl_take isl_pw_aff *pa2);
8229
8230	__isl_give isl_map *isl_multi_pw_aff_eq_map(
8231		__isl_take isl_multi_pw_aff *mpa1,
8232		__isl_take isl_multi_pw_aff *mpa2);
8233	__isl_give isl_map *isl_multi_pw_aff_lex_le_map(
8234		__isl_take isl_multi_pw_aff *mpa1,
8235		__isl_take isl_multi_pw_aff *mpa2);
8236	__isl_give isl_map *isl_multi_pw_aff_lex_lt_map(
8237		__isl_take isl_multi_pw_aff *mpa1,
8238		__isl_take isl_multi_pw_aff *mpa2);
8239	__isl_give isl_map *isl_multi_pw_aff_lex_ge_map(
8240		__isl_take isl_multi_pw_aff *mpa1,
8241		__isl_take isl_multi_pw_aff *mpa2);
8242	__isl_give isl_map *isl_multi_pw_aff_lex_gt_map(
8243		__isl_take isl_multi_pw_aff *mpa1,
8244		__isl_take isl_multi_pw_aff *mpa2);
8245
8246These functions return a map between domain elements of the arguments
8247where the function values satisfy the given relation.
8248
8249	#include <isl/map.h>
8250	__isl_give isl_map *isl_map_eq_at_multi_pw_aff(
8251		__isl_take isl_map *map,
8252		__isl_take isl_multi_pw_aff *mpa);
8253	__isl_give isl_map *isl_map_lex_lt_at_multi_pw_aff(
8254		__isl_take isl_map *map,
8255		__isl_take isl_multi_pw_aff *mpa);
8256	__isl_give isl_map *isl_map_lex_le_at_multi_pw_aff(
8257		__isl_take isl_map *map,
8258		__isl_take isl_multi_pw_aff *mpa);
8259	__isl_give isl_map *isl_map_lex_gt_at_multi_pw_aff(
8260		__isl_take isl_map *map,
8261		__isl_take isl_multi_pw_aff *mpa);
8262	__isl_give isl_map *isl_map_lex_ge_at_multi_pw_aff(
8263		__isl_take isl_map *map,
8264		__isl_take isl_multi_pw_aff *mpa);
8265
8266	#include <isl/union_map.h>
8267	__isl_give isl_union_map *
8268	isl_union_map_eq_at_multi_union_pw_aff(
8269		__isl_take isl_union_map *umap,
8270		__isl_take isl_multi_union_pw_aff *mupa);
8271	__isl_give isl_union_map *
8272	isl_union_map_lex_lt_at_multi_union_pw_aff(
8273		__isl_take isl_union_map *umap,
8274		__isl_take isl_multi_union_pw_aff *mupa);
8275	__isl_give isl_union_map *
8276	isl_union_map_lex_le_at_multi_union_pw_aff(
8277		__isl_take isl_union_map *umap,
8278		__isl_take isl_multi_union_pw_aff *mupa);
8279	__isl_give isl_union_map *
8280	isl_union_map_lex_gt_at_multi_union_pw_aff(
8281		__isl_take isl_union_map *umap,
8282		__isl_take isl_multi_union_pw_aff *mupa);
8283	__isl_give isl_union_map *
8284	isl_union_map_lex_ge_at_multi_union_pw_aff(
8285		__isl_take isl_union_map *umap,
8286		__isl_take isl_multi_union_pw_aff *mupa);
8287
8288These functions select the subset of elements in the union map
8289that have an equal or lexicographically smaller or greater function value.
8290
8291=item * Cartesian Product
8292
8293	#include <isl/space.h>
8294	__isl_give isl_space *isl_space_product(
8295		__isl_take isl_space *space1,
8296		__isl_take isl_space *space2);
8297	__isl_give isl_space *isl_space_domain_product(
8298		__isl_take isl_space *space1,
8299		__isl_take isl_space *space2);
8300	__isl_give isl_space *isl_space_range_product(
8301		__isl_take isl_space *space1,
8302		__isl_take isl_space *space2);
8303
8304The functions
8305C<isl_space_product>, C<isl_space_domain_product>
8306and C<isl_space_range_product> take pairs or relation spaces and
8307produce a single relations space, where either the domain, the range
8308or both domain and range are wrapped spaces of relations between
8309the domains and/or ranges of the input spaces.
8310If the product is only constructed over the domain or the range
8311then the ranges or the domains of the inputs should be the same.
8312The function C<isl_space_product> also accepts a pair of set spaces,
8313in which case it returns a wrapped space of a relation between the
8314two input spaces.
8315
8316	#include <isl/set.h>
8317	__isl_give isl_set *isl_set_product(
8318		__isl_take isl_set *set1,
8319		__isl_take isl_set *set2);
8320
8321	#include <isl/map.h>
8322	__isl_give isl_basic_map *isl_basic_map_domain_product(
8323		__isl_take isl_basic_map *bmap1,
8324		__isl_take isl_basic_map *bmap2);
8325	__isl_give isl_basic_map *isl_basic_map_range_product(
8326		__isl_take isl_basic_map *bmap1,
8327		__isl_take isl_basic_map *bmap2);
8328	__isl_give isl_basic_map *isl_basic_map_product(
8329		__isl_take isl_basic_map *bmap1,
8330		__isl_take isl_basic_map *bmap2);
8331	__isl_give isl_map *isl_map_domain_product(
8332		__isl_take isl_map *map1,
8333		__isl_take isl_map *map2);
8334	__isl_give isl_map *isl_map_range_product(
8335		__isl_take isl_map *map1,
8336		__isl_take isl_map *map2);
8337	__isl_give isl_map *isl_map_product(
8338		__isl_take isl_map *map1,
8339		__isl_take isl_map *map2);
8340
8341	#include <isl/union_set.h>
8342	__isl_give isl_union_set *isl_union_set_product(
8343		__isl_take isl_union_set *uset1,
8344		__isl_take isl_union_set *uset2);
8345
8346	#include <isl/union_map.h>
8347	__isl_give isl_union_map *isl_union_map_domain_product(
8348		__isl_take isl_union_map *umap1,
8349		__isl_take isl_union_map *umap2);
8350	__isl_give isl_union_map *isl_union_map_range_product(
8351		__isl_take isl_union_map *umap1,
8352		__isl_take isl_union_map *umap2);
8353	__isl_give isl_union_map *isl_union_map_product(
8354		__isl_take isl_union_map *umap1,
8355		__isl_take isl_union_map *umap2);
8356
8357	#include <isl/id.h>
8358	__isl_give isl_multi_id *isl_multi_id_range_product(
8359		__isl_take isl_multi_id *mi1,
8360		__isl_take isl_multi_id *mi2);
8361
8362	#include <isl/val.h>
8363	__isl_give isl_multi_val *isl_multi_val_range_product(
8364		__isl_take isl_multi_val *mv1,
8365		__isl_take isl_multi_val *mv2);
8366	__isl_give isl_multi_val *isl_multi_val_product(
8367		__isl_take isl_multi_val *mv1,
8368		__isl_take isl_multi_val *mv2);
8369
8370	#include <isl/aff.h>
8371	__isl_give isl_multi_aff *isl_multi_aff_range_product(
8372		__isl_take isl_multi_aff *ma1,
8373		__isl_take isl_multi_aff *ma2);
8374	__isl_give isl_multi_aff *isl_multi_aff_product(
8375		__isl_take isl_multi_aff *ma1,
8376		__isl_take isl_multi_aff *ma2);
8377	__isl_give isl_multi_pw_aff *
8378	isl_multi_pw_aff_range_product(
8379		__isl_take isl_multi_pw_aff *mpa1,
8380		__isl_take isl_multi_pw_aff *mpa2);
8381	__isl_give isl_multi_pw_aff *isl_multi_pw_aff_product(
8382		__isl_take isl_multi_pw_aff *mpa1,
8383		__isl_take isl_multi_pw_aff *mpa2);
8384	__isl_give isl_pw_multi_aff *
8385	isl_pw_multi_aff_range_product(
8386		__isl_take isl_pw_multi_aff *pma1,
8387		__isl_take isl_pw_multi_aff *pma2);
8388	__isl_give isl_pw_multi_aff *isl_pw_multi_aff_product(
8389		__isl_take isl_pw_multi_aff *pma1,
8390		__isl_take isl_pw_multi_aff *pma2);
8391	__isl_give isl_union_pw_multi_aff *
8392	isl_union_pw_multi_aff_range_product(
8393		__isl_take isl_union_pw_multi_aff *upma1,
8394		__isl_take isl_union_pw_multi_aff *upma2);
8395	__isl_give isl_multi_union_pw_aff *
8396	isl_multi_union_pw_aff_range_product(
8397		__isl_take isl_multi_union_pw_aff *mupa1,
8398		__isl_take isl_multi_union_pw_aff *mupa2);
8399
8400The above functions compute the cross product of the given
8401sets, relations or functions.  The domains and ranges of the results
8402are wrapped maps between domains and ranges of the inputs.
8403To obtain a ``flat'' product, use the following functions
8404instead.
8405
8406	#include <isl/set.h>
8407	__isl_give isl_basic_set *isl_basic_set_flat_product(
8408		__isl_take isl_basic_set *bset1,
8409		__isl_take isl_basic_set *bset2);
8410	__isl_give isl_set *isl_set_flat_product(
8411		__isl_take isl_set *set1,
8412		__isl_take isl_set *set2);
8413
8414	#include <isl/map.h>
8415	__isl_give isl_basic_map *isl_basic_map_flat_range_product(
8416		__isl_take isl_basic_map *bmap1,
8417		__isl_take isl_basic_map *bmap2);
8418	__isl_give isl_map *isl_map_flat_domain_product(
8419		__isl_take isl_map *map1,
8420		__isl_take isl_map *map2);
8421	__isl_give isl_map *isl_map_flat_range_product(
8422		__isl_take isl_map *map1,
8423		__isl_take isl_map *map2);
8424	__isl_give isl_basic_map *isl_basic_map_flat_product(
8425		__isl_take isl_basic_map *bmap1,
8426		__isl_take isl_basic_map *bmap2);
8427	__isl_give isl_map *isl_map_flat_product(
8428		__isl_take isl_map *map1,
8429		__isl_take isl_map *map2);
8430
8431	#include <isl/union_map.h>
8432	__isl_give isl_union_map *
8433	isl_union_map_flat_domain_product(
8434		__isl_take isl_union_map *umap1,
8435		__isl_take isl_union_map *umap2);
8436	__isl_give isl_union_map *
8437	isl_union_map_flat_range_product(
8438		__isl_take isl_union_map *umap1,
8439		__isl_take isl_union_map *umap2);
8440
8441	#include <isl/id.h>
8442	__isl_give isl_multi_id *
8443	isl_multi_id_flat_range_product(
8444		__isl_take isl_multi_id *mi1,
8445		__isl_take isl_multi_id *mi2);
8446
8447	#include <isl/val.h>
8448	__isl_give isl_multi_val *isl_multi_val_flat_range_product(
8449		__isl_take isl_multi_val *mv1,
8450		__isl_take isl_multi_val *mv2);
8451
8452	#include <isl/aff.h>
8453	__isl_give isl_multi_aff *isl_multi_aff_flat_range_product(
8454		__isl_take isl_multi_aff *ma1,
8455		__isl_take isl_multi_aff *ma2);
8456	__isl_give isl_pw_multi_aff *
8457	isl_pw_multi_aff_flat_range_product(
8458		__isl_take isl_pw_multi_aff *pma1,
8459		__isl_take isl_pw_multi_aff *pma2);
8460	__isl_give isl_multi_pw_aff *
8461	isl_multi_pw_aff_flat_range_product(
8462		__isl_take isl_multi_pw_aff *mpa1,
8463		__isl_take isl_multi_pw_aff *mpa2);
8464	__isl_give isl_union_pw_multi_aff *
8465	isl_union_pw_multi_aff_flat_range_product(
8466		__isl_take isl_union_pw_multi_aff *upma1,
8467		__isl_take isl_union_pw_multi_aff *upma2);
8468	__isl_give isl_multi_union_pw_aff *
8469	isl_multi_union_pw_aff_flat_range_product(
8470		__isl_take isl_multi_union_pw_aff *mupa1,
8471		__isl_take isl_multi_union_pw_aff *mupa2);
8472
8473	#include <isl/space.h>
8474	__isl_give isl_space *isl_space_factor_domain(
8475		__isl_take isl_space *space);
8476	__isl_give isl_space *isl_space_factor_range(
8477		__isl_take isl_space *space);
8478	__isl_give isl_space *isl_space_domain_factor_domain(
8479		__isl_take isl_space *space);
8480	__isl_give isl_space *isl_space_domain_factor_range(
8481		__isl_take isl_space *space);
8482	__isl_give isl_space *isl_space_range_factor_domain(
8483		__isl_take isl_space *space);
8484	__isl_give isl_space *isl_space_range_factor_range(
8485		__isl_take isl_space *space);
8486
8487The functions C<isl_space_range_factor_domain> and
8488C<isl_space_range_factor_range> extract the two arguments from
8489the result of a call to C<isl_space_range_product>.
8490
8491The arguments of a call to a product can be extracted
8492from the result using the following functions.
8493
8494	#include <isl/map.h>
8495	__isl_give isl_map *isl_map_factor_domain(
8496		__isl_take isl_map *map);
8497	__isl_give isl_map *isl_map_factor_range(
8498		__isl_take isl_map *map);
8499	__isl_give isl_map *isl_map_domain_factor_domain(
8500		__isl_take isl_map *map);
8501	__isl_give isl_map *isl_map_domain_factor_range(
8502		__isl_take isl_map *map);
8503	__isl_give isl_map *isl_map_range_factor_domain(
8504		__isl_take isl_map *map);
8505	__isl_give isl_map *isl_map_range_factor_range(
8506		__isl_take isl_map *map);
8507
8508	#include <isl/union_map.h>
8509	__isl_give isl_union_map *isl_union_map_factor_domain(
8510		__isl_take isl_union_map *umap);
8511	__isl_give isl_union_map *isl_union_map_factor_range(
8512		__isl_take isl_union_map *umap);
8513	__isl_give isl_union_map *
8514	isl_union_map_domain_factor_domain(
8515		__isl_take isl_union_map *umap);
8516	__isl_give isl_union_map *
8517	isl_union_map_domain_factor_range(
8518		__isl_take isl_union_map *umap);
8519	__isl_give isl_union_map *
8520	isl_union_map_range_factor_domain(
8521		__isl_take isl_union_map *umap);
8522	__isl_give isl_union_map *
8523	isl_union_map_range_factor_range(
8524		__isl_take isl_union_map *umap);
8525
8526	#include <isl/id.h>
8527	__isl_give isl_multi_id *isl_multi_id_factor_range(
8528		__isl_take isl_multi_id *mi);
8529	__isl_give isl_multi_id *
8530	isl_multi_id_range_factor_domain(
8531		__isl_take isl_multi_id *mi);
8532	__isl_give isl_multi_id *
8533	isl_multi_id_range_factor_range(
8534		__isl_take isl_multi_id *mi);
8535
8536	#include <isl/val.h>
8537	__isl_give isl_multi_val *isl_multi_val_factor_range(
8538		__isl_take isl_multi_val *mv);
8539	__isl_give isl_multi_val *
8540	isl_multi_val_range_factor_domain(
8541		__isl_take isl_multi_val *mv);
8542	__isl_give isl_multi_val *
8543	isl_multi_val_range_factor_range(
8544		__isl_take isl_multi_val *mv);
8545
8546	#include <isl/aff.h>
8547	__isl_give isl_multi_aff *isl_multi_aff_factor_range(
8548		__isl_take isl_multi_aff *ma);
8549	__isl_give isl_multi_aff *
8550	isl_multi_aff_range_factor_domain(
8551		__isl_take isl_multi_aff *ma);
8552	__isl_give isl_multi_aff *
8553	isl_multi_aff_range_factor_range(
8554		__isl_take isl_multi_aff *ma);
8555	__isl_give isl_multi_pw_aff *
8556	isl_multi_pw_aff_factor_range(
8557		__isl_take isl_multi_pw_aff *mpa);
8558	__isl_give isl_multi_pw_aff *
8559	isl_multi_pw_aff_range_factor_domain(
8560		__isl_take isl_multi_pw_aff *mpa);
8561	__isl_give isl_multi_pw_aff *
8562	isl_multi_pw_aff_range_factor_range(
8563		__isl_take isl_multi_pw_aff *mpa);
8564	__isl_give isl_pw_multi_aff *
8565	isl_pw_multi_aff_range_factor_domain(
8566		__isl_take isl_pw_multi_aff *pma);
8567	__isl_give isl_pw_multi_aff *
8568	isl_pw_multi_aff_range_factor_range(
8569		__isl_take isl_pw_multi_aff *pma);
8570	__isl_give isl_union_pw_multi_aff *
8571	isl_union_pw_multi_aff_range_factor_domain(
8572		__isl_take isl_union_pw_multi_aff *upma);
8573	__isl_give isl_union_pw_multi_aff *
8574	isl_union_pw_multi_aff_range_factor_range(
8575		__isl_take isl_union_pw_multi_aff *upma);
8576	__isl_give isl_multi_union_pw_aff *
8577	isl_multi_union_pw_aff_factor_range(
8578		__isl_take isl_multi_union_pw_aff *mupa);
8579	__isl_give isl_multi_union_pw_aff *
8580	isl_multi_union_pw_aff_range_factor_domain(
8581		__isl_take isl_multi_union_pw_aff *mupa);
8582	__isl_give isl_multi_union_pw_aff *
8583	isl_multi_union_pw_aff_range_factor_range(
8584		__isl_take isl_multi_union_pw_aff *mupa);
8585
8586The splice functions are a generalization of the flat product functions,
8587where the second argument may be inserted at any position inside
8588the first argument rather than being placed at the end.
8589The functions C<isl_multi_val_factor_range>,
8590C<isl_multi_aff_factor_range>,
8591C<isl_multi_pw_aff_factor_range> and
8592C<isl_multi_union_pw_aff_factor_range>
8593take functions that live in a set space.
8594
8595	#include <isl/id.h>
8596	__isl_give isl_multi_id *isl_multi_id_range_splice(
8597		__isl_take isl_multi_id *mi1, unsigned pos,
8598		__isl_take isl_multi_id *mi2);
8599
8600	#include <isl/val.h>
8601	__isl_give isl_multi_val *isl_multi_val_range_splice(
8602		__isl_take isl_multi_val *mv1, unsigned pos,
8603		__isl_take isl_multi_val *mv2);
8604
8605	#include <isl/aff.h>
8606	__isl_give isl_multi_aff *isl_multi_aff_range_splice(
8607		__isl_take isl_multi_aff *ma1, unsigned pos,
8608		__isl_take isl_multi_aff *ma2);
8609	__isl_give isl_multi_aff *isl_multi_aff_splice(
8610		__isl_take isl_multi_aff *ma1,
8611		unsigned in_pos, unsigned out_pos,
8612		__isl_take isl_multi_aff *ma2);
8613	__isl_give isl_multi_pw_aff *
8614	isl_multi_pw_aff_range_splice(
8615		__isl_take isl_multi_pw_aff *mpa1, unsigned pos,
8616		__isl_take isl_multi_pw_aff *mpa2);
8617	__isl_give isl_multi_pw_aff *isl_multi_pw_aff_splice(
8618		__isl_take isl_multi_pw_aff *mpa1,
8619		unsigned in_pos, unsigned out_pos,
8620		__isl_take isl_multi_pw_aff *mpa2);
8621	__isl_give isl_multi_union_pw_aff *
8622	isl_multi_union_pw_aff_range_splice(
8623		__isl_take isl_multi_union_pw_aff *mupa1,
8624		unsigned pos,
8625		__isl_take isl_multi_union_pw_aff *mupa2);
8626
8627=item * Simplification
8628
8629When applied to a set or relation,
8630the gist operation returns a set or relation that has the
8631same intersection with the context as the input set or relation.
8632Any implicit equality in the intersection is made explicit in the result,
8633while all inequalities that are redundant with respect to the intersection
8634are removed.
8635In case of union sets and relations, the gist operation is performed
8636per space.
8637
8638When applied to a function,
8639the gist operation applies the set gist operation to each of
8640the cells in the domain of the input piecewise expression.
8641The context is also exploited
8642to simplify the expression associated to each cell.
8643
8644	#include <isl/set.h>
8645	__isl_give isl_basic_set *isl_basic_set_gist(
8646		__isl_take isl_basic_set *bset,
8647		__isl_take isl_basic_set *context);
8648	__isl_give isl_set *isl_set_gist(__isl_take isl_set *set,
8649		__isl_take isl_set *context);
8650	__isl_give isl_set *isl_set_gist_params(
8651		__isl_take isl_set *set,
8652		__isl_take isl_set *context);
8653
8654	#include <isl/map.h>
8655	__isl_give isl_basic_map *isl_basic_map_gist(
8656		__isl_take isl_basic_map *bmap,
8657		__isl_take isl_basic_map *context);
8658	__isl_give isl_basic_map *isl_basic_map_gist_domain(
8659		__isl_take isl_basic_map *bmap,
8660		__isl_take isl_basic_set *context);
8661	__isl_give isl_map *isl_map_gist(__isl_take isl_map *map,
8662		__isl_take isl_map *context);
8663	__isl_give isl_map *isl_map_gist_params(
8664		__isl_take isl_map *map,
8665		__isl_take isl_set *context);
8666	__isl_give isl_map *isl_map_gist_domain(
8667		__isl_take isl_map *map,
8668		__isl_take isl_set *context);
8669	__isl_give isl_map *isl_map_gist_range(
8670		__isl_take isl_map *map,
8671		__isl_take isl_set *context);
8672
8673	#include <isl/union_set.h>
8674	__isl_give isl_union_set *isl_union_set_gist(
8675		__isl_take isl_union_set *uset,
8676		__isl_take isl_union_set *context);
8677	__isl_give isl_union_set *isl_union_set_gist_params(
8678		__isl_take isl_union_set *uset,
8679		__isl_take isl_set *set);
8680
8681	#include <isl/union_map.h>
8682	__isl_give isl_union_map *isl_union_map_gist(
8683		__isl_take isl_union_map *umap,
8684		__isl_take isl_union_map *context);
8685	__isl_give isl_union_map *isl_union_map_gist_params(
8686		__isl_take isl_union_map *umap,
8687		__isl_take isl_set *set);
8688	__isl_give isl_union_map *isl_union_map_gist_domain(
8689		__isl_take isl_union_map *umap,
8690		__isl_take isl_union_set *uset);
8691	__isl_give isl_union_map *isl_union_map_gist_range(
8692		__isl_take isl_union_map *umap,
8693		__isl_take isl_union_set *uset);
8694
8695	#include <isl/aff.h>
8696	__isl_give isl_aff *isl_aff_gist_params(
8697		__isl_take isl_aff *aff,
8698		__isl_take isl_set *context);
8699	__isl_give isl_aff *isl_aff_gist(__isl_take isl_aff *aff,
8700		__isl_take isl_set *context);
8701	__isl_give isl_multi_aff *isl_multi_aff_gist_params(
8702		__isl_take isl_multi_aff *maff,
8703		__isl_take isl_set *context);
8704	__isl_give isl_multi_aff *isl_multi_aff_gist(
8705		__isl_take isl_multi_aff *maff,
8706		__isl_take isl_set *context);
8707	__isl_give isl_pw_aff *isl_pw_aff_gist_params(
8708		__isl_take isl_pw_aff *pwaff,
8709		__isl_take isl_set *context);
8710	__isl_give isl_pw_aff *isl_pw_aff_gist(
8711		__isl_take isl_pw_aff *pwaff,
8712		__isl_take isl_set *context);
8713	__isl_give isl_pw_multi_aff *isl_pw_multi_aff_gist_params(
8714		__isl_take isl_pw_multi_aff *pma,
8715		__isl_take isl_set *set);
8716	__isl_give isl_pw_multi_aff *isl_pw_multi_aff_gist(
8717		__isl_take isl_pw_multi_aff *pma,
8718		__isl_take isl_set *set);
8719	__isl_give isl_multi_pw_aff *isl_multi_pw_aff_gist_params(
8720		__isl_take isl_multi_pw_aff *mpa,
8721		__isl_take isl_set *set);
8722	__isl_give isl_multi_pw_aff *isl_multi_pw_aff_gist(
8723		__isl_take isl_multi_pw_aff *mpa,
8724		__isl_take isl_set *set);
8725	__isl_give isl_union_pw_aff *isl_union_pw_aff_gist(
8726		__isl_take isl_union_pw_aff *upa,
8727		__isl_take isl_union_set *context);
8728	__isl_give isl_union_pw_aff *isl_union_pw_aff_gist_params(
8729		__isl_take isl_union_pw_aff *upa,
8730		__isl_take isl_set *context);
8731	__isl_give isl_union_pw_multi_aff *
8732	isl_union_pw_multi_aff_gist_params(
8733		__isl_take isl_union_pw_multi_aff *upma,
8734		__isl_take isl_set *context);
8735	__isl_give isl_union_pw_multi_aff *
8736	isl_union_pw_multi_aff_gist(
8737		__isl_take isl_union_pw_multi_aff *upma,
8738		__isl_take isl_union_set *context);
8739	__isl_give isl_multi_union_pw_aff *
8740	isl_multi_union_pw_aff_gist_params(
8741		__isl_take isl_multi_union_pw_aff *mupa,
8742		__isl_take isl_set *context);
8743	__isl_give isl_multi_union_pw_aff *
8744	isl_multi_union_pw_aff_gist(
8745		__isl_take isl_multi_union_pw_aff *mupa,
8746		__isl_take isl_union_set *context);
8747
8748	#include <isl/polynomial.h>
8749	__isl_give isl_qpolynomial *isl_qpolynomial_gist_params(
8750		__isl_take isl_qpolynomial *qp,
8751		__isl_take isl_set *context);
8752	__isl_give isl_qpolynomial *isl_qpolynomial_gist(
8753		__isl_take isl_qpolynomial *qp,
8754		__isl_take isl_set *context);
8755	__isl_give isl_qpolynomial_fold *
8756	isl_qpolynomial_fold_gist_params(
8757		__isl_take isl_qpolynomial_fold *fold,
8758		__isl_take isl_set *context);
8759	__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_gist(
8760		__isl_take isl_qpolynomial_fold *fold,
8761		__isl_take isl_set *context);
8762	__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_gist_params(
8763		__isl_take isl_pw_qpolynomial *pwqp,
8764		__isl_take isl_set *context);
8765	__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_gist(
8766		__isl_take isl_pw_qpolynomial *pwqp,
8767		__isl_take isl_set *context);
8768	__isl_give isl_pw_qpolynomial_fold *
8769	isl_pw_qpolynomial_fold_gist(
8770		__isl_take isl_pw_qpolynomial_fold *pwf,
8771		__isl_take isl_set *context);
8772	__isl_give isl_pw_qpolynomial_fold *
8773	isl_pw_qpolynomial_fold_gist_params(
8774		__isl_take isl_pw_qpolynomial_fold *pwf,
8775		__isl_take isl_set *context);
8776	__isl_give isl_union_pw_qpolynomial *
8777	isl_union_pw_qpolynomial_gist_params(
8778		__isl_take isl_union_pw_qpolynomial *upwqp,
8779		__isl_take isl_set *context);
8780	__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_gist(
8781		__isl_take isl_union_pw_qpolynomial *upwqp,
8782		__isl_take isl_union_set *context);
8783	__isl_give isl_union_pw_qpolynomial_fold *
8784	isl_union_pw_qpolynomial_fold_gist(
8785		__isl_take isl_union_pw_qpolynomial_fold *upwf,
8786		__isl_take isl_union_set *context);
8787	__isl_give isl_union_pw_qpolynomial_fold *
8788	isl_union_pw_qpolynomial_fold_gist_params(
8789		__isl_take isl_union_pw_qpolynomial_fold *upwf,
8790		__isl_take isl_set *context);
8791
8792=item * Binary Arithmetic Operations
8793
8794	#include <isl/set.h>
8795	__isl_give isl_set *isl_set_sum(
8796		__isl_take isl_set *set1,
8797		__isl_take isl_set *set2);
8798	#include <isl/map.h>
8799	__isl_give isl_map *isl_map_sum(
8800		__isl_take isl_map *map1,
8801		__isl_take isl_map *map2);
8802
8803C<isl_set_sum> computes the Minkowski sum of its two arguments,
8804i.e., the set containing the sums of pairs of elements from
8805C<set1> and C<set2>.
8806The domain of the result of C<isl_map_sum> is the intersection
8807of the domains of its two arguments.  The corresponding range
8808elements are the sums of the corresponding range elements
8809in the two arguments.
8810
8811	#include <isl/val.h>
8812	__isl_give isl_multi_val *isl_multi_val_add(
8813		__isl_take isl_multi_val *mv1,
8814		__isl_take isl_multi_val *mv2);
8815	__isl_give isl_multi_val *isl_multi_val_sub(
8816		__isl_take isl_multi_val *mv1,
8817		__isl_take isl_multi_val *mv2);
8818	__isl_give isl_multi_val *isl_multi_val_min(
8819		__isl_take isl_multi_val *mv1,
8820		__isl_take isl_multi_val *mv2);
8821	__isl_give isl_multi_val *isl_multi_val_max(
8822		__isl_take isl_multi_val *mv1,
8823		__isl_take isl_multi_val *mv2);
8824
8825	#include <isl/aff.h>
8826	__isl_give isl_aff *isl_aff_add(
8827		__isl_take isl_aff *aff1,
8828		__isl_take isl_aff *aff2);
8829	__isl_give isl_multi_aff *isl_multi_aff_add(
8830		__isl_take isl_multi_aff *maff1,
8831		__isl_take isl_multi_aff *maff2);
8832	__isl_give isl_pw_aff *isl_pw_aff_add(
8833		__isl_take isl_pw_aff *pwaff1,
8834		__isl_take isl_pw_aff *pwaff2);
8835	__isl_give isl_multi_pw_aff *isl_multi_pw_aff_add(
8836		__isl_take isl_multi_pw_aff *mpa1,
8837		__isl_take isl_multi_pw_aff *mpa2);
8838	__isl_give isl_pw_multi_aff *isl_pw_multi_aff_add(
8839		__isl_take isl_pw_multi_aff *pma1,
8840		__isl_take isl_pw_multi_aff *pma2);
8841	__isl_give isl_union_pw_aff *isl_union_pw_aff_add(
8842		__isl_take isl_union_pw_aff *upa1,
8843		__isl_take isl_union_pw_aff *upa2);
8844	__isl_give isl_union_pw_multi_aff *isl_union_pw_multi_aff_add(
8845		__isl_take isl_union_pw_multi_aff *upma1,
8846		__isl_take isl_union_pw_multi_aff *upma2);
8847	__isl_give isl_multi_union_pw_aff *
8848	isl_multi_union_pw_aff_add(
8849		__isl_take isl_multi_union_pw_aff *mupa1,
8850		__isl_take isl_multi_union_pw_aff *mupa2);
8851	__isl_give isl_pw_aff *isl_pw_aff_add_constant_val(
8852		__isl_take isl_pw_aff *pa,
8853		__isl_take isl_val *v);
8854	__isl_give isl_multi_aff *
8855	isl_multi_aff_add_constant_val(
8856		__isl_take isl_multi_aff *pa,
8857		__isl_take isl_val *v);
8858	__isl_give isl_pw_multi_aff *
8859	isl_pw_multi_aff_add_constant_val(
8860		__isl_take isl_pw_multi_aff *pma,
8861		__isl_take isl_val *v);
8862	__isl_give isl_pw_multi_aff *
8863	isl_pw_multi_aff_add_constant_multi_val(
8864		__isl_take isl_pw_multi_aff *pma,
8865		__isl_take isl_multi_val *mv);
8866	__isl_give isl_multi_pw_aff *
8867	isl_multi_pw_aff_add_constant_val(
8868		__isl_take isl_multi_pw_aff *mpa,
8869		__isl_take isl_val *v);
8870	__isl_give isl_multi_aff *
8871	isl_multi_aff_add_constant_multi_val(
8872		__isl_take isl_multi_aff *pa,
8873		__isl_take isl_multi_val *mv);
8874	__isl_give isl_multi_pw_aff *
8875	isl_multi_pw_aff_add_constant_multi_val(
8876		__isl_take isl_multi_pw_aff *mpa,
8877		__isl_take isl_multi_val *mv);
8878	__isl_give isl_pw_aff *isl_pw_aff_min(
8879		__isl_take isl_pw_aff *pwaff1,
8880		__isl_take isl_pw_aff *pwaff2);
8881	__isl_give isl_pw_aff *isl_pw_aff_max(
8882		__isl_take isl_pw_aff *pwaff1,
8883		__isl_take isl_pw_aff *pwaff2);
8884	__isl_give isl_multi_pw_aff *isl_multi_pw_aff_min(
8885		__isl_take isl_multi_pw_aff *mpa1,
8886		__isl_take isl_multi_pw_aff *mpa2);
8887	__isl_give isl_multi_pw_aff *isl_multi_pw_aff_max(
8888		__isl_take isl_multi_pw_aff *mpa1,
8889		__isl_take isl_multi_pw_aff *mpa2);
8890	__isl_give isl_aff *isl_aff_sub(
8891		__isl_take isl_aff *aff1,
8892		__isl_take isl_aff *aff2);
8893	__isl_give isl_multi_aff *isl_multi_aff_sub(
8894		__isl_take isl_multi_aff *ma1,
8895		__isl_take isl_multi_aff *ma2);
8896	__isl_give isl_pw_aff *isl_pw_aff_sub(
8897		__isl_take isl_pw_aff *pwaff1,
8898		__isl_take isl_pw_aff *pwaff2);
8899	__isl_give isl_multi_pw_aff *isl_multi_pw_aff_sub(
8900		__isl_take isl_multi_pw_aff *mpa1,
8901		__isl_take isl_multi_pw_aff *mpa2);
8902	__isl_give isl_pw_multi_aff *isl_pw_multi_aff_sub(
8903		__isl_take isl_pw_multi_aff *pma1,
8904		__isl_take isl_pw_multi_aff *pma2);
8905	__isl_give isl_union_pw_aff *isl_union_pw_aff_sub(
8906		__isl_take isl_union_pw_aff *upa1,
8907		__isl_take isl_union_pw_aff *upa2);
8908	__isl_give isl_union_pw_multi_aff *isl_union_pw_multi_aff_sub(
8909		__isl_take isl_union_pw_multi_aff *upma1,
8910		__isl_take isl_union_pw_multi_aff *upma2);
8911	__isl_give isl_multi_union_pw_aff *
8912	isl_multi_union_pw_aff_sub(
8913		__isl_take isl_multi_union_pw_aff *mupa1,
8914		__isl_take isl_multi_union_pw_aff *mupa2);
8915
8916C<isl_aff_sub> subtracts the second argument from the first.
8917
8918	#include <isl/polynomial.h>
8919	__isl_give isl_qpolynomial *isl_qpolynomial_add(
8920		__isl_take isl_qpolynomial *qp1,
8921		__isl_take isl_qpolynomial *qp2);
8922	__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_add(
8923		__isl_take isl_pw_qpolynomial *pwqp1,
8924		__isl_take isl_pw_qpolynomial *pwqp2);
8925	__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_add_disjoint(
8926		__isl_take isl_pw_qpolynomial *pwqp1,
8927		__isl_take isl_pw_qpolynomial *pwqp2);
8928	__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_add(
8929		__isl_take isl_pw_qpolynomial_fold *pwf1,
8930		__isl_take isl_pw_qpolynomial_fold *pwf2);
8931	__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_add(
8932		__isl_take isl_union_pw_qpolynomial *upwqp1,
8933		__isl_take isl_union_pw_qpolynomial *upwqp2);
8934	__isl_give isl_qpolynomial *isl_qpolynomial_sub(
8935		__isl_take isl_qpolynomial *qp1,
8936		__isl_take isl_qpolynomial *qp2);
8937	__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_sub(
8938		__isl_take isl_pw_qpolynomial *pwqp1,
8939		__isl_take isl_pw_qpolynomial *pwqp2);
8940	__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_sub(
8941		__isl_take isl_union_pw_qpolynomial *upwqp1,
8942		__isl_take isl_union_pw_qpolynomial *upwqp2);
8943	__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_fold(
8944		__isl_take isl_pw_qpolynomial_fold *pwf1,
8945		__isl_take isl_pw_qpolynomial_fold *pwf2);
8946	__isl_give isl_union_pw_qpolynomial_fold *
8947	isl_union_pw_qpolynomial_fold_fold(
8948		__isl_take isl_union_pw_qpolynomial_fold *upwf1,
8949		__isl_take isl_union_pw_qpolynomial_fold *upwf2);
8950
8951	#include <isl/aff.h>
8952	__isl_give isl_pw_aff *isl_pw_aff_union_add(
8953		__isl_take isl_pw_aff *pwaff1,
8954		__isl_take isl_pw_aff *pwaff2);
8955	__isl_give isl_multi_pw_aff *isl_multi_pw_aff_union_add(
8956		__isl_take isl_multi_pw_aff *mpa1,
8957		__isl_take isl_multi_pw_aff *mpa2);
8958	__isl_give isl_pw_multi_aff *isl_pw_multi_aff_union_add(
8959		__isl_take isl_pw_multi_aff *pma1,
8960		__isl_take isl_pw_multi_aff *pma2);
8961	__isl_give isl_union_pw_aff *isl_union_pw_aff_union_add(
8962		__isl_take isl_union_pw_aff *upa1,
8963		__isl_take isl_union_pw_aff *upa2);
8964	__isl_give isl_union_pw_multi_aff *
8965	isl_union_pw_multi_aff_union_add(
8966		__isl_take isl_union_pw_multi_aff *upma1,
8967		__isl_take isl_union_pw_multi_aff *upma2);
8968	__isl_give isl_multi_union_pw_aff *
8969	isl_multi_union_pw_aff_union_add(
8970		__isl_take isl_multi_union_pw_aff *mupa1,
8971		__isl_take isl_multi_union_pw_aff *mupa2);
8972	__isl_give isl_pw_aff *isl_pw_aff_union_min(
8973		__isl_take isl_pw_aff *pwaff1,
8974		__isl_take isl_pw_aff *pwaff2);
8975	__isl_give isl_pw_aff *isl_pw_aff_union_max(
8976		__isl_take isl_pw_aff *pwaff1,
8977		__isl_take isl_pw_aff *pwaff2);
8978
8979The function C<isl_pw_aff_union_max> computes a piecewise quasi-affine
8980expression with a domain that is the union of those of C<pwaff1> and
8981C<pwaff2> and such that on each cell, the quasi-affine expression is
8982the maximum of those of C<pwaff1> and C<pwaff2>.  If only one of
8983C<pwaff1> or C<pwaff2> is defined on a given cell, then the
8984associated expression is the defined one.
8985This in contrast to the C<isl_pw_aff_max> function, which is
8986only defined on the shared definition domain of the arguments.
8987
8988	#include <isl/val.h>
8989	__isl_give isl_multi_val *isl_multi_val_add_val(
8990		__isl_take isl_multi_val *mv,
8991		__isl_take isl_val *v);
8992	__isl_give isl_multi_val *isl_multi_val_mod_val(
8993		__isl_take isl_multi_val *mv,
8994		__isl_take isl_val *v);
8995	__isl_give isl_multi_val *isl_multi_val_scale_val(
8996		__isl_take isl_multi_val *mv,
8997		__isl_take isl_val *v);
8998	__isl_give isl_multi_val *isl_multi_val_scale_down_val(
8999		__isl_take isl_multi_val *mv,
9000		__isl_take isl_val *v);
9001
9002	#include <isl/aff.h>
9003	__isl_give isl_aff *isl_aff_mod_val(__isl_take isl_aff *aff,
9004		__isl_take isl_val *mod);
9005	__isl_give isl_pw_aff *isl_pw_aff_mod_val(
9006		__isl_take isl_pw_aff *pa,
9007		__isl_take isl_val *mod);
9008	__isl_give isl_union_pw_aff *isl_union_pw_aff_mod_val(
9009		__isl_take isl_union_pw_aff *upa,
9010		__isl_take isl_val *f);
9011	__isl_give isl_aff *isl_aff_scale_val(__isl_take isl_aff *aff,
9012		__isl_take isl_val *v);
9013	__isl_give isl_multi_aff *isl_multi_aff_scale_val(
9014		__isl_take isl_multi_aff *ma,
9015		__isl_take isl_val *v);
9016	__isl_give isl_pw_aff *isl_pw_aff_scale_val(
9017		__isl_take isl_pw_aff *pa, __isl_take isl_val *v);
9018	__isl_give isl_multi_pw_aff *isl_multi_pw_aff_scale_val(
9019		__isl_take isl_multi_pw_aff *mpa,
9020		__isl_take isl_val *v);
9021	__isl_give isl_pw_multi_aff *isl_pw_multi_aff_scale_val(
9022		__isl_take isl_pw_multi_aff *pma,
9023		__isl_take isl_val *v);
9024	__isl_give isl_union_pw_aff *isl_union_pw_aff_scale_val(
9025		__isl_take isl_union_pw_aff *upa,
9026		__isl_take isl_val *f);
9027	__isl_give isl_union_pw_multi_aff *
9028	isl_union_pw_multi_aff_scale_val(
9029		__isl_take isl_union_pw_multi_aff *upma,
9030		__isl_take isl_val *val);
9031	__isl_give isl_multi_union_pw_aff *
9032	isl_multi_union_pw_aff_scale_val(
9033		__isl_take isl_multi_union_pw_aff *mupa,
9034		__isl_take isl_val *v);
9035	__isl_give isl_aff *isl_aff_scale_down_ui(
9036		__isl_take isl_aff *aff, unsigned f);
9037	__isl_give isl_aff *isl_aff_scale_down_val(
9038		__isl_take isl_aff *aff, __isl_take isl_val *v);
9039	__isl_give isl_multi_aff *isl_multi_aff_scale_down_val(
9040		__isl_take isl_multi_aff *ma,
9041		__isl_take isl_val *v);
9042	__isl_give isl_pw_aff *isl_pw_aff_scale_down_val(
9043		__isl_take isl_pw_aff *pa,
9044		__isl_take isl_val *f);
9045	__isl_give isl_multi_pw_aff *isl_multi_pw_aff_scale_down_val(
9046		__isl_take isl_multi_pw_aff *mpa,
9047		__isl_take isl_val *v);
9048	__isl_give isl_pw_multi_aff *isl_pw_multi_aff_scale_down_val(
9049		__isl_take isl_pw_multi_aff *pma,
9050		__isl_take isl_val *v);
9051	__isl_give isl_union_pw_aff *isl_union_pw_aff_scale_down_val(
9052		__isl_take isl_union_pw_aff *upa,
9053		__isl_take isl_val *v);
9054	__isl_give isl_union_pw_multi_aff *
9055	isl_union_pw_multi_aff_scale_down_val(
9056		__isl_take isl_union_pw_multi_aff *upma,
9057		__isl_take isl_val *val);
9058	__isl_give isl_multi_union_pw_aff *
9059	isl_multi_union_pw_aff_scale_down_val(
9060		__isl_take isl_multi_union_pw_aff *mupa,
9061		__isl_take isl_val *v);
9062
9063	#include <isl/polynomial.h>
9064	__isl_give isl_qpolynomial *isl_qpolynomial_scale_val(
9065		__isl_take isl_qpolynomial *qp,
9066		__isl_take isl_val *v);
9067	__isl_give isl_qpolynomial_fold *
9068	isl_qpolynomial_fold_scale_val(
9069		__isl_take isl_qpolynomial_fold *fold,
9070		__isl_take isl_val *v);
9071	__isl_give isl_pw_qpolynomial *
9072	isl_pw_qpolynomial_scale_val(
9073		__isl_take isl_pw_qpolynomial *pwqp,
9074		__isl_take isl_val *v);
9075	__isl_give isl_pw_qpolynomial_fold *
9076	isl_pw_qpolynomial_fold_scale_val(
9077		__isl_take isl_pw_qpolynomial_fold *pwf,
9078		__isl_take isl_val *v);
9079	__isl_give isl_union_pw_qpolynomial *
9080	isl_union_pw_qpolynomial_scale_val(
9081		__isl_take isl_union_pw_qpolynomial *upwqp,
9082		__isl_take isl_val *v);
9083	__isl_give isl_union_pw_qpolynomial_fold *
9084	isl_union_pw_qpolynomial_fold_scale_val(
9085		__isl_take isl_union_pw_qpolynomial_fold *upwf,
9086		__isl_take isl_val *v);
9087	__isl_give isl_qpolynomial *
9088	isl_qpolynomial_scale_down_val(
9089		__isl_take isl_qpolynomial *qp,
9090		__isl_take isl_val *v);
9091	__isl_give isl_qpolynomial_fold *
9092	isl_qpolynomial_fold_scale_down_val(
9093		__isl_take isl_qpolynomial_fold *fold,
9094		__isl_take isl_val *v);
9095	__isl_give isl_pw_qpolynomial *
9096	isl_pw_qpolynomial_scale_down_val(
9097		__isl_take isl_pw_qpolynomial *pwqp,
9098		__isl_take isl_val *v);
9099	__isl_give isl_pw_qpolynomial_fold *
9100	isl_pw_qpolynomial_fold_scale_down_val(
9101		__isl_take isl_pw_qpolynomial_fold *pwf,
9102		__isl_take isl_val *v);
9103	__isl_give isl_union_pw_qpolynomial *
9104	isl_union_pw_qpolynomial_scale_down_val(
9105		__isl_take isl_union_pw_qpolynomial *upwqp,
9106		__isl_take isl_val *v);
9107	__isl_give isl_union_pw_qpolynomial_fold *
9108	isl_union_pw_qpolynomial_fold_scale_down_val(
9109		__isl_take isl_union_pw_qpolynomial_fold *upwf,
9110		__isl_take isl_val *v);
9111
9112	#include <isl/val.h>
9113	__isl_give isl_multi_val *isl_multi_val_mod_multi_val(
9114		__isl_take isl_multi_val *mv1,
9115		__isl_take isl_multi_val *mv2);
9116	__isl_give isl_multi_val *isl_multi_val_scale_multi_val(
9117		__isl_take isl_multi_val *mv1,
9118		__isl_take isl_multi_val *mv2);
9119	__isl_give isl_multi_val *
9120	isl_multi_val_scale_down_multi_val(
9121		__isl_take isl_multi_val *mv1,
9122		__isl_take isl_multi_val *mv2);
9123
9124	#include <isl/aff.h>
9125	__isl_give isl_multi_aff *isl_multi_aff_mod_multi_val(
9126		__isl_take isl_multi_aff *ma,
9127		__isl_take isl_multi_val *mv);
9128	__isl_give isl_multi_union_pw_aff *
9129	isl_multi_union_pw_aff_mod_multi_val(
9130		__isl_take isl_multi_union_pw_aff *upma,
9131		__isl_take isl_multi_val *mv);
9132	__isl_give isl_multi_pw_aff *
9133	isl_multi_pw_aff_mod_multi_val(
9134		__isl_take isl_multi_pw_aff *mpa,
9135		__isl_take isl_multi_val *mv);
9136	__isl_give isl_multi_aff *isl_multi_aff_scale_multi_val(
9137		__isl_take isl_multi_aff *ma,
9138		__isl_take isl_multi_val *mv);
9139	__isl_give isl_pw_multi_aff *
9140	isl_pw_multi_aff_scale_multi_val(
9141		__isl_take isl_pw_multi_aff *pma,
9142		__isl_take isl_multi_val *mv);
9143	__isl_give isl_multi_pw_aff *
9144	isl_multi_pw_aff_scale_multi_val(
9145		__isl_take isl_multi_pw_aff *mpa,
9146		__isl_take isl_multi_val *mv);
9147	__isl_give isl_multi_union_pw_aff *
9148	isl_multi_union_pw_aff_scale_multi_val(
9149		__isl_take isl_multi_union_pw_aff *mupa,
9150		__isl_take isl_multi_val *mv);
9151	__isl_give isl_union_pw_multi_aff *
9152	isl_union_pw_multi_aff_scale_multi_val(
9153		__isl_take isl_union_pw_multi_aff *upma,
9154		__isl_take isl_multi_val *mv);
9155	__isl_give isl_multi_aff *
9156	isl_multi_aff_scale_down_multi_val(
9157		__isl_take isl_multi_aff *ma,
9158		__isl_take isl_multi_val *mv);
9159	__isl_give isl_pw_multi_aff *
9160	isl_pw_multi_aff_scale_down_multi_val(
9161		__isl_take isl_pw_multi_aff *pma,
9162		__isl_take isl_multi_val *mv);
9163	__isl_give isl_multi_pw_aff *
9164	isl_multi_pw_aff_scale_down_multi_val(
9165		__isl_take isl_multi_pw_aff *mpa,
9166		__isl_take isl_multi_val *mv);
9167	__isl_give isl_multi_union_pw_aff *
9168	isl_multi_union_pw_aff_scale_down_multi_val(
9169		__isl_take isl_multi_union_pw_aff *mupa,
9170		__isl_take isl_multi_val *mv);
9171
9172C<isl_multi_aff_scale_multi_val> scales the elements of C<ma>
9173by the corresponding elements of C<mv>.
9174
9175	#include <isl/aff.h>
9176	__isl_give isl_aff *isl_aff_mul(
9177		__isl_take isl_aff *aff1,
9178		__isl_take isl_aff *aff2);
9179	__isl_give isl_aff *isl_aff_div(
9180		__isl_take isl_aff *aff1,
9181		__isl_take isl_aff *aff2);
9182	__isl_give isl_pw_aff *isl_pw_aff_mul(
9183		__isl_take isl_pw_aff *pwaff1,
9184		__isl_take isl_pw_aff *pwaff2);
9185	__isl_give isl_pw_aff *isl_pw_aff_div(
9186		__isl_take isl_pw_aff *pa1,
9187		__isl_take isl_pw_aff *pa2);
9188	__isl_give isl_pw_aff *isl_pw_aff_tdiv_q(
9189		__isl_take isl_pw_aff *pa1,
9190		__isl_take isl_pw_aff *pa2);
9191	__isl_give isl_pw_aff *isl_pw_aff_tdiv_r(
9192		__isl_take isl_pw_aff *pa1,
9193		__isl_take isl_pw_aff *pa2);
9194
9195When multiplying two affine expressions, at least one of the two needs
9196to be a constant.  Similarly, when dividing an affine expression by another,
9197the second expression needs to be a constant.
9198C<isl_pw_aff_tdiv_q> computes the quotient of an integer division with
9199rounding towards zero.  C<isl_pw_aff_tdiv_r> computes the corresponding
9200remainder.
9201
9202	#include <isl/polynomial.h>
9203	__isl_give isl_qpolynomial *isl_qpolynomial_mul(
9204		__isl_take isl_qpolynomial *qp1,
9205		__isl_take isl_qpolynomial *qp2);
9206	__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_mul(
9207		__isl_take isl_pw_qpolynomial *pwqp1,
9208		__isl_take isl_pw_qpolynomial *pwqp2);
9209	__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_mul(
9210		__isl_take isl_union_pw_qpolynomial *upwqp1,
9211		__isl_take isl_union_pw_qpolynomial *upwqp2);
9212
9213=back
9214
9215=head3 Lexicographic Optimization
9216
9217Given a (basic) set C<set> (or C<bset>) and a zero-dimensional domain C<dom>,
9218the following functions
9219compute a set that contains the lexicographic minimum or maximum
9220of the elements in C<set> (or C<bset>) for those values of the parameters
9221that satisfy C<dom>.
9222If C<empty> is not C<NULL>, then C<*empty> is assigned a set
9223that contains the parameter values in C<dom> for which C<set> (or C<bset>)
9224has no elements.
9225In other words, the union of the parameter values
9226for which the result is non-empty and of C<*empty>
9227is equal to C<dom>.
9228
9229	#include <isl/set.h>
9230	__isl_give isl_set *isl_basic_set_partial_lexmin(
9231		__isl_take isl_basic_set *bset,
9232		__isl_take isl_basic_set *dom,
9233		__isl_give isl_set **empty);
9234	__isl_give isl_set *isl_basic_set_partial_lexmax(
9235		__isl_take isl_basic_set *bset,
9236		__isl_take isl_basic_set *dom,
9237		__isl_give isl_set **empty);
9238	__isl_give isl_set *isl_set_partial_lexmin(
9239		__isl_take isl_set *set, __isl_take isl_set *dom,
9240		__isl_give isl_set **empty);
9241	__isl_give isl_set *isl_set_partial_lexmax(
9242		__isl_take isl_set *set, __isl_take isl_set *dom,
9243		__isl_give isl_set **empty);
9244
9245Given a (basic) set C<set> (or C<bset>), the following functions simply
9246return a set containing the lexicographic minimum or maximum
9247of the elements in C<set> (or C<bset>).
9248In case of union sets, the optimum is computed per space.
9249
9250	#include <isl/set.h>
9251	__isl_give isl_set *isl_basic_set_lexmin(
9252		__isl_take isl_basic_set *bset);
9253	__isl_give isl_set *isl_basic_set_lexmax(
9254		__isl_take isl_basic_set *bset);
9255	__isl_give isl_set *isl_set_lexmin(
9256		__isl_take isl_set *set);
9257	__isl_give isl_set *isl_set_lexmax(
9258		__isl_take isl_set *set);
9259	__isl_give isl_union_set *isl_union_set_lexmin(
9260		__isl_take isl_union_set *uset);
9261	__isl_give isl_union_set *isl_union_set_lexmax(
9262		__isl_take isl_union_set *uset);
9263
9264Given a (basic) relation C<map> (or C<bmap>) and a domain C<dom>,
9265the following functions
9266compute a relation that maps each element of C<dom>
9267to the single lexicographic minimum or maximum
9268of the elements that are associated to that same
9269element in C<map> (or C<bmap>).
9270If C<empty> is not C<NULL>, then C<*empty> is assigned a set
9271that contains the elements in C<dom> that do not map
9272to any elements in C<map> (or C<bmap>).
9273In other words, the union of the domain of the result and of C<*empty>
9274is equal to C<dom>.
9275
9276	#include <isl/map.h>
9277	__isl_give isl_map *isl_basic_map_partial_lexmax(
9278		__isl_take isl_basic_map *bmap,
9279		__isl_take isl_basic_set *dom,
9280		__isl_give isl_set **empty);
9281	__isl_give isl_map *isl_basic_map_partial_lexmin(
9282		__isl_take isl_basic_map *bmap,
9283		__isl_take isl_basic_set *dom,
9284		__isl_give isl_set **empty);
9285	__isl_give isl_map *isl_map_partial_lexmax(
9286		__isl_take isl_map *map, __isl_take isl_set *dom,
9287		__isl_give isl_set **empty);
9288	__isl_give isl_map *isl_map_partial_lexmin(
9289		__isl_take isl_map *map, __isl_take isl_set *dom,
9290		__isl_give isl_set **empty);
9291
9292Given a (basic) map C<map> (or C<bmap>), the following functions simply
9293return a map mapping each element in the domain of
9294C<map> (or C<bmap>) to the lexicographic minimum or maximum
9295of all elements associated to that element.
9296In case of union relations, the optimum is computed per space.
9297
9298	#include <isl/map.h>
9299	__isl_give isl_map *isl_basic_map_lexmin(
9300		__isl_take isl_basic_map *bmap);
9301	__isl_give isl_map *isl_basic_map_lexmax(
9302		__isl_take isl_basic_map *bmap);
9303	__isl_give isl_map *isl_map_lexmin(
9304		__isl_take isl_map *map);
9305	__isl_give isl_map *isl_map_lexmax(
9306		__isl_take isl_map *map);
9307	__isl_give isl_union_map *isl_union_map_lexmin(
9308		__isl_take isl_union_map *umap);
9309	__isl_give isl_union_map *isl_union_map_lexmax(
9310		__isl_take isl_union_map *umap);
9311
9312The following functions return their result in the form of
9313a piecewise multi-affine expression,
9314but are otherwise equivalent to the corresponding functions
9315returning a basic set or relation.
9316
9317	#include <isl/set.h>
9318	__isl_give isl_pw_multi_aff *
9319	isl_basic_set_partial_lexmin_pw_multi_aff(
9320		__isl_take isl_basic_set *bset,
9321		__isl_take isl_basic_set *dom,
9322		__isl_give isl_set **empty);
9323	__isl_give isl_pw_multi_aff *
9324	isl_basic_set_partial_lexmax_pw_multi_aff(
9325		__isl_take isl_basic_set *bset,
9326		__isl_take isl_basic_set *dom,
9327		__isl_give isl_set **empty);
9328	__isl_give isl_pw_multi_aff *isl_set_lexmin_pw_multi_aff(
9329		__isl_take isl_set *set);
9330	__isl_give isl_pw_multi_aff *isl_set_lexmax_pw_multi_aff(
9331		__isl_take isl_set *set);
9332
9333	#include <isl/map.h>
9334	__isl_give isl_pw_multi_aff *
9335	isl_basic_map_lexmin_pw_multi_aff(
9336		__isl_take isl_basic_map *bmap);
9337	__isl_give isl_pw_multi_aff *
9338	isl_basic_map_partial_lexmin_pw_multi_aff(
9339		__isl_take isl_basic_map *bmap,
9340		__isl_take isl_basic_set *dom,
9341		__isl_give isl_set **empty);
9342	__isl_give isl_pw_multi_aff *
9343	isl_basic_map_partial_lexmax_pw_multi_aff(
9344		__isl_take isl_basic_map *bmap,
9345		__isl_take isl_basic_set *dom,
9346		__isl_give isl_set **empty);
9347	__isl_give isl_pw_multi_aff *isl_map_lexmin_pw_multi_aff(
9348		__isl_take isl_map *map);
9349	__isl_give isl_pw_multi_aff *isl_map_lexmax_pw_multi_aff(
9350		__isl_take isl_map *map);
9351
9352The following functions return the lexicographic minimum or maximum
9353on the shared domain of the inputs and the single defined function
9354on those parts of the domain where only a single function is defined.
9355
9356	#include <isl/aff.h>
9357	__isl_give isl_pw_multi_aff *isl_pw_multi_aff_union_lexmin(
9358		__isl_take isl_pw_multi_aff *pma1,
9359		__isl_take isl_pw_multi_aff *pma2);
9360	__isl_give isl_pw_multi_aff *isl_pw_multi_aff_union_lexmax(
9361		__isl_take isl_pw_multi_aff *pma1,
9362		__isl_take isl_pw_multi_aff *pma2);
9363
9364If the input to a lexicographic optimization problem has
9365multiple constraints with the same coefficients for the optimized
9366variables, then, by default, this symmetry is exploited by
9367replacing those constraints by a single constraint with
9368an abstract bound, which is in turn bounded by the corresponding terms
9369in the original constraints.
9370Without this optimization, the solver would typically consider
9371all possible orderings of those original bounds, resulting in a needless
9372decomposition of the domain.
9373However, the optimization can also result in slowdowns since
9374an extra parameter is introduced that may get used in additional
9375integer divisions.
9376The following option determines whether symmetry detection is applied
9377during lexicographic optimization.
9378
9379	#include <isl/options.h>
9380	isl_stat isl_options_set_pip_symmetry(isl_ctx *ctx,
9381		int val);
9382	int isl_options_get_pip_symmetry(isl_ctx *ctx);
9383
9384=begin latex
9385
9386See also \autoref{s:offline}.
9387
9388=end latex
9389
9390=head2 Ternary Operations
9391
9392	#include <isl/aff.h>
9393	__isl_give isl_pw_aff *isl_pw_aff_cond(
9394		__isl_take isl_pw_aff *cond,
9395		__isl_take isl_pw_aff *pwaff_true,
9396		__isl_take isl_pw_aff *pwaff_false);
9397
9398The function C<isl_pw_aff_cond> performs a conditional operator
9399and returns an expression that is equal to C<pwaff_true>
9400for elements where C<cond> is non-zero and equal to C<pwaff_false> for elements
9401where C<cond> is zero.
9402
9403=head2 Lists
9404
9405Lists are defined over several element types, including
9406C<isl_val>, C<isl_id>, C<isl_aff>, C<isl_pw_aff>, C<isl_pw_multi_aff>,
9407C<isl_union_pw_aff>,
9408C<isl_union_pw_multi_aff>,
9409C<isl_qpolynomial>, C<isl_pw_qpolynomial>, C<isl_pw_qpolynomial_fold>,
9410C<isl_constraint>,
9411C<isl_basic_set>, C<isl_set>, C<isl_basic_map>, C<isl_map>, C<isl_union_set>,
9412C<isl_union_map>, C<isl_ast_expr> and C<isl_ast_node>.
9413Here we take lists of C<isl_set>s as an example.
9414Lists can be created, copied, modified and freed using the following functions.
9415
9416	#include <isl/set.h>
9417	__isl_give isl_set_list *isl_set_to_list(
9418		__isl_take isl_set *el);
9419	__isl_give isl_set_list *isl_set_list_from_set(
9420		__isl_take isl_set *el);
9421	__isl_give isl_set_list *isl_set_list_alloc(
9422		isl_ctx *ctx, int n);
9423	__isl_give isl_set_list *isl_set_list_copy(
9424		__isl_keep isl_set_list *list);
9425	__isl_give isl_set_list *isl_set_list_insert(
9426		__isl_take isl_set_list *list, unsigned pos,
9427		__isl_take isl_set *el);
9428	__isl_give isl_set_list *isl_set_list_add(
9429		__isl_take isl_set_list *list,
9430		__isl_take isl_set *el);
9431	__isl_give isl_set_list *isl_set_list_drop(
9432		__isl_take isl_set_list *list,
9433		unsigned first, unsigned n);
9434	__isl_give isl_set_list *isl_set_list_clear(
9435		__isl_take isl_set_list *list);
9436	__isl_give isl_set_list *isl_set_list_swap(
9437		__isl_take isl_set_list *list,
9438		unsigned pos1, unsigned pos2);
9439	__isl_give isl_set_list *isl_set_list_reverse(
9440		__isl_take isl_set_list *list);
9441	__isl_give isl_set_list *isl_set_list_set_at(
9442		__isl_take isl_set_list *list, int index,
9443		__isl_take isl_set *set);
9444	__isl_give isl_set_list *isl_set_list_set_set(
9445		__isl_take isl_set_list *list, int index,
9446		__isl_take isl_set *set);
9447	__isl_give isl_set_list *isl_set_list_concat(
9448		__isl_take isl_set_list *list1,
9449		__isl_take isl_set_list *list2);
9450	__isl_give isl_set_list *isl_set_list_map(
9451		__isl_take isl_set_list *list,
9452		__isl_give isl_set *(*fn)(__isl_take isl_set *el,
9453			void *user),
9454		void *user);
9455	__isl_give isl_set_list *isl_set_list_sort(
9456		__isl_take isl_set_list *list,
9457		int (*cmp)(__isl_keep isl_set *a,
9458			__isl_keep isl_set *b, void *user),
9459		void *user);
9460	__isl_null isl_set_list *isl_set_list_free(
9461		__isl_take isl_set_list *list);
9462
9463C<isl_set_list_alloc> creates an empty list with an initial capacity
9464for C<n> elements.  C<isl_set_list_insert> and C<isl_set_list_add>
9465add elements to a list, increasing its capacity as needed.
9466C<isl_set_to_list> creates a list with a single element.
9467C<isl_set_list_from_set> performs the same operation.
9468C<isl_set_list_clear> removes all elements from a list.
9469C<isl_set_list_swap> swaps the elements at the specified locations.
9470C<isl_set_list_reverse> reverses the elements in the list.
9471C<isl_set_list_set_set> is an alternative name for C<isl_set_list_set_at>.
9472
9473Lists can be inspected using the following functions.
9474
9475	#include <isl/set.h>
9476	isl_size isl_set_list_size(__isl_keep isl_set_list *list);
9477	isl_size isl_set_list_n_set(__isl_keep isl_set_list *list);
9478	__isl_give isl_set *isl_set_list_get_at(
9479		__isl_keep isl_set_list *list, int index);
9480	__isl_give isl_set *isl_set_list_get_set(
9481		__isl_keep isl_set_list *list, int index);
9482	isl_stat isl_set_list_foreach(__isl_keep isl_set_list *list,
9483		isl_stat (*fn)(__isl_take isl_set *el, void *user),
9484		void *user);
9485	isl_bool isl_set_list_every(__isl_keep isl_set_list *list,
9486		isl_bool (*test)(__isl_take isl_set *el,
9487			void *user),
9488		void *user);
9489	isl_stat isl_set_list_foreach_scc(
9490		__isl_keep isl_set_list *list,
9491		isl_bool (*follows)(__isl_keep isl_set *a,
9492			__isl_keep isl_set *b, void *user),
9493		void *follows_user,
9494		isl_stat (*fn)(__isl_take isl_set_list *scc,
9495			void *user),
9496		void *fn_user);
9497
9498C<isl_set_list_n_set> is an alternative name for C<isl_set_list_size>.
9499Similarly,
9500C<isl_set_list_get_set> is an alternative name for C<isl_set_list_get_at>.
9501The function C<isl_set_list_foreach_scc> calls C<fn> on each of the
9502strongly connected components of the graph with as vertices the elements
9503of C<list> and a directed edge from vertex C<b> to vertex C<a>
9504iff C<follows(a, b)> returns C<isl_bool_true>.  The callbacks C<follows> and
9505C<fn> should return C<isl_bool_error> or C<isl_stat_error> on error.
9506
9507Lists can be printed using
9508
9509	#include <isl/set.h>
9510	__isl_give isl_printer *isl_printer_print_set_list(
9511		__isl_take isl_printer *p,
9512		__isl_keep isl_set_list *list);
9513
9514Alternatively, a string representation can be obtained
9515directly using the following function, which always prints
9516in isl format.
9517
9518	#include <isl/set.h>
9519	__isl_give char *isl_set_list_to_str(
9520		__isl_keep isl_set_list *list);
9521
9522An C<isl_val_list>, C<isl_id_list>,
9523C<isl_aff_list>, C<isl_pw_aff_list>, C<isl_pw_multi_aff_list>,
9524C<isl_union_pw_aff_list>,
9525C<isl_set_list>, C<isl_map_list> or C<isl_union_set_list> object
9526can also be read from input using the following functions.
9527
9528	#include <isl/val.h>
9529	__isl_give isl_val_list *isl_val_list_read_from_str(
9530		isl_ctx *ctx, const char *str);
9531
9532	#include <isl/id.h>
9533	__isl_give isl_id_list *isl_id_list_read_from_str(
9534		isl_ctx *ctx, const char *str);
9535
9536	#include <isl/aff.h>
9537	__isl_give isl_aff_list *
9538	isl_aff_list_read_from_str(isl_ctx *ctx,
9539		const char *str);
9540	__isl_give isl_pw_aff_list *
9541	isl_pw_aff_list_read_from_str(isl_ctx *ctx,
9542		const char *str);
9543	__isl_give isl_pw_multi_aff_list *
9544	isl_pw_multi_aff_list_read_from_str(isl_ctx *ctx,
9545		const char *str);
9546	__isl_give isl_union_pw_aff_list *
9547	isl_union_pw_aff_list_read_from_str(isl_ctx *ctx,
9548		const char *str);
9549
9550	#include <isl/set.h>
9551	__isl_give isl_set_list *isl_set_list_read_from_str(
9552		isl_ctx *ctx, const char *str);
9553
9554	#include <isl/map.h>
9555	__isl_give isl_map_list *isl_map_list_read_from_str(
9556		isl_ctx *ctx, const char *str);
9557
9558	#include <isl/union_set.h>
9559	__isl_give isl_union_set_list *
9560	isl_union_set_list_read_from_str(isl_ctx *ctx,
9561		const char *str);
9562
9563=head2 Associative arrays
9564
9565Associative arrays map isl objects of a specific type to isl objects
9566of some (other) specific type.  They are defined for several pairs
9567of types, including (C<isl_map>, C<isl_basic_set>),
9568(C<isl_id>, C<isl_ast_expr>),
9569(C<isl_id>, C<isl_id>) and
9570(C<isl_id>, C<isl_pw_aff>).
9571Here, we take associative arrays that map C<isl_id>s to C<isl_ast_expr>s
9572as an example.
9573
9574Associative arrays can be created, copied and freed using
9575the following functions.
9576
9577	#include <isl/id_to_ast_expr.h>
9578	__isl_give isl_id_to_ast_expr *isl_id_to_ast_expr_alloc(
9579		isl_ctx *ctx, int min_size);
9580	__isl_give isl_id_to_ast_expr *isl_id_to_ast_expr_copy(
9581		__isl_keep isl_id_to_ast_expr *id2expr);
9582	__isl_null isl_id_to_ast_expr *isl_id_to_ast_expr_free(
9583		__isl_take isl_id_to_ast_expr *id2expr);
9584
9585The C<min_size> argument to C<isl_id_to_ast_expr_alloc> can be used
9586to specify the expected size of the associative array.
9587The associative array will be grown automatically as needed.
9588
9589Associative arrays can be inspected using the following functions.
9590
9591	#include <isl/id_to_ast_expr.h>
9592	__isl_give isl_maybe_isl_ast_expr
9593	isl_id_to_ast_expr_try_get(
9594		__isl_keep isl_id_to_ast_expr *id2expr,
9595		__isl_keep isl_id *key);
9596	isl_bool isl_id_to_ast_expr_has(
9597		__isl_keep isl_id_to_ast_expr *id2expr,
9598		__isl_keep isl_id *key);
9599	__isl_give isl_ast_expr *isl_id_to_ast_expr_get(
9600		__isl_keep isl_id_to_ast_expr *id2expr,
9601		__isl_take isl_id *key);
9602	isl_stat isl_id_to_ast_expr_foreach(
9603		__isl_keep isl_id_to_ast_expr *id2expr,
9604		isl_stat (*fn)(__isl_take isl_id *key,
9605			__isl_take isl_ast_expr *val, void *user),
9606		void *user);
9607	isl_bool isl_id_to_ast_expr_every(
9608		__isl_keep isl_id_to_ast_expr *id2expr,
9609		isl_bool (*test)(__isl_keep isl_id *key,
9610			__isl_keep isl_ast_expr *val, void *user),
9611		void *user);
9612
9613The function C<isl_id_to_ast_expr_try_get> returns a structure
9614containing two elements, C<valid> and C<value>.
9615If there is a value associated to the key, then C<valid>
9616is set to C<isl_bool_true> and C<value> contains a copy of
9617the associated value.  Otherwise C<value> is C<NULL> and
9618C<valid> may be C<isl_bool_error> or C<isl_bool_false> depending
9619on whether some error has occurred or there simply is no associated value.
9620The function C<isl_id_to_ast_expr_has> returns the C<valid> field
9621in the structure and
9622the function C<isl_id_to_ast_expr_get> returns the C<value> field.
9623
9624Associative arrays can be modified using the following functions.
9625
9626	#include <isl/id_to_ast_expr.h>
9627	__isl_give isl_id_to_ast_expr *isl_id_to_ast_expr_set(
9628		__isl_take isl_id_to_ast_expr *id2expr,
9629		__isl_take isl_id *key,
9630		__isl_take isl_ast_expr *val);
9631	__isl_give isl_id_to_ast_expr *isl_id_to_ast_expr_drop(
9632		__isl_take isl_id_to_ast_expr *id2expr,
9633		__isl_take isl_id *key);
9634
9635Associative arrays can be checked for (obvious) equality
9636using the following function.
9637
9638	#include <isl/id_to_ast_expr.h>
9639	isl_bool isl_id_to_ast_expr_is_equal(
9640		__isl_take isl_id_to_ast_expr *id2expr1,
9641		__isl_take isl_id_to_ast_expr *id2expr2);
9642
9643Note that depending on how the keys and values are being compared,
9644for other types of keys and/or values, this function may be called
9645C<plain_is_equal> rather than C<is_equal>.
9646
9647Associative arrays can be printed using the following functions.
9648
9649	#include <isl/id_to_ast_expr.h>
9650	__isl_give isl_printer *isl_printer_print_id_to_ast_expr(
9651		__isl_take isl_printer *p,
9652		__isl_keep isl_id_to_ast_expr *id2expr);
9653	__isl_give char *isl_id_to_ast_expr_to_str(
9654		__isl_keep isl_id_to_ast_expr *id2expr);
9655
9656They can be read from input using the following function.
9657
9658	#include <isl/id_to_ast_expr.h>
9659	__isl_give isl_id_to_ast_expr *
9660	isl_id_to_ast_expr_read_from_str(isl_ctx *ctx,
9661		const char *str);
9662
9663=head2 Vectors
9664
9665Vectors can be created, copied and freed using the following functions.
9666
9667	#include <isl/vec.h>
9668	__isl_give isl_vec *isl_vec_alloc(isl_ctx *ctx,
9669		unsigned size);
9670	__isl_give isl_vec *isl_vec_zero(isl_ctx *ctx,
9671		unsigned size);
9672	__isl_give isl_vec *isl_vec_copy(__isl_keep isl_vec *vec);
9673	__isl_null isl_vec *isl_vec_free(__isl_take isl_vec *vec);
9674
9675Note that the elements of a vector created by C<isl_vec_alloc>
9676may have arbitrary values.
9677A vector created by C<isl_vec_zero> has elements with value zero.
9678The elements can be changed and inspected using the following functions.
9679
9680	isl_size isl_vec_size(__isl_keep isl_vec *vec);
9681	__isl_give isl_val *isl_vec_get_element_val(
9682		__isl_keep isl_vec *vec, int pos);
9683	__isl_give isl_vec *isl_vec_set_element_si(
9684		__isl_take isl_vec *vec, int pos, int v);
9685	__isl_give isl_vec *isl_vec_set_element_val(
9686		__isl_take isl_vec *vec, int pos,
9687		__isl_take isl_val *v);
9688	__isl_give isl_vec *isl_vec_set_si(__isl_take isl_vec *vec,
9689		int v);
9690	__isl_give isl_vec *isl_vec_set_val(
9691		__isl_take isl_vec *vec, __isl_take isl_val *v);
9692	int isl_vec_cmp_element(__isl_keep isl_vec *vec1,
9693		__isl_keep isl_vec *vec2, int pos);
9694
9695C<isl_vec_get_element> will return a negative value if anything went wrong.
9696In that case, the value of C<*v> is undefined.
9697
9698The following function can be used to concatenate two vectors.
9699
9700	__isl_give isl_vec *isl_vec_concat(__isl_take isl_vec *vec1,
9701		__isl_take isl_vec *vec2);
9702
9703=head2 Matrices
9704
9705Matrices can be created, copied and freed using the following functions.
9706
9707	#include <isl/mat.h>
9708	__isl_give isl_mat *isl_mat_alloc(isl_ctx *ctx,
9709		unsigned n_row, unsigned n_col);
9710	__isl_give isl_mat *isl_mat_copy(__isl_keep isl_mat *mat);
9711	__isl_null isl_mat *isl_mat_free(__isl_take isl_mat *mat);
9712
9713Note that the elements of a newly created matrix may have arbitrary values.
9714The elements can be changed and inspected using the following functions.
9715
9716	isl_size isl_mat_rows(__isl_keep isl_mat *mat);
9717	isl_size isl_mat_cols(__isl_keep isl_mat *mat);
9718	__isl_give isl_val *isl_mat_get_element_val(
9719		__isl_keep isl_mat *mat, int row, int col);
9720	__isl_give isl_mat *isl_mat_set_element_si(__isl_take isl_mat *mat,
9721		int row, int col, int v);
9722	__isl_give isl_mat *isl_mat_set_element_val(
9723		__isl_take isl_mat *mat, int row, int col,
9724		__isl_take isl_val *v);
9725
9726The following function computes the rank of a matrix.
9727The return value may be -1 if some error occurred.
9728
9729	#include <isl/mat.h>
9730	isl_size isl_mat_rank(__isl_keep isl_mat *mat);
9731
9732The following function can be used to compute the (right) inverse
9733of a matrix, i.e., a matrix such that the product of the original
9734and the inverse (in that order) is a multiple of the identity matrix.
9735The input matrix is assumed to be of full row-rank.
9736
9737	__isl_give isl_mat *isl_mat_right_inverse(__isl_take isl_mat *mat);
9738
9739The following function can be used to compute the (right) kernel
9740(or null space) of a matrix, i.e., a matrix such that the product of
9741the original and the kernel (in that order) is the zero matrix.
9742
9743	__isl_give isl_mat *isl_mat_right_kernel(__isl_take isl_mat *mat);
9744
9745The following function computes a basis for the space spanned
9746by the rows of a matrix.
9747
9748	__isl_give isl_mat *isl_mat_row_basis(
9749		__isl_take isl_mat *mat);
9750
9751The following function computes rows that extend a basis of C<mat1>
9752to a basis that also covers C<mat2>.
9753
9754	__isl_give isl_mat *isl_mat_row_basis_extension(
9755		__isl_take isl_mat *mat1,
9756		__isl_take isl_mat *mat2);
9757
9758The following function checks whether there is no linear dependence
9759among the combined rows of "mat1" and "mat2" that is not already present
9760in "mat1" or "mat2" individually.
9761If "mat1" and "mat2" have linearly independent rows by themselves,
9762then this means that there is no linear dependence among all rows together.
9763
9764	isl_bool isl_mat_has_linearly_independent_rows(
9765		__isl_keep isl_mat *mat1,
9766		__isl_keep isl_mat *mat2);
9767
9768=head2 Bounds on Piecewise Quasipolynomials and Piecewise Quasipolynomial Reductions
9769
9770The following functions determine
9771an upper or lower bound on a quasipolynomial over its domain.
9772
9773	__isl_give isl_pw_qpolynomial_fold *
9774	isl_pw_qpolynomial_bound(
9775		__isl_take isl_pw_qpolynomial *pwqp,
9776		enum isl_fold type, isl_bool *tight);
9777
9778	__isl_give isl_union_pw_qpolynomial_fold *
9779	isl_union_pw_qpolynomial_bound(
9780		__isl_take isl_union_pw_qpolynomial *upwqp,
9781		enum isl_fold type, isl_bool *tight);
9782
9783The C<type> argument may be either C<isl_fold_min> or C<isl_fold_max>.
9784If C<tight> is not C<NULL>, then C<*tight> is set to C<1>
9785is the returned bound is known be tight, i.e., for each value
9786of the parameters there is at least
9787one element in the domain that reaches the bound.
9788If the domain of C<pwqp> is not wrapping, then the bound is computed
9789over all elements in that domain and the result has a purely parametric
9790domain.  If the domain of C<pwqp> is wrapping, then the bound is
9791computed over the range of the wrapped relation.  The domain of the
9792wrapped relation becomes the domain of the result.
9793
9794=head2 Parametric Vertex Enumeration
9795
9796The parametric vertex enumeration described in this section
9797is mainly intended to be used internally and by the C<barvinok>
9798library.
9799
9800	#include <isl/vertices.h>
9801	__isl_give isl_vertices *isl_basic_set_compute_vertices(
9802		__isl_keep isl_basic_set *bset);
9803
9804The function C<isl_basic_set_compute_vertices> performs the
9805actual computation of the parametric vertices and the chamber
9806decomposition and stores the result in an C<isl_vertices> object.
9807This information can be queried by either iterating over all
9808the vertices or iterating over all the chambers or cells
9809and then iterating over all vertices that are active on the chamber.
9810
9811	isl_stat isl_vertices_foreach_vertex(
9812		__isl_keep isl_vertices *vertices,
9813		isl_stat (*fn)(__isl_take isl_vertex *vertex,
9814			void *user), void *user);
9815
9816	isl_stat isl_vertices_foreach_cell(
9817		__isl_keep isl_vertices *vertices,
9818		isl_stat (*fn)(__isl_take isl_cell *cell,
9819			void *user), void *user);
9820	isl_stat isl_cell_foreach_vertex(__isl_keep isl_cell *cell,
9821		isl_stat (*fn)(__isl_take isl_vertex *vertex,
9822			void *user), void *user);
9823
9824Other operations that can be performed on an C<isl_vertices> object are
9825the following.
9826
9827	isl_size isl_vertices_get_n_vertices(
9828		__isl_keep isl_vertices *vertices);
9829	__isl_null isl_vertices *isl_vertices_free(
9830		__isl_take isl_vertices *vertices);
9831
9832Vertices can be inspected and destroyed using the following functions.
9833
9834	isl_size isl_vertex_get_id(__isl_keep isl_vertex *vertex);
9835	__isl_give isl_basic_set *isl_vertex_get_domain(
9836		__isl_keep isl_vertex *vertex);
9837	__isl_give isl_multi_aff *isl_vertex_get_expr(
9838		__isl_keep isl_vertex *vertex);
9839	__isl_null isl_vertex *isl_vertex_free(
9840		__isl_take isl_vertex *vertex);
9841
9842C<isl_vertex_get_expr> returns a multiple quasi-affine expression
9843describing the vertex in terms of the parameters,
9844while C<isl_vertex_get_domain> returns the activity domain
9845of the vertex.
9846
9847Chambers can be inspected and destroyed using the following functions.
9848
9849	__isl_give isl_basic_set *isl_cell_get_domain(
9850		__isl_keep isl_cell *cell);
9851	__isl_null isl_cell *isl_cell_free(
9852		__isl_take isl_cell *cell);
9853
9854=head1 Polyhedral Compilation Library
9855
9856This section collects functionality in C<isl> that has been specifically
9857designed for use during polyhedral compilation.
9858
9859=head2 Schedule Trees
9860
9861A schedule tree is a structured representation of a schedule,
9862assigning a relative order to a set of domain elements.
9863The relative order expressed by the schedule tree is
9864defined recursively.  In particular, the order between
9865two domain elements is determined by the node that is closest
9866to the root that refers to both elements and that orders them apart.
9867Each node in the tree is of one of several types.
9868The root node is always of type C<isl_schedule_node_domain>
9869(or C<isl_schedule_node_extension>)
9870and it describes the (extra) domain elements to which the schedule applies.
9871The other types of nodes are as follows.
9872
9873=over
9874
9875=item C<isl_schedule_node_band>
9876
9877A band of schedule dimensions.  Each schedule dimension is represented
9878by a union piecewise quasi-affine expression.  If this expression
9879assigns a different value to two domain elements, while all previous
9880schedule dimensions in the same band assign them the same value,
9881then the two domain elements are ordered according to these two
9882different values.
9883Each expression is required to be total in the domain elements
9884that reach the band node.
9885
9886=item C<isl_schedule_node_expansion>
9887
9888An expansion node maps each of the domain elements that reach the node
9889to one or more domain elements.  The image of this mapping forms
9890the set of domain elements that reach the child of the expansion node.
9891The function that maps each of the expanded domain elements
9892to the original domain element from which it was expanded
9893is called the contraction.
9894
9895=item C<isl_schedule_node_filter>
9896
9897A filter node does not impose any ordering, but rather intersects
9898the set of domain elements that the current subtree refers to
9899with a given union set.  The subtree of the filter node only
9900refers to domain elements in the intersection.
9901A filter node is typically only used as a child of a sequence or
9902set node.
9903
9904=item C<isl_schedule_node_leaf>
9905
9906A leaf of the schedule tree.  Leaf nodes do not impose any ordering.
9907
9908=item C<isl_schedule_node_mark>
9909
9910A mark node can be used to attach any kind of information to a subtree
9911of the schedule tree.
9912
9913=item C<isl_schedule_node_sequence>
9914
9915A sequence node has one or more children, each of which is a filter node.
9916The filters on these filter nodes form a partition of
9917the domain elements that the current subtree refers to.
9918If two domain elements appear in distinct filters then the sequence
9919node orders them according to the child positions of the corresponding
9920filter nodes.
9921
9922=item C<isl_schedule_node_set>
9923
9924A set node is similar to a sequence node, except that
9925it expresses that domain elements appearing in distinct filters
9926may have any order.  The order of the children of a set node
9927is therefore also immaterial.
9928
9929=back
9930
9931The following node types are only supported by the AST generator.
9932
9933=over
9934
9935=item C<isl_schedule_node_context>
9936
9937The context describes constraints on the parameters and
9938the schedule dimensions of outer
9939bands that the AST generator may assume to hold.  It is also the only
9940kind of node that may introduce additional parameters.
9941The space of the context is that of the flat product of the outer
9942band nodes.  In particular, if there are no outer band nodes, then
9943this space is the unnamed zero-dimensional space.
9944Since a context node references the outer band nodes, any tree
9945containing a context node is considered to be anchored.
9946
9947=item C<isl_schedule_node_extension>
9948
9949An extension node instructs the AST generator to add additional
9950domain elements that need to be scheduled.
9951The additional domain elements are described by the range of
9952the extension map in terms of the outer schedule dimensions,
9953i.e., the flat product of the outer band nodes.
9954Note that domain elements are added whenever the AST generator
9955reaches the extension node, meaning that there are still some
9956active domain elements for which an AST needs to be generated.
9957The conditions under which some domain elements are still active
9958may however not be completely described by the outer AST nodes
9959generated at that point.
9960Since an extension node references the outer band nodes, any tree
9961containing an extension node is considered to be anchored.
9962
9963An extension node may also appear as the root of a schedule tree,
9964when it is intended to be inserted into another tree
9965using C<isl_schedule_node_graft_before> or C<isl_schedule_node_graft_after>.
9966In this case, the domain of the extension node should
9967correspond to the flat product of the outer band nodes
9968in this other schedule tree at the point where the extension tree
9969will be inserted.
9970
9971=item C<isl_schedule_node_guard>
9972
9973The guard describes constraints on the parameters and
9974the schedule dimensions of outer
9975bands that need to be enforced by the outer nodes
9976in the generated AST.
9977That is, the part of the AST that is generated from descendants
9978of the guard node can assume that these constraints are satisfied.
9979The space of the guard is that of the flat product of the outer
9980band nodes.  In particular, if there are no outer band nodes, then
9981this space is the unnamed zero-dimensional space.
9982Since a guard node references the outer band nodes, any tree
9983containing a guard node is considered to be anchored.
9984
9985=back
9986
9987Except for the C<isl_schedule_node_context> nodes,
9988none of the nodes may introduce any parameters that were not
9989already present in the root domain node.
9990
9991A schedule tree is encapsulated in an C<isl_schedule> object.
9992The simplest such objects, those with a tree consisting of single domain node,
9993can be created using the following functions with either an empty
9994domain or a given domain.
9995
9996	#include <isl/schedule.h>
9997	__isl_give isl_schedule *isl_schedule_empty(
9998		__isl_take isl_space *space);
9999	__isl_give isl_schedule *isl_schedule_from_domain(
10000		__isl_take isl_union_set *domain);
10001
10002The function C<isl_schedule_constraints_compute_schedule> described
10003in L</"Scheduling"> can also be used to construct schedules.
10004
10005C<isl_schedule> objects may be copied and freed using the following functions.
10006
10007	#include <isl/schedule.h>
10008	__isl_give isl_schedule *isl_schedule_copy(
10009		__isl_keep isl_schedule *sched);
10010	__isl_null isl_schedule *isl_schedule_free(
10011		__isl_take isl_schedule *sched);
10012
10013The following functions checks whether two C<isl_schedule> objects
10014are obviously the same.
10015
10016	#include <isl/schedule.h>
10017	isl_bool isl_schedule_plain_is_equal(
10018		__isl_keep isl_schedule *schedule1,
10019		__isl_keep isl_schedule *schedule2);
10020
10021The domain of the schedule, i.e., the domain described by the root node,
10022can be obtained using the following function.
10023
10024	#include <isl/schedule.h>
10025	__isl_give isl_union_set *isl_schedule_get_domain(
10026		__isl_keep isl_schedule *schedule);
10027
10028An extra top-level band node (right underneath the domain node) can
10029be introduced into the schedule using the following function.
10030The schedule tree is assumed not to have any anchored nodes.
10031
10032	#include <isl/schedule.h>
10033	__isl_give isl_schedule *
10034	isl_schedule_insert_partial_schedule(
10035		__isl_take isl_schedule *schedule,
10036		__isl_take isl_multi_union_pw_aff *partial);
10037
10038A top-level context node (right underneath the domain node) can
10039be introduced into the schedule using the following function.
10040
10041	#include <isl/schedule.h>
10042	__isl_give isl_schedule *isl_schedule_insert_context(
10043		__isl_take isl_schedule *schedule,
10044		__isl_take isl_set *context)
10045
10046A top-level guard node (right underneath the domain node) can
10047be introduced into the schedule using the following function.
10048
10049	#include <isl/schedule.h>
10050	__isl_give isl_schedule *isl_schedule_insert_guard(
10051		__isl_take isl_schedule *schedule,
10052		__isl_take isl_set *guard)
10053
10054A schedule that combines two schedules either in the given
10055order or in an arbitrary order, i.e., with an C<isl_schedule_node_sequence>
10056or an C<isl_schedule_node_set> node,
10057can be created using the following functions.
10058
10059	#include <isl/schedule.h>
10060	__isl_give isl_schedule *isl_schedule_sequence(
10061		__isl_take isl_schedule *schedule1,
10062		__isl_take isl_schedule *schedule2);
10063	__isl_give isl_schedule *isl_schedule_set(
10064		__isl_take isl_schedule *schedule1,
10065		__isl_take isl_schedule *schedule2);
10066
10067The domains of the two input schedules need to be disjoint.
10068
10069The following function can be used to restrict the domain
10070of a schedule with a domain node as root to be a subset of the given union set.
10071This operation may remove nodes in the tree that have become
10072redundant.
10073
10074	#include <isl/schedule.h>
10075	__isl_give isl_schedule *isl_schedule_intersect_domain(
10076		__isl_take isl_schedule *schedule,
10077		__isl_take isl_union_set *domain);
10078
10079The following function can be used to simplify the domain
10080of a schedule with a domain node as root with respect to the given
10081parameter domain.
10082
10083	#include <isl/schedule.h>
10084	__isl_give isl_schedule *isl_schedule_gist_domain_params(
10085		__isl_take isl_schedule *schedule,
10086		__isl_take isl_set *context);
10087
10088The following function resets the user pointers on all parameter
10089and tuple identifiers referenced by the nodes of the given schedule.
10090
10091	#include <isl/schedule.h>
10092	__isl_give isl_schedule *isl_schedule_reset_user(
10093		__isl_take isl_schedule *schedule);
10094
10095The following function aligns the parameters of all nodes
10096in the given schedule to the given space.
10097
10098	#include <isl/schedule.h>
10099	__isl_give isl_schedule *isl_schedule_align_params(
10100		__isl_take isl_schedule *schedule,
10101		__isl_take isl_space *space);
10102
10103The following function allows the user to plug in a given function
10104in the iteration domains.  The input schedule is not allowed to contain
10105any expansion nodes.
10106
10107	#include <isl/schedule.h>
10108	__isl_give isl_schedule *
10109	isl_schedule_pullback_union_pw_multi_aff(
10110		__isl_take isl_schedule *schedule,
10111		__isl_take isl_union_pw_multi_aff *upma);
10112
10113The following function can be used to plug in the schedule C<expansion>
10114in the leaves of C<schedule>, where C<contraction> describes how
10115the domain elements of C<expansion> map to the domain elements
10116at the original leaves of C<schedule>.
10117The resulting schedule will contain expansion nodes, unless
10118C<contraction> is an identity function.
10119
10120	#include <isl/schedule.h>
10121	__isl_give isl_schedule *isl_schedule_expand(
10122		__isl_take isl_schedule *schedule,
10123		__isl_take isl_union_pw_multi_aff *contraction,
10124		__isl_take isl_schedule *expansion);
10125
10126An C<isl_union_map> representation of the schedule can be obtained
10127from an C<isl_schedule> using the following function.
10128
10129	#include <isl/schedule.h>
10130	__isl_give isl_union_map *isl_schedule_get_map(
10131		__isl_keep isl_schedule *sched);
10132
10133The resulting relation encodes the same relative ordering as
10134the schedule by mapping the domain elements to a common schedule space.
10135If the schedule_separate_components option is set, then the order
10136of the children of a set node is explicitly encoded in the result.
10137If the tree contains any expansion nodes, then the relation
10138is formulated in terms of the expanded domain elements.
10139
10140Schedules can be read from input using the following functions.
10141
10142	#include <isl/schedule.h>
10143	__isl_give isl_schedule *isl_schedule_read_from_file(
10144		isl_ctx *ctx, FILE *input);
10145	__isl_give isl_schedule *isl_schedule_read_from_str(
10146		isl_ctx *ctx, const char *str);
10147
10148A representation of the schedule can be printed using
10149
10150	#include <isl/schedule.h>
10151	__isl_give isl_printer *isl_printer_print_schedule(
10152		__isl_take isl_printer *p,
10153		__isl_keep isl_schedule *schedule);
10154	__isl_give char *isl_schedule_to_str(
10155		__isl_keep isl_schedule *schedule);
10156
10157C<isl_schedule_to_str> prints the schedule in flow format.
10158
10159The schedule tree can be traversed through the use of
10160C<isl_schedule_node> objects that point to a particular
10161position in the schedule tree.  Whenever a C<isl_schedule_node>
10162is used to modify a node in the schedule tree, the original schedule
10163tree is left untouched and the modifications are performed to a copy
10164of the tree.  The returned C<isl_schedule_node> then points to
10165this modified copy of the tree.
10166
10167The root of the schedule tree can be obtained using the following function.
10168
10169	#include <isl/schedule.h>
10170	__isl_give isl_schedule_node *isl_schedule_get_root(
10171		__isl_keep isl_schedule *schedule);
10172
10173A pointer to a newly created schedule tree with a single domain
10174node can be created using the following functions.
10175
10176	#include <isl/schedule_node.h>
10177	__isl_give isl_schedule_node *
10178	isl_schedule_node_from_domain(
10179		__isl_take isl_union_set *domain);
10180	__isl_give isl_schedule_node *
10181	isl_schedule_node_from_extension(
10182		__isl_take isl_union_map *extension);
10183
10184C<isl_schedule_node_from_extension> creates a tree with an extension
10185node as root.
10186
10187Schedule nodes can be copied and freed using the following functions.
10188
10189	#include <isl/schedule_node.h>
10190	__isl_give isl_schedule_node *isl_schedule_node_copy(
10191		__isl_keep isl_schedule_node *node);
10192	__isl_null isl_schedule_node *isl_schedule_node_free(
10193		__isl_take isl_schedule_node *node);
10194
10195The following functions can be used to check if two schedule
10196nodes point to the same position in the same schedule.
10197
10198	#include <isl/schedule_node.h>
10199	isl_bool isl_schedule_node_is_equal(
10200		__isl_keep isl_schedule_node *node1,
10201		__isl_keep isl_schedule_node *node2);
10202
10203The following properties can be obtained from a schedule node.
10204
10205	#include <isl/schedule_node.h>
10206	enum isl_schedule_node_type isl_schedule_node_get_type(
10207		__isl_keep isl_schedule_node *node);
10208	enum isl_schedule_node_type
10209	isl_schedule_node_get_parent_type(
10210		__isl_keep isl_schedule_node *node);
10211	__isl_give isl_schedule *isl_schedule_node_get_schedule(
10212		__isl_keep isl_schedule_node *node);
10213
10214The function C<isl_schedule_node_get_type> returns the type of
10215the node, while C<isl_schedule_node_get_parent_type> returns
10216type of the parent of the node, which is required to exist.
10217The function C<isl_schedule_node_get_schedule> returns a copy
10218to the schedule to which the node belongs.
10219
10220The following functions can be used to move the schedule node
10221to a different position in the tree or to check if such a position
10222exists.
10223
10224	#include <isl/schedule_node.h>
10225	isl_bool isl_schedule_node_has_parent(
10226		__isl_keep isl_schedule_node *node);
10227	__isl_give isl_schedule_node *isl_schedule_node_parent(
10228		__isl_take isl_schedule_node *node);
10229	__isl_give isl_schedule_node *
10230	isl_schedule_node_grandparent(
10231		__isl_take isl_schedule_node *node);
10232	__isl_give isl_schedule_node *isl_schedule_node_root(
10233		__isl_take isl_schedule_node *node);
10234	__isl_give isl_schedule_node *isl_schedule_node_ancestor(
10235		__isl_take isl_schedule_node *node,
10236		int generation);
10237	isl_size isl_schedule_node_n_children(
10238		__isl_keep isl_schedule_node *node);
10239	__isl_give isl_schedule_node *isl_schedule_node_child(
10240		__isl_take isl_schedule_node *node, int pos);
10241	isl_bool isl_schedule_node_has_children(
10242		__isl_keep isl_schedule_node *node);
10243	__isl_give isl_schedule_node *
10244	isl_schedule_node_grandchild(
10245		__isl_take isl_schedule_node *node,
10246		int pos1, int pos2);
10247	__isl_give isl_schedule_node *isl_schedule_node_first_child(
10248		__isl_take isl_schedule_node *node);
10249	isl_bool isl_schedule_node_has_previous_sibling(
10250		__isl_keep isl_schedule_node *node);
10251	__isl_give isl_schedule_node *
10252	isl_schedule_node_previous_sibling(
10253		__isl_take isl_schedule_node *node);
10254	isl_bool isl_schedule_node_has_next_sibling(
10255		__isl_keep isl_schedule_node *node);
10256	__isl_give isl_schedule_node *
10257	isl_schedule_node_next_sibling(
10258		__isl_take isl_schedule_node *node);
10259
10260For C<isl_schedule_node_ancestor>, the ancestor of generation 0
10261is the node itself, the ancestor of generation 1 is its parent and so on.
10262
10263It is also possible to query the number of ancestors of a node,
10264the position of the current node
10265within the children of its parent, the position of the subtree
10266containing a node within the children of an ancestor
10267or to obtain a copy of a given
10268child without destroying the current node.
10269Given two nodes that point to the same schedule, their closest
10270shared ancestor can be obtained using
10271C<isl_schedule_node_get_shared_ancestor>.
10272
10273	#include <isl/schedule_node.h>
10274	isl_size isl_schedule_node_get_tree_depth(
10275		__isl_keep isl_schedule_node *node);
10276	isl_size isl_schedule_node_get_child_position(
10277		__isl_keep isl_schedule_node *node);
10278	isl_size isl_schedule_node_get_ancestor_child_position(
10279		__isl_keep isl_schedule_node *node,
10280		__isl_keep isl_schedule_node *ancestor);
10281	__isl_give isl_schedule_node *isl_schedule_node_get_child(
10282		__isl_keep isl_schedule_node *node, int pos);
10283	__isl_give isl_schedule_node *
10284	isl_schedule_node_get_shared_ancestor(
10285		__isl_keep isl_schedule_node *node1,
10286		__isl_keep isl_schedule_node *node2);
10287
10288All nodes in a schedule tree or
10289all descendants of a specific node (including the node) can be visited
10290in depth-first pre-order using the following functions.
10291
10292	#include <isl/schedule.h>
10293	isl_stat isl_schedule_foreach_schedule_node_top_down(
10294		__isl_keep isl_schedule *sched,
10295		isl_bool (*fn)(__isl_keep isl_schedule_node *node,
10296			void *user), void *user);
10297
10298	#include <isl/schedule_node.h>
10299	isl_stat isl_schedule_node_foreach_descendant_top_down(
10300		__isl_keep isl_schedule_node *node,
10301		isl_bool (*fn)(__isl_keep isl_schedule_node *node,
10302			void *user), void *user);
10303
10304The callback function is slightly different from the usual
10305callbacks in that it not only indicates success (non-negative result)
10306or failure (negative result), but also indicates whether the children
10307of the given node should be visited.  In particular, if the callback
10308returns a positive value, then the children are visited, but if
10309the callback returns zero, then the children are not visited.
10310
10311The following functions checks whether
10312all descendants of a specific node (including the node itself)
10313satisfy a user-specified test.
10314
10315	#include <isl/schedule_node.h>
10316	isl_bool isl_schedule_node_every_descendant(
10317		__isl_keep isl_schedule_node *node,
10318		isl_bool (*test)(__isl_keep isl_schedule_node *node,
10319			void *user), void *user)
10320
10321The ancestors of a node in a schedule tree can be visited from
10322the root down to and including the parent of the node using
10323the following function.
10324
10325	#include <isl/schedule_node.h>
10326	isl_stat isl_schedule_node_foreach_ancestor_top_down(
10327		__isl_keep isl_schedule_node *node,
10328		isl_stat (*fn)(__isl_keep isl_schedule_node *node,
10329			void *user), void *user);
10330
10331The following functions allows for a depth-first post-order
10332traversal of the nodes in a schedule tree or
10333of the descendants of a specific node (including the node
10334itself), where the user callback is allowed to modify the
10335visited node.
10336
10337	#include <isl/schedule.h>
10338	__isl_give isl_schedule *
10339	isl_schedule_map_schedule_node_bottom_up(
10340		__isl_take isl_schedule *schedule,
10341		__isl_give isl_schedule_node *(*fn)(
10342			__isl_take isl_schedule_node *node,
10343			void *user), void *user);
10344
10345	#include <isl/schedule_node.h>
10346	__isl_give isl_schedule_node *
10347	isl_schedule_node_map_descendant_bottom_up(
10348		__isl_take isl_schedule_node *node,
10349		__isl_give isl_schedule_node *(*fn)(
10350			__isl_take isl_schedule_node *node,
10351			void *user), void *user);
10352
10353The traversal continues from the node returned by the callback function.
10354It is the responsibility of the user to ensure that this does not
10355lead to an infinite loop.  It is safest to always return a pointer
10356to the same position (same ancestors and child positions) as the input node.
10357
10358The following function removes a node (along with its descendants)
10359from a schedule tree and returns a pointer to the leaf at the
10360same position in the updated tree.
10361It is not allowed to remove the root of a schedule tree or
10362a child of a set or sequence node.
10363
10364	#include <isl/schedule_node.h>
10365	__isl_give isl_schedule_node *isl_schedule_node_cut(
10366		__isl_take isl_schedule_node *node);
10367
10368The following function removes a single node
10369from a schedule tree and returns a pointer to the child
10370of the node, now located at the position of the original node
10371or to a leaf node at that position if there was no child.
10372It is not allowed to remove the root of a schedule tree,
10373a set or sequence node, a child of a set or sequence node or
10374a band node with an anchored subtree.
10375
10376	#include <isl/schedule_node.h>
10377	__isl_give isl_schedule_node *isl_schedule_node_delete(
10378		__isl_take isl_schedule_node *node);
10379
10380Most nodes in a schedule tree only contain local information.
10381In some cases, however, a node may also refer to the schedule dimensions
10382of its outer band nodes.
10383This means that the position of the node within the tree should
10384not be changed, or at least that no changes are performed to the
10385outer band nodes.  The following function can be used to test
10386whether the subtree rooted at a given node contains any such nodes.
10387
10388	#include <isl/schedule_node.h>
10389	isl_bool isl_schedule_node_is_subtree_anchored(
10390		__isl_keep isl_schedule_node *node);
10391
10392The following function resets the user pointers on all parameter
10393and tuple identifiers referenced by the given schedule node.
10394
10395	#include <isl/schedule_node.h>
10396	__isl_give isl_schedule_node *isl_schedule_node_reset_user(
10397		__isl_take isl_schedule_node *node);
10398
10399The following function aligns the parameters of the given schedule
10400node to the given space.
10401
10402	#include <isl/schedule_node.h>
10403	__isl_give isl_schedule_node *
10404	isl_schedule_node_align_params(
10405		__isl_take isl_schedule_node *node,
10406		__isl_take isl_space *space);
10407
10408Several node types have their own functions for querying
10409(and in some cases setting) some node type specific properties.
10410
10411	#include <isl/schedule_node.h>
10412	__isl_give isl_space *isl_schedule_node_band_get_space(
10413		__isl_keep isl_schedule_node *node);
10414	__isl_give isl_multi_union_pw_aff *
10415	isl_schedule_node_band_get_partial_schedule(
10416		__isl_keep isl_schedule_node *node);
10417	__isl_give isl_union_map *
10418	isl_schedule_node_band_get_partial_schedule_union_map(
10419		__isl_keep isl_schedule_node *node);
10420	isl_size isl_schedule_node_band_n_member(
10421		__isl_keep isl_schedule_node *node);
10422	isl_bool isl_schedule_node_band_member_get_coincident(
10423		__isl_keep isl_schedule_node *node, int pos);
10424	__isl_give isl_schedule_node *
10425	isl_schedule_node_band_member_set_coincident(
10426		__isl_take isl_schedule_node *node, int pos,
10427		int coincident);
10428	isl_bool isl_schedule_node_band_get_permutable(
10429		__isl_keep isl_schedule_node *node);
10430	__isl_give isl_schedule_node *
10431	isl_schedule_node_band_set_permutable(
10432		__isl_take isl_schedule_node *node, int permutable);
10433	enum isl_ast_loop_type
10434	isl_schedule_node_band_member_get_ast_loop_type(
10435		__isl_keep isl_schedule_node *node, int pos);
10436	__isl_give isl_schedule_node *
10437	isl_schedule_node_band_member_set_ast_loop_type(
10438		__isl_take isl_schedule_node *node, int pos,
10439		enum isl_ast_loop_type type);
10440	enum isl_ast_loop_type
10441	isl_schedule_node_band_member_get_isolate_ast_loop_type(
10442		__isl_keep isl_schedule_node *node, int pos);
10443	__isl_give isl_schedule_node *
10444	isl_schedule_node_band_member_set_isolate_ast_loop_type(
10445		__isl_take isl_schedule_node *node, int pos,
10446		enum isl_ast_loop_type type);
10447	__isl_give isl_union_set *
10448	isl_schedule_node_band_get_ast_build_options(
10449		__isl_keep isl_schedule_node *node);
10450	__isl_give isl_schedule_node *
10451	isl_schedule_node_band_set_ast_build_options(
10452		__isl_take isl_schedule_node *node,
10453		__isl_take isl_union_set *options);
10454	__isl_give isl_set *
10455	isl_schedule_node_band_get_ast_isolate_option(
10456		__isl_keep isl_schedule_node *node);
10457
10458The function C<isl_schedule_node_band_get_space> returns the space
10459of the partial schedule of the band.
10460The function C<isl_schedule_node_band_get_partial_schedule_union_map>
10461returns a representation of the partial schedule of the band node
10462in the form of an C<isl_union_map>.
10463The coincident and permutable properties are set by
10464C<isl_schedule_constraints_compute_schedule> on the schedule tree
10465it produces.
10466A scheduling dimension is considered to be ``coincident''
10467if it satisfies the coincidence constraints within its band.
10468That is, if the dependence distances of the coincidence
10469constraints are all zero in that direction (for fixed
10470iterations of outer bands).
10471A band is marked permutable if it was produced using the Pluto-like scheduler.
10472Note that the scheduler may have to resort to a Feautrier style scheduling
10473step even if the default scheduler is used.
10474An C<isl_ast_loop_type> is one of C<isl_ast_loop_default>,
10475C<isl_ast_loop_atomic>, C<isl_ast_loop_unroll> or C<isl_ast_loop_separate>.
10476For the meaning of these loop AST generation types and the difference
10477between the regular loop AST generation type and the isolate
10478loop AST generation type, see L</"AST Generation Options (Schedule Tree)">.
10479The functions C<isl_schedule_node_band_member_get_ast_loop_type>
10480and C<isl_schedule_node_band_member_get_isolate_ast_loop_type>
10481may return C<isl_ast_loop_error> if an error occurs.
10482The AST build options govern how an AST is generated for
10483the individual schedule dimensions during AST generation.
10484See L</"AST Generation Options (Schedule Tree)">.
10485The isolate option for the given node can be extracted from these
10486AST build options using the function
10487C<isl_schedule_node_band_get_ast_isolate_option>.
10488
10489	#include <isl/schedule_node.h>
10490	__isl_give isl_set *
10491	isl_schedule_node_context_get_context(
10492		__isl_keep isl_schedule_node *node);
10493
10494	#include <isl/schedule_node.h>
10495	__isl_give isl_union_set *
10496	isl_schedule_node_domain_get_domain(
10497		__isl_keep isl_schedule_node *node);
10498
10499	#include <isl/schedule_node.h>
10500	__isl_give isl_union_map *
10501	isl_schedule_node_expansion_get_expansion(
10502		__isl_keep isl_schedule_node *node);
10503	__isl_give isl_union_pw_multi_aff *
10504	isl_schedule_node_expansion_get_contraction(
10505		__isl_keep isl_schedule_node *node);
10506
10507	#include <isl/schedule_node.h>
10508	__isl_give isl_union_map *
10509	isl_schedule_node_extension_get_extension(
10510		__isl_keep isl_schedule_node *node);
10511
10512	#include <isl/schedule_node.h>
10513	__isl_give isl_union_set *
10514	isl_schedule_node_filter_get_filter(
10515		__isl_keep isl_schedule_node *node);
10516
10517	#include <isl/schedule_node.h>
10518	__isl_give isl_set *isl_schedule_node_guard_get_guard(
10519		__isl_keep isl_schedule_node *node);
10520
10521	#include <isl/schedule_node.h>
10522	__isl_give isl_id *isl_schedule_node_mark_get_id(
10523		__isl_keep isl_schedule_node *node);
10524
10525The following functions can be used to obtain an C<isl_multi_union_pw_aff>,
10526an C<isl_union_pw_multi_aff> or C<isl_union_map> representation of
10527partial schedules related to the node.
10528
10529	#include <isl/schedule_node.h>
10530	__isl_give isl_multi_union_pw_aff *
10531	isl_schedule_node_get_prefix_schedule_multi_union_pw_aff(
10532		__isl_keep isl_schedule_node *node);
10533	__isl_give isl_union_pw_multi_aff *
10534	isl_schedule_node_get_prefix_schedule_union_pw_multi_aff(
10535		__isl_keep isl_schedule_node *node);
10536	__isl_give isl_union_map *
10537	isl_schedule_node_get_prefix_schedule_union_map(
10538		__isl_keep isl_schedule_node *node);
10539	__isl_give isl_union_map *
10540	isl_schedule_node_get_prefix_schedule_relation(
10541		__isl_keep isl_schedule_node *node);
10542	__isl_give isl_union_map *
10543	isl_schedule_node_get_subtree_schedule_union_map(
10544		__isl_keep isl_schedule_node *node);
10545
10546In particular, the functions
10547C<isl_schedule_node_get_prefix_schedule_multi_union_pw_aff>,
10548C<isl_schedule_node_get_prefix_schedule_union_pw_multi_aff>
10549and C<isl_schedule_node_get_prefix_schedule_union_map>
10550return a relative ordering on the domain elements that reach the given
10551node determined by its ancestors.
10552The function C<isl_schedule_node_get_prefix_schedule_relation>
10553additionally includes the domain constraints in the result.
10554The function C<isl_schedule_node_get_subtree_schedule_union_map>
10555returns a representation of the partial schedule defined by the
10556subtree rooted at the given node.
10557If the tree contains any expansion nodes, then the subtree schedule
10558is formulated in terms of the expanded domain elements.
10559The tree passed to functions returning a prefix schedule
10560may only contain extension nodes if these would not affect
10561the result of these functions.  That is, if one of the ancestors
10562is an extension node, then all of the domain elements that were
10563added by the extension node need to have been filtered out
10564by filter nodes between the extension node and the input node.
10565The tree passed to C<isl_schedule_node_get_subtree_schedule_union_map>
10566may not contain in extension nodes in the selected subtree.
10567
10568The expansion/contraction defined by an entire subtree, combining
10569the expansions/contractions
10570on the expansion nodes in the subtree, can be obtained using
10571the following functions.
10572
10573	#include <isl/schedule_node.h>
10574	__isl_give isl_union_map *
10575	isl_schedule_node_get_subtree_expansion(
10576		__isl_keep isl_schedule_node *node);
10577	__isl_give isl_union_pw_multi_aff *
10578	isl_schedule_node_get_subtree_contraction(
10579		__isl_keep isl_schedule_node *node);
10580
10581The total number of outer band members of given node, i.e.,
10582the shared output dimension of the maps in the result
10583of C<isl_schedule_node_get_prefix_schedule_union_map> can be obtained
10584using the following function.
10585
10586	#include <isl/schedule_node.h>
10587	isl_size isl_schedule_node_get_schedule_depth(
10588		__isl_keep isl_schedule_node *node);
10589
10590The following functions return the elements that reach the given node
10591or the union of universes in the spaces that contain these elements.
10592
10593	#include <isl/schedule_node.h>
10594	__isl_give isl_union_set *
10595	isl_schedule_node_get_domain(
10596		__isl_keep isl_schedule_node *node);
10597	__isl_give isl_union_set *
10598	isl_schedule_node_get_universe_domain(
10599		__isl_keep isl_schedule_node *node);
10600
10601The input tree of C<isl_schedule_node_get_domain>
10602may only contain extension nodes if these would not affect
10603the result of this function.  That is, if one of the ancestors
10604is an extension node, then all of the domain elements that were
10605added by the extension node need to have been filtered out
10606by filter nodes between the extension node and the input node.
10607
10608The following functions can be used to introduce additional nodes
10609in the schedule tree.  The new node is introduced at the point
10610in the tree where the C<isl_schedule_node> points to and
10611the results points to the new node.
10612
10613	#include <isl/schedule_node.h>
10614	__isl_give isl_schedule_node *
10615	isl_schedule_node_insert_partial_schedule(
10616		__isl_take isl_schedule_node *node,
10617		__isl_take isl_multi_union_pw_aff *schedule);
10618
10619This function inserts a new band node with (the greatest integer
10620part of) the given partial schedule.
10621The subtree rooted at the given node is assumed not to have
10622any anchored nodes.
10623
10624	#include <isl/schedule_node.h>
10625	__isl_give isl_schedule_node *
10626	isl_schedule_node_insert_context(
10627		__isl_take isl_schedule_node *node,
10628		__isl_take isl_set *context);
10629
10630This function inserts a new context node with the given context constraints.
10631
10632	#include <isl/schedule_node.h>
10633	__isl_give isl_schedule_node *
10634	isl_schedule_node_insert_filter(
10635		__isl_take isl_schedule_node *node,
10636		__isl_take isl_union_set *filter);
10637
10638This function inserts a new filter node with the given filter.
10639If the original node already pointed to a filter node, then the
10640two filter nodes are merged into one.
10641
10642	#include <isl/schedule_node.h>
10643	__isl_give isl_schedule_node *
10644	isl_schedule_node_insert_guard(
10645		__isl_take isl_schedule_node *node,
10646		__isl_take isl_set *guard);
10647
10648This function inserts a new guard node with the given guard constraints.
10649
10650	#include <isl/schedule_node.h>
10651	__isl_give isl_schedule_node *
10652	isl_schedule_node_insert_mark(
10653		__isl_take isl_schedule_node *node,
10654		__isl_take isl_id *mark);
10655
10656This function inserts a new mark node with the give mark identifier.
10657
10658	#include <isl/schedule_node.h>
10659	__isl_give isl_schedule_node *
10660	isl_schedule_node_insert_sequence(
10661		__isl_take isl_schedule_node *node,
10662		__isl_take isl_union_set_list *filters);
10663	__isl_give isl_schedule_node *
10664	isl_schedule_node_insert_set(
10665		__isl_take isl_schedule_node *node,
10666		__isl_take isl_union_set_list *filters);
10667
10668These functions insert a new sequence or set node with the given
10669filters as children.
10670
10671	#include <isl/schedule_node.h>
10672	__isl_give isl_schedule_node *isl_schedule_node_group(
10673		__isl_take isl_schedule_node *node,
10674		__isl_take isl_id *group_id);
10675
10676This function introduces an expansion node in between the current
10677node and its parent that expands instances of a space with tuple
10678identifier C<group_id> to the original domain elements that reach
10679the node.  The group instances are identified by the prefix schedule
10680of those domain elements.  The ancestors of the node are adjusted
10681to refer to the group instances instead of the original domain
10682elements.  The return value points to the same node in the updated
10683schedule tree as the input node, i.e., to the child of the newly
10684introduced expansion node.  Grouping instances of different statements
10685ensures that they will be treated as a single statement by the
10686AST generator up to the point of the expansion node.
10687
10688The following functions can be used to flatten a nested
10689sequence.
10690
10691	#include <isl/schedule_node.h>
10692	__isl_give isl_schedule_node *
10693	isl_schedule_node_sequence_splice_child(
10694		__isl_take isl_schedule_node *node, int pos);
10695	__isl_give isl_schedule_node *
10696	isl_schedule_node_sequence_splice_children(
10697		__isl_take isl_schedule_node *node);
10698
10699That is, given a sequence node C<node> that has another sequence node
10700in its child at position C<pos> (in particular, the child of that filter
10701node is a sequence node), the function
10702C<isl_schedule_node_sequence_splice_child>
10703attaches the children of that other sequence
10704node as children of C<node>, replacing the original child at position
10705C<pos>.
10706C<isl_schedule_node_sequence_splice_children> does this for all
10707such children.
10708
10709The partial schedule of a band node can be scaled (down) or reduced using
10710the following functions.
10711
10712	#include <isl/schedule_node.h>
10713	__isl_give isl_schedule_node *
10714	isl_schedule_node_band_scale(
10715		__isl_take isl_schedule_node *node,
10716		__isl_take isl_multi_val *mv);
10717	__isl_give isl_schedule_node *
10718	isl_schedule_node_band_scale_down(
10719		__isl_take isl_schedule_node *node,
10720		__isl_take isl_multi_val *mv);
10721	__isl_give isl_schedule_node *
10722	isl_schedule_node_band_mod(
10723		__isl_take isl_schedule_node *node,
10724		__isl_take isl_multi_val *mv);
10725
10726The spaces of the two arguments need to match.
10727After scaling, the partial schedule is replaced by its greatest
10728integer part to ensure that the schedule remains integral.
10729
10730The partial schedule of a band node can be shifted by an
10731C<isl_multi_union_pw_aff> with a domain that is a superset
10732of the domain of the partial schedule using
10733the following function.
10734
10735	#include <isl/schedule_node.h>
10736	__isl_give isl_schedule_node *
10737	isl_schedule_node_band_shift(
10738		__isl_take isl_schedule_node *node,
10739		__isl_take isl_multi_union_pw_aff *shift);
10740
10741A band node can be tiled using the following function.
10742
10743	#include <isl/schedule_node.h>
10744	__isl_give isl_schedule_node *isl_schedule_node_band_tile(
10745		__isl_take isl_schedule_node *node,
10746		__isl_take isl_multi_val *sizes);
10747
10748	isl_stat isl_options_set_tile_scale_tile_loops(isl_ctx *ctx,
10749		int val);
10750	int isl_options_get_tile_scale_tile_loops(isl_ctx *ctx);
10751	isl_stat isl_options_set_tile_shift_point_loops(isl_ctx *ctx,
10752		int val);
10753	int isl_options_get_tile_shift_point_loops(isl_ctx *ctx);
10754
10755The C<isl_schedule_node_band_tile> function tiles
10756the band using the given tile sizes inside its schedule.
10757A new child band node is created to represent the point loops and it is
10758inserted between the modified band and its children.
10759The subtree rooted at the given node is assumed not to have
10760any anchored nodes.
10761The C<tile_scale_tile_loops> option specifies whether the tile
10762loops iterators should be scaled by the tile sizes.
10763If the C<tile_shift_point_loops> option is set, then the point loops
10764are shifted to start at zero.
10765
10766A band node can be split into two nested band nodes
10767using the following function.
10768
10769	#include <isl/schedule_node.h>
10770	__isl_give isl_schedule_node *isl_schedule_node_band_split(
10771		__isl_take isl_schedule_node *node, int pos);
10772
10773The resulting outer band node contains the first C<pos> dimensions of
10774the schedule of C<node> while the inner band contains the remaining dimensions.
10775The schedules of the two band nodes live in anonymous spaces.
10776The loop AST generation type options and the isolate option
10777are split over the two band nodes.
10778
10779A band node can be moved down to the leaves of the subtree rooted
10780at the band node using the following function.
10781
10782	#include <isl/schedule_node.h>
10783	__isl_give isl_schedule_node *isl_schedule_node_band_sink(
10784		__isl_take isl_schedule_node *node);
10785
10786The subtree rooted at the given node is assumed not to have
10787any anchored nodes.
10788The result points to the node in the resulting tree that is in the same
10789position as the node pointed to by C<node> in the original tree.
10790
10791	#include <isl/schedule_node.h>
10792	__isl_give isl_schedule_node *
10793	isl_schedule_node_order_before(
10794		__isl_take isl_schedule_node *node,
10795		__isl_take isl_union_set *filter);
10796	__isl_give isl_schedule_node *
10797	isl_schedule_node_order_after(
10798		__isl_take isl_schedule_node *node,
10799		__isl_take isl_union_set *filter);
10800
10801These functions split the domain elements that reach C<node>
10802into those that satisfy C<filter> and those that do not and
10803arranges for the elements that do satisfy the filter to be
10804executed before (in case of C<isl_schedule_node_order_before>)
10805or after (in case of C<isl_schedule_node_order_after>)
10806those that do not.  The order is imposed by
10807a sequence node, possibly reusing the grandparent of C<node>
10808on two copies of the subtree attached to the original C<node>.
10809Both copies are simplified with respect to their filter.
10810
10811Return a pointer to the copy of the subtree that does not
10812satisfy C<filter>.  If there is no such copy (because all
10813reaching domain elements satisfy the filter), then return
10814the original pointer.
10815
10816	#include <isl/schedule_node.h>
10817	__isl_give isl_schedule_node *
10818	isl_schedule_node_graft_before(
10819		__isl_take isl_schedule_node *node,
10820		__isl_take isl_schedule_node *graft);
10821	__isl_give isl_schedule_node *
10822	isl_schedule_node_graft_after(
10823		__isl_take isl_schedule_node *node,
10824		__isl_take isl_schedule_node *graft);
10825
10826This function inserts the C<graft> tree into the tree containing C<node>
10827such that it is executed before (in case of C<isl_schedule_node_graft_before>)
10828or after (in case of C<isl_schedule_node_graft_after>) C<node>.
10829The root node of C<graft>
10830should be an extension node where the domain of the extension
10831is the flat product of all outer band nodes of C<node>.
10832The root node may also be a domain node.
10833The elements of the domain or the range of the extension may not
10834intersect with the domain elements that reach "node".
10835The schedule tree of C<graft> may not be anchored.
10836
10837The schedule tree of C<node> is modified to include an extension node
10838corresponding to the root node of C<graft> as a child of the original
10839parent of C<node>.  The original node that C<node> points to and the
10840child of the root node of C<graft> are attached to this extension node
10841through a sequence, with appropriate filters and with the child
10842of C<graft> appearing before or after the original C<node>.
10843
10844If C<node> already appears inside a sequence that is the child of
10845an extension node and if the spaces of the new domain elements
10846do not overlap with those of the original domain elements,
10847then that extension node is extended with the new extension
10848rather than introducing a new segment of extension and sequence nodes.
10849
10850Return a pointer to the same node in the modified tree that
10851C<node> pointed to in the original tree.
10852
10853A representation of the schedule node can be printed using
10854
10855	#include <isl/schedule_node.h>
10856	__isl_give isl_printer *isl_printer_print_schedule_node(
10857		__isl_take isl_printer *p,
10858		__isl_keep isl_schedule_node *node);
10859	__isl_give char *isl_schedule_node_to_str(
10860		__isl_keep isl_schedule_node *node);
10861
10862C<isl_schedule_node_to_str> prints the schedule node in block format.
10863
10864=head2 Dependence Analysis
10865
10866C<isl> contains specialized functionality for performing
10867array dataflow analysis.  That is, given a I<sink> access relation,
10868a collection of possible I<source> accesses and
10869a collection of I<kill> accesses,
10870C<isl> can compute relations that describe
10871for each iteration of the sink access, which iterations
10872of which of the source access relations may have
10873accessed the same data element before the given iteration
10874of the sink access without any intermediate kill of that data element.
10875The resulting dependence relations map source iterations
10876to either the corresponding sink iterations or
10877pairs of corresponding sink iterations and accessed data elements.
10878To compute standard flow dependences, the sink should be
10879a read, while the sources should be writes.
10880If no kills are specified,
10881then memory based dependence analysis is performed.
10882If, on the other hand, all sources are also kills,
10883then value based dependence analysis is performed.
10884If any of the source accesses are marked as being I<must>
10885accesses, then they are also treated as kills.
10886Furthermore, the specification of must-sources results
10887in the computation of must-dependences.
10888Only dependences originating in a must access not coscheduled
10889with any other access to the same element and without
10890any may accesses between the must access and the sink access
10891are considered to be must dependences.
10892
10893=head3 High-level Interface
10894
10895A high-level interface to dependence analysis is provided
10896by the following function.
10897
10898	#include <isl/flow.h>
10899	__isl_give isl_union_flow *
10900	isl_union_access_info_compute_flow(
10901		__isl_take isl_union_access_info *access);
10902
10903The input C<isl_union_access_info> object describes the sink
10904access relations, the source access relations and a schedule,
10905while the output C<isl_union_flow> object describes
10906the resulting dependence relations and the subsets of the
10907sink relations for which no source was found.
10908
10909An C<isl_union_access_info> is created, modified, copied and freed using
10910the following functions.
10911
10912	#include <isl/flow.h>
10913	__isl_give isl_union_access_info *
10914	isl_union_access_info_from_sink(
10915		__isl_take isl_union_map *sink);
10916	__isl_give isl_union_access_info *
10917	isl_union_access_info_set_kill(
10918		__isl_take isl_union_access_info *access,
10919		__isl_take isl_union_map *kill);
10920	__isl_give isl_union_access_info *
10921	isl_union_access_info_set_may_source(
10922		__isl_take isl_union_access_info *access,
10923		__isl_take isl_union_map *may_source);
10924	__isl_give isl_union_access_info *
10925	isl_union_access_info_set_must_source(
10926		__isl_take isl_union_access_info *access,
10927		__isl_take isl_union_map *must_source);
10928	__isl_give isl_union_access_info *
10929	isl_union_access_info_set_schedule(
10930		__isl_take isl_union_access_info *access,
10931		__isl_take isl_schedule *schedule);
10932	__isl_give isl_union_access_info *
10933	isl_union_access_info_set_schedule_map(
10934		__isl_take isl_union_access_info *access,
10935		__isl_take isl_union_map *schedule_map);
10936	__isl_give isl_union_access_info *
10937	isl_union_access_info_copy(
10938		__isl_keep isl_union_access_info *access);
10939	__isl_null isl_union_access_info *
10940	isl_union_access_info_free(
10941		__isl_take isl_union_access_info *access);
10942
10943The may sources set by C<isl_union_access_info_set_may_source>
10944do not need to include the must sources set by
10945C<isl_union_access_info_set_must_source> as a subset.
10946The kills set by C<isl_union_access_info_set_kill> may overlap
10947with the may-sources and/or must-sources.
10948The user is free not to call one (or more) of these functions,
10949in which case the corresponding set is kept to its empty default.
10950Similarly, the default schedule initialized by
10951C<isl_union_access_info_from_sink> is empty.
10952The current schedule is determined by the last call to either
10953C<isl_union_access_info_set_schedule> or
10954C<isl_union_access_info_set_schedule_map>.
10955The domain of the schedule corresponds to the domains of
10956the access relations.  In particular, the domains of the access
10957relations are effectively intersected with the domain of the schedule
10958and only the resulting accesses are considered by the dependence analysis.
10959
10960An C<isl_union_access_info> object can be read from input
10961using the following function.
10962
10963	#include <isl/flow.h>
10964	__isl_give isl_union_access_info *
10965	isl_union_access_info_read_from_file(isl_ctx *ctx,
10966		FILE *input);
10967
10968A representation of the information contained in an object
10969of type C<isl_union_access_info> can be obtained using
10970
10971	#include <isl/flow.h>
10972	__isl_give isl_printer *
10973	isl_printer_print_union_access_info(
10974		__isl_take isl_printer *p,
10975		__isl_keep isl_union_access_info *access);
10976	__isl_give char *isl_union_access_info_to_str(
10977		__isl_keep isl_union_access_info *access);
10978
10979C<isl_union_access_info_to_str> prints the information in flow format.
10980
10981The output of C<isl_union_access_info_compute_flow> can be examined,
10982copied, and freed using the following functions.
10983
10984	#include <isl/flow.h>
10985	__isl_give isl_union_map *isl_union_flow_get_must_dependence(
10986		__isl_keep isl_union_flow *flow);
10987	__isl_give isl_union_map *isl_union_flow_get_may_dependence(
10988		__isl_keep isl_union_flow *flow);
10989	__isl_give isl_union_map *
10990	isl_union_flow_get_full_must_dependence(
10991		__isl_keep isl_union_flow *flow);
10992	__isl_give isl_union_map *
10993	isl_union_flow_get_full_may_dependence(
10994		__isl_keep isl_union_flow *flow);
10995	__isl_give isl_union_map *isl_union_flow_get_must_no_source(
10996		__isl_keep isl_union_flow *flow);
10997	__isl_give isl_union_map *isl_union_flow_get_may_no_source(
10998		__isl_keep isl_union_flow *flow);
10999	__isl_give isl_union_flow *isl_union_flow_copy(
11000		__isl_keep isl_union_flow *flow);
11001	__isl_null isl_union_flow *isl_union_flow_free(
11002		__isl_take isl_union_flow *flow);
11003
11004The relation returned by C<isl_union_flow_get_must_dependence>
11005relates domain elements of must sources to domain elements of the sink.
11006The relation returned by C<isl_union_flow_get_may_dependence>
11007relates domain elements of must or may sources to domain elements of the sink
11008and includes the previous relation as a subset.
11009The relation returned by C<isl_union_flow_get_full_must_dependence>
11010relates domain elements of must sources to pairs of domain elements of the sink
11011and accessed data elements.
11012The relation returned by C<isl_union_flow_get_full_may_dependence>
11013relates domain elements of must or may sources to pairs of
11014domain elements of the sink and accessed data elements.
11015This relation includes the previous relation as a subset.
11016The relation returned by C<isl_union_flow_get_must_no_source> is the subset
11017of the sink relation for which no dependences have been found.
11018The relation returned by C<isl_union_flow_get_may_no_source> is the subset
11019of the sink relation for which no definite dependences have been found.
11020That is, it contains those sink access that do not contribute to any
11021of the elements in the relation returned
11022by C<isl_union_flow_get_must_dependence>.
11023
11024A representation of the information contained in an object
11025of type C<isl_union_flow> can be obtained using
11026
11027	#include <isl/flow.h>
11028	__isl_give isl_printer *isl_printer_print_union_flow(
11029		__isl_take isl_printer *p,
11030		__isl_keep isl_union_flow *flow);
11031	__isl_give char *isl_union_flow_to_str(
11032		__isl_keep isl_union_flow *flow);
11033
11034C<isl_union_flow_to_str> prints the information in flow format.
11035
11036=head3 Low-level Interface
11037
11038A lower-level interface is provided by the following functions.
11039
11040	#include <isl/flow.h>
11041
11042	typedef int (*isl_access_level_before)(void *first, void *second);
11043
11044	__isl_give isl_access_info *isl_access_info_alloc(
11045		__isl_take isl_map *sink,
11046		void *sink_user, isl_access_level_before fn,
11047		int max_source);
11048	__isl_give isl_access_info *isl_access_info_add_source(
11049		__isl_take isl_access_info *acc,
11050		__isl_take isl_map *source, int must,
11051		void *source_user);
11052	__isl_null isl_access_info *isl_access_info_free(
11053		__isl_take isl_access_info *acc);
11054
11055	__isl_give isl_flow *isl_access_info_compute_flow(
11056		__isl_take isl_access_info *acc);
11057
11058	isl_stat isl_flow_foreach(__isl_keep isl_flow *deps,
11059		isl_stat (*fn)(__isl_take isl_map *dep, int must,
11060			  void *dep_user, void *user),
11061		void *user);
11062	__isl_give isl_map *isl_flow_get_no_source(
11063		__isl_keep isl_flow *deps, int must);
11064	__isl_null isl_flow *isl_flow_free(
11065		__isl_take isl_flow *deps);
11066
11067The function C<isl_access_info_compute_flow> performs the actual
11068dependence analysis.  The other functions are used to construct
11069the input for this function or to read off the output.
11070
11071The input is collected in an C<isl_access_info>, which can
11072be created through a call to C<isl_access_info_alloc>.
11073The arguments to this functions are the sink access relation
11074C<sink>, a token C<sink_user> used to identify the sink
11075access to the user, a callback function for specifying the
11076relative order of source and sink accesses, and the number
11077of source access relations that will be added.
11078
11079The callback function has type C<int (*)(void *first, void *second)>.
11080The function is called with two user supplied tokens identifying
11081either a source or the sink and it should return the shared nesting
11082level and the relative order of the two accesses.
11083In particular, let I<n> be the number of loops shared by
11084the two accesses.  If C<first> precedes C<second> textually,
11085then the function should return I<2 * n + 1>; otherwise,
11086it should return I<2 * n>.
11087The low-level interface assumes that no sources are coscheduled.
11088If the information returned by the callback does not allow
11089the relative order to be determined, then one of the sources
11090is arbitrarily taken to be executed after the other(s).
11091
11092The sources can be added to the C<isl_access_info> object by performing
11093(at most) C<max_source> calls to C<isl_access_info_add_source>.
11094C<must> indicates whether the source is a I<must> access
11095or a I<may> access.  Note that a multi-valued access relation
11096should only be marked I<must> if every iteration in the domain
11097of the relation accesses I<all> elements in its image.
11098The C<source_user> token is again used to identify
11099the source access.  The range of the source access relation
11100C<source> should have the same dimension as the range
11101of the sink access relation.
11102The C<isl_access_info_free> function should usually not be
11103called explicitly, because it is already called implicitly by
11104C<isl_access_info_compute_flow>.
11105
11106The result of the dependence analysis is collected in an
11107C<isl_flow>.  There may be elements of
11108the sink access for which no preceding source access could be
11109found or for which all preceding sources are I<may> accesses.
11110The relations containing these elements can be obtained through
11111calls to C<isl_flow_get_no_source>, the first with C<must> set
11112and the second with C<must> unset.
11113In the case of standard flow dependence analysis,
11114with the sink a read and the sources I<must> writes,
11115the first relation corresponds to the reads from uninitialized
11116array elements and the second relation is empty.
11117The actual flow dependences can be extracted using
11118C<isl_flow_foreach>.  This function will call the user-specified
11119callback function C<fn> for each B<non-empty> dependence between
11120a source and the sink.  The callback function is called
11121with four arguments, the actual flow dependence relation
11122mapping source iterations to sink iterations, a boolean that
11123indicates whether it is a I<must> or I<may> dependence, a token
11124identifying the source and an additional C<void *> with value
11125equal to the third argument of the C<isl_flow_foreach> call.
11126A dependence is marked I<must> if it originates from a I<must>
11127source and if it is not followed by any I<may> sources.
11128
11129After finishing with an C<isl_flow>, the user should call
11130C<isl_flow_free> to free all associated memory.
11131
11132=head3 Interaction with the Low-level Interface
11133
11134During the dependence analysis, we frequently need to perform
11135the following operation.  Given a relation between sink iterations
11136and potential source iterations from a particular source domain,
11137what is the last potential source iteration corresponding to each
11138sink iteration.  It can sometimes be convenient to adjust
11139the set of potential source iterations before or after each such operation.
11140The prototypical example is fuzzy array dataflow analysis,
11141where we need to analyze if, based on data-dependent constraints,
11142the sink iteration can ever be executed without one or more of
11143the corresponding potential source iterations being executed.
11144If so, we can introduce extra parameters and select an unknown
11145but fixed source iteration from the potential source iterations.
11146To be able to perform such manipulations, C<isl> provides the following
11147function.
11148
11149	#include <isl/flow.h>
11150
11151	typedef __isl_give isl_restriction *(*isl_access_restrict)(
11152		__isl_keep isl_map *source_map,
11153		__isl_keep isl_set *sink, void *source_user,
11154		void *user);
11155	__isl_give isl_access_info *isl_access_info_set_restrict(
11156		__isl_take isl_access_info *acc,
11157		isl_access_restrict fn, void *user);
11158
11159The function C<isl_access_info_set_restrict> should be called
11160before calling C<isl_access_info_compute_flow> and registers a callback function
11161that will be called any time C<isl> is about to compute the last
11162potential source.  The first argument is the (reverse) proto-dependence,
11163mapping sink iterations to potential source iterations.
11164The second argument represents the sink iterations for which
11165we want to compute the last source iteration.
11166The third argument is the token corresponding to the source
11167and the final argument is the token passed to C<isl_access_info_set_restrict>.
11168The callback is expected to return a restriction on either the input or
11169the output of the operation computing the last potential source.
11170If the input needs to be restricted then restrictions are needed
11171for both the source and the sink iterations.  The sink iterations
11172and the potential source iterations will be intersected with these sets.
11173If the output needs to be restricted then only a restriction on the source
11174iterations is required.
11175If any error occurs, the callback should return C<NULL>.
11176An C<isl_restriction> object can be created, freed and inspected
11177using the following functions.
11178
11179	#include <isl/flow.h>
11180
11181	__isl_give isl_restriction *isl_restriction_input(
11182		__isl_take isl_set *source_restr,
11183		__isl_take isl_set *sink_restr);
11184	__isl_give isl_restriction *isl_restriction_output(
11185		__isl_take isl_set *source_restr);
11186	__isl_give isl_restriction *isl_restriction_none(
11187		__isl_take isl_map *source_map);
11188	__isl_give isl_restriction *isl_restriction_empty(
11189		__isl_take isl_map *source_map);
11190	__isl_null isl_restriction *isl_restriction_free(
11191		__isl_take isl_restriction *restr);
11192
11193C<isl_restriction_none> and C<isl_restriction_empty> are special
11194cases of C<isl_restriction_input>.  C<isl_restriction_none>
11195is essentially equivalent to
11196
11197	isl_restriction_input(isl_set_universe(
11198	    isl_space_range(isl_map_get_space(source_map))),
11199			    isl_set_universe(
11200	    isl_space_domain(isl_map_get_space(source_map))));
11201
11202whereas C<isl_restriction_empty> is essentially equivalent to
11203
11204	isl_restriction_input(isl_set_empty(
11205	    isl_space_range(isl_map_get_space(source_map))),
11206			    isl_set_universe(
11207	    isl_space_domain(isl_map_get_space(source_map))));
11208
11209=head2 Scheduling
11210
11211	#include <isl/schedule.h>
11212	__isl_give isl_schedule *
11213	isl_schedule_constraints_compute_schedule(
11214		__isl_take isl_schedule_constraints *sc);
11215
11216The function C<isl_schedule_constraints_compute_schedule> can be
11217used to compute a schedule that satisfies the given schedule constraints.
11218These schedule constraints include the iteration domain for which
11219a schedule should be computed and dependences between pairs of
11220iterations.  In particular, these dependences include
11221I<validity> dependences and I<proximity> dependences.
11222By default, the algorithm used to construct the schedule is similar
11223to that of C<Pluto>.
11224Alternatively, Feautrier's multi-dimensional scheduling algorithm can
11225be selected.
11226The generated schedule respects all validity dependences.
11227That is, all dependence distances over these dependences in the
11228scheduled space are lexicographically positive.
11229
11230The default algorithm tries to ensure that the dependence distances
11231over coincidence constraints are zero and to minimize the
11232dependence distances over proximity dependences.
11233Moreover, it tries to obtain sequences (bands) of schedule dimensions
11234for groups of domains where the dependence distances over validity
11235dependences have only non-negative values.
11236Note that when minimizing the maximal dependence distance
11237over proximity dependences, a single affine expression in the parameters
11238is constructed that bounds all dependence distances.  If no such expression
11239exists, then the algorithm will fail and resort to an alternative
11240scheduling algorithm.  In particular, this means that adding proximity
11241dependences may eliminate valid solutions.  A typical example where this
11242phenomenon may occur is when some subset of the proximity dependences
11243has no restriction on some parameter, forcing the coefficient of that
11244parameter to be zero, while some other subset forces the dependence
11245distance to depend on that parameter, requiring the same coefficient
11246to be non-zero.
11247When using Feautrier's algorithm, the coincidence and proximity constraints
11248are only taken into account during the extension to a
11249full-dimensional schedule.
11250
11251An C<isl_schedule_constraints> object can be constructed
11252and manipulated using the following functions.
11253
11254	#include <isl/schedule.h>
11255	__isl_give isl_schedule_constraints *
11256	isl_schedule_constraints_copy(
11257		__isl_keep isl_schedule_constraints *sc);
11258	__isl_give isl_schedule_constraints *
11259	isl_schedule_constraints_on_domain(
11260		__isl_take isl_union_set *domain);
11261	__isl_give isl_schedule_constraints *
11262	isl_schedule_constraints_set_context(
11263		__isl_take isl_schedule_constraints *sc,
11264		__isl_take isl_set *context);
11265	__isl_give isl_schedule_constraints *
11266	isl_schedule_constraints_set_validity(
11267		__isl_take isl_schedule_constraints *sc,
11268		__isl_take isl_union_map *validity);
11269	__isl_give isl_schedule_constraints *
11270	isl_schedule_constraints_set_coincidence(
11271		__isl_take isl_schedule_constraints *sc,
11272		__isl_take isl_union_map *coincidence);
11273	__isl_give isl_schedule_constraints *
11274	isl_schedule_constraints_set_proximity(
11275		__isl_take isl_schedule_constraints *sc,
11276		__isl_take isl_union_map *proximity);
11277	__isl_give isl_schedule_constraints *
11278	isl_schedule_constraints_set_conditional_validity(
11279		__isl_take isl_schedule_constraints *sc,
11280		__isl_take isl_union_map *condition,
11281		__isl_take isl_union_map *validity);
11282	__isl_give isl_schedule_constraints *
11283	isl_schedule_constraints_apply(
11284		__isl_take isl_schedule_constraints *sc,
11285		__isl_take isl_union_map *umap);
11286	__isl_null isl_schedule_constraints *
11287	isl_schedule_constraints_free(
11288		__isl_take isl_schedule_constraints *sc);
11289
11290The initial C<isl_schedule_constraints> object created by
11291C<isl_schedule_constraints_on_domain> does not impose any constraints.
11292That is, it has an empty set of dependences.
11293The function C<isl_schedule_constraints_set_context> allows the user
11294to specify additional constraints on the parameters that may
11295be assumed to hold during the construction of the schedule.
11296The function C<isl_schedule_constraints_set_validity> replaces the
11297validity dependences, mapping domain elements I<i> to domain
11298elements that should be scheduled after I<i>.
11299The function C<isl_schedule_constraints_set_coincidence> replaces the
11300coincidence dependences, mapping domain elements I<i> to domain
11301elements that should be scheduled together with I<I>, if possible.
11302The function C<isl_schedule_constraints_set_proximity> replaces the
11303proximity dependences, mapping domain elements I<i> to domain
11304elements that should be scheduled either before I<I>
11305or as early as possible after I<i>.
11306
11307The function C<isl_schedule_constraints_set_conditional_validity>
11308replaces the conditional validity constraints.
11309A conditional validity constraint is only imposed when any of the corresponding
11310conditions is satisfied, i.e., when any of them is non-zero.
11311That is, the scheduler ensures that within each band if the dependence
11312distances over the condition constraints are not all zero
11313then all corresponding conditional validity constraints are respected.
11314A conditional validity constraint corresponds to a condition
11315if the two are adjacent, i.e., if the domain of one relation intersect
11316the range of the other relation.
11317The typical use case of conditional validity constraints is
11318to allow order constraints between live ranges to be violated
11319as long as the live ranges themselves are local to the band.
11320To allow more fine-grained control over which conditions correspond
11321to which conditional validity constraints, the domains and ranges
11322of these relations may include I<tags>.  That is, the domains and
11323ranges of those relation may themselves be wrapped relations
11324where the iteration domain appears in the domain of those wrapped relations
11325and the range of the wrapped relations can be arbitrarily chosen
11326by the user.  Conditions and conditional validity constraints are only
11327considered adjacent to each other if the entire wrapped relation matches.
11328In particular, a relation with a tag will never be considered adjacent
11329to a relation without a tag.
11330
11331The function C<isl_schedule_constraints_apply> takes
11332schedule constraints that are defined on some set of domain elements
11333and transforms them to schedule constraints on the elements
11334to which these domain elements are mapped by the given transformation.
11335
11336An C<isl_schedule_constraints> object can be inspected
11337using the following functions.
11338
11339	#include <isl/schedule.h>
11340	__isl_give isl_union_set *
11341	isl_schedule_constraints_get_domain(
11342		__isl_keep isl_schedule_constraints *sc);
11343	__isl_give isl_set *isl_schedule_constraints_get_context(
11344		__isl_keep isl_schedule_constraints *sc);
11345	__isl_give isl_union_map *
11346	isl_schedule_constraints_get_validity(
11347		__isl_keep isl_schedule_constraints *sc);
11348	__isl_give isl_union_map *
11349	isl_schedule_constraints_get_coincidence(
11350		__isl_keep isl_schedule_constraints *sc);
11351	__isl_give isl_union_map *
11352	isl_schedule_constraints_get_proximity(
11353		__isl_keep isl_schedule_constraints *sc);
11354	__isl_give isl_union_map *
11355	isl_schedule_constraints_get_conditional_validity(
11356		__isl_keep isl_schedule_constraints *sc);
11357	__isl_give isl_union_map *
11358	isl_schedule_constraints_get_conditional_validity_condition(
11359		__isl_keep isl_schedule_constraints *sc);
11360
11361An C<isl_schedule_constraints> object can be read from input
11362using the following functions.
11363
11364	#include <isl/schedule.h>
11365	__isl_give isl_schedule_constraints *
11366	isl_schedule_constraints_read_from_str(isl_ctx *ctx,
11367		const char *str);
11368	__isl_give isl_schedule_constraints *
11369	isl_schedule_constraints_read_from_file(isl_ctx *ctx,
11370		FILE *input);
11371
11372The contents of an C<isl_schedule_constraints> object can be printed
11373using the following functions.
11374
11375	#include <isl/schedule.h>
11376	__isl_give isl_printer *
11377	isl_printer_print_schedule_constraints(
11378		__isl_take isl_printer *p,
11379		__isl_keep isl_schedule_constraints *sc);
11380	__isl_give char *isl_schedule_constraints_to_str(
11381		__isl_keep isl_schedule_constraints *sc);
11382
11383The following function computes a schedule directly from
11384an iteration domain and validity and proximity dependences
11385and is implemented in terms of the functions described above.
11386The use of C<isl_union_set_compute_schedule> is discouraged.
11387
11388	#include <isl/schedule.h>
11389	__isl_give isl_schedule *isl_union_set_compute_schedule(
11390		__isl_take isl_union_set *domain,
11391		__isl_take isl_union_map *validity,
11392		__isl_take isl_union_map *proximity);
11393
11394The generated schedule represents a schedule tree.
11395For more information on schedule trees, see
11396L</"Schedule Trees">.
11397
11398=head3 Options
11399
11400	#include <isl/schedule.h>
11401	isl_stat isl_options_set_schedule_max_coefficient(
11402		isl_ctx *ctx, int val);
11403	int isl_options_get_schedule_max_coefficient(
11404		isl_ctx *ctx);
11405	isl_stat isl_options_set_schedule_max_constant_term(
11406		isl_ctx *ctx, int val);
11407	int isl_options_get_schedule_max_constant_term(
11408		isl_ctx *ctx);
11409	isl_stat isl_options_set_schedule_serialize_sccs(
11410		isl_ctx *ctx, int val);
11411	int isl_options_get_schedule_serialize_sccs(isl_ctx *ctx);
11412	isl_stat isl_options_set_schedule_whole_component(
11413		isl_ctx *ctx, int val);
11414	int isl_options_get_schedule_whole_component(
11415		isl_ctx *ctx);
11416	isl_stat isl_options_set_schedule_maximize_band_depth(
11417		isl_ctx *ctx, int val);
11418	int isl_options_get_schedule_maximize_band_depth(
11419		isl_ctx *ctx);
11420	isl_stat isl_options_set_schedule_maximize_coincidence(
11421		isl_ctx *ctx, int val);
11422	int isl_options_get_schedule_maximize_coincidence(
11423		isl_ctx *ctx);
11424	isl_stat isl_options_set_schedule_outer_coincidence(
11425		isl_ctx *ctx, int val);
11426	int isl_options_get_schedule_outer_coincidence(
11427		isl_ctx *ctx);
11428	isl_stat isl_options_set_schedule_split_scaled(
11429		isl_ctx *ctx, int val);
11430	int isl_options_get_schedule_split_scaled(
11431		isl_ctx *ctx);
11432	isl_stat isl_options_set_schedule_treat_coalescing(
11433		isl_ctx *ctx, int val);
11434	int isl_options_get_schedule_treat_coalescing(
11435		isl_ctx *ctx);
11436	isl_stat isl_options_set_schedule_algorithm(
11437		isl_ctx *ctx, int val);
11438	int isl_options_get_schedule_algorithm(
11439		isl_ctx *ctx);
11440	isl_stat isl_options_set_schedule_carry_self_first(
11441		isl_ctx *ctx, int val);
11442	int isl_options_get_schedule_carry_self_first(
11443		isl_ctx *ctx);
11444	isl_stat isl_options_set_schedule_separate_components(
11445		isl_ctx *ctx, int val);
11446	int isl_options_get_schedule_separate_components(
11447		isl_ctx *ctx);
11448
11449=over
11450
11451=item * schedule_max_coefficient
11452
11453This option enforces that the coefficients for variable and parameter
11454dimensions in the calculated schedule are not larger than the specified value.
11455This option can significantly increase the speed of the scheduling calculation
11456and may also prevent fusing of unrelated dimensions. A value of -1 means that
11457this option does not introduce bounds on the variable or parameter
11458coefficients.
11459This option has no effect on the Feautrier style scheduler.
11460
11461=item * schedule_max_constant_term
11462
11463This option enforces that the constant coefficients in the calculated schedule
11464are not larger than the maximal constant term. This option can significantly
11465increase the speed of the scheduling calculation and may also prevent fusing of
11466unrelated dimensions. A value of -1 means that this option does not introduce
11467bounds on the constant coefficients.
11468
11469=item * schedule_serialize_sccs
11470
11471If this option is set, then all strongly connected components
11472in the dependence graph are serialized as soon as they are detected.
11473This means in particular that instances of statements will only
11474appear in the same band node if these statements belong
11475to the same strongly connected component at the point where
11476the band node is constructed.
11477
11478=item * schedule_whole_component
11479
11480If this option is set, then entire (weakly) connected
11481components in the dependence graph are scheduled together
11482as a whole.
11483Otherwise, each strongly connected component within
11484such a weakly connected component is first scheduled separately
11485and then combined with other strongly connected components.
11486This option has no effect if C<schedule_serialize_sccs> is set.
11487
11488=item * schedule_maximize_band_depth
11489
11490If this option is set, then the scheduler tries to maximize
11491the width of the bands.  Wider bands give more possibilities for tiling.
11492In particular, if the C<schedule_whole_component> option is set,
11493then bands are split if this might result in wider bands.
11494Otherwise, the effect of this option is to only allow
11495strongly connected components to be combined if this does
11496not reduce the width of the bands.
11497Note that if the C<schedule_serialize_sccs> options is set, then
11498the C<schedule_maximize_band_depth> option therefore has no effect.
11499
11500=item * schedule_maximize_coincidence
11501
11502This option is only effective if the C<schedule_whole_component>
11503option is turned off.
11504If the C<schedule_maximize_coincidence> option is set, then (clusters of)
11505strongly connected components are only combined with each other
11506if this does not reduce the number of coincident band members.
11507
11508=item * schedule_outer_coincidence
11509
11510If this option is set, then we try to construct schedules
11511where the outermost scheduling dimension in each band
11512satisfies the coincidence constraints.
11513
11514=item * schedule_algorithm
11515
11516Selects the scheduling algorithm to be used.
11517Available scheduling algorithms are C<ISL_SCHEDULE_ALGORITHM_ISL>
11518and C<ISL_SCHEDULE_ALGORITHM_FEAUTRIER>.
11519
11520=item * schedule_split_scaled
11521
11522If this option is set, then we try to construct schedules in which the
11523constant term is split off from the linear part if the linear parts of
11524the scheduling rows for all nodes in the graph have a common non-trivial
11525divisor.
11526The constant term is then dropped and the linear
11527part is reduced.
11528This option is only effective when the Feautrier style scheduler is
11529being used, either as the main scheduler or as a fallback for the
11530Pluto-like scheduler.
11531
11532=item * schedule_treat_coalescing
11533
11534If this option is set, then the scheduler will try and avoid
11535producing schedules that perform loop coalescing.
11536In particular, for the Pluto-like scheduler, this option places
11537bounds on the schedule coefficients based on the sizes of the instance sets.
11538For the Feautrier style scheduler, this option detects potentially
11539coalescing schedules and then tries to adjust the schedule to avoid
11540the coalescing.
11541
11542=item * schedule_carry_self_first
11543
11544If this option is set, then the Feautrier style scheduler
11545(when used as a fallback for the Pluto-like scheduler) will
11546first try to only carry self-dependences.
11547
11548=item * schedule_separate_components
11549
11550If this option is set then the function C<isl_schedule_get_map>
11551will treat set nodes in the same way as sequence nodes.
11552
11553=back
11554
11555=head2 AST Generation
11556
11557This section describes the C<isl> functionality for generating
11558ASTs that visit all the elements
11559in a domain in an order specified by a schedule tree or
11560a schedule map.
11561In case the schedule given as a C<isl_union_map>, an AST is generated
11562that visits all the elements in the domain of the C<isl_union_map>
11563according to the lexicographic order of the corresponding image
11564element(s).  If the range of the C<isl_union_map> consists of
11565elements in more than one space, then each of these spaces is handled
11566separately in an arbitrary order.
11567It should be noted that the schedule tree or the image elements
11568in a schedule map only specify the I<order>
11569in which the corresponding domain elements should be visited.
11570No direct relation between the partial schedule values
11571or the image elements on the one hand and the loop iterators
11572in the generated AST on the other hand should be assumed.
11573
11574Each AST is generated within a build.  The initial build
11575simply specifies the constraints on the parameters (if any)
11576and can be created, inspected, copied and freed using the following functions.
11577
11578	#include <isl/ast_build.h>
11579	__isl_give isl_ast_build *isl_ast_build_alloc(
11580		isl_ctx *ctx);
11581	__isl_give isl_ast_build *isl_ast_build_from_context(
11582		__isl_take isl_set *set);
11583	__isl_give isl_ast_build *isl_ast_build_copy(
11584		__isl_keep isl_ast_build *build);
11585	__isl_null isl_ast_build *isl_ast_build_free(
11586		__isl_take isl_ast_build *build);
11587
11588The C<set> argument is usually a parameter set with zero or more parameters.
11589In fact, when creating an AST using C<isl_ast_build_node_from_schedule>,
11590this set is required to be a parameter set.
11591An C<isl_ast_build> created using C<isl_ast_build_alloc> does not
11592specify any parameter constraints.
11593More C<isl_ast_build> functions are described in L</"Nested AST Generation">
11594and L</"Fine-grained Control over AST Generation">.
11595Finally, the AST itself can be constructed using one of the following
11596functions.
11597
11598	#include <isl/ast_build.h>
11599	__isl_give isl_ast_node *isl_ast_build_node_from_schedule(
11600		__isl_keep isl_ast_build *build,
11601		__isl_take isl_schedule *schedule);
11602	__isl_give isl_ast_node *
11603	isl_ast_build_node_from_schedule_map(
11604		__isl_keep isl_ast_build *build,
11605		__isl_take isl_union_map *schedule);
11606
11607=head3 Inspecting the AST
11608
11609The basic properties of an AST node can be obtained as follows.
11610
11611	#include <isl/ast.h>
11612	enum isl_ast_node_type isl_ast_node_get_type(
11613		__isl_keep isl_ast_node *node);
11614
11615The type of an AST node is one of
11616C<isl_ast_node_for>,
11617C<isl_ast_node_if>,
11618C<isl_ast_node_block>,
11619C<isl_ast_node_mark> or
11620C<isl_ast_node_user>.
11621An C<isl_ast_node_for> represents a for node.
11622An C<isl_ast_node_if> represents an if node.
11623An C<isl_ast_node_block> represents a compound node.
11624An C<isl_ast_node_mark> introduces a mark in the AST.
11625An C<isl_ast_node_user> represents an expression statement.
11626An expression statement typically corresponds to a domain element, i.e.,
11627one of the elements that is visited by the AST.
11628
11629Each type of node has its own additional properties.
11630
11631	#include <isl/ast.h>
11632	__isl_give isl_ast_expr *isl_ast_node_for_get_iterator(
11633		__isl_keep isl_ast_node *node);
11634	__isl_give isl_ast_expr *isl_ast_node_for_get_init(
11635		__isl_keep isl_ast_node *node);
11636	__isl_give isl_ast_expr *isl_ast_node_for_get_cond(
11637		__isl_keep isl_ast_node *node);
11638	__isl_give isl_ast_expr *isl_ast_node_for_get_inc(
11639		__isl_keep isl_ast_node *node);
11640	__isl_give isl_ast_node *isl_ast_node_for_get_body(
11641		__isl_keep isl_ast_node *node);
11642	isl_bool isl_ast_node_for_is_degenerate(
11643		__isl_keep isl_ast_node *node);
11644
11645An C<isl_ast_for> is considered degenerate if it is known to execute
11646exactly once.
11647
11648	#include <isl/ast.h>
11649	__isl_give isl_ast_expr *isl_ast_node_if_get_cond(
11650		__isl_keep isl_ast_node *node);
11651	__isl_give isl_ast_node *isl_ast_node_if_get_then_node(
11652		__isl_keep isl_ast_node *node);
11653	__isl_give isl_ast_node *isl_ast_node_if_get_then(
11654		__isl_keep isl_ast_node *node);
11655	isl_bool isl_ast_node_if_has_else_node(
11656		__isl_keep isl_ast_node *node);
11657	isl_bool isl_ast_node_if_has_else(
11658		__isl_keep isl_ast_node *node);
11659	__isl_give isl_ast_node *isl_ast_node_if_get_else_node(
11660		__isl_keep isl_ast_node *node);
11661	__isl_give isl_ast_node *isl_ast_node_if_get_else(
11662		__isl_keep isl_ast_node *node);
11663
11664C<isl_ast_node_if_get_then>,
11665C<isl_ast_node_if_has_else> and
11666C<isl_ast_node_if_get_else>
11667are alternative names for
11668C<isl_ast_node_if_get_then_node>,
11669C<isl_ast_node_if_has_else_node> and
11670C<isl_ast_node_if_get_else_node>, respectively.
11671
11672	__isl_give isl_ast_node_list *
11673	isl_ast_node_block_get_children(
11674		__isl_keep isl_ast_node *node);
11675
11676	__isl_give isl_id *isl_ast_node_mark_get_id(
11677		__isl_keep isl_ast_node *node);
11678	__isl_give isl_ast_node *isl_ast_node_mark_get_node(
11679		__isl_keep isl_ast_node *node);
11680
11681C<isl_ast_node_mark_get_id> returns the identifier of the mark.
11682C<isl_ast_node_mark_get_node> returns the child node that is being marked.
11683
11684	#include <isl/ast.h>
11685	__isl_give isl_ast_expr *isl_ast_node_user_get_expr(
11686		__isl_keep isl_ast_node *node);
11687
11688All descendants of a specific node in the AST (including the node itself)
11689can be visited
11690in depth-first pre-order using the following function.
11691
11692	#include <isl/ast.h>
11693	isl_stat isl_ast_node_foreach_descendant_top_down(
11694		__isl_keep isl_ast_node *node,
11695		isl_bool (*fn)(__isl_keep isl_ast_node *node,
11696			void *user), void *user);
11697
11698The callback function should return C<isl_bool_true> if the children
11699of the given node should be visited and C<isl_bool_false> if they should not.
11700It should return C<isl_bool_error> in case of failure, in which case
11701the entire traversal is aborted.
11702
11703Each of the returned C<isl_ast_expr>s can in turn be inspected using
11704the following functions.
11705
11706	#include <isl/ast.h>
11707	enum isl_ast_expr_type isl_ast_expr_get_type(
11708		__isl_keep isl_ast_expr *expr);
11709
11710The type of an AST expression is one of
11711C<isl_ast_expr_op>,
11712C<isl_ast_expr_id> or
11713C<isl_ast_expr_int>.
11714An C<isl_ast_expr_op> represents the result of an operation.
11715An C<isl_ast_expr_id> represents an identifier.
11716An C<isl_ast_expr_int> represents an integer value.
11717
11718Each type of expression has its own additional properties.
11719
11720	#include <isl/ast.h>
11721	enum isl_ast_expr_op_type isl_ast_expr_op_get_type(
11722		__isl_keep isl_ast_expr *expr);
11723	enum isl_ast_expr_op_type isl_ast_expr_get_op_type(
11724		__isl_keep isl_ast_expr *expr);
11725	isl_size isl_ast_expr_op_get_n_arg(__isl_keep isl_ast_expr *expr);
11726	isl_size isl_ast_expr_get_op_n_arg(__isl_keep isl_ast_expr *expr);
11727	__isl_give isl_ast_expr *isl_ast_expr_op_get_arg(
11728		__isl_keep isl_ast_expr *expr, int pos);
11729	__isl_give isl_ast_expr *isl_ast_expr_get_op_arg(
11730		__isl_keep isl_ast_expr *expr, int pos);
11731	isl_stat isl_ast_expr_foreach_ast_expr_op_type(
11732		__isl_keep isl_ast_expr *expr,
11733		isl_stat (*fn)(enum isl_ast_expr_op_type type,
11734			void *user), void *user);
11735	isl_stat isl_ast_expr_foreach_ast_op_type(
11736		__isl_keep isl_ast_expr *expr,
11737		isl_stat (*fn)(enum isl_ast_expr_op_type type,
11738			void *user), void *user);
11739	isl_stat isl_ast_node_foreach_ast_expr_op_type(
11740		__isl_keep isl_ast_node *node,
11741		isl_stat (*fn)(enum isl_ast_expr_op_type type,
11742			void *user), void *user);
11743	isl_stat isl_ast_node_foreach_ast_op_type(
11744		__isl_keep isl_ast_node *node,
11745		isl_stat (*fn)(enum isl_ast_expr_op_type type,
11746			void *user), void *user);
11747
11748C<isl_ast_expr_op_get_type> returns the type of the operation
11749performed.  C<isl_ast_expr_op_get_n_arg> returns the number of
11750arguments.  C<isl_ast_expr_get_op_arg> returns the specified
11751argument.
11752C<isl_ast_expr_get_op_type> is an alternative name for
11753C<isl_ast_expr_op_get_type>.
11754Similarly,
11755C<isl_ast_expr_get_op_n_arg> is an alternative name for
11756C<isl_ast_expr_op_get_n_arg> and
11757C<isl_ast_expr_get_op_arg> is an alternative name for
11758C<isl_ast_expr_op_get_arg>.
11759
11760C<isl_ast_expr_foreach_ast_expr_op_type> calls C<fn> for each distinct
11761C<isl_ast_expr_op_type> that appears in C<expr>.
11762C<isl_ast_expr_foreach_ast_op_type> is an alternative name for
11763C<isl_ast_expr_foreach_ast_expr_op_type>.
11764C<isl_ast_node_foreach_ast_expr_op_type> does the same for each distinct
11765C<isl_ast_expr_op_type> that appears in C<node>.
11766C<isl_ast_node_foreach_ast_op_type> is an alternative name for
11767C<isl_ast_node_foreach_ast_expr_op_type>.
11768The operation type is one of the following.
11769
11770=over
11771
11772=item C<isl_ast_expr_op_and>
11773
11774Logical I<and> of two arguments.
11775Both arguments can be evaluated.
11776
11777=item C<isl_ast_expr_op_and_then>
11778
11779Logical I<and> of two arguments.
11780The second argument can only be evaluated if the first evaluates to true.
11781
11782=item C<isl_ast_expr_op_or>
11783
11784Logical I<or> of two arguments.
11785Both arguments can be evaluated.
11786
11787=item C<isl_ast_expr_op_or_else>
11788
11789Logical I<or> of two arguments.
11790The second argument can only be evaluated if the first evaluates to false.
11791
11792=item C<isl_ast_expr_op_max>
11793
11794Maximum of two or more arguments.
11795
11796=item C<isl_ast_expr_op_min>
11797
11798Minimum of two or more arguments.
11799
11800=item C<isl_ast_expr_op_minus>
11801
11802Change sign.
11803
11804=item C<isl_ast_expr_op_add>
11805
11806Sum of two arguments.
11807
11808=item C<isl_ast_expr_op_sub>
11809
11810Difference of two arguments.
11811
11812=item C<isl_ast_expr_op_mul>
11813
11814Product of two arguments.
11815
11816=item C<isl_ast_expr_op_div>
11817
11818Exact division.  That is, the result is known to be an integer.
11819
11820=item C<isl_ast_expr_op_fdiv_q>
11821
11822Result of integer division, rounded towards negative
11823infinity.
11824The divisor is known to be positive.
11825
11826=item C<isl_ast_expr_op_pdiv_q>
11827
11828Result of integer division, where dividend is known to be non-negative.
11829The divisor is known to be positive.
11830
11831=item C<isl_ast_expr_op_pdiv_r>
11832
11833Remainder of integer division, where dividend is known to be non-negative.
11834The divisor is known to be positive.
11835
11836=item C<isl_ast_expr_op_zdiv_r>
11837
11838Equal to zero iff the remainder on integer division is zero.
11839The divisor is known to be positive.
11840
11841=item C<isl_ast_expr_op_cond>
11842
11843Conditional operator defined on three arguments.
11844If the first argument evaluates to true, then the result
11845is equal to the second argument.  Otherwise, the result
11846is equal to the third argument.
11847The second and third argument may only be evaluated if
11848the first argument evaluates to true and false, respectively.
11849Corresponds to C<a ? b : c> in C.
11850
11851=item C<isl_ast_expr_op_select>
11852
11853Conditional operator defined on three arguments.
11854If the first argument evaluates to true, then the result
11855is equal to the second argument.  Otherwise, the result
11856is equal to the third argument.
11857The second and third argument may be evaluated independently
11858of the value of the first argument.
11859Corresponds to C<a * b + (1 - a) * c> in C.
11860
11861=item C<isl_ast_expr_op_eq>
11862
11863Equality relation.
11864
11865=item C<isl_ast_expr_op_le>
11866
11867Less than or equal relation.
11868
11869=item C<isl_ast_expr_op_lt>
11870
11871Less than relation.
11872
11873=item C<isl_ast_expr_op_ge>
11874
11875Greater than or equal relation.
11876
11877=item C<isl_ast_expr_op_gt>
11878
11879Greater than relation.
11880
11881=item C<isl_ast_expr_op_call>
11882
11883A function call.
11884The number of arguments of the C<isl_ast_expr> is one more than
11885the number of arguments in the function call, the first argument
11886representing the function being called.
11887
11888=item C<isl_ast_expr_op_access>
11889
11890An array access.
11891The number of arguments of the C<isl_ast_expr> is one more than
11892the number of index expressions in the array access, the first argument
11893representing the array being accessed.
11894
11895=item C<isl_ast_expr_op_member>
11896
11897A member access.
11898This operation has two arguments, a structure and the name of
11899the member of the structure being accessed.
11900
11901=item C<isl_ast_expr_op_address_of>
11902
11903The address of its single argument, which is always an array access.
11904
11905=back
11906
11907	#include <isl/ast.h>
11908	__isl_give isl_id *isl_ast_expr_id_get_id(
11909		__isl_keep isl_ast_expr *expr);
11910	__isl_give isl_id *isl_ast_expr_get_id(
11911		__isl_keep isl_ast_expr *expr);
11912
11913Return the identifier represented by the AST expression.
11914C<isl_ast_expr_get_id> is an alternative name for
11915C<isl_ast_expr_id_get_id>.
11916
11917	#include <isl/ast.h>
11918	__isl_give isl_val *isl_ast_expr_int_get_val(
11919		__isl_keep isl_ast_expr *expr);
11920	__isl_give isl_val *isl_ast_expr_get_val(
11921		__isl_keep isl_ast_expr *expr);
11922
11923Return the integer represented by the AST expression.
11924C<isl_ast_expr_get_val> is an alternative name for
11925C<isl_ast_expr_int_get_val>.
11926
11927=head3 Properties of ASTs
11928
11929	#include <isl/ast.h>
11930	isl_bool isl_ast_expr_is_equal(
11931		__isl_keep isl_ast_expr *expr1,
11932		__isl_keep isl_ast_expr *expr2);
11933
11934Check if two C<isl_ast_expr>s are equal to each other.
11935
11936=head3 Manipulating and printing the AST
11937
11938AST nodes can be copied and freed using the following functions.
11939
11940	#include <isl/ast.h>
11941	__isl_give isl_ast_node *isl_ast_node_copy(
11942		__isl_keep isl_ast_node *node);
11943	__isl_null isl_ast_node *isl_ast_node_free(
11944		__isl_take isl_ast_node *node);
11945
11946AST expressions can be copied and freed using the following functions.
11947
11948	#include <isl/ast.h>
11949	__isl_give isl_ast_expr *isl_ast_expr_copy(
11950		__isl_keep isl_ast_expr *expr);
11951	__isl_null isl_ast_expr *isl_ast_expr_free(
11952		__isl_take isl_ast_expr *expr);
11953
11954New AST expressions can be created either directly or within
11955the context of an C<isl_ast_build>.
11956
11957	#include <isl/ast.h>
11958	__isl_give isl_ast_expr *isl_ast_expr_from_val(
11959		__isl_take isl_val *v);
11960	__isl_give isl_ast_expr *isl_ast_expr_from_id(
11961		__isl_take isl_id *id);
11962	__isl_give isl_ast_expr *isl_ast_expr_neg(
11963		__isl_take isl_ast_expr *expr);
11964	__isl_give isl_ast_expr *isl_ast_expr_address_of(
11965		__isl_take isl_ast_expr *expr);
11966	__isl_give isl_ast_expr *isl_ast_expr_add(
11967		__isl_take isl_ast_expr *expr1,
11968		__isl_take isl_ast_expr *expr2);
11969	__isl_give isl_ast_expr *isl_ast_expr_sub(
11970		__isl_take isl_ast_expr *expr1,
11971		__isl_take isl_ast_expr *expr2);
11972	__isl_give isl_ast_expr *isl_ast_expr_mul(
11973		__isl_take isl_ast_expr *expr1,
11974		__isl_take isl_ast_expr *expr2);
11975	__isl_give isl_ast_expr *isl_ast_expr_div(
11976		__isl_take isl_ast_expr *expr1,
11977		__isl_take isl_ast_expr *expr2);
11978	__isl_give isl_ast_expr *isl_ast_expr_pdiv_q(
11979		__isl_take isl_ast_expr *expr1,
11980		__isl_take isl_ast_expr *expr2);
11981	__isl_give isl_ast_expr *isl_ast_expr_pdiv_r(
11982		__isl_take isl_ast_expr *expr1,
11983		__isl_take isl_ast_expr *expr2);
11984	__isl_give isl_ast_expr *isl_ast_expr_and(
11985		__isl_take isl_ast_expr *expr1,
11986		__isl_take isl_ast_expr *expr2)
11987	__isl_give isl_ast_expr *isl_ast_expr_and_then(
11988		__isl_take isl_ast_expr *expr1,
11989		__isl_take isl_ast_expr *expr2)
11990	__isl_give isl_ast_expr *isl_ast_expr_or(
11991		__isl_take isl_ast_expr *expr1,
11992		__isl_take isl_ast_expr *expr2)
11993	__isl_give isl_ast_expr *isl_ast_expr_or_else(
11994		__isl_take isl_ast_expr *expr1,
11995		__isl_take isl_ast_expr *expr2)
11996	__isl_give isl_ast_expr *isl_ast_expr_eq(
11997		__isl_take isl_ast_expr *expr1,
11998		__isl_take isl_ast_expr *expr2);
11999	__isl_give isl_ast_expr *isl_ast_expr_le(
12000		__isl_take isl_ast_expr *expr1,
12001		__isl_take isl_ast_expr *expr2);
12002	__isl_give isl_ast_expr *isl_ast_expr_lt(
12003		__isl_take isl_ast_expr *expr1,
12004		__isl_take isl_ast_expr *expr2);
12005	__isl_give isl_ast_expr *isl_ast_expr_ge(
12006		__isl_take isl_ast_expr *expr1,
12007		__isl_take isl_ast_expr *expr2);
12008	__isl_give isl_ast_expr *isl_ast_expr_gt(
12009		__isl_take isl_ast_expr *expr1,
12010		__isl_take isl_ast_expr *expr2);
12011	__isl_give isl_ast_expr *isl_ast_expr_access(
12012		__isl_take isl_ast_expr *array,
12013		__isl_take isl_ast_expr_list *indices);
12014	__isl_give isl_ast_expr *isl_ast_expr_call(
12015		__isl_take isl_ast_expr *function,
12016		__isl_take isl_ast_expr_list *arguments);
12017
12018The function C<isl_ast_expr_address_of> can be applied to an
12019C<isl_ast_expr> of type C<isl_ast_expr_op_access> only. It is meant
12020to represent the address of the C<isl_ast_expr_access>.
12021The second argument of the functions C<isl_ast_expr_pdiv_q> and
12022C<isl_ast_expr_pdiv_r> should always evaluate to a positive number.
12023The function
12024C<isl_ast_expr_and_then> as well as C<isl_ast_expr_or_else> are short-circuit
12025versions of C<isl_ast_expr_and> and C<isl_ast_expr_or>, respectively.
12026
12027	#include <isl/ast_build.h>
12028	__isl_give isl_ast_expr *isl_ast_build_expr_from_set(
12029		__isl_keep isl_ast_build *build,
12030		__isl_take isl_set *set);
12031	__isl_give isl_ast_expr *isl_ast_build_expr_from_pw_aff(
12032		__isl_keep isl_ast_build *build,
12033		__isl_take isl_pw_aff *pa);
12034	__isl_give isl_ast_expr *
12035	isl_ast_build_access_from_pw_multi_aff(
12036		__isl_keep isl_ast_build *build,
12037		__isl_take isl_pw_multi_aff *pma);
12038	__isl_give isl_ast_expr *
12039	isl_ast_build_access_from_multi_pw_aff(
12040		__isl_keep isl_ast_build *build,
12041		__isl_take isl_multi_pw_aff *mpa);
12042	__isl_give isl_ast_expr *
12043	isl_ast_build_call_from_pw_multi_aff(
12044		__isl_keep isl_ast_build *build,
12045		__isl_take isl_pw_multi_aff *pma);
12046	__isl_give isl_ast_expr *
12047	isl_ast_build_call_from_multi_pw_aff(
12048		__isl_keep isl_ast_build *build,
12049		__isl_take isl_multi_pw_aff *mpa);
12050
12051The set C<set> and
12052the domains of C<pa>, C<mpa> and C<pma> should correspond
12053to the schedule space of C<build>.
12054The tuple id of C<mpa> or C<pma> is used as the array being accessed or
12055the function being called.
12056If the accessed space is a nested relation, then it is taken
12057to represent an access of the member specified by the range
12058of this nested relation of the structure specified by the domain
12059of the nested relation.
12060
12061The following functions can be used to modify an C<isl_ast_expr>.
12062
12063	#include <isl/ast.h>
12064	__isl_give isl_ast_expr *isl_ast_expr_set_op_arg(
12065		__isl_take isl_ast_expr *expr, int pos,
12066		__isl_take isl_ast_expr *arg);
12067
12068Replace the argument of C<expr> at position C<pos> by C<arg>.
12069
12070	#include <isl/ast.h>
12071	__isl_give isl_ast_expr *isl_ast_expr_substitute_ids(
12072		__isl_take isl_ast_expr *expr,
12073		__isl_take isl_id_to_ast_expr *id2expr);
12074
12075The function C<isl_ast_expr_substitute_ids> replaces the
12076subexpressions of C<expr> of type C<isl_ast_expr_id>
12077by the corresponding expression in C<id2expr>, if there is any.
12078
12079
12080The following function can be used to modify the descendants
12081of a specific node in an AST using a depth-first post-order
12082traversal of those descendants (including the node itself).
12083
12084	#include <isl/ast.h>
12085	__isl_give isl_ast_node *
12086	isl_ast_node_map_descendant_bottom_up(
12087		__isl_take isl_ast_node *node,
12088		__isl_give isl_ast_node *(*fn)(
12089			__isl_take isl_ast_node *node,
12090			void *user), void *user);
12091
12092User specified data can be attached to an C<isl_ast_node> and obtained
12093from the same C<isl_ast_node> using the following functions.
12094
12095	#include <isl/ast.h>
12096	__isl_give isl_ast_node *isl_ast_node_set_annotation(
12097		__isl_take isl_ast_node *node,
12098		__isl_take isl_id *annotation);
12099	__isl_give isl_id *isl_ast_node_get_annotation(
12100		__isl_keep isl_ast_node *node);
12101
12102Basic printing can be performed using the following functions.
12103
12104	#include <isl/ast.h>
12105	__isl_give isl_printer *isl_printer_print_ast_expr(
12106		__isl_take isl_printer *p,
12107		__isl_keep isl_ast_expr *expr);
12108	__isl_give isl_printer *isl_printer_print_ast_node(
12109		__isl_take isl_printer *p,
12110		__isl_keep isl_ast_node *node);
12111	__isl_give char *isl_ast_expr_to_str(
12112		__isl_keep isl_ast_expr *expr);
12113	__isl_give char *isl_ast_node_to_str(
12114		__isl_keep isl_ast_node *node);
12115	__isl_give char *isl_ast_expr_to_C_str(
12116		__isl_keep isl_ast_expr *expr);
12117	__isl_give char *isl_ast_node_to_C_str(
12118		__isl_keep isl_ast_node *node);
12119
12120The functions C<isl_ast_expr_to_C_str> and
12121C<isl_ast_node_to_C_str> are convenience functions
12122that return a string representation of the input in C format.
12123
12124More advanced printing can be performed using the following functions.
12125
12126	#include <isl/ast.h>
12127	__isl_give isl_printer *
12128	isl_ast_expr_op_type_set_print_name(
12129		__isl_take isl_printer *p,
12130		enum isl_ast_expr_op_type type,
12131		__isl_keep const char *name);
12132	__isl_give isl_printer *isl_ast_op_type_set_print_name(
12133		__isl_take isl_printer *p,
12134		enum isl_ast_expr_op_type type,
12135		__isl_keep const char *name);
12136	isl_stat isl_options_set_ast_print_macro_once(
12137		isl_ctx *ctx, int val);
12138	int isl_options_get_ast_print_macro_once(isl_ctx *ctx);
12139	__isl_give isl_printer *isl_ast_expr_op_type_print_macro(
12140		enum isl_ast_expr_op_type type,
12141		__isl_take isl_printer *p);
12142	__isl_give isl_printer *isl_ast_op_type_print_macro(
12143		enum isl_ast_expr_op_type type,
12144		__isl_take isl_printer *p);
12145	__isl_give isl_printer *isl_ast_expr_print_macros(
12146		__isl_keep isl_ast_expr *expr,
12147		__isl_take isl_printer *p);
12148	__isl_give isl_printer *isl_ast_node_print_macros(
12149		__isl_keep isl_ast_node *node,
12150		__isl_take isl_printer *p);
12151	__isl_give isl_printer *isl_ast_node_print(
12152		__isl_keep isl_ast_node *node,
12153		__isl_take isl_printer *p,
12154		__isl_take isl_ast_print_options *options);
12155	__isl_give isl_printer *isl_ast_node_for_print(
12156		__isl_keep isl_ast_node *node,
12157		__isl_take isl_printer *p,
12158		__isl_take isl_ast_print_options *options);
12159	__isl_give isl_printer *isl_ast_node_if_print(
12160		__isl_keep isl_ast_node *node,
12161		__isl_take isl_printer *p,
12162		__isl_take isl_ast_print_options *options);
12163
12164While printing an C<isl_ast_node> in C<ISL_FORMAT_C>,
12165C<isl> may print out an AST that makes use of macros such
12166as C<floord>, C<min> and C<max>.
12167The names of these macros may be modified by a call
12168to C<isl_ast_expr_op_type_set_print_name>.  The user-specified
12169names are associated to the printer object.
12170C<isl_ast_op_type_set_print_name> is an alternative name for
12171C<isl_ast_expr_op_type_set_print_name>.
12172C<isl_ast_expr_op_type_print_macro> prints out the macro
12173corresponding to a specific C<isl_ast_expr_op_type>.
12174If the print-macro-once option is set, then a given macro definition
12175is only printed once to any given printer object.
12176C<isl_ast_op_type_print_macro> is an alternative name for
12177C<isl_ast_expr_op_type_print_macro>.
12178C<isl_ast_expr_print_macros> scans the C<isl_ast_expr>
12179for subexpressions where these macros would be used and prints
12180out the required macro definitions.
12181Essentially, C<isl_ast_expr_print_macros> calls
12182C<isl_ast_expr_foreach_ast_expr_op_type> with
12183C<isl_ast_expr_op_type_print_macro>
12184as function argument.
12185C<isl_ast_node_print_macros> does the same
12186for expressions in its C<isl_ast_node> argument.
12187C<isl_ast_node_print>, C<isl_ast_node_for_print> and
12188C<isl_ast_node_if_print> print an C<isl_ast_node>
12189in C<ISL_FORMAT_C>, but allow for some extra control
12190through an C<isl_ast_print_options> object.
12191This object can be created using the following functions.
12192
12193	#include <isl/ast.h>
12194	__isl_give isl_ast_print_options *
12195	isl_ast_print_options_alloc(isl_ctx *ctx);
12196	__isl_give isl_ast_print_options *
12197	isl_ast_print_options_copy(
12198		__isl_keep isl_ast_print_options *options);
12199	__isl_null isl_ast_print_options *
12200	isl_ast_print_options_free(
12201		__isl_take isl_ast_print_options *options);
12202
12203	__isl_give isl_ast_print_options *
12204	isl_ast_print_options_set_print_user(
12205		__isl_take isl_ast_print_options *options,
12206		__isl_give isl_printer *(*print_user)(
12207			__isl_take isl_printer *p,
12208			__isl_take isl_ast_print_options *options,
12209			__isl_keep isl_ast_node *node, void *user),
12210		void *user);
12211	__isl_give isl_ast_print_options *
12212	isl_ast_print_options_set_print_for(
12213		__isl_take isl_ast_print_options *options,
12214		__isl_give isl_printer *(*print_for)(
12215			__isl_take isl_printer *p,
12216			__isl_take isl_ast_print_options *options,
12217			__isl_keep isl_ast_node *node, void *user),
12218		void *user);
12219
12220The callback set by C<isl_ast_print_options_set_print_user>
12221is called whenever a node of type C<isl_ast_node_user> needs to
12222be printed.
12223The callback set by C<isl_ast_print_options_set_print_for>
12224is called whenever a node of type C<isl_ast_node_for> needs to
12225be printed.
12226Note that C<isl_ast_node_for_print> will I<not> call the
12227callback set by C<isl_ast_print_options_set_print_for> on the node
12228on which C<isl_ast_node_for_print> is called, but only on nested
12229nodes of type C<isl_ast_node_for>.  It is therefore safe to
12230call C<isl_ast_node_for_print> from within the callback set by
12231C<isl_ast_print_options_set_print_for>.
12232
12233The following option determines the type to be used for iterators
12234while printing the AST.
12235
12236	isl_stat isl_options_set_ast_iterator_type(
12237		isl_ctx *ctx, const char *val);
12238	const char *isl_options_get_ast_iterator_type(
12239		isl_ctx *ctx);
12240
12241The AST printer only prints body nodes of C<if> and C<for> nodes
12242as blocks if these
12243blocks cannot be safely omitted.
12244For example, a C<for> node with one body node will not be
12245surrounded with braces in C<ISL_FORMAT_C>.
12246A block will always be printed by setting the following option.
12247
12248	isl_stat isl_options_set_ast_always_print_block(isl_ctx *ctx,
12249		int val);
12250	int isl_options_get_ast_always_print_block(isl_ctx *ctx);
12251
12252Explicit block nodes that appear inside the AST are always printed as blocks.
12253If the block node appears as the outermost node,
12254then it is only printed if the following option is set.
12255
12256	isl_stat isl_options_set_ast_print_outermost_block(
12257		isl_ctx *ctx, int val);
12258	int isl_options_get_ast_print_outermost_block(
12259		isl_ctx *ctx);
12260
12261=head3 Options
12262
12263	#include <isl/ast_build.h>
12264	isl_stat isl_options_set_ast_build_atomic_upper_bound(
12265		isl_ctx *ctx, int val);
12266	int isl_options_get_ast_build_atomic_upper_bound(
12267		isl_ctx *ctx);
12268	isl_stat isl_options_set_ast_build_prefer_pdiv(isl_ctx *ctx,
12269		int val);
12270	int isl_options_get_ast_build_prefer_pdiv(isl_ctx *ctx);
12271	isl_stat isl_options_set_ast_build_detect_min_max(
12272		isl_ctx *ctx, int val);
12273	int isl_options_get_ast_build_detect_min_max(
12274		isl_ctx *ctx);
12275	isl_stat isl_options_set_ast_build_exploit_nested_bounds(
12276		isl_ctx *ctx, int val);
12277	int isl_options_get_ast_build_exploit_nested_bounds(
12278		isl_ctx *ctx);
12279	isl_stat isl_options_set_ast_build_group_coscheduled(
12280		isl_ctx *ctx, int val);
12281	int isl_options_get_ast_build_group_coscheduled(
12282		isl_ctx *ctx);
12283	isl_stat isl_options_set_ast_build_separation_bounds(
12284		isl_ctx *ctx, int val);
12285	int isl_options_get_ast_build_separation_bounds(
12286		isl_ctx *ctx);
12287	isl_stat isl_options_set_ast_build_scale_strides(
12288		isl_ctx *ctx, int val);
12289	int isl_options_get_ast_build_scale_strides(
12290		isl_ctx *ctx);
12291	isl_stat isl_options_set_ast_build_allow_else(isl_ctx *ctx,
12292		int val);
12293	int isl_options_get_ast_build_allow_else(isl_ctx *ctx);
12294	isl_stat isl_options_set_ast_build_allow_or(isl_ctx *ctx,
12295		int val);
12296	int isl_options_get_ast_build_allow_or(isl_ctx *ctx);
12297
12298=over
12299
12300=item * ast_build_atomic_upper_bound
12301
12302Generate loop upper bounds that consist of the current loop iterator,
12303an operator and an expression not involving the iterator.
12304If this option is not set, then the current loop iterator may appear
12305several times in the upper bound.
12306For example, when this option is turned off, AST generation
12307for the schedule
12308
12309	[n] -> { A[i] -> [i] : 0 <= i <= 100, n }
12310
12311produces
12312
12313	for (int c0 = 0; c0 <= 100 && n >= c0; c0 += 1)
12314	  A(c0);
12315
12316When the option is turned on, the following AST is generated
12317
12318	for (int c0 = 0; c0 <= min(100, n); c0 += 1)
12319	  A(c0);
12320
12321=item * ast_build_prefer_pdiv
12322
12323If this option is turned off, then the AST generation will
12324produce ASTs that may only contain C<isl_ast_expr_op_fdiv_q>
12325operators, but no C<isl_ast_expr_op_pdiv_q> or
12326C<isl_ast_expr_op_pdiv_r> operators.
12327If this option is turned on, then C<isl> will try to convert
12328some of the C<isl_ast_expr_op_fdiv_q> operators to (expressions containing)
12329C<isl_ast_expr_op_pdiv_q> or C<isl_ast_expr_op_pdiv_r> operators.
12330
12331=item * ast_build_detect_min_max
12332
12333If this option is turned on, then C<isl> will try and detect
12334min or max-expressions when building AST expressions from
12335piecewise affine expressions.
12336
12337=item * ast_build_exploit_nested_bounds
12338
12339Simplify conditions based on bounds of nested for loops.
12340In particular, remove conditions that are implied by the fact
12341that one or more nested loops have at least one iteration,
12342meaning that the upper bound is at least as large as the lower bound.
12343For example, when this option is turned off, AST generation
12344for the schedule
12345
12346	[N,M] -> { A[i,j] -> [i,j] : 0 <= i <= N and
12347					0 <= j <= M }
12348
12349produces
12350
12351	if (M >= 0)
12352	  for (int c0 = 0; c0 <= N; c0 += 1)
12353	    for (int c1 = 0; c1 <= M; c1 += 1)
12354	      A(c0, c1);
12355
12356When the option is turned on, the following AST is generated
12357
12358	for (int c0 = 0; c0 <= N; c0 += 1)
12359	  for (int c1 = 0; c1 <= M; c1 += 1)
12360	    A(c0, c1);
12361
12362=item * ast_build_group_coscheduled
12363
12364If two domain elements are assigned the same schedule point, then
12365they may be executed in any order and they may even appear in different
12366loops.  If this options is set, then the AST generator will make
12367sure that coscheduled domain elements do not appear in separate parts
12368of the AST.  This is useful in case of nested AST generation
12369if the outer AST generation is given only part of a schedule
12370and the inner AST generation should handle the domains that are
12371coscheduled by this initial part of the schedule together.
12372For example if an AST is generated for a schedule
12373
12374	{ A[i] -> [0]; B[i] -> [0] }
12375
12376then the C<isl_ast_build_set_create_leaf> callback described
12377below may get called twice, once for each domain.
12378Setting this option ensures that the callback is only called once
12379on both domains together.
12380
12381=item * ast_build_separation_bounds
12382
12383This option specifies which bounds to use during separation.
12384If this option is set to C<ISL_AST_BUILD_SEPARATION_BOUNDS_IMPLICIT>
12385then all (possibly implicit) bounds on the current dimension will
12386be used during separation.
12387If this option is set to C<ISL_AST_BUILD_SEPARATION_BOUNDS_EXPLICIT>
12388then only those bounds that are explicitly available will
12389be used during separation.
12390
12391=item * ast_build_scale_strides
12392
12393This option specifies whether the AST generator is allowed
12394to scale down iterators of strided loops.
12395
12396=item * ast_build_allow_else
12397
12398This option specifies whether the AST generator is allowed
12399to construct if statements with else branches.
12400
12401=item * ast_build_allow_or
12402
12403This option specifies whether the AST generator is allowed
12404to construct if conditions with disjunctions.
12405
12406=back
12407
12408=head3 AST Generation Options (Schedule Tree)
12409
12410In case of AST construction from a schedule tree, the options
12411that control how an AST is created from the individual schedule
12412dimensions are stored in the band nodes of the tree
12413(see L</"Schedule Trees">).
12414
12415In particular, a schedule dimension can be handled in four
12416different ways, atomic, separate, unroll or the default.
12417This loop AST generation type can be set using
12418C<isl_schedule_node_band_member_set_ast_loop_type>.
12419Alternatively,
12420the first three can be selected by including a one-dimensional
12421element with as value the position of the schedule dimension
12422within the band and as name one of C<atomic>, C<separate>
12423or C<unroll> in the options
12424set by C<isl_schedule_node_band_set_ast_build_options>.
12425Only one of these three may be specified for
12426any given schedule dimension within a band node.
12427If none of these is specified, then the default
12428is used.  The meaning of the options is as follows.
12429
12430=over
12431
12432=item C<atomic>
12433
12434When this option is specified, the AST generator will make
12435sure that a given domain space only appears in a single
12436loop at the specified level.
12437
12438For example, for the schedule tree
12439
12440	domain: "{ a[i] : 0 <= i < 10; b[i] : 0 <= i < 10 }"
12441	child:
12442	  schedule: "[{ a[i] -> [i]; b[i] -> [i+1] }]"
12443	  options: "{ atomic[x] }"
12444
12445the following AST will be generated
12446
12447	for (int c0 = 0; c0 <= 10; c0 += 1) {
12448	  if (c0 >= 1)
12449	    b(c0 - 1);
12450	  if (c0 <= 9)
12451	    a(c0);
12452	}
12453
12454On the other hand, for the schedule tree
12455
12456	domain: "{ a[i] : 0 <= i < 10; b[i] : 0 <= i < 10 }"
12457	child:
12458	  schedule: "[{ a[i] -> [i]; b[i] -> [i+1] }]"
12459	  options: "{ separate[x] }"
12460
12461the following AST will be generated
12462
12463	{
12464	  a(0);
12465	  for (int c0 = 1; c0 <= 9; c0 += 1) {
12466	    b(c0 - 1);
12467	    a(c0);
12468	  }
12469	  b(9);
12470	}
12471
12472If neither C<atomic> nor C<separate> is specified, then the AST generator
12473may produce either of these two results or some intermediate form.
12474
12475=item C<separate>
12476
12477When this option is specified, the AST generator will
12478split the domain of the specified schedule dimension
12479into pieces with a fixed set of statements for which
12480instances need to be executed by the iterations in
12481the schedule domain part.  This option tends to avoid
12482the generation of guards inside the corresponding loops.
12483See also the C<atomic> option.
12484
12485=item C<unroll>
12486
12487When this option is specified, the AST generator will
12488I<completely> unroll the corresponding schedule dimension.
12489It is the responsibility of the user to ensure that such
12490unrolling is possible.
12491To obtain a partial unrolling, the user should apply an additional
12492strip-mining to the schedule and fully unroll the inner schedule
12493dimension.
12494
12495=back
12496
12497The C<isolate> option is a bit more involved.  It allows the user
12498to isolate a range of schedule dimension values from smaller and
12499greater values.  Additionally, the user may specify a different
12500atomic/separate/unroll choice for the isolated part and the remaining
12501parts.  The typical use case of the C<isolate> option is to isolate
12502full tiles from partial tiles.
12503The part that needs to be isolated may depend on outer schedule dimensions.
12504The option therefore needs to be able to reference those outer schedule
12505dimensions.  In particular, the space of the C<isolate> option is that
12506of a wrapped map with as domain the flat product of all outer band nodes
12507and as range the space of the current band node.
12508The atomic/separate/unroll choice for the isolated part is determined
12509by an option that lives in an unnamed wrapped space with as domain
12510a zero-dimensional C<isolate> space and as range the regular
12511C<atomic>, C<separate> or C<unroll> space.
12512This option may also be set directly using
12513C<isl_schedule_node_band_member_set_isolate_ast_loop_type>.
12514The atomic/separate/unroll choice for the remaining part is determined
12515by the regular C<atomic>, C<separate> or C<unroll> option.
12516Since the C<isolate> option references outer schedule dimensions,
12517its use in a band node causes any tree containing the node
12518to be considered anchored.
12519
12520As an example, consider the isolation of full tiles from partial tiles
12521in a tiling of a triangular domain.  The original schedule is as follows.
12522
12523	domain: "{ A[i,j] : 0 <= i,j and i + j <= 100 }"
12524	child:
12525	  schedule: "[{ A[i,j] -> [floor(i/10)] }, \
12526		{ A[i,j] -> [floor(j/10)] }, \
12527		{ A[i,j] -> [i] }, { A[i,j] -> [j] }]"
12528
12529The output is
12530
12531	for (int c0 = 0; c0 <= 10; c0 += 1)
12532	  for (int c1 = 0; c1 <= -c0 + 10; c1 += 1)
12533	    for (int c2 = 10 * c0;
12534                 c2 <= min(10 * c0 + 9, -10 * c1 + 100); c2 += 1)
12535	      for (int c3 = 10 * c1;
12536                   c3 <= min(10 * c1 + 9, -c2 + 100); c3 += 1)
12537		A(c2, c3);
12538
12539Isolating the full tiles, we have the following input
12540
12541	domain: "{ A[i,j] : 0 <= i,j and i + j <= 100 }"
12542	child:
12543	  schedule: "[{ A[i,j] -> [floor(i/10)] }, \
12544		{ A[i,j] -> [floor(j/10)] }, \
12545		{ A[i,j] -> [i] }, { A[i,j] -> [j] }]"
12546	  options: "{ isolate[[] -> [a,b,c,d]] : 0 <= 10a,10b and \
12547		10a+9+10b+9 <= 100 }"
12548
12549and output
12550
12551	{
12552	  for (int c0 = 0; c0 <= 8; c0 += 1) {
12553	    for (int c1 = 0; c1 <= -c0 + 8; c1 += 1)
12554	      for (int c2 = 10 * c0;
12555		   c2 <= 10 * c0 + 9; c2 += 1)
12556		for (int c3 = 10 * c1;
12557		     c3 <= 10 * c1 + 9; c3 += 1)
12558		  A(c2, c3);
12559	    for (int c1 = -c0 + 9; c1 <= -c0 + 10; c1 += 1)
12560	      for (int c2 = 10 * c0;
12561                   c2 <= min(10 * c0 + 9, -10 * c1 + 100); c2 += 1)
12562		for (int c3 = 10 * c1;
12563                     c3 <= min(10 * c1 + 9, -c2 + 100); c3 += 1)
12564		  A(c2, c3);
12565	  }
12566	  for (int c0 = 9; c0 <= 10; c0 += 1)
12567	    for (int c1 = 0; c1 <= -c0 + 10; c1 += 1)
12568	      for (int c2 = 10 * c0;
12569                   c2 <= min(10 * c0 + 9, -10 * c1 + 100); c2 += 1)
12570		for (int c3 = 10 * c1;
12571                     c3 <= min(10 * c1 + 9, -c2 + 100); c3 += 1)
12572		  A(c2, c3);
12573	}
12574
12575We may then additionally unroll the innermost loop of the isolated part
12576
12577	domain: "{ A[i,j] : 0 <= i,j and i + j <= 100 }"
12578	child:
12579	  schedule: "[{ A[i,j] -> [floor(i/10)] }, \
12580		{ A[i,j] -> [floor(j/10)] }, \
12581		{ A[i,j] -> [i] }, { A[i,j] -> [j] }]"
12582	  options: "{ isolate[[] -> [a,b,c,d]] : 0 <= 10a,10b and \
12583		10a+9+10b+9 <= 100; [isolate[] -> unroll[3]] }"
12584
12585to obtain
12586
12587	{
12588	  for (int c0 = 0; c0 <= 8; c0 += 1) {
12589	    for (int c1 = 0; c1 <= -c0 + 8; c1 += 1)
12590	      for (int c2 = 10 * c0; c2 <= 10 * c0 + 9; c2 += 1) {
12591		A(c2, 10 * c1);
12592		A(c2, 10 * c1 + 1);
12593		A(c2, 10 * c1 + 2);
12594		A(c2, 10 * c1 + 3);
12595		A(c2, 10 * c1 + 4);
12596		A(c2, 10 * c1 + 5);
12597		A(c2, 10 * c1 + 6);
12598		A(c2, 10 * c1 + 7);
12599		A(c2, 10 * c1 + 8);
12600		A(c2, 10 * c1 + 9);
12601	      }
12602	    for (int c1 = -c0 + 9; c1 <= -c0 + 10; c1 += 1)
12603	      for (int c2 = 10 * c0;
12604                   c2 <= min(10 * c0 + 9, -10 * c1 + 100); c2 += 1)
12605		for (int c3 = 10 * c1;
12606		     c3 <= min(10 * c1 + 9, -c2 + 100); c3 += 1)
12607		  A(c2, c3);
12608	  }
12609	  for (int c0 = 9; c0 <= 10; c0 += 1)
12610	    for (int c1 = 0; c1 <= -c0 + 10; c1 += 1)
12611	      for (int c2 = 10 * c0;
12612		   c2 <= min(10 * c0 + 9, -10 * c1 + 100); c2 += 1)
12613		for (int c3 = 10 * c1;
12614		     c3 <= min(10 * c1 + 9, -c2 + 100); c3 += 1)
12615		  A(c2, c3);
12616	}
12617
12618
12619=head3 AST Generation Options (Schedule Map)
12620
12621In case of AST construction using
12622C<isl_ast_build_node_from_schedule_map>, the options
12623that control how an AST is created from the individual schedule
12624dimensions are stored in the C<isl_ast_build>.
12625They can be set using the following function.
12626
12627	#include <isl/ast_build.h>
12628	__isl_give isl_ast_build *
12629	isl_ast_build_set_options(
12630		__isl_take isl_ast_build *build,
12631		__isl_take isl_union_map *options);
12632
12633The options are encoded in an C<isl_union_map>.
12634The domain of this union relation refers to the schedule domain,
12635i.e., the range of the schedule passed
12636to C<isl_ast_build_node_from_schedule_map>.
12637In the case of nested AST generation (see L</"Nested AST Generation">),
12638the domain of C<options> should refer to the extra piece of the schedule.
12639That is, it should be equal to the range of the wrapped relation in the
12640range of the schedule.
12641The range of the options can consist of elements in one or more spaces,
12642the names of which determine the effect of the option.
12643The values of the range typically also refer to the schedule dimension
12644to which the option applies, with value C<0> representing
12645the outermost schedule dimension.  In case of nested AST generation
12646(see L</"Nested AST Generation">), these values refer to the position
12647of the schedule dimension within the innermost AST generation.
12648The constraints on the domain elements of
12649the option should only refer to this dimension and earlier dimensions.
12650We consider the following spaces.
12651
12652=over
12653
12654=item C<separation_class>
12655
12656B<This option has been deprecated.  Use the isolate option on
12657schedule trees instead.>
12658
12659This space is a wrapped relation between two one dimensional spaces.
12660The input space represents the schedule dimension to which the option
12661applies and the output space represents the separation class.
12662While constructing a loop corresponding to the specified schedule
12663dimension(s), the AST generator will try to generate separate loops
12664for domain elements that are assigned different classes.
12665If only some of the elements are assigned a class, then those elements
12666that are not assigned any class will be treated as belonging to a class
12667that is separate from the explicitly assigned classes.
12668The typical use case for this option is to separate full tiles from
12669partial tiles.
12670The other options, described below, are applied after the separation
12671into classes.
12672
12673As an example, consider the separation into full and partial tiles
12674of a tiling of a triangular domain.
12675Take, for example, the domain
12676
12677	{ A[i,j] : 0 <= i,j and i + j <= 100 }
12678
12679and a tiling into tiles of 10 by 10.  The input to the AST generator
12680is then the schedule
12681
12682	{ A[i,j] -> [([i/10]),[j/10],i,j] : 0 <= i,j and
12683						i + j <= 100 }
12684
12685Without any options, the following AST is generated
12686
12687	for (int c0 = 0; c0 <= 10; c0 += 1)
12688	  for (int c1 = 0; c1 <= -c0 + 10; c1 += 1)
12689	    for (int c2 = 10 * c0;
12690		 c2 <= min(-10 * c1 + 100, 10 * c0 + 9);
12691		 c2 += 1)
12692	      for (int c3 = 10 * c1;
12693		   c3 <= min(10 * c1 + 9, -c2 + 100);
12694		   c3 += 1)
12695		A(c2, c3);
12696
12697Separation into full and partial tiles can be obtained by assigning
12698a class, say C<0>, to the full tiles.  The full tiles are represented by those
12699values of the first and second schedule dimensions for which there are
12700values of the third and fourth dimensions to cover an entire tile.
12701That is, we need to specify the following option
12702
12703	{ [a,b,c,d] -> separation_class[[0]->[0]] :
12704		exists b': 0 <= 10a,10b' and
12705			   10a+9+10b'+9 <= 100;
12706	  [a,b,c,d] -> separation_class[[1]->[0]] :
12707		0 <= 10a,10b and 10a+9+10b+9 <= 100 }
12708
12709which simplifies to
12710
12711	{ [a, b, c, d] -> separation_class[[1] -> [0]] :
12712		a >= 0 and b >= 0 and b <= 8 - a;
12713	  [a, b, c, d] -> separation_class[[0] -> [0]] :
12714		a >= 0 and a <= 8 }
12715
12716With this option, the generated AST is as follows
12717
12718	{
12719	  for (int c0 = 0; c0 <= 8; c0 += 1) {
12720	    for (int c1 = 0; c1 <= -c0 + 8; c1 += 1)
12721	      for (int c2 = 10 * c0;
12722		   c2 <= 10 * c0 + 9; c2 += 1)
12723		for (int c3 = 10 * c1;
12724		     c3 <= 10 * c1 + 9; c3 += 1)
12725		  A(c2, c3);
12726	    for (int c1 = -c0 + 9; c1 <= -c0 + 10; c1 += 1)
12727	      for (int c2 = 10 * c0;
12728		   c2 <= min(-10 * c1 + 100, 10 * c0 + 9);
12729		   c2 += 1)
12730		for (int c3 = 10 * c1;
12731		     c3 <= min(-c2 + 100, 10 * c1 + 9);
12732		     c3 += 1)
12733		  A(c2, c3);
12734	  }
12735	  for (int c0 = 9; c0 <= 10; c0 += 1)
12736	    for (int c1 = 0; c1 <= -c0 + 10; c1 += 1)
12737	      for (int c2 = 10 * c0;
12738		   c2 <= min(-10 * c1 + 100, 10 * c0 + 9);
12739		   c2 += 1)
12740		for (int c3 = 10 * c1;
12741		     c3 <= min(10 * c1 + 9, -c2 + 100);
12742		     c3 += 1)
12743		  A(c2, c3);
12744	}
12745
12746=item C<separate>
12747
12748This is a single-dimensional space representing the schedule dimension(s)
12749to which ``separation'' should be applied.  Separation tries to split
12750a loop into several pieces if this can avoid the generation of guards
12751inside the loop.
12752See also the C<atomic> option.
12753
12754=item C<atomic>
12755
12756This is a single-dimensional space representing the schedule dimension(s)
12757for which the domains should be considered ``atomic''.  That is, the
12758AST generator will make sure that any given domain space will only appear
12759in a single loop at the specified level.
12760
12761Consider the following schedule
12762
12763	{ a[i] -> [i] : 0 <= i < 10;
12764	  b[i] -> [i+1] : 0 <= i < 10 }
12765
12766If the following option is specified
12767
12768	{ [i] -> separate[x] }
12769
12770then the following AST will be generated
12771
12772	{
12773	  a(0);
12774	  for (int c0 = 1; c0 <= 9; c0 += 1) {
12775	    a(c0);
12776	    b(c0 - 1);
12777	  }
12778	  b(9);
12779	}
12780
12781If, on the other hand, the following option is specified
12782
12783	{ [i] -> atomic[x] }
12784
12785then the following AST will be generated
12786
12787	for (int c0 = 0; c0 <= 10; c0 += 1) {
12788	  if (c0 <= 9)
12789	    a(c0);
12790	  if (c0 >= 1)
12791	    b(c0 - 1);
12792	}
12793
12794If neither C<atomic> nor C<separate> is specified, then the AST generator
12795may produce either of these two results or some intermediate form.
12796
12797=item C<unroll>
12798
12799This is a single-dimensional space representing the schedule dimension(s)
12800that should be I<completely> unrolled.
12801To obtain a partial unrolling, the user should apply an additional
12802strip-mining to the schedule and fully unroll the inner loop.
12803
12804=back
12805
12806=head3 Fine-grained Control over AST Generation
12807
12808Besides specifying the constraints on the parameters,
12809an C<isl_ast_build> object can be used to control
12810various aspects of the AST generation process.
12811In case of AST construction using
12812C<isl_ast_build_node_from_schedule_map>,
12813the most prominent way of control is through ``options'',
12814as explained above.
12815
12816Additional control is available through the following functions.
12817
12818	#include <isl/ast_build.h>
12819	__isl_give isl_ast_build *
12820	isl_ast_build_set_iterators(
12821		__isl_take isl_ast_build *build,
12822		__isl_take isl_id_list *iterators);
12823
12824The function C<isl_ast_build_set_iterators> allows the user to
12825specify a list of iterator C<isl_id>s to be used as iterators.
12826If the input schedule is injective, then
12827the number of elements in this list should be as large as the dimension
12828of the schedule space, but no direct correspondence should be assumed
12829between dimensions and elements.
12830If the input schedule is not injective, then an additional number
12831of C<isl_id>s equal to the largest dimension of the input domains
12832may be required.
12833If the number of provided C<isl_id>s is insufficient, then additional
12834names are automatically generated.
12835
12836	#include <isl/ast_build.h>
12837	__isl_give isl_ast_build *
12838	isl_ast_build_set_create_leaf(
12839		__isl_take isl_ast_build *build,
12840		__isl_give isl_ast_node *(*fn)(
12841			__isl_take isl_ast_build *build,
12842			void *user), void *user);
12843
12844The
12845C<isl_ast_build_set_create_leaf> function allows for the
12846specification of a callback that should be called whenever the AST
12847generator arrives at an element of the schedule domain.
12848The callback should return an AST node that should be inserted
12849at the corresponding position of the AST.  The default action (when
12850the callback is not set) is to continue generating parts of the AST to scan
12851all the domain elements associated to the schedule domain element
12852and to insert user nodes, ``calling'' the domain element, for each of them.
12853The C<build> argument contains the current state of the C<isl_ast_build>.
12854To ease nested AST generation (see L</"Nested AST Generation">),
12855all control information that is
12856specific to the current AST generation such as the options and
12857the callbacks has been removed from this C<isl_ast_build>.
12858The callback would typically return the result of a nested
12859AST generation or a
12860user defined node created using the following function.
12861
12862	#include <isl/ast.h>
12863	__isl_give isl_ast_node *isl_ast_node_user_from_expr(
12864		__isl_take isl_ast_expr *expr);
12865	__isl_give isl_ast_node *isl_ast_node_alloc_user(
12866		__isl_take isl_ast_expr *expr);
12867
12868C<isl_ast_node_alloc_user> is an alternative name for
12869C<isl_ast_node_user_from_expr>.
12870
12871In some cases, a single user defined node is not enough,
12872in which case the following function can be used
12873to create a block node from multiple AST nodes.
12874
12875	#include <isl/ast.h>
12876	__isl_give isl_ast_node *isl_ast_node_block_from_children(
12877		__isl_take isl_ast_node_list *list);
12878
12879	#include <isl/ast_build.h>
12880	__isl_give isl_ast_build *
12881	isl_ast_build_set_at_each_domain(
12882		__isl_take isl_ast_build *build,
12883		__isl_give isl_ast_node *(*fn)(
12884			__isl_take isl_ast_node *node,
12885			__isl_keep isl_ast_build *build,
12886			void *user), void *user);
12887	__isl_give isl_ast_build *
12888	isl_ast_build_set_before_each_for(
12889		__isl_take isl_ast_build *build,
12890		__isl_give isl_id *(*fn)(
12891			__isl_keep isl_ast_build *build,
12892			void *user), void *user);
12893	__isl_give isl_ast_build *
12894	isl_ast_build_set_after_each_for(
12895		__isl_take isl_ast_build *build,
12896		__isl_give isl_ast_node *(*fn)(
12897			__isl_take isl_ast_node *node,
12898			__isl_keep isl_ast_build *build,
12899			void *user), void *user);
12900	__isl_give isl_ast_build *
12901	isl_ast_build_set_before_each_mark(
12902		__isl_take isl_ast_build *build,
12903		isl_stat (*fn)(__isl_keep isl_id *mark,
12904			__isl_keep isl_ast_build *build,
12905			void *user), void *user);
12906	__isl_give isl_ast_build *
12907	isl_ast_build_set_after_each_mark(
12908		__isl_take isl_ast_build *build,
12909		__isl_give isl_ast_node *(*fn)(
12910			__isl_take isl_ast_node *node,
12911			__isl_keep isl_ast_build *build,
12912			void *user), void *user);
12913
12914The callback set by C<isl_ast_build_set_at_each_domain> will
12915be called for each domain AST node.
12916The callbacks set by C<isl_ast_build_set_before_each_for>
12917and C<isl_ast_build_set_after_each_for> will be called
12918for each for AST node.  The first will be called in depth-first
12919pre-order, while the second will be called in depth-first post-order.
12920Since C<isl_ast_build_set_before_each_for> is called before the for
12921node is actually constructed, it is only passed an C<isl_ast_build>.
12922The returned C<isl_id> will be added as an annotation (using
12923C<isl_ast_node_set_annotation>) to the constructed for node.
12924In particular, if the user has also specified an C<after_each_for>
12925callback, then the annotation can be retrieved from the node passed to
12926that callback using C<isl_ast_node_get_annotation>.
12927The callbacks set by C<isl_ast_build_set_before_each_mark>
12928and C<isl_ast_build_set_after_each_mark> will be called for each
12929mark AST node that is created, i.e., for each mark schedule node
12930in the input schedule tree.  The first will be called in depth-first
12931pre-order, while the second will be called in depth-first post-order.
12932Since the callback set by C<isl_ast_build_set_before_each_mark>
12933is called before the mark AST node is actually constructed, it is passed
12934the identifier of the mark node.
12935All callbacks should C<NULL> (or C<isl_stat_error>) on failure.
12936The given C<isl_ast_build> can be used to create new
12937C<isl_ast_expr> objects using C<isl_ast_build_expr_from_pw_aff>
12938or C<isl_ast_build_call_from_pw_multi_aff>.
12939
12940=head3 Nested AST Generation
12941
12942C<isl> allows the user to create an AST within the context
12943of another AST.  These nested ASTs are created using the
12944same C<isl_ast_build_node_from_schedule_map> function that is used to create
12945the outer AST.  The C<build> argument should be an C<isl_ast_build>
12946passed to a callback set by
12947C<isl_ast_build_set_create_leaf>.
12948The space of the range of the C<schedule> argument should refer
12949to this build.  In particular, the space should be a wrapped
12950relation and the domain of this wrapped relation should be the
12951same as that of the range of the schedule returned by
12952C<isl_ast_build_get_schedule> below.
12953In practice, the new schedule is typically
12954created by calling C<isl_union_map_range_product> on the old schedule
12955and some extra piece of the schedule.
12956The space of the schedule domain is also available from
12957the C<isl_ast_build>.
12958
12959	#include <isl/ast_build.h>
12960	__isl_give isl_union_map *isl_ast_build_get_schedule(
12961		__isl_keep isl_ast_build *build);
12962	__isl_give isl_space *isl_ast_build_get_schedule_space(
12963		__isl_keep isl_ast_build *build);
12964	__isl_give isl_ast_build *isl_ast_build_restrict(
12965		__isl_take isl_ast_build *build,
12966		__isl_take isl_set *set);
12967
12968The C<isl_ast_build_get_schedule> function returns a (partial)
12969schedule for the domains elements for which part of the AST still needs to
12970be generated in the current build.
12971In particular, the domain elements are mapped to those iterations of the loops
12972enclosing the current point of the AST generation inside which
12973the domain elements are executed.
12974No direct correspondence between
12975the input schedule and this schedule should be assumed.
12976The space obtained from C<isl_ast_build_get_schedule_space> can be used
12977to create a set for C<isl_ast_build_restrict> to intersect
12978with the current build.  In particular, the set passed to
12979C<isl_ast_build_restrict> can have additional parameters.
12980The ids of the set dimensions in the space returned by
12981C<isl_ast_build_get_schedule_space> correspond to the
12982iterators of the already generated loops.
12983The user should not rely on the ids of the output dimensions
12984of the relations in the union relation returned by
12985C<isl_ast_build_get_schedule> having any particular value.
12986
12987=head1 Applications
12988
12989Although C<isl> is mainly meant to be used as a library,
12990it also contains some basic applications that use some
12991of the functionality of C<isl>.
12992For applications that take one or more polytopes or polyhedra
12993as input, this input may be specified in either the L<isl format>
12994or the L<PolyLib format>.
12995
12996=head2 C<isl_polyhedron_sample>
12997
12998C<isl_polyhedron_sample> takes a polyhedron as input and prints
12999an integer element of the polyhedron, if there is any.
13000The first column in the output is the denominator and is always
13001equal to 1.  If the polyhedron contains no integer points,
13002then a vector of length zero is printed.
13003
13004=head2 C<isl_pip>
13005
13006C<isl_pip> takes the same input as the C<example> program
13007from the C<piplib> distribution, i.e., a set of constraints
13008on the parameters, a line containing only -1 and finally a set
13009of constraints on a parametric polyhedron.
13010The coefficients of the parameters appear in the last columns
13011(but before the final constant column).
13012The output is the lexicographic minimum of the parametric polyhedron.
13013As C<isl> currently does not have its own output format, the output
13014is just a dump of the internal state.
13015
13016=head2 C<isl_polyhedron_minimize>
13017
13018C<isl_polyhedron_minimize> computes the minimum of some linear
13019or affine objective function over the integer points in a polyhedron.
13020If an affine objective function
13021is given, then the constant should appear in the last column.
13022
13023=head2 C<isl_polytope_scan>
13024
13025Given a polytope, C<isl_polytope_scan> prints
13026all integer points in the polytope.
13027
13028=head2 C<isl_flow>
13029
13030Given an C<isl_union_access_info> object as input,
13031C<isl_flow> prints out the corresponding dependences,
13032as computed by C<isl_union_access_info_compute_flow>.
13033
13034=head2 C<isl_codegen>
13035
13036Given either a schedule tree or a sequence consisting of
13037a schedule map, a context set and an options relation,
13038C<isl_codegen> prints out an AST that scans the domain elements
13039of the schedule in the order of their image(s) taking into account
13040the constraints in the context set.
13041
13042=head2 C<isl_schedule>
13043
13044Given an C<isl_schedule_constraints> object as input,
13045C<isl_schedule> prints out a schedule that satisfies the given
13046constraints.
13047