/*
 * Copyright 2006-2007 Universiteit Leiden
 * Copyright 2008-2009 Katholieke Universiteit Leuven
 *
 * Use of this software is governed by the MIT license
 *
 * Written by Sven Verdoolaege, Leiden Institute of Advanced Computer Science,
 * Universiteit Leiden, Niels Bohrweg 1, 2333 CA Leiden, The Netherlands
 * and K.U.Leuven, Departement Computerwetenschappen, Celestijnenlaan 200A,
 * B-3001 Leuven, Belgium
 */

#include <stdlib.h>
#include <isl_ctx_private.h>
#include <isl_map_private.h>
#include <isl_vec_private.h>
#include <isl_options_private.h>
#include "isl_basis_reduction.h"

static void save_alpha(GBR_LP *lp, int first, int n, GBR_type *alpha)
{
	int i;

	for (i = 0; i < n; ++i)
		GBR_lp_get_alpha(lp, first + i, &alpha[i]);
}

/* Compute a reduced basis for the set represented by the tableau "tab".
 * tab->basis, which must be initialized by the calling function to an affine
 * unimodular basis, is updated to reflect the reduced basis.
 * The first tab->n_zero rows of the basis (ignoring the constant row)
 * are assumed to correspond to equalities and are left untouched.
 * tab->n_zero is updated to reflect any additional equalities that
 * have been detected in the first rows of the new basis.
 * The final tab->n_unbounded rows of the basis are assumed to correspond
 * to unbounded directions and are also left untouched.
 * In particular this means that the remaining rows are assumed to
 * correspond to bounded directions.
 *
 * This function implements the algorithm described in
 * "An Implementation of the Generalized Basis Reduction Algorithm
 *  for Integer Programming" of Cook el al. to compute a reduced basis.
 * We use \epsilon = 1/4.
 *
 * If ctx->opt->gbr_only_first is set, the user is only interested
 * in the first direction.  In this case we stop the basis reduction when
 * the width in the first direction becomes smaller than 2.
 */
struct isl_tab *isl_tab_compute_reduced_basis(struct isl_tab *tab)
{
	unsigned dim;
	struct isl_ctx *ctx;
	struct isl_mat *B;
	int i;
	GBR_LP *lp = NULL;
	GBR_type F_old, alpha, F_new;
	int row;
	isl_int tmp;
	struct isl_vec *b_tmp;
	GBR_type *F = NULL;
	GBR_type *alpha_buffer[2] = { NULL, NULL };
	GBR_type *alpha_saved;
	GBR_type F_saved;
	int use_saved = 0;
	isl_int mu[2];
	GBR_type mu_F[2];
	GBR_type two;
	GBR_type one;
	int empty = 0;
	int fixed = 0;
	int fixed_saved = 0;
	int mu_fixed[2];
	int n_bounded;
	int gbr_only_first;

	if (!tab)
		return NULL;

	if (tab->empty)
		return tab;

	ctx = tab->mat->ctx;
	gbr_only_first = ctx->opt->gbr_only_first;
	dim = tab->n_var;
	B = tab->basis;
	if (!B)
		return tab;

	n_bounded = dim - tab->n_unbounded;
	if (n_bounded <= tab->n_zero + 1)
		return tab;

	isl_int_init(tmp);
	isl_int_init(mu[0]);
	isl_int_init(mu[1]);

	GBR_init(alpha);
	GBR_init(F_old);
	GBR_init(F_new);
	GBR_init(F_saved);
	GBR_init(mu_F[0]);
	GBR_init(mu_F[1]);
	GBR_init(two);
	GBR_init(one);

	b_tmp = isl_vec_alloc(ctx, dim);
	if (!b_tmp)
		goto error;

	F = isl_alloc_array(ctx, GBR_type, n_bounded);
	alpha_buffer[0] = isl_alloc_array(ctx, GBR_type, n_bounded);
	alpha_buffer[1] = isl_alloc_array(ctx, GBR_type, n_bounded);
	alpha_saved = alpha_buffer[0];

