isl_basic_set_opt: avoid invalid access on error path
[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         if (!cgbr->tab)
2733                 return 0;
2734         return cgbr->tab->bmap->n_eq == 0 && cgbr->tab->bmap->n_div == 0;
2735 }
2736
2737 static struct isl_vec *gbr_get_sample(struct isl_context_gbr *cgbr)
2738 {
2739         struct isl_basic_set *bset;
2740         struct isl_basic_set *cone;
2741
2742         if (isl_tab_sample_is_integer(cgbr->tab))
2743                 return isl_tab_get_sample_value(cgbr->tab);
2744
2745         if (use_shifted(cgbr)) {
2746                 struct isl_vec *sample;
2747
2748                 sample = gbr_get_shifted_sample(cgbr);
2749                 if (!sample || sample->size > 0)
2750                         return sample;
2751
2752                 isl_vec_free(sample);
2753         }
2754
2755         if (!cgbr->cone) {
2756                 bset = isl_tab_peek_bset(cgbr->tab);
2757                 cgbr->cone = isl_tab_from_recession_cone(bset, 0);
2758                 if (!cgbr->cone)
2759                         return NULL;
2760                 if (isl_tab_track_bset(cgbr->cone,
2761                                         isl_basic_set_copy(bset)) < 0)
2762                         return NULL;
2763         }
2764         if (isl_tab_detect_implicit_equalities(cgbr->cone) < 0)
2765                 return NULL;
2766
2767         if (cgbr->cone->n_dead == cgbr->cone->n_col) {
2768                 struct isl_vec *sample;
2769                 struct isl_tab_undo *snap;
2770
2771                 if (cgbr->tab->basis) {
2772                         if (cgbr->tab->basis->n_col != 1 + cgbr->tab->n_var) {
2773                                 isl_mat_free(cgbr->tab->basis);
2774                                 cgbr->tab->basis = NULL;
2775                         }
2776                         cgbr->tab->n_zero = 0;
2777                         cgbr->tab->n_unbounded = 0;
2778                 }
2779
2780                 snap = isl_tab_snap(cgbr->tab);
2781
2782                 sample = isl_tab_sample(cgbr->tab);
2783
2784                 if (isl_tab_rollback(cgbr->tab, snap) < 0) {
2785                         isl_vec_free(sample);
2786                         return NULL;
2787                 }
2788
2789                 return sample;
2790         }
2791
2792         cone = isl_basic_set_dup(isl_tab_peek_bset(cgbr->cone));
2793         cone = drop_constant_terms(cone);
2794         cone = isl_basic_set_update_from_tab(cone, cgbr->cone);
2795         cone = isl_basic_set_underlying_set(cone);
2796         cone = isl_basic_set_gauss(cone, NULL);
2797
2798         bset = isl_basic_set_dup(isl_tab_peek_bset(cgbr->tab));
2799         bset = isl_basic_set_update_from_tab(bset, cgbr->tab);
2800         bset = isl_basic_set_underlying_set(bset);
2801         bset = isl_basic_set_gauss(bset, NULL);
2802
2803         return isl_basic_set_sample_with_cone(bset, cone);
2804 }
2805
2806 static void check_gbr_integer_feasible(struct isl_context_gbr *cgbr)
2807 {
2808         struct isl_vec *sample;
2809
2810         if (!cgbr->tab)
2811                 return;
2812
2813         if (cgbr->tab->empty)
2814                 return;
2815
2816         sample = gbr_get_sample(cgbr);
2817         if (!sample)
2818                 goto error;
2819
2820         if (sample->size == 0) {
2821                 isl_vec_free(sample);
2822                 if (isl_tab_mark_empty(cgbr->tab) < 0)
2823                         goto error;
2824                 return;
2825         }
2826
2827         cgbr->tab = isl_tab_add_sample(cgbr->tab, sample);
2828
2829         return;
2830 error:
2831         isl_tab_free(cgbr->tab);
2832         cgbr->tab = NULL;
2833 }
2834
2835 static struct isl_tab *add_gbr_eq(struct isl_tab *tab, isl_int *eq)
2836 {
2837         if (!tab)
2838                 return NULL;
2839
2840         if (isl_tab_extend_cons(tab, 2) < 0)
2841                 goto error;
2842
2843         if (isl_tab_add_eq(tab, eq) < 0)
2844                 goto error;
2845
2846         return tab;
2847 error:
2848         isl_tab_free(tab);
2849         return NULL;
2850 }
2851
2852 /* Add the equality described by "eq" to the context.
2853  * If "check" is set, then we check if the context is empty after
2854  * adding the equality.
2855  * If "update" is set, then we check if the samples are still valid.
2856  *
2857  * We do not explicitly add shifted copies of the equality to
2858  * cgbr->shifted since they would conflict with each other.
2859  * Instead, we directly mark cgbr->shifted empty.
2860  */
2861 static void context_gbr_add_eq(struct isl_context *context, isl_int *eq,
2862                 int check, int update)
2863 {
2864         struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
2865
2866         cgbr->tab = add_gbr_eq(cgbr->tab, eq);
2867
2868         if (cgbr->shifted && !cgbr->shifted->empty && use_shifted(cgbr)) {
2869                 if (isl_tab_mark_empty(cgbr->shifted) < 0)
2870                         goto error;
2871         }
2872
2873         if (cgbr->cone && cgbr->cone->n_col != cgbr->cone->n_dead) {
2874                 if (isl_tab_extend_cons(cgbr->cone, 2) < 0)
2875                         goto error;
2876                 if (isl_tab_add_eq(cgbr->cone, eq) < 0)
2877                         goto error;
2878         }
2879
2880         if (check) {
2881                 int v = tab_has_valid_sample(cgbr->tab, eq, 1);
2882                 if (v < 0)
2883                         goto error;
2884                 if (!v)
2885                         check_gbr_integer_feasible(cgbr);
2886         }
2887         if (update)
2888                 cgbr->tab = check_samples(cgbr->tab, eq, 1);
2889         return;
2890 error:
2891         isl_tab_free(cgbr->tab);
2892         cgbr->tab = NULL;
2893 }
2894
2895 static void add_gbr_ineq(struct isl_context_gbr *cgbr, isl_int *ineq)
2896 {
2897         if (!cgbr->tab)
2898                 return;
2899
2900         if (isl_tab_extend_cons(cgbr->tab, 1) < 0)
2901                 goto error;
2902
2903         if (isl_tab_add_ineq(cgbr->tab, ineq) < 0)
2904                 goto error;
2905
2906         if (cgbr->shifted && !cgbr->shifted->empty && use_shifted(cgbr)) {
2907                 int i;
2908                 unsigned dim;
2909                 dim = isl_basic_map_total_dim(cgbr->tab->bmap);
2910
2911                 if (isl_tab_extend_cons(cgbr->shifted, 1) < 0)
2912                         goto error;
2913
2914                 for (i = 0; i < dim; ++i) {
2915                         if (!isl_int_is_neg(ineq[1 + i]))
2916                                 continue;
2917                         isl_int_add(ineq[0], ineq[0], ineq[1 + i]);
2918                 }
2919
2920                 if (isl_tab_add_ineq(cgbr->shifted, ineq) < 0)
2921                         goto error;
2922
2923                 for (i = 0; i < dim; ++i) {
2924                         if (!isl_int_is_neg(ineq[1 + i]))
2925                                 continue;
2926                         isl_int_sub(ineq[0], ineq[0], ineq[1 + i]);
2927                 }
2928         }
2929
2930         if (cgbr->cone && cgbr->cone->n_col != cgbr->cone->n_dead) {
2931                 if (isl_tab_extend_cons(cgbr->cone, 1) < 0)
2932                         goto error;
2933                 if (isl_tab_add_ineq(cgbr->cone, ineq) < 0)
2934                         goto error;
2935         }
2936
2937         return;
2938 error:
2939         isl_tab_free(cgbr->tab);
2940         cgbr->tab = NULL;
2941 }
2942
2943 static void context_gbr_add_ineq(struct isl_context *context, isl_int *ineq,
2944                 int check, int update)
2945 {
2946         struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
2947
2948         add_gbr_ineq(cgbr, ineq);
2949         if (!cgbr->tab)
2950                 return;
2951
2952         if (check) {
2953                 int v = tab_has_valid_sample(cgbr->tab, ineq, 0);
2954                 if (v < 0)
2955                         goto error;
2956                 if (!v)
2957                         check_gbr_integer_feasible(cgbr);
2958         }
2959         if (update)
2960                 cgbr->tab = check_samples(cgbr->tab, ineq, 0);
2961         return;
2962 error:
2963         isl_tab_free(cgbr->tab);
2964         cgbr->tab = NULL;
2965 }
2966
2967 static int context_gbr_add_ineq_wrap(void *user, isl_int *ineq)
2968 {
2969         struct isl_context *context = (struct isl_context *)user;
2970         context_gbr_add_ineq(context, ineq, 0, 0);
2971         return context->op->is_ok(context) ? 0 : -1;
2972 }
2973
2974 static enum isl_tab_row_sign context_gbr_ineq_sign(struct isl_context *context,
2975                         isl_int *ineq, int strict)
2976 {
2977         struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
2978         return tab_ineq_sign(cgbr->tab, ineq, strict);
2979 }
2980
2981 /* Check whether "ineq" can be added to the tableau without rendering
2982  * it infeasible.
2983  */
2984 static int context_gbr_test_ineq(struct isl_context *context, isl_int *ineq)
2985 {
2986         struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
2987         struct isl_tab_undo *snap;
2988         struct isl_tab_undo *shifted_snap = NULL;
2989         struct isl_tab_undo *cone_snap = NULL;
2990         int feasible;
2991
2992         if (!cgbr->tab)
2993                 return -1;
2994
2995         if (isl_tab_extend_cons(cgbr->tab, 1) < 0)
2996                 return -1;
2997
2998         snap = isl_tab_snap(cgbr->tab);
2999         if (cgbr->shifted)
3000                 shifted_snap = isl_tab_snap(cgbr->shifted);
3001         if (cgbr->cone)
3002                 cone_snap = isl_tab_snap(cgbr->cone);
3003         add_gbr_ineq(cgbr, ineq);
3004         check_gbr_integer_feasible(cgbr);
3005         if (!cgbr->tab)
3006                 return -1;
3007         feasible = !cgbr->tab->empty;
3008         if (isl_tab_rollback(cgbr->tab, snap) < 0)
3009                 return -1;
3010         if (shifted_snap) {
3011                 if (isl_tab_rollback(cgbr->shifted, shifted_snap))
3012                         return -1;
3013         } else if (cgbr->shifted) {
3014                 isl_tab_free(cgbr->shifted);
3015                 cgbr->shifted = NULL;
3016         }
3017         if (cone_snap) {
3018                 if (isl_tab_rollback(cgbr->cone, cone_snap))
3019                         return -1;
3020         } else if (cgbr->cone) {
3021                 isl_tab_free(cgbr->cone);
3022                 cgbr->cone = NULL;
3023         }
3024
3025         return feasible;
3026 }
3027
3028 /* Return the column of the last of the variables associated to
3029  * a column that has a non-zero coefficient.
3030  * This function is called in a context where only coefficients
3031  * of parameters or divs can be non-zero.
3032  */
3033 static int last_non_zero_var_col(struct isl_tab *tab, isl_int *p)
3034 {
3035         int i;
3036         int col;
3037
3038         if (tab->n_var == 0)
3039                 return -1;
3040
3041         for (i = tab->n_var - 1; i >= 0; --i) {
3042                 if (i >= tab->n_param && i < tab->n_var - tab->n_div)
3043                         continue;
3044                 if (tab->var[i].is_row)
3045                         continue;
3046                 col = tab->var[i].index;
3047                 if (!isl_int_is_zero(p[col]))
3048                         return col;
3049         }
3050
3051         return -1;
3052 }
3053
3054 /* Look through all the recently added equalities in the context
3055  * to see if we can propagate any of them to the main tableau.
3056  *
3057  * The newly added equalities in the context are encoded as pairs
3058  * of inequalities starting at inequality "first".
3059  *
3060  * We tentatively add each of these equalities to the main tableau
3061  * and if this happens to result in a row with a final coefficient
3062  * that is one or negative one, we use it to kill a column
3063  * in the main tableau.  Otherwise, we discard the tentatively
3064  * added row.
3065  */
3066 static void propagate_equalities(struct isl_context_gbr *cgbr,
3067         struct isl_tab *tab, unsigned first)
3068 {
3069         int i;
3070         struct isl_vec *eq = NULL;
3071
3072         eq = isl_vec_alloc(tab->mat->ctx, 1 + tab->n_var);
3073         if (!eq)
3074                 goto error;
3075
3076         if (isl_tab_extend_cons(tab, (cgbr->tab->bmap->n_ineq - first)/2) < 0)
3077                 goto error;
3078
3079         isl_seq_clr(eq->el + 1 + tab->n_param,
3080                     tab->n_var - tab->n_param - tab->n_div);
3081         for (i = first; i < cgbr->tab->bmap->n_ineq; i += 2) {
3082                 int j;
3083                 int r;
3084                 struct isl_tab_undo *snap;
3085                 snap = isl_tab_snap(tab);
3086
3087                 isl_seq_cpy(eq->el, cgbr->tab->bmap->ineq[i], 1 + tab->n_param);
3088                 isl_seq_cpy(eq->el + 1 + tab->n_var - tab->n_div,
3089                             cgbr->tab->bmap->ineq[i] + 1 + tab->n_param,
3090                             tab->n_div);
3091
3092                 r = isl_tab_add_row(tab, eq->el);
3093                 if (r < 0)
3094                         goto error;
3095                 r = tab->con[r].index;
3096                 j = last_non_zero_var_col(tab, tab->mat->row[r] + 2 + tab->M);
3097                 if (j < 0 || j < tab->n_dead ||
3098                     !isl_int_is_one(tab->mat->row[r][0]) ||
3099                     (!isl_int_is_one(tab->mat->row[r][2 + tab->M + j]) &&
3100                      !isl_int_is_negone(tab->mat->row[r][2 + tab->M + j]))) {
3101                         if (isl_tab_rollback(tab, snap) < 0)
3102                                 goto error;
3103                         continue;
3104                 }
3105                 if (isl_tab_pivot(tab, r, j) < 0)
3106                         goto error;
3107                 if (isl_tab_kill_col(tab, j) < 0)
3108                         goto error;
3109
3110                 if (restore_lexmin(tab) < 0)
3111                         goto error;
3112         }
3113
3114         isl_vec_free(eq);
3115
3116         return;
3117 error:
3118         isl_vec_free(eq);
3119         isl_tab_free(cgbr->tab);
3120         cgbr->tab = NULL;
3121 }
3122
3123 static int context_gbr_detect_equalities(struct isl_context *context,
3124         struct isl_tab *tab)
3125 {
3126         struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
3127         struct isl_ctx *ctx;
3128         unsigned n_ineq;
3129
3130         ctx = cgbr->tab->mat->ctx;
3131
3132         if (!cgbr->cone) {
3133                 struct isl_basic_set *bset = isl_tab_peek_bset(cgbr->tab);
3134                 cgbr->cone = isl_tab_from_recession_cone(bset, 0);
3135                 if (!cgbr->cone)
3136                         goto error;
3137                 if (isl_tab_track_bset(cgbr->cone,
3138                                         isl_basic_set_copy(bset)) < 0)
3139                         goto error;
3140         }
3141         if (isl_tab_detect_implicit_equalities(cgbr->cone) < 0)
3142                 goto error;
3143
3144         n_ineq = cgbr->tab->bmap->n_ineq;
3145         cgbr->tab = isl_tab_detect_equalities(cgbr->tab, cgbr->cone);
3146         if (!cgbr->tab)
3147                 return -1;
3148         if (cgbr->tab->bmap->n_ineq > n_ineq)
3149                 propagate_equalities(cgbr, tab, n_ineq);
3150
3151         return 0;
3152 error:
3153         isl_tab_free(cgbr->tab);
3154         cgbr->tab = NULL;
3155         return -1;
3156 }
3157
3158 static int context_gbr_get_div(struct isl_context *context, struct isl_tab *tab,
3159                 struct isl_vec *div)
3160 {
3161         return get_div(tab, context, div);
3162 }
3163
3164 static int context_gbr_add_div(struct isl_context *context, struct isl_vec *div)
3165 {
3166         struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
3167         if (cgbr->cone) {
3168                 int k;
3169
3170                 if (isl_tab_extend_cons(cgbr->cone, 3) < 0)
3171                         return -1;
3172                 if (isl_tab_extend_vars(cgbr->cone, 1) < 0)
3173                         return -1;
3174                 if (isl_tab_allocate_var(cgbr->cone) <0)
3175                         return -1;
3176
3177                 cgbr->cone->bmap = isl_basic_map_extend_space(cgbr->cone->bmap,
3178                         isl_basic_map_get_space(cgbr->cone->bmap), 1, 0, 2);
3179                 k = isl_basic_map_alloc_div(cgbr->cone->bmap);
3180                 if (k < 0)
3181                         return -1;
3182                 isl_seq_cpy(cgbr->cone->bmap->div[k], div->el, div->size);
3183                 if (isl_tab_push(cgbr->cone, isl_tab_undo_bmap_div) < 0)
3184                         return -1;
3185         }
3186         return context_tab_add_div(cgbr->tab, div,
3187                                         context_gbr_add_ineq_wrap, context);
3188 }
3189
3190 static int context_gbr_best_split(struct isl_context *context,
3191                 struct isl_tab *tab)
3192 {
3193         struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
3194         struct isl_tab_undo *snap;
3195         int r;
3196
3197         snap = isl_tab_snap(cgbr->tab);
3198         r = best_split(tab, cgbr->tab);
3199
3200         if (r >= 0 && isl_tab_rollback(cgbr->tab, snap) < 0)
3201                 return -1;
3202
3203         return r;
3204 }
3205
3206 static int context_gbr_is_empty(struct isl_context *context)
3207 {
3208         struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
3209         if (!cgbr->tab)
3210                 return -1;
3211         return cgbr->tab->empty;
3212 }
3213
3214 struct isl_gbr_tab_undo {
3215         struct isl_tab_undo *tab_snap;
3216         struct isl_tab_undo *shifted_snap;
3217         struct isl_tab_undo *cone_snap;
3218 };
3219
3220 static void *context_gbr_save(struct isl_context *context)
3221 {
3222         struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
3223         struct isl_gbr_tab_undo *snap;
3224
3225         if (!cgbr->tab)
3226                 return NULL;
3227
3228         snap = isl_alloc_type(cgbr->tab->mat->ctx, struct isl_gbr_tab_undo);
3229         if (!snap)
3230                 return NULL;
3231
3232         snap->tab_snap = isl_tab_snap(cgbr->tab);
3233         if (isl_tab_save_samples(cgbr->tab) < 0)
3234                 goto error;
3235
3236         if (cgbr->shifted)
3237                 snap->shifted_snap = isl_tab_snap(cgbr->shifted);
3238         else
3239                 snap->shifted_snap = NULL;
3240
3241         if (cgbr->cone)
3242                 snap->cone_snap = isl_tab_snap(cgbr->cone);
3243         else
3244                 snap->cone_snap = NULL;
3245
3246         return snap;
3247 error:
3248         free(snap);
3249         return NULL;
3250 }
3251
3252 static void context_gbr_restore(struct isl_context *context, void *save)
3253 {
3254         struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
3255         struct isl_gbr_tab_undo *snap = (struct isl_gbr_tab_undo *)save;
3256         if (!snap)
3257                 goto error;
3258         if (isl_tab_rollback(cgbr->tab, snap->tab_snap) < 0) {
3259                 isl_tab_free(cgbr->tab);
3260                 cgbr->tab = NULL;
3261         }
3262
3263         if (snap->shifted_snap) {
3264                 if (isl_tab_rollback(cgbr->shifted, snap->shifted_snap) < 0)
3265                         goto error;
3266         } else if (cgbr->shifted) {
3267                 isl_tab_free(cgbr->shifted);
3268                 cgbr->shifted = NULL;
3269         }
3270
3271         if (snap->cone_snap) {
3272                 if (isl_tab_rollback(cgbr->cone, snap->cone_snap) < 0)
3273                         goto error;
3274         } else if (cgbr->cone) {
3275                 isl_tab_free(cgbr->cone);
3276                 cgbr->cone = NULL;
3277         }
3278
3279         free(snap);
3280
3281         return;
3282 error:
3283         free(snap);
3284         isl_tab_free(cgbr->tab);
3285         cgbr->tab = NULL;
3286 }
3287
3288 static void context_gbr_discard(void *save)
3289 {
3290         struct isl_gbr_tab_undo *snap = (struct isl_gbr_tab_undo *)save;
3291         free(snap);
3292 }
3293
3294 static int context_gbr_is_ok(struct isl_context *context)
3295 {
3296         struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
3297         return !!cgbr->tab;
3298 }
3299
3300 static void context_gbr_invalidate(struct isl_context *context)
3301 {
3302         struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
3303         isl_tab_free(cgbr->tab);
3304         cgbr->tab = NULL;
3305 }
3306
3307 static void context_gbr_free(struct isl_context *context)
3308 {
3309         struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
3310         isl_tab_free(cgbr->tab);
3311         isl_tab_free(cgbr->shifted);
3312         isl_tab_free(cgbr->cone);
3313         free(cgbr);
3314 }
3315
3316 struct isl_context_op isl_context_gbr_op = {
3317         context_gbr_detect_nonnegative_parameters,
3318         context_gbr_peek_basic_set,
3319         context_gbr_peek_tab,
3320         context_gbr_add_eq,
3321         context_gbr_add_ineq,
3322         context_gbr_ineq_sign,
3323         context_gbr_test_ineq,
3324         context_gbr_get_div,
3325         context_gbr_add_div,
3326         context_gbr_detect_equalities,
3327         context_gbr_best_split,
3328         context_gbr_is_empty,
3329         context_gbr_is_ok,
3330         context_gbr_save,
3331         context_gbr_restore,
3332         context_gbr_discard,
3333         context_gbr_invalidate,
3334         context_gbr_free,
3335 };
3336
3337 static struct isl_context *isl_context_gbr_alloc(struct isl_basic_set *dom)
3338 {
3339         struct isl_context_gbr *cgbr;
3340
3341         if (!dom)
3342                 return NULL;
3343
3344         cgbr = isl_calloc_type(dom->ctx, struct isl_context_gbr);
3345         if (!cgbr)
3346                 return NULL;
3347
3348         cgbr->context.op = &isl_context_gbr_op;
3349
3350         cgbr->shifted = NULL;
3351         cgbr->cone = NULL;
3352         cgbr->tab = isl_tab_from_basic_set(dom, 1);
3353         cgbr->tab = isl_tab_init_samples(cgbr->tab);
3354         if (!cgbr->tab)
3355                 goto error;
3356         check_gbr_integer_feasible(cgbr);
3357
3358         return &cgbr->context;
3359 error:
3360         cgbr->context.op->free(&cgbr->context);
3361         return NULL;
3362 }
3363
3364 static struct isl_context *isl_context_alloc(struct isl_basic_set *dom)
3365 {
3366         if (!dom)
3367                 return NULL;
3368
3369         if (dom->ctx->opt->context == ISL_CONTEXT_LEXMIN)
3370                 return isl_context_lex_alloc(dom);
3371         else
3372                 return isl_context_gbr_alloc(dom);
3373 }
3374
3375 /* Construct an isl_sol_map structure for accumulating the solution.
3376  * If track_empty is set, then we also keep track of the parts
3377  * of the context where there is no solution.
3378  * If max is set, then we are solving a maximization, rather than
3379  * a minimization problem, which means that the variables in the
3380  * tableau have value "M - x" rather than "M + x".
3381  */
3382 static struct isl_sol *sol_map_init(struct isl_basic_map *bmap,
3383         struct isl_basic_set *dom, int track_empty, int max)
3384 {
3385         struct isl_sol_map *sol_map = NULL;
3386
3387         if (!bmap)
3388                 goto error;
3389
3390         sol_map = isl_calloc_type(bmap->ctx, struct isl_sol_map);
3391         if (!sol_map)
3392                 goto error;
3393
3394         sol_map->sol.rational = ISL_F_ISSET(bmap, ISL_BASIC_MAP_RATIONAL);
3395         sol_map->sol.dec_level.callback.run = &sol_dec_level_wrap;
3396         sol_map->sol.dec_level.sol = &sol_map->sol;
3397         sol_map->sol.max = max;
3398         sol_map->sol.n_out = isl_basic_map_dim(bmap, isl_dim_out);
3399         sol_map->sol.add = &sol_map_add_wrap;
3400         sol_map->sol.add_empty = track_empty ? &sol_map_add_empty_wrap : NULL;
3401         sol_map->sol.free = &sol_map_free_wrap;
3402         sol_map->map = isl_map_alloc_space(isl_basic_map_get_space(bmap), 1,
3403                                             ISL_MAP_DISJOINT);
3404         if (!sol_map->map)
3405                 goto error;
3406
3407         sol_map->sol.context = isl_context_alloc(dom);
3408         if (!sol_map->sol.context)
3409                 goto error;
3410
3411         if (track_empty) {
3412                 sol_map->empty = isl_set_alloc_space(isl_basic_set_get_space(dom),
3413                                                         1, ISL_SET_DISJOINT);
3414                 if (!sol_map->empty)
3415                         goto error;
3416         }
3417
3418         isl_basic_set_free(dom);
3419         return &sol_map->sol;
3420 error:
3421         isl_basic_set_free(dom);
3422         sol_map_free(sol_map);
3423         return NULL;
3424 }
3425
3426 /* Check whether all coefficients of (non-parameter) variables
3427  * are non-positive, meaning that no pivots can be performed on the row.
3428  */
3429 static int is_critical(struct isl_tab *tab, int row)
3430 {
3431         int j;
3432         unsigned off = 2 + tab->M;
3433
3434         for (j = tab->n_dead; j < tab->n_col; ++j) {
3435                 if (tab->col_var[j] >= 0 &&
3436                     (tab->col_var[j] < tab->n_param  ||
3437                     tab->col_var[j] >= tab->n_var - tab->n_div))
3438                         continue;
3439
3440                 if (isl_int_is_pos(tab->mat->row[row][off + j]))
3441                         return 0;
3442         }
3443
3444         return 1;
3445 }
3446
3447 /* Check whether the inequality represented by vec is strict over the integers,
3448  * i.e., there are no integer values satisfying the constraint with
3449  * equality.  This happens if the gcd of the coefficients is not a divisor
3450  * of the constant term.  If so, scale the constraint down by the gcd
3451  * of the coefficients.
3452  */
3453 static int is_strict(struct isl_vec *vec)
3454 {
3455         isl_int gcd;
3456         int strict = 0;
3457
3458         isl_int_init(gcd);
3459         isl_seq_gcd(vec->el + 1, vec->size - 1, &gcd);
3460         if (!isl_int_is_one(gcd)) {
3461                 strict = !isl_int_is_divisible_by(vec->el[0], gcd);
3462                 isl_int_fdiv_q(vec->el[0], vec->el[0], gcd);
3463                 isl_seq_scale_down(vec->el + 1, vec->el + 1, gcd, vec->size-1);
3464         }
3465         isl_int_clear(gcd);
3466
3467         return strict;
3468 }
3469
3470 /* Determine the sign of the given row of the main tableau.
3471  * The result is one of
3472  *      isl_tab_row_pos: always non-negative; no pivot needed
3473  *      isl_tab_row_neg: always non-positive; pivot
3474  *      isl_tab_row_any: can be both positive and negative; split
3475  *
3476  * We first handle some simple cases
3477  *      - the row sign may be known already
3478  *      - the row may be obviously non-negative
3479  *      - the parametric constant may be equal to that of another row
3480  *        for which we know the sign.  This sign will be either "pos" or
3481  *        "any".  If it had been "neg" then we would have pivoted before.
3482  *
3483  * If none of these cases hold, we check the value of the row for each
3484  * of the currently active samples.  Based on the signs of these values
3485  * we make an initial determination of the sign of the row.
3486  *
3487  *      all zero                        ->      unk(nown)
3488  *      all non-negative                ->      pos
3489  *      all non-positive                ->      neg
3490  *      both negative and positive      ->      all
3491  *
3492  * If we end up with "all", we are done.
3493  * Otherwise, we perform a check for positive and/or negative
3494  * values as follows.
3495  *
3496  *      samples        neg             unk             pos
3497  *      <0 ?                        Y        N      Y        N
3498  *                                          pos    any      pos
3499  *      >0 ?         Y      N    Y     N
3500  *                  any    neg  any   neg
3501  *
3502  * There is no special sign for "zero", because we can usually treat zero
3503  * as either non-negative or non-positive, whatever works out best.
3504  * However, if the row is "critical", meaning that pivoting is impossible
3505  * then we don't want to limp zero with the non-positive case, because
3506  * then we we would lose the solution for those values of the parameters
3507  * where the value of the row is zero.  Instead, we treat 0 as non-negative
3508  * ensuring a split if the row can attain both zero and negative values.
3509  * The same happens when the original constraint was one that could not
3510  * be satisfied with equality by any integer values of the parameters.
3511  * In this case, we normalize the constraint, but then a value of zero
3512  * for the normalized constraint is actually a positive value for the
3513  * original constraint, so again we need to treat zero as non-negative.
3514  * In both these cases, we have the following decision tree instead:
3515  *
3516  *      all non-negative                ->      pos
3517  *      all negative                    ->      neg
3518  *      both negative and non-negative  ->      all
3519  *
3520  *      samples        neg                             pos
3521  *      <0 ?                                        Y        N
3522  *                                                 any      pos
3523  *      >=0 ?        Y      N
3524  *                  any    neg
3525  */
3526 static enum isl_tab_row_sign row_sign(struct isl_tab *tab,
3527         struct isl_sol *sol, int row)
3528 {
3529         struct isl_vec *ineq = NULL;
3530         enum isl_tab_row_sign res = isl_tab_row_unknown;
3531         int critical;
3532         int strict;
3533         int row2;
3534
3535         if (tab->row_sign[row] != isl_tab_row_unknown)
3536                 return tab->row_sign[row];
3537         if (is_obviously_nonneg(tab, row))
3538                 return isl_tab_row_pos;
3539         for (row2 = tab->n_redundant; row2 < tab->n_row; ++row2) {
3540                 if (tab->row_sign[row2] == isl_tab_row_unknown)
3541                         continue;
3542                 if (identical_parameter_line(tab, row, row2))
3543                         return tab->row_sign[row2];
3544         }
3545
3546         critical = is_critical(tab, row);
3547
3548         ineq = get_row_parameter_ineq(tab, row);
3549         if (!ineq)
3550                 goto error;
3551
3552         strict = is_strict(ineq);
3553
3554         res = sol->context->op->ineq_sign(sol->context, ineq->el,
3555                                           critical || strict);
3556
3557         if (res == isl_tab_row_unknown || res == isl_tab_row_pos) {
3558                 /* test for negative values */
3559                 int feasible;
3560                 isl_seq_neg(ineq->el, ineq->el, ineq->size);
3561                 isl_int_sub_ui(ineq->el[0], ineq->el[0], 1);
3562
3563                 feasible = sol->context->op->test_ineq(sol->context, ineq->el);
3564                 if (feasible < 0)
3565                         goto error;
3566                 if (!feasible)
3567                         res = isl_tab_row_pos;
3568                 else
3569                         res = (res == isl_tab_row_unknown) ? isl_tab_row_neg
3570                                                            : isl_tab_row_any;
3571                 if (res == isl_tab_row_neg) {
3572                         isl_seq_neg(ineq->el, ineq->el, ineq->size);
3573                         isl_int_sub_ui(ineq->el[0], ineq->el[0], 1);
3574                 }
3575         }
3576
3577         if (res == isl_tab_row_neg) {
3578                 /* test for positive values */
3579                 int feasible;
3580                 if (!critical && !strict)
3581                         isl_int_sub_ui(ineq->el[0], ineq->el[0], 1);
3582
3583                 feasible = sol->context->op->test_ineq(sol->context, ineq->el);
3584                 if (feasible < 0)
3585                         goto error;
3586                 if (feasible)
3587                         res = isl_tab_row_any;
3588         }
3589
3590         isl_vec_free(ineq);
3591         return res;
3592 error:
3593         isl_vec_free(ineq);
3594         return isl_tab_row_unknown;
3595 }
3596
3597 static void find_solutions(struct isl_sol *sol, struct isl_tab *tab);
3598
3599 /* Find solutions for values of the parameters that satisfy the given
3600  * inequality.
3601  *
3602  * We currently take a snapshot of the context tableau that is reset
3603  * when we return from this function, while we make a copy of the main
3604  * tableau, leaving the original main tableau untouched.
3605  * These are fairly arbitrary choices.  Making a copy also of the context
3606  * tableau would obviate the need to undo any changes made to it later,
3607  * while taking a snapshot of the main tableau could reduce memory usage.
3608  * If we were to switch to taking a snapshot of the main tableau,
3609  * we would have to keep in mind that we need to save the row signs
3610  * and that we need to do this before saving the current basis
3611  * such that the basis has been restore before we restore the row signs.
3612  */
3613 static void find_in_pos(struct isl_sol *sol, struct isl_tab *tab, isl_int *ineq)
3614 {
3615         void *saved;
3616
3617         if (!sol->context)
3618                 goto error;
3619         saved = sol->context->op->save(sol->context);
3620
3621         tab = isl_tab_dup(tab);
3622         if (!tab)
3623                 goto error;
3624
3625         sol->context->op->add_ineq(sol->context, ineq, 0, 1);
3626
3627         find_solutions(sol, tab);
3628
3629         if (!sol->error)
3630                 sol->context->op->restore(sol->context, saved);
3631         else
3632                 sol->context->op->discard(saved);
3633         return;
3634 error:
3635         sol->error = 1;
3636 }
3637
3638 /* Record the absence of solutions for those values of the parameters
3639  * that do not satisfy the given inequality with equality.
3640  */
3641 static void no_sol_in_strict(struct isl_sol *sol,
3642         struct isl_tab *tab, struct isl_vec *ineq)
3643 {
3644         int empty;
3645         void *saved;
3646
3647         if (!sol->context || sol->error)
3648                 goto error;
3649         saved = sol->context->op->save(sol->context);
3650
3651         isl_int_sub_ui(ineq->el[0], ineq->el[0], 1);
3652
3653         sol->context->op->add_ineq(sol->context, ineq->el, 1, 0);
3654         if (!sol->context)
3655                 goto error;
3656
3657         empty = tab->empty;
3658         tab->empty = 1;
3659         sol_add(sol, tab);
3660         tab->empty = empty;
3661
3662         isl_int_add_ui(ineq->el[0], ineq->el[0], 1);
3663
3664         sol->context->op->restore(sol->context, saved);
3665         return;
3666 error:
3667         sol->error = 1;
3668 }
3669
3670 /* Compute the lexicographic minimum of the set represented by the main
3671  * tableau "tab" within the context "sol->context_tab".
3672  * On entry the sample value of the main tableau is lexicographically
3673  * less than or equal to this lexicographic minimum.
3674  * Pivots are performed until a feasible point is found, which is then
3675  * necessarily equal to the minimum, or until the tableau is found to
3676  * be infeasible.  Some pivots may need to be performed for only some
3677  * feasible values of the context tableau.  If so, the context tableau
3678  * is split into a part where the pivot is needed and a part where it is not.
3679  *
3680  * Whenever we enter the main loop, the main tableau is such that no
3681  * "obvious" pivots need to be performed on it, where "obvious" means
3682  * that the given row can be seen to be negative without looking at
3683  * the context tableau.  In particular, for non-parametric problems,
3684  * no pivots need to be performed on the main tableau.
3685  * The caller of find_solutions is responsible for making this property
3686  * hold prior to the first iteration of the loop, while restore_lexmin
3687  * is called before every other iteration.
3688  *
3689  * Inside the main loop, we first examine the signs of the rows of
3690  * the main tableau within the context of the context tableau.
3691  * If we find a row that is always non-positive for all values of
3692  * the parameters satisfying the context tableau and negative for at
3693  * least one value of the parameters, we perform the appropriate pivot
3694  * and start over.  An exception is the case where no pivot can be
3695  * performed on the row.  In this case, we require that the sign of
3696  * the row is negative for all values of the parameters (rather than just
3697  * non-positive).  This special case is handled inside row_sign, which
3698  * will say that the row can have any sign if it determines that it can
3699  * attain both negative and zero values.
3700  *
3701  * If we can't find a row that always requires a pivot, but we can find
3702  * one or more rows that require a pivot for some values of the parameters
3703  * (i.e., the row can attain both positive and negative signs), then we split
3704  * the context tableau into two parts, one where we force the sign to be
3705  * non-negative and one where we force is to be negative.
3706  * The non-negative part is handled by a recursive call (through find_in_pos).
3707  * Upon returning from this call, we continue with the negative part and
3708  * perform the required pivot.
3709  *
3710  * If no such rows can be found, all rows are non-negative and we have
3711  * found a (rational) feasible point.  If we only wanted a rational point
3712  * then we are done.
3713  * Otherwise, we check if all values of the sample point of the tableau
3714  * are integral for the variables.  If so, we have found the minimal
3715  * integral point and we are done.
3716  * If the sample point is not integral, then we need to make a distinction
3717  * based on whether the constant term is non-integral or the coefficients
3718  * of the parameters.  Furthermore, in order to decide how to handle
3719  * the non-integrality, we also need to know whether the coefficients
3720  * of the other columns in the tableau are integral.  This leads
3721  * to the following table.  The first two rows do not correspond
3722  * to a non-integral sample point and are only mentioned for completeness.
3723  *
3724  *      constant        parameters      other
3725  *
3726  *      int             int             int     |
3727  *      int             int             rat     | -> no problem
3728  *
3729  *      rat             int             int       -> fail
3730  *
3731  *      rat             int             rat       -> cut
3732  *
3733  *      int             rat             rat     |
3734  *      rat             rat             rat     | -> parametric cut
3735  *
3736  *      int             rat             int     |
3737  *      rat             rat             int     | -> split context
3738  *
3739  * If the parametric constant is completely integral, then there is nothing
3740  * to be done.  If the constant term is non-integral, but all the other
3741  * coefficient are integral, then there is nothing that can be done
3742  * and the tableau has no integral solution.
3743  * If, on the other hand, one or more of the other columns have rational
3744  * coefficients, but the parameter coefficients are all integral, then
3745  * we can perform a regular (non-parametric) cut.
3746  * Finally, if there is any parameter coefficient that is non-integral,
3747  * then we need to involve the context tableau.  There are two cases here.
3748  * If at least one other column has a rational coefficient, then we
3749  * can perform a parametric cut in the main tableau by adding a new
3750  * integer division in the context tableau.
3751  * If all other columns have integral coefficients, then we need to
3752  * enforce that the rational combination of parameters (c + \sum a_i y_i)/m
3753  * is always integral.  We do this by introducing an integer division
3754  * q = floor((c + \sum a_i y_i)/m) and stipulating that its argument should
3755  * always be integral in the context tableau, i.e., m q = c + \sum a_i y_i.
3756  * Since q is expressed in the tableau as
3757  *      c + \sum a_i y_i - m q >= 0
3758  *      -c - \sum a_i y_i + m q + m - 1 >= 0
3759  * it is sufficient to add the inequality
3760  *      -c - \sum a_i y_i + m q >= 0
3761  * In the part of the context where this inequality does not hold, the
3762  * main tableau is marked as being empty.
3763  */
3764 static void find_solutions(struct isl_sol *sol, struct isl_tab *tab)
3765 {
3766         struct isl_context *context;
3767         int r;
3768
3769         if (!tab || sol->error)
3770                 goto error;
3771
3772         context = sol->context;
3773
3774         if (tab->empty)
3775                 goto done;
3776         if (context->op->is_empty(context))
3777                 goto done;
3778
3779         for (r = 0; r >= 0 && tab && !tab->empty; r = restore_lexmin(tab)) {
3780                 int flags;
3781                 int row;
3782                 enum isl_tab_row_sign sgn;
3783                 int split = -1;
3784                 int n_split = 0;
3785
3786                 for (row = tab->n_redundant; row < tab->n_row; ++row) {
3787                         if (!isl_tab_var_from_row(tab, row)->is_nonneg)
3788                                 continue;
3789                         sgn = row_sign(tab, sol, row);
3790                         if (!sgn)
3791                                 goto error;
3792                         tab->row_sign[row] = sgn;
3793                         if (sgn == isl_tab_row_any)
3794                                 n_split++;
3795                         if (sgn == isl_tab_row_any && split == -1)
3796                                 split = row;
3797                         if (sgn == isl_tab_row_neg)
3798                                 break;
3799                 }
3800                 if (row < tab->n_row)
3801                         continue;
3802                 if (split != -1) {
3803                         struct isl_vec *ineq;
3804                         if (n_split != 1)
3805                                 split = context->op->best_split(context, tab);
3806                         if (split < 0)
3807                                 goto error;
3808                         ineq = get_row_parameter_ineq(tab, split);
3809                         if (!ineq)
3810                                 goto error;
3811                         is_strict(ineq);
3812                         for (row = tab->n_redundant; row < tab->n_row; ++row) {
3813                                 if (!isl_tab_var_from_row(tab, row)->is_nonneg)
3814                                         continue;
3815                                 if (tab->row_sign[row] == isl_tab_row_any)
3816                                         tab->row_sign[row] = isl_tab_row_unknown;
3817                         }
3818                         tab->row_sign[split] = isl_tab_row_pos;
3819                         sol_inc_level(sol);
3820                         find_in_pos(sol, tab, ineq->el);
3821                         tab->row_sign[split] = isl_tab_row_neg;
3822                         row = split;
3823                         isl_seq_neg(ineq->el, ineq->el, ineq->size);
3824                         isl_int_sub_ui(ineq->el[0], ineq->el[0], 1);
3825                         if (!sol->error)
3826                                 context->op->add_ineq(context, ineq->el, 0, 1);
3827                         isl_vec_free(ineq);
3828                         if (sol->error)
3829                                 goto error;
3830                         continue;
3831                 }
3832                 if (tab->rational)
3833                         break;
3834                 row = first_non_integer_row(tab, &flags);
3835                 if (row < 0)
3836                         break;
3837                 if (ISL_FL_ISSET(flags, I_PAR)) {
3838                         if (ISL_FL_ISSET(flags, I_VAR)) {
3839                                 if (isl_tab_mark_empty(tab) < 0)
3840                                         goto error;
3841                                 break;
3842                         }
3843                         row = add_cut(tab, row);
3844                 } else if (ISL_FL_ISSET(flags, I_VAR)) {
3845                         struct isl_vec *div;
3846                         struct isl_vec *ineq;
3847                         int d;
3848                         div = get_row_split_div(tab, row);
3849                         if (!div)
3850                                 goto error;
3851                         d = context->op->get_div(context, tab, div);
3852                         isl_vec_free(div);
3853                         if (d < 0)
3854                                 goto error;
3855                         ineq = ineq_for_div(context->op->peek_basic_set(context), d);
3856                         if (!ineq)
3857                                 goto error;
3858                         sol_inc_level(sol);
3859                         no_sol_in_strict(sol, tab, ineq);
3860                         isl_seq_neg(ineq->el, ineq->el, ineq->size);
3861                         context->op->add_ineq(context, ineq->el, 1, 1);
3862                         isl_vec_free(ineq);
3863                         if (sol->error || !context->op->is_ok(context))
3864                                 goto error;
3865                         tab = set_row_cst_to_div(tab, row, d);
3866                         if (context->op->is_empty(context))
3867                                 break;
3868                 } else
3869                         row = add_parametric_cut(tab, row, context);
3870                 if (row < 0)
3871                         goto error;
3872         }
3873         if (r < 0)
3874                 goto error;
3875 done:
3876         sol_add(sol, tab);
3877         isl_tab_free(tab);
3878         return;
3879 error:
3880         isl_tab_free(tab);
3881         sol->error = 1;
3882 }
3883
3884 /* Compute the lexicographic minimum of the set represented by the main
3885  * tableau "tab" within the context "sol->context_tab".
3886  *
3887  * As a preprocessing step, we first transfer all the purely parametric
3888  * equalities from the main tableau to the context tableau, i.e.,
3889  * parameters that have been pivoted to a row.
3890  * These equalities are ignored by the main algorithm, because the
3891  * corresponding rows may not be marked as being non-negative.
3892  * In parts of the context where the added equality does not hold,
3893  * the main tableau is marked as being empty.
3894  */
3895 static void find_solutions_main(struct isl_sol *sol, struct isl_tab *tab)
3896 {
3897         int row;
3898
3899         if (!tab)
3900                 goto error;
3901
3902         sol->level = 0;
3903
3904         for (row = tab->n_redundant; row < tab->n_row; ++row) {
3905                 int p;
3906                 struct isl_vec *eq;
3907
3908                 if (tab->row_var[row] < 0)
3909                         continue;
3910                 if (tab->row_var[row] >= tab->n_param &&
3911                     tab->row_var[row] < tab->n_var - tab->n_div)
3912                         continue;
3913                 if (tab->row_var[row] < tab->n_param)
3914                         p = tab->row_var[row];
3915                 else
3916                         p = tab->row_var[row]
3917                                 + tab->n_param - (tab->n_var - tab->n_div);
3918
3919                 eq = isl_vec_alloc(tab->mat->ctx, 1+tab->n_param+tab->n_div);
3920                 if (!eq)
3921                         goto error;
3922                 get_row_parameter_line(tab, row, eq->el);
3923                 isl_int_neg(eq->el[1 + p], tab->mat->row[row][0]);
3924                 eq = isl_vec_normalize(eq);
3925
3926                 sol_inc_level(sol);
3927                 no_sol_in_strict(sol, tab, eq);
3928
3929                 isl_seq_neg(eq->el, eq->el, eq->size);
3930                 sol_inc_level(sol);
3931                 no_sol_in_strict(sol, tab, eq);
3932                 isl_seq_neg(eq->el, eq->el, eq->size);
3933
3934                 sol->context->op->add_eq(sol->context, eq->el, 1, 1);
3935
3936                 isl_vec_free(eq);
3937
3938                 if (isl_tab_mark_redundant(tab, row) < 0)
3939                         goto error;
3940
3941                 if (sol->context->op->is_empty(sol->context))
3942                         break;
3943
3944                 row = tab->n_redundant - 1;
3945         }
3946
3947         find_solutions(sol, tab);
3948
3949         sol->level = 0;
3950         sol_pop(sol);
3951
3952         return;
3953 error:
3954         isl_tab_free(tab);
3955         sol->error = 1;
3956 }
3957
3958 /* Check if integer division "div" of "dom" also occurs in "bmap".
3959  * If so, return its position within the divs.
3960  * If not, return -1.
3961  */
3962 static int find_context_div(struct isl_basic_map *bmap,
3963         struct isl_basic_set *dom, unsigned div)
3964 {
3965         int i;
3966         unsigned b_dim = isl_space_dim(bmap->dim, isl_dim_all);
3967         unsigned d_dim = isl_space_dim(dom->dim, isl_dim_all);
3968
3969         if (isl_int_is_zero(dom->div[div][0]))
3970                 return -1;
3971         if (isl_seq_first_non_zero(dom->div[div] + 2 + d_dim, dom->n_div) != -1)
3972                 return -1;
3973
3974         for (i = 0; i < bmap->n_div; ++i) {
3975                 if (isl_int_is_zero(bmap->div[i][0]))
3976                         continue;
3977                 if (isl_seq_first_non_zero(bmap->div[i] + 2 + d_dim,
3978                                            (b_dim - d_dim) + bmap->n_div) != -1)
3979                         continue;
3980                 if (isl_seq_eq(bmap->div[i], dom->div[div], 2 + d_dim))
3981                         return i;
3982         }
3983         return -1;
3984 }
3985
3986 /* The correspondence between the variables in the main tableau,
3987  * the context tableau, and the input map and domain is as follows.
3988  * The first n_param and the last n_div variables of the main tableau
3989  * form the variables of the context tableau.
3990  * In the basic map, these n_param variables correspond to the
3991  * parameters and the input dimensions.  In the domain, they correspond
3992  * to the parameters and the set dimensions.
3993  * The n_div variables correspond to the integer divisions in the domain.
3994  * To ensure that everything lines up, we may need to copy some of the
3995  * integer divisions of the domain to the map.  These have to be placed
3996  * in the same order as those in the context and they have to be placed
3997  * after any other integer divisions that the map may have.
3998  * This function performs the required reordering.
3999  */
4000 static struct isl_basic_map *align_context_divs(struct isl_basic_map *bmap,
4001         struct isl_basic_set *dom)
4002 {
4003         int i;
4004         int common = 0;
4005         int other;
4006
4007         for (i = 0; i < dom->n_div; ++i)
4008                 if (find_context_div(bmap, dom, i) != -1)
4009                         common++;
4010         other = bmap->n_div - common;
4011         if (dom->n_div - common > 0) {
4012                 bmap = isl_basic_map_extend_space(bmap, isl_space_copy(bmap->dim),
4013                                 dom->n_div - common, 0, 0);
4014                 if (!bmap)
4015                         return NULL;
4016         }
4017         for (i = 0; i < dom->n_div; ++i) {
4018                 int pos = find_context_div(bmap, dom, i);
4019                 if (pos < 0) {
4020                         pos = isl_basic_map_alloc_div(bmap);
4021                         if (pos < 0)
4022                                 goto error;
4023                         isl_int_set_si(bmap->div[pos][0], 0);
4024                 }
4025                 if (pos != other + i)
4026                         isl_basic_map_swap_div(bmap, pos, other + i);
4027         }
4028         return bmap;
4029 error:
4030         isl_basic_map_free(bmap);
4031         return NULL;
4032 }
4033
4034 /* Base case of isl_tab_basic_map_partial_lexopt, after removing
4035  * some obvious symmetries.
4036  *
4037  * We make sure the divs in the domain are properly ordered,
4038  * because they will be added one by one in the given order
4039  * during the construction of the solution map.
4040  */
4041 static struct isl_sol *basic_map_partial_lexopt_base(
4042         __isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
4043         __isl_give isl_set **empty, int max,
4044         struct isl_sol *(*init)(__isl_keep isl_basic_map *bmap,
4045                     __isl_take isl_basic_set *dom, int track_empty, int max))
4046 {
4047         struct isl_tab *tab;
4048         struct isl_sol *sol = NULL;
4049         struct isl_context *context;
4050
4051         if (dom->n_div) {
4052                 dom = isl_basic_set_order_divs(dom);
4053                 bmap = align_context_divs(bmap, dom);
4054         }
4055         sol = init(bmap, dom, !!empty, max);
4056         if (!sol)
4057                 goto error;
4058
4059         context = sol->context;
4060         if (isl_basic_set_plain_is_empty(context->op->peek_basic_set(context)))
4061                 /* nothing */;
4062         else if (isl_basic_map_plain_is_empty(bmap)) {
4063                 if (sol->add_empty)
4064                         sol->add_empty(sol,
4065                     isl_basic_set_copy(context->op->peek_basic_set(context)));
4066         } else {
4067                 tab = tab_for_lexmin(bmap,
4068                                     context->op->peek_basic_set(context), 1, max);
4069                 tab = context->op->detect_nonnegative_parameters(context, tab);
4070                 find_solutions_main(sol, tab);
4071         }
4072         if (sol->error)
4073                 goto error;
4074
4075         isl_basic_map_free(bmap);
4076         return sol;
4077 error:
4078         sol_free(sol);
4079         isl_basic_map_free(bmap);
4080         return NULL;
4081 }
4082
4083 /* Base case of isl_tab_basic_map_partial_lexopt, after removing
4084  * some obvious symmetries.
4085  *
4086  * We call basic_map_partial_lexopt_base and extract the results.
4087  */
4088 static __isl_give isl_map *basic_map_partial_lexopt_base_map(
4089         __isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
4090         __isl_give isl_set **empty, int max)
4091 {
4092         isl_map *result = NULL;
4093         struct isl_sol *sol;
4094         struct isl_sol_map *sol_map;
4095
4096         sol = basic_map_partial_lexopt_base(bmap, dom, empty, max,
4097                                             &sol_map_init);
4098         if (!sol)
4099                 return NULL;
4100         sol_map = (struct isl_sol_map *) sol;
4101
4102         result = isl_map_copy(sol_map->map);
4103         if (empty)
4104                 *empty = isl_set_copy(sol_map->empty);
4105         sol_free(&sol_map->sol);
4106         return result;
4107 }
4108
4109 /* Structure used during detection of parallel constraints.
4110  * n_in: number of "input" variables: isl_dim_param + isl_dim_in
4111  * n_out: number of "output" variables: isl_dim_out + isl_dim_div
4112  * val: the coefficients of the output variables
4113  */
4114 struct isl_constraint_equal_info {
4115         isl_basic_map *bmap;
4116         unsigned n_in;
4117         unsigned n_out;
4118         isl_int *val;
4119 };
4120
4121 /* Check whether the coefficients of the output variables
4122  * of the constraint in "entry" are equal to info->val.
4123  */
4124 static int constraint_equal(const void *entry, const void *val)
4125 {
4126         isl_int **row = (isl_int **)entry;
4127         const struct isl_constraint_equal_info *info = val;
4128
4129         return isl_seq_eq((*row) + 1 + info->n_in, info->val, info->n_out);
4130 }
4131
4132 /* Check whether "bmap" has a pair of constraints that have
4133  * the same coefficients for the output variables.
4134  * Note that the coefficients of the existentially quantified
4135  * variables need to be zero since the existentially quantified
4136  * of the result are usually not the same as those of the input.
4137  * the isl_dim_out and isl_dim_div dimensions.
4138  * If so, return 1 and return the row indices of the two constraints
4139  * in *first and *second.
4140  */
4141 static int parallel_constraints(__isl_keep isl_basic_map *bmap,
4142         int *first, int *second)
4143 {
4144         int i;
4145         isl_ctx *ctx = isl_basic_map_get_ctx(bmap);
4146         struct isl_hash_table *table = NULL;
4147         struct isl_hash_table_entry *entry;
4148         struct isl_constraint_equal_info info;
4149         unsigned n_out;
4150         unsigned n_div;
4151
4152         ctx = isl_basic_map_get_ctx(bmap);
4153         table = isl_hash_table_alloc(ctx, bmap->n_ineq);
4154         if (!table)
4155                 goto error;
4156
4157         info.n_in = isl_basic_map_dim(bmap, isl_dim_param) +
4158                     isl_basic_map_dim(bmap, isl_dim_in);
4159         info.bmap = bmap;
4160         n_out = isl_basic_map_dim(bmap, isl_dim_out);
4161         n_div = isl_basic_map_dim(bmap, isl_dim_div);
4162         info.n_out = n_out + n_div;
4163         for (i = 0; i < bmap->n_ineq; ++i) {
4164                 uint32_t hash;
4165
4166                 info.val = bmap->ineq[i] + 1 + info.n_in;
4167                 if (isl_seq_first_non_zero(info.val, n_out) < 0)
4168                         continue;
4169                 if (isl_seq_first_non_zero(info.val + n_out, n_div) >= 0)
4170                         continue;
4171                 hash = isl_seq_get_hash(info.val, info.n_out);
4172                 entry = isl_hash_table_find(ctx, table, hash,
4173                                             constraint_equal, &info, 1);
4174                 if (!entry)
4175                         goto error;
4176                 if (entry->data)
4177                         break;
4178                 entry->data = &bmap->ineq[i];
4179         }
4180
4181         if (i < bmap->n_ineq) {
4182                 *first = ((isl_int **)entry->data) - bmap->ineq; 
4183                 *second = i;
4184         }
4185
4186         isl_hash_table_free(ctx, table);
4187
4188         return i < bmap->n_ineq;
4189 error:
4190         isl_hash_table_free(ctx, table);
4191         return -1;
4192 }
4193
4194 /* Given a set of upper bounds in "var", add constraints to "bset"
4195  * that make the i-th bound smallest.
4196  *
4197  * In particular, if there are n bounds b_i, then add the constraints
4198  *
4199  *      b_i <= b_j      for j > i
4200  *      b_i <  b_j      for j < i
4201  */
4202 static __isl_give isl_basic_set *select_minimum(__isl_take isl_basic_set *bset,
4203         __isl_keep isl_mat *var, int i)
4204 {
4205         isl_ctx *ctx;
4206         int j, k;
4207
4208         ctx = isl_mat_get_ctx(var);
4209
4210         for (j = 0; j < var->n_row; ++j) {
4211                 if (j == i)
4212                         continue;
4213                 k = isl_basic_set_alloc_inequality(bset);
4214                 if (k < 0)
4215                         goto error;
4216                 isl_seq_combine(bset->ineq[k], ctx->one, var->row[j],
4217                                 ctx->negone, var->row[i], var->n_col);
4218                 isl_int_set_si(bset->ineq[k][var->n_col], 0);
4219                 if (j < i)
4220                         isl_int_sub_ui(bset->ineq[k][0], bset->ineq[k][0], 1);
4221         }
4222
4223         bset = isl_basic_set_finalize(bset);
4224
4225         return bset;
4226 error:
4227         isl_basic_set_free(bset);
4228         return NULL;
4229 }
4230
4231 /* Given a set of upper bounds on the last "input" variable m,
4232  * construct a set that assigns the minimal upper bound to m, i.e.,
4233  * construct a set that divides the space into cells where one
4234  * of the upper bounds is smaller than all the others and assign
4235  * this upper bound to m.
4236  *
4237  * In particular, if there are n bounds b_i, then the result
4238  * consists of n basic sets, each one of the form
4239  *
4240  *      m = b_i
4241  *      b_i <= b_j      for j > i
4242  *      b_i <  b_j      for j < i
4243  */
4244 static __isl_give isl_set *set_minimum(__isl_take isl_space *dim,
4245         __isl_take isl_mat *var)
4246 {
4247         int i, k;
4248         isl_basic_set *bset = NULL;
4249         isl_ctx *ctx;
4250         isl_set *set = NULL;
4251
4252         if (!dim || !var)
4253                 goto error;
4254
4255         ctx = isl_space_get_ctx(dim);
4256         set = isl_set_alloc_space(isl_space_copy(dim),
4257                                 var->n_row, ISL_SET_DISJOINT);
4258
4259         for (i = 0; i < var->n_row; ++i) {
4260                 bset = isl_basic_set_alloc_space(isl_space_copy(dim), 0,
4261                                                1, var->n_row - 1);
4262                 k = isl_basic_set_alloc_equality(bset);
4263                 if (k < 0)
4264                         goto error;
4265                 isl_seq_cpy(bset->eq[k], var->row[i], var->n_col);
4266                 isl_int_set_si(bset->eq[k][var->n_col], -1);
4267                 bset = select_minimum(bset, var, i);
4268                 set = isl_set_add_basic_set(set, bset);
4269         }
4270
4271         isl_space_free(dim);
4272         isl_mat_free(var);
4273         return set;
4274 error:
4275         isl_basic_set_free(bset);
4276         isl_set_free(set);
4277         isl_space_free(dim);
4278         isl_mat_free(var);
4279         return NULL;
4280 }
4281
4282 /* Given that the last input variable of "bmap" represents the minimum
4283  * of the bounds in "cst", check whether we need to split the domain
4284  * based on which bound attains the minimum.
4285  *
4286  * A split is needed when the minimum appears in an integer division
4287  * or in an equality.  Otherwise, it is only needed if it appears in
4288  * an upper bound that is different from the upper bounds on which it
4289  * is defined.
4290  */
4291 static int need_split_basic_map(__isl_keep isl_basic_map *bmap,
4292         __isl_keep isl_mat *cst)
4293 {
4294         int i, j;
4295         unsigned total;
4296         unsigned pos;
4297
4298         pos = cst->n_col - 1;
4299         total = isl_basic_map_dim(bmap, isl_dim_all);
4300
4301         for (i = 0; i < bmap->n_div; ++i)
4302                 if (!isl_int_is_zero(bmap->div[i][2 + pos]))
4303                         return 1;
4304
4305         for (i = 0; i < bmap->n_eq; ++i)
4306                 if (!isl_int_is_zero(bmap->eq[i][1 + pos]))
4307                         return 1;
4308
4309         for (i = 0; i < bmap->n_ineq; ++i) {
4310                 if (isl_int_is_nonneg(bmap->ineq[i][1 + pos]))
4311                         continue;
4312                 if (!isl_int_is_negone(bmap->ineq[i][1 + pos]))
4313                         return 1;
4314                 if (isl_seq_first_non_zero(bmap->ineq[i] + 1 + pos + 1,
4315                                            total - pos - 1) >= 0)
4316                         return 1;
4317
4318                 for (j = 0; j < cst->n_row; ++j)
4319                         if (isl_seq_eq(bmap->ineq[i], cst->row[j], cst->n_col))
4320                                 break;
4321                 if (j >= cst->n_row)
4322                         return 1;
4323         }
4324
4325         return 0;
4326 }
4327
4328 /* Given that the last set variable of "bset" represents the minimum
4329  * of the bounds in "cst", check whether we need to split the domain
4330  * based on which bound attains the minimum.
4331  *
4332  * We simply call need_split_basic_map here.  This is safe because
4333  * the position of the minimum is computed from "cst" and not
4334  * from "bmap".
4335  */
4336 static int need_split_basic_set(__isl_keep isl_basic_set *bset,
4337         __isl_keep isl_mat *cst)
4338 {
4339         return need_split_basic_map((isl_basic_map *)bset, cst);
4340 }
4341
4342 /* Given that the last set variable of "set" represents the minimum
4343  * of the bounds in "cst", check whether we need to split the domain
4344  * based on which bound attains the minimum.
4345  */
4346 static int need_split_set(__isl_keep isl_set *set, __isl_keep isl_mat *cst)
4347 {
4348         int i;
4349
4350         for (i = 0; i < set->n; ++i)
4351                 if (need_split_basic_set(set->p[i], cst))
4352                         return 1;
4353
4354         return 0;
4355 }
4356
4357 /* Given a set of which the last set variable is the minimum
4358  * of the bounds in "cst", split each basic set in the set
4359  * in pieces where one of the bounds is (strictly) smaller than the others.
4360  * This subdivision is given in "min_expr".
4361  * The variable is subsequently projected out.
4362  *
4363  * We only do the split when it is needed.
4364  * For example if the last input variable m = min(a,b) and the only
4365  * constraints in the given basic set are lower bounds on m,
4366  * i.e., l <= m = min(a,b), then we can simply project out m
4367  * to obtain l <= a and l <= b, without having to split on whether
4368  * m is equal to a or b.
4369  */
4370 static __isl_give isl_set *split(__isl_take isl_set *empty,
4371         __isl_take isl_set *min_expr, __isl_take isl_mat *cst)
4372 {
4373         int n_in;
4374         int i;
4375         isl_space *dim;
4376         isl_set *res;
4377
4378         if (!empty || !min_expr || !cst)
4379                 goto error;
4380
4381         n_in = isl_set_dim(empty, isl_dim_set);
4382         dim = isl_set_get_space(empty);
4383         dim = isl_space_drop_dims(dim, isl_dim_set, n_in - 1, 1);
4384         res = isl_set_empty(dim);
4385
4386         for (i = 0; i < empty->n; ++i) {
4387                 isl_set *set;
4388
4389                 set = isl_set_from_basic_set(isl_basic_set_copy(empty->p[i]));
4390                 if (need_split_basic_set(empty->p[i], cst))
4391                         set = isl_set_intersect(set, isl_set_copy(min_expr));
4392                 set = isl_set_remove_dims(set, isl_dim_set, n_in - 1, 1);
4393
4394                 res = isl_set_union_disjoint(res, set);
4395         }
4396
4397         isl_set_free(empty);
4398         isl_set_free(min_expr);
4399         isl_mat_free(cst);
4400         return res;
4401 error:
4402         isl_set_free(empty);
4403         isl_set_free(min_expr);
4404         isl_mat_free(cst);
4405         return NULL;
4406 }
4407
4408 /* Given a map of which the last input variable is the minimum
4409  * of the bounds in "cst", split each basic set in the set
4410  * in pieces where one of the bounds is (strictly) smaller than the others.
4411  * This subdivision is given in "min_expr".
4412  * The variable is subsequently projected out.
4413  *
4414  * The implementation is essentially the same as that of "split".
4415  */
4416 static __isl_give isl_map *split_domain(__isl_take isl_map *opt,
4417         __isl_take isl_set *min_expr, __isl_take isl_mat *cst)
4418 {
4419         int n_in;
4420         int i;
4421         isl_space *dim;
4422         isl_map *res;
4423
4424         if (!opt || !min_expr || !cst)
4425                 goto error;
4426
4427         n_in = isl_map_dim(opt, isl_dim_in);
4428         dim = isl_map_get_space(opt);
4429         dim = isl_space_drop_dims(dim, isl_dim_in, n_in - 1, 1);
4430         res = isl_map_empty(dim);
4431
4432         for (i = 0; i < opt->n; ++i) {
4433                 isl_map *map;
4434
4435                 map = isl_map_from_basic_map(isl_basic_map_copy(opt->p[i]));
4436                 if (need_split_basic_map(opt->p[i], cst))
4437                         map = isl_map_intersect_domain(map,
4438                                                        isl_set_copy(min_expr));
4439                 map = isl_map_remove_dims(map, isl_dim_in, n_in - 1, 1);
4440
4441                 res = isl_map_union_disjoint(res, map);
4442         }
4443
4444         isl_map_free(opt);
4445         isl_set_free(min_expr);
4446         isl_mat_free(cst);
4447         return res;
4448 error:
4449         isl_map_free(opt);
4450         isl_set_free(min_expr);
4451         isl_mat_free(cst);
4452         return NULL;
4453 }
4454
4455 static __isl_give isl_map *basic_map_partial_lexopt(
4456         __isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
4457         __isl_give isl_set **empty, int max);
4458
4459 union isl_lex_res {
4460         void *p;
4461         isl_map *map;
4462         isl_pw_multi_aff *pma;
4463 };
4464
4465 /* This function is called from basic_map_partial_lexopt_symm.
4466  * The last variable of "bmap" and "dom" corresponds to the minimum
4467  * of the bounds in "cst".  "map_space" is the space of the original
4468  * input relation (of basic_map_partial_lexopt_symm) and "set_space"
4469  * is the space of the original domain.
4470  *
4471  * We recursively call basic_map_partial_lexopt and then plug in
4472  * the definition of the minimum in the result.
4473  */
4474 static __isl_give union isl_lex_res basic_map_partial_lexopt_symm_map_core(
4475         __isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
4476         __isl_give isl_set **empty, int max, __isl_take isl_mat *cst,
4477         __isl_take isl_space *map_space, __isl_take isl_space *set_space)
4478 {
4479         isl_map *opt;
4480         isl_set *min_expr;
4481         union isl_lex_res res;
4482
4483         min_expr = set_minimum(isl_basic_set_get_space(dom), isl_mat_copy(cst));
4484
4485         opt = basic_map_partial_lexopt(bmap, dom, empty, max);
4486
4487         if (empty) {
4488                 *empty = split(*empty,
4489                                isl_set_copy(min_expr), isl_mat_copy(cst));
4490                 *empty = isl_set_reset_space(*empty, set_space);
4491         }
4492
4493         opt = split_domain(opt, min_expr, cst);
4494         opt = isl_map_reset_space(opt, map_space);
4495
4496         res.map = opt;
4497         return res;
4498 }
4499
4500 /* Given a basic map with at least two parallel constraints (as found
4501  * by the function parallel_constraints), first look for more constraints
4502  * parallel to the two constraint and replace the found list of parallel
4503  * constraints by a single constraint with as "input" part the minimum
4504  * of the input parts of the list of constraints.  Then, recursively call
4505  * basic_map_partial_lexopt (possibly finding more parallel constraints)
4506  * and plug in the definition of the minimum in the result.
4507  *
4508  * More specifically, given a set of constraints
4509  *
4510  *      a x + b_i(p) >= 0
4511  *
4512  * Replace this set by a single constraint
4513  *
4514  *      a x + u >= 0
4515  *
4516  * with u a new parameter with constraints
4517  *
4518  *      u <= b_i(p)
4519  *
4520  * Any solution to the new system is also a solution for the original system
4521  * since
4522  *
4523  *      a x >= -u >= -b_i(p)
4524  *
4525  * Moreover, m = min_i(b_i(p)) satisfies the constraints on u and can
4526  * therefore be plugged into the solution.
4527  */
4528 static union isl_lex_res basic_map_partial_lexopt_symm(
4529         __isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
4530         __isl_give isl_set **empty, int max, int first, int second,
4531         __isl_give union isl_lex_res (*core)(__isl_take isl_basic_map *bmap,
4532                                             __isl_take isl_basic_set *dom,
4533                                             __isl_give isl_set **empty,
4534                                             int max, __isl_take isl_mat *cst,
4535                                             __isl_take isl_space *map_space,
4536                                             __isl_take isl_space *set_space))
4537 {
4538         int i, n, k;
4539         int *list = NULL;
4540         unsigned n_in, n_out, n_div;
4541         isl_ctx *ctx;
4542         isl_vec *var = NULL;
4543         isl_mat *cst = NULL;
4544         isl_space *map_space, *set_space;
4545         union isl_lex_res res;
4546
4547         map_space = isl_basic_map_get_space(bmap);
4548         set_space = empty ? isl_basic_set_get_space(dom) : NULL;
4549
4550         n_in = isl_basic_map_dim(bmap, isl_dim_param) +
4551                isl_basic_map_dim(bmap, isl_dim_in);
4552         n_out = isl_basic_map_dim(bmap, isl_dim_all) - n_in;
4553
4554         ctx = isl_basic_map_get_ctx(bmap);
4555         list = isl_alloc_array(ctx, int, bmap->n_ineq);
4556         var = isl_vec_alloc(ctx, n_out);
4557         if (!list || !var)
4558                 goto error;
4559
4560         list[0] = first;
4561         list[1] = second;
4562         isl_seq_cpy(var->el, bmap->ineq[first] + 1 + n_in, n_out);
4563         for (i = second + 1, n = 2; i < bmap->n_ineq; ++i) {
4564                 if (isl_seq_eq(var->el, bmap->ineq[i] + 1 + n_in, n_out))
4565                         list[n++] = i;
4566         }
4567
4568         cst = isl_mat_alloc(ctx, n, 1 + n_in);
4569         if (!cst)
4570                 goto error;
4571
4572         for (i = 0; i < n; ++i)
4573                 isl_seq_cpy(cst->row[i], bmap->ineq[list[i]], 1 + n_in);
4574
4575         bmap = isl_basic_map_cow(bmap);
4576         if (!bmap)
4577                 goto error;
4578         for (i = n - 1; i >= 0; --i)
4579                 if (isl_basic_map_drop_inequality(bmap, list[i]) < 0)
4580                         goto error;
4581
4582         bmap = isl_basic_map_add(bmap, isl_dim_in, 1);
4583         bmap = isl_basic_map_extend_constraints(bmap, 0, 1);
4584         k = isl_basic_map_alloc_inequality(bmap);
4585         if (k < 0)
4586                 goto error;
4587         isl_seq_clr(bmap->ineq[k], 1 + n_in);
4588         isl_int_set_si(bmap->ineq[k][1 + n_in], 1);
4589         isl_seq_cpy(bmap->ineq[k] + 1 + n_in + 1, var->el, n_out);
4590         bmap = isl_basic_map_finalize(bmap);
4591
4592         n_div = isl_basic_set_dim(dom, isl_dim_div);
4593         dom = isl_basic_set_add_dims(dom, isl_dim_set, 1);
4594         dom = isl_basic_set_extend_constraints(dom, 0, n);
4595         for (i = 0; i < n; ++i) {
4596                 k = isl_basic_set_alloc_inequality(dom);
4597                 if (k < 0)
4598                         goto error;
4599                 isl_seq_cpy(dom->ineq[k], cst->row[i], 1 + n_in);
4600                 isl_int_set_si(dom->ineq[k][1 + n_in], -1);
4601                 isl_seq_clr(dom->ineq[k] + 1 + n_in + 1, n_div);
4602         }
4603
4604         isl_vec_free(var);
4605         free(list);
4606
4607         return core(bmap, dom, empty, max, cst, map_space, set_space);
4608 error:
4609         isl_space_free(map_space);
4610         isl_space_free(set_space);
4611         isl_mat_free(cst);
4612         isl_vec_free(var);
4613         free(list);
4614         isl_basic_set_free(dom);
4615         isl_basic_map_free(bmap);
4616         res.p = NULL;
4617         return res;
4618 }
4619
4620 static __isl_give isl_map *basic_map_partial_lexopt_symm_map(
4621         __isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
4622         __isl_give isl_set **empty, int max, int first, int second)
4623 {
4624         return basic_map_partial_lexopt_symm(bmap, dom, empty, max,
4625                     first, second, &basic_map_partial_lexopt_symm_map_core).map;
4626 }
4627
4628 /* Recursive part of isl_tab_basic_map_partial_lexopt, after detecting
4629  * equalities and removing redundant constraints.
4630  *
4631  * We first check if there are any parallel constraints (left).
4632  * If not, we are in the base case.
4633  * If there are parallel constraints, we replace them by a single
4634  * constraint in basic_map_partial_lexopt_symm and then call
4635  * this function recursively to look for more parallel constraints.
4636  */
4637 static __isl_give isl_map *basic_map_partial_lexopt(
4638         __isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
4639         __isl_give isl_set **empty, int max)
4640 {
4641         int par = 0;
4642         int first, second;
4643
4644         if (!bmap)
4645                 goto error;
4646
4647         if (bmap->ctx->opt->pip_symmetry)
4648                 par = parallel_constraints(bmap, &first, &second);
4649         if (par < 0)
4650                 goto error;
4651         if (!par)
4652                 return basic_map_partial_lexopt_base_map(bmap, dom, empty, max);
4653         
4654         return basic_map_partial_lexopt_symm_map(bmap, dom, empty, max,
4655                                                  first, second);
4656 error:
4657         isl_basic_set_free(dom);
4658         isl_basic_map_free(bmap);
4659         return NULL;
4660 }
4661
4662 /* Compute the lexicographic minimum (or maximum if "max" is set)
4663  * of "bmap" over the domain "dom" and return the result as a map.
4664  * If "empty" is not NULL, then *empty is assigned a set that
4665  * contains those parts of the domain where there is no solution.
4666  * If "bmap" is marked as rational (ISL_BASIC_MAP_RATIONAL),
4667  * then we compute the rational optimum.  Otherwise, we compute
4668  * the integral optimum.
4669  *
4670  * We perform some preprocessing.  As the PILP solver does not
4671  * handle implicit equalities very well, we first make sure all
4672  * the equalities are explicitly available.
4673  *
4674  * We also add context constraints to the basic map and remove
4675  * redundant constraints.  This is only needed because of the
4676  * way we handle simple symmetries.  In particular, we currently look
4677  * for symmetries on the constraints, before we set up the main tableau.
4678  * It is then no good to look for symmetries on possibly redundant constraints.
4679  */
4680 struct isl_map *isl_tab_basic_map_partial_lexopt(
4681                 struct isl_basic_map *bmap, struct isl_basic_set *dom,
4682                 struct isl_set **empty, int max)
4683 {
4684         if (empty)
4685                 *empty = NULL;
4686         if (!bmap || !dom)
4687                 goto error;
4688
4689         isl_assert(bmap->ctx,
4690             isl_basic_map_compatible_domain(bmap, dom), goto error);
4691
4692         if (isl_basic_set_dim(dom, isl_dim_all) == 0)
4693                 return basic_map_partial_lexopt(bmap, dom, empty, max);
4694
4695         bmap = isl_basic_map_intersect_domain(bmap, isl_basic_set_copy(dom));
4696         bmap = isl_basic_map_detect_equalities(bmap);
4697         bmap = isl_basic_map_remove_redundancies(bmap);
4698
4699         return basic_map_partial_lexopt(bmap, dom, empty, max);
4700 error:
4701         isl_basic_set_free(dom);
4702         isl_basic_map_free(bmap);
4703         return NULL;
4704 }
4705
4706 struct isl_sol_for {
4707         struct isl_sol  sol;
4708         int             (*fn)(__isl_take isl_basic_set *dom,
4709                                 __isl_take isl_aff_list *list, void *user);
4710         void            *user;
4711 };
4712
4713 static void sol_for_free(struct isl_sol_for *sol_for)
4714 {
4715         if (sol_for->sol.context)
4716                 sol_for->sol.context->op->free(sol_for->sol.context);
4717         free(sol_for);
4718 }
4719
4720 static void sol_for_free_wrap(struct isl_sol *sol)
4721 {
4722         sol_for_free((struct isl_sol_for *)sol);
4723 }
4724
4725 /* Add the solution identified by the tableau and the context tableau.
4726  *
4727  * See documentation of sol_add for more details.
4728  *
4729  * Instead of constructing a basic map, this function calls a user
4730  * defined function with the current context as a basic set and
4731  * a list of affine expressions representing the relation between
4732  * the input and output.  The space over which the affine expressions
4733  * are defined is the same as that of the domain.  The number of
4734  * affine expressions in the list is equal to the number of output variables.
4735  */
4736 static void sol_for_add(struct isl_sol_for *sol,
4737         struct isl_basic_set *dom, struct isl_mat *M)
4738 {
4739         int i;
4740         isl_ctx *ctx;
4741         isl_local_space *ls;
4742         isl_aff *aff;
4743         isl_aff_list *list;
4744
4745         if (sol->sol.error || !dom || !M)
4746                 goto error;
4747
4748         ctx = isl_basic_set_get_ctx(dom);
4749         ls = isl_basic_set_get_local_space(dom);
4750         list = isl_aff_list_alloc(ctx, M->n_row - 1);
4751         for (i = 1; i < M->n_row; ++i) {
4752                 aff = isl_aff_alloc(isl_local_space_copy(ls));
4753                 if (aff) {
4754                         isl_int_set(aff->v->el[0], M->row[0][0]);
4755                         isl_seq_cpy(aff->v->el + 1, M->row[i], M->n_col);
4756                 }
4757                 aff = isl_aff_normalize(aff);
4758                 list = isl_aff_list_add(list, aff);
4759         }
4760         isl_local_space_free(ls);
4761
4762         dom = isl_basic_set_finalize(dom);
4763
4764         if (sol->fn(isl_basic_set_copy(dom), list, sol->user) < 0)
4765                 goto error;
4766
4767         isl_basic_set_free(dom);
4768         isl_mat_free(M);
4769         return;
4770 error:
4771         isl_basic_set_free(dom);
4772         isl_mat_free(M);
4773         sol->sol.error = 1;
4774 }
4775
4776 static void sol_for_add_wrap(struct isl_sol *sol,
4777         struct isl_basic_set *dom, struct isl_mat *M)
4778 {
4779         sol_for_add((struct isl_sol_for *)sol, dom, M);
4780 }
4781
4782 static struct isl_sol_for *sol_for_init(struct isl_basic_map *bmap, int max,
4783         int (*fn)(__isl_take isl_basic_set *dom, __isl_take isl_aff_list *list,
4784                   void *user),
4785         void *user)
4786 {
4787         struct isl_sol_for *sol_for = NULL;
4788         isl_space *dom_dim;
4789         struct isl_basic_set *dom = NULL;
4790
4791         sol_for = isl_calloc_type(bmap->ctx, struct isl_sol_for);
4792         if (!sol_for)
4793                 goto error;
4794
4795         dom_dim = isl_space_domain(isl_space_copy(bmap->dim));
4796         dom = isl_basic_set_universe(dom_dim);
4797
4798         sol_for->sol.rational = ISL_F_ISSET(bmap, ISL_BASIC_MAP_RATIONAL);
4799         sol_for->sol.dec_level.callback.run = &sol_dec_level_wrap;
4800         sol_for->sol.dec_level.sol = &sol_for->sol;
4801         sol_for->fn = fn;
4802         sol_for->user = user;
4803         sol_for->sol.max = max;
4804         sol_for->sol.n_out = isl_basic_map_dim(bmap, isl_dim_out);
4805         sol_for->sol.add = &sol_for_add_wrap;
4806         sol_for->sol.add_empty = NULL;
4807         sol_for->sol.free = &sol_for_free_wrap;
4808
4809         sol_for->sol.context = isl_context_alloc(dom);
4810         if (!sol_for->sol.context)
4811                 goto error;
4812
4813         isl_basic_set_free(dom);
4814         return sol_for;
4815 error:
4816         isl_basic_set_free(dom);
4817         sol_for_free(sol_for);
4818         return NULL;
4819 }
4820
4821 static void sol_for_find_solutions(struct isl_sol_for *sol_for,
4822         struct isl_tab *tab)
4823 {
4824         find_solutions_main(&sol_for->sol, tab);
4825 }
4826
4827 int isl_basic_map_foreach_lexopt(__isl_keep isl_basic_map *bmap, int max,
4828         int (*fn)(__isl_take isl_basic_set *dom, __isl_take isl_aff_list *list,
4829                   void *user),
4830         void *user)
4831 {
4832         struct isl_sol_for *sol_for = NULL;
4833
4834         bmap = isl_basic_map_copy(bmap);
4835         bmap = isl_basic_map_detect_equalities(bmap);
4836         if (!bmap)
4837                 return -1;
4838
4839         sol_for = sol_for_init(bmap, max, fn, user);
4840         if (!sol_for)
4841                 goto error;
4842
4843         if (isl_basic_map_plain_is_empty(bmap))
4844                 /* nothing */;
4845         else {
4846                 struct isl_tab *tab;
4847                 struct isl_context *context = sol_for->sol.context;
4848                 tab = tab_for_lexmin(bmap,
4849                                 context->op->peek_basic_set(context), 1, max);
4850                 tab = context->op->detect_nonnegative_parameters(context, tab);
4851                 sol_for_find_solutions(sol_for, tab);
4852                 if (sol_for->sol.error)
4853                         goto error;
4854         }
4855
4856         sol_free(&sol_for->sol);
4857         isl_basic_map_free(bmap);
4858         return 0;
4859 error:
4860         sol_free(&sol_for->sol);
4861         isl_basic_map_free(bmap);
4862         return -1;
4863 }
4864
4865 int isl_basic_set_foreach_lexopt(__isl_keep isl_basic_set *bset, int max,
4866         int (*fn)(__isl_take isl_basic_set *dom, __isl_take isl_aff_list *list,
4867                   void *user),
4868         void *user)
4869 {
4870         return isl_basic_map_foreach_lexopt(bset, max, fn, user);
4871 }
4872
4873 /* Check if the given sequence of len variables starting at pos
4874  * represents a trivial (i.e., zero) solution.
4875  * The variables are assumed to be non-negative and to come in pairs,
4876  * with each pair representing a variable of unrestricted sign.
4877  * The solution is trivial if each such pair in the sequence consists
4878  * of two identical values, meaning that the variable being represented
4879  * has value zero.
4880  */
4881 static int region_is_trivial(struct isl_tab *tab, int pos, int len)
4882 {
4883         int i;
4884
4885         if (len == 0)
4886                 return 0;
4887
4888         for (i = 0; i < len; i +=  2) {
4889                 int neg_row;
4890                 int pos_row;
4891
4892                 neg_row = tab->var[pos + i].is_row ?
4893                                 tab->var[pos + i].index : -1;
4894                 pos_row = tab->var[pos + i + 1].is_row ?
4895                                 tab->var[pos + i + 1].index : -1;
4896
4897                 if ((neg_row < 0 ||
4898                      isl_int_is_zero(tab->mat->row[neg_row][1])) &&
4899                     (pos_row < 0 ||
4900                      isl_int_is_zero(tab->mat->row[pos_row][1])))
4901                         continue;
4902
4903                 if (neg_row < 0 || pos_row < 0)
4904                         return 0;
4905                 if (isl_int_ne(tab->mat->row[neg_row][1],
4906                                tab->mat->row[pos_row][1]))
4907                         return 0;
4908         }
4909
4910         return 1;
4911 }
4912
4913 /* Return the index of the first trivial region or -1 if all regions
4914  * are non-trivial.
4915  */
4916 static int first_trivial_region(struct isl_tab *tab,
4917         int n_region, struct isl_region *region)
4918 {
4919         int i;
4920
4921         for (i = 0; i < n_region; ++i) {
4922                 if (region_is_trivial(tab, region[i].pos, region[i].len))
4923                         return i;
4924         }
4925
4926         return -1;
4927 }
4928
4929 /* Check if the solution is optimal, i.e., whether the first
4930  * n_op entries are zero.
4931  */
4932 static int is_optimal(__isl_keep isl_vec *sol, int n_op)
4933 {
4934         int i;
4935
4936         for (i = 0; i < n_op; ++i)
4937                 if (!isl_int_is_zero(sol->el[1 + i]))
4938                         return 0;
4939         return 1;
4940 }
4941
4942 /* Add constraints to "tab" that ensure that any solution is significantly
4943  * better that that represented by "sol".  That is, find the first
4944  * relevant (within first n_op) non-zero coefficient and force it (along
4945  * with all previous coefficients) to be zero.
4946  * If the solution is already optimal (all relevant coefficients are zero),
4947  * then just mark the table as empty.
4948  */
4949 static int force_better_solution(struct isl_tab *tab,
4950         __isl_keep isl_vec *sol, int n_op)
4951 {
4952         int i;
4953         isl_ctx *ctx;
4954         isl_vec *v = NULL;
4955
4956         if (!sol)
4957                 return -1;
4958
4959         for (i = 0; i < n_op; ++i)
4960                 if (!isl_int_is_zero(sol->el[1 + i]))
4961                         break;
4962
4963         if (i == n_op) {
4964                 if (isl_tab_mark_empty(tab) < 0)
4965                         return -1;
4966                 return 0;
4967         }
4968
4969         ctx = isl_vec_get_ctx(sol);
4970         v = isl_vec_alloc(ctx, 1 + tab->n_var);
4971         if (!v)
4972                 return -1;
4973
4974         for (; i >= 0; --i) {
4975                 v = isl_vec_clr(v);
4976                 isl_int_set_si(v->el[1 + i], -1);
4977                 if (add_lexmin_eq(tab, v->el) < 0)
4978                         goto error;
4979         }
4980
4981         isl_vec_free(v);
4982         return 0;
4983 error:
4984         isl_vec_free(v);
4985         return -1;
4986 }
4987
4988 struct isl_trivial {
4989         int update;
4990         int region;
4991         int side;
4992         struct isl_tab_undo *snap;
4993 };
4994
4995 /* Return the lexicographically smallest non-trivial solution of the
4996  * given ILP problem.
4997  *
4998  * All variables are assumed to be non-negative.
4999  *
5000  * n_op is the number of initial coordinates to optimize.
5001  * That is, once a solution has been found, we will only continue looking
5002  * for solution that result in significantly better values for those
5003  * initial coordinates.  That is, we only continue looking for solutions
5004  * that increase the number of initial zeros in this sequence.
5005  *
5006  * A solution is non-trivial, if it is non-trivial on each of the
5007  * specified regions.  Each region represents a sequence of pairs
5008  * of variables.  A solution is non-trivial on such a region if
5009  * at least one of these pairs consists of different values, i.e.,
5010  * such that the non-negative variable represented by the pair is non-zero.
5011  *
5012  * Whenever a conflict is encountered, all constraints involved are
5013  * reported to the caller through a call to "conflict".
5014  *
5015  * We perform a simple branch-and-bound backtracking search.
5016  * Each level in the search represents initially trivial region that is forced
5017  * to be non-trivial.
5018  * At each level we consider n cases, where n is the length of the region.
5019  * In terms of the n/2 variables of unrestricted signs being encoded by
5020  * the region, we consider the cases
5021  *      x_0 >= 1
5022  *      x_0 <= -1
5023  *      x_0 = 0 and x_1 >= 1
5024  *      x_0 = 0 and x_1 <= -1
5025  *      x_0 = 0 and x_1 = 0 and x_2 >= 1
5026  *      x_0 = 0 and x_1 = 0 and x_2 <= -1
5027  *      ...
5028  * The cases are considered in this order, assuming that each pair
5029  * x_i_a x_i_b represents the value x_i_b - x_i_a.
5030  * That is, x_0 >= 1 is enforced by adding the constraint
5031  *      x_0_b - x_0_a >= 1
5032  */
5033 __isl_give isl_vec *isl_tab_basic_set_non_trivial_lexmin(
5034         __isl_take isl_basic_set *bset, int n_op, int n_region,
5035         struct isl_region *region,
5036         int (*conflict)(int con, void *user), void *user)
5037 {
5038         int i, j;
5039         int r;
5040         isl_ctx *ctx;
5041         isl_vec *v = NULL;
5042         isl_vec *sol = NULL;
5043         struct isl_tab *tab;
5044         struct isl_trivial *triv = NULL;
5045         int level, init;
5046
5047         if (!bset)
5048                 return NULL;
5049
5050         ctx = isl_basic_set_get_ctx(bset);
5051         sol = isl_vec_alloc(ctx, 0);
5052
5053         tab = tab_for_lexmin(bset, NULL, 0, 0);
5054         if (!tab)
5055                 goto error;
5056         tab->conflict = conflict;
5057         tab->conflict_user = user;
5058
5059         v = isl_vec_alloc(ctx, 1 + tab->n_var);
5060         triv = isl_calloc_array(ctx, struct isl_trivial, n_region);
5061         if (!v || !triv)
5062                 goto error;
5063
5064         level = 0;
5065         init = 1;
5066
5067         while (level >= 0) {
5068                 int side, base;
5069
5070                 if (init) {
5071                         tab = cut_to_integer_lexmin(tab, CUT_ONE);
5072                         if (!tab)
5073                                 goto error;
5074                         if (tab->empty)
5075                                 goto backtrack;
5076                         r = first_trivial_region(tab, n_region, region);
5077                         if (r < 0) {
5078                                 for (i = 0; i < level; ++i)
5079                                         triv[i].update = 1;
5080                                 isl_vec_free(sol);
5081                                 sol = isl_tab_get_sample_value(tab);
5082                                 if (!sol)
5083                                         goto error;
5084                                 if (is_optimal(sol, n_op))
5085                                         break;
5086                                 goto backtrack;
5087                         }
5088                         if (level >= n_region)
5089                                 isl_die(ctx, isl_error_internal,
5090                                         "nesting level too deep", goto error);
5091                         if (isl_tab_extend_cons(tab,
5092                                             2 * region[r].len + 2 * n_op) < 0)
5093                                 goto error;
5094                         triv[level].region = r;
5095                         triv[level].side = 0;
5096                 }
5097
5098                 r = triv[level].region;
5099                 side = triv[level].side;
5100                 base = 2 * (side/2);
5101
5102                 if (side >= region[r].len) {
5103 backtrack:
5104                         level--;
5105                         init = 0;
5106                         if (level >= 0)
5107                                 if (isl_tab_rollback(tab, triv[level].snap) < 0)
5108                                         goto error;
5109                         continue;
5110                 }
5111
5112                 if (triv[level].update) {
5113                         if (force_better_solution(tab, sol, n_op) < 0)
5114                                 goto error;
5115                         triv[level].update = 0;
5116                 }
5117
5118                 if (side == base && base >= 2) {
5119                         for (j = base - 2; j < base; ++j) {
5120                                 v = isl_vec_clr(v);
5121                                 isl_int_set_si(v->el[1 + region[r].pos + j], 1);
5122                                 if (add_lexmin_eq(tab, v->el) < 0)
5123                                         goto error;
5124                         }
5125                 }
5126
5127                 triv[level].snap = isl_tab_snap(tab);
5128                 if (isl_tab_push_basis(tab) < 0)
5129                         goto error;
5130
5131                 v = isl_vec_clr(v);
5132                 isl_int_set_si(v->el[0], -1);
5133                 isl_int_set_si(v->el[1 + region[r].pos + side], -1);
5134                 isl_int_set_si(v->el[1 + region[r].pos + (side ^ 1)], 1);
5135                 tab = add_lexmin_ineq(tab, v->el);
5136
5137                 triv[level].side++;
5138                 level++;
5139                 init = 1;
5140         }
5141
5142         free(triv);
5143         isl_vec_free(v);
5144         isl_tab_free(tab);
5145         isl_basic_set_free(bset);
5146
5147         return sol;
5148 error:
5149         free(triv);
5150         isl_vec_free(v);
5151         isl_tab_free(tab);
5152         isl_basic_set_free(bset);
5153         isl_vec_free(sol);
5154         return NULL;
5155 }
5156
5157 /* Return the lexicographically smallest rational point in "bset",
5158  * assuming that all variables are non-negative.
5159  * If "bset" is empty, then return a zero-length vector.
5160  */
5161 __isl_give isl_vec *isl_tab_basic_set_non_neg_lexmin(
5162         __isl_take isl_basic_set *bset)
5163 {
5164         struct isl_tab *tab;
5165         isl_ctx *ctx = isl_basic_set_get_ctx(bset);
5166         isl_vec *sol;
5167
5168         if (!bset)
5169                 return NULL;
5170
5171         tab = tab_for_lexmin(bset, NULL, 0, 0);
5172         if (!tab)
5173                 goto error;
5174         if (tab->empty)
5175                 sol = isl_vec_alloc(ctx, 0);
5176         else
5177                 sol = isl_tab_get_sample_value(tab);
5178         isl_tab_free(tab);
5179         isl_basic_set_free(bset);
5180         return sol;
5181 error:
5182         isl_tab_free(tab);
5183         isl_basic_set_free(bset);
5184         return NULL;
5185 }
5186
5187 struct isl_sol_pma {
5188         struct isl_sol  sol;
5189         isl_pw_multi_aff *pma;
5190         isl_set *empty;
5191 };
5192
5193 static void sol_pma_free(struct isl_sol_pma *sol_pma)
5194 {
5195         if (!sol_pma)
5196                 return;
5197         if (sol_pma->sol.context)
5198                 sol_pma->sol.context->op->free(sol_pma->sol.context);
5199         isl_pw_multi_aff_free(sol_pma->pma);
5200         isl_set_free(sol_pma->empty);
5201         free(sol_pma);
5202 }
5203
5204 /* This function is called for parts of the context where there is
5205  * no solution, with "bset" corresponding to the context tableau.
5206  * Simply add the basic set to the set "empty".
5207  */
5208 static void sol_pma_add_empty(struct isl_sol_pma *sol,
5209         __isl_take isl_basic_set *bset)
5210 {
5211         if (!bset)
5212                 goto error;
5213         isl_assert(bset->ctx, sol->empty, goto error);
5214
5215         sol->empty = isl_set_grow(sol->empty, 1);
5216         bset = isl_basic_set_simplify(bset);
5217         bset = isl_basic_set_finalize(bset);
5218         sol->empty = isl_set_add_basic_set(sol->empty, bset);
5219         if (!sol->empty)
5220                 sol->sol.error = 1;
5221         return;
5222 error:
5223         isl_basic_set_free(bset);
5224         sol->sol.error = 1;
5225 }
5226
5227 /* Given a basic map "dom" that represents the context and an affine
5228  * matrix "M" that maps the dimensions of the context to the
5229  * output variables, construct an isl_pw_multi_aff with a single
5230  * cell corresponding to "dom" and affine expressions copied from "M".
5231  */
5232 static void sol_pma_add(struct isl_sol_pma *sol,
5233         __isl_take isl_basic_set *dom, __isl_take isl_mat *M)
5234 {
5235         int i;
5236         isl_local_space *ls;
5237         isl_aff *aff;
5238         isl_multi_aff *maff;
5239         isl_pw_multi_aff *pma;
5240
5241         maff = isl_multi_aff_alloc(isl_pw_multi_aff_get_space(sol->pma));
5242         ls = isl_basic_set_get_local_space(dom);
5243         for (i = 1; i < M->n_row; ++i) {
5244                 aff = isl_aff_alloc(isl_local_space_copy(ls));
5245                 if (aff) {
5246                         isl_int_set(aff->v->el[0], M->row[0][0]);
5247                         isl_seq_cpy(aff->v->el + 1, M->row[i], M->n_col);
5248                 }
5249                 aff = isl_aff_normalize(aff);
5250                 maff = isl_multi_aff_set_aff(maff, i - 1, aff);
5251         }
5252         isl_local_space_free(ls);
5253         isl_mat_free(M);
5254         dom = isl_basic_set_simplify(dom);
5255         dom = isl_basic_set_finalize(dom);
5256         pma = isl_pw_multi_aff_alloc(isl_set_from_basic_set(dom), maff);
5257         sol->pma = isl_pw_multi_aff_add_disjoint(sol->pma, pma);
5258         if (!sol->pma)
5259                 sol->sol.error = 1;
5260 }
5261
5262 static void sol_pma_free_wrap(struct isl_sol *sol)
5263 {
5264         sol_pma_free((struct isl_sol_pma *)sol);
5265 }
5266
5267 static void sol_pma_add_empty_wrap(struct isl_sol *sol,
5268         __isl_take isl_basic_set *bset)
5269 {
5270         sol_pma_add_empty((struct isl_sol_pma *)sol, bset);
5271 }
5272
5273 static void sol_pma_add_wrap(struct isl_sol *sol,
5274         __isl_take isl_basic_set *dom, __isl_take isl_mat *M)
5275 {
5276         sol_pma_add((struct isl_sol_pma *)sol, dom, M);
5277 }
5278
5279 /* Construct an isl_sol_pma structure for accumulating the solution.
5280  * If track_empty is set, then we also keep track of the parts
5281  * of the context where there is no solution.
5282  * If max is set, then we are solving a maximization, rather than
5283  * a minimization problem, which means that the variables in the
5284  * tableau have value "M - x" rather than "M + x".
5285  */
5286 static struct isl_sol *sol_pma_init(__isl_keep isl_basic_map *bmap,
5287         __isl_take isl_basic_set *dom, int track_empty, int max)
5288 {
5289         struct isl_sol_pma *sol_pma = NULL;
5290
5291         if (!bmap)
5292                 goto error;
5293
5294         sol_pma = isl_calloc_type(bmap->ctx, struct isl_sol_pma);
5295         if (!sol_pma)
5296                 goto error;
5297
5298         sol_pma->sol.rational = ISL_F_ISSET(bmap, ISL_BASIC_MAP_RATIONAL);
5299         sol_pma->sol.dec_level.callback.run = &sol_dec_level_wrap;
5300         sol_pma->sol.dec_level.sol = &sol_pma->sol;
5301         sol_pma->sol.max = max;
5302         sol_pma->sol.n_out = isl_basic_map_dim(bmap, isl_dim_out);
5303         sol_pma->sol.add = &sol_pma_add_wrap;
5304         sol_pma->sol.add_empty = track_empty ? &sol_pma_add_empty_wrap : NULL;
5305         sol_pma->sol.free = &sol_pma_free_wrap;
5306         sol_pma->pma = isl_pw_multi_aff_empty(isl_basic_map_get_space(bmap));
5307         if (!sol_pma->pma)
5308                 goto error;
5309
5310         sol_pma->sol.context = isl_context_alloc(dom);
5311         if (!sol_pma->sol.context)
5312                 goto error;
5313
5314         if (track_empty) {
5315                 sol_pma->empty = isl_set_alloc_space(isl_basic_set_get_space(dom),
5316                                                         1, ISL_SET_DISJOINT);
5317                 if (!sol_pma->empty)
5318                         goto error;
5319         }
5320
5321         isl_basic_set_free(dom);
5322         return &sol_pma->sol;
5323 error:
5324         isl_basic_set_free(dom);
5325         sol_pma_free(sol_pma);
5326         return NULL;
5327 }
5328
5329 /* Base case of isl_tab_basic_map_partial_lexopt, after removing
5330  * some obvious symmetries.
5331  *
5332  * We call basic_map_partial_lexopt_base and extract the results.
5333  */
5334 static __isl_give isl_pw_multi_aff *basic_map_partial_lexopt_base_pma(
5335         __isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
5336         __isl_give isl_set **empty, int max)
5337 {
5338         isl_pw_multi_aff *result = NULL;
5339         struct isl_sol *sol;
5340         struct isl_sol_pma *sol_pma;
5341
5342         sol = basic_map_partial_lexopt_base(bmap, dom, empty, max,
5343                                             &sol_pma_init);
5344         if (!sol)
5345                 return NULL;
5346         sol_pma = (struct isl_sol_pma *) sol;
5347
5348         result = isl_pw_multi_aff_copy(sol_pma->pma);
5349         if (empty)
5350                 *empty = isl_set_copy(sol_pma->empty);
5351         sol_free(&sol_pma->sol);
5352         return result;
5353 }
5354
5355 /* Given that the last input variable of "maff" represents the minimum
5356  * of some bounds, check whether we need to plug in the expression
5357  * of the minimum.
5358  *
5359  * In particular, check if the last input variable appears in any
5360  * of the expressions in "maff".
5361  */
5362 static int need_substitution(__isl_keep isl_multi_aff *maff)
5363 {
5364         int i;
5365         unsigned pos;
5366
5367         pos = isl_multi_aff_dim(maff, isl_dim_in) - 1;
5368
5369         for (i = 0; i < maff->n; ++i)
5370                 if (isl_aff_involves_dims(maff->p[i], isl_dim_in, pos, 1))
5371                         return 1;
5372
5373         return 0;
5374 }
5375
5376 /* Given a set of upper bounds on the last "input" variable m,
5377  * construct a piecewise affine expression that selects
5378  * the minimal upper bound to m, i.e.,
5379  * divide the space into cells where one
5380  * of the upper bounds is smaller than all the others and select
5381  * this upper bound on that cell.
5382  *
5383  * In particular, if there are n bounds b_i, then the result
5384  * consists of n cell, each one of the form
5385  *
5386  *      b_i <= b_j      for j > i
5387  *      b_i <  b_j      for j < i
5388  *
5389  * The affine expression on this cell is
5390  *
5391  *      b_i
5392  */
5393 static __isl_give isl_pw_aff *set_minimum_pa(__isl_take isl_space *space,
5394         __isl_take isl_mat *var)
5395 {
5396         int i;
5397         isl_aff *aff = NULL;
5398         isl_basic_set *bset = NULL;
5399         isl_ctx *ctx;
5400         isl_pw_aff *paff = NULL;
5401         isl_space *pw_space;
5402         isl_local_space *ls = NULL;
5403
5404         if (!space || !var)
5405                 goto error;
5406
5407         ctx = isl_space_get_ctx(space);
5408         ls = isl_local_space_from_space(isl_space_copy(space));
5409         pw_space = isl_space_copy(space);
5410         pw_space = isl_space_from_domain(pw_space);
5411         pw_space = isl_space_add_dims(pw_space, isl_dim_out, 1);
5412         paff = isl_pw_aff_alloc_size(pw_space, var->n_row);
5413
5414         for (i = 0; i < var->n_row; ++i) {
5415                 isl_pw_aff *paff_i;
5416
5417                 aff = isl_aff_alloc(isl_local_space_copy(ls));
5418                 bset = isl_basic_set_alloc_space(isl_space_copy(space), 0,
5419                                                0, var->n_row - 1);
5420                 if (!aff || !bset)
5421                         goto error;
5422                 isl_int_set_si(aff->v->el[0], 1);
5423                 isl_seq_cpy(aff->v->el + 1, var->row[i], var->n_col);
5424                 isl_int_set_si(aff->v->el[1 + var->n_col], 0);
5425                 bset = select_minimum(bset, var, i);
5426                 paff_i = isl_pw_aff_alloc(isl_set_from_basic_set(bset), aff);
5427                 paff = isl_pw_aff_add_disjoint(paff, paff_i);
5428         }
5429
5430         isl_local_space_free(ls);
5431         isl_space_free(space);
5432         isl_mat_free(var);
5433         return paff;
5434 error:
5435         isl_aff_free(aff);
5436         isl_basic_set_free(bset);
5437         isl_pw_aff_free(paff);
5438         isl_local_space_free(ls);
5439         isl_space_free(space);
5440         isl_mat_free(var);
5441         return NULL;
5442 }
5443
5444 /* Given a piecewise multi-affine expression of which the last input variable
5445  * is the minimum of the bounds in "cst", plug in the value of the minimum.
5446  * This minimum expression is given in "min_expr_pa".
5447  * The set "min_expr" contains the same information, but in the form of a set.
5448  * The variable is subsequently projected out.
5449  *
5450  * The implementation is similar to those of "split" and "split_domain".
5451  * If the variable appears in a given expression, then minimum expression
5452  * is plugged in.  Otherwise, if the variable appears in the constraints
5453  * and a split is required, then the domain is split.  Otherwise, no split
5454  * is performed.
5455  */
5456 static __isl_give isl_pw_multi_aff *split_domain_pma(
5457         __isl_take isl_pw_multi_aff *opt, __isl_take isl_pw_aff *min_expr_pa,
5458         __isl_take isl_set *min_expr, __isl_take isl_mat *cst)
5459 {
5460         int n_in;
5461         int i;
5462         isl_space *space;
5463         isl_pw_multi_aff *res;
5464
5465         if (!opt || !min_expr || !cst)
5466                 goto error;
5467
5468         n_in = isl_pw_multi_aff_dim(opt, isl_dim_in);
5469         space = isl_pw_multi_aff_get_space(opt);
5470         space = isl_space_drop_dims(space, isl_dim_in, n_in - 1, 1);
5471         res = isl_pw_multi_aff_empty(space);
5472
5473         for (i = 0; i < opt->n; ++i) {
5474                 isl_pw_multi_aff *pma;
5475
5476                 pma = isl_pw_multi_aff_alloc(isl_set_copy(opt->p[i].set),
5477                                          isl_multi_aff_copy(opt->p[i].maff));
5478                 if (need_substitution(opt->p[i].maff))
5479                         pma = isl_pw_multi_aff_substitute(pma,
5480                                         isl_dim_in, n_in - 1, min_expr_pa);
5481                 else if (need_split_set(opt->p[i].set, cst))
5482                         pma = isl_pw_multi_aff_intersect_domain(pma,
5483                                                        isl_set_copy(min_expr));
5484                 pma = isl_pw_multi_aff_project_out(pma,
5485                                                     isl_dim_in, n_in - 1, 1);
5486
5487                 res = isl_pw_multi_aff_add_disjoint(res, pma);
5488         }
5489
5490         isl_pw_multi_aff_free(opt);
5491         isl_pw_aff_free(min_expr_pa);
5492         isl_set_free(min_expr);
5493         isl_mat_free(cst);
5494         return res;
5495 error:
5496         isl_pw_multi_aff_free(opt);
5497         isl_pw_aff_free(min_expr_pa);
5498         isl_set_free(min_expr);
5499         isl_mat_free(cst);
5500         return NULL;
5501 }
5502
5503 static __isl_give isl_pw_multi_aff *basic_map_partial_lexopt_pma(
5504         __isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
5505         __isl_give isl_set **empty, int max);
5506
5507 /* This function is called from basic_map_partial_lexopt_symm.
5508  * The last variable of "bmap" and "dom" corresponds to the minimum
5509  * of the bounds in "cst".  "map_space" is the space of the original
5510  * input relation (of basic_map_partial_lexopt_symm) and "set_space"
5511  * is the space of the original domain.
5512  *
5513  * We recursively call basic_map_partial_lexopt and then plug in
5514  * the definition of the minimum in the result.
5515  */
5516 static __isl_give union isl_lex_res basic_map_partial_lexopt_symm_pma_core(
5517         __isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
5518         __isl_give isl_set **empty, int max, __isl_take isl_mat *cst,
5519         __isl_take isl_space *map_space, __isl_take isl_space *set_space)
5520 {
5521         isl_pw_multi_aff *opt;
5522         isl_pw_aff *min_expr_pa;
5523         isl_set *min_expr;
5524         union isl_lex_res res;
5525
5526         min_expr = set_minimum(isl_basic_set_get_space(dom), isl_mat_copy(cst));
5527         min_expr_pa = set_minimum_pa(isl_basic_set_get_space(dom),
5528                                         isl_mat_copy(cst));
5529
5530         opt = basic_map_partial_lexopt_pma(bmap, dom, empty, max);
5531
5532         if (empty) {
5533                 *empty = split(*empty,
5534                                isl_set_copy(min_expr), isl_mat_copy(cst));
5535                 *empty = isl_set_reset_space(*empty, set_space);
5536         }
5537
5538         opt = split_domain_pma(opt, min_expr_pa, min_expr, cst);
5539         opt = isl_pw_multi_aff_reset_space(opt, map_space);
5540
5541         res.pma = opt;
5542         return res;
5543 }
5544
5545 static __isl_give isl_pw_multi_aff *basic_map_partial_lexopt_symm_pma(
5546         __isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
5547         __isl_give isl_set **empty, int max, int first, int second)
5548 {
5549         return basic_map_partial_lexopt_symm(bmap, dom, empty, max,
5550                     first, second, &basic_map_partial_lexopt_symm_pma_core).pma;
5551 }
5552
5553 /* Recursive part of isl_basic_map_partial_lexopt_pw_multi_aff, after detecting
5554  * equalities and removing redundant constraints.
5555  *
5556  * We first check if there are any parallel constraints (left).
5557  * If not, we are in the base case.
5558  * If there are parallel constraints, we replace them by a single
5559  * constraint in basic_map_partial_lexopt_symm_pma and then call
5560  * this function recursively to look for more parallel constraints.
5561  */
5562 static __isl_give isl_pw_multi_aff *basic_map_partial_lexopt_pma(
5563         __isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
5564         __isl_give isl_set **empty, int max)
5565 {
5566         int par = 0;
5567         int first, second;
5568
5569         if (!bmap)
5570                 goto error;
5571
5572         if (bmap->ctx->opt->pip_symmetry)
5573                 par = parallel_constraints(bmap, &first, &second);
5574         if (par < 0)
5575                 goto error;
5576         if (!par)
5577                 return basic_map_partial_lexopt_base_pma(bmap, dom, empty, max);
5578         
5579         return basic_map_partial_lexopt_symm_pma(bmap, dom, empty, max,
5580                                                  first, second);
5581 error:
5582         isl_basic_set_free(dom);
5583         isl_basic_map_free(bmap);
5584         return NULL;
5585 }
5586
5587 /* Compute the lexicographic minimum (or maximum if "max" is set)
5588  * of "bmap" over the domain "dom" and return the result as a piecewise
5589  * multi-affine expression.
5590  * If "empty" is not NULL, then *empty is assigned a set that
5591  * contains those parts of the domain where there is no solution.
5592  * If "bmap" is marked as rational (ISL_BASIC_MAP_RATIONAL),
5593  * then we compute the rational optimum.  Otherwise, we compute
5594  * the integral optimum.
5595  *
5596  * We perform some preprocessing.  As the PILP solver does not
5597  * handle implicit equalities very well, we first make sure all
5598  * the equalities are explicitly available.
5599  *
5600  * We also add context constraints to the basic map and remove
5601  * redundant constraints.  This is only needed because of the
5602  * way we handle simple symmetries.  In particular, we currently look
5603  * for symmetries on the constraints, before we set up the main tableau.
5604  * It is then no good to look for symmetries on possibly redundant constraints.
5605  */
5606 __isl_give isl_pw_multi_aff *isl_basic_map_partial_lexopt_pw_multi_aff(
5607         __isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
5608         __isl_give isl_set **empty, int max)
5609 {
5610         if (empty)
5611                 *empty = NULL;
5612         if (!bmap || !dom)
5613                 goto error;
5614
5615         isl_assert(bmap->ctx,
5616             isl_basic_map_compatible_domain(bmap, dom), goto error);
5617
5618         if (isl_basic_set_dim(dom, isl_dim_all) == 0)
5619                 return basic_map_partial_lexopt_pma(bmap, dom, empty, max);
5620
5621         bmap = isl_basic_map_intersect_domain(bmap, isl_basic_set_copy(dom));
5622         bmap = isl_basic_map_detect_equalities(bmap);
5623         bmap = isl_basic_map_remove_redundancies(bmap);
5624
5625         return basic_map_partial_lexopt_pma(bmap, dom, empty, max);
5626 error:
5627         isl_basic_set_free(dom);
5628         isl_basic_map_free(bmap);
5629         return NULL;
5630 }