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 if (isl_space_match(map
->dim
, isl_dim_param
, dom
->dim
, isl_dim_param
))
179 return SF(isl_map_partial_lexopt_aligned
,SUFFIX
)(map
, dom
,
181 if (!isl_space_has_named_params(map
->dim
) ||
182 !isl_space_has_named_params(dom
->dim
))
183 isl_die(map
->ctx
, isl_error_invalid
,
184 "unaligned unnamed parameters", goto error
);
185 map
= isl_map_align_params(map
, isl_map_get_space(dom
));
186 dom
= isl_map_align_params(dom
, isl_map_get_space(map
));
187 return SF(isl_map_partial_lexopt_aligned
,SUFFIX
)(map
, dom
, empty
,
197 /* Compute the lexicographic minimum (or maximum if "flags" includes
198 * ISL_OPT_MAX) of "map" over its domain.
200 __isl_give TYPE
*SF(isl_map_lexopt
,SUFFIX
)(__isl_take isl_map
*map
,
203 ISL_FL_SET(flags
, ISL_OPT_FULL
);
204 return SF(isl_map_partial_lexopt_aligned
,SUFFIX
)(map
, NULL
, NULL
,
208 __isl_give TYPE
*SF(isl_map_lexmin
,SUFFIX
)(__isl_take isl_map
*map
)
210 return SF(isl_map_lexopt
,SUFFIX
)(map
, 0);
213 __isl_give TYPE
*SF(isl_map_lexmax
,SUFFIX
)(__isl_take isl_map
*map
)
215 return SF(isl_map_lexopt
,SUFFIX
)(map
, ISL_OPT_MAX
);
218 __isl_give TYPE
*SF(isl_set_lexmin
,SUFFIX
)(__isl_take isl_set
*set
)
220 return SF(isl_map_lexmin
,SUFFIX
)(set
);
223 __isl_give TYPE
*SF(isl_set_lexmax
,SUFFIX
)(__isl_take isl_set
*set
)
225 return SF(isl_map_lexmax
,SUFFIX
)(set
);