	if (!F || !alpha_buffer[0] || !alpha_buffer[1])
		goto error;

	for (i = 0; i < n_bounded; ++i) {
		GBR_init(F[i]);
		GBR_init(alpha_buffer[0][i]);
		GBR_init(alpha_buffer[1][i]);
	}

	GBR_set_ui(two, 2);
	GBR_set_ui(one, 1);

	lp = GBR_lp_init(tab);
	if (!lp)
		goto error;

	i = tab->n_zero;

	GBR_lp_set_obj(lp, B->row[1+i]+1, dim);
	ctx->stats->gbr_solved_lps++;
	if (GBR_lp_solve(lp) < 0)
		goto error;
	GBR_lp_get_obj_val(lp, &F[i]);

	if (GBR_lt(F[i], one)) {
		if (!GBR_is_zero(F[i])) {
			empty = GBR_lp_cut(lp, B->row[1+i]+1);
			if (empty)
				goto done;
			GBR_set_ui(F[i], 0);
		}
		tab->n_zero++;
	}

	do {
		if (i+1 == tab->n_zero) {
			GBR_lp_set_obj(lp, B->row[1+i+1]+1, dim);
			ctx->stats->gbr_solved_lps++;
			if (GBR_lp_solve(lp) < 0)
				goto error;
			GBR_lp_get_obj_val(lp, &F_new);
			fixed = GBR_lp_is_fixed(lp);
			GBR_set_ui(alpha, 0);
		} else
		if (use_saved) {
			row = GBR_lp_next_row(lp);
			GBR_set(F_new, F_saved);
			fixed = fixed_saved;
			GBR_set(alpha, alpha_saved[i]);
		} else {
			row = GBR_lp_add_row(lp, B->row[1+i]+1, dim);
			GBR_lp_set_obj(lp, B->row[1+i+1]+1, dim);
			ctx->stats->gbr_solved_lps++;
			if (GBR_lp_solve(lp) < 0)
				goto error;
			GBR_lp_get_obj_val(lp, &F_new);
			fixed = GBR_lp_is_fixed(lp);

			GBR_lp_get_alpha(lp, row, &alpha);

			if (i > 0)
				save_alpha(lp, row-i, i, alpha_saved);

			if (GBR_lp_del_row(lp) < 0)
				goto error;
		}
		GBR_set(F[i+1], F_new);

		GBR_floor(mu[0], alpha);
		GBR_ceil(mu[1], alpha);

		if (isl_int_eq(mu[0], mu[1]))
			isl_int_set(tmp, mu[0]);
		else {
			int j;

			for (j = 0; j <= 1; ++j) {
				isl_int_set(tmp, mu[j]);
				isl_seq_combine(b_tmp->el,
						ctx->one, B->row[1+i+1]+1,
						tmp, B->row[1+i]+1, dim);
				GBR_lp_set_obj(lp, b_tmp->el, dim);
				ctx->stats->gbr_solved_lps++;
				if (GBR_lp_solve(lp) < 0)
					goto error;
				GBR_lp_get_obj_val(lp, &mu_F[j]);
				mu_fixed[j] = GBR_lp_is_fixed(lp);
				if (i > 0)
					save_alpha(lp, row-i, i, alpha_buffer[j]);
			}

			if (GBR_lt(mu_F[0], mu_F[1]))
				j = 0;
			else
				j = 1;

			isl_int_set(tmp, mu[j]);
			GBR_set(F_new, mu_F[j]);
			fixed = mu_fixed[j];
			alpha_saved = alpha_buffer[j];
		}
		isl_seq_combine(B->row[1+i+1]+1, ctx->one, B->row[1+i+1]+1,
				tmp, B->row[1+i]+1, dim);

		if (i+1 == tab->n_zero && fixed) {
			if (!GBR_is_zero(F[i+1])) {
				empty = GBR_lp_cut(lp, B->row[1+i+1]+1);
				if (empty)
					goto done;
				GBR_set_ui(F[i+1], 0);
			}
			tab->n_zero++;
		}

		GBR_set(F_old, F[i]);

		use_saved = 0;
		/* mu_F[0] = 4 * F_new; mu_F[1] = 3 * F_old */
		GBR_set_ui(mu_F[0], 4);
		GBR_mul(mu_F[0], mu_F[0], F_new);
		GBR_set_ui(mu_F[1], 3);
		GBR_mul(mu_F[1], mu_F[1], F_old);
		if (GBR_lt(mu_F[0], mu_F[1])) {
			B = isl_mat_swap_rows(B, 1 + i, 1 + i + 1);
			if (i > tab->n_zero) {
				use_saved = 1;
				GBR_set(F_saved, F_new);
				fixed_saved = fixed;
				if (GBR_lp_del_row(lp) < 0)
					goto error;
				--i;
			} else {
				GBR_set(F[tab->n_zero], F_new);
				if (gbr_only_first && GBR_lt(F[tab->n_zero], two))
					break;

				if (fixed) {
					if (!GBR_is_zero(F[tab->n_zero])) {
						empty = GBR_lp_cut(lp, B->row[1+tab->n_zero]+1);
						if (empty)
							goto done;
						GBR_set_ui(F[tab->n_zero], 0);
					}
					tab->n_zero++;
				}
			}
		} else {
			GBR_lp_add_row(lp, B->row[1+i]+1, dim);
			++i;
		}
	} while (i < n_bounded - 1);

