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
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.
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.
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
28 =head2 Installation from the git repository
32 =item 1 Clone or update the repository
34 The first time the source is obtained, you need to clone
37 git clone git://repo.or.cz/isl.git
39 To obtain updates, you need to pull in the latest changes
43 =item 2 Get submodule (optional)
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
52 To obtain updates, you only need
56 Note that C<isl> currently does not use any C<piplib>
57 functionality by default.
59 =item 3 Generate C<configure>
65 After performing the above steps, continue
66 with the L<Common installation instructions>.
68 =head2 Common installation instructions
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/>.
82 C<isl> uses the standard C<autoconf> C<configure> script.
87 optionally followed by some configure options.
88 A complete list of options can be obtained by running
92 Below we discuss some of the more common options.
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
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>.
110 Installation prefix for C<isl>
112 =item C<--with-gmp-prefix>
114 Installation prefix for C<GMP> (architecture-independent files).
116 =item C<--with-gmp-exec-prefix>
118 Installation prefix for C<GMP> (architecture-dependent files).
120 =item C<--with-polylib>
122 Which copy of C<PolyLib> to use, either C<no> (default), C<system> or C<build>.
124 =item C<--with-polylib-prefix>
126 Installation prefix for C<system> C<PolyLib> (architecture-independent files).
128 =item C<--with-polylib-exec-prefix>
130 Installation prefix for C<system> C<PolyLib> (architecture-dependent files).
132 =item C<--with-polylib-builddir>
134 Location where C<build> C<PolyLib> was built.
136 =item C<--with-piplib>
138 Which copy of C<piplib> to use, either C<no> (default), C<system>, C<build>
139 or C<bundled>. Note that C<bundled> only works if you have obtained
140 C<isl> and its submodules from the git repository.
142 =item C<--with-piplib-prefix>
144 Installation prefix for C<system> C<piplib> (architecture-independent files).
146 =item C<--with-piplib-exec-prefix>
148 Installation prefix for C<system> C<piplib> (architecture-dependent files).
150 =item C<--with-piplib-builddir>
152 Location where C<build> C<piplib> was built.
160 =item 4 Install (optional)
168 =head2 Initialization
170 All manipulations of integer sets and relations occur within
171 the context of an C<isl_ctx>.
172 A given C<isl_ctx> can only be used within a single thread.
173 All arguments of a function are required to have been allocated
174 within the same context.
175 There are currently no functions available for moving an object
176 from one C<isl_ctx> to another C<isl_ctx>. This means that
177 there is currently no way of safely moving an object from one
178 thread to another, unless the whole C<isl_ctx> is moved.
180 An C<isl_ctx> can be allocated using C<isl_ctx_alloc> and
181 freed using C<isl_ctx_free>.
182 All objects allocated within an C<isl_ctx> should be freed
183 before the C<isl_ctx> itself is freed.
185 isl_ctx *isl_ctx_alloc();
186 void isl_ctx_free(isl_ctx *ctx);
190 All operations on integers, mainly the coefficients
191 of the constraints describing the sets and relations,
192 are performed in exact integer arithmetic using C<GMP>.
193 However, to allow future versions of C<isl> to optionally
194 support fixed integer arithmetic, all calls to C<GMP>
195 are wrapped inside C<isl> specific macros.
196 The basic type is C<isl_int> and the following operations
197 are available on this type.
201 =item isl_int_init(i)
203 =item isl_int_clear(i)
205 =item isl_int_set(r,i)
207 =item isl_int_set_si(r,i)
209 =item isl_int_abs(r,i)
211 =item isl_int_neg(r,i)
213 =item isl_int_swap(i,j)
215 =item isl_int_swap_or_set(i,j)
217 =item isl_int_add_ui(r,i,j)
219 =item isl_int_sub_ui(r,i,j)
221 =item isl_int_add(r,i,j)
223 =item isl_int_sub(r,i,j)
225 =item isl_int_mul(r,i,j)
227 =item isl_int_mul_ui(r,i,j)
229 =item isl_int_addmul(r,i,j)
231 =item isl_int_submul(r,i,j)
233 =item isl_int_gcd(r,i,j)
235 =item isl_int_lcm(r,i,j)
237 =item isl_int_divexact(r,i,j)
239 =item isl_int_cdiv_q(r,i,j)
241 =item isl_int_fdiv_q(r,i,j)
243 =item isl_int_fdiv_r(r,i,j)
245 =item isl_int_fdiv_q_ui(r,i,j)
247 =item isl_int_read(r,s)
249 =item isl_int_print(out,i,width)
253 =item isl_int_cmp(i,j)
255 =item isl_int_cmp_si(i,si)
257 =item isl_int_eq(i,j)
259 =item isl_int_ne(i,j)
261 =item isl_int_lt(i,j)
263 =item isl_int_le(i,j)
265 =item isl_int_gt(i,j)
267 =item isl_int_ge(i,j)
269 =item isl_int_abs_eq(i,j)
271 =item isl_int_abs_ne(i,j)
273 =item isl_int_abs_lt(i,j)
275 =item isl_int_abs_gt(i,j)
277 =item isl_int_abs_ge(i,j)
279 =item isl_int_is_zero(i)
281 =item isl_int_is_one(i)
283 =item isl_int_is_negone(i)
285 =item isl_int_is_pos(i)
287 =item isl_int_is_neg(i)
289 =item isl_int_is_nonpos(i)
291 =item isl_int_is_nonneg(i)
293 =item isl_int_is_divisible_by(i,j)
297 =head2 Sets and Relations
299 C<isl> uses four types of objects for representing sets and relations,
300 C<isl_basic_set>, C<isl_basic_map>, C<isl_set> and C<isl_map>.
301 C<isl_basic_set> and C<isl_basic_map> represent sets and relations that
302 can be described as a conjunction of affine constraints, while
303 C<isl_set> and C<isl_map> represent unions of
304 C<isl_basic_set>s and C<isl_basic_map>s, respectively.
305 The difference between sets and relations (maps) is that sets have
306 one set of variables, while relations have two sets of variables,
307 input variables and output variables.
309 =head2 Memory Management
311 Since a high-level operation on sets and/or relations usually involves
312 several substeps and since the user is usually not interested in
313 the intermediate results, most functions that return a new object
314 will also release all the objects passed as arguments.
315 If the user still wants to use one or more of these arguments
316 after the function call, she should pass along a copy of the
317 object rather than the object itself.
318 The user is then responsible for make sure that the original
319 object gets used somewhere else or is explicitly freed.
321 The arguments and return values of all documents functions are
322 annotated to make clear which arguments are released and which
323 arguments are preserved. In particular, the following annotations
330 C<__isl_give> means that a new object is returned.
331 The user should make sure that the returned pointer is
332 used exactly once as a value for an C<__isl_take> argument.
333 In between, it can be used as a value for as many
334 C<__isl_keep> arguments as the user likes.
335 There is one exception, and that is the case where the
336 pointer returned is C<NULL>. Is this case, the user
337 is free to use it as an C<__isl_take> argument or not.
341 C<__isl_take> means that the object the argument points to
342 is taken over by the function and may no longer be used
343 by the user as an argument to any other function.
344 The pointer value must be one returned by a function
345 returning an C<__isl_give> pointer.
346 If the user passes in a C<NULL> value, then this will
347 be treated as an error in the sense that the function will
348 not perform its usual operation. However, it will still
349 make sure that all the the other C<__isl_take> arguments
354 C<__isl_keep> means that the function will only use the object
355 temporarily. After the function has finished, the user
356 can still use it as an argument to other functions.
357 A C<NULL> value will be treated in the same way as
358 a C<NULL> value for an C<__isl_take> argument.
362 =head2 Dimension Specifications
364 Whenever a new set or relation is created from scratch,
365 its dimension needs to be specified using an C<isl_dim>.
368 __isl_give isl_dim *isl_dim_alloc(isl_ctx *ctx,
369 unsigned nparam, unsigned n_in, unsigned n_out);
370 __isl_give isl_dim *isl_dim_set_alloc(isl_ctx *ctx,
371 unsigned nparam, unsigned dim);
372 __isl_give isl_dim *isl_dim_copy(__isl_keep isl_dim *dim);
373 void isl_dim_free(__isl_take isl_dim *dim);
374 unsigned isl_dim_size(__isl_keep isl_dim *dim,
375 enum isl_dim_type type);
377 The dimension specification used for creating a set
378 needs to be created using C<isl_dim_set_alloc>, while
379 that for creating a relation
380 needs to be created using C<isl_dim_alloc>.
381 C<isl_dim_size> can be used
382 to find out the number of dimensions of each type in
383 a dimension specification, where type may be
384 C<isl_dim_param>, C<isl_dim_in> (only for relations),
385 C<isl_dim_out> (only for relations), C<isl_dim_set>
386 (only for sets) or C<isl_dim_all>.
388 =head2 Input and Output
390 Proper input and output functions are still in development.
391 However, some functions are provided to read and write
392 to foreign file formats and to convert between
393 C<isl> objects and C<PolyLib> objects (if C<PolyLib> is available).
398 __isl_give isl_basic_set *isl_basic_set_read_from_file(
399 isl_ctx *ctx, FILE *input, unsigned nparam,
400 unsigned input_format);
401 __isl_give isl_basic_set *isl_basic_set_read_from_str(
402 isl_ctx *ctx, const char *str, unsigned nparam,
403 unsigned input_format);
404 __isl_give isl_set *isl_set_read_from_file(isl_ctx *ctx,
405 FILE *input, unsigned nparam,
406 unsigned input_format);
409 __isl_give isl_basic_map *isl_basic_map_read_from_file(
410 isl_ctx *ctx, FILE *input, unsigned nparam,
411 unsigned input_format);
413 C<input_format> may be either C<ISL_FORMAT_POLYLIB> or
414 C<ISL_FORMAT_OMEGA>. However, not all combination are currently
415 supported. Furthermore, only a very limited subset of
416 the C<Omega> input format is currently supported.
417 In particular, C<isl_basic_set_read_from_str> and
418 C<isl_basic_map_read_from_file> only
419 support C<ISL_FORMAT_OMEGA>, while C<isl_set_read_from_file>
420 only supports C<ISL_FORMAT_POLYLIB>.
421 C<nparam> specifies how many of the final columns in
422 the C<PolyLib> format correspond to parameters. It should
423 be zero when C<ISL_FORMAT_OMEGA> is used.
428 void isl_basic_set_print(__isl_keep isl_basic_set *bset,
429 FILE *out, int indent,
430 const char *prefix, const char *suffix,
431 unsigned output_format);
432 void isl_set_print(__isl_keep struct isl_set *set,
433 FILE *out, int indent, unsigned output_format);
435 C<input_format> must be C<ISL_FORMAT_POLYLIB>.
436 Each line in the output is indented by C<indent> spaces,
437 prefixed by C<prefix> and suffixed by C<suffix>.
438 The coefficients of the existentially quantified variables
439 appear between those of the set variables and those
442 =head3 Conversion from/to C<PolyLib>
444 The following functions are only available if C<isl> has
445 been configured to use C<PolyLib>.
447 #include <isl_set_polylib.h>
448 __isl_give isl_basic_set *isl_basic_set_new_from_polylib(
449 Polyhedron *P, __isl_take isl_dim *dim);
450 Polyhedron *isl_basic_set_to_polylib(
451 __isl_keep isl_basic_set *bset);
452 __isl_give isl_set *isl_set_new_from_polylib(Polyhedron *D,
453 __isl_take isl_dim *dim);
454 Polyhedron *isl_set_to_polylib(__isl_keep isl_set *set);
456 #include <isl_map_polylib.h>
457 __isl_give isl_basic_map *isl_basic_map_new_from_polylib(
458 Polyhedron *P, __isl_take isl_dim *dim);
459 __isl_give isl_map *isl_map_new_from_polylib(Polyhedron *D,
460 __isl_take isl_dim *dim);
461 Polyhedron *isl_basic_map_to_polylib(
462 __isl_keep isl_basic_map *bmap);
463 Polyhedron *isl_map_to_polylib(__isl_keep isl_map *map);
465 =head3 Dumping the internal state
467 For lack of proper output functions, the following functions
468 can be used to dump the internal state of a set or relation.
469 The user should not depend on the output format of these functions.
471 void isl_basic_set_dump(__isl_keep isl_basic_set *bset,
472 FILE *out, int indent);
473 void isl_basic_map_dump(__isl_keep isl_basic_map *bmap,
474 FILE *out, int indent);
475 void isl_set_dump(__isl_keep isl_set *set,
476 FILE *out, int indent);
477 void isl_map_dump(__isl_keep isl_map *map,
478 FILE *out, int indent);
480 =head2 Creating New Sets and Relations
482 C<isl> has functions for creating some standard sets and relations.
486 =item * Empty sets and relations
488 __isl_give isl_basic_set *isl_basic_set_empty(
489 __isl_take isl_dim *dim);
490 __isl_give isl_basic_map *isl_basic_map_empty(
491 __isl_take isl_dim *dim);
492 __isl_give isl_set *isl_set_empty(
493 __isl_take isl_dim *dim);
494 __isl_give isl_map *isl_map_empty(
495 __isl_take isl_dim *dim);
497 =item * Universe sets and relations
499 __isl_give isl_basic_set *isl_basic_set_universe(
500 __isl_take isl_dim *dim);
501 __isl_give isl_basic_map *isl_basic_map_universe(
502 __isl_take isl_dim *dim);
503 __isl_give isl_set *isl_set_universe(
504 __isl_take isl_dim *dim);
505 __isl_give isl_map *isl_map_universe(
506 __isl_take isl_dim *dim);
508 =item * Identity relations
510 __isl_give isl_basic_map *isl_basic_map_identity(
511 __isl_take isl_dim *set_dim);
512 __isl_give isl_map *isl_map_identity(
513 __isl_take isl_dim *set_dim);
515 These functions take a dimension specification for a B<set>
516 and return an identity relation between two such sets.
518 =item * Lexicographic order
520 __isl_give isl_map *isl_map_lex_lt(
521 __isl_take isl_dim *set_dim);
522 __isl_give isl_map *isl_map_lex_le(
523 __isl_take isl_dim *set_dim);
524 __isl_give isl_map *isl_map_lex_gt(
525 __isl_take isl_dim *set_dim);
526 __isl_give isl_map *isl_map_lex_ge(
527 __isl_take isl_dim *set_dim);
529 These functions take a dimension specification for a B<set>
530 and return relations that express that the elements in the domain
531 are lexicograhically less
532 (C<isl_map_lex_lt>), less or equal (C<isl_map_lex_le>),
533 greater (C<isl_map_lex_gt>) or greater or equal (C<isl_map_lex_ge>)
534 than the elements in the range.
538 A basic set or relation can be converted to a set or relation
539 using the following functions.
541 __isl_give isl_set *isl_set_from_basic_set(
542 __isl_take isl_basic_set *bset);
543 __isl_give isl_map *isl_map_from_basic_map(
544 __isl_take isl_basic_map *bmap);
546 Sets and relations can be copied and freed again using the following
549 __isl_give isl_basic_set *isl_basic_set_copy(
550 __isl_keep isl_basic_set *bset);
551 __isl_give isl_set *isl_set_copy(__isl_keep isl_set *set);
552 __isl_give isl_basic_map *isl_basic_map_copy(
553 __isl_keep isl_basic_map *bmap);
554 __isl_give isl_map *isl_map_copy(__isl_keep isl_map *map);
555 void isl_basic_set_free(__isl_take isl_basic_set *bset);
556 void isl_set_free(__isl_take isl_set *set);
557 void isl_basic_map_free(__isl_take isl_basic_map *bmap);
558 void isl_map_free(__isl_take isl_map *map);
560 Other sets and relations can be constructed by starting
561 from a universe set or relation, adding equality and/or
562 inequality constraints and then projecting out the
563 existentially quantified variables, if any.
564 Constraints can be constructed, manipulated and
565 added to basic sets and relations using the following functions.
567 #include <isl_constraint.h>
568 __isl_give isl_constraint *isl_equality_alloc(
569 __isl_take isl_dim *dim);
570 __isl_give isl_constraint *isl_inequality_alloc(
571 __isl_take isl_dim *dim);
572 void isl_constraint_set_constant(
573 __isl_keep isl_constraint *constraint, isl_int v);
574 void isl_constraint_set_coefficient(
575 __isl_keep isl_constraint *constraint,
576 enum isl_dim_type type, int pos, isl_int v);
577 __isl_give isl_basic_map *isl_basic_map_add_constraint(
578 __isl_take isl_basic_map *bmap,
579 __isl_take isl_constraint *constraint);
580 __isl_give isl_basic_set *isl_basic_set_add_constraint(
581 __isl_take isl_basic_set *bset,
582 __isl_take isl_constraint *constraint);
584 For example, to create a set containing the even integers
585 between 10 and 42, you would use the following code.
589 struct isl_constraint *c;
590 struct isl_basic_set *bset;
593 dim = isl_dim_set_alloc(ctx, 0, 2);
594 bset = isl_basic_set_universe(isl_dim_copy(dim));
596 c = isl_equality_alloc(isl_dim_copy(dim));
597 isl_int_set_si(v, -1);
598 isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
599 isl_int_set_si(v, 2);
600 isl_constraint_set_coefficient(c, isl_dim_set, 1, v);
601 bset = isl_basic_set_add_constraint(bset, c);
603 c = isl_inequality_alloc(isl_dim_copy(dim));
604 isl_int_set_si(v, -10);
605 isl_constraint_set_constant(c, v);
606 isl_int_set_si(v, 1);
607 isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
608 bset = isl_basic_set_add_constraint(bset, c);
610 c = isl_inequality_alloc(dim);
611 isl_int_set_si(v, 42);
612 isl_constraint_set_constant(c, v);
613 isl_int_set_si(v, -1);
614 isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
615 bset = isl_basic_set_add_constraint(bset, c);
617 bset = isl_basic_set_project_out(bset, isl_dim_set, 1, 1);
623 =head3 Unary Properties
629 The following functions test whether the given set or relation
630 contains any integer points. The ``fast'' variants do not perform
631 any computations, but simply check if the given set or relation
632 is already known to be empty.
634 int isl_basic_set_fast_is_empty(__isl_keep isl_basic_set *bset);
635 int isl_basic_set_is_empty(__isl_keep isl_basic_set *bset);
636 int isl_set_is_empty(__isl_keep isl_set *set);
637 int isl_basic_map_fast_is_empty(__isl_keep isl_basic_map *bmap);
638 int isl_basic_map_is_empty(__isl_keep isl_basic_map *bmap);
639 int isl_map_fast_is_empty(__isl_keep isl_map *map);
640 int isl_map_is_empty(__isl_keep isl_map *map);
644 int isl_basic_set_is_universe(__isl_keep isl_basic_set *bset);
645 int isl_basic_map_is_universe(__isl_keep isl_basic_map *bmap);
649 =head3 Binary Properties
655 int isl_set_fast_is_equal(__isl_keep isl_set *set1,
656 __isl_keep isl_set *set2);
657 int isl_set_is_equal(__isl_keep isl_set *set1,
658 __isl_keep isl_set *set2);
659 int isl_map_is_equal(__isl_keep isl_map *map1,
660 __isl_keep isl_map *map2);
661 int isl_map_fast_is_equal(__isl_keep isl_map *map1,
662 __isl_keep isl_map *map2);
663 int isl_basic_map_is_equal(
664 __isl_keep isl_basic_map *bmap1,
665 __isl_keep isl_basic_map *bmap2);
669 int isl_set_fast_is_disjoint(__isl_keep isl_set *set1,
670 __isl_keep isl_set *set2);
674 int isl_set_is_subset(__isl_keep isl_set *set1,
675 __isl_keep isl_set *set2);
676 int isl_basic_map_is_subset(
677 __isl_keep isl_basic_map *bmap1,
678 __isl_keep isl_basic_map *bmap2);
679 int isl_basic_map_is_strict_subset(
680 __isl_keep isl_basic_map *bmap1,
681 __isl_keep isl_basic_map *bmap2);
682 int isl_map_is_subset(
683 __isl_keep isl_map *map1,
684 __isl_keep isl_map *map2);
685 int isl_map_is_strict_subset(
686 __isl_keep isl_map *map1,
687 __isl_keep isl_map *map2);
691 =head2 Unary Operations
697 __isl_give isl_basic_set *isl_basic_set_project_out(
698 __isl_take isl_basic_set *bset,
699 enum isl_dim_type type, unsigned first, unsigned n);
700 __isl_give isl_basic_set *isl_basic_map_domain(
701 __isl_take isl_basic_map *bmap);
702 __isl_give isl_basic_set *isl_basic_map_range(
703 __isl_take isl_basic_map *bmap);
704 __isl_give isl_set *isl_map_domain(
705 __isl_take isl_map *bmap);
706 __isl_give isl_set *isl_map_range(
707 __isl_take isl_map *map);
709 C<isl_basic_set_project_out> currently only supports projecting
710 out the final C<isl_dim_set> dimensions.
714 Simplify the representation of a set or relation by trying
715 to combine pairs of basic sets or relations into a single
716 basic set or relation.
718 __isl_give isl_set *isl_set_coalesce(__isl_take isl_set *set);
719 __isl_give isl_map *isl_map_coalesce(__isl_take isl_map *map);
723 __isl_give isl_basic_set *isl_set_convex_hull(
724 __isl_take isl_set *set);
725 __isl_give isl_basic_map *isl_map_convex_hull(
726 __isl_take isl_map *map);
728 If the input set or relation has any existentially quantified
729 variables, then the result of these operations is currently undefined.
733 __isl_give isl_basic_set *isl_basic_set_affine_hull(
734 __isl_take isl_basic_set *bset);
735 __isl_give isl_basic_set *isl_set_affine_hull(
736 __isl_take isl_set *set);
737 __isl_give isl_basic_map *isl_basic_map_affine_hull(
738 __isl_take isl_basic_map *bmap);
739 __isl_give isl_basic_map *isl_map_affine_hull(
740 __isl_take isl_map *map);
744 =head2 Binary Operations
746 The two arguments of a binary operation not only need to live
747 in the same C<isl_ctx>, they currently also need to have
748 the same (number of) parameters.
750 =head3 Basic Operations
756 __isl_give isl_basic_set *isl_basic_set_intersect(
757 __isl_take isl_basic_set *bset1,
758 __isl_take isl_basic_set *bset2);
759 __isl_give isl_set *isl_set_intersect(
760 __isl_take isl_set *set1,
761 __isl_take isl_set *set2);
762 __isl_give isl_basic_map *isl_basic_map_intersect_domain(
763 __isl_take isl_basic_map *bmap,
764 __isl_take isl_basic_set *bset);
765 __isl_give isl_basic_map *isl_basic_map_intersect_range(
766 __isl_take isl_basic_map *bmap,
767 __isl_take isl_basic_set *bset);
768 __isl_give isl_basic_map *isl_basic_map_intersect(
769 __isl_take isl_basic_map *bmap1,
770 __isl_take isl_basic_map *bmap2);
771 __isl_give isl_map *isl_map_intersect_domain(
772 __isl_take isl_map *map,
773 __isl_take isl_set *set);
774 __isl_give isl_map *isl_map_intersect_range(
775 __isl_take isl_map *map,
776 __isl_take isl_set *set);
777 __isl_give isl_map *isl_map_intersect(
778 __isl_take isl_map *map1,
779 __isl_take isl_map *map2);
783 __isl_give isl_set *isl_basic_set_union(
784 __isl_take isl_basic_set *bset1,
785 __isl_take isl_basic_set *bset2);
786 __isl_give isl_map *isl_basic_map_union(
787 __isl_take isl_basic_map *bmap1,
788 __isl_take isl_basic_map *bmap2);
789 __isl_give isl_set *isl_set_union(
790 __isl_take isl_set *set1,
791 __isl_take isl_set *set2);
792 __isl_give isl_map *isl_map_union(
793 __isl_take isl_map *map1,
794 __isl_take isl_map *map2);
796 =item * Set difference
798 __isl_give isl_set *isl_set_subtract(
799 __isl_take isl_set *set1,
800 __isl_take isl_set *set2);
801 __isl_give isl_map *isl_map_subtract(
802 __isl_take isl_map *map1,
803 __isl_take isl_map *map2);
807 __isl_give isl_basic_set *isl_basic_set_apply(
808 __isl_take isl_basic_set *bset,
809 __isl_take isl_basic_map *bmap);
810 __isl_give isl_set *isl_set_apply(
811 __isl_take isl_set *set,
812 __isl_take isl_map *map);
813 __isl_give isl_basic_map *isl_basic_map_apply_domain(
814 __isl_take isl_basic_map *bmap1,
815 __isl_take isl_basic_map *bmap2);
816 __isl_give isl_basic_map *isl_basic_map_apply_range(
817 __isl_take isl_basic_map *bmap1,
818 __isl_take isl_basic_map *bmap2);
819 __isl_give isl_map *isl_map_apply_domain(
820 __isl_take isl_map *map1,
821 __isl_take isl_map *map2);
822 __isl_give isl_map *isl_map_apply_range(
823 __isl_take isl_map *map1,
824 __isl_take isl_map *map2);
828 =head3 Lexicographic Optimization
830 Given a basic set C<bset> and a zero-dimensional domain C<dom>,
831 the following functions
832 compute a set that contains the lexicographic minimum or maximum
833 of the elements in C<bset> for those values of the parameters
835 If C<empty> is not C<NULL>, then C<*empty> is assigned a set
836 that contains the parameter values in C<dom> for which C<bset>
838 In other words, the union of the parameter values
839 for which the result is non-empty and of C<*empty>
842 __isl_give isl_set *isl_basic_set_partial_lexmin(
843 __isl_take isl_basic_set *bset,
844 __isl_take isl_basic_set *dom,
845 __isl_give isl_set **empty);
846 __isl_give isl_set *isl_basic_set_partial_lexmax(
847 __isl_take isl_basic_set *bset,
848 __isl_take isl_basic_set *dom,
849 __isl_give isl_set **empty);
851 Given a basic set C<bset>, the following function simply
852 returns a set contains the lexicographic minimum
853 of the elements in C<bset>.
855 __isl_give isl_set *isl_basic_set_lexmin(
856 __isl_take isl_basic_set *bset);
858 Given a basic relation C<bmap> and a domain C<dom>,
859 the following functions
860 compute a relation that maps each element of C<dom>
861 to the single lexicographic minimum or maximum
862 of the elements that are associated to that same
864 If C<empty> is not C<NULL>, then C<*empty> is assigned a set
865 that contains the elements in C<dom> that do not map
866 to any elements in C<bmap>.
867 In other words, the union of the domain of the result and of C<*empty>
870 __isl_give isl_map *isl_basic_map_partial_lexmax(
871 __isl_take isl_basic_map *bmap,
872 __isl_take isl_basic_set *dom,
873 __isl_give isl_set **empty);
874 __isl_give isl_map *isl_basic_map_partial_lexmin(
875 __isl_take isl_basic_map *bmap,
876 __isl_take isl_basic_set *dom,
877 __isl_give isl_set **empty);
881 Although C<isl> is mainly meant to be used as a library,
882 it also contains some basic applications that use some
883 of the functionality of C<isl>.
884 Since C<isl> does not have its own input format yet, these
885 applications currently take input in C<PolyLib> style.
886 That is, a line with the number of rows and columns,
887 where the number of rows is equal to the number of constraints
888 and the number of columns is equal to two plus the number of variables,
889 followed by the actual rows.
890 In each row, the first column indicates whether the constraint
891 is an equality (C<0>) or inequality (C<1>). The final column
892 corresponds to the constant term.
894 =head2 C<isl_polyhedron_sample>
896 C<isl_polyhedron_sample>
897 takes a polyhedron in C<PolyLib> format as input and prints
898 an integer element of the polyhedron, if there is any.
899 The first column in the output is the denominator and is always
900 equal to 1. If the polyhedron contains no integer points,
901 then a vector of length zero is printed.
905 C<isl_pip> takes the same input as the C<example> program
906 from the C<piplib> distribution, i.e., a set of constraints
907 on the parameters in C<PolyLib> format,
908 a line contains only -1 and finally a set
909 of constraints on a parametric polyhedron, again in C<PolyLib> format.
910 The coefficients of the parameters appear in the last columns
911 (but before the final constant column).
912 The output is the lexicographic minimum of the parametric polyhedron.
913 As C<isl> currently does not have its own output format, the output
914 is just a dump of the internal state.
916 =head2 C<isl_polyhedron_minimize>
918 C<isl_polyhedron_minimize> computes the minimum of some linear
919 or affine objective function over the integer points in a polyhedron.
920 The input is in C<PolyLib> format. If an affine objective function
921 is given, then the constant should appear in the last column.
923 =head2 C<isl_polytope_scan>
925 Given a polytope in C<PolyLib> format, C<isl_polytope_scan> prints
926 all integer points in the polytope.