add isl_map_lex_le and isl_map_lex_ge
[platform/upstream/isl.git] / doc / user.pod
1 =head1 Introduction
2
3 C<isl> is a thread-safe C library for manipulating
4 sets and relations of integer points bounded by affine constraints.
5 The descriptions of the sets and relations may involve
6 both parameters and existentially quantified variables.
7 All computations are performed in exact integer arithmetic
8 using C<GMP>.
9 The C<isl> library offers functionality that is similar
10 to that offered by the C<Omega> and C<Omega+> libraries,
11 but the underlying algorithms are in most cases completely different.
12
13 The library is by no means complete and some fairly basic
14 functionality is still missing.
15 Still, even in its current form, the library has been successfully
16 used as a backend polyhedral library for the polyhedral
17 scanner C<CLooG> and as part of an equivalence checker of
18 static affine programs.
19
20 =head1 Installation
21
22 The source of C<isl> can be obtained either as a tarball
23 or from the git repository.  Both are available from
24 L<http://freshmeat.net/projects/isl/>.
25 The installation process depends on how you obtained
26 the source.
27
28 =head2 Installation from the git repository
29
30 =over
31
32 =item 1 Clone or update the repository
33
34 The first time the source is obtained, you need to clone
35 the repository.
36
37         git clone git://repo.or.cz/isl.git
38
39 To obtain updates, you need to pull in the latest changes
40
41         git pull
42
43 =item 2 Get submodule (optional)
44
45 C<isl> can optionally use the C<piplib> library and provides
46 this library as a submodule.  If you want to use it, then
47 after you have cloned C<isl>, you need to grab the submodules
48
49         git submodule init
50         git submodule update
51
52 To obtain updates, you only need
53
54         git submodule update
55
56 Note that C<isl> currently does not use any C<piplib>
57 functionality by default.
58
59 =item 3 Generate C<configure>
60
61         ./autogen.sh
62
63 =back
64
65 After performing the above steps, continue
66 with the L<Common installation instructions>.
67
68 =head2 Common installation instructions
69
70 =over
71
72 =item 1 Obtain C<GMP>
73
74 Building C<isl> requires C<GMP>, including its headers files.
75 Your distribution may not provide these header files by default
76 and you may need to install a package called C<gmp-devel> or something
77 similar.  Alternatively, C<GMP> can be built from
78 source, available from L<http://gmplib.org/>.
79
80 =item 2 Configure
81
82 C<isl> uses the standard C<autoconf> C<configure> script.
83 To run it, just type
84
85         ./configure
86
87 optionally followed by some configure options.
88 A complete list of options can be obtained by running
89
90         ./configure --help
91
92 Below we discuss some of the more common options.
93
94 C<isl> can optionally use both C<PolyLib> and C<piplib>.
95 C<PolyLib> is mainly used to convert between C<PolyLib> objects
96 and C<isl> objects.  No C<piplib> functionality is currently
97 used by default.
98 The C<--with-polylib> and C<--with-piplib> options can
99 be used to specify which C<PolyLib> or C<piplib>
100 library to use, either an installed version (C<system>),
101 an externally built version (C<build>), a bundled version (C<bundled>)
102 or no version (C<no>).  The option C<build> is mostly useful
103 in C<configure> scripts of larger projects that bundle both C<isl>
104 and either C<PolyLib> or C<piplib>.
105
106 =over
107
108 =item C<--prefix>
109
110 Installation prefix for C<isl>
111
112 =item C<--with-gmp>
113
114 Dummy option, included for consistency.  Always set to C<system>.
115
116 =item C<--with-gmp-prefix>
117
118 Installation prefix for C<GMP> (architecture-independent files).
119
120 =item C<--with-gmp-exec-prefix>
121
122 Installation prefix for C<GMP> (architecture-dependent files).
123
124 =item C<--with-polylib>
125
126 Which copy of C<PolyLib> to use, either C<no> (default), C<system> or C<build>.
127
128 =item C<--with-polylib-prefix>
129
130 Installation prefix for C<system> C<PolyLib> (architecture-independent files).
131
132 =item C<--with-polylib-exec-prefix>
133
134 Installation prefix for C<system> C<PolyLib> (architecture-dependent files).
135
136 =item C<--with-polylib-builddir>
137
138 Location where C<build> C<PolyLib> was built.
139
140 =item C<--with-piplib>
141
142 Which copy of C<piplib> to use, either C<no> (default), C<system>, C<build>
143 or C<bundled>.  Note that C<bundled> only works if you have obtained
144 C<isl> and its submodules from the git repository.
145
146 =item C<--with-piplib-prefix>
147
148 Installation prefix for C<system> C<piplib> (architecture-independent files).
149
150 =item C<--with-piplib-exec-prefix>
151
152 Installation prefix for C<system> C<piplib> (architecture-dependent files).
153
154 =item C<--with-piplib-builddir>
155
156 Location where C<build> C<piplib> was built.
157
158 =back
159
160 =item 3 Compile
161
162         make
163
164 =item 4 Install (optional)
165
166         make install
167
168 =back
169
170 =head1 Library
171
172 =head2 Initialization
173
174 All manipulations of integer sets and relations occur within
175 the context of an C<isl_ctx>.
176 A given C<isl_ctx> can only be used within a single thread.
177 All arguments of a function are required to have been allocated
178 within the same context.
179 There are currently no functions available for moving an object
180 from one C<isl_ctx> to another C<isl_ctx>.  This means that
181 there is currently no way of safely moving an object from one
182 thread to another, unless the whole C<isl_ctx> is moved.
183
184 An C<isl_ctx> can be allocated using C<isl_ctx_alloc> and
185 freed using C<isl_ctx_free>.
186 All objects allocated within an C<isl_ctx> should be freed
187 before the C<isl_ctx> itself is freed.
188
189         isl_ctx *isl_ctx_alloc();
190         void isl_ctx_free(isl_ctx *ctx);
191
192 =head2 Integers
193
194 All operations on integers, mainly the coefficients
195 of the constraints describing the sets and relations,
196 are performed in exact integer arithmetic using C<GMP>.
197 However, to allow future versions of C<isl> to optionally
198 support fixed integer arithmetic, all calls to C<GMP>
199 are wrapped inside C<isl> specific macros.
200 The basic type is C<isl_int> and the following operations
201 are available on this type.
202
203 =over
204
205 =item isl_int_init(i)
206
207 =item isl_int_clear(i)
208
209 =item isl_int_set(r,i)
210
211 =item isl_int_set_si(r,i)
212
213 =item isl_int_abs(r,i)
214
215 =item isl_int_neg(r,i)
216
217 =item isl_int_swap(i,j)
218
219 =item isl_int_swap_or_set(i,j)
220
221 =item isl_int_add_ui(r,i,j)
222
223 =item isl_int_sub_ui(r,i,j)
224
225 =item isl_int_add(r,i,j)
226
227 =item isl_int_sub(r,i,j)
228
229 =item isl_int_mul(r,i,j)
230
231 =item isl_int_mul_ui(r,i,j)
232
233 =item isl_int_addmul(r,i,j)
234
235 =item isl_int_submul(r,i,j)
236
237 =item isl_int_gcd(r,i,j)
238
239 =item isl_int_lcm(r,i,j)
240
241 =item isl_int_divexact(r,i,j)
242
243 =item isl_int_cdiv_q(r,i,j)
244
245 =item isl_int_fdiv_q(r,i,j)
246
247 =item isl_int_fdiv_r(r,i,j)
248
249 =item isl_int_fdiv_q_ui(r,i,j)
250
251 =item isl_int_read(r,s)
252
253 =item isl_int_print(out,i,width)
254
255 =item isl_int_sgn(i)
256
257 =item isl_int_cmp(i,j)
258
259 =item isl_int_cmp_si(i,si)
260
261 =item isl_int_eq(i,j)
262
263 =item isl_int_ne(i,j)
264
265 =item isl_int_lt(i,j)
266
267 =item isl_int_le(i,j)
268
269 =item isl_int_gt(i,j)
270
271 =item isl_int_ge(i,j)
272
273 =item isl_int_abs_eq(i,j)
274
275 =item isl_int_abs_ne(i,j)
276
277 =item isl_int_abs_lt(i,j)
278
279 =item isl_int_abs_gt(i,j)
280
281 =item isl_int_abs_ge(i,j)
282
283 =item isl_int_is_zero(i)
284
285 =item isl_int_is_one(i)
286
287 =item isl_int_is_negone(i)
288
289 =item isl_int_is_pos(i)
290
291 =item isl_int_is_neg(i)
292
293 =item isl_int_is_nonpos(i)
294
295 =item isl_int_is_nonneg(i)
296
297 =item isl_int_is_divisible_by(i,j)
298
299 =back
300
301 =head2 Sets and Relations
302
303 C<isl> uses four types of objects for representing sets and relations,
304 C<isl_basic_set>, C<isl_basic_map>, C<isl_set> and C<isl_map>.
305 C<isl_basic_set> and C<isl_basic_map> represent sets and relations that
306 can be described as a conjunction of affine constraints, while
307 C<isl_set> and C<isl_map> represent unions of
308 C<isl_basic_set>s and C<isl_basic_map>s, respectively.
309 The difference between sets and relations (maps) is that sets have
310 one set of variables, while relations have two sets of variables,
311 input variables and output variables.
312
313 =head2 Memory Management
314
315 Since a high-level operation on sets and/or relations usually involves
316 several substeps and since the user is usually not interested in
317 the intermediate results, most functions that return a new object
318 will also release all the objects passed as arguments.
319 If the user still wants to use one or more of these arguments
320 after the function call, she should pass along a copy of the
321 object rather than the object itself.
322 The user is then responsible for make sure that the original
323 object gets used somewhere else or is explicitly freed.
324
325 The arguments and return values of all documents functions are
326 annotated to make clear which arguments are released and which
327 arguments are preserved.  In particular, the following annotations
328 are used
329
330 =over
331
332 =item C<__isl_give>
333
334 C<__isl_give> means that a new object is returned.
335 The user should make sure that the returned pointer is
336 used exactly once as a value for an C<__isl_take> argument.
337 In between, it can be used as a value for as many
338 C<__isl_keep> arguments as the user likes.
339 There is one exception, and that is the case where the
340 pointer returned is C<NULL>.  Is this case, the user
341 is free to use it as an C<__isl_take> argument or not.
342
343 =item C<__isl_take>
344
345 C<__isl_take> means that the object the argument points to
346 is taken over by the function and may no longer be used
347 by the user as an argument to any other function.
348 The pointer value must be one returned by a function
349 returning an C<__isl_give> pointer.
350 If the user passes in a C<NULL> value, then this will
351 be treated as an error in the sense that the function will
352 not perform its usual operation.  However, it will still
353 make sure that all the the other C<__isl_take> arguments
354 are released.
355
356 =item C<__isl_keep>
357
358 C<__isl_keep> means that the function will only use the object
359 temporarily.  After the function has finished, the user
360 can still use it as an argument to other functions.
361 A C<NULL> value will be treated in the same way as
362 a C<NULL> value for an C<__isl_take> argument.
363
364 =back
365
366 =head2 Dimension Specifications
367
368 Whenever a new set or relation is created from scratch,
369 its dimension needs to be specified using an C<isl_dim>.
370
371         #include <isl_dim.h>
372         __isl_give isl_dim *isl_dim_alloc(isl_ctx *ctx,
373                 unsigned nparam, unsigned n_in, unsigned n_out);
374         __isl_give isl_dim *isl_dim_set_alloc(isl_ctx *ctx,
375                 unsigned nparam, unsigned dim);
376         __isl_give isl_dim *isl_dim_copy(__isl_keep isl_dim *dim);
377         void isl_dim_free(__isl_take isl_dim *dim);
378         unsigned isl_dim_size(__isl_keep isl_dim *dim,
379                 enum isl_dim_type type);
380
381 The dimension specification used for creating a set
382 needs to be created using C<isl_dim_set_alloc>, while
383 that for creating a relation
384 needs to be created using C<isl_dim_alloc>.
385 C<isl_dim_size> can be used
386 to find out the number of dimensions of each type in
387 a dimension specification, where type may be
388 C<isl_dim_param>, C<isl_dim_in> (only for relations),
389 C<isl_dim_out> (only for relations), C<isl_dim_set>
390 (only for sets) or C<isl_dim_all>.
391
392 =head2 Input and Output
393
394 Proper input and output functions are still in development.
395 However, some functions are provided to read and write
396 to foreign file formats and to convert between
397 C<isl> objects and C<PolyLib> objects (if C<PolyLib> is available).
398
399 =head3 Input
400
401         #include <isl_set.h>
402         __isl_give isl_basic_set *isl_basic_set_read_from_file(
403                 isl_ctx *ctx, FILE *input, unsigned nparam,
404                 unsigned input_format);
405         __isl_give isl_basic_set *isl_basic_set_read_from_str(
406                 isl_ctx *ctx, const char *str, unsigned nparam,
407                 unsigned input_format);
408         __isl_give isl_set *isl_set_read_from_file(isl_ctx *ctx,
409                 FILE *input, unsigned nparam,
410                 unsigned input_format);
411
412         #include <isl_map.h>
413         __isl_give isl_basic_map *isl_basic_map_read_from_file(
414                 isl_ctx *ctx, FILE *input, unsigned nparam,
415                 unsigned input_format);
416
417 C<input_format> may be either C<ISL_FORMAT_POLYLIB> or
418 C<ISL_FORMAT_OMEGA>.  However, not all combination are currently
419 supported.  Furthermore, only a very limited subset of
420 the C<Omega> input format is currently supported.
421 In particular, C<isl_basic_set_read_from_str> and
422 C<isl_basic_map_read_from_file> only
423 support C<ISL_FORMAT_OMEGA>, while C<isl_set_read_from_file>
424 only supports C<ISL_FORMAT_POLYLIB>.
425 C<nparam> specifies how many of the final columns in
426 the C<PolyLib> format correspond to parameters.  It should
427 be zero when C<ISL_FORMAT_OMEGA> is used.
428
429 =head3 Output
430
431         #include <isl_set.h>
432         void isl_basic_set_print(__isl_keep isl_basic_set *bset,
433                 FILE *out, int indent,
434                 const char *prefix, const char *suffix,
435                 unsigned output_format);
436         void isl_set_print(__isl_keep struct isl_set *set,
437                 FILE *out, int indent, unsigned output_format);
438
439 C<input_format> must be C<ISL_FORMAT_POLYLIB>.
440 Each line in the output is indented by C<indent> spaces,
441 prefixed by C<prefix> and suffixed by C<suffix>.
442 The coefficients of the existentially quantified variables
443 appear between those of the set variables and those
444 of the parameters.
445
446 =head3 Conversion from/to C<PolyLib>
447
448 The following functions are only available if C<isl> has
449 been configured to use C<PolyLib>.
450
451         #include <isl_set_polylib.h>
452         __isl_give isl_basic_set *isl_basic_set_new_from_polylib(
453                 Polyhedron *P, __isl_take isl_dim *dim);
454         Polyhedron *isl_basic_set_to_polylib(
455                 __isl_keep isl_basic_set *bset);
456         __isl_give isl_set *isl_set_new_from_polylib(Polyhedron *D,
457                 __isl_take isl_dim *dim);
458         Polyhedron *isl_set_to_polylib(__isl_keep isl_set *set);
459
460         #include <isl_map_polylib.h>
461         __isl_give isl_basic_map *isl_basic_map_new_from_polylib(
462                 Polyhedron *P, __isl_take isl_dim *dim);
463         __isl_give isl_map *isl_map_new_from_polylib(Polyhedron *D,
464                 __isl_take isl_dim *dim);
465         Polyhedron *isl_basic_map_to_polylib(
466                 __isl_keep isl_basic_map *bmap);
467         Polyhedron *isl_map_to_polylib(__isl_keep isl_map *map);
468
469 =head3 Dumping the internal state
470
471 For lack of proper output functions, the following functions
472 can be used to dump the internal state of a set or relation.
473 The user should not depend on the output format of these functions.
474
475         void isl_basic_set_dump(__isl_keep isl_basic_set *bset,
476                 FILE *out, int indent);
477         void isl_basic_map_dump(__isl_keep isl_basic_map *bmap,
478                 FILE *out, int indent);
479         void isl_set_dump(__isl_keep isl_set *set,
480                 FILE *out, int indent);
481         void isl_map_dump(__isl_keep isl_map *map,
482                 FILE *out, int indent);
483
484 =head2 Creating New Sets and Relations
485
486 C<isl> has functions for creating some standard sets and relations.
487
488 =over
489
490 =item * Empty sets and relations
491
492         __isl_give isl_basic_set *isl_basic_set_empty(
493                 __isl_take isl_dim *dim);
494         __isl_give isl_basic_map *isl_basic_map_empty(
495                 __isl_take isl_dim *dim);
496         __isl_give isl_set *isl_set_empty(
497                 __isl_take isl_dim *dim);
498         __isl_give isl_map *isl_map_empty(
499                 __isl_take isl_dim *dim);
500
501 =item * Universe sets and relations
502
503         __isl_give isl_basic_set *isl_basic_set_universe(
504                 __isl_take isl_dim *dim);
505         __isl_give isl_basic_map *isl_basic_map_universe(
506                 __isl_take isl_dim *dim);
507         __isl_give isl_set *isl_set_universe(
508                 __isl_take isl_dim *dim);
509         __isl_give isl_map *isl_map_universe(
510                 __isl_take isl_dim *dim);
511
512 =item * Identity relations
513
514         __isl_give isl_basic_map *isl_basic_map_identity(
515                 __isl_take isl_dim *set_dim);
516         __isl_give isl_map *isl_map_identity(
517                 __isl_take isl_dim *set_dim);
518
519 These functions take a dimension specification for a B<set>
520 and return an identity relation between two such sets.
521
522 =item * Lexicographic order
523
524         __isl_give isl_map *isl_map_lex_lt(
525                 __isl_take isl_dim *set_dim);
526         __isl_give isl_map *isl_map_lex_le(
527                 __isl_take isl_dim *set_dim);
528         __isl_give isl_map *isl_map_lex_gt(
529                 __isl_take isl_dim *set_dim);
530         __isl_give isl_map *isl_map_lex_ge(
531                 __isl_take isl_dim *set_dim);
532
533 These functions take a dimension specification for a B<set>
534 and return maps that map elements of a set of the given dimension
535 to elements that are lexicograhically less
536 (C<isl_map_lex_lt>), less or equal (C<isl_map_lex_le>),
537 greater (C<isl_map_lex_gt>) or greater or equal (C<isl_map_lex_ge>).
538
539 =back
540
541 A basic set or relation can be converted to a set or relation
542 using the following functions.
543
544         __isl_give isl_set *isl_set_from_basic_set(
545                 __isl_take isl_basic_set *bset);
546         __isl_give isl_map *isl_map_from_basic_map(
547                 __isl_take isl_basic_map *bmap);
548
549 Sets and relations can be copied and freed again using the following
550 functions.
551
552         __isl_give isl_basic_set *isl_basic_set_copy(
553                 __isl_keep isl_basic_set *bset);
554         __isl_give isl_set *isl_set_copy(__isl_keep isl_set *set);
555         __isl_give isl_basic_map *isl_basic_map_copy(
556                 __isl_keep isl_basic_map *bmap);
557         __isl_give isl_map *isl_map_copy(__isl_keep isl_map *map);
558         void isl_basic_set_free(__isl_take isl_basic_set *bset);
559         void isl_set_free(__isl_take isl_set *set);
560         void isl_basic_map_free(__isl_take isl_basic_map *bmap);
561         void isl_map_free(__isl_take isl_map *map);
562
563 Other sets and relations can be constructed by starting
564 from a universe set or relation, adding equality and/or
565 inequality constraints and then projecting out the
566 existentially quantified variables, if any.
567 Constraints can be constructed, manipulated and
568 added to basic sets and relations using the following functions.
569
570         #include <isl_constraint.h>
571         __isl_give isl_constraint *isl_equality_alloc(
572                 __isl_take isl_dim *dim);
573         __isl_give isl_constraint *isl_inequality_alloc(
574                 __isl_take isl_dim *dim);
575         void isl_constraint_set_constant(
576                 __isl_keep isl_constraint *constraint, isl_int v);
577         void isl_constraint_set_coefficient(
578                 __isl_keep isl_constraint *constraint,
579                 enum isl_dim_type type, int pos, isl_int v);
580         __isl_give isl_basic_map *isl_basic_map_add_constraint(
581                 __isl_take isl_basic_map *bmap,
582                 __isl_take isl_constraint *constraint);
583         __isl_give isl_basic_set *isl_basic_set_add_constraint(
584                 __isl_take isl_basic_set *bset,
585                 __isl_take isl_constraint *constraint);
586
587 For example, to create a set containing the even integers
588 between 10 and 42, you would use the following code.
589
590         isl_int v;
591         struct isl_dim *dim;
592         struct isl_constraint *c;
593         struct isl_basic_set *bset;
594
595         isl_int_init(v);
596         dim = isl_dim_set_alloc(ctx, 0, 2);
597         bset = isl_basic_set_universe(isl_dim_copy(dim));
598
599         c = isl_equality_alloc(isl_dim_copy(dim));
600         isl_int_set_si(v, -1);
601         isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
602         isl_int_set_si(v, 2);
603         isl_constraint_set_coefficient(c, isl_dim_set, 1, v);
604         bset = isl_basic_set_add_constraint(bset, c);
605
606         c = isl_inequality_alloc(isl_dim_copy(dim));
607         isl_int_set_si(v, -10);
608         isl_constraint_set_constant(c, v);
609         isl_int_set_si(v, 1);
610         isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
611         bset = isl_basic_set_add_constraint(bset, c);
612
613         c = isl_inequality_alloc(dim);
614         isl_int_set_si(v, 42);
615         isl_constraint_set_constant(c, v);
616         isl_int_set_si(v, -1);
617         isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
618         bset = isl_basic_set_add_constraint(bset, c);
619
620         bset = isl_basic_set_project_out(bset, isl_dim_set, 1, 1);
621
622         isl_int_clear(v);
623
624 =head2 Properties
625
626 =head3 Unary Properties
627
628 =over
629
630 =item Emptiness
631
632 The following functions test whether the given set or relation
633 contains any integer points.  The ``fast'' variants do not perform
634 any computations, but simply check if the given set or relation
635 is already known to be empty.
636
637         int isl_basic_set_fast_is_empty(__isl_keep isl_basic_set *bset);
638         int isl_basic_set_is_empty(__isl_keep isl_basic_set *bset);
639         int isl_set_is_empty(__isl_keep isl_set *set);
640         int isl_basic_map_fast_is_empty(__isl_keep isl_basic_map *bmap);
641         int isl_basic_map_is_empty(__isl_keep isl_basic_map *bmap);
642         int isl_map_fast_is_empty(__isl_keep isl_map *map);
643         int isl_map_is_empty(__isl_keep isl_map *map);
644
645 =item * Universality
646
647         int isl_basic_set_is_universe(__isl_keep isl_basic_set *bset);
648         int isl_basic_map_is_universe(__isl_keep isl_basic_map *bmap);
649
650 =back
651
652 =head3 Binary Properties
653
654 =over
655
656 =item * Equality
657
658         int isl_set_fast_is_equal(__isl_keep isl_set *set1,
659                 __isl_keep isl_set *set2);
660         int isl_set_is_equal(__isl_keep isl_set *set1,
661                 __isl_keep isl_set *set2);
662         int isl_map_is_equal(__isl_keep isl_map *map1,
663                 __isl_keep isl_map *map2);
664         int isl_map_fast_is_equal(__isl_keep isl_map *map1,
665                 __isl_keep isl_map *map2);
666         int isl_basic_map_is_equal(
667                 __isl_keep isl_basic_map *bmap1,
668                 __isl_keep isl_basic_map *bmap2);
669
670 =item * Disjointness
671
672         int isl_set_fast_is_disjoint(__isl_keep isl_set *set1,
673                 __isl_keep isl_set *set2);
674
675 =item * Subset
676
677         int isl_set_is_subset(__isl_keep isl_set *set1,
678                 __isl_keep isl_set *set2);
679         int isl_basic_map_is_subset(
680                 __isl_keep isl_basic_map *bmap1,
681                 __isl_keep isl_basic_map *bmap2);
682         int isl_basic_map_is_strict_subset(
683                 __isl_keep isl_basic_map *bmap1,
684                 __isl_keep isl_basic_map *bmap2);
685         int isl_map_is_subset(
686                 __isl_keep isl_map *map1,
687                 __isl_keep isl_map *map2);
688         int isl_map_is_strict_subset(
689                 __isl_keep isl_map *map1,
690                 __isl_keep isl_map *map2);
691
692 =back
693
694 =head2 Unary Operations
695
696 =over
697
698 =item * Projection
699
700         __isl_give isl_basic_set *isl_basic_set_project_out(
701                 __isl_take isl_basic_set *bset,
702                 enum isl_dim_type type, unsigned first, unsigned n);
703         __isl_give isl_basic_set *isl_basic_map_domain(
704                 __isl_take isl_basic_map *bmap);
705         __isl_give isl_basic_set *isl_basic_map_range(
706                 __isl_take isl_basic_map *bmap);
707         __isl_give isl_set *isl_map_domain(
708                 __isl_take isl_map *bmap);
709         __isl_give isl_set *isl_map_range(
710                 __isl_take isl_map *map);
711
712 C<isl_basic_set_project_out> currently only supports projecting
713 out the final C<isl_dim_set> dimensions.
714
715 =item * Coalescing
716
717 Simplify the representation of a set or relation by trying
718 to combine pairs of basic sets or relations into a single
719 basic set or relation.
720
721         __isl_give isl_set *isl_set_coalesce(__isl_take isl_set *set);
722         __isl_give isl_map *isl_map_coalesce(__isl_take isl_map *map);
723
724 =item * Convex hull
725
726         __isl_give isl_basic_set *isl_set_convex_hull(
727                 __isl_take isl_set *set);
728         __isl_give isl_basic_map *isl_map_convex_hull(
729                 __isl_take isl_map *map);
730
731 If the input set or relation has any existentially quantified
732 variables, then the result of these operations is currently undefined.
733
734 =item * Affine hull
735
736         __isl_give isl_basic_set *isl_basic_set_affine_hull(
737                 __isl_take isl_basic_set *bset);
738         __isl_give isl_basic_set *isl_set_affine_hull(
739                 __isl_take isl_set *set);
740         __isl_give isl_basic_map *isl_basic_map_affine_hull(
741                 __isl_take isl_basic_map *bmap);
742         __isl_give isl_basic_map *isl_map_affine_hull(
743                 __isl_take isl_map *map);
744
745 =back
746
747 =head2 Binary Operations
748
749 The two arguments of a binary operation not only need to live
750 in the same C<isl_ctx>, they currently also need to have
751 the same (number of) parameters.
752
753 =head3 Basic Operations
754
755 =over
756
757 =item * Intersection
758
759         __isl_give isl_basic_set *isl_basic_set_intersect(
760                 __isl_take isl_basic_set *bset1,
761                 __isl_take isl_basic_set *bset2);
762         __isl_give isl_set *isl_set_intersect(
763                 __isl_take isl_set *set1,
764                 __isl_take isl_set *set2);
765         __isl_give isl_basic_map *isl_basic_map_intersect_domain(
766                 __isl_take isl_basic_map *bmap,
767                 __isl_take isl_basic_set *bset);
768         __isl_give isl_basic_map *isl_basic_map_intersect_range(
769                 __isl_take isl_basic_map *bmap,
770                 __isl_take isl_basic_set *bset);
771         __isl_give isl_basic_map *isl_basic_map_intersect(
772                 __isl_take isl_basic_map *bmap1,
773                 __isl_take isl_basic_map *bmap2);
774         __isl_give isl_map *isl_map_intersect_domain(
775                 __isl_take isl_map *map,
776                 __isl_take isl_set *set);
777         __isl_give isl_map *isl_map_intersect_range(
778                 __isl_take isl_map *map,
779                 __isl_take isl_set *set);
780         __isl_give isl_map *isl_map_intersect(
781                 __isl_take isl_map *map1,
782                 __isl_take isl_map *map2);
783
784 =item * Union
785
786         __isl_give isl_set *isl_basic_set_union(
787                 __isl_take isl_basic_set *bset1,
788                 __isl_take isl_basic_set *bset2);
789         __isl_give isl_map *isl_basic_map_union(
790                 __isl_take isl_basic_map *bmap1,
791                 __isl_take isl_basic_map *bmap2);
792         __isl_give isl_set *isl_set_union(
793                 __isl_take isl_set *set1,
794                 __isl_take isl_set *set2);
795         __isl_give isl_map *isl_map_union(
796                 __isl_take isl_map *map1,
797                 __isl_take isl_map *map2);
798
799 =item * Set difference
800
801         __isl_give isl_set *isl_set_subtract(
802                 __isl_take isl_set *set1,
803                 __isl_take isl_set *set2);
804         __isl_give isl_map *isl_map_subtract(
805                 __isl_take isl_map *map1,
806                 __isl_take isl_map *map2);
807
808 =item * Application
809
810         __isl_give isl_basic_set *isl_basic_set_apply(
811                 __isl_take isl_basic_set *bset,
812                 __isl_take isl_basic_map *bmap);
813         __isl_give isl_set *isl_set_apply(
814                 __isl_take isl_set *set,
815                 __isl_take isl_map *map);
816         __isl_give isl_basic_map *isl_basic_map_apply_domain(
817                 __isl_take isl_basic_map *bmap1,
818                 __isl_take isl_basic_map *bmap2);
819         __isl_give isl_basic_map *isl_basic_map_apply_range(
820                 __isl_take isl_basic_map *bmap1,
821                 __isl_take isl_basic_map *bmap2);
822         __isl_give isl_map *isl_map_apply_domain(
823                 __isl_take isl_map *map1,
824                 __isl_take isl_map *map2);
825         __isl_give isl_map *isl_map_apply_range(
826                 __isl_take isl_map *map1,
827                 __isl_take isl_map *map2);
828
829 =back
830
831 =head3 Lexicographic Optimization
832
833 Given a basic set C<bset> and a zero-dimensional domain C<dom>,
834 the following functions
835 compute a set that contains the lexicographic minimum or maximum
836 of the elements in C<bset> for those values of the parameters
837 that satisfy C<dom>.
838 If C<empty> is not C<NULL>, then C<*empty> is assigned a set
839 that contains the parameter values in C<dom> for which C<bset>
840 has no elements.
841 In other words, the union of the parameter values
842 for which the result is non-empty and of C<*empty>
843 is equal to C<dom>.
844
845         __isl_give isl_set *isl_basic_set_partial_lexmin(
846                 __isl_take isl_basic_set *bset,
847                 __isl_take isl_basic_set *dom,
848                 __isl_give isl_set **empty);
849         __isl_give isl_set *isl_basic_set_partial_lexmax(
850                 __isl_take isl_basic_set *bset,
851                 __isl_take isl_basic_set *dom,
852                 __isl_give isl_set **empty);
853
854 Given a basic set C<bset>, the following function simply
855 returns a set contains the lexicographic minimum
856 of the elements in C<bset>.
857
858         __isl_give isl_set *isl_basic_set_lexmin(
859                 __isl_take isl_basic_set *bset);
860
861 Given a basic relation C<bmap> and a domain C<dom>,
862 the following functions
863 compute a relation that maps each element of C<dom>
864 to the single lexicographic minimum or maximum
865 of the elements that are associated to that same
866 element in C<bmap>.
867 If C<empty> is not C<NULL>, then C<*empty> is assigned a set
868 that contains the elements in C<dom> that do not map
869 to any elements in C<bmap>.
870 In other words, the union of the domain of the result and of C<*empty>
871 is equal to C<dom>.
872
873         __isl_give isl_map *isl_basic_map_partial_lexmax(
874                 __isl_take isl_basic_map *bmap,
875                 __isl_take isl_basic_set *dom,
876                 __isl_give isl_set **empty);
877         __isl_give isl_map *isl_basic_map_partial_lexmin(
878                 __isl_take isl_basic_map *bmap,
879                 __isl_take isl_basic_set *dom,
880                 __isl_give isl_set **empty);
881
882 =head1 Applications
883
884 Although C<isl> is mainly meant to be used as a library,
885 it also contains some basic applications that use some
886 of the functionality of C<isl>.
887 Since C<isl> does not have its own input format yet, these
888 applications currently take input in C<PolyLib> style.
889 That is, a line with the number of rows and columns,
890 where the number of rows is equal to the number of constraints
891 and the number of columns is equal to two plus the number of variables,
892 followed by the actual rows.
893 In each row, the first column indicates whether the constraint
894 is an equality (C<0>) or inequality (C<1>).  The final column
895 corresponds to the constant term.
896
897 =head2 C<isl_polyhedron_sample>
898
899 C<isl_polyhedron_sample>
900 takes a polyhedron in C<PolyLib> format as input and prints
901 an integer element of the polyhedron, if there is any.
902 The first column in the output is the denominator and is always
903 equal to 1.  If the polyhedron contains no integer points,
904 then a vector of length zero is printed.
905
906 =head2 C<isl_pip>
907
908 C<isl_pip> takes the same input as the C<example> program
909 from the C<piplib> distribution, i.e., a set of constraints
910 on the parameters in C<PolyLib> format,
911 a line contains only -1 and finally a set
912 of constraints on a parametric polyhedron, again in C<PolyLib> format.
913 The coefficients of the parameters appear in the last columns
914 (but before the final constant column).
915 The output is the lexicographic minimum of the parametric polyhedron.
916 As C<isl> currently does not have its own output format, the output
917 is just a dump of the internal state.
918
919 =head2 C<isl_polyhedron_minimize>
920
921 C<isl_polyhedron_minimize> computes the minimum of some linear
922 or affine objective function over the integer points in a polyhedron.
923 The input is in C<PolyLib> format.  If an affine objective function
924 is given, then the constant should appear in the last column.
925
926 =head2 C<isl_polytope_scan>
927
928 Given a polytope in C<PolyLib> format, C<isl_polytope_scan> prints
929 all integer points in the polytope.