+static void copy_solution(struct isl_vec *vec, int maximize, isl_int *opt,
+ isl_int *opt_denom, PipQuast *sol)
+{
+ int i;
+ PipList *list;
+ isl_int tmp;
+
+ if (opt) {
+ if (opt_denom) {
+ isl_seq_cpy_from_pip(opt,
+ &sol->list->vector->the_vector[0], 1);
+ isl_seq_cpy_from_pip(opt_denom,
+ &sol->list->vector->the_deno[0], 1);
+ } else if (maximize)
+ mpz_fdiv_q(*opt, sol->list->vector->the_vector[0],
+ sol->list->vector->the_deno[0]);
+ else
+ mpz_cdiv_q(*opt, sol->list->vector->the_vector[0],
+ sol->list->vector->the_deno[0]);
+ }
+
+ if (!vec)
+ return;
+
+ isl_int_init(tmp);
+ isl_int_set_si(vec->el[0], 1);
+ for (i = 0, list = sol->list->next; list; ++i, list = list->next) {
+ isl_seq_cpy_from_pip(&vec->el[1 + i],
+ &list->vector->the_deno[0], 1);
+ isl_int_lcm(vec->el[0], vec->el[0], vec->el[1 + i]);
+ }
+ for (i = 0, list = sol->list->next; list; ++i, list = list->next) {
+ isl_seq_cpy_from_pip(&tmp, &list->vector->the_deno[0], 1);
+ isl_int_divexact(tmp, vec->el[0], tmp);
+ isl_seq_cpy_from_pip(&vec->el[1 + i],
+ &list->vector->the_vector[0], 1);
+ isl_int_mul(vec->el[1 + i], vec->el[1 + i], tmp);
+ }
+ isl_int_clear(tmp);
+}
+