	if (0) {
done:
		if (empty < 0) {
error:
			isl_mat_free(B);
			B = NULL;
		}
	}

	GBR_lp_delete(lp);

	if (alpha_buffer[1])
		for (i = 0; i < n_bounded; ++i) {
			GBR_clear(F[i]);
			GBR_clear(alpha_buffer[0][i]);
			GBR_clear(alpha_buffer[1][i]);
		}
	free(F);
	free(alpha_buffer[0]);
	free(alpha_buffer[1]);

	isl_vec_free(b_tmp);

	GBR_clear(alpha);
	GBR_clear(F_old);
	GBR_clear(F_new);
	GBR_clear(F_saved);
	GBR_clear(mu_F[0]);
	GBR_clear(mu_F[1]);
	GBR_clear(two);
	GBR_clear(one);

	isl_int_clear(tmp);
	isl_int_clear(mu[0]);
	isl_int_clear(mu[1]);

	tab->basis = B;

	return tab;
}

/* Compute an affine form of a reduced basis of the given basic
 * non-parametric set, which is assumed to be bounded and not
 * include any integer divisions.
 * The first column and the first row correspond to the constant term.
 *
 * If the input contains any equalities, we first create an initial
 * basis with the equalities first.  Otherwise, we start off with
 * the identity matrix.
 */
__isl_give isl_mat *isl_basic_set_reduced_basis(__isl_keep isl_basic_set *bset)
{
	struct isl_mat *basis;
	struct isl_tab *tab;

	if (isl_basic_set_check_no_locals(bset) < 0 ||
	    isl_basic_set_check_no_params(bset) < 0)
		return NULL;

	tab = isl_tab_from_basic_set(bset, 0);
	if (!tab)
		return NULL;

	if (bset->n_eq == 0)
		tab->basis = isl_mat_identity(bset->ctx, 1 + tab->n_var);
	else {
		isl_mat *eq;
		isl_size nvar = isl_basic_set_dim(bset, isl_dim_all);
		if (nvar < 0)
			goto error;
		eq = isl_mat_sub_alloc6(bset->ctx, bset->eq, 0, bset->n_eq,
					1, nvar);
		eq = isl_mat_left_hermite(eq, 0, NULL, &tab->basis);
		tab->basis = isl_mat_lin_to_aff(tab->basis);
		tab->n_zero = bset->n_eq;
		isl_mat_free(eq);
	}
	tab = isl_tab_compute_reduced_basis(tab);
	if (!tab)
		return NULL;

	basis = isl_mat_copy(tab->basis);

	isl_tab_free(tab);

	return basis;
error:
	isl_tab_free(tab);
	return NULL;
}
