2 * Copyright 2010 INRIA Saclay
3 * Copyright 2012 Ecole Normale Superieure
5 * Use of this software is governed by the MIT license
7 * Written by Sven Verdoolaege,
8 * INRIA Saclay - Ile-de-France, Parc Club Orsay Universite,
9 * ZAC des vignes, 4 rue Jacques Monod, 91893 Orsay, France
10 * and Ecole Normale Superieure, 45 rue d’Ulm, 75230 Paris, France
13 /* Function for computing the lexicographic optimum of a map
14 * in the form of either an isl_map or an isl_pw_multi_aff.
17 #define xSF(TYPE,SUFFIX) TYPE ## SUFFIX
18 #define SF(TYPE,SUFFIX) xSF(TYPE,SUFFIX)
20 /* Compute the lexicographic minimum (or maximum if "flags" includes
21 * ISL_OPT_MAX) of "bmap" over the domain "dom" and return the result.
22 * If "empty" is not NULL, then *empty is assigned a set that
23 * contains those parts of the domain where there is no solution.
24 * If "flags" includes ISL_OPT_FULL, then "dom" is NULL and the optimum
25 * should be computed over the domain of "bmap". "empty" is also NULL
27 * If "bmap" is marked as rational (ISL_BASIC_MAP_RATIONAL),
28 * then the rational optimum is computed. Otherwise, the integral optimum
31 static __isl_give TYPE
*SF(isl_basic_map_partial_lexopt
,SUFFIX
)(
32 __isl_take isl_basic_map
*bmap
, __isl_take isl_basic_set
*dom
,
33 __isl_give isl_set
**empty
, unsigned flags
)
35 return SF(isl_tab_basic_map_partial_lexopt
,SUFFIX
)(bmap
, dom
, empty
,
39 __isl_give TYPE
*SF(isl_basic_map_partial_lexmax
,SUFFIX
)(
40 __isl_take isl_basic_map
*bmap
, __isl_take isl_basic_set
*dom
,
41 __isl_give isl_set
**empty
)
43 unsigned flags
= ISL_OPT_MAX
;
44 return SF(isl_basic_map_partial_lexopt
,SUFFIX
)(bmap
, dom
, empty
, flags
);
47 __isl_give TYPE
*SF(isl_basic_map_partial_lexmin
,SUFFIX
)(
48 __isl_take isl_basic_map
*bmap
, __isl_take isl_basic_set
*dom
,
49 __isl_give isl_set
**empty
)
52 return SF(isl_basic_map_partial_lexopt
,SUFFIX
)(bmap
, dom
, empty
, flags
);
55 __isl_give TYPE
*SF(isl_basic_set_partial_lexmin
,SUFFIX
)(
56 __isl_take isl_basic_set
*bset
, __isl_take isl_basic_set
*dom
,
57 __isl_give isl_set
**empty
)
59 return SF(isl_basic_map_partial_lexmin
,SUFFIX
)(bset
, dom
, empty
);
62 __isl_give TYPE
*SF(isl_basic_set_partial_lexmax
,SUFFIX
)(
63 __isl_take isl_basic_set
*bset
, __isl_take isl_basic_set
*dom
,
64 __isl_give isl_set
**empty
)
66 return SF(isl_basic_map_partial_lexmax
,SUFFIX
)(bset
, dom
, empty
);
69 /* Given a basic map "bmap", compute the lexicographically minimal
70 * (or maximal) image element for each domain element in dom.
71 * If empty is not NULL, then set *empty to those elements in dom
72 * that do not have an image element.
73 * If "flags" includes ISL_OPT_FULL, then "dom" is NULL and the optimum
74 * should be computed over the domain of "bmap". "empty" is also NULL
77 * We first make sure the basic sets in dom are disjoint and then
78 * simply collect the results over each of the basic sets separately.
79 * We could probably improve the efficiency a bit by moving the union
80 * domain down into the parametric integer programming.
82 * If a full optimum is being computed (i.e., "flags" includes ISL_OPT_FULL),
83 * then no domain is given and there is then also no need to consider
84 * the disjuncts of the domain.
86 static __isl_give TYPE
*SF(basic_map_partial_lexopt
,SUFFIX
)(
87 __isl_take isl_basic_map
*bmap
, __isl_take isl_set
*dom
,
88 __isl_give isl_set
**empty
, unsigned flags
)
94 if (ISL_FL_ISSET(flags
, ISL_OPT_FULL
))
95 return SF(isl_basic_map_partial_lexopt
,SUFFIX
)(bmap
, NULL
,
98 dom
= isl_set_make_disjoint(dom
);
102 if (isl_set_plain_is_empty(dom
)) {
103 isl_space
*space
= isl_basic_map_get_space(bmap
);
108 isl_basic_map_free(bmap
);
112 res
= SF(isl_basic_map_partial_lexopt
,SUFFIX
)(isl_basic_map_copy(bmap
),
113 isl_basic_set_copy(dom
->p
[0]), empty
, flags
);
117 for (i
= 1; i
< dom
->n
; ++i
) {
120 res_i
= SF(isl_basic_map_partial_lexopt
,SUFFIX
)(
121 isl_basic_map_copy(bmap
),
122 isl_basic_set_copy(dom
->p
[i
]), empty
, flags
);
124 res
= ADD(res
, res_i
);
126 all_empty
= isl_set_union_disjoint(all_empty
, *empty
);
132 isl_basic_map_free(bmap
);
138 isl_basic_map_free(bmap
);
142 /* Compute the lexicographic minimum (or maximum if "flags" includes
143 * ISL_OPT_MAX) of "bmap" over its domain.
145 __isl_give TYPE
*SF(isl_basic_map_lexopt
,SUFFIX
)(
146 __isl_take isl_basic_map
*bmap
, unsigned flags
)
148 ISL_FL_SET(flags
, ISL_OPT_FULL
);
149 return SF(isl_basic_map_partial_lexopt
,SUFFIX
)(bmap
, NULL
, NULL
, flags
);
152 __isl_give TYPE
*SF(isl_basic_map_lexmin
,SUFFIX
)(__isl_take isl_basic_map
*bmap
)
154 return SF(isl_basic_map_lexopt
,SUFFIX
)(bmap
, 0);
157 static __isl_give TYPE
*SF(isl_map_partial_lexopt_aligned
,SUFFIX
)(
158 __isl_take isl_map
*map
, __isl_take isl_set
*dom
,
159 __isl_give isl_set
**empty
, unsigned flags
);
160 /* This function is currently only used when TYPE is defined as isl_map. */
161 static __isl_give TYPE
*SF(isl_map_partial_lexopt
,SUFFIX
)(
162 __isl_take isl_map
*map
, __isl_take isl_set
*dom
,
163 __isl_give isl_set
**empty
, unsigned flags
)
164 __attribute__ ((unused
));
166 /* Given a map "map", compute the lexicographically minimal
167 * (or maximal) image element for each domain element in dom.
168 * Set *empty to those elements in dom that do not have an image element.
170 * Align parameters if needed and then call isl_map_partial_lexopt_aligned.
172 static __isl_give TYPE
*SF(isl_map_partial_lexopt
,SUFFIX
)(
173 __isl_take isl_map
*map
, __isl_take isl_set
*dom
,
174 __isl_give isl_set
**empty
, unsigned flags
)
178 aligned
= isl_map_set_has_equal_params(map
, dom
);
182 return SF(isl_map_partial_lexopt_aligned
,SUFFIX
)(map
, dom
,
184 if (!isl_space_has_named_params(map
->dim
) ||
185 !isl_space_has_named_params(dom
->dim
))
186 isl_die(map
->ctx
, isl_error_invalid
,
187 "unaligned unnamed parameters", goto error
);
188 map
= isl_map_align_params(map
, isl_map_get_space(dom
));
189 dom
= isl_map_align_params(dom
, isl_map_get_space(map
));
190 return SF(isl_map_partial_lexopt_aligned
,SUFFIX
)(map
, dom
, empty
,
200 /* Compute the lexicographic minimum (or maximum if "flags" includes
201 * ISL_OPT_MAX) of "map" over its domain.
203 __isl_give TYPE
*SF(isl_map_lexopt
,SUFFIX
)(__isl_take isl_map
*map
,
206 ISL_FL_SET(flags
, ISL_OPT_FULL
);
207 return SF(isl_map_partial_lexopt_aligned
,SUFFIX
)(map
, NULL
, NULL
,
211 __isl_give TYPE
*SF(isl_map_lexmin
,SUFFIX
)(__isl_take isl_map
*map
)
213 return SF(isl_map_lexopt
,SUFFIX
)(map
, 0);
216 __isl_give TYPE
*SF(isl_map_lexmax
,SUFFIX
)(__isl_take isl_map
*map
)
218 return SF(isl_map_lexopt
,SUFFIX
)(map
, ISL_OPT_MAX
);
221 __isl_give TYPE
*SF(isl_set_lexmin
,SUFFIX
)(__isl_take isl_set
*set
)
223 return SF(isl_map_lexmin
,SUFFIX
)(set
);
226 __isl_give TYPE
*SF(isl_set_lexmax
,SUFFIX
)(__isl_take isl_set
*set
)
228 return SF(isl_map_lexmax
,SUFFIX
)(set
);