add isl_aff_mod_val
[platform/upstream/isl.git] / isl_tab_pip.c
1 /*
2  * Copyright 2008-2009 Katholieke Universiteit Leuven
3  * Copyright 2010      INRIA Saclay
4  *
5  * Use of this software is governed by the MIT license
6  *
7  * Written by Sven Verdoolaege, K.U.Leuven, Departement
8  * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
9  * and INRIA Saclay - Ile-de-France, Parc Club Orsay Universite,
10  * ZAC des vignes, 4 rue Jacques Monod, 91893 Orsay, France 
11  */
12
13 #include <isl_ctx_private.h>
14 #include "isl_map_private.h"
15 #include <isl/seq.h>
16 #include "isl_tab.h"
17 #include "isl_sample.h"
18 #include <isl_mat_private.h>
19 #include <isl_aff_private.h>
20 #include <isl_options_private.h>
21 #include <isl_config.h>
22
23 /*
24  * The implementation of parametric integer linear programming in this file
25  * was inspired by the paper "Parametric Integer Programming" and the
26  * report "Solving systems of affine (in)equalities" by Paul Feautrier
27  * (and others).
28  *
29  * The strategy used for obtaining a feasible solution is different
30  * from the one used in isl_tab.c.  In particular, in isl_tab.c,
31  * upon finding a constraint that is not yet satisfied, we pivot
32  * in a row that increases the constant term of the row holding the
33  * constraint, making sure the sample solution remains feasible
34  * for all the constraints it already satisfied.
35  * Here, we always pivot in the row holding the constraint,
36  * choosing a column that induces the lexicographically smallest
37  * increment to the sample solution.
38  *
39  * By starting out from a sample value that is lexicographically
40  * smaller than any integer point in the problem space, the first
41  * feasible integer sample point we find will also be the lexicographically
42  * smallest.  If all variables can be assumed to be non-negative,
43  * then the initial sample value may be chosen equal to zero.
44  * However, we will not make this assumption.  Instead, we apply
45  * the "big parameter" trick.  Any variable x is then not directly
46  * used in the tableau, but instead it is represented by another
47  * variable x' = M + x, where M is an arbitrarily large (positive)
48  * value.  x' is therefore always non-negative, whatever the value of x.
49  * Taking as initial sample value x' = 0 corresponds to x = -M,
50  * which is always smaller than any possible value of x.
51  *
52  * The big parameter trick is used in the main tableau and
53  * also in the context tableau if isl_context_lex is used.
54  * In this case, each tableaus has its own big parameter.
55  * Before doing any real work, we check if all the parameters
56  * happen to be non-negative.  If so, we drop the column corresponding
57  * to M from the initial context tableau.
58  * If isl_context_gbr is used, then the big parameter trick is only
59  * used in the main tableau.
60  */
61
62 struct isl_context;
63 struct isl_context_op {
64         /* detect nonnegative parameters in context and mark them in tab */
65         struct isl_tab *(*detect_nonnegative_parameters)(
66                         struct isl_context *context, struct isl_tab *tab);
67         /* return temporary reference to basic set representation of context */
68         struct isl_basic_set *(*peek_basic_set)(struct isl_context *context);
69         /* return temporary reference to tableau representation of context */
70         struct isl_tab *(*peek_tab)(struct isl_context *context);
71         /* add equality; check is 1 if eq may not be valid;
72          * update is 1 if we may want to call ineq_sign on context later.
73          */
74         void (*add_eq)(struct isl_context *context, isl_int *eq,
75                         int check, int update);
76         /* add inequality; check is 1 if ineq may not be valid;
77          * update is 1 if we may want to call ineq_sign on context later.
78          */
79         void (*add_ineq)(struct isl_context *context, isl_int *ineq,
80                         int check, int update);
81         /* check sign of ineq based on previous information.
82          * strict is 1 if saturation should be treated as a positive sign.
83          */
84         enum isl_tab_row_sign (*ineq_sign)(struct isl_context *context,
85                         isl_int *ineq, int strict);
86         /* check if inequality maintains feasibility */
87         int (*test_ineq)(struct isl_context *context, isl_int *ineq);
88         /* return index of a div that corresponds to "div" */
89         int (*get_div)(struct isl_context *context, struct isl_tab *tab,
90                         struct isl_vec *div);
91         /* add div "div" to context and return non-negativity */
92         int (*add_div)(struct isl_context *context, struct isl_vec *div);
93         int (*detect_equalities)(struct isl_context *context,
94                         struct isl_tab *tab);
95         /* return row index of "best" split */
96         int (*best_split)(struct isl_context *context, struct isl_tab *tab);
97         /* check if context has already been determined to be empty */
98         int (*is_empty)(struct isl_context *context);
99         /* check if context is still usable */
100         int (*is_ok)(struct isl_context *context);
101         /* save a copy/snapshot of context */
102         void *(*save)(struct isl_context *context);
103         /* restore saved context */
104         void (*restore)(struct isl_context *context, void *);
105         /* discard saved context */
106         void (*discard)(void *);
107         /* invalidate context */
108         void (*invalidate)(struct isl_context *context);
109         /* free context */
110         void (*free)(struct isl_context *context);
111 };
112
113 struct isl_context {
114         struct isl_context_op *op;
115 };
116
117 struct isl_context_lex {
118         struct isl_context context;
119         struct isl_tab *tab;
120 };
121
122 /* A stack (linked list) of solutions of subtrees of the search space.
123  *
124  * "M" describes the solution in terms of the dimensions of "dom".
125  * The number of columns of "M" is one more than the total number
126  * of dimensions of "dom".
127  *
128  * If "M" is NULL, then there is no solution on "dom".
129  */
130 struct isl_partial_sol {
131         int level;
132         struct isl_basic_set *dom;
133         struct isl_mat *M;
134
135         struct isl_partial_sol *next;
136 };
137
138 struct isl_sol;
139 struct isl_sol_callback {
140         struct isl_tab_callback callback;
141         struct isl_sol *sol;
142 };
143
144 /* isl_sol is an interface for constructing a solution to
145  * a parametric integer linear programming problem.
146  * Every time the algorithm reaches a state where a solution
147  * can be read off from the tableau (including cases where the tableau
148  * is empty), the function "add" is called on the isl_sol passed
149  * to find_solutions_main.
150  *
151  * The context tableau is owned by isl_sol and is updated incrementally.
152  *
153  * There are currently two implementations of this interface,
154  * isl_sol_map, which simply collects the solutions in an isl_map
155  * and (optionally) the parts of the context where there is no solution
156  * in an isl_set, and
157  * isl_sol_for, which calls a user-defined function for each part of
158  * the solution.
159  */
160 struct isl_sol {
161         int error;
162         int rational;
163         int level;
164         int max;
165         int n_out;
166         struct isl_context *context;
167         struct isl_partial_sol *partial;
168         void (*add)(struct isl_sol *sol,
169                             struct isl_basic_set *dom, struct isl_mat *M);
170         void (*add_empty)(struct isl_sol *sol, struct isl_basic_set *bset);
171         void (*free)(struct isl_sol *sol);
172         struct isl_sol_callback dec_level;
173 };
174
175 static void sol_free(struct isl_sol *sol)
176 {
177         struct isl_partial_sol *partial, *next;
178         if (!sol)
179                 return;
180         for (partial = sol->partial; partial; partial = next) {
181                 next = partial->next;
182                 isl_basic_set_free(partial->dom);
183                 isl_mat_free(partial->M);
184                 free(partial);
185         }
186         sol->free(sol);
187 }
188
189 /* Push a partial solution represented by a domain and mapping M
190  * onto the stack of partial solutions.
191  */
192 static void sol_push_sol(struct isl_sol *sol,
193         struct isl_basic_set *dom, struct isl_mat *M)
194 {
195         struct isl_partial_sol *partial;
196
197         if (sol->error || !dom)
198                 goto error;
199
200         partial = isl_alloc_type(dom->ctx, struct isl_partial_sol);
201         if (!partial)
202                 goto error;
203
204         partial->level = sol->level;
205         partial->dom = dom;
206         partial->M = M;
207         partial->next = sol->partial;
208
209         sol->partial = partial;
210
211         return;
212 error:
213         isl_basic_set_free(dom);
214         isl_mat_free(M);
215         sol->error = 1;
216 }
217
218 /* Pop one partial solution from the partial solution stack and
219  * pass it on to sol->add or sol->add_empty.
220  */
221 static void sol_pop_one(struct isl_sol *sol)
222 {
223         struct isl_partial_sol *partial;
224
225         partial = sol->partial;
226         sol->partial = partial->next;
227
228         if (partial->M)
229                 sol->add(sol, partial->dom, partial->M);
230         else
231                 sol->add_empty(sol, partial->dom);
232         free(partial);
233 }
234
235 /* Return a fresh copy of the domain represented by the context tableau.
236  */
237 static struct isl_basic_set *sol_domain(struct isl_sol *sol)
238 {
239         struct isl_basic_set *bset;
240
241         if (sol->error)
242                 return NULL;
243
244         bset = isl_basic_set_dup(sol->context->op->peek_basic_set(sol->context));
245         bset = isl_basic_set_update_from_tab(bset,
246                         sol->context->op->peek_tab(sol->context));
247
248         return bset;
249 }
250
251 /* Check whether two partial solutions have the same mapping, where n_div
252  * is the number of divs that the two partial solutions have in common.
253  */
254 static int same_solution(struct isl_partial_sol *s1, struct isl_partial_sol *s2,
255         unsigned n_div)
256 {
257         int i;
258         unsigned dim;
259
260         if (!s1->M != !s2->M)
261                 return 0;
262         if (!s1->M)
263                 return 1;
264
265         dim = isl_basic_set_total_dim(s1->dom) - s1->dom->n_div;
266
267         for (i = 0; i < s1->M->n_row; ++i) {
268                 if (isl_seq_first_non_zero(s1->M->row[i]+1+dim+n_div,
269                                             s1->M->n_col-1-dim-n_div) != -1)
270                         return 0;
271                 if (isl_seq_first_non_zero(s2->M->row[i]+1+dim+n_div,
272                                             s2->M->n_col-1-dim-n_div) != -1)
273                         return 0;
274                 if (!isl_seq_eq(s1->M->row[i], s2->M->row[i], 1+dim+n_div))
275                         return 0;
276         }
277         return 1;
278 }
279
280 /* Pop all solutions from the partial solution stack that were pushed onto
281  * the stack at levels that are deeper than the current level.
282  * If the two topmost elements on the stack have the same level
283  * and represent the same solution, then their domains are combined.
284  * This combined domain is the same as the current context domain
285  * as sol_pop is called each time we move back to a higher level.
286  */
287 static void sol_pop(struct isl_sol *sol)
288 {
289         struct isl_partial_sol *partial;
290         unsigned n_div;
291
292         if (sol->error)
293                 return;
294
295         if (sol->level == 0) {
296                 for (partial = sol->partial; partial; partial = sol->partial)
297                         sol_pop_one(sol);
298                 return;
299         }
300
301         partial = sol->partial;
302         if (!partial)
303                 return;
304
305         if (partial->level <= sol->level)
306                 return;
307
308         if (partial->next && partial->next->level == partial->level) {
309                 n_div = isl_basic_set_dim(
310                                 sol->context->op->peek_basic_set(sol->context),
311                                 isl_dim_div);
312
313                 if (!same_solution(partial, partial->next, n_div)) {
314                         sol_pop_one(sol);
315                         sol_pop_one(sol);
316                 } else {
317                         struct isl_basic_set *bset;
318                         isl_mat *M;
319                         unsigned n;
320
321                         n = isl_basic_set_dim(partial->next->dom, isl_dim_div);
322                         n -= n_div;
323                         bset = sol_domain(sol);
324                         isl_basic_set_free(partial->next->dom);
325                         partial->next->dom = bset;
326                         M = partial->next->M;
327                         if (M) {
328                                 M = isl_mat_drop_cols(M, M->n_col - n, n);
329                                 partial->next->M = M;
330                                 if (!M)
331                                         goto error;
332                         }
333                         partial->next->level = sol->level;
334
335                         if (!bset)
336                                 goto error;
337
338                         sol->partial = partial->next;
339                         isl_basic_set_free(partial->dom);
340                         isl_mat_free(partial->M);
341                         free(partial);
342                 }
343         } else
344                 sol_pop_one(sol);
345
346         if (0)
347 error:          sol->error = 1;
348 }
349
350 static void sol_dec_level(struct isl_sol *sol)
351 {
352         if (sol->error)
353                 return;
354
355         sol->level--;
356
357         sol_pop(sol);
358 }
359
360 static int sol_dec_level_wrap(struct isl_tab_callback *cb)
361 {
362         struct isl_sol_callback *callback = (struct isl_sol_callback *)cb;
363
364         sol_dec_level(callback->sol);
365
366         return callback->sol->error ? -1 : 0;
367 }
368
369 /* Move down to next level and push callback onto context tableau
370  * to decrease the level again when it gets rolled back across
371  * the current state.  That is, dec_level will be called with
372  * the context tableau in the same state as it is when inc_level
373  * is called.
374  */
375 static void sol_inc_level(struct isl_sol *sol)
376 {
377         struct isl_tab *tab;
378
379         if (sol->error)
380                 return;
381
382         sol->level++;
383         tab = sol->context->op->peek_tab(sol->context);
384         if (isl_tab_push_callback(tab, &sol->dec_level.callback) < 0)
385                 sol->error = 1;
386 }
387
388 static void scale_rows(struct isl_mat *mat, isl_int m, int n_row)
389 {
390         int i;
391
392         if (isl_int_is_one(m))
393                 return;
394
395         for (i = 0; i < n_row; ++i)
396                 isl_seq_scale(mat->row[i], mat->row[i], m, mat->n_col);
397 }
398
399 /* Add the solution identified by the tableau and the context tableau.
400  *
401  * The layout of the variables is as follows.
402  *      tab->n_var is equal to the total number of variables in the input
403  *                      map (including divs that were copied from the context)
404  *                      + the number of extra divs constructed
405  *      Of these, the first tab->n_param and the last tab->n_div variables
406  *      correspond to the variables in the context, i.e.,
407  *              tab->n_param + tab->n_div = context_tab->n_var
408  *      tab->n_param is equal to the number of parameters and input
409  *                      dimensions in the input map
410  *      tab->n_div is equal to the number of divs in the context
411  *
412  * If there is no solution, then call add_empty with a basic set
413  * that corresponds to the context tableau.  (If add_empty is NULL,
414  * then do nothing).
415  *
416  * If there is a solution, then first construct a matrix that maps
417  * all dimensions of the context to the output variables, i.e.,
418  * the output dimensions in the input map.
419  * The divs in the input map (if any) that do not correspond to any
420  * div in the context do not appear in the solution.
421  * The algorithm will make sure that they have an integer value,
422  * but these values themselves are of no interest.
423  * We have to be careful not to drop or rearrange any divs in the
424  * context because that would change the meaning of the matrix.
425  *
426  * To extract the value of the output variables, it should be noted
427  * that we always use a big parameter M in the main tableau and so
428  * the variable stored in this tableau is not an output variable x itself, but
429  *      x' = M + x (in case of minimization)
430  * or
431  *      x' = M - x (in case of maximization)
432  * If x' appears in a column, then its optimal value is zero,
433  * which means that the optimal value of x is an unbounded number
434  * (-M for minimization and M for maximization).
435  * We currently assume that the output dimensions in the original map
436  * are bounded, so this cannot occur.
437  * Similarly, when x' appears in a row, then the coefficient of M in that
438  * row is necessarily 1.
439  * If the row in the tableau represents
440  *      d x' = c + d M + e(y)
441  * then, in case of minimization, the corresponding row in the matrix
442  * will be
443  *      a c + a e(y)
444  * with a d = m, the (updated) common denominator of the matrix.
445  * In case of maximization, the row will be
446  *      -a c - a e(y)
447  */
448 static void sol_add(struct isl_sol *sol, struct isl_tab *tab)
449 {
450         struct isl_basic_set *bset = NULL;
451         struct isl_mat *mat = NULL;
452         unsigned off;
453         int row;
454         isl_int m;
455
456         if (sol->error || !tab)
457                 goto error;
458
459         if (tab->empty && !sol->add_empty)
460                 return;
461         if (sol->context->op->is_empty(sol->context))
462                 return;
463
464         bset = sol_domain(sol);
465
466         if (tab->empty) {
467                 sol_push_sol(sol, bset, NULL);
468                 return;
469         }
470
471         off = 2 + tab->M;
472
473         mat = isl_mat_alloc(tab->mat->ctx, 1 + sol->n_out,
474                                             1 + tab->n_param + tab->n_div);
475         if (!mat)
476                 goto error;
477
478         isl_int_init(m);
479
480         isl_seq_clr(mat->row[0] + 1, mat->n_col - 1);
481         isl_int_set_si(mat->row[0][0], 1);
482         for (row = 0; row < sol->n_out; ++row) {
483                 int i = tab->n_param + row;
484                 int r, j;
485
486                 isl_seq_clr(mat->row[1 + row], mat->n_col);
487                 if (!tab->var[i].is_row) {
488                         if (tab->M)
489                                 isl_die(mat->ctx, isl_error_invalid,
490                                         "unbounded optimum", goto error2);
491                         continue;
492                 }
493
494                 r = tab->var[i].index;
495                 if (tab->M &&
496                     isl_int_ne(tab->mat->row[r][2], tab->mat->row[r][0]))
497                         isl_die(mat->ctx, isl_error_invalid,
498                                 "unbounded optimum", goto error2);
499                 isl_int_gcd(m, mat->row[0][0], tab->mat->row[r][0]);
500                 isl_int_divexact(m, tab->mat->row[r][0], m);
501                 scale_rows(mat, m, 1 + row);
502                 isl_int_divexact(m, mat->row[0][0], tab->mat->row[r][0]);
503                 isl_int_mul(mat->row[1 + row][0], m, tab->mat->row[r][1]);
504                 for (j = 0; j < tab->n_param; ++j) {
505                         int col;
506                         if (tab->var[j].is_row)
507                                 continue;
508                         col = tab->var[j].index;
509                         isl_int_mul(mat->row[1 + row][1 + j], m,
510                                     tab->mat->row[r][off + col]);
511                 }
512                 for (j = 0; j < tab->n_div; ++j) {
513                         int col;
514                         if (tab->var[tab->n_var - tab->n_div+j].is_row)
515                                 continue;
516                         col = tab->var[tab->n_var - tab->n_div+j].index;
517                         isl_int_mul(mat->row[1 + row][1 + tab->n_param + j], m,
518                                     tab->mat->row[r][off + col]);
519                 }
520                 if (sol->max)
521                         isl_seq_neg(mat->row[1 + row], mat->row[1 + row],
522                                     mat->n_col);
523         }
524
525         isl_int_clear(m);
526
527         sol_push_sol(sol, bset, mat);
528         return;
529 error2:
530         isl_int_clear(m);
531 error:
532         isl_basic_set_free(bset);
533         isl_mat_free(mat);
534         sol->error = 1;
535 }
536
537 struct isl_sol_map {
538         struct isl_sol  sol;
539         struct isl_map  *map;
540         struct isl_set  *empty;
541 };
542
543 static void sol_map_free(struct isl_sol_map *sol_map)
544 {
545         if (!sol_map)
546                 return;
547         if (sol_map->sol.context)
548                 sol_map->sol.context->op->free(sol_map->sol.context);
549         isl_map_free(sol_map->map);
550         isl_set_free(sol_map->empty);
551         free(sol_map);
552 }
553
554 static void sol_map_free_wrap(struct isl_sol *sol)
555 {
556         sol_map_free((struct isl_sol_map *)sol);
557 }
558
559 /* This function is called for parts of the context where there is
560  * no solution, with "bset" corresponding to the context tableau.
561  * Simply add the basic set to the set "empty".
562  */
563 static void sol_map_add_empty(struct isl_sol_map *sol,
564         struct isl_basic_set *bset)
565 {
566         if (!bset)
567                 goto error;
568         isl_assert(bset->ctx, sol->empty, goto error);
569
570         sol->empty = isl_set_grow(sol->empty, 1);
571         bset = isl_basic_set_simplify(bset);
572         bset = isl_basic_set_finalize(bset);
573         sol->empty = isl_set_add_basic_set(sol->empty, isl_basic_set_copy(bset));
574         if (!sol->empty)
575                 goto error;
576         isl_basic_set_free(bset);
577         return;
578 error:
579         isl_basic_set_free(bset);
580         sol->sol.error = 1;
581 }
582
583 static void sol_map_add_empty_wrap(struct isl_sol *sol,
584         struct isl_basic_set *bset)
585 {
586         sol_map_add_empty((struct isl_sol_map *)sol, bset);
587 }
588
589 /* Given a basic map "dom" that represents the context and an affine
590  * matrix "M" that maps the dimensions of the context to the
591  * output variables, construct a basic map with the same parameters
592  * and divs as the context, the dimensions of the context as input
593  * dimensions and a number of output dimensions that is equal to
594  * the number of output dimensions in the input map.
595  *
596  * The constraints and divs of the context are simply copied
597  * from "dom".  For each row
598  *      x = c + e(y)
599  * an equality
600  *      c + e(y) - d x = 0
601  * is added, with d the common denominator of M.
602  */
603 static void sol_map_add(struct isl_sol_map *sol,
604         struct isl_basic_set *dom, struct isl_mat *M)
605 {
606         int i;
607         struct isl_basic_map *bmap = NULL;
608         unsigned n_eq;
609         unsigned n_ineq;
610         unsigned nparam;
611         unsigned total;
612         unsigned n_div;
613         unsigned n_out;
614
615         if (sol->sol.error || !dom || !M)
616                 goto error;
617
618         n_out = sol->sol.n_out;
619         n_eq = dom->n_eq + n_out;
620         n_ineq = dom->n_ineq;
621         n_div = dom->n_div;
622         nparam = isl_basic_set_total_dim(dom) - n_div;
623         total = isl_map_dim(sol->map, isl_dim_all);
624         bmap = isl_basic_map_alloc_space(isl_map_get_space(sol->map),
625                                         n_div, n_eq, 2 * n_div + n_ineq);
626         if (!bmap)
627                 goto error;
628         if (sol->sol.rational)
629                 ISL_F_SET(bmap, ISL_BASIC_MAP_RATIONAL);
630         for (i = 0; i < dom->n_div; ++i) {
631                 int k = isl_basic_map_alloc_div(bmap);
632                 if (k < 0)
633                         goto error;
634                 isl_seq_cpy(bmap->div[k], dom->div[i], 1 + 1 + nparam);
635                 isl_seq_clr(bmap->div[k] + 1 + 1 + nparam, total - nparam);
636                 isl_seq_cpy(bmap->div[k] + 1 + 1 + total,
637                             dom->div[i] + 1 + 1 + nparam, i);
638         }
639         for (i = 0; i < dom->n_eq; ++i) {
640                 int k = isl_basic_map_alloc_equality(bmap);
641                 if (k < 0)
642                         goto error;
643                 isl_seq_cpy(bmap->eq[k], dom->eq[i], 1 + nparam);
644                 isl_seq_clr(bmap->eq[k] + 1 + nparam, total - nparam);
645                 isl_seq_cpy(bmap->eq[k] + 1 + total,
646                             dom->eq[i] + 1 + nparam, n_div);
647         }
648         for (i = 0; i < dom->n_ineq; ++i) {
649                 int k = isl_basic_map_alloc_inequality(bmap);
650                 if (k < 0)
651                         goto error;
652                 isl_seq_cpy(bmap->ineq[k], dom->ineq[i], 1 + nparam);
653                 isl_seq_clr(bmap->ineq[k] + 1 + nparam, total - nparam);
654                 isl_seq_cpy(bmap->ineq[k] + 1 + total,
655                         dom->ineq[i] + 1 + nparam, n_div);
656         }
657         for (i = 0; i < M->n_row - 1; ++i) {
658                 int k = isl_basic_map_alloc_equality(bmap);
659                 if (k < 0)
660                         goto error;
661                 isl_seq_cpy(bmap->eq[k], M->row[1 + i], 1 + nparam);
662                 isl_seq_clr(bmap->eq[k] + 1 + nparam, n_out);
663                 isl_int_neg(bmap->eq[k][1 + nparam + i], M->row[0][0]);
664                 isl_seq_cpy(bmap->eq[k] + 1 + nparam + n_out,
665                             M->row[1 + i] + 1 + nparam, n_div);
666         }
667         bmap = isl_basic_map_simplify(bmap);
668         bmap = isl_basic_map_finalize(bmap);
669         sol->map = isl_map_grow(sol->map, 1);
670         sol->map = isl_map_add_basic_map(sol->map, bmap);
671         isl_basic_set_free(dom);
672         isl_mat_free(M);
673         if (!sol->map)
674                 sol->sol.error = 1;
675         return;
676 error:
677         isl_basic_set_free(dom);
678         isl_mat_free(M);
679         isl_basic_map_free(bmap);
680         sol->sol.error = 1;
681 }
682
683 static void sol_map_add_wrap(struct isl_sol *sol,
684         struct isl_basic_set *dom, struct isl_mat *M)
685 {
686         sol_map_add((struct isl_sol_map *)sol, dom, M);
687 }
688
689
690 /* Store the "parametric constant" of row "row" of tableau "tab" in "line",
691  * i.e., the constant term and the coefficients of all variables that
692  * appear in the context tableau.
693  * Note that the coefficient of the big parameter M is NOT copied.
694  * The context tableau may not have a big parameter and even when it
695  * does, it is a different big parameter.
696  */
697 static void get_row_parameter_line(struct isl_tab *tab, int row, isl_int *line)
698 {
699         int i;
700         unsigned off = 2 + tab->M;
701
702         isl_int_set(line[0], tab->mat->row[row][1]);
703         for (i = 0; i < tab->n_param; ++i) {
704                 if (tab->var[i].is_row)
705                         isl_int_set_si(line[1 + i], 0);
706                 else {
707                         int col = tab->var[i].index;
708                         isl_int_set(line[1 + i], tab->mat->row[row][off + col]);
709                 }
710         }
711         for (i = 0; i < tab->n_div; ++i) {
712                 if (tab->var[tab->n_var - tab->n_div + i].is_row)
713                         isl_int_set_si(line[1 + tab->n_param + i], 0);
714                 else {
715                         int col = tab->var[tab->n_var - tab->n_div + i].index;
716                         isl_int_set(line[1 + tab->n_param + i],
717                                     tab->mat->row[row][off + col]);
718                 }
719         }
720 }
721
722 /* Check if rows "row1" and "row2" have identical "parametric constants",
723  * as explained above.
724  * In this case, we also insist that the coefficients of the big parameter
725  * be the same as the values of the constants will only be the same
726  * if these coefficients are also the same.
727  */
728 static int identical_parameter_line(struct isl_tab *tab, int row1, int row2)
729 {
730         int i;
731         unsigned off = 2 + tab->M;
732
733         if (isl_int_ne(tab->mat->row[row1][1], tab->mat->row[row2][1]))
734                 return 0;
735
736         if (tab->M && isl_int_ne(tab->mat->row[row1][2],
737                                  tab->mat->row[row2][2]))
738                 return 0;
739
740         for (i = 0; i < tab->n_param + tab->n_div; ++i) {
741                 int pos = i < tab->n_param ? i :
742                         tab->n_var - tab->n_div + i - tab->n_param;
743                 int col;
744
745                 if (tab->var[pos].is_row)
746                         continue;
747                 col = tab->var[pos].index;
748                 if (isl_int_ne(tab->mat->row[row1][off + col],
749                                tab->mat->row[row2][off + col]))
750                         return 0;
751         }
752         return 1;
753 }
754
755 /* Return an inequality that expresses that the "parametric constant"
756  * should be non-negative.
757  * This function is only called when the coefficient of the big parameter
758  * is equal to zero.
759  */
760 static struct isl_vec *get_row_parameter_ineq(struct isl_tab *tab, int row)
761 {
762         struct isl_vec *ineq;
763
764         ineq = isl_vec_alloc(tab->mat->ctx, 1 + tab->n_param + tab->n_div);
765         if (!ineq)
766                 return NULL;
767
768         get_row_parameter_line(tab, row, ineq->el);
769         if (ineq)
770                 ineq = isl_vec_normalize(ineq);
771
772         return ineq;
773 }
774
775 /* Normalize a div expression of the form
776  *
777  *      [(g*f(x) + c)/(g * m)]
778  *
779  * with c the constant term and f(x) the remaining coefficients, to
780  *
781  *      [(f(x) + [c/g])/m]
782  */
783 static void normalize_div(__isl_keep isl_vec *div)
784 {
785         isl_ctx *ctx = isl_vec_get_ctx(div);
786         int len = div->size - 2;
787
788         isl_seq_gcd(div->el + 2, len, &ctx->normalize_gcd);
789         isl_int_gcd(ctx->normalize_gcd, ctx->normalize_gcd, div->el[0]);
790
791         if (isl_int_is_one(ctx->normalize_gcd))
792                 return;
793
794         isl_int_divexact(div->el[0], div->el[0], ctx->normalize_gcd);
795         isl_int_fdiv_q(div->el[1], div->el[1], ctx->normalize_gcd);
796         isl_seq_scale_down(div->el + 2, div->el + 2, ctx->normalize_gcd, len);
797 }
798
799 /* Return a integer division for use in a parametric cut based on the given row.
800  * In particular, let the parametric constant of the row be
801  *
802  *              \sum_i a_i y_i
803  *
804  * where y_0 = 1, but none of the y_i corresponds to the big parameter M.
805  * The div returned is equal to
806  *
807  *              floor(\sum_i {-a_i} y_i) = floor((\sum_i (-a_i mod d) y_i)/d)
808  */
809 static struct isl_vec *get_row_parameter_div(struct isl_tab *tab, int row)
810 {
811         struct isl_vec *div;
812
813         div = isl_vec_alloc(tab->mat->ctx, 1 + 1 + tab->n_param + tab->n_div);
814         if (!div)
815                 return NULL;
816
817         isl_int_set(div->el[0], tab->mat->row[row][0]);
818         get_row_parameter_line(tab, row, div->el + 1);
819         isl_seq_neg(div->el + 1, div->el + 1, div->size - 1);
820         normalize_div(div);
821         isl_seq_fdiv_r(div->el + 1, div->el + 1, div->el[0], div->size - 1);
822
823         return div;
824 }
825
826 /* Return a integer division for use in transferring an integrality constraint
827  * to the context.
828  * In particular, let the parametric constant of the row be
829  *
830  *              \sum_i a_i y_i
831  *
832  * where y_0 = 1, but none of the y_i corresponds to the big parameter M.
833  * The the returned div is equal to
834  *
835  *              floor(\sum_i {a_i} y_i) = floor((\sum_i (a_i mod d) y_i)/d)
836  */
837 static struct isl_vec *get_row_split_div(struct isl_tab *tab, int row)
838 {
839         struct isl_vec *div;
840
841         div = isl_vec_alloc(tab->mat->ctx, 1 + 1 + tab->n_param + tab->n_div);
842         if (!div)
843                 return NULL;
844
845         isl_int_set(div->el[0], tab->mat->row[row][0]);
846         get_row_parameter_line(tab, row, div->el + 1);
847         normalize_div(div);
848         isl_seq_fdiv_r(div->el + 1, div->el + 1, div->el[0], div->size - 1);
849
850         return div;
851 }
852
853 /* Construct and return an inequality that expresses an upper bound
854  * on the given div.
855  * In particular, if the div is given by
856  *
857  *      d = floor(e/m)
858  *
859  * then the inequality expresses
860  *
861  *      m d <= e
862  */
863 static struct isl_vec *ineq_for_div(struct isl_basic_set *bset, unsigned div)
864 {
865         unsigned total;
866         unsigned div_pos;
867         struct isl_vec *ineq;
868
869         if (!bset)
870                 return NULL;
871
872         total = isl_basic_set_total_dim(bset);
873         div_pos = 1 + total - bset->n_div + div;
874
875         ineq = isl_vec_alloc(bset->ctx, 1 + total);
876         if (!ineq)
877                 return NULL;
878
879         isl_seq_cpy(ineq->el, bset->div[div] + 1, 1 + total);
880         isl_int_neg(ineq->el[div_pos], bset->div[div][0]);
881         return ineq;
882 }
883
884 /* Given a row in the tableau and a div that was created
885  * using get_row_split_div and that has been constrained to equality, i.e.,
886  *
887  *              d = floor(\sum_i {a_i} y_i) = \sum_i {a_i} y_i
888  *
889  * replace the expression "\sum_i {a_i} y_i" in the row by d,
890  * i.e., we subtract "\sum_i {a_i} y_i" and add 1 d.
891  * The coefficients of the non-parameters in the tableau have been
892  * verified to be integral.  We can therefore simply replace coefficient b
893  * by floor(b).  For the coefficients of the parameters we have
894  * floor(a_i) = a_i - {a_i}, while for the other coefficients, we have
895  * floor(b) = b.
896  */
897 static struct isl_tab *set_row_cst_to_div(struct isl_tab *tab, int row, int div)
898 {
899         isl_seq_fdiv_q(tab->mat->row[row] + 1, tab->mat->row[row] + 1,
900                         tab->mat->row[row][0], 1 + tab->M + tab->n_col);
901
902         isl_int_set_si(tab->mat->row[row][0], 1);
903
904         if (tab->var[tab->n_var - tab->n_div + div].is_row) {
905                 int drow = tab->var[tab->n_var - tab->n_div + div].index;
906
907                 isl_assert(tab->mat->ctx,
908                         isl_int_is_one(tab->mat->row[drow][0]), goto error);
909                 isl_seq_combine(tab->mat->row[row] + 1,
910                         tab->mat->ctx->one, tab->mat->row[row] + 1,
911                         tab->mat->ctx->one, tab->mat->row[drow] + 1,
912                         1 + tab->M + tab->n_col);
913         } else {
914                 int dcol = tab->var[tab->n_var - tab->n_div + div].index;
915
916                 isl_int_add_ui(tab->mat->row[row][2 + tab->M + dcol],
917                                 tab->mat->row[row][2 + tab->M + dcol], 1);
918         }
919
920         return tab;
921 error:
922         isl_tab_free(tab);
923         return NULL;
924 }
925
926 /* Check if the (parametric) constant of the given row is obviously
927  * negative, meaning that we don't need to consult the context tableau.
928  * If there is a big parameter and its coefficient is non-zero,
929  * then this coefficient determines the outcome.
930  * Otherwise, we check whether the constant is negative and
931  * all non-zero coefficients of parameters are negative and
932  * belong to non-negative parameters.
933  */
934 static int is_obviously_neg(struct isl_tab *tab, int row)
935 {
936         int i;
937         int col;
938         unsigned off = 2 + tab->M;
939
940         if (tab->M) {
941                 if (isl_int_is_pos(tab->mat->row[row][2]))
942                         return 0;
943                 if (isl_int_is_neg(tab->mat->row[row][2]))
944                         return 1;
945         }
946
947         if (isl_int_is_nonneg(tab->mat->row[row][1]))
948                 return 0;
949         for (i = 0; i < tab->n_param; ++i) {
950                 /* Eliminated parameter */
951                 if (tab->var[i].is_row)
952                         continue;
953                 col = tab->var[i].index;
954                 if (isl_int_is_zero(tab->mat->row[row][off + col]))
955                         continue;
956                 if (!tab->var[i].is_nonneg)
957                         return 0;
958                 if (isl_int_is_pos(tab->mat->row[row][off + col]))
959                         return 0;
960         }
961         for (i = 0; i < tab->n_div; ++i) {
962                 if (tab->var[tab->n_var - tab->n_div + i].is_row)
963                         continue;
964                 col = tab->var[tab->n_var - tab->n_div + i].index;
965                 if (isl_int_is_zero(tab->mat->row[row][off + col]))
966                         continue;
967                 if (!tab->var[tab->n_var - tab->n_div + i].is_nonneg)
968                         return 0;
969                 if (isl_int_is_pos(tab->mat->row[row][off + col]))
970                         return 0;
971         }
972         return 1;
973 }
974
975 /* Check if the (parametric) constant of the given row is obviously
976  * non-negative, meaning that we don't need to consult the context tableau.
977  * If there is a big parameter and its coefficient is non-zero,
978  * then this coefficient determines the outcome.
979  * Otherwise, we check whether the constant is non-negative and
980  * all non-zero coefficients of parameters are positive and
981  * belong to non-negative parameters.
982  */
983 static int is_obviously_nonneg(struct isl_tab *tab, int row)
984 {
985         int i;
986         int col;
987         unsigned off = 2 + tab->M;
988
989         if (tab->M) {
990                 if (isl_int_is_pos(tab->mat->row[row][2]))
991                         return 1;
992                 if (isl_int_is_neg(tab->mat->row[row][2]))
993                         return 0;
994         }
995
996         if (isl_int_is_neg(tab->mat->row[row][1]))
997                 return 0;
998         for (i = 0; i < tab->n_param; ++i) {
999                 /* Eliminated parameter */
1000                 if (tab->var[i].is_row)
1001                         continue;
1002                 col = tab->var[i].index;
1003                 if (isl_int_is_zero(tab->mat->row[row][off + col]))
1004                         continue;
1005                 if (!tab->var[i].is_nonneg)
1006                         return 0;
1007                 if (isl_int_is_neg(tab->mat->row[row][off + col]))
1008                         return 0;
1009         }
1010         for (i = 0; i < tab->n_div; ++i) {
1011                 if (tab->var[tab->n_var - tab->n_div + i].is_row)
1012                         continue;
1013                 col = tab->var[tab->n_var - tab->n_div + i].index;
1014                 if (isl_int_is_zero(tab->mat->row[row][off + col]))
1015                         continue;
1016                 if (!tab->var[tab->n_var - tab->n_div + i].is_nonneg)
1017                         return 0;
1018                 if (isl_int_is_neg(tab->mat->row[row][off + col]))
1019                         return 0;
1020         }
1021         return 1;
1022 }
1023
1024 /* Given a row r and two columns, return the column that would
1025  * lead to the lexicographically smallest increment in the sample
1026  * solution when leaving the basis in favor of the row.
1027  * Pivoting with column c will increment the sample value by a non-negative
1028  * constant times a_{V,c}/a_{r,c}, with a_{V,c} the elements of column c
1029  * corresponding to the non-parametric variables.
1030  * If variable v appears in a column c_v, the a_{v,c} = 1 iff c = c_v,
1031  * with all other entries in this virtual row equal to zero.
1032  * If variable v appears in a row, then a_{v,c} is the element in column c
1033  * of that row.
1034  *
1035  * Let v be the first variable with a_{v,c1}/a_{r,c1} != a_{v,c2}/a_{r,c2}.
1036  * Then if a_{v,c1}/a_{r,c1} < a_{v,c2}/a_{r,c2}, i.e.,
1037  * a_{v,c2} a_{r,c1} - a_{v,c1} a_{r,c2} > 0, c1 results in the minimal
1038  * increment.  Otherwise, it's c2.
1039  */
1040 static int lexmin_col_pair(struct isl_tab *tab,
1041         int row, int col1, int col2, isl_int tmp)
1042 {
1043         int i;
1044         isl_int *tr;
1045
1046         tr = tab->mat->row[row] + 2 + tab->M;
1047
1048         for (i = tab->n_param; i < tab->n_var - tab->n_div; ++i) {
1049                 int s1, s2;
1050                 isl_int *r;
1051
1052                 if (!tab->var[i].is_row) {
1053                         if (tab->var[i].index == col1)
1054                                 return col2;
1055                         if (tab->var[i].index == col2)
1056                                 return col1;
1057                         continue;
1058                 }
1059
1060                 if (tab->var[i].index == row)
1061                         continue;
1062
1063                 r = tab->mat->row[tab->var[i].index] + 2 + tab->M;
1064                 s1 = isl_int_sgn(r[col1]);
1065                 s2 = isl_int_sgn(r[col2]);
1066                 if (s1 == 0 && s2 == 0)
1067                         continue;
1068                 if (s1 < s2)
1069                         return col1;
1070                 if (s2 < s1)
1071                         return col2;
1072
1073                 isl_int_mul(tmp, r[col2], tr[col1]);
1074                 isl_int_submul(tmp, r[col1], tr[col2]);
1075                 if (isl_int_is_pos(tmp))
1076                         return col1;
1077                 if (isl_int_is_neg(tmp))
1078                         return col2;
1079         }
1080         return -1;
1081 }
1082
1083 /* Given a row in the tableau, find and return the column that would
1084  * result in the lexicographically smallest, but positive, increment
1085  * in the sample point.
1086  * If there is no such column, then return tab->n_col.
1087  * If anything goes wrong, return -1.
1088  */
1089 static int lexmin_pivot_col(struct isl_tab *tab, int row)
1090 {
1091         int j;
1092         int col = tab->n_col;
1093         isl_int *tr;
1094         isl_int tmp;
1095
1096         tr = tab->mat->row[row] + 2 + tab->M;
1097
1098         isl_int_init(tmp);
1099
1100         for (j = tab->n_dead; j < tab->n_col; ++j) {
1101                 if (tab->col_var[j] >= 0 &&
1102                     (tab->col_var[j] < tab->n_param  ||
1103                     tab->col_var[j] >= tab->n_var - tab->n_div))
1104                         continue;
1105
1106                 if (!isl_int_is_pos(tr[j]))
1107                         continue;
1108
1109                 if (col == tab->n_col)
1110                         col = j;
1111                 else
1112                         col = lexmin_col_pair(tab, row, col, j, tmp);
1113                 isl_assert(tab->mat->ctx, col >= 0, goto error);
1114         }
1115
1116         isl_int_clear(tmp);
1117         return col;
1118 error:
1119         isl_int_clear(tmp);
1120         return -1;
1121 }
1122
1123 /* Return the first known violated constraint, i.e., a non-negative
1124  * constraint that currently has an either obviously negative value
1125  * or a previously determined to be negative value.
1126  *
1127  * If any constraint has a negative coefficient for the big parameter,
1128  * if any, then we return one of these first.
1129  */
1130 static int first_neg(struct isl_tab *tab)
1131 {
1132         int row;
1133
1134         if (tab->M)
1135                 for (row = tab->n_redundant; row < tab->n_row; ++row) {
1136                         if (!isl_tab_var_from_row(tab, row)->is_nonneg)
1137                                 continue;
1138                         if (!isl_int_is_neg(tab->mat->row[row][2]))
1139                                 continue;
1140                         if (tab->row_sign)
1141                                 tab->row_sign[row] = isl_tab_row_neg;
1142                         return row;
1143                 }
1144         for (row = tab->n_redundant; row < tab->n_row; ++row) {
1145                 if (!isl_tab_var_from_row(tab, row)->is_nonneg)
1146                         continue;
1147                 if (tab->row_sign) {
1148                         if (tab->row_sign[row] == 0 &&
1149                             is_obviously_neg(tab, row))
1150                                 tab->row_sign[row] = isl_tab_row_neg;
1151                         if (tab->row_sign[row] != isl_tab_row_neg)
1152                                 continue;
1153                 } else if (!is_obviously_neg(tab, row))
1154                         continue;
1155                 return row;
1156         }
1157         return -1;
1158 }
1159
1160 /* Check whether the invariant that all columns are lexico-positive
1161  * is satisfied.  This function is not called from the current code
1162  * but is useful during debugging.
1163  */
1164 static void check_lexpos(struct isl_tab *tab) __attribute__ ((unused));
1165 static void check_lexpos(struct isl_tab *tab)
1166 {
1167         unsigned off = 2 + tab->M;
1168         int col;
1169         int var;
1170         int row;
1171
1172         for (col = tab->n_dead; col < tab->n_col; ++col) {
1173                 if (tab->col_var[col] >= 0 &&
1174                     (tab->col_var[col] < tab->n_param ||
1175                      tab->col_var[col] >= tab->n_var - tab->n_div))
1176                         continue;
1177                 for (var = tab->n_param; var < tab->n_var - tab->n_div; ++var) {
1178                         if (!tab->var[var].is_row) {
1179                                 if (tab->var[var].index == col)
1180                                         break;
1181                                 else
1182                                         continue;
1183                         }
1184                         row = tab->var[var].index;
1185                         if (isl_int_is_zero(tab->mat->row[row][off + col]))
1186                                 continue;
1187                         if (isl_int_is_pos(tab->mat->row[row][off + col]))
1188                                 break;
1189                         fprintf(stderr, "lexneg column %d (row %d)\n",
1190                                 col, row);
1191                 }
1192                 if (var >= tab->n_var - tab->n_div)
1193                         fprintf(stderr, "zero column %d\n", col);
1194         }
1195 }
1196
1197 /* Report to the caller that the given constraint is part of an encountered
1198  * conflict.
1199  */
1200 static int report_conflicting_constraint(struct isl_tab *tab, int con)
1201 {
1202         return tab->conflict(con, tab->conflict_user);
1203 }
1204
1205 /* Given a conflicting row in the tableau, report all constraints
1206  * involved in the row to the caller.  That is, the row itself
1207  * (if it represents a constraint) and all constraint columns with
1208  * non-zero (and therefore negative) coefficients.
1209  */
1210 static int report_conflict(struct isl_tab *tab, int row)
1211 {
1212         int j;
1213         isl_int *tr;
1214
1215         if (!tab->conflict)
1216                 return 0;
1217
1218         if (tab->row_var[row] < 0 &&
1219             report_conflicting_constraint(tab, ~tab->row_var[row]) < 0)
1220                 return -1;
1221
1222         tr = tab->mat->row[row] + 2 + tab->M;
1223
1224         for (j = tab->n_dead; j < tab->n_col; ++j) {
1225                 if (tab->col_var[j] >= 0 &&
1226                     (tab->col_var[j] < tab->n_param  ||
1227                     tab->col_var[j] >= tab->n_var - tab->n_div))
1228                         continue;
1229
1230                 if (!isl_int_is_neg(tr[j]))
1231                         continue;
1232
1233                 if (tab->col_var[j] < 0 &&
1234                     report_conflicting_constraint(tab, ~tab->col_var[j]) < 0)
1235                         return -1;
1236         }
1237
1238         return 0;
1239 }
1240
1241 /* Resolve all known or obviously violated constraints through pivoting.
1242  * In particular, as long as we can find any violated constraint, we
1243  * look for a pivoting column that would result in the lexicographically
1244  * smallest increment in the sample point.  If there is no such column
1245  * then the tableau is infeasible.
1246  */
1247 static int restore_lexmin(struct isl_tab *tab) WARN_UNUSED;
1248 static int restore_lexmin(struct isl_tab *tab)
1249 {
1250         int row, col;
1251
1252         if (!tab)
1253                 return -1;
1254         if (tab->empty)
1255                 return 0;
1256         while ((row = first_neg(tab)) != -1) {
1257                 col = lexmin_pivot_col(tab, row);
1258                 if (col >= tab->n_col) {
1259                         if (report_conflict(tab, row) < 0)
1260                                 return -1;
1261                         if (isl_tab_mark_empty(tab) < 0)
1262                                 return -1;
1263                         return 0;
1264                 }
1265                 if (col < 0)
1266                         return -1;
1267                 if (isl_tab_pivot(tab, row, col) < 0)
1268                         return -1;
1269         }
1270         return 0;
1271 }
1272
1273 /* Given a row that represents an equality, look for an appropriate
1274  * pivoting column.
1275  * In particular, if there are any non-zero coefficients among
1276  * the non-parameter variables, then we take the last of these
1277  * variables.  Eliminating this variable in terms of the other
1278  * variables and/or parameters does not influence the property
1279  * that all column in the initial tableau are lexicographically
1280  * positive.  The row corresponding to the eliminated variable
1281  * will only have non-zero entries below the diagonal of the
1282  * initial tableau.  That is, we transform
1283  *
1284  *              I                               I
1285  *                1             into            a
1286  *                  I                             I
1287  *
1288  * If there is no such non-parameter variable, then we are dealing with
1289  * pure parameter equality and we pick any parameter with coefficient 1 or -1
1290  * for elimination.  This will ensure that the eliminated parameter
1291  * always has an integer value whenever all the other parameters are integral.
1292  * If there is no such parameter then we return -1.
1293  */
1294 static int last_var_col_or_int_par_col(struct isl_tab *tab, int row)
1295 {
1296         unsigned off = 2 + tab->M;
1297         int i;
1298
1299         for (i = tab->n_var - tab->n_div - 1; i >= 0 && i >= tab->n_param; --i) {
1300                 int col;
1301                 if (tab->var[i].is_row)
1302                         continue;
1303                 col = tab->var[i].index;
1304                 if (col <= tab->n_dead)
1305                         continue;
1306                 if (!isl_int_is_zero(tab->mat->row[row][off + col]))
1307                         return col;
1308         }
1309         for (i = tab->n_dead; i < tab->n_col; ++i) {
1310                 if (isl_int_is_one(tab->mat->row[row][off + i]))
1311                         return i;
1312                 if (isl_int_is_negone(tab->mat->row[row][off + i]))
1313                         return i;
1314         }
1315         return -1;
1316 }
1317
1318 /* Add an equality that is known to be valid to the tableau.
1319  * We first check if we can eliminate a variable or a parameter.
1320  * If not, we add the equality as two inequalities.
1321  * In this case, the equality was a pure parameter equality and there
1322  * is no need to resolve any constraint violations.
1323  */
1324 static struct isl_tab *add_lexmin_valid_eq(struct isl_tab *tab, isl_int *eq)
1325 {
1326         int i;
1327         int r;
1328
1329         if (!tab)
1330                 return NULL;
1331         r = isl_tab_add_row(tab, eq);
1332         if (r < 0)
1333                 goto error;
1334
1335         r = tab->con[r].index;
1336         i = last_var_col_or_int_par_col(tab, r);
1337         if (i < 0) {
1338                 tab->con[r].is_nonneg = 1;
1339                 if (isl_tab_push_var(tab, isl_tab_undo_nonneg, &tab->con[r]) < 0)
1340                         goto error;
1341                 isl_seq_neg(eq, eq, 1 + tab->n_var);
1342                 r = isl_tab_add_row(tab, eq);
1343                 if (r < 0)
1344                         goto error;
1345                 tab->con[r].is_nonneg = 1;
1346                 if (isl_tab_push_var(tab, isl_tab_undo_nonneg, &tab->con[r]) < 0)
1347                         goto error;
1348         } else {
1349                 if (isl_tab_pivot(tab, r, i) < 0)
1350                         goto error;
1351                 if (isl_tab_kill_col(tab, i) < 0)
1352                         goto error;
1353                 tab->n_eq++;
1354         }
1355
1356         return tab;
1357 error:
1358         isl_tab_free(tab);
1359         return NULL;
1360 }
1361
1362 /* Check if the given row is a pure constant.
1363  */
1364 static int is_constant(struct isl_tab *tab, int row)
1365 {
1366         unsigned off = 2 + tab->M;
1367
1368         return isl_seq_first_non_zero(tab->mat->row[row] + off + tab->n_dead,
1369                                         tab->n_col - tab->n_dead) == -1;
1370 }
1371
1372 /* Add an equality that may or may not be valid to the tableau.
1373  * If the resulting row is a pure constant, then it must be zero.
1374  * Otherwise, the resulting tableau is empty.
1375  *
1376  * If the row is not a pure constant, then we add two inequalities,
1377  * each time checking that they can be satisfied.
1378  * In the end we try to use one of the two constraints to eliminate
1379  * a column.
1380  */
1381 static int add_lexmin_eq(struct isl_tab *tab, isl_int *eq) WARN_UNUSED;
1382 static int add_lexmin_eq(struct isl_tab *tab, isl_int *eq)
1383 {
1384         int r1, r2;
1385         int row;
1386         struct isl_tab_undo *snap;
1387
1388         if (!tab)
1389                 return -1;
1390         snap = isl_tab_snap(tab);
1391         r1 = isl_tab_add_row(tab, eq);
1392         if (r1 < 0)
1393                 return -1;
1394         tab->con[r1].is_nonneg = 1;
1395         if (isl_tab_push_var(tab, isl_tab_undo_nonneg, &tab->con[r1]) < 0)
1396                 return -1;
1397
1398         row = tab->con[r1].index;
1399         if (is_constant(tab, row)) {
1400                 if (!isl_int_is_zero(tab->mat->row[row][1]) ||
1401                     (tab->M && !isl_int_is_zero(tab->mat->row[row][2]))) {
1402                         if (isl_tab_mark_empty(tab) < 0)
1403                                 return -1;
1404                         return 0;
1405                 }
1406                 if (isl_tab_rollback(tab, snap) < 0)
1407                         return -1;
1408                 return 0;
1409         }
1410
1411         if (restore_lexmin(tab) < 0)
1412                 return -1;
1413         if (tab->empty)
1414                 return 0;
1415
1416         isl_seq_neg(eq, eq, 1 + tab->n_var);
1417
1418         r2 = isl_tab_add_row(tab, eq);
1419         if (r2 < 0)
1420                 return -1;
1421         tab->con[r2].is_nonneg = 1;
1422         if (isl_tab_push_var(tab, isl_tab_undo_nonneg, &tab->con[r2]) < 0)
1423                 return -1;
1424
1425         if (restore_lexmin(tab) < 0)
1426                 return -1;
1427         if (tab->empty)
1428                 return 0;
1429
1430         if (!tab->con[r1].is_row) {
1431                 if (isl_tab_kill_col(tab, tab->con[r1].index) < 0)
1432                         return -1;
1433         } else if (!tab->con[r2].is_row) {
1434                 if (isl_tab_kill_col(tab, tab->con[r2].index) < 0)
1435                         return -1;
1436         }
1437
1438         if (tab->bmap) {
1439                 tab->bmap = isl_basic_map_add_ineq(tab->bmap, eq);
1440                 if (isl_tab_push(tab, isl_tab_undo_bmap_ineq) < 0)
1441                         return -1;
1442                 isl_seq_neg(eq, eq, 1 + tab->n_var);
1443                 tab->bmap = isl_basic_map_add_ineq(tab->bmap, eq);
1444                 isl_seq_neg(eq, eq, 1 + tab->n_var);
1445                 if (isl_tab_push(tab, isl_tab_undo_bmap_ineq) < 0)
1446                         return -1;
1447                 if (!tab->bmap)
1448                         return -1;
1449         }
1450
1451         return 0;
1452 }
1453
1454 /* Add an inequality to the tableau, resolving violations using
1455  * restore_lexmin.
1456  */
1457 static struct isl_tab *add_lexmin_ineq(struct isl_tab *tab, isl_int *ineq)
1458 {
1459         int r;
1460
1461         if (!tab)
1462                 return NULL;
1463         if (tab->bmap) {
1464                 tab->bmap = isl_basic_map_add_ineq(tab->bmap, ineq);
1465                 if (isl_tab_push(tab, isl_tab_undo_bmap_ineq) < 0)
1466                         goto error;
1467                 if (!tab->bmap)
1468                         goto error;
1469         }
1470         r = isl_tab_add_row(tab, ineq);
1471         if (r < 0)
1472                 goto error;
1473         tab->con[r].is_nonneg = 1;
1474         if (isl_tab_push_var(tab, isl_tab_undo_nonneg, &tab->con[r]) < 0)
1475                 goto error;
1476         if (isl_tab_row_is_redundant(tab, tab->con[r].index)) {
1477                 if (isl_tab_mark_redundant(tab, tab->con[r].index) < 0)
1478                         goto error;
1479                 return tab;
1480         }
1481
1482         if (restore_lexmin(tab) < 0)
1483                 goto error;
1484         if (!tab->empty && tab->con[r].is_row &&
1485                  isl_tab_row_is_redundant(tab, tab->con[r].index))
1486                 if (isl_tab_mark_redundant(tab, tab->con[r].index) < 0)
1487                         goto error;
1488         return tab;
1489 error:
1490         isl_tab_free(tab);
1491         return NULL;
1492 }
1493
1494 /* Check if the coefficients of the parameters are all integral.
1495  */
1496 static int integer_parameter(struct isl_tab *tab, int row)
1497 {
1498         int i;
1499         int col;
1500         unsigned off = 2 + tab->M;
1501
1502         for (i = 0; i < tab->n_param; ++i) {
1503                 /* Eliminated parameter */
1504                 if (tab->var[i].is_row)
1505                         continue;
1506                 col = tab->var[i].index;
1507                 if (!isl_int_is_divisible_by(tab->mat->row[row][off + col],
1508                                                 tab->mat->row[row][0]))
1509                         return 0;
1510         }
1511         for (i = 0; i < tab->n_div; ++i) {
1512                 if (tab->var[tab->n_var - tab->n_div + i].is_row)
1513                         continue;
1514                 col = tab->var[tab->n_var - tab->n_div + i].index;
1515                 if (!isl_int_is_divisible_by(tab->mat->row[row][off + col],
1516                                                 tab->mat->row[row][0]))
1517                         return 0;
1518         }
1519         return 1;
1520 }
1521
1522 /* Check if the coefficients of the non-parameter variables are all integral.
1523  */
1524 static int integer_variable(struct isl_tab *tab, int row)
1525 {
1526         int i;
1527         unsigned off = 2 + tab->M;
1528
1529         for (i = tab->n_dead; i < tab->n_col; ++i) {
1530                 if (tab->col_var[i] >= 0 &&
1531                     (tab->col_var[i] < tab->n_param ||
1532                      tab->col_var[i] >= tab->n_var - tab->n_div))
1533                         continue;
1534                 if (!isl_int_is_divisible_by(tab->mat->row[row][off + i],
1535                                                 tab->mat->row[row][0]))
1536                         return 0;
1537         }
1538         return 1;
1539 }
1540
1541 /* Check if the constant term is integral.
1542  */
1543 static int integer_constant(struct isl_tab *tab, int row)
1544 {
1545         return isl_int_is_divisible_by(tab->mat->row[row][1],
1546                                         tab->mat->row[row][0]);
1547 }
1548
1549 #define I_CST   1 << 0
1550 #define I_PAR   1 << 1
1551 #define I_VAR   1 << 2
1552
1553 /* Check for next (non-parameter) variable after "var" (first if var == -1)
1554  * that is non-integer and therefore requires a cut and return
1555  * the index of the variable.
1556  * For parametric tableaus, there are three parts in a row,
1557  * the constant, the coefficients of the parameters and the rest.
1558  * For each part, we check whether the coefficients in that part
1559  * are all integral and if so, set the corresponding flag in *f.
1560  * If the constant and the parameter part are integral, then the
1561  * current sample value is integral and no cut is required
1562  * (irrespective of whether the variable part is integral).
1563  */
1564 static int next_non_integer_var(struct isl_tab *tab, int var, int *f)
1565 {
1566         var = var < 0 ? tab->n_param : var + 1;
1567
1568         for (; var < tab->n_var - tab->n_div; ++var) {
1569                 int flags = 0;
1570                 int row;
1571                 if (!tab->var[var].is_row)
1572                         continue;
1573                 row = tab->var[var].index;
1574                 if (integer_constant(tab, row))
1575                         ISL_FL_SET(flags, I_CST);
1576                 if (integer_parameter(tab, row))
1577                         ISL_FL_SET(flags, I_PAR);
1578                 if (ISL_FL_ISSET(flags, I_CST) && ISL_FL_ISSET(flags, I_PAR))
1579                         continue;
1580                 if (integer_variable(tab, row))
1581                         ISL_FL_SET(flags, I_VAR);
1582                 *f = flags;
1583                 return var;
1584         }
1585         return -1;
1586 }
1587
1588 /* Check for first (non-parameter) variable that is non-integer and
1589  * therefore requires a cut and return the corresponding row.
1590  * For parametric tableaus, there are three parts in a row,
1591  * the constant, the coefficients of the parameters and the rest.
1592  * For each part, we check whether the coefficients in that part
1593  * are all integral and if so, set the corresponding flag in *f.
1594  * If the constant and the parameter part are integral, then the
1595  * current sample value is integral and no cut is required
1596  * (irrespective of whether the variable part is integral).
1597  */
1598 static int first_non_integer_row(struct isl_tab *tab, int *f)
1599 {
1600         int var = next_non_integer_var(tab, -1, f);
1601
1602         return var < 0 ? -1 : tab->var[var].index;
1603 }
1604
1605 /* Add a (non-parametric) cut to cut away the non-integral sample
1606  * value of the given row.
1607  *
1608  * If the row is given by
1609  *
1610  *      m r = f + \sum_i a_i y_i
1611  *
1612  * then the cut is
1613  *
1614  *      c = - {-f/m} + \sum_i {a_i/m} y_i >= 0
1615  *
1616  * The big parameter, if any, is ignored, since it is assumed to be big
1617  * enough to be divisible by any integer.
1618  * If the tableau is actually a parametric tableau, then this function
1619  * is only called when all coefficients of the parameters are integral.
1620  * The cut therefore has zero coefficients for the parameters.
1621  *
1622  * The current value is known to be negative, so row_sign, if it
1623  * exists, is set accordingly.
1624  *
1625  * Return the row of the cut or -1.
1626  */
1627 static int add_cut(struct isl_tab *tab, int row)
1628 {
1629         int i;
1630         int r;
1631         isl_int *r_row;
1632         unsigned off = 2 + tab->M;
1633
1634         if (isl_tab_extend_cons(tab, 1) < 0)
1635                 return -1;
1636         r = isl_tab_allocate_con(tab);
1637         if (r < 0)
1638                 return -1;
1639
1640         r_row = tab->mat->row[tab->con[r].index];
1641         isl_int_set(r_row[0], tab->mat->row[row][0]);
1642         isl_int_neg(r_row[1], tab->mat->row[row][1]);
1643         isl_int_fdiv_r(r_row[1], r_row[1], tab->mat->row[row][0]);
1644         isl_int_neg(r_row[1], r_row[1]);
1645         if (tab->M)
1646                 isl_int_set_si(r_row[2], 0);
1647         for (i = 0; i < tab->n_col; ++i)
1648                 isl_int_fdiv_r(r_row[off + i],
1649                         tab->mat->row[row][off + i], tab->mat->row[row][0]);
1650
1651         tab->con[r].is_nonneg = 1;
1652         if (isl_tab_push_var(tab, isl_tab_undo_nonneg, &tab->con[r]) < 0)
1653                 return -1;
1654         if (tab->row_sign)
1655                 tab->row_sign[tab->con[r].index] = isl_tab_row_neg;
1656
1657         return tab->con[r].index;
1658 }
1659
1660 #define CUT_ALL 1
1661 #define CUT_ONE 0
1662
1663 /* Given a non-parametric tableau, add cuts until an integer
1664  * sample point is obtained or until the tableau is determined
1665  * to be integer infeasible.
1666  * As long as there is any non-integer value in the sample point,
1667  * we add appropriate cuts, if possible, for each of these
1668  * non-integer values and then resolve the violated
1669  * cut constraints using restore_lexmin.
1670  * If one of the corresponding rows is equal to an integral
1671  * combination of variables/constraints plus a non-integral constant,
1672  * then there is no way to obtain an integer point and we return
1673  * a tableau that is marked empty.
1674  * The parameter cutting_strategy controls the strategy used when adding cuts
1675  * to remove non-integer points. CUT_ALL adds all possible cuts
1676  * before continuing the search. CUT_ONE adds only one cut at a time.
1677  */
1678 static struct isl_tab *cut_to_integer_lexmin(struct isl_tab *tab,
1679         int cutting_strategy)
1680 {
1681         int var;
1682         int row;
1683         int flags;
1684
1685         if (!tab)
1686                 return NULL;
1687         if (tab->empty)
1688                 return tab;
1689
1690         while ((var = next_non_integer_var(tab, -1, &flags)) != -1) {
1691                 do {
1692                         if (ISL_FL_ISSET(flags, I_VAR)) {
1693                                 if (isl_tab_mark_empty(tab) < 0)
1694                                         goto error;
1695                                 return tab;
1696                         }
1697                         row = tab->var[var].index;
1698                         row = add_cut(tab, row);
1699                         if (row < 0)
1700                                 goto error;
1701                         if (cutting_strategy == CUT_ONE)
1702                                 break;
1703                 } while ((var = next_non_integer_var(tab, var, &flags)) != -1);
1704                 if (restore_lexmin(tab) < 0)
1705                         goto error;
1706                 if (tab->empty)
1707                         break;
1708         }
1709         return tab;
1710 error:
1711         isl_tab_free(tab);
1712         return NULL;
1713 }
1714
1715 /* Check whether all the currently active samples also satisfy the inequality
1716  * "ineq" (treated as an equality if eq is set).
1717  * Remove those samples that do not.
1718  */
1719 static struct isl_tab *check_samples(struct isl_tab *tab, isl_int *ineq, int eq)
1720 {
1721         int i;
1722         isl_int v;
1723
1724         if (!tab)
1725                 return NULL;
1726
1727         isl_assert(tab->mat->ctx, tab->bmap, goto error);
1728         isl_assert(tab->mat->ctx, tab->samples, goto error);
1729         isl_assert(tab->mat->ctx, tab->samples->n_col == 1 + tab->n_var, goto error);
1730
1731         isl_int_init(v);
1732         for (i = tab->n_outside; i < tab->n_sample; ++i) {
1733                 int sgn;
1734                 isl_seq_inner_product(ineq, tab->samples->row[i],
1735                                         1 + tab->n_var, &v);
1736                 sgn = isl_int_sgn(v);
1737                 if (eq ? (sgn == 0) : (sgn >= 0))
1738                         continue;
1739                 tab = isl_tab_drop_sample(tab, i);
1740                 if (!tab)
1741                         break;
1742         }
1743         isl_int_clear(v);
1744
1745         return tab;
1746 error:
1747         isl_tab_free(tab);
1748         return NULL;
1749 }
1750
1751 /* Check whether the sample value of the tableau is finite,
1752  * i.e., either the tableau does not use a big parameter, or
1753  * all values of the variables are equal to the big parameter plus
1754  * some constant.  This constant is the actual sample value.
1755  */
1756 static int sample_is_finite(struct isl_tab *tab)
1757 {
1758         int i;
1759
1760         if (!tab->M)
1761                 return 1;
1762
1763         for (i = 0; i < tab->n_var; ++i) {
1764                 int row;
1765                 if (!tab->var[i].is_row)
1766                         return 0;
1767                 row = tab->var[i].index;
1768                 if (isl_int_ne(tab->mat->row[row][0], tab->mat->row[row][2]))
1769                         return 0;
1770         }
1771         return 1;
1772 }
1773
1774 /* Check if the context tableau of sol has any integer points.
1775  * Leave tab in empty state if no integer point can be found.
1776  * If an integer point can be found and if moreover it is finite,
1777  * then it is added to the list of sample values.
1778  *
1779  * This function is only called when none of the currently active sample
1780  * values satisfies the most recently added constraint.
1781  */
1782 static struct isl_tab *check_integer_feasible(struct isl_tab *tab)
1783 {
1784         struct isl_tab_undo *snap;
1785
1786         if (!tab)
1787                 return NULL;
1788
1789         snap = isl_tab_snap(tab);
1790         if (isl_tab_push_basis(tab) < 0)
1791                 goto error;
1792
1793         tab = cut_to_integer_lexmin(tab, CUT_ALL);
1794         if (!tab)
1795                 goto error;
1796
1797         if (!tab->empty && sample_is_finite(tab)) {
1798                 struct isl_vec *sample;
1799
1800                 sample = isl_tab_get_sample_value(tab);
1801
1802                 tab = isl_tab_add_sample(tab, sample);
1803         }
1804
1805         if (!tab->empty && isl_tab_rollback(tab, snap) < 0)
1806                 goto error;
1807
1808         return tab;
1809 error:
1810         isl_tab_free(tab);
1811         return NULL;
1812 }
1813
1814 /* Check if any of the currently active sample values satisfies
1815  * the inequality "ineq" (an equality if eq is set).
1816  */
1817 static int tab_has_valid_sample(struct isl_tab *tab, isl_int *ineq, int eq)
1818 {
1819         int i;
1820         isl_int v;
1821
1822         if (!tab)
1823                 return -1;
1824
1825         isl_assert(tab->mat->ctx, tab->bmap, return -1);
1826         isl_assert(tab->mat->ctx, tab->samples, return -1);
1827         isl_assert(tab->mat->ctx, tab->samples->n_col == 1 + tab->n_var, return -1);
1828
1829         isl_int_init(v);
1830         for (i = tab->n_outside; i < tab->n_sample; ++i) {
1831                 int sgn;
1832                 isl_seq_inner_product(ineq, tab->samples->row[i],
1833                                         1 + tab->n_var, &v);
1834                 sgn = isl_int_sgn(v);
1835                 if (eq ? (sgn == 0) : (sgn >= 0))
1836                         break;
1837         }
1838         isl_int_clear(v);
1839
1840         return i < tab->n_sample;
1841 }
1842
1843 /* Add a div specified by "div" to the tableau "tab" and return
1844  * 1 if the div is obviously non-negative.
1845  */
1846 static int context_tab_add_div(struct isl_tab *tab, struct isl_vec *div,
1847         int (*add_ineq)(void *user, isl_int *), void *user)
1848 {
1849         int i;
1850         int r;
1851         struct isl_mat *samples;
1852         int nonneg;
1853
1854         r = isl_tab_add_div(tab, div, add_ineq, user);
1855         if (r < 0)
1856                 return -1;
1857         nonneg = tab->var[r].is_nonneg;
1858         tab->var[r].frozen = 1;
1859
1860         samples = isl_mat_extend(tab->samples,
1861                         tab->n_sample, 1 + tab->n_var);
1862         tab->samples = samples;
1863         if (!samples)
1864                 return -1;
1865         for (i = tab->n_outside; i < samples->n_row; ++i) {
1866                 isl_seq_inner_product(div->el + 1, samples->row[i],
1867                         div->size - 1, &samples->row[i][samples->n_col - 1]);
1868                 isl_int_fdiv_q(samples->row[i][samples->n_col - 1],
1869                                samples->row[i][samples->n_col - 1], div->el[0]);
1870         }
1871
1872         return nonneg;
1873 }
1874
1875 /* Add a div specified by "div" to both the main tableau and
1876  * the context tableau.  In case of the main tableau, we only
1877  * need to add an extra div.  In the context tableau, we also
1878  * need to express the meaning of the div.
1879  * Return the index of the div or -1 if anything went wrong.
1880  */
1881 static int add_div(struct isl_tab *tab, struct isl_context *context,
1882         struct isl_vec *div)
1883 {
1884         int r;
1885         int nonneg;
1886
1887         if ((nonneg = context->op->add_div(context, div)) < 0)
1888                 goto error;
1889
1890         if (!context->op->is_ok(context))
1891                 goto error;
1892
1893         if (isl_tab_extend_vars(tab, 1) < 0)
1894                 goto error;
1895         r = isl_tab_allocate_var(tab);
1896         if (r < 0)
1897                 goto error;
1898         if (nonneg)
1899                 tab->var[r].is_nonneg = 1;
1900         tab->var[r].frozen = 1;
1901         tab->n_div++;
1902
1903         return tab->n_div - 1;
1904 error:
1905         context->op->invalidate(context);
1906         return -1;
1907 }
1908
1909 static int find_div(struct isl_tab *tab, isl_int *div, isl_int denom)
1910 {
1911         int i;
1912         unsigned total = isl_basic_map_total_dim(tab->bmap);
1913
1914         for (i = 0; i < tab->bmap->n_div; ++i) {
1915                 if (isl_int_ne(tab->bmap->div[i][0], denom))
1916                         continue;
1917                 if (!isl_seq_eq(tab->bmap->div[i] + 1, div, 1 + total))
1918                         continue;
1919                 return i;
1920         }
1921         return -1;
1922 }
1923
1924 /* Return the index of a div that corresponds to "div".
1925  * We first check if we already have such a div and if not, we create one.
1926  */
1927 static int get_div(struct isl_tab *tab, struct isl_context *context,
1928         struct isl_vec *div)
1929 {
1930         int d;
1931         struct isl_tab *context_tab = context->op->peek_tab(context);
1932
1933         if (!context_tab)
1934                 return -1;
1935
1936         d = find_div(context_tab, div->el + 1, div->el[0]);
1937         if (d != -1)
1938                 return d;
1939
1940         return add_div(tab, context, div);
1941 }
1942
1943 /* Add a parametric cut to cut away the non-integral sample value
1944  * of the give row.
1945  * Let a_i be the coefficients of the constant term and the parameters
1946  * and let b_i be the coefficients of the variables or constraints
1947  * in basis of the tableau.
1948  * Let q be the div q = floor(\sum_i {-a_i} y_i).
1949  *
1950  * The cut is expressed as
1951  *
1952  *      c = \sum_i -{-a_i} y_i + \sum_i {b_i} x_i + q >= 0
1953  *
1954  * If q did not already exist in the context tableau, then it is added first.
1955  * If q is in a column of the main tableau then the "+ q" can be accomplished
1956  * by setting the corresponding entry to the denominator of the constraint.
1957  * If q happens to be in a row of the main tableau, then the corresponding
1958  * row needs to be added instead (taking care of the denominators).
1959  * Note that this is very unlikely, but perhaps not entirely impossible.
1960  *
1961  * The current value of the cut is known to be negative (or at least
1962  * non-positive), so row_sign is set accordingly.
1963  *
1964  * Return the row of the cut or -1.
1965  */
1966 static int add_parametric_cut(struct isl_tab *tab, int row,
1967         struct isl_context *context)
1968 {
1969         struct isl_vec *div;
1970         int d;
1971         int i;
1972         int r;
1973         isl_int *r_row;
1974         int col;
1975         int n;
1976         unsigned off = 2 + tab->M;
1977
1978         if (!context)
1979                 return -1;
1980
1981         div = get_row_parameter_div(tab, row);
1982         if (!div)
1983                 return -1;
1984
1985         n = tab->n_div;
1986         d = context->op->get_div(context, tab, div);
1987         isl_vec_free(div);
1988         if (d < 0)
1989                 return -1;
1990
1991         if (isl_tab_extend_cons(tab, 1) < 0)
1992                 return -1;
1993         r = isl_tab_allocate_con(tab);
1994         if (r < 0)
1995                 return -1;
1996
1997         r_row = tab->mat->row[tab->con[r].index];
1998         isl_int_set(r_row[0], tab->mat->row[row][0]);
1999         isl_int_neg(r_row[1], tab->mat->row[row][1]);
2000         isl_int_fdiv_r(r_row[1], r_row[1], tab->mat->row[row][0]);
2001         isl_int_neg(r_row[1], r_row[1]);
2002         if (tab->M)
2003                 isl_int_set_si(r_row[2], 0);
2004         for (i = 0; i < tab->n_param; ++i) {
2005                 if (tab->var[i].is_row)
2006                         continue;
2007                 col = tab->var[i].index;
2008                 isl_int_neg(r_row[off + col], tab->mat->row[row][off + col]);
2009                 isl_int_fdiv_r(r_row[off + col], r_row[off + col],
2010                                 tab->mat->row[row][0]);
2011                 isl_int_neg(r_row[off + col], r_row[off + col]);
2012         }
2013         for (i = 0; i < tab->n_div; ++i) {
2014                 if (tab->var[tab->n_var - tab->n_div + i].is_row)
2015                         continue;
2016                 col = tab->var[tab->n_var - tab->n_div + i].index;
2017                 isl_int_neg(r_row[off + col], tab->mat->row[row][off + col]);
2018                 isl_int_fdiv_r(r_row[off + col], r_row[off + col],
2019                                 tab->mat->row[row][0]);
2020                 isl_int_neg(r_row[off + col], r_row[off + col]);
2021         }
2022         for (i = 0; i < tab->n_col; ++i) {
2023                 if (tab->col_var[i] >= 0 &&
2024                     (tab->col_var[i] < tab->n_param ||
2025                      tab->col_var[i] >= tab->n_var - tab->n_div))
2026                         continue;
2027                 isl_int_fdiv_r(r_row[off + i],
2028                         tab->mat->row[row][off + i], tab->mat->row[row][0]);
2029         }
2030         if (tab->var[tab->n_var - tab->n_div + d].is_row) {
2031                 isl_int gcd;
2032                 int d_row = tab->var[tab->n_var - tab->n_div + d].index;
2033                 isl_int_init(gcd);
2034                 isl_int_gcd(gcd, tab->mat->row[d_row][0], r_row[0]);
2035                 isl_int_divexact(r_row[0], r_row[0], gcd);
2036                 isl_int_divexact(gcd, tab->mat->row[d_row][0], gcd);
2037                 isl_seq_combine(r_row + 1, gcd, r_row + 1,
2038                                 r_row[0], tab->mat->row[d_row] + 1,
2039                                 off - 1 + tab->n_col);
2040                 isl_int_mul(r_row[0], r_row[0], tab->mat->row[d_row][0]);
2041                 isl_int_clear(gcd);
2042         } else {
2043                 col = tab->var[tab->n_var - tab->n_div + d].index;
2044                 isl_int_set(r_row[off + col], tab->mat->row[row][0]);
2045         }
2046
2047         tab->con[r].is_nonneg = 1;
2048         if (isl_tab_push_var(tab, isl_tab_undo_nonneg, &tab->con[r]) < 0)
2049                 return -1;
2050         if (tab->row_sign)
2051                 tab->row_sign[tab->con[r].index] = isl_tab_row_neg;
2052
2053         row = tab->con[r].index;
2054
2055         if (d >= n && context->op->detect_equalities(context, tab) < 0)
2056                 return -1;
2057
2058         return row;
2059 }
2060
2061 /* Construct a tableau for bmap that can be used for computing
2062  * the lexicographic minimum (or maximum) of bmap.
2063  * If not NULL, then dom is the domain where the minimum
2064  * should be computed.  In this case, we set up a parametric
2065  * tableau with row signs (initialized to "unknown").
2066  * If M is set, then the tableau will use a big parameter.
2067  * If max is set, then a maximum should be computed instead of a minimum.
2068  * This means that for each variable x, the tableau will contain the variable
2069  * x' = M - x, rather than x' = M + x.  This in turn means that the coefficient
2070  * of the variables in all constraints are negated prior to adding them
2071  * to the tableau.
2072  */
2073 static struct isl_tab *tab_for_lexmin(struct isl_basic_map *bmap,
2074         struct isl_basic_set *dom, unsigned M, int max)
2075 {
2076         int i;
2077         struct isl_tab *tab;
2078
2079         tab = isl_tab_alloc(bmap->ctx, 2 * bmap->n_eq + bmap->n_ineq + 1,
2080                             isl_basic_map_total_dim(bmap), M);
2081         if (!tab)
2082                 return NULL;
2083
2084         tab->rational = ISL_F_ISSET(bmap, ISL_BASIC_MAP_RATIONAL);
2085         if (dom) {
2086                 tab->n_param = isl_basic_set_total_dim(dom) - dom->n_div;
2087                 tab->n_div = dom->n_div;
2088                 tab->row_sign = isl_calloc_array(bmap->ctx,
2089                                         enum isl_tab_row_sign, tab->mat->n_row);
2090                 if (!tab->row_sign)
2091                         goto error;
2092         }
2093         if (ISL_F_ISSET(bmap, ISL_BASIC_MAP_EMPTY)) {
2094                 if (isl_tab_mark_empty(tab) < 0)
2095                         goto error;
2096                 return tab;
2097         }
2098
2099         for (i = tab->n_param; i < tab->n_var - tab->n_div; ++i) {
2100                 tab->var[i].is_nonneg = 1;
2101                 tab->var[i].frozen = 1;
2102         }
2103         for (i = 0; i < bmap->n_eq; ++i) {
2104                 if (max)
2105                         isl_seq_neg(bmap->eq[i] + 1 + tab->n_param,
2106                                     bmap->eq[i] + 1 + tab->n_param,
2107                                     tab->n_var - tab->n_param - tab->n_div);
2108                 tab = add_lexmin_valid_eq(tab, bmap->eq[i]);
2109                 if (max)
2110                         isl_seq_neg(bmap->eq[i] + 1 + tab->n_param,
2111                                     bmap->eq[i] + 1 + tab->n_param,
2112                                     tab->n_var - tab->n_param - tab->n_div);
2113                 if (!tab || tab->empty)
2114                         return tab;
2115         }
2116         if (bmap->n_eq && restore_lexmin(tab) < 0)
2117                 goto error;
2118         for (i = 0; i < bmap->n_ineq; ++i) {
2119                 if (max)
2120                         isl_seq_neg(bmap->ineq[i] + 1 + tab->n_param,
2121                                     bmap->ineq[i] + 1 + tab->n_param,
2122                                     tab->n_var - tab->n_param - tab->n_div);
2123                 tab = add_lexmin_ineq(tab, bmap->ineq[i]);
2124                 if (max)
2125                         isl_seq_neg(bmap->ineq[i] + 1 + tab->n_param,
2126                                     bmap->ineq[i] + 1 + tab->n_param,
2127                                     tab->n_var - tab->n_param - tab->n_div);
2128                 if (!tab || tab->empty)
2129                         return tab;
2130         }
2131         return tab;
2132 error:
2133         isl_tab_free(tab);
2134         return NULL;
2135 }
2136
2137 /* Given a main tableau where more than one row requires a split,
2138  * determine and return the "best" row to split on.
2139  *
2140  * Given two rows in the main tableau, if the inequality corresponding
2141  * to the first row is redundant with respect to that of the second row
2142  * in the current tableau, then it is better to split on the second row,
2143  * since in the positive part, both row will be positive.
2144  * (In the negative part a pivot will have to be performed and just about
2145  * anything can happen to the sign of the other row.)
2146  *
2147  * As a simple heuristic, we therefore select the row that makes the most
2148  * of the other rows redundant.
2149  *
2150  * Perhaps it would also be useful to look at the number of constraints
2151  * that conflict with any given constraint.
2152  */
2153 static int best_split(struct isl_tab *tab, struct isl_tab *context_tab)
2154 {
2155         struct isl_tab_undo *snap;
2156         int split;
2157         int row;
2158         int best = -1;
2159         int best_r;
2160
2161         if (isl_tab_extend_cons(context_tab, 2) < 0)
2162                 return -1;
2163
2164         snap = isl_tab_snap(context_tab);
2165
2166         for (split = tab->n_redundant; split < tab->n_row; ++split) {
2167                 struct isl_tab_undo *snap2;
2168                 struct isl_vec *ineq = NULL;
2169                 int r = 0;
2170                 int ok;
2171
2172                 if (!isl_tab_var_from_row(tab, split)->is_nonneg)
2173                         continue;
2174                 if (tab->row_sign[split] != isl_tab_row_any)
2175                         continue;
2176
2177                 ineq = get_row_parameter_ineq(tab, split);
2178                 if (!ineq)
2179                         return -1;
2180                 ok = isl_tab_add_ineq(context_tab, ineq->el) >= 0;
2181                 isl_vec_free(ineq);
2182                 if (!ok)
2183                         return -1;
2184
2185                 snap2 = isl_tab_snap(context_tab);
2186
2187                 for (row = tab->n_redundant; row < tab->n_row; ++row) {
2188                         struct isl_tab_var *var;
2189
2190                         if (row == split)
2191                                 continue;
2192                         if (!isl_tab_var_from_row(tab, row)->is_nonneg)
2193                                 continue;
2194                         if (tab->row_sign[row] != isl_tab_row_any)
2195                                 continue;
2196
2197                         ineq = get_row_parameter_ineq(tab, row);
2198                         if (!ineq)
2199                                 return -1;
2200                         ok = isl_tab_add_ineq(context_tab, ineq->el) >= 0;
2201                         isl_vec_free(ineq);
2202                         if (!ok)
2203                                 return -1;
2204                         var = &context_tab->con[context_tab->n_con - 1];
2205                         if (!context_tab->empty &&
2206                             !isl_tab_min_at_most_neg_one(context_tab, var))
2207                                 r++;
2208                         if (isl_tab_rollback(context_tab, snap2) < 0)
2209                                 return -1;
2210                 }
2211                 if (best == -1 || r > best_r) {
2212                         best = split;
2213                         best_r = r;
2214                 }
2215                 if (isl_tab_rollback(context_tab, snap) < 0)
2216                         return -1;
2217         }
2218
2219         return best;
2220 }
2221
2222 static struct isl_basic_set *context_lex_peek_basic_set(
2223         struct isl_context *context)
2224 {
2225         struct isl_context_lex *clex = (struct isl_context_lex *)context;
2226         if (!clex->tab)
2227                 return NULL;
2228         return isl_tab_peek_bset(clex->tab);
2229 }
2230
2231 static struct isl_tab *context_lex_peek_tab(struct isl_context *context)
2232 {
2233         struct isl_context_lex *clex = (struct isl_context_lex *)context;
2234         return clex->tab;
2235 }
2236
2237 static void context_lex_add_eq(struct isl_context *context, isl_int *eq,
2238                 int check, int update)
2239 {
2240         struct isl_context_lex *clex = (struct isl_context_lex *)context;
2241         if (isl_tab_extend_cons(clex->tab, 2) < 0)
2242                 goto error;
2243         if (add_lexmin_eq(clex->tab, eq) < 0)
2244                 goto error;
2245         if (check) {
2246                 int v = tab_has_valid_sample(clex->tab, eq, 1);
2247                 if (v < 0)
2248                         goto error;
2249                 if (!v)
2250                         clex->tab = check_integer_feasible(clex->tab);
2251         }
2252         if (update)
2253                 clex->tab = check_samples(clex->tab, eq, 1);
2254         return;
2255 error:
2256         isl_tab_free(clex->tab);
2257         clex->tab = NULL;
2258 }
2259
2260 static void context_lex_add_ineq(struct isl_context *context, isl_int *ineq,
2261                 int check, int update)
2262 {
2263         struct isl_context_lex *clex = (struct isl_context_lex *)context;
2264         if (isl_tab_extend_cons(clex->tab, 1) < 0)
2265                 goto error;
2266         clex->tab = add_lexmin_ineq(clex->tab, ineq);
2267         if (check) {
2268                 int v = tab_has_valid_sample(clex->tab, ineq, 0);
2269                 if (v < 0)
2270                         goto error;
2271                 if (!v)
2272                         clex->tab = check_integer_feasible(clex->tab);
2273         }
2274         if (update)
2275                 clex->tab = check_samples(clex->tab, ineq, 0);
2276         return;
2277 error:
2278         isl_tab_free(clex->tab);
2279         clex->tab = NULL;
2280 }
2281
2282 static int context_lex_add_ineq_wrap(void *user, isl_int *ineq)
2283 {
2284         struct isl_context *context = (struct isl_context *)user;
2285         context_lex_add_ineq(context, ineq, 0, 0);
2286         return context->op->is_ok(context) ? 0 : -1;
2287 }
2288
2289 /* Check which signs can be obtained by "ineq" on all the currently
2290  * active sample values.  See row_sign for more information.
2291  */
2292 static enum isl_tab_row_sign tab_ineq_sign(struct isl_tab *tab, isl_int *ineq,
2293         int strict)
2294 {
2295         int i;
2296         int sgn;
2297         isl_int tmp;
2298         enum isl_tab_row_sign res = isl_tab_row_unknown;
2299
2300         isl_assert(tab->mat->ctx, tab->samples, return isl_tab_row_unknown);
2301         isl_assert(tab->mat->ctx, tab->samples->n_col == 1 + tab->n_var,
2302                         return isl_tab_row_unknown);
2303
2304         isl_int_init(tmp);
2305         for (i = tab->n_outside; i < tab->n_sample; ++i) {
2306                 isl_seq_inner_product(tab->samples->row[i], ineq,
2307                                         1 + tab->n_var, &tmp);
2308                 sgn = isl_int_sgn(tmp);
2309                 if (sgn > 0 || (sgn == 0 && strict)) {
2310                         if (res == isl_tab_row_unknown)
2311                                 res = isl_tab_row_pos;
2312                         if (res == isl_tab_row_neg)
2313                                 res = isl_tab_row_any;
2314                 }
2315                 if (sgn < 0) {
2316                         if (res == isl_tab_row_unknown)
2317                                 res = isl_tab_row_neg;
2318                         if (res == isl_tab_row_pos)
2319                                 res = isl_tab_row_any;
2320                 }
2321                 if (res == isl_tab_row_any)
2322                         break;
2323         }
2324         isl_int_clear(tmp);
2325
2326         return res;
2327 }
2328
2329 static enum isl_tab_row_sign context_lex_ineq_sign(struct isl_context *context,
2330                         isl_int *ineq, int strict)
2331 {
2332         struct isl_context_lex *clex = (struct isl_context_lex *)context;
2333         return tab_ineq_sign(clex->tab, ineq, strict);
2334 }
2335
2336 /* Check whether "ineq" can be added to the tableau without rendering
2337  * it infeasible.
2338  */
2339 static int context_lex_test_ineq(struct isl_context *context, isl_int *ineq)
2340 {
2341         struct isl_context_lex *clex = (struct isl_context_lex *)context;
2342         struct isl_tab_undo *snap;
2343         int feasible;
2344
2345         if (!clex->tab)
2346                 return -1;
2347
2348         if (isl_tab_extend_cons(clex->tab, 1) < 0)
2349                 return -1;
2350
2351         snap = isl_tab_snap(clex->tab);
2352         if (isl_tab_push_basis(clex->tab) < 0)
2353                 return -1;
2354         clex->tab = add_lexmin_ineq(clex->tab, ineq);
2355         clex->tab = check_integer_feasible(clex->tab);
2356         if (!clex->tab)
2357                 return -1;
2358         feasible = !clex->tab->empty;
2359         if (isl_tab_rollback(clex->tab, snap) < 0)
2360                 return -1;
2361
2362         return feasible;
2363 }
2364
2365 static int context_lex_get_div(struct isl_context *context, struct isl_tab *tab,
2366                 struct isl_vec *div)
2367 {
2368         return get_div(tab, context, div);
2369 }
2370
2371 /* Add a div specified by "div" to the context tableau and return
2372  * 1 if the div is obviously non-negative.
2373  * context_tab_add_div will always return 1, because all variables
2374  * in a isl_context_lex tableau are non-negative.
2375  * However, if we are using a big parameter in the context, then this only
2376  * reflects the non-negativity of the variable used to _encode_ the
2377  * div, i.e., div' = M + div, so we can't draw any conclusions.
2378  */
2379 static int context_lex_add_div(struct isl_context *context, struct isl_vec *div)
2380 {
2381         struct isl_context_lex *clex = (struct isl_context_lex *)context;
2382         int nonneg;
2383         nonneg = context_tab_add_div(clex->tab, div,
2384                                         context_lex_add_ineq_wrap, context);
2385         if (nonneg < 0)
2386                 return -1;
2387         if (clex->tab->M)
2388                 return 0;
2389         return nonneg;
2390 }
2391
2392 static int context_lex_detect_equalities(struct isl_context *context,
2393                 struct isl_tab *tab)
2394 {
2395         return 0;
2396 }
2397
2398 static int context_lex_best_split(struct isl_context *context,
2399                 struct isl_tab *tab)
2400 {
2401         struct isl_context_lex *clex = (struct isl_context_lex *)context;
2402         struct isl_tab_undo *snap;
2403         int r;
2404
2405         snap = isl_tab_snap(clex->tab);
2406         if (isl_tab_push_basis(clex->tab) < 0)
2407                 return -1;
2408         r = best_split(tab, clex->tab);
2409
2410         if (r >= 0 && isl_tab_rollback(clex->tab, snap) < 0)
2411                 return -1;
2412
2413         return r;
2414 }
2415
2416 static int context_lex_is_empty(struct isl_context *context)
2417 {
2418         struct isl_context_lex *clex = (struct isl_context_lex *)context;
2419         if (!clex->tab)
2420                 return -1;
2421         return clex->tab->empty;
2422 }
2423
2424 static void *context_lex_save(struct isl_context *context)
2425 {
2426         struct isl_context_lex *clex = (struct isl_context_lex *)context;
2427         struct isl_tab_undo *snap;
2428
2429         snap = isl_tab_snap(clex->tab);
2430         if (isl_tab_push_basis(clex->tab) < 0)
2431                 return NULL;
2432         if (isl_tab_save_samples(clex->tab) < 0)
2433                 return NULL;
2434
2435         return snap;
2436 }
2437
2438 static void context_lex_restore(struct isl_context *context, void *save)
2439 {
2440         struct isl_context_lex *clex = (struct isl_context_lex *)context;
2441         if (isl_tab_rollback(clex->tab, (struct isl_tab_undo *)save) < 0) {
2442                 isl_tab_free(clex->tab);
2443                 clex->tab = NULL;
2444         }
2445 }
2446
2447 static void context_lex_discard(void *save)
2448 {
2449 }
2450
2451 static int context_lex_is_ok(struct isl_context *context)
2452 {
2453         struct isl_context_lex *clex = (struct isl_context_lex *)context;
2454         return !!clex->tab;
2455 }
2456
2457 /* For each variable in the context tableau, check if the variable can
2458  * only attain non-negative values.  If so, mark the parameter as non-negative
2459  * in the main tableau.  This allows for a more direct identification of some
2460  * cases of violated constraints.
2461  */
2462 static struct isl_tab *tab_detect_nonnegative_parameters(struct isl_tab *tab,
2463         struct isl_tab *context_tab)
2464 {
2465         int i;
2466         struct isl_tab_undo *snap;
2467         struct isl_vec *ineq = NULL;
2468         struct isl_tab_var *var;
2469         int n;
2470
2471         if (context_tab->n_var == 0)
2472                 return tab;
2473
2474         ineq = isl_vec_alloc(tab->mat->ctx, 1 + context_tab->n_var);
2475         if (!ineq)
2476                 goto error;
2477
2478         if (isl_tab_extend_cons(context_tab, 1) < 0)
2479                 goto error;
2480
2481         snap = isl_tab_snap(context_tab);
2482
2483         n = 0;
2484         isl_seq_clr(ineq->el, ineq->size);
2485         for (i = 0; i < context_tab->n_var; ++i) {
2486                 isl_int_set_si(ineq->el[1 + i], 1);
2487                 if (isl_tab_add_ineq(context_tab, ineq->el) < 0)
2488                         goto error;
2489                 var = &context_tab->con[context_tab->n_con - 1];
2490                 if (!context_tab->empty &&
2491                     !isl_tab_min_at_most_neg_one(context_tab, var)) {
2492                         int j = i;
2493                         if (i >= tab->n_param)
2494                                 j = i - tab->n_param + tab->n_var - tab->n_div;
2495                         tab->var[j].is_nonneg = 1;
2496                         n++;
2497                 }
2498                 isl_int_set_si(ineq->el[1 + i], 0);
2499                 if (isl_tab_rollback(context_tab, snap) < 0)
2500                         goto error;
2501         }
2502
2503         if (context_tab->M && n == context_tab->n_var) {
2504                 context_tab->mat = isl_mat_drop_cols(context_tab->mat, 2, 1);
2505                 context_tab->M = 0;
2506         }
2507
2508         isl_vec_free(ineq);
2509         return tab;
2510 error:
2511         isl_vec_free(ineq);
2512         isl_tab_free(tab);
2513         return NULL;
2514 }
2515
2516 static struct isl_tab *context_lex_detect_nonnegative_parameters(
2517         struct isl_context *context, struct isl_tab *tab)
2518 {
2519         struct isl_context_lex *clex = (struct isl_context_lex *)context;
2520         struct isl_tab_undo *snap;
2521
2522         if (!tab)
2523                 return NULL;
2524
2525         snap = isl_tab_snap(clex->tab);
2526         if (isl_tab_push_basis(clex->tab) < 0)
2527                 goto error;
2528
2529         tab = tab_detect_nonnegative_parameters(tab, clex->tab);
2530
2531         if (isl_tab_rollback(clex->tab, snap) < 0)
2532                 goto error;
2533
2534         return tab;
2535 error:
2536         isl_tab_free(tab);
2537         return NULL;
2538 }
2539
2540 static void context_lex_invalidate(struct isl_context *context)
2541 {
2542         struct isl_context_lex *clex = (struct isl_context_lex *)context;
2543         isl_tab_free(clex->tab);
2544         clex->tab = NULL;
2545 }
2546
2547 static void context_lex_free(struct isl_context *context)
2548 {
2549         struct isl_context_lex *clex = (struct isl_context_lex *)context;
2550         isl_tab_free(clex->tab);
2551         free(clex);
2552 }
2553
2554 struct isl_context_op isl_context_lex_op = {
2555         context_lex_detect_nonnegative_parameters,
2556         context_lex_peek_basic_set,
2557         context_lex_peek_tab,
2558         context_lex_add_eq,
2559         context_lex_add_ineq,
2560         context_lex_ineq_sign,
2561         context_lex_test_ineq,
2562         context_lex_get_div,
2563         context_lex_add_div,
2564         context_lex_detect_equalities,
2565         context_lex_best_split,
2566         context_lex_is_empty,
2567         context_lex_is_ok,
2568         context_lex_save,
2569         context_lex_restore,
2570         context_lex_discard,
2571         context_lex_invalidate,
2572         context_lex_free,
2573 };
2574
2575 static struct isl_tab *context_tab_for_lexmin(struct isl_basic_set *bset)
2576 {
2577         struct isl_tab *tab;
2578
2579         if (!bset)
2580                 return NULL;
2581         tab = tab_for_lexmin((struct isl_basic_map *)bset, NULL, 1, 0);
2582         if (!tab)
2583                 goto error;
2584         if (isl_tab_track_bset(tab, bset) < 0)
2585                 goto error;
2586         tab = isl_tab_init_samples(tab);
2587         return tab;
2588 error:
2589         isl_basic_set_free(bset);
2590         return NULL;
2591 }
2592
2593 static struct isl_context *isl_context_lex_alloc(struct isl_basic_set *dom)
2594 {
2595         struct isl_context_lex *clex;
2596
2597         if (!dom)
2598                 return NULL;
2599
2600         clex = isl_alloc_type(dom->ctx, struct isl_context_lex);
2601         if (!clex)
2602                 return NULL;
2603
2604         clex->context.op = &isl_context_lex_op;
2605
2606         clex->tab = context_tab_for_lexmin(isl_basic_set_copy(dom));
2607         if (restore_lexmin(clex->tab) < 0)
2608                 goto error;
2609         clex->tab = check_integer_feasible(clex->tab);
2610         if (!clex->tab)
2611                 goto error;
2612
2613         return &clex->context;
2614 error:
2615         clex->context.op->free(&clex->context);
2616         return NULL;
2617 }
2618
2619 /* Representation of the context when using generalized basis reduction.
2620  *
2621  * "shifted" contains the offsets of the unit hypercubes that lie inside the
2622  * context.  Any rational point in "shifted" can therefore be rounded
2623  * up to an integer point in the context.
2624  * If the context is constrained by any equality, then "shifted" is not used
2625  * as it would be empty.
2626  */
2627 struct isl_context_gbr {
2628         struct isl_context context;
2629         struct isl_tab *tab;
2630         struct isl_tab *shifted;
2631         struct isl_tab *cone;
2632 };
2633
2634 static struct isl_tab *context_gbr_detect_nonnegative_parameters(
2635         struct isl_context *context, struct isl_tab *tab)
2636 {
2637         struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
2638         if (!tab)
2639                 return NULL;
2640         return tab_detect_nonnegative_parameters(tab, cgbr->tab);
2641 }
2642
2643 static struct isl_basic_set *context_gbr_peek_basic_set(
2644         struct isl_context *context)
2645 {
2646         struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
2647         if (!cgbr->tab)
2648                 return NULL;
2649         return isl_tab_peek_bset(cgbr->tab);
2650 }
2651
2652 static struct isl_tab *context_gbr_peek_tab(struct isl_context *context)
2653 {
2654         struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
2655         return cgbr->tab;
2656 }
2657
2658 /* Initialize the "shifted" tableau of the context, which
2659  * contains the constraints of the original tableau shifted
2660  * by the sum of all negative coefficients.  This ensures
2661  * that any rational point in the shifted tableau can
2662  * be rounded up to yield an integer point in the original tableau.
2663  */
2664 static void gbr_init_shifted(struct isl_context_gbr *cgbr)
2665 {
2666         int i, j;
2667         struct isl_vec *cst;
2668         struct isl_basic_set *bset = isl_tab_peek_bset(cgbr->tab);
2669         unsigned dim = isl_basic_set_total_dim(bset);
2670
2671         cst = isl_vec_alloc(cgbr->tab->mat->ctx, bset->n_ineq);
2672         if (!cst)
2673                 return;
2674
2675         for (i = 0; i < bset->n_ineq; ++i) {
2676                 isl_int_set(cst->el[i], bset->ineq[i][0]);
2677                 for (j = 0; j < dim; ++j) {
2678                         if (!isl_int_is_neg(bset->ineq[i][1 + j]))
2679                                 continue;
2680                         isl_int_add(bset->ineq[i][0], bset->ineq[i][0],
2681                                     bset->ineq[i][1 + j]);
2682                 }
2683         }
2684
2685         cgbr->shifted = isl_tab_from_basic_set(bset, 0);
2686
2687         for (i = 0; i < bset->n_ineq; ++i)
2688                 isl_int_set(bset->ineq[i][0], cst->el[i]);
2689
2690         isl_vec_free(cst);
2691 }
2692
2693 /* Check if the shifted tableau is non-empty, and if so
2694  * use the sample point to construct an integer point
2695  * of the context tableau.
2696  */
2697 static struct isl_vec *gbr_get_shifted_sample(struct isl_context_gbr *cgbr)
2698 {
2699         struct isl_vec *sample;
2700
2701         if (!cgbr->shifted)
2702                 gbr_init_shifted(cgbr);
2703         if (!cgbr->shifted)
2704                 return NULL;
2705         if (cgbr->shifted->empty)
2706                 return isl_vec_alloc(cgbr->tab->mat->ctx, 0);
2707
2708         sample = isl_tab_get_sample_value(cgbr->shifted);
2709         sample = isl_vec_ceil(sample);
2710
2711         return sample;
2712 }
2713
2714 static struct isl_basic_set *drop_constant_terms(struct isl_basic_set *bset)
2715 {
2716         int i;
2717
2718         if (!bset)
2719                 return NULL;
2720
2721         for (i = 0; i < bset->n_eq; ++i)
2722                 isl_int_set_si(bset->eq[i][0], 0);
2723
2724         for (i = 0; i < bset->n_ineq; ++i)
2725                 isl_int_set_si(bset->ineq[i][0], 0);
2726
2727         return bset;
2728 }
2729
2730 static int use_shifted(struct isl_context_gbr *cgbr)
2731 {
2732         return cgbr->tab->bmap->n_eq == 0 && cgbr->tab->bmap->n_div == 0;
2733 }
2734
2735 static struct isl_vec *gbr_get_sample(struct isl_context_gbr *cgbr)
2736 {
2737         struct isl_basic_set *bset;
2738         struct isl_basic_set *cone;
2739
2740         if (isl_tab_sample_is_integer(cgbr->tab))
2741                 return isl_tab_get_sample_value(cgbr->tab);
2742
2743         if (use_shifted(cgbr)) {
2744                 struct isl_vec *sample;
2745
2746                 sample = gbr_get_shifted_sample(cgbr);
2747                 if (!sample || sample->size > 0)
2748                         return sample;
2749
2750                 isl_vec_free(sample);
2751         }
2752
2753         if (!cgbr->cone) {
2754                 bset = isl_tab_peek_bset(cgbr->tab);
2755                 cgbr->cone = isl_tab_from_recession_cone(bset, 0);
2756                 if (!cgbr->cone)
2757                         return NULL;
2758                 if (isl_tab_track_bset(cgbr->cone,
2759                                         isl_basic_set_copy(bset)) < 0)
2760                         return NULL;
2761         }
2762         if (isl_tab_detect_implicit_equalities(cgbr->cone) < 0)
2763                 return NULL;
2764
2765         if (cgbr->cone->n_dead == cgbr->cone->n_col) {
2766                 struct isl_vec *sample;
2767                 struct isl_tab_undo *snap;
2768
2769                 if (cgbr->tab->basis) {
2770                         if (cgbr->tab->basis->n_col != 1 + cgbr->tab->n_var) {
2771                                 isl_mat_free(cgbr->tab->basis);
2772                                 cgbr->tab->basis = NULL;
2773                         }
2774                         cgbr->tab->n_zero = 0;
2775                         cgbr->tab->n_unbounded = 0;
2776                 }
2777
2778                 snap = isl_tab_snap(cgbr->tab);
2779
2780                 sample = isl_tab_sample(cgbr->tab);
2781
2782                 if (isl_tab_rollback(cgbr->tab, snap) < 0) {
2783                         isl_vec_free(sample);
2784                         return NULL;
2785                 }
2786
2787                 return sample;
2788         }
2789
2790         cone = isl_basic_set_dup(isl_tab_peek_bset(cgbr->cone));
2791         cone = drop_constant_terms(cone);
2792         cone = isl_basic_set_update_from_tab(cone, cgbr->cone);
2793         cone = isl_basic_set_underlying_set(cone);
2794         cone = isl_basic_set_gauss(cone, NULL);
2795
2796         bset = isl_basic_set_dup(isl_tab_peek_bset(cgbr->tab));
2797         bset = isl_basic_set_update_from_tab(bset, cgbr->tab);
2798         bset = isl_basic_set_underlying_set(bset);
2799         bset = isl_basic_set_gauss(bset, NULL);
2800
2801         return isl_basic_set_sample_with_cone(bset, cone);
2802 }
2803
2804 static void check_gbr_integer_feasible(struct isl_context_gbr *cgbr)
2805 {
2806         struct isl_vec *sample;
2807
2808         if (!cgbr->tab)
2809                 return;
2810
2811         if (cgbr->tab->empty)
2812                 return;
2813
2814         sample = gbr_get_sample(cgbr);
2815         if (!sample)
2816                 goto error;
2817
2818         if (sample->size == 0) {
2819                 isl_vec_free(sample);
2820                 if (isl_tab_mark_empty(cgbr->tab) < 0)
2821                         goto error;
2822                 return;
2823         }
2824
2825         cgbr->tab = isl_tab_add_sample(cgbr->tab, sample);
2826
2827         return;
2828 error:
2829         isl_tab_free(cgbr->tab);
2830         cgbr->tab = NULL;
2831 }
2832
2833 static struct isl_tab *add_gbr_eq(struct isl_tab *tab, isl_int *eq)
2834 {
2835         if (!tab)
2836                 return NULL;
2837
2838         if (isl_tab_extend_cons(tab, 2) < 0)
2839                 goto error;
2840
2841         if (isl_tab_add_eq(tab, eq) < 0)
2842                 goto error;
2843
2844         return tab;
2845 error:
2846         isl_tab_free(tab);
2847         return NULL;
2848 }
2849
2850 /* Add the equality described by "eq" to the context.
2851  * If "check" is set, then we check if the context is empty after
2852  * adding the equality.
2853  * If "update" is set, then we check if the samples are still valid.
2854  *
2855  * We do not explicitly add shifted copies of the equality to
2856  * cgbr->shifted since they would conflict with each other.
2857  * Instead, we directly mark cgbr->shifted empty.
2858  */
2859 static void context_gbr_add_eq(struct isl_context *context, isl_int *eq,
2860                 int check, int update)
2861 {
2862         struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
2863
2864         cgbr->tab = add_gbr_eq(cgbr->tab, eq);
2865
2866         if (cgbr->shifted && !cgbr->shifted->empty && use_shifted(cgbr)) {
2867                 if (isl_tab_mark_empty(cgbr->shifted) < 0)
2868                         goto error;
2869         }
2870
2871         if (cgbr->cone && cgbr->cone->n_col != cgbr->cone->n_dead) {
2872                 if (isl_tab_extend_cons(cgbr->cone, 2) < 0)
2873                         goto error;
2874                 if (isl_tab_add_eq(cgbr->cone, eq) < 0)
2875                         goto error;
2876         }
2877
2878         if (check) {
2879                 int v = tab_has_valid_sample(cgbr->tab, eq, 1);
2880                 if (v < 0)
2881                         goto error;
2882                 if (!v)
2883                         check_gbr_integer_feasible(cgbr);
2884         }
2885         if (update)
2886                 cgbr->tab = check_samples(cgbr->tab, eq, 1);
2887         return;
2888 error:
2889         isl_tab_free(cgbr->tab);
2890         cgbr->tab = NULL;
2891 }
2892
2893 static void add_gbr_ineq(struct isl_context_gbr *cgbr, isl_int *ineq)
2894 {
2895         if (!cgbr->tab)
2896                 return;
2897
2898         if (isl_tab_extend_cons(cgbr->tab, 1) < 0)
2899                 goto error;
2900
2901         if (isl_tab_add_ineq(cgbr->tab, ineq) < 0)
2902                 goto error;
2903
2904         if (cgbr->shifted && !cgbr->shifted->empty && use_shifted(cgbr)) {
2905                 int i;
2906                 unsigned dim;
2907                 dim = isl_basic_map_total_dim(cgbr->tab->bmap);
2908
2909                 if (isl_tab_extend_cons(cgbr->shifted, 1) < 0)
2910                         goto error;
2911
2912                 for (i = 0; i < dim; ++i) {
2913                         if (!isl_int_is_neg(ineq[1 + i]))
2914                                 continue;
2915                         isl_int_add(ineq[0], ineq[0], ineq[1 + i]);
2916                 }
2917
2918                 if (isl_tab_add_ineq(cgbr->shifted, ineq) < 0)
2919                         goto error;
2920
2921                 for (i = 0; i < dim; ++i) {
2922                         if (!isl_int_is_neg(ineq[1 + i]))
2923                                 continue;
2924                         isl_int_sub(ineq[0], ineq[0], ineq[1 + i]);
2925                 }
2926         }
2927
2928         if (cgbr->cone && cgbr->cone->n_col != cgbr->cone->n_dead) {
2929                 if (isl_tab_extend_cons(cgbr->cone, 1) < 0)
2930                         goto error;
2931                 if (isl_tab_add_ineq(cgbr->cone, ineq) < 0)
2932                         goto error;
2933         }
2934
2935         return;
2936 error:
2937         isl_tab_free(cgbr->tab);
2938         cgbr->tab = NULL;
2939 }
2940
2941 static void context_gbr_add_ineq(struct isl_context *context, isl_int *ineq,
2942                 int check, int update)
2943 {
2944         struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
2945
2946         add_gbr_ineq(cgbr, ineq);
2947         if (!cgbr->tab)
2948                 return;
2949
2950         if (check) {
2951                 int v = tab_has_valid_sample(cgbr->tab, ineq, 0);
2952                 if (v < 0)
2953                         goto error;
2954                 if (!v)
2955                         check_gbr_integer_feasible(cgbr);
2956         }
2957         if (update)
2958                 cgbr->tab = check_samples(cgbr->tab, ineq, 0);
2959         return;
2960 error:
2961         isl_tab_free(cgbr->tab);
2962         cgbr->tab = NULL;
2963 }
2964
2965 static int context_gbr_add_ineq_wrap(void *user, isl_int *ineq)
2966 {
2967         struct isl_context *context = (struct isl_context *)user;
2968         context_gbr_add_ineq(context, ineq, 0, 0);
2969         return context->op->is_ok(context) ? 0 : -1;
2970 }
2971
2972 static enum isl_tab_row_sign context_gbr_ineq_sign(struct isl_context *context,
2973                         isl_int *ineq, int strict)
2974 {
2975         struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
2976         return tab_ineq_sign(cgbr->tab, ineq, strict);
2977 }
2978
2979 /* Check whether "ineq" can be added to the tableau without rendering
2980  * it infeasible.
2981  */
2982 static int context_gbr_test_ineq(struct isl_context *context, isl_int *ineq)
2983 {
2984         struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
2985         struct isl_tab_undo *snap;
2986         struct isl_tab_undo *shifted_snap = NULL;
2987         struct isl_tab_undo *cone_snap = NULL;
2988         int feasible;
2989
2990         if (!cgbr->tab)
2991                 return -1;
2992
2993         if (isl_tab_extend_cons(cgbr->tab, 1) < 0)
2994                 return -1;
2995
2996         snap = isl_tab_snap(cgbr->tab);
2997         if (cgbr->shifted)
2998                 shifted_snap = isl_tab_snap(cgbr->shifted);
2999         if (cgbr->cone)
3000                 cone_snap = isl_tab_snap(cgbr->cone);
3001         add_gbr_ineq(cgbr, ineq);
3002         check_gbr_integer_feasible(cgbr);
3003         if (!cgbr->tab)
3004                 return -1;
3005         feasible = !cgbr->tab->empty;
3006         if (isl_tab_rollback(cgbr->tab, snap) < 0)
3007                 return -1;
3008         if (shifted_snap) {
3009                 if (isl_tab_rollback(cgbr->shifted, shifted_snap))
3010                         return -1;
3011         } else if (cgbr->shifted) {
3012                 isl_tab_free(cgbr->shifted);
3013                 cgbr->shifted = NULL;
3014         }
3015         if (cone_snap) {
3016                 if (isl_tab_rollback(cgbr->cone, cone_snap))
3017                         return -1;
3018         } else if (cgbr->cone) {
3019                 isl_tab_free(cgbr->cone);
3020                 cgbr->cone = NULL;
3021         }
3022
3023         return feasible;
3024 }
3025
3026 /* Return the column of the last of the variables associated to
3027  * a column that has a non-zero coefficient.
3028  * This function is called in a context where only coefficients
3029  * of parameters or divs can be non-zero.
3030  */
3031 static int last_non_zero_var_col(struct isl_tab *tab, isl_int *p)
3032 {
3033         int i;
3034         int col;
3035
3036         if (tab->n_var == 0)
3037                 return -1;
3038
3039         for (i = tab->n_var - 1; i >= 0; --i) {
3040                 if (i >= tab->n_param && i < tab->n_var - tab->n_div)
3041                         continue;
3042                 if (tab->var[i].is_row)
3043                         continue;
3044                 col = tab->var[i].index;
3045                 if (!isl_int_is_zero(p[col]))
3046                         return col;
3047         }
3048
3049         return -1;
3050 }
3051
3052 /* Look through all the recently added equalities in the context
3053  * to see if we can propagate any of them to the main tableau.
3054  *
3055  * The newly added equalities in the context are encoded as pairs
3056  * of inequalities starting at inequality "first".
3057  *
3058  * We tentatively add each of these equalities to the main tableau
3059  * and if this happens to result in a row with a final coefficient
3060  * that is one or negative one, we use it to kill a column
3061  * in the main tableau.  Otherwise, we discard the tentatively
3062  * added row.
3063  */
3064 static void propagate_equalities(struct isl_context_gbr *cgbr,
3065         struct isl_tab *tab, unsigned first)
3066 {
3067         int i;
3068         struct isl_vec *eq = NULL;
3069
3070         eq = isl_vec_alloc(tab->mat->ctx, 1 + tab->n_var);
3071         if (!eq)
3072                 goto error;
3073
3074         if (isl_tab_extend_cons(tab, (cgbr->tab->bmap->n_ineq - first)/2) < 0)
3075                 goto error;
3076
3077         isl_seq_clr(eq->el + 1 + tab->n_param,
3078                     tab->n_var - tab->n_param - tab->n_div);
3079         for (i = first; i < cgbr->tab->bmap->n_ineq; i += 2) {
3080                 int j;
3081                 int r;
3082                 struct isl_tab_undo *snap;
3083                 snap = isl_tab_snap(tab);
3084
3085                 isl_seq_cpy(eq->el, cgbr->tab->bmap->ineq[i], 1 + tab->n_param);
3086                 isl_seq_cpy(eq->el + 1 + tab->n_var - tab->n_div,
3087                             cgbr->tab->bmap->ineq[i] + 1 + tab->n_param,
3088                             tab->n_div);
3089
3090                 r = isl_tab_add_row(tab, eq->el);
3091                 if (r < 0)
3092                         goto error;
3093                 r = tab->con[r].index;
3094                 j = last_non_zero_var_col(tab, tab->mat->row[r] + 2 + tab->M);
3095                 if (j < 0 || j < tab->n_dead ||
3096                     !isl_int_is_one(tab->mat->row[r][0]) ||
3097                     (!isl_int_is_one(tab->mat->row[r][2 + tab->M + j]) &&
3098                      !isl_int_is_negone(tab->mat->row[r][2 + tab->M + j]))) {
3099                         if (isl_tab_rollback(tab, snap) < 0)
3100                                 goto error;
3101                         continue;
3102                 }
3103                 if (isl_tab_pivot(tab, r, j) < 0)
3104                         goto error;
3105                 if (isl_tab_kill_col(tab, j) < 0)
3106                         goto error;
3107
3108                 if (restore_lexmin(tab) < 0)
3109                         goto error;
3110         }
3111
3112         isl_vec_free(eq);
3113
3114         return;
3115 error:
3116         isl_vec_free(eq);
3117         isl_tab_free(cgbr->tab);
3118         cgbr->tab = NULL;
3119 }
3120
3121 static int context_gbr_detect_equalities(struct isl_context *context,
3122         struct isl_tab *tab)
3123 {
3124         struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
3125         struct isl_ctx *ctx;
3126         unsigned n_ineq;
3127
3128         ctx = cgbr->tab->mat->ctx;
3129
3130         if (!cgbr->cone) {
3131                 struct isl_basic_set *bset = isl_tab_peek_bset(cgbr->tab);
3132                 cgbr->cone = isl_tab_from_recession_cone(bset, 0);
3133                 if (!cgbr->cone)
3134                         goto error;
3135                 if (isl_tab_track_bset(cgbr->cone,
3136                                         isl_basic_set_copy(bset)) < 0)
3137                         goto error;
3138         }
3139         if (isl_tab_detect_implicit_equalities(cgbr->cone) < 0)
3140                 goto error;
3141
3142         n_ineq = cgbr->tab->bmap->n_ineq;
3143         cgbr->tab = isl_tab_detect_equalities(cgbr->tab, cgbr->cone);
3144         if (!cgbr->tab)
3145                 return -1;
3146         if (cgbr->tab->bmap->n_ineq > n_ineq)
3147                 propagate_equalities(cgbr, tab, n_ineq);
3148
3149         return 0;
3150 error:
3151         isl_tab_free(cgbr->tab);
3152         cgbr->tab = NULL;
3153         return -1;
3154 }
3155
3156 static int context_gbr_get_div(struct isl_context *context, struct isl_tab *tab,
3157                 struct isl_vec *div)
3158 {
3159         return get_div(tab, context, div);
3160 }
3161
3162 static int context_gbr_add_div(struct isl_context *context, struct isl_vec *div)
3163 {
3164         struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
3165         if (cgbr->cone) {
3166                 int k;
3167
3168                 if (isl_tab_extend_cons(cgbr->cone, 3) < 0)
3169                         return -1;
3170                 if (isl_tab_extend_vars(cgbr->cone, 1) < 0)
3171                         return -1;
3172                 if (isl_tab_allocate_var(cgbr->cone) <0)
3173                         return -1;
3174
3175                 cgbr->cone->bmap = isl_basic_map_extend_space(cgbr->cone->bmap,
3176                         isl_basic_map_get_space(cgbr->cone->bmap), 1, 0, 2);
3177                 k = isl_basic_map_alloc_div(cgbr->cone->bmap);
3178                 if (k < 0)
3179                         return -1;
3180                 isl_seq_cpy(cgbr->cone->bmap->div[k], div->el, div->size);
3181                 if (isl_tab_push(cgbr->cone, isl_tab_undo_bmap_div) < 0)
3182                         return -1;
3183         }
3184         return context_tab_add_div(cgbr->tab, div,
3185                                         context_gbr_add_ineq_wrap, context);
3186 }
3187
3188 static int context_gbr_best_split(struct isl_context *context,
3189                 struct isl_tab *tab)
3190 {
3191         struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
3192         struct isl_tab_undo *snap;
3193         int r;
3194
3195         snap = isl_tab_snap(cgbr->tab);
3196         r = best_split(tab, cgbr->tab);
3197
3198         if (r >= 0 && isl_tab_rollback(cgbr->tab, snap) < 0)
3199                 return -1;
3200
3201         return r;
3202 }
3203
3204 static int context_gbr_is_empty(struct isl_context *context)
3205 {
3206         struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
3207         if (!cgbr->tab)
3208                 return -1;
3209         return cgbr->tab->empty;
3210 }
3211
3212 struct isl_gbr_tab_undo {
3213         struct isl_tab_undo *tab_snap;
3214         struct isl_tab_undo *shifted_snap;
3215         struct isl_tab_undo *cone_snap;
3216 };
3217
3218 static void *context_gbr_save(struct isl_context *context)
3219 {
3220         struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
3221         struct isl_gbr_tab_undo *snap;
3222
3223         snap = isl_alloc_type(cgbr->tab->mat->ctx, struct isl_gbr_tab_undo);
3224         if (!snap)
3225                 return NULL;
3226
3227         snap->tab_snap = isl_tab_snap(cgbr->tab);
3228         if (isl_tab_save_samples(cgbr->tab) < 0)
3229                 goto error;
3230
3231         if (cgbr->shifted)
3232                 snap->shifted_snap = isl_tab_snap(cgbr->shifted);
3233         else
3234                 snap->shifted_snap = NULL;
3235
3236         if (cgbr->cone)
3237                 snap->cone_snap = isl_tab_snap(cgbr->cone);
3238         else
3239                 snap->cone_snap = NULL;
3240
3241         return snap;
3242 error:
3243         free(snap);
3244         return NULL;
3245 }
3246
3247 static void context_gbr_restore(struct isl_context *context, void *save)
3248 {
3249         struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
3250         struct isl_gbr_tab_undo *snap = (struct isl_gbr_tab_undo *)save;
3251         if (!snap)
3252                 goto error;
3253         if (isl_tab_rollback(cgbr->tab, snap->tab_snap) < 0) {
3254                 isl_tab_free(cgbr->tab);
3255                 cgbr->tab = NULL;
3256         }
3257
3258         if (snap->shifted_snap) {
3259                 if (isl_tab_rollback(cgbr->shifted, snap->shifted_snap) < 0)
3260                         goto error;
3261         } else if (cgbr->shifted) {
3262                 isl_tab_free(cgbr->shifted);
3263                 cgbr->shifted = NULL;
3264         }
3265
3266         if (snap->cone_snap) {
3267                 if (isl_tab_rollback(cgbr->cone, snap->cone_snap) < 0)
3268                         goto error;
3269         } else if (cgbr->cone) {
3270                 isl_tab_free(cgbr->cone);
3271                 cgbr->cone = NULL;
3272         }
3273
3274         free(snap);
3275
3276         return;
3277 error:
3278         free(snap);
3279         isl_tab_free(cgbr->tab);
3280         cgbr->tab = NULL;
3281 }
3282
3283 static void context_gbr_discard(void *save)
3284 {
3285         struct isl_gbr_tab_undo *snap = (struct isl_gbr_tab_undo *)save;
3286         free(snap);
3287 }
3288
3289 static int context_gbr_is_ok(struct isl_context *context)
3290 {
3291         struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
3292         return !!cgbr->tab;
3293 }
3294
3295 static void context_gbr_invalidate(struct isl_context *context)
3296 {
3297         struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
3298         isl_tab_free(cgbr->tab);
3299         cgbr->tab = NULL;
3300 }
3301
3302 static void context_gbr_free(struct isl_context *context)
3303 {
3304         struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
3305         isl_tab_free(cgbr->tab);
3306         isl_tab_free(cgbr->shifted);
3307         isl_tab_free(cgbr->cone);
3308         free(cgbr);
3309 }
3310
3311 struct isl_context_op isl_context_gbr_op = {
3312         context_gbr_detect_nonnegative_parameters,
3313         context_gbr_peek_basic_set,
3314         context_gbr_peek_tab,
3315         context_gbr_add_eq,
3316         context_gbr_add_ineq,
3317         context_gbr_ineq_sign,
3318         context_gbr_test_ineq,
3319         context_gbr_get_div,
3320         context_gbr_add_div,
3321         context_gbr_detect_equalities,
3322         context_gbr_best_split,
3323         context_gbr_is_empty,
3324         context_gbr_is_ok,
3325         context_gbr_save,
3326         context_gbr_restore,
3327         context_gbr_discard,
3328         context_gbr_invalidate,
3329         context_gbr_free,
3330 };
3331
3332 static struct isl_context *isl_context_gbr_alloc(struct isl_basic_set *dom)
3333 {
3334         struct isl_context_gbr *cgbr;
3335
3336         if (!dom)
3337                 return NULL;
3338
3339         cgbr = isl_calloc_type(dom->ctx, struct isl_context_gbr);
3340         if (!cgbr)
3341                 return NULL;
3342
3343         cgbr->context.op = &isl_context_gbr_op;
3344
3345         cgbr->shifted = NULL;
3346         cgbr->cone = NULL;
3347         cgbr->tab = isl_tab_from_basic_set(dom, 1);
3348         cgbr->tab = isl_tab_init_samples(cgbr->tab);
3349         if (!cgbr->tab)
3350                 goto error;
3351         check_gbr_integer_feasible(cgbr);
3352
3353         return &cgbr->context;
3354 error:
3355         cgbr->context.op->free(&cgbr->context);
3356         return NULL;
3357 }
3358
3359 static struct isl_context *isl_context_alloc(struct isl_basic_set *dom)
3360 {
3361         if (!dom)
3362                 return NULL;
3363
3364         if (dom->ctx->opt->context == ISL_CONTEXT_LEXMIN)
3365                 return isl_context_lex_alloc(dom);
3366         else
3367                 return isl_context_gbr_alloc(dom);
3368 }
3369
3370 /* Construct an isl_sol_map structure for accumulating the solution.
3371  * If track_empty is set, then we also keep track of the parts
3372  * of the context where there is no solution.
3373  * If max is set, then we are solving a maximization, rather than
3374  * a minimization problem, which means that the variables in the
3375  * tableau have value "M - x" rather than "M + x".
3376  */
3377 static struct isl_sol *sol_map_init(struct isl_basic_map *bmap,
3378         struct isl_basic_set *dom, int track_empty, int max)
3379 {
3380         struct isl_sol_map *sol_map = NULL;
3381
3382         if (!bmap)
3383                 goto error;
3384
3385         sol_map = isl_calloc_type(bmap->ctx, struct isl_sol_map);
3386         if (!sol_map)
3387                 goto error;
3388
3389         sol_map->sol.rational = ISL_F_ISSET(bmap, ISL_BASIC_MAP_RATIONAL);
3390         sol_map->sol.dec_level.callback.run = &sol_dec_level_wrap;
3391         sol_map->sol.dec_level.sol = &sol_map->sol;
3392         sol_map->sol.max = max;
3393         sol_map->sol.n_out = isl_basic_map_dim(bmap, isl_dim_out);
3394         sol_map->sol.add = &sol_map_add_wrap;
3395         sol_map->sol.add_empty = track_empty ? &sol_map_add_empty_wrap : NULL;
3396         sol_map->sol.free = &sol_map_free_wrap;
3397         sol_map->map = isl_map_alloc_space(isl_basic_map_get_space(bmap), 1,
3398                                             ISL_MAP_DISJOINT);
3399         if (!sol_map->map)
3400                 goto error;
3401
3402         sol_map->sol.context = isl_context_alloc(dom);
3403         if (!sol_map->sol.context)
3404                 goto error;
3405
3406         if (track_empty) {
3407                 sol_map->empty = isl_set_alloc_space(isl_basic_set_get_space(dom),
3408                                                         1, ISL_SET_DISJOINT);
3409                 if (!sol_map->empty)
3410                         goto error;
3411         }
3412
3413         isl_basic_set_free(dom);
3414         return &sol_map->sol;
3415 error:
3416         isl_basic_set_free(dom);
3417         sol_map_free(sol_map);
3418         return NULL;
3419 }
3420
3421 /* Check whether all coefficients of (non-parameter) variables
3422  * are non-positive, meaning that no pivots can be performed on the row.
3423  */
3424 static int is_critical(struct isl_tab *tab, int row)
3425 {
3426         int j;
3427         unsigned off = 2 + tab->M;
3428
3429         for (j = tab->n_dead; j < tab->n_col; ++j) {
3430                 if (tab->col_var[j] >= 0 &&
3431                     (tab->col_var[j] < tab->n_param  ||
3432                     tab->col_var[j] >= tab->n_var - tab->n_div))
3433                         continue;
3434
3435                 if (isl_int_is_pos(tab->mat->row[row][off + j]))
3436                         return 0;
3437         }
3438
3439         return 1;
3440 }
3441
3442 /* Check whether the inequality represented by vec is strict over the integers,
3443  * i.e., there are no integer values satisfying the constraint with
3444  * equality.  This happens if the gcd of the coefficients is not a divisor
3445  * of the constant term.  If so, scale the constraint down by the gcd
3446  * of the coefficients.
3447  */
3448 static int is_strict(struct isl_vec *vec)
3449 {
3450         isl_int gcd;
3451         int strict = 0;
3452
3453         isl_int_init(gcd);
3454         isl_seq_gcd(vec->el + 1, vec->size - 1, &gcd);
3455         if (!isl_int_is_one(gcd)) {
3456                 strict = !isl_int_is_divisible_by(vec->el[0], gcd);
3457                 isl_int_fdiv_q(vec->el[0], vec->el[0], gcd);
3458                 isl_seq_scale_down(vec->el + 1, vec->el + 1, gcd, vec->size-1);
3459         }
3460         isl_int_clear(gcd);
3461
3462         return strict;
3463 }
3464
3465 /* Determine the sign of the given row of the main tableau.
3466  * The result is one of
3467  *      isl_tab_row_pos: always non-negative; no pivot needed
3468  *      isl_tab_row_neg: always non-positive; pivot
3469  *      isl_tab_row_any: can be both positive and negative; split
3470  *
3471  * We first handle some simple cases
3472  *      - the row sign may be known already
3473  *      - the row may be obviously non-negative
3474  *      - the parametric constant may be equal to that of another row
3475  *        for which we know the sign.  This sign will be either "pos" or
3476  *        "any".  If it had been "neg" then we would have pivoted before.
3477  *
3478  * If none of these cases hold, we check the value of the row for each
3479  * of the currently active samples.  Based on the signs of these values
3480  * we make an initial determination of the sign of the row.
3481  *
3482  *      all zero                        ->      unk(nown)
3483  *      all non-negative                ->      pos
3484  *      all non-positive                ->      neg
3485  *      both negative and positive      ->      all
3486  *
3487  * If we end up with "all", we are done.
3488  * Otherwise, we perform a check for positive and/or negative
3489  * values as follows.
3490  *
3491  *      samples        neg             unk             pos
3492  *      <0 ?                        Y        N      Y        N
3493  *                                          pos    any      pos
3494  *      >0 ?         Y      N    Y     N
3495  *                  any    neg  any   neg
3496  *
3497  * There is no special sign for "zero", because we can usually treat zero
3498  * as either non-negative or non-positive, whatever works out best.
3499  * However, if the row is "critical", meaning that pivoting is impossible
3500  * then we don't want to limp zero with the non-positive case, because
3501  * then we we would lose the solution for those values of the parameters
3502  * where the value of the row is zero.  Instead, we treat 0 as non-negative
3503  * ensuring a split if the row can attain both zero and negative values.
3504  * The same happens when the original constraint was one that could not
3505  * be satisfied with equality by any integer values of the parameters.
3506  * In this case, we normalize the constraint, but then a value of zero
3507  * for the normalized constraint is actually a positive value for the
3508  * original constraint, so again we need to treat zero as non-negative.
3509  * In both these cases, we have the following decision tree instead:
3510  *
3511  *      all non-negative                ->      pos
3512  *      all negative                    ->      neg
3513  *      both negative and non-negative  ->      all
3514  *
3515  *      samples        neg                             pos
3516  *      <0 ?                                        Y        N
3517  *                                                 any      pos
3518  *      >=0 ?        Y      N
3519  *                  any    neg
3520  */
3521 static enum isl_tab_row_sign row_sign(struct isl_tab *tab,
3522         struct isl_sol *sol, int row)
3523 {
3524         struct isl_vec *ineq = NULL;
3525         enum isl_tab_row_sign res = isl_tab_row_unknown;
3526         int critical;
3527         int strict;
3528         int row2;
3529
3530         if (tab->row_sign[row] != isl_tab_row_unknown)
3531                 return tab->row_sign[row];
3532         if (is_obviously_nonneg(tab, row))
3533                 return isl_tab_row_pos;
3534         for (row2 = tab->n_redundant; row2 < tab->n_row; ++row2) {
3535                 if (tab->row_sign[row2] == isl_tab_row_unknown)
3536                         continue;
3537                 if (identical_parameter_line(tab, row, row2))
3538                         return tab->row_sign[row2];
3539         }
3540
3541         critical = is_critical(tab, row);
3542
3543         ineq = get_row_parameter_ineq(tab, row);
3544         if (!ineq)
3545                 goto error;
3546
3547         strict = is_strict(ineq);
3548
3549         res = sol->context->op->ineq_sign(sol->context, ineq->el,
3550                                           critical || strict);
3551
3552         if (res == isl_tab_row_unknown || res == isl_tab_row_pos) {
3553                 /* test for negative values */
3554                 int feasible;
3555                 isl_seq_neg(ineq->el, ineq->el, ineq->size);
3556                 isl_int_sub_ui(ineq->el[0], ineq->el[0], 1);
3557
3558                 feasible = sol->context->op->test_ineq(sol->context, ineq->el);
3559                 if (feasible < 0)
3560                         goto error;
3561                 if (!feasible)
3562                         res = isl_tab_row_pos;
3563                 else
3564                         res = (res == isl_tab_row_unknown) ? isl_tab_row_neg
3565                                                            : isl_tab_row_any;
3566                 if (res == isl_tab_row_neg) {
3567                         isl_seq_neg(ineq->el, ineq->el, ineq->size);
3568                         isl_int_sub_ui(ineq->el[0], ineq->el[0], 1);
3569                 }
3570         }
3571
3572         if (res == isl_tab_row_neg) {
3573                 /* test for positive values */
3574                 int feasible;
3575                 if (!critical && !strict)
3576                         isl_int_sub_ui(ineq->el[0], ineq->el[0], 1);
3577
3578                 feasible = sol->context->op->test_ineq(sol->context, ineq->el);
3579                 if (feasible < 0)
3580                         goto error;
3581                 if (feasible)
3582                         res = isl_tab_row_any;
3583         }
3584
3585         isl_vec_free(ineq);
3586         return res;
3587 error:
3588         isl_vec_free(ineq);
3589         return isl_tab_row_unknown;
3590 }
3591
3592 static void find_solutions(struct isl_sol *sol, struct isl_tab *tab);
3593
3594 /* Find solutions for values of the parameters that satisfy the given
3595  * inequality.
3596  *
3597  * We currently take a snapshot of the context tableau that is reset
3598  * when we return from this function, while we make a copy of the main
3599  * tableau, leaving the original main tableau untouched.
3600  * These are fairly arbitrary choices.  Making a copy also of the context
3601  * tableau would obviate the need to undo any changes made to it later,
3602  * while taking a snapshot of the main tableau could reduce memory usage.
3603  * If we were to switch to taking a snapshot of the main tableau,
3604  * we would have to keep in mind that we need to save the row signs
3605  * and that we need to do this before saving the current basis
3606  * such that the basis has been restore before we restore the row signs.
3607  */
3608 static void find_in_pos(struct isl_sol *sol, struct isl_tab *tab, isl_int *ineq)
3609 {
3610         void *saved;
3611
3612         if (!sol->context)
3613                 goto error;
3614         saved = sol->context->op->save(sol->context);
3615
3616         tab = isl_tab_dup(tab);
3617         if (!tab)
3618                 goto error;
3619
3620         sol->context->op->add_ineq(sol->context, ineq, 0, 1);
3621
3622         find_solutions(sol, tab);
3623
3624         if (!sol->error)
3625                 sol->context->op->restore(sol->context, saved);
3626         else
3627                 sol->context->op->discard(saved);
3628         return;
3629 error:
3630         sol->error = 1;
3631 }
3632
3633 /* Record the absence of solutions for those values of the parameters
3634  * that do not satisfy the given inequality with equality.
3635  */
3636 static void no_sol_in_strict(struct isl_sol *sol,
3637         struct isl_tab *tab, struct isl_vec *ineq)
3638 {
3639         int empty;
3640         void *saved;
3641
3642         if (!sol->context || sol->error)
3643                 goto error;
3644         saved = sol->context->op->save(sol->context);
3645
3646         isl_int_sub_ui(ineq->el[0], ineq->el[0], 1);
3647
3648         sol->context->op->add_ineq(sol->context, ineq->el, 1, 0);
3649         if (!sol->context)
3650                 goto error;
3651
3652         empty = tab->empty;
3653         tab->empty = 1;
3654         sol_add(sol, tab);
3655         tab->empty = empty;
3656
3657         isl_int_add_ui(ineq->el[0], ineq->el[0], 1);
3658
3659         sol->context->op->restore(sol->context, saved);
3660         return;
3661 error:
3662         sol->error = 1;
3663 }
3664
3665 /* Compute the lexicographic minimum of the set represented by the main
3666  * tableau "tab" within the context "sol->context_tab".
3667  * On entry the sample value of the main tableau is lexicographically
3668  * less than or equal to this lexicographic minimum.
3669  * Pivots are performed until a feasible point is found, which is then
3670  * necessarily equal to the minimum, or until the tableau is found to
3671  * be infeasible.  Some pivots may need to be performed for only some
3672  * feasible values of the context tableau.  If so, the context tableau
3673  * is split into a part where the pivot is needed and a part where it is not.
3674  *
3675  * Whenever we enter the main loop, the main tableau is such that no
3676  * "obvious" pivots need to be performed on it, where "obvious" means
3677  * that the given row can be seen to be negative without looking at
3678  * the context tableau.  In particular, for non-parametric problems,
3679  * no pivots need to be performed on the main tableau.
3680  * The caller of find_solutions is responsible for making this property
3681  * hold prior to the first iteration of the loop, while restore_lexmin
3682  * is called before every other iteration.
3683  *
3684  * Inside the main loop, we first examine the signs of the rows of
3685  * the main tableau within the context of the context tableau.
3686  * If we find a row that is always non-positive for all values of
3687  * the parameters satisfying the context tableau and negative for at
3688  * least one value of the parameters, we perform the appropriate pivot
3689  * and start over.  An exception is the case where no pivot can be
3690  * performed on the row.  In this case, we require that the sign of
3691  * the row is negative for all values of the parameters (rather than just
3692  * non-positive).  This special case is handled inside row_sign, which
3693  * will say that the row can have any sign if it determines that it can
3694  * attain both negative and zero values.
3695  *
3696  * If we can't find a row that always requires a pivot, but we can find
3697  * one or more rows that require a pivot for some values of the parameters
3698  * (i.e., the row can attain both positive and negative signs), then we split
3699  * the context tableau into two parts, one where we force the sign to be
3700  * non-negative and one where we force is to be negative.
3701  * The non-negative part is handled by a recursive call (through find_in_pos).
3702  * Upon returning from this call, we continue with the negative part and
3703  * perform the required pivot.
3704  *
3705  * If no such rows can be found, all rows are non-negative and we have
3706  * found a (rational) feasible point.  If we only wanted a rational point
3707  * then we are done.
3708  * Otherwise, we check if all values of the sample point of the tableau
3709  * are integral for the variables.  If so, we have found the minimal
3710  * integral point and we are done.
3711  * If the sample point is not integral, then we need to make a distinction
3712  * based on whether the constant term is non-integral or the coefficients
3713  * of the parameters.  Furthermore, in order to decide how to handle
3714  * the non-integrality, we also need to know whether the coefficients
3715  * of the other columns in the tableau are integral.  This leads
3716  * to the following table.  The first two rows do not correspond
3717  * to a non-integral sample point and are only mentioned for completeness.
3718  *
3719  *      constant        parameters      other
3720  *
3721  *      int             int             int     |
3722  *      int             int             rat     | -> no problem
3723  *
3724  *      rat             int             int       -> fail
3725  *
3726  *      rat             int             rat       -> cut
3727  *
3728  *      int             rat             rat     |
3729  *      rat             rat             rat     | -> parametric cut
3730  *
3731  *      int             rat             int     |
3732  *      rat             rat             int     | -> split context
3733  *
3734  * If the parametric constant is completely integral, then there is nothing
3735  * to be done.  If the constant term is non-integral, but all the other
3736  * coefficient are integral, then there is nothing that can be done
3737  * and the tableau has no integral solution.
3738  * If, on the other hand, one or more of the other columns have rational
3739  * coefficients, but the parameter coefficients are all integral, then
3740  * we can perform a regular (non-parametric) cut.
3741  * Finally, if there is any parameter coefficient that is non-integral,
3742  * then we need to involve the context tableau.  There are two cases here.
3743  * If at least one other column has a rational coefficient, then we
3744  * can perform a parametric cut in the main tableau by adding a new
3745  * integer division in the context tableau.
3746  * If all other columns have integral coefficients, then we need to
3747  * enforce that the rational combination of parameters (c + \sum a_i y_i)/m
3748  * is always integral.  We do this by introducing an integer division
3749  * q = floor((c + \sum a_i y_i)/m) and stipulating that its argument should
3750  * always be integral in the context tableau, i.e., m q = c + \sum a_i y_i.
3751  * Since q is expressed in the tableau as
3752  *      c + \sum a_i y_i - m q >= 0
3753  *      -c - \sum a_i y_i + m q + m - 1 >= 0
3754  * it is sufficient to add the inequality
3755  *      -c - \sum a_i y_i + m q >= 0
3756  * In the part of the context where this inequality does not hold, the
3757  * main tableau is marked as being empty.
3758  */
3759 static void find_solutions(struct isl_sol *sol, struct isl_tab *tab)
3760 {
3761         struct isl_context *context;
3762         int r;
3763
3764         if (!tab || sol->error)
3765                 goto error;
3766
3767         context = sol->context;
3768
3769         if (tab->empty)
3770                 goto done;
3771         if (context->op->is_empty(context))
3772                 goto done;
3773
3774         for (r = 0; r >= 0 && tab && !tab->empty; r = restore_lexmin(tab)) {
3775                 int flags;
3776                 int row;
3777                 enum isl_tab_row_sign sgn;
3778                 int split = -1;
3779                 int n_split = 0;
3780
3781                 for (row = tab->n_redundant; row < tab->n_row; ++row) {
3782                         if (!isl_tab_var_from_row(tab, row)->is_nonneg)
3783                                 continue;
3784                         sgn = row_sign(tab, sol, row);
3785                         if (!sgn)
3786                                 goto error;
3787                         tab->row_sign[row] = sgn;
3788                         if (sgn == isl_tab_row_any)
3789                                 n_split++;
3790                         if (sgn == isl_tab_row_any && split == -1)
3791                                 split = row;
3792                         if (sgn == isl_tab_row_neg)
3793                                 break;
3794                 }
3795                 if (row < tab->n_row)
3796                         continue;
3797                 if (split != -1) {
3798                         struct isl_vec *ineq;
3799                         if (n_split != 1)
3800                                 split = context->op->best_split(context, tab);
3801                         if (split < 0)
3802                                 goto error;
3803                         ineq = get_row_parameter_ineq(tab, split);
3804                         if (!ineq)
3805                                 goto error;
3806                         is_strict(ineq);
3807                         for (row = tab->n_redundant; row < tab->n_row; ++row) {
3808                                 if (!isl_tab_var_from_row(tab, row)->is_nonneg)
3809                                         continue;
3810                                 if (tab->row_sign[row] == isl_tab_row_any)
3811                                         tab->row_sign[row] = isl_tab_row_unknown;
3812                         }
3813                         tab->row_sign[split] = isl_tab_row_pos;
3814                         sol_inc_level(sol);
3815                         find_in_pos(sol, tab, ineq->el);
3816                         tab->row_sign[split] = isl_tab_row_neg;
3817                         row = split;
3818                         isl_seq_neg(ineq->el, ineq->el, ineq->size);
3819                         isl_int_sub_ui(ineq->el[0], ineq->el[0], 1);
3820                         if (!sol->error)
3821                                 context->op->add_ineq(context, ineq->el, 0, 1);
3822                         isl_vec_free(ineq);
3823                         if (sol->error)
3824                                 goto error;
3825                         continue;
3826                 }
3827                 if (tab->rational)
3828                         break;
3829                 row = first_non_integer_row(tab, &flags);
3830                 if (row < 0)
3831                         break;
3832                 if (ISL_FL_ISSET(flags, I_PAR)) {
3833                         if (ISL_FL_ISSET(flags, I_VAR)) {
3834                                 if (isl_tab_mark_empty(tab) < 0)
3835                                         goto error;
3836                                 break;
3837                         }
3838                         row = add_cut(tab, row);
3839                 } else if (ISL_FL_ISSET(flags, I_VAR)) {
3840                         struct isl_vec *div;
3841                         struct isl_vec *ineq;
3842                         int d;
3843                         div = get_row_split_div(tab, row);
3844                         if (!div)
3845                                 goto error;
3846                         d = context->op->get_div(context, tab, div);
3847                         isl_vec_free(div);
3848                         if (d < 0)
3849                                 goto error;
3850                         ineq = ineq_for_div(context->op->peek_basic_set(context), d);
3851                         if (!ineq)
3852                                 goto error;
3853                         sol_inc_level(sol);
3854                         no_sol_in_strict(sol, tab, ineq);
3855                         isl_seq_neg(ineq->el, ineq->el, ineq->size);
3856                         context->op->add_ineq(context, ineq->el, 1, 1);
3857                         isl_vec_free(ineq);
3858                         if (sol->error || !context->op->is_ok(context))
3859                                 goto error;
3860                         tab = set_row_cst_to_div(tab, row, d);
3861                         if (context->op->is_empty(context))
3862                                 break;
3863                 } else
3864                         row = add_parametric_cut(tab, row, context);
3865                 if (row < 0)
3866                         goto error;
3867         }
3868         if (r < 0)
3869                 goto error;
3870 done:
3871         sol_add(sol, tab);
3872         isl_tab_free(tab);
3873         return;
3874 error:
3875         isl_tab_free(tab);
3876         sol->error = 1;
3877 }
3878
3879 /* Does "sol" contain a pair of partial solutions that could potentially
3880  * be merged?
3881  *
3882  * We currently only check that "sol" is not in an error state
3883  * and that there are at least two partial solutions of which the final two
3884  * are defined at the same level.
3885  */
3886 static int sol_has_mergeable_solutions(struct isl_sol *sol)
3887 {
3888         if (sol->error)
3889                 return 0;
3890         if (!sol->partial)
3891                 return 0;
3892         if (!sol->partial->next)
3893                 return 0;
3894         return sol->partial->level == sol->partial->next->level;
3895 }
3896
3897 /* Compute the lexicographic minimum of the set represented by the main
3898  * tableau "tab" within the context "sol->context_tab".
3899  *
3900  * As a preprocessing step, we first transfer all the purely parametric
3901  * equalities from the main tableau to the context tableau, i.e.,
3902  * parameters that have been pivoted to a row.
3903  * These equalities are ignored by the main algorithm, because the
3904  * corresponding rows may not be marked as being non-negative.
3905  * In parts of the context where the added equality does not hold,
3906  * the main tableau is marked as being empty.
3907  *
3908  * Before we embark on the actual computation, we save a copy
3909  * of the context.  When we return, we check if there are any
3910  * partial solutions that can potentially be merged.  If so,
3911  * we perform a rollback to the initial state of the context.
3912  * The merging of partial solutions happens inside calls to
3913  * sol_dec_level that are pushed onto the undo stack of the context.
3914  * If there are no partial solutions that can potentially be merged
3915  * then the rollback is skipped as it would just be wasted effort.
3916  */
3917 static void find_solutions_main(struct isl_sol *sol, struct isl_tab *tab)
3918 {
3919         int row;
3920         void *saved;
3921
3922         if (!tab)
3923                 goto error;
3924
3925         sol->level = 0;
3926
3927         for (row = tab->n_redundant; row < tab->n_row; ++row) {
3928                 int p;
3929                 struct isl_vec *eq;
3930
3931                 if (tab->row_var[row] < 0)
3932                         continue;
3933                 if (tab->row_var[row] >= tab->n_param &&
3934                     tab->row_var[row] < tab->n_var - tab->n_div)
3935                         continue;
3936                 if (tab->row_var[row] < tab->n_param)
3937                         p = tab->row_var[row];
3938                 else
3939                         p = tab->row_var[row]
3940                                 + tab->n_param - (tab->n_var - tab->n_div);
3941
3942                 eq = isl_vec_alloc(tab->mat->ctx, 1+tab->n_param+tab->n_div);
3943                 if (!eq)
3944                         goto error;
3945                 get_row_parameter_line(tab, row, eq->el);
3946                 isl_int_neg(eq->el[1 + p], tab->mat->row[row][0]);
3947                 eq = isl_vec_normalize(eq);
3948
3949                 sol_inc_level(sol);
3950                 no_sol_in_strict(sol, tab, eq);
3951
3952                 isl_seq_neg(eq->el, eq->el, eq->size);
3953                 sol_inc_level(sol);
3954                 no_sol_in_strict(sol, tab, eq);
3955                 isl_seq_neg(eq->el, eq->el, eq->size);
3956
3957                 sol->context->op->add_eq(sol->context, eq->el, 1, 1);
3958
3959                 isl_vec_free(eq);
3960
3961                 if (isl_tab_mark_redundant(tab, row) < 0)
3962                         goto error;
3963
3964                 if (sol->context->op->is_empty(sol->context))
3965                         break;
3966
3967                 row = tab->n_redundant - 1;
3968         }
3969
3970         saved = sol->context->op->save(sol->context);
3971
3972         find_solutions(sol, tab);
3973
3974         if (sol_has_mergeable_solutions(sol))
3975                 sol->context->op->restore(sol->context, saved);
3976         else
3977                 sol->context->op->discard(saved);
3978
3979         sol->level = 0;
3980         sol_pop(sol);
3981
3982         return;
3983 error:
3984         isl_tab_free(tab);
3985         sol->error = 1;
3986 }
3987
3988 /* Check if integer division "div" of "dom" also occurs in "bmap".
3989  * If so, return its position within the divs.
3990  * If not, return -1.
3991  */
3992 static int find_context_div(struct isl_basic_map *bmap,
3993         struct isl_basic_set *dom, unsigned div)
3994 {
3995         int i;
3996         unsigned b_dim = isl_space_dim(bmap->dim, isl_dim_all);
3997         unsigned d_dim = isl_space_dim(dom->dim, isl_dim_all);
3998
3999         if (isl_int_is_zero(dom->div[div][0]))
4000                 return -1;
4001         if (isl_seq_first_non_zero(dom->div[div] + 2 + d_dim, dom->n_div) != -1)
4002                 return -1;
4003
4004         for (i = 0; i < bmap->n_div; ++i) {
4005                 if (isl_int_is_zero(bmap->div[i][0]))
4006                         continue;
4007                 if (isl_seq_first_non_zero(bmap->div[i] + 2 + d_dim,
4008                                            (b_dim - d_dim) + bmap->n_div) != -1)
4009                         continue;
4010                 if (isl_seq_eq(bmap->div[i], dom->div[div], 2 + d_dim))
4011                         return i;
4012         }
4013         return -1;
4014 }
4015
4016 /* The correspondence between the variables in the main tableau,
4017  * the context tableau, and the input map and domain is as follows.
4018  * The first n_param and the last n_div variables of the main tableau
4019  * form the variables of the context tableau.
4020  * In the basic map, these n_param variables correspond to the
4021  * parameters and the input dimensions.  In the domain, they correspond
4022  * to the parameters and the set dimensions.
4023  * The n_div variables correspond to the integer divisions in the domain.
4024  * To ensure that everything lines up, we may need to copy some of the
4025  * integer divisions of the domain to the map.  These have to be placed
4026  * in the same order as those in the context and they have to be placed
4027  * after any other integer divisions that the map may have.
4028  * This function performs the required reordering.
4029  */
4030 static struct isl_basic_map *align_context_divs(struct isl_basic_map *bmap,
4031         struct isl_basic_set *dom)
4032 {
4033         int i;
4034         int common = 0;
4035         int other;
4036
4037         for (i = 0; i < dom->n_div; ++i)
4038                 if (find_context_div(bmap, dom, i) != -1)
4039                         common++;
4040         other = bmap->n_div - common;
4041         if (dom->n_div - common > 0) {
4042                 bmap = isl_basic_map_extend_space(bmap, isl_space_copy(bmap->dim),
4043                                 dom->n_div - common, 0, 0);
4044                 if (!bmap)
4045                         return NULL;
4046         }
4047         for (i = 0; i < dom->n_div; ++i) {
4048                 int pos = find_context_div(bmap, dom, i);
4049                 if (pos < 0) {
4050                         pos = isl_basic_map_alloc_div(bmap);
4051                         if (pos < 0)
4052                                 goto error;
4053                         isl_int_set_si(bmap->div[pos][0], 0);
4054                 }
4055                 if (pos != other + i)
4056                         isl_basic_map_swap_div(bmap, pos, other + i);
4057         }
4058         return bmap;
4059 error:
4060         isl_basic_map_free(bmap);
4061         return NULL;
4062 }
4063
4064 /* Base case of isl_tab_basic_map_partial_lexopt, after removing
4065  * some obvious symmetries.
4066  *
4067  * We make sure the divs in the domain are properly ordered,
4068  * because they will be added one by one in the given order
4069  * during the construction of the solution map.
4070  */
4071 static struct isl_sol *basic_map_partial_lexopt_base(
4072         __isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
4073         __isl_give isl_set **empty, int max,
4074         struct isl_sol *(*init)(__isl_keep isl_basic_map *bmap,
4075                     __isl_take isl_basic_set *dom, int track_empty, int max))
4076 {
4077         struct isl_tab *tab;
4078         struct isl_sol *sol = NULL;
4079         struct isl_context *context;
4080
4081         if (dom->n_div) {
4082                 dom = isl_basic_set_order_divs(dom);
4083                 bmap = align_context_divs(bmap, dom);
4084         }
4085         sol = init(bmap, dom, !!empty, max);
4086         if (!sol)
4087                 goto error;
4088
4089         context = sol->context;
4090         if (isl_basic_set_plain_is_empty(context->op->peek_basic_set(context)))
4091                 /* nothing */;
4092         else if (isl_basic_map_plain_is_empty(bmap)) {
4093                 if (sol->add_empty)
4094                         sol->add_empty(sol,
4095                     isl_basic_set_copy(context->op->peek_basic_set(context)));
4096         } else {
4097                 tab = tab_for_lexmin(bmap,
4098                                     context->op->peek_basic_set(context), 1, max);
4099                 tab = context->op->detect_nonnegative_parameters(context, tab);
4100                 find_solutions_main(sol, tab);
4101         }
4102         if (sol->error)
4103                 goto error;
4104
4105         isl_basic_map_free(bmap);
4106         return sol;
4107 error:
4108         sol_free(sol);
4109         isl_basic_map_free(bmap);
4110         return NULL;
4111 }
4112
4113 /* Base case of isl_tab_basic_map_partial_lexopt, after removing
4114  * some obvious symmetries.
4115  *
4116  * We call basic_map_partial_lexopt_base and extract the results.
4117  */
4118 static __isl_give isl_map *basic_map_partial_lexopt_base_map(
4119         __isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
4120         __isl_give isl_set **empty, int max)
4121 {
4122         isl_map *result = NULL;
4123         struct isl_sol *sol;
4124         struct isl_sol_map *sol_map;
4125
4126         sol = basic_map_partial_lexopt_base(bmap, dom, empty, max,
4127                                             &sol_map_init);
4128         if (!sol)
4129                 return NULL;
4130         sol_map = (struct isl_sol_map *) sol;
4131
4132         result = isl_map_copy(sol_map->map);
4133         if (empty)
4134                 *empty = isl_set_copy(sol_map->empty);
4135         sol_free(&sol_map->sol);
4136         return result;
4137 }
4138
4139 /* Structure used during detection of parallel constraints.
4140  * n_in: number of "input" variables: isl_dim_param + isl_dim_in
4141  * n_out: number of "output" variables: isl_dim_out + isl_dim_div
4142  * val: the coefficients of the output variables
4143  */
4144 struct isl_constraint_equal_info {
4145         isl_basic_map *bmap;
4146         unsigned n_in;
4147         unsigned n_out;
4148         isl_int *val;
4149 };
4150
4151 /* Check whether the coefficients of the output variables
4152  * of the constraint in "entry" are equal to info->val.
4153  */
4154 static int constraint_equal(const void *entry, const void *val)
4155 {
4156         isl_int **row = (isl_int **)entry;
4157         const struct isl_constraint_equal_info *info = val;
4158
4159         return isl_seq_eq((*row) + 1 + info->n_in, info->val, info->n_out);
4160 }
4161
4162 /* Check whether "bmap" has a pair of constraints that have
4163  * the same coefficients for the output variables.
4164  * Note that the coefficients of the existentially quantified
4165  * variables need to be zero since the existentially quantified
4166  * of the result are usually not the same as those of the input.
4167  * the isl_dim_out and isl_dim_div dimensions.
4168  * If so, return 1 and return the row indices of the two constraints
4169  * in *first and *second.
4170  */
4171 static int parallel_constraints(__isl_keep isl_basic_map *bmap,
4172         int *first, int *second)
4173 {
4174         int i;
4175         isl_ctx *ctx = isl_basic_map_get_ctx(bmap);
4176         struct isl_hash_table *table = NULL;
4177         struct isl_hash_table_entry *entry;
4178         struct isl_constraint_equal_info info;
4179         unsigned n_out;
4180         unsigned n_div;
4181
4182         ctx = isl_basic_map_get_ctx(bmap);
4183         table = isl_hash_table_alloc(ctx, bmap->n_ineq);
4184         if (!table)
4185                 goto error;
4186
4187         info.n_in = isl_basic_map_dim(bmap, isl_dim_param) +
4188                     isl_basic_map_dim(bmap, isl_dim_in);
4189         info.bmap = bmap;
4190         n_out = isl_basic_map_dim(bmap, isl_dim_out);
4191         n_div = isl_basic_map_dim(bmap, isl_dim_div);
4192         info.n_out = n_out + n_div;
4193         for (i = 0; i < bmap->n_ineq; ++i) {
4194                 uint32_t hash;
4195
4196                 info.val = bmap->ineq[i] + 1 + info.n_in;
4197                 if (isl_seq_first_non_zero(info.val, n_out) < 0)
4198                         continue;
4199                 if (isl_seq_first_non_zero(info.val + n_out, n_div) >= 0)
4200                         continue;
4201                 hash = isl_seq_get_hash(info.val, info.n_out);
4202                 entry = isl_hash_table_find(ctx, table, hash,
4203                                             constraint_equal, &info, 1);
4204                 if (!entry)
4205                         goto error;
4206                 if (entry->data)
4207                         break;
4208                 entry->data = &bmap->ineq[i];
4209         }
4210
4211         if (i < bmap->n_ineq) {
4212                 *first = ((isl_int **)entry->data) - bmap->ineq; 
4213                 *second = i;
4214         }
4215
4216         isl_hash_table_free(ctx, table);
4217
4218         return i < bmap->n_ineq;
4219 error:
4220         isl_hash_table_free(ctx, table);
4221         return -1;
4222 }
4223
4224 /* Given a set of upper bounds in "var", add constraints to "bset"
4225  * that make the i-th bound smallest.
4226  *
4227  * In particular, if there are n bounds b_i, then add the constraints
4228  *
4229  *      b_i <= b_j      for j > i
4230  *      b_i <  b_j      for j < i
4231  */
4232 static __isl_give isl_basic_set *select_minimum(__isl_take isl_basic_set *bset,
4233         __isl_keep isl_mat *var, int i)
4234 {
4235         isl_ctx *ctx;
4236         int j, k;
4237
4238         ctx = isl_mat_get_ctx(var);
4239
4240         for (j = 0; j < var->n_row; ++j) {
4241                 if (j == i)
4242                         continue;
4243                 k = isl_basic_set_alloc_inequality(bset);
4244                 if (k < 0)
4245                         goto error;
4246                 isl_seq_combine(bset->ineq[k], ctx->one, var->row[j],
4247                                 ctx->negone, var->row[i], var->n_col);
4248                 isl_int_set_si(bset->ineq[k][var->n_col], 0);
4249                 if (j < i)
4250                         isl_int_sub_ui(bset->ineq[k][0], bset->ineq[k][0], 1);
4251         }
4252
4253         bset = isl_basic_set_finalize(bset);
4254
4255         return bset;
4256 error:
4257         isl_basic_set_free(bset);
4258         return NULL;
4259 }
4260
4261 /* Given a set of upper bounds on the last "input" variable m,
4262  * construct a set that assigns the minimal upper bound to m, i.e.,
4263  * construct a set that divides the space into cells where one
4264  * of the upper bounds is smaller than all the others and assign
4265  * this upper bound to m.
4266  *
4267  * In particular, if there are n bounds b_i, then the result
4268  * consists of n basic sets, each one of the form
4269  *
4270  *      m = b_i
4271  *      b_i <= b_j      for j > i
4272  *      b_i <  b_j      for j < i
4273  */
4274 static __isl_give isl_set *set_minimum(__isl_take isl_space *dim,
4275         __isl_take isl_mat *var)
4276 {
4277         int i, k;
4278         isl_basic_set *bset = NULL;
4279         isl_ctx *ctx;
4280         isl_set *set = NULL;
4281
4282         if (!dim || !var)
4283                 goto error;
4284
4285         ctx = isl_space_get_ctx(dim);
4286         set = isl_set_alloc_space(isl_space_copy(dim),
4287                                 var->n_row, ISL_SET_DISJOINT);
4288
4289         for (i = 0; i < var->n_row; ++i) {
4290                 bset = isl_basic_set_alloc_space(isl_space_copy(dim), 0,
4291                                                1, var->n_row - 1);
4292                 k = isl_basic_set_alloc_equality(bset);
4293                 if (k < 0)
4294                         goto error;
4295                 isl_seq_cpy(bset->eq[k], var->row[i], var->n_col);
4296                 isl_int_set_si(bset->eq[k][var->n_col], -1);
4297                 bset = select_minimum(bset, var, i);
4298                 set = isl_set_add_basic_set(set, bset);
4299         }
4300
4301         isl_space_free(dim);
4302         isl_mat_free(var);
4303         return set;
4304 error:
4305         isl_basic_set_free(bset);
4306         isl_set_free(set);
4307         isl_space_free(dim);
4308         isl_mat_free(var);
4309         return NULL;
4310 }
4311
4312 /* Given that the last input variable of "bmap" represents the minimum
4313  * of the bounds in "cst", check whether we need to split the domain
4314  * based on which bound attains the minimum.
4315  *
4316  * A split is needed when the minimum appears in an integer division
4317  * or in an equality.  Otherwise, it is only needed if it appears in
4318  * an upper bound that is different from the upper bounds on which it
4319  * is defined.
4320  */
4321 static int need_split_basic_map(__isl_keep isl_basic_map *bmap,
4322         __isl_keep isl_mat *cst)
4323 {
4324         int i, j;
4325         unsigned total;
4326         unsigned pos;
4327
4328         pos = cst->n_col - 1;
4329         total = isl_basic_map_dim(bmap, isl_dim_all);
4330
4331         for (i = 0; i < bmap->n_div; ++i)
4332                 if (!isl_int_is_zero(bmap->div[i][2 + pos]))
4333                         return 1;
4334
4335         for (i = 0; i < bmap->n_eq; ++i)
4336                 if (!isl_int_is_zero(bmap->eq[i][1 + pos]))
4337                         return 1;
4338
4339         for (i = 0; i < bmap->n_ineq; ++i) {
4340                 if (isl_int_is_nonneg(bmap->ineq[i][1 + pos]))
4341                         continue;
4342                 if (!isl_int_is_negone(bmap->ineq[i][1 + pos]))
4343                         return 1;
4344                 if (isl_seq_first_non_zero(bmap->ineq[i] + 1 + pos + 1,
4345                                            total - pos - 1) >= 0)
4346                         return 1;
4347
4348                 for (j = 0; j < cst->n_row; ++j)
4349                         if (isl_seq_eq(bmap->ineq[i], cst->row[j], cst->n_col))
4350                                 break;
4351                 if (j >= cst->n_row)
4352                         return 1;
4353         }
4354
4355         return 0;
4356 }
4357
4358 /* Given that the last set variable of "bset" represents the minimum
4359  * of the bounds in "cst", check whether we need to split the domain
4360  * based on which bound attains the minimum.
4361  *
4362  * We simply call need_split_basic_map here.  This is safe because
4363  * the position of the minimum is computed from "cst" and not
4364  * from "bmap".
4365  */
4366 static int need_split_basic_set(__isl_keep isl_basic_set *bset,
4367         __isl_keep isl_mat *cst)
4368 {
4369         return need_split_basic_map((isl_basic_map *)bset, cst);
4370 }
4371
4372 /* Given that the last set variable of "set" represents the minimum
4373  * of the bounds in "cst", check whether we need to split the domain
4374  * based on which bound attains the minimum.
4375  */
4376 static int need_split_set(__isl_keep isl_set *set, __isl_keep isl_mat *cst)
4377 {
4378         int i;
4379
4380         for (i = 0; i < set->n; ++i)
4381                 if (need_split_basic_set(set->p[i], cst))
4382                         return 1;
4383
4384         return 0;
4385 }
4386
4387 /* Given a set of which the last set variable is the minimum
4388  * of the bounds in "cst", split each basic set in the set
4389  * in pieces where one of the bounds is (strictly) smaller than the others.
4390  * This subdivision is given in "min_expr".
4391  * The variable is subsequently projected out.
4392  *
4393  * We only do the split when it is needed.
4394  * For example if the last input variable m = min(a,b) and the only
4395  * constraints in the given basic set are lower bounds on m,
4396  * i.e., l <= m = min(a,b), then we can simply project out m
4397  * to obtain l <= a and l <= b, without having to split on whether
4398  * m is equal to a or b.
4399  */
4400 static __isl_give isl_set *split(__isl_take isl_set *empty,
4401         __isl_take isl_set *min_expr, __isl_take isl_mat *cst)
4402 {
4403         int n_in;
4404         int i;
4405         isl_space *dim;
4406         isl_set *res;
4407
4408         if (!empty || !min_expr || !cst)
4409                 goto error;
4410
4411         n_in = isl_set_dim(empty, isl_dim_set);
4412         dim = isl_set_get_space(empty);
4413         dim = isl_space_drop_dims(dim, isl_dim_set, n_in - 1, 1);
4414         res = isl_set_empty(dim);
4415
4416         for (i = 0; i < empty->n; ++i) {
4417                 isl_set *set;
4418
4419                 set = isl_set_from_basic_set(isl_basic_set_copy(empty->p[i]));
4420                 if (need_split_basic_set(empty->p[i], cst))
4421                         set = isl_set_intersect(set, isl_set_copy(min_expr));
4422                 set = isl_set_remove_dims(set, isl_dim_set, n_in - 1, 1);
4423
4424                 res = isl_set_union_disjoint(res, set);
4425         }
4426
4427         isl_set_free(empty);
4428         isl_set_free(min_expr);
4429         isl_mat_free(cst);
4430         return res;
4431 error:
4432         isl_set_free(empty);
4433         isl_set_free(min_expr);
4434         isl_mat_free(cst);
4435         return NULL;
4436 }
4437
4438 /* Given a map of which the last input variable is the minimum
4439  * of the bounds in "cst", split each basic set in the set
4440  * in pieces where one of the bounds is (strictly) smaller than the others.
4441  * This subdivision is given in "min_expr".
4442  * The variable is subsequently projected out.
4443  *
4444  * The implementation is essentially the same as that of "split".
4445  */
4446 static __isl_give isl_map *split_domain(__isl_take isl_map *opt,
4447         __isl_take isl_set *min_expr, __isl_take isl_mat *cst)
4448 {
4449         int n_in;
4450         int i;
4451         isl_space *dim;
4452         isl_map *res;
4453
4454         if (!opt || !min_expr || !cst)
4455                 goto error;
4456
4457         n_in = isl_map_dim(opt, isl_dim_in);
4458         dim = isl_map_get_space(opt);
4459         dim = isl_space_drop_dims(dim, isl_dim_in, n_in - 1, 1);
4460         res = isl_map_empty(dim);
4461
4462         for (i = 0; i < opt->n; ++i) {
4463                 isl_map *map;
4464
4465                 map = isl_map_from_basic_map(isl_basic_map_copy(opt->p[i]));
4466                 if (need_split_basic_map(opt->p[i], cst))
4467                         map = isl_map_intersect_domain(map,
4468                                                        isl_set_copy(min_expr));
4469                 map = isl_map_remove_dims(map, isl_dim_in, n_in - 1, 1);
4470
4471                 res = isl_map_union_disjoint(res, map);
4472         }
4473
4474         isl_map_free(opt);
4475         isl_set_free(min_expr);
4476         isl_mat_free(cst);
4477         return res;
4478 error:
4479         isl_map_free(opt);
4480         isl_set_free(min_expr);
4481         isl_mat_free(cst);
4482         return NULL;
4483 }
4484
4485 static __isl_give isl_map *basic_map_partial_lexopt(
4486         __isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
4487         __isl_give isl_set **empty, int max);
4488
4489 union isl_lex_res {
4490         void *p;
4491         isl_map *map;
4492         isl_pw_multi_aff *pma;
4493 };
4494
4495 /* This function is called from basic_map_partial_lexopt_symm.
4496  * The last variable of "bmap" and "dom" corresponds to the minimum
4497  * of the bounds in "cst".  "map_space" is the space of the original
4498  * input relation (of basic_map_partial_lexopt_symm) and "set_space"
4499  * is the space of the original domain.
4500  *
4501  * We recursively call basic_map_partial_lexopt and then plug in
4502  * the definition of the minimum in the result.
4503  */
4504 static __isl_give union isl_lex_res basic_map_partial_lexopt_symm_map_core(
4505         __isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
4506         __isl_give isl_set **empty, int max, __isl_take isl_mat *cst,
4507         __isl_take isl_space *map_space, __isl_take isl_space *set_space)
4508 {
4509         isl_map *opt;
4510         isl_set *min_expr;
4511         union isl_lex_res res;
4512
4513         min_expr = set_minimum(isl_basic_set_get_space(dom), isl_mat_copy(cst));
4514
4515         opt = basic_map_partial_lexopt(bmap, dom, empty, max);
4516
4517         if (empty) {
4518                 *empty = split(*empty,
4519                                isl_set_copy(min_expr), isl_mat_copy(cst));
4520                 *empty = isl_set_reset_space(*empty, set_space);
4521         }
4522
4523         opt = split_domain(opt, min_expr, cst);
4524         opt = isl_map_reset_space(opt, map_space);
4525
4526         res.map = opt;
4527         return res;
4528 }
4529
4530 /* Given a basic map with at least two parallel constraints (as found
4531  * by the function parallel_constraints), first look for more constraints
4532  * parallel to the two constraint and replace the found list of parallel
4533  * constraints by a single constraint with as "input" part the minimum
4534  * of the input parts of the list of constraints.  Then, recursively call
4535  * basic_map_partial_lexopt (possibly finding more parallel constraints)
4536  * and plug in the definition of the minimum in the result.
4537  *
4538  * More specifically, given a set of constraints
4539  *
4540  *      a x + b_i(p) >= 0
4541  *
4542  * Replace this set by a single constraint
4543  *
4544  *      a x + u >= 0
4545  *
4546  * with u a new parameter with constraints
4547  *
4548  *      u <= b_i(p)
4549  *
4550  * Any solution to the new system is also a solution for the original system
4551  * since
4552  *
4553  *      a x >= -u >= -b_i(p)
4554  *
4555  * Moreover, m = min_i(b_i(p)) satisfies the constraints on u and can
4556  * therefore be plugged into the solution.
4557  */
4558 static union isl_lex_res basic_map_partial_lexopt_symm(
4559         __isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
4560         __isl_give isl_set **empty, int max, int first, int second,
4561         __isl_give union isl_lex_res (*core)(__isl_take isl_basic_map *bmap,
4562                                             __isl_take isl_basic_set *dom,
4563                                             __isl_give isl_set **empty,
4564                                             int max, __isl_take isl_mat *cst,
4565                                             __isl_take isl_space *map_space,
4566                                             __isl_take isl_space *set_space))
4567 {
4568         int i, n, k;
4569         int *list = NULL;
4570         unsigned n_in, n_out, n_div;
4571         isl_ctx *ctx;
4572         isl_vec *var = NULL;
4573         isl_mat *cst = NULL;
4574         isl_space *map_space, *set_space;
4575         union isl_lex_res res;
4576
4577         map_space = isl_basic_map_get_space(bmap);
4578         set_space = empty ? isl_basic_set_get_space(dom) : NULL;
4579
4580         n_in = isl_basic_map_dim(bmap, isl_dim_param) +
4581                isl_basic_map_dim(bmap, isl_dim_in);
4582         n_out = isl_basic_map_dim(bmap, isl_dim_all) - n_in;
4583
4584         ctx = isl_basic_map_get_ctx(bmap);
4585         list = isl_alloc_array(ctx, int, bmap->n_ineq);
4586         var = isl_vec_alloc(ctx, n_out);
4587         if (!list || !var)
4588                 goto error;
4589
4590         list[0] = first;
4591         list[1] = second;
4592         isl_seq_cpy(var->el, bmap->ineq[first] + 1 + n_in, n_out);
4593         for (i = second + 1, n = 2; i < bmap->n_ineq; ++i) {
4594                 if (isl_seq_eq(var->el, bmap->ineq[i] + 1 + n_in, n_out))
4595                         list[n++] = i;
4596         }
4597
4598         cst = isl_mat_alloc(ctx, n, 1 + n_in);
4599         if (!cst)
4600                 goto error;
4601
4602         for (i = 0; i < n; ++i)
4603                 isl_seq_cpy(cst->row[i], bmap->ineq[list[i]], 1 + n_in);
4604
4605         bmap = isl_basic_map_cow(bmap);
4606         if (!bmap)
4607                 goto error;
4608         for (i = n - 1; i >= 0; --i)
4609                 if (isl_basic_map_drop_inequality(bmap, list[i]) < 0)
4610                         goto error;
4611
4612         bmap = isl_basic_map_add(bmap, isl_dim_in, 1);
4613         bmap = isl_basic_map_extend_constraints(bmap, 0, 1);
4614         k = isl_basic_map_alloc_inequality(bmap);
4615         if (k < 0)
4616                 goto error;
4617         isl_seq_clr(bmap->ineq[k], 1 + n_in);
4618         isl_int_set_si(bmap->ineq[k][1 + n_in], 1);
4619         isl_seq_cpy(bmap->ineq[k] + 1 + n_in + 1, var->el, n_out);
4620         bmap = isl_basic_map_finalize(bmap);
4621
4622         n_div = isl_basic_set_dim(dom, isl_dim_div);
4623         dom = isl_basic_set_add_dims(dom, isl_dim_set, 1);
4624         dom = isl_basic_set_extend_constraints(dom, 0, n);
4625         for (i = 0; i < n; ++i) {
4626                 k = isl_basic_set_alloc_inequality(dom);
4627                 if (k < 0)
4628                         goto error;
4629                 isl_seq_cpy(dom->ineq[k], cst->row[i], 1 + n_in);
4630                 isl_int_set_si(dom->ineq[k][1 + n_in], -1);
4631                 isl_seq_clr(dom->ineq[k] + 1 + n_in + 1, n_div);
4632         }
4633
4634         isl_vec_free(var);
4635         free(list);
4636
4637         return core(bmap, dom, empty, max, cst, map_space, set_space);
4638 error:
4639         isl_space_free(map_space);
4640         isl_space_free(set_space);
4641         isl_mat_free(cst);
4642         isl_vec_free(var);
4643         free(list);
4644         isl_basic_set_free(dom);
4645         isl_basic_map_free(bmap);
4646         res.p = NULL;
4647         return res;
4648 }
4649
4650 static __isl_give isl_map *basic_map_partial_lexopt_symm_map(
4651         __isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
4652         __isl_give isl_set **empty, int max, int first, int second)
4653 {
4654         return basic_map_partial_lexopt_symm(bmap, dom, empty, max,
4655                     first, second, &basic_map_partial_lexopt_symm_map_core).map;
4656 }
4657
4658 /* Recursive part of isl_tab_basic_map_partial_lexopt, after detecting
4659  * equalities and removing redundant constraints.
4660  *
4661  * We first check if there are any parallel constraints (left).
4662  * If not, we are in the base case.
4663  * If there are parallel constraints, we replace them by a single
4664  * constraint in basic_map_partial_lexopt_symm and then call
4665  * this function recursively to look for more parallel constraints.
4666  */
4667 static __isl_give isl_map *basic_map_partial_lexopt(
4668         __isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
4669         __isl_give isl_set **empty, int max)
4670 {
4671         int par = 0;
4672         int first, second;
4673
4674         if (!bmap)
4675                 goto error;
4676
4677         if (bmap->ctx->opt->pip_symmetry)
4678                 par = parallel_constraints(bmap, &first, &second);
4679         if (par < 0)
4680                 goto error;
4681         if (!par)
4682                 return basic_map_partial_lexopt_base_map(bmap, dom, empty, max);
4683         
4684         return basic_map_partial_lexopt_symm_map(bmap, dom, empty, max,
4685                                                  first, second);
4686 error:
4687         isl_basic_set_free(dom);
4688         isl_basic_map_free(bmap);
4689         return NULL;
4690 }
4691
4692 /* Compute the lexicographic minimum (or maximum if "max" is set)
4693  * of "bmap" over the domain "dom" and return the result as a map.
4694  * If "empty" is not NULL, then *empty is assigned a set that
4695  * contains those parts of the domain where there is no solution.
4696  * If "bmap" is marked as rational (ISL_BASIC_MAP_RATIONAL),
4697  * then we compute the rational optimum.  Otherwise, we compute
4698  * the integral optimum.
4699  *
4700  * We perform some preprocessing.  As the PILP solver does not
4701  * handle implicit equalities very well, we first make sure all
4702  * the equalities are explicitly available.
4703  *
4704  * We also add context constraints to the basic map and remove
4705  * redundant constraints.  This is only needed because of the
4706  * way we handle simple symmetries.  In particular, we currently look
4707  * for symmetries on the constraints, before we set up the main tableau.
4708  * It is then no good to look for symmetries on possibly redundant constraints.
4709  */
4710 struct isl_map *isl_tab_basic_map_partial_lexopt(
4711                 struct isl_basic_map *bmap, struct isl_basic_set *dom,
4712                 struct isl_set **empty, int max)
4713 {
4714         if (empty)
4715                 *empty = NULL;
4716         if (!bmap || !dom)
4717                 goto error;
4718
4719         isl_assert(bmap->ctx,
4720             isl_basic_map_compatible_domain(bmap, dom), goto error);
4721
4722         if (isl_basic_set_dim(dom, isl_dim_all) == 0)
4723                 return basic_map_partial_lexopt(bmap, dom, empty, max);
4724
4725         bmap = isl_basic_map_intersect_domain(bmap, isl_basic_set_copy(dom));
4726         bmap = isl_basic_map_detect_equalities(bmap);
4727         bmap = isl_basic_map_remove_redundancies(bmap);
4728
4729         return basic_map_partial_lexopt(bmap, dom, empty, max);
4730 error:
4731         isl_basic_set_free(dom);
4732         isl_basic_map_free(bmap);
4733         return NULL;
4734 }
4735
4736 struct isl_sol_for {
4737         struct isl_sol  sol;
4738         int             (*fn)(__isl_take isl_basic_set *dom,
4739                                 __isl_take isl_aff_list *list, void *user);
4740         void            *user;
4741 };
4742
4743 static void sol_for_free(struct isl_sol_for *sol_for)
4744 {
4745         if (sol_for->sol.context)
4746                 sol_for->sol.context->op->free(sol_for->sol.context);
4747         free(sol_for);
4748 }
4749
4750 static void sol_for_free_wrap(struct isl_sol *sol)
4751 {
4752         sol_for_free((struct isl_sol_for *)sol);
4753 }
4754
4755 /* Add the solution identified by the tableau and the context tableau.
4756  *
4757  * See documentation of sol_add for more details.
4758  *
4759  * Instead of constructing a basic map, this function calls a user
4760  * defined function with the current context as a basic set and
4761  * a list of affine expressions representing the relation between
4762  * the input and output.  The space over which the affine expressions
4763  * are defined is the same as that of the domain.  The number of
4764  * affine expressions in the list is equal to the number of output variables.
4765  */
4766 static void sol_for_add(struct isl_sol_for *sol,
4767         struct isl_basic_set *dom, struct isl_mat *M)
4768 {
4769         int i;
4770         isl_ctx *ctx;
4771         isl_local_space *ls;
4772         isl_aff *aff;
4773         isl_aff_list *list;
4774
4775         if (sol->sol.error || !dom || !M)
4776                 goto error;
4777
4778         ctx = isl_basic_set_get_ctx(dom);
4779         ls = isl_basic_set_get_local_space(dom);
4780         list = isl_aff_list_alloc(ctx, M->n_row - 1);
4781         for (i = 1; i < M->n_row; ++i) {
4782                 aff = isl_aff_alloc(isl_local_space_copy(ls));
4783                 if (aff) {
4784                         isl_int_set(aff->v->el[0], M->row[0][0]);
4785                         isl_seq_cpy(aff->v->el + 1, M->row[i], M->n_col);
4786                 }
4787                 aff = isl_aff_normalize(aff);
4788                 list = isl_aff_list_add(list, aff);
4789         }
4790         isl_local_space_free(ls);
4791
4792         dom = isl_basic_set_finalize(dom);
4793
4794         if (sol->fn(isl_basic_set_copy(dom), list, sol->user) < 0)
4795                 goto error;
4796
4797         isl_basic_set_free(dom);
4798         isl_mat_free(M);
4799         return;
4800 error:
4801         isl_basic_set_free(dom);
4802         isl_mat_free(M);
4803         sol->sol.error = 1;
4804 }
4805
4806 static void sol_for_add_wrap(struct isl_sol *sol,
4807         struct isl_basic_set *dom, struct isl_mat *M)
4808 {
4809         sol_for_add((struct isl_sol_for *)sol, dom, M);
4810 }
4811
4812 static struct isl_sol_for *sol_for_init(struct isl_basic_map *bmap, int max,
4813         int (*fn)(__isl_take isl_basic_set *dom, __isl_take isl_aff_list *list,
4814                   void *user),
4815         void *user)
4816 {
4817         struct isl_sol_for *sol_for = NULL;
4818         isl_space *dom_dim;
4819         struct isl_basic_set *dom = NULL;
4820
4821         sol_for = isl_calloc_type(bmap->ctx, struct isl_sol_for);
4822         if (!sol_for)
4823                 goto error;
4824
4825         dom_dim = isl_space_domain(isl_space_copy(bmap->dim));
4826         dom = isl_basic_set_universe(dom_dim);
4827
4828         sol_for->sol.rational = ISL_F_ISSET(bmap, ISL_BASIC_MAP_RATIONAL);
4829         sol_for->sol.dec_level.callback.run = &sol_dec_level_wrap;
4830         sol_for->sol.dec_level.sol = &sol_for->sol;
4831         sol_for->fn = fn;
4832         sol_for->user = user;
4833         sol_for->sol.max = max;
4834         sol_for->sol.n_out = isl_basic_map_dim(bmap, isl_dim_out);
4835         sol_for->sol.add = &sol_for_add_wrap;
4836         sol_for->sol.add_empty = NULL;
4837         sol_for->sol.free = &sol_for_free_wrap;
4838
4839         sol_for->sol.context = isl_context_alloc(dom);
4840         if (!sol_for->sol.context)
4841                 goto error;
4842
4843         isl_basic_set_free(dom);
4844         return sol_for;
4845 error:
4846         isl_basic_set_free(dom);
4847         sol_for_free(sol_for);
4848         return NULL;
4849 }
4850
4851 static void sol_for_find_solutions(struct isl_sol_for *sol_for,
4852         struct isl_tab *tab)
4853 {
4854         find_solutions_main(&sol_for->sol, tab);
4855 }
4856
4857 int isl_basic_map_foreach_lexopt(__isl_keep isl_basic_map *bmap, int max,
4858         int (*fn)(__isl_take isl_basic_set *dom, __isl_take isl_aff_list *list,
4859                   void *user),
4860         void *user)
4861 {
4862         struct isl_sol_for *sol_for = NULL;
4863
4864         bmap = isl_basic_map_copy(bmap);
4865         bmap = isl_basic_map_detect_equalities(bmap);
4866         if (!bmap)
4867                 return -1;
4868
4869         sol_for = sol_for_init(bmap, max, fn, user);
4870         if (!sol_for)
4871                 goto error;
4872
4873         if (isl_basic_map_plain_is_empty(bmap))
4874                 /* nothing */;
4875         else {
4876                 struct isl_tab *tab;
4877                 struct isl_context *context = sol_for->sol.context;
4878                 tab = tab_for_lexmin(bmap,
4879                                 context->op->peek_basic_set(context), 1, max);
4880                 tab = context->op->detect_nonnegative_parameters(context, tab);
4881                 sol_for_find_solutions(sol_for, tab);
4882                 if (sol_for->sol.error)
4883                         goto error;
4884         }
4885
4886         sol_free(&sol_for->sol);
4887         isl_basic_map_free(bmap);
4888         return 0;
4889 error:
4890         sol_free(&sol_for->sol);
4891         isl_basic_map_free(bmap);
4892         return -1;
4893 }
4894
4895 int isl_basic_set_foreach_lexopt(__isl_keep isl_basic_set *bset, int max,
4896         int (*fn)(__isl_take isl_basic_set *dom, __isl_take isl_aff_list *list,
4897                   void *user),
4898         void *user)
4899 {
4900         return isl_basic_map_foreach_lexopt(bset, max, fn, user);
4901 }
4902
4903 /* Check if the given sequence of len variables starting at pos
4904  * represents a trivial (i.e., zero) solution.
4905  * The variables are assumed to be non-negative and to come in pairs,
4906  * with each pair representing a variable of unrestricted sign.
4907  * The solution is trivial if each such pair in the sequence consists
4908  * of two identical values, meaning that the variable being represented
4909  * has value zero.
4910  */
4911 static int region_is_trivial(struct isl_tab *tab, int pos, int len)
4912 {
4913         int i;
4914
4915         if (len == 0)
4916                 return 0;
4917
4918         for (i = 0; i < len; i +=  2) {
4919                 int neg_row;
4920                 int pos_row;
4921
4922                 neg_row = tab->var[pos + i].is_row ?
4923                                 tab->var[pos + i].index : -1;
4924                 pos_row = tab->var[pos + i + 1].is_row ?
4925                                 tab->var[pos + i + 1].index : -1;
4926
4927                 if ((neg_row < 0 ||
4928                      isl_int_is_zero(tab->mat->row[neg_row][1])) &&
4929                     (pos_row < 0 ||
4930                      isl_int_is_zero(tab->mat->row[pos_row][1])))
4931                         continue;
4932
4933                 if (neg_row < 0 || pos_row < 0)
4934                         return 0;
4935                 if (isl_int_ne(tab->mat->row[neg_row][1],
4936                                tab->mat->row[pos_row][1]))
4937                         return 0;
4938         }
4939
4940         return 1;
4941 }
4942
4943 /* Return the index of the first trivial region or -1 if all regions
4944  * are non-trivial.
4945  */
4946 static int first_trivial_region(struct isl_tab *tab,
4947         int n_region, struct isl_region *region)
4948 {
4949         int i;
4950
4951         for (i = 0; i < n_region; ++i) {
4952                 if (region_is_trivial(tab, region[i].pos, region[i].len))
4953                         return i;
4954         }
4955
4956         return -1;
4957 }
4958
4959 /* Check if the solution is optimal, i.e., whether the first
4960  * n_op entries are zero.
4961  */
4962 static int is_optimal(__isl_keep isl_vec *sol, int n_op)
4963 {
4964         int i;
4965
4966         for (i = 0; i < n_op; ++i)
4967                 if (!isl_int_is_zero(sol->el[1 + i]))
4968                         return 0;
4969         return 1;
4970 }
4971
4972 /* Add constraints to "tab" that ensure that any solution is significantly
4973  * better that that represented by "sol".  That is, find the first
4974  * relevant (within first n_op) non-zero coefficient and force it (along
4975  * with all previous coefficients) to be zero.
4976  * If the solution is already optimal (all relevant coefficients are zero),
4977  * then just mark the table as empty.
4978  */
4979 static int force_better_solution(struct isl_tab *tab,
4980         __isl_keep isl_vec *sol, int n_op)
4981 {
4982         int i;
4983         isl_ctx *ctx;
4984         isl_vec *v = NULL;
4985
4986         if (!sol)
4987                 return -1;
4988
4989         for (i = 0; i < n_op; ++i)
4990                 if (!isl_int_is_zero(sol->el[1 + i]))
4991                         break;
4992
4993         if (i == n_op) {
4994                 if (isl_tab_mark_empty(tab) < 0)
4995                         return -1;
4996                 return 0;
4997         }
4998
4999         ctx = isl_vec_get_ctx(sol);
5000         v = isl_vec_alloc(ctx, 1 + tab->n_var);
5001         if (!v)
5002                 return -1;
5003
5004         for (; i >= 0; --i) {
5005                 v = isl_vec_clr(v);
5006                 isl_int_set_si(v->el[1 + i], -1);
5007                 if (add_lexmin_eq(tab, v->el) < 0)
5008                         goto error;
5009         }
5010
5011         isl_vec_free(v);
5012         return 0;
5013 error:
5014         isl_vec_free(v);
5015         return -1;
5016 }
5017
5018 struct isl_trivial {
5019         int update;
5020         int region;
5021         int side;
5022         struct isl_tab_undo *snap;
5023 };
5024
5025 /* Return the lexicographically smallest non-trivial solution of the
5026  * given ILP problem.
5027  *
5028  * All variables are assumed to be non-negative.
5029  *
5030  * n_op is the number of initial coordinates to optimize.
5031  * That is, once a solution has been found, we will only continue looking
5032  * for solution that result in significantly better values for those
5033  * initial coordinates.  That is, we only continue looking for solutions
5034  * that increase the number of initial zeros in this sequence.
5035  *
5036  * A solution is non-trivial, if it is non-trivial on each of the
5037  * specified regions.  Each region represents a sequence of pairs
5038  * of variables.  A solution is non-trivial on such a region if
5039  * at least one of these pairs consists of different values, i.e.,
5040  * such that the non-negative variable represented by the pair is non-zero.
5041  *
5042  * Whenever a conflict is encountered, all constraints involved are
5043  * reported to the caller through a call to "conflict".
5044  *
5045  * We perform a simple branch-and-bound backtracking search.
5046  * Each level in the search represents initially trivial region that is forced
5047  * to be non-trivial.
5048  * At each level we consider n cases, where n is the length of the region.
5049  * In terms of the n/2 variables of unrestricted signs being encoded by
5050  * the region, we consider the cases
5051  *      x_0 >= 1
5052  *      x_0 <= -1
5053  *      x_0 = 0 and x_1 >= 1
5054  *      x_0 = 0 and x_1 <= -1
5055  *      x_0 = 0 and x_1 = 0 and x_2 >= 1
5056  *      x_0 = 0 and x_1 = 0 and x_2 <= -1
5057  *      ...
5058  * The cases are considered in this order, assuming that each pair
5059  * x_i_a x_i_b represents the value x_i_b - x_i_a.
5060  * That is, x_0 >= 1 is enforced by adding the constraint
5061  *      x_0_b - x_0_a >= 1
5062  */
5063 __isl_give isl_vec *isl_tab_basic_set_non_trivial_lexmin(
5064         __isl_take isl_basic_set *bset, int n_op, int n_region,
5065         struct isl_region *region,
5066         int (*conflict)(int con, void *user), void *user)
5067 {
5068         int i, j;
5069         int r;
5070         isl_ctx *ctx;
5071         isl_vec *v = NULL;
5072         isl_vec *sol = NULL;
5073         struct isl_tab *tab;
5074         struct isl_trivial *triv = NULL;
5075         int level, init;
5076
5077         if (!bset)
5078                 return NULL;
5079
5080         ctx = isl_basic_set_get_ctx(bset);
5081         sol = isl_vec_alloc(ctx, 0);
5082
5083         tab = tab_for_lexmin(bset, NULL, 0, 0);
5084         if (!tab)
5085                 goto error;
5086         tab->conflict = conflict;
5087         tab->conflict_user = user;
5088
5089         v = isl_vec_alloc(ctx, 1 + tab->n_var);
5090         triv = isl_calloc_array(ctx, struct isl_trivial, n_region);
5091         if (!v || !triv)
5092                 goto error;
5093
5094         level = 0;
5095         init = 1;
5096
5097         while (level >= 0) {
5098                 int side, base;
5099
5100                 if (init) {
5101                         tab = cut_to_integer_lexmin(tab, CUT_ONE);
5102                         if (!tab)
5103                                 goto error;
5104                         if (tab->empty)
5105                                 goto backtrack;
5106                         r = first_trivial_region(tab, n_region, region);
5107                         if (r < 0) {
5108                                 for (i = 0; i < level; ++i)
5109                                         triv[i].update = 1;
5110                                 isl_vec_free(sol);
5111                                 sol = isl_tab_get_sample_value(tab);
5112                                 if (!sol)
5113                                         goto error;
5114                                 if (is_optimal(sol, n_op))
5115                                         break;
5116                                 goto backtrack;
5117                         }
5118                         if (level >= n_region)
5119                                 isl_die(ctx, isl_error_internal,
5120                                         "nesting level too deep", goto error);
5121                         if (isl_tab_extend_cons(tab,
5122                                             2 * region[r].len + 2 * n_op) < 0)
5123                                 goto error;
5124                         triv[level].region = r;
5125                         triv[level].side = 0;
5126                 }
5127
5128                 r = triv[level].region;
5129                 side = triv[level].side;
5130                 base = 2 * (side/2);
5131
5132                 if (side >= region[r].len) {
5133 backtrack:
5134                         level--;
5135                         init = 0;
5136                         if (level >= 0)
5137                                 if (isl_tab_rollback(tab, triv[level].snap) < 0)
5138                                         goto error;
5139                         continue;
5140                 }
5141
5142                 if (triv[level].update) {
5143                         if (force_better_solution(tab, sol, n_op) < 0)
5144                                 goto error;
5145                         triv[level].update = 0;
5146                 }
5147
5148                 if (side == base && base >= 2) {
5149                         for (j = base - 2; j < base; ++j) {
5150                                 v = isl_vec_clr(v);
5151                                 isl_int_set_si(v->el[1 + region[r].pos + j], 1);
5152                                 if (add_lexmin_eq(tab, v->el) < 0)
5153                                         goto error;
5154                         }
5155                 }
5156
5157                 triv[level].snap = isl_tab_snap(tab);
5158                 if (isl_tab_push_basis(tab) < 0)
5159                         goto error;
5160
5161                 v = isl_vec_clr(v);
5162                 isl_int_set_si(v->el[0], -1);
5163                 isl_int_set_si(v->el[1 + region[r].pos + side], -1);
5164                 isl_int_set_si(v->el[1 + region[r].pos + (side ^ 1)], 1);
5165                 tab = add_lexmin_ineq(tab, v->el);
5166
5167                 triv[level].side++;
5168                 level++;
5169                 init = 1;
5170         }
5171
5172         free(triv);
5173         isl_vec_free(v);
5174         isl_tab_free(tab);
5175         isl_basic_set_free(bset);
5176
5177         return sol;
5178 error:
5179         free(triv);
5180         isl_vec_free(v);
5181         isl_tab_free(tab);
5182         isl_basic_set_free(bset);
5183         isl_vec_free(sol);
5184         return NULL;
5185 }
5186
5187 /* Return the lexicographically smallest rational point in "bset",
5188  * assuming that all variables are non-negative.
5189  * If "bset" is empty, then return a zero-length vector.
5190  */
5191 __isl_give isl_vec *isl_tab_basic_set_non_neg_lexmin(
5192         __isl_take isl_basic_set *bset)
5193 {
5194         struct isl_tab *tab;
5195         isl_ctx *ctx = isl_basic_set_get_ctx(bset);
5196         isl_vec *sol;
5197
5198         if (!bset)
5199                 return NULL;
5200
5201         tab = tab_for_lexmin(bset, NULL, 0, 0);
5202         if (!tab)
5203                 goto error;
5204         if (tab->empty)
5205                 sol = isl_vec_alloc(ctx, 0);
5206         else
5207                 sol = isl_tab_get_sample_value(tab);
5208         isl_tab_free(tab);
5209         isl_basic_set_free(bset);
5210         return sol;
5211 error:
5212         isl_tab_free(tab);
5213         isl_basic_set_free(bset);
5214         return NULL;
5215 }
5216
5217 struct isl_sol_pma {
5218         struct isl_sol  sol;
5219         isl_pw_multi_aff *pma;
5220         isl_set *empty;
5221 };
5222
5223 static void sol_pma_free(struct isl_sol_pma *sol_pma)
5224 {
5225         if (!sol_pma)
5226                 return;
5227         if (sol_pma->sol.context)
5228                 sol_pma->sol.context->op->free(sol_pma->sol.context);
5229         isl_pw_multi_aff_free(sol_pma->pma);
5230         isl_set_free(sol_pma->empty);
5231         free(sol_pma);
5232 }
5233
5234 /* This function is called for parts of the context where there is
5235  * no solution, with "bset" corresponding to the context tableau.
5236  * Simply add the basic set to the set "empty".
5237  */
5238 static void sol_pma_add_empty(struct isl_sol_pma *sol,
5239         __isl_take isl_basic_set *bset)
5240 {
5241         if (!bset)
5242                 goto error;
5243         isl_assert(bset->ctx, sol->empty, goto error);
5244
5245         sol->empty = isl_set_grow(sol->empty, 1);
5246         bset = isl_basic_set_simplify(bset);
5247         bset = isl_basic_set_finalize(bset);
5248         sol->empty = isl_set_add_basic_set(sol->empty, bset);
5249         if (!sol->empty)
5250                 sol->sol.error = 1;
5251         return;
5252 error:
5253         isl_basic_set_free(bset);
5254         sol->sol.error = 1;
5255 }
5256
5257 /* Given a basic map "dom" that represents the context and an affine
5258  * matrix "M" that maps the dimensions of the context to the
5259  * output variables, construct an isl_pw_multi_aff with a single
5260  * cell corresponding to "dom" and affine expressions copied from "M".
5261  */
5262 static void sol_pma_add(struct isl_sol_pma *sol,
5263         __isl_take isl_basic_set *dom, __isl_take isl_mat *M)
5264 {
5265         int i;
5266         isl_local_space *ls;
5267         isl_aff *aff;
5268         isl_multi_aff *maff;
5269         isl_pw_multi_aff *pma;
5270
5271         maff = isl_multi_aff_alloc(isl_pw_multi_aff_get_space(sol->pma));
5272         ls = isl_basic_set_get_local_space(dom);
5273         for (i = 1; i < M->n_row; ++i) {
5274                 aff = isl_aff_alloc(isl_local_space_copy(ls));
5275                 if (aff) {
5276                         isl_int_set(aff->v->el[0], M->row[0][0]);
5277                         isl_seq_cpy(aff->v->el + 1, M->row[i], M->n_col);
5278                 }
5279                 aff = isl_aff_normalize(aff);
5280                 maff = isl_multi_aff_set_aff(maff, i - 1, aff);
5281         }
5282         isl_local_space_free(ls);
5283         isl_mat_free(M);
5284         dom = isl_basic_set_simplify(dom);
5285         dom = isl_basic_set_finalize(dom);
5286         pma = isl_pw_multi_aff_alloc(isl_set_from_basic_set(dom), maff);
5287         sol->pma = isl_pw_multi_aff_add_disjoint(sol->pma, pma);
5288         if (!sol->pma)
5289                 sol->sol.error = 1;
5290 }
5291
5292 static void sol_pma_free_wrap(struct isl_sol *sol)
5293 {
5294         sol_pma_free((struct isl_sol_pma *)sol);
5295 }
5296
5297 static void sol_pma_add_empty_wrap(struct isl_sol *sol,
5298         __isl_take isl_basic_set *bset)
5299 {
5300         sol_pma_add_empty((struct isl_sol_pma *)sol, bset);
5301 }
5302
5303 static void sol_pma_add_wrap(struct isl_sol *sol,
5304         __isl_take isl_basic_set *dom, __isl_take isl_mat *M)
5305 {
5306         sol_pma_add((struct isl_sol_pma *)sol, dom, M);
5307 }
5308
5309 /* Construct an isl_sol_pma structure for accumulating the solution.
5310  * If track_empty is set, then we also keep track of the parts
5311  * of the context where there is no solution.
5312  * If max is set, then we are solving a maximization, rather than
5313  * a minimization problem, which means that the variables in the
5314  * tableau have value "M - x" rather than "M + x".
5315  */
5316 static struct isl_sol *sol_pma_init(__isl_keep isl_basic_map *bmap,
5317         __isl_take isl_basic_set *dom, int track_empty, int max)
5318 {
5319         struct isl_sol_pma *sol_pma = NULL;
5320
5321         if (!bmap)
5322                 goto error;
5323
5324         sol_pma = isl_calloc_type(bmap->ctx, struct isl_sol_pma);
5325         if (!sol_pma)
5326                 goto error;
5327
5328         sol_pma->sol.rational = ISL_F_ISSET(bmap, ISL_BASIC_MAP_RATIONAL);
5329         sol_pma->sol.dec_level.callback.run = &sol_dec_level_wrap;
5330         sol_pma->sol.dec_level.sol = &sol_pma->sol;
5331         sol_pma->sol.max = max;
5332         sol_pma->sol.n_out = isl_basic_map_dim(bmap, isl_dim_out);
5333         sol_pma->sol.add = &sol_pma_add_wrap;
5334         sol_pma->sol.add_empty = track_empty ? &sol_pma_add_empty_wrap : NULL;
5335         sol_pma->sol.free = &sol_pma_free_wrap;
5336         sol_pma->pma = isl_pw_multi_aff_empty(isl_basic_map_get_space(bmap));
5337         if (!sol_pma->pma)
5338                 goto error;
5339
5340         sol_pma->sol.context = isl_context_alloc(dom);
5341         if (!sol_pma->sol.context)
5342                 goto error;
5343
5344         if (track_empty) {
5345                 sol_pma->empty = isl_set_alloc_space(isl_basic_set_get_space(dom),
5346                                                         1, ISL_SET_DISJOINT);
5347                 if (!sol_pma->empty)
5348                         goto error;
5349         }
5350
5351         isl_basic_set_free(dom);
5352         return &sol_pma->sol;
5353 error:
5354         isl_basic_set_free(dom);
5355         sol_pma_free(sol_pma);
5356         return NULL;
5357 }
5358
5359 /* Base case of isl_tab_basic_map_partial_lexopt, after removing
5360  * some obvious symmetries.
5361  *
5362  * We call basic_map_partial_lexopt_base and extract the results.
5363  */
5364 static __isl_give isl_pw_multi_aff *basic_map_partial_lexopt_base_pma(
5365         __isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
5366         __isl_give isl_set **empty, int max)
5367 {
5368         isl_pw_multi_aff *result = NULL;
5369         struct isl_sol *sol;
5370         struct isl_sol_pma *sol_pma;
5371
5372         sol = basic_map_partial_lexopt_base(bmap, dom, empty, max,
5373                                             &sol_pma_init);
5374         if (!sol)
5375                 return NULL;
5376         sol_pma = (struct isl_sol_pma *) sol;
5377
5378         result = isl_pw_multi_aff_copy(sol_pma->pma);
5379         if (empty)
5380                 *empty = isl_set_copy(sol_pma->empty);
5381         sol_free(&sol_pma->sol);
5382         return result;
5383 }
5384
5385 /* Given that the last input variable of "maff" represents the minimum
5386  * of some bounds, check whether we need to plug in the expression
5387  * of the minimum.
5388  *
5389  * In particular, check if the last input variable appears in any
5390  * of the expressions in "maff".
5391  */
5392 static int need_substitution(__isl_keep isl_multi_aff *maff)
5393 {
5394         int i;
5395         unsigned pos;
5396
5397         pos = isl_multi_aff_dim(maff, isl_dim_in) - 1;
5398
5399         for (i = 0; i < maff->n; ++i)
5400                 if (isl_aff_involves_dims(maff->p[i], isl_dim_in, pos, 1))
5401                         return 1;
5402
5403         return 0;
5404 }
5405
5406 /* Given a set of upper bounds on the last "input" variable m,
5407  * construct a piecewise affine expression that selects
5408  * the minimal upper bound to m, i.e.,
5409  * divide the space into cells where one
5410  * of the upper bounds is smaller than all the others and select
5411  * this upper bound on that cell.
5412  *
5413  * In particular, if there are n bounds b_i, then the result
5414  * consists of n cell, each one of the form
5415  *
5416  *      b_i <= b_j      for j > i
5417  *      b_i <  b_j      for j < i
5418  *
5419  * The affine expression on this cell is
5420  *
5421  *      b_i
5422  */
5423 static __isl_give isl_pw_aff *set_minimum_pa(__isl_take isl_space *space,
5424         __isl_take isl_mat *var)
5425 {
5426         int i;
5427         isl_aff *aff = NULL;
5428         isl_basic_set *bset = NULL;
5429         isl_ctx *ctx;
5430         isl_pw_aff *paff = NULL;
5431         isl_space *pw_space;
5432         isl_local_space *ls = NULL;
5433
5434         if (!space || !var)
5435                 goto error;
5436
5437         ctx = isl_space_get_ctx(space);
5438         ls = isl_local_space_from_space(isl_space_copy(space));
5439         pw_space = isl_space_copy(space);
5440         pw_space = isl_space_from_domain(pw_space);
5441         pw_space = isl_space_add_dims(pw_space, isl_dim_out, 1);
5442         paff = isl_pw_aff_alloc_size(pw_space, var->n_row);
5443
5444         for (i = 0; i < var->n_row; ++i) {
5445                 isl_pw_aff *paff_i;
5446
5447                 aff = isl_aff_alloc(isl_local_space_copy(ls));
5448                 bset = isl_basic_set_alloc_space(isl_space_copy(space), 0,
5449                                                0, var->n_row - 1);
5450                 if (!aff || !bset)
5451                         goto error;
5452                 isl_int_set_si(aff->v->el[0], 1);
5453                 isl_seq_cpy(aff->v->el + 1, var->row[i], var->n_col);
5454                 isl_int_set_si(aff->v->el[1 + var->n_col], 0);
5455                 bset = select_minimum(bset, var, i);
5456                 paff_i = isl_pw_aff_alloc(isl_set_from_basic_set(bset), aff);
5457                 paff = isl_pw_aff_add_disjoint(paff, paff_i);
5458         }
5459
5460         isl_local_space_free(ls);
5461         isl_space_free(space);
5462         isl_mat_free(var);
5463         return paff;
5464 error:
5465         isl_aff_free(aff);
5466         isl_basic_set_free(bset);
5467         isl_pw_aff_free(paff);
5468         isl_local_space_free(ls);
5469         isl_space_free(space);
5470         isl_mat_free(var);
5471         return NULL;
5472 }
5473
5474 /* Given a piecewise multi-affine expression of which the last input variable
5475  * is the minimum of the bounds in "cst", plug in the value of the minimum.
5476  * This minimum expression is given in "min_expr_pa".
5477  * The set "min_expr" contains the same information, but in the form of a set.
5478  * The variable is subsequently projected out.
5479  *
5480  * The implementation is similar to those of "split" and "split_domain".
5481  * If the variable appears in a given expression, then minimum expression
5482  * is plugged in.  Otherwise, if the variable appears in the constraints
5483  * and a split is required, then the domain is split.  Otherwise, no split
5484  * is performed.
5485  */
5486 static __isl_give isl_pw_multi_aff *split_domain_pma(
5487         __isl_take isl_pw_multi_aff *opt, __isl_take isl_pw_aff *min_expr_pa,
5488         __isl_take isl_set *min_expr, __isl_take isl_mat *cst)
5489 {
5490         int n_in;
5491         int i;
5492         isl_space *space;
5493         isl_pw_multi_aff *res;
5494
5495         if (!opt || !min_expr || !cst)
5496                 goto error;
5497
5498         n_in = isl_pw_multi_aff_dim(opt, isl_dim_in);
5499         space = isl_pw_multi_aff_get_space(opt);
5500         space = isl_space_drop_dims(space, isl_dim_in, n_in - 1, 1);
5501         res = isl_pw_multi_aff_empty(space);
5502
5503         for (i = 0; i < opt->n; ++i) {
5504                 isl_pw_multi_aff *pma;
5505
5506                 pma = isl_pw_multi_aff_alloc(isl_set_copy(opt->p[i].set),
5507                                          isl_multi_aff_copy(opt->p[i].maff));
5508                 if (need_substitution(opt->p[i].maff))
5509                         pma = isl_pw_multi_aff_substitute(pma,
5510                                         isl_dim_in, n_in - 1, min_expr_pa);
5511                 else if (need_split_set(opt->p[i].set, cst))
5512                         pma = isl_pw_multi_aff_intersect_domain(pma,
5513                                                        isl_set_copy(min_expr));
5514                 pma = isl_pw_multi_aff_project_out(pma,
5515                                                     isl_dim_in, n_in - 1, 1);
5516
5517                 res = isl_pw_multi_aff_add_disjoint(res, pma);
5518         }
5519
5520         isl_pw_multi_aff_free(opt);
5521         isl_pw_aff_free(min_expr_pa);
5522         isl_set_free(min_expr);
5523         isl_mat_free(cst);
5524         return res;
5525 error:
5526         isl_pw_multi_aff_free(opt);
5527         isl_pw_aff_free(min_expr_pa);
5528         isl_set_free(min_expr);
5529         isl_mat_free(cst);
5530         return NULL;
5531 }
5532
5533 static __isl_give isl_pw_multi_aff *basic_map_partial_lexopt_pma(
5534         __isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
5535         __isl_give isl_set **empty, int max);
5536
5537 /* This function is called from basic_map_partial_lexopt_symm.
5538  * The last variable of "bmap" and "dom" corresponds to the minimum
5539  * of the bounds in "cst".  "map_space" is the space of the original
5540  * input relation (of basic_map_partial_lexopt_symm) and "set_space"
5541  * is the space of the original domain.
5542  *
5543  * We recursively call basic_map_partial_lexopt and then plug in
5544  * the definition of the minimum in the result.
5545  */
5546 static __isl_give union isl_lex_res basic_map_partial_lexopt_symm_pma_core(
5547         __isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
5548         __isl_give isl_set **empty, int max, __isl_take isl_mat *cst,
5549         __isl_take isl_space *map_space, __isl_take isl_space *set_space)
5550 {
5551         isl_pw_multi_aff *opt;
5552         isl_pw_aff *min_expr_pa;
5553         isl_set *min_expr;
5554         union isl_lex_res res;
5555
5556         min_expr = set_minimum(isl_basic_set_get_space(dom), isl_mat_copy(cst));
5557         min_expr_pa = set_minimum_pa(isl_basic_set_get_space(dom),
5558                                         isl_mat_copy(cst));
5559
5560         opt = basic_map_partial_lexopt_pma(bmap, dom, empty, max);
5561
5562         if (empty) {
5563                 *empty = split(*empty,
5564                                isl_set_copy(min_expr), isl_mat_copy(cst));
5565                 *empty = isl_set_reset_space(*empty, set_space);
5566         }
5567
5568         opt = split_domain_pma(opt, min_expr_pa, min_expr, cst);
5569         opt = isl_pw_multi_aff_reset_space(opt, map_space);
5570
5571         res.pma = opt;
5572         return res;
5573 }
5574
5575 static __isl_give isl_pw_multi_aff *basic_map_partial_lexopt_symm_pma(
5576         __isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
5577         __isl_give isl_set **empty, int max, int first, int second)
5578 {
5579         return basic_map_partial_lexopt_symm(bmap, dom, empty, max,
5580                     first, second, &basic_map_partial_lexopt_symm_pma_core).pma;
5581 }
5582
5583 /* Recursive part of isl_basic_map_partial_lexopt_pw_multi_aff, after detecting
5584  * equalities and removing redundant constraints.
5585  *
5586  * We first check if there are any parallel constraints (left).
5587  * If not, we are in the base case.
5588  * If there are parallel constraints, we replace them by a single
5589  * constraint in basic_map_partial_lexopt_symm_pma and then call
5590  * this function recursively to look for more parallel constraints.
5591  */
5592 static __isl_give isl_pw_multi_aff *basic_map_partial_lexopt_pma(
5593         __isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
5594         __isl_give isl_set **empty, int max)
5595 {
5596         int par = 0;
5597         int first, second;
5598
5599         if (!bmap)
5600                 goto error;
5601
5602         if (bmap->ctx->opt->pip_symmetry)
5603                 par = parallel_constraints(bmap, &first, &second);
5604         if (par < 0)
5605                 goto error;
5606         if (!par)
5607                 return basic_map_partial_lexopt_base_pma(bmap, dom, empty, max);
5608         
5609         return basic_map_partial_lexopt_symm_pma(bmap, dom, empty, max,
5610                                                  first, second);
5611 error:
5612         isl_basic_set_free(dom);
5613         isl_basic_map_free(bmap);
5614         return NULL;
5615 }
5616
5617 /* Compute the lexicographic minimum (or maximum if "max" is set)
5618  * of "bmap" over the domain "dom" and return the result as a piecewise
5619  * multi-affine expression.
5620  * If "empty" is not NULL, then *empty is assigned a set that
5621  * contains those parts of the domain where there is no solution.
5622  * If "bmap" is marked as rational (ISL_BASIC_MAP_RATIONAL),
5623  * then we compute the rational optimum.  Otherwise, we compute
5624  * the integral optimum.
5625  *
5626  * We perform some preprocessing.  As the PILP solver does not
5627  * handle implicit equalities very well, we first make sure all
5628  * the equalities are explicitly available.
5629  *
5630  * We also add context constraints to the basic map and remove
5631  * redundant constraints.  This is only needed because of the
5632  * way we handle simple symmetries.  In particular, we currently look
5633  * for symmetries on the constraints, before we set up the main tableau.
5634  * It is then no good to look for symmetries on possibly redundant constraints.
5635  */
5636 __isl_give isl_pw_multi_aff *isl_basic_map_partial_lexopt_pw_multi_aff(
5637         __isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
5638         __isl_give isl_set **empty, int max)
5639 {
5640         if (empty)
5641                 *empty = NULL;
5642         if (!bmap || !dom)
5643                 goto error;
5644
5645         isl_assert(bmap->ctx,
5646             isl_basic_map_compatible_domain(bmap, dom), goto error);
5647
5648         if (isl_basic_set_dim(dom, isl_dim_all) == 0)
5649                 return basic_map_partial_lexopt_pma(bmap, dom, empty, max);
5650
5651         bmap = isl_basic_map_intersect_domain(bmap, isl_basic_set_copy(dom));
5652         bmap = isl_basic_map_detect_equalities(bmap);
5653         bmap = isl_basic_map_remove_redundancies(bmap);
5654
5655         return basic_map_partial_lexopt_pma(bmap, dom, empty, max);
5656 error:
5657         isl_basic_set_free(dom);
5658         isl_basic_map_free(bmap);
5659         return NULL;
5660 }