1 /*
2  * Copyright 2010      INRIA Saclay
3  *
4  * Use of this software is governed by the MIT license
5  *
6  * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France,
7  * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod,
8  * 91893 Orsay, France
9  */
10 
11 /* Compute the maximal value attained by the piecewise quasipolynomial
12  * on its domain or zero if the domain is empty.
13  * In the worst case, the domain is scanned completely,
14  * so the domain is assumed to be bounded.
15  */
FN(PW,opt)16 __isl_give isl_val *FN(PW,opt)(__isl_take PW *pw, int max)
17 {
18 	int i;
19 	isl_val *opt;
20 
21 	if (!pw)
22 		return NULL;
23 
24 	if (pw->n == 0) {
25 		opt = isl_val_zero(FN(PW,get_ctx)(pw));
26 		FN(PW,free)(pw);
27 		return opt;
28 	}
29 
30 	opt = FN(EL,opt_on_domain)(FN(EL,copy)(pw->p[0].FIELD),
31 					isl_set_copy(pw->p[0].set), max);
32 	for (i = 1; i < pw->n; ++i) {
33 		isl_val *opt_i;
34 		opt_i = FN(EL,opt_on_domain)(FN(EL,copy)(pw->p[i].FIELD),
35 						isl_set_copy(pw->p[i].set), max);
36 		if (max)
37 			opt = isl_val_max(opt, opt_i);
38 		else
39 			opt = isl_val_min(opt, opt_i);
40 	}
41 
42 	FN(PW,free)(pw);
43 	return opt;
44 }
45 
FN(PW,max)46 __isl_give isl_val *FN(PW,max)(__isl_take PW *pw)
47 {
48 	return FN(PW,opt)(pw, 1);
49 }
50 
FN(PW,min)51 __isl_give isl_val *FN(PW,min)(__isl_take PW *pw)
52 {
53 	return FN(PW,opt)(pw, 0);
54 }
55