• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2010      INRIA Saclay
3  * Copyright 2013      Ecole Normale Superieure
4  *
5  * Use of this software is governed by the MIT license
6  *
7  * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France,
8  * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod,
9  * 91893 Orsay, France
10  * and Ecole Normale Superieure, 45 rue d'Ulm, 75230 Paris, France
11  */
12 
13 #include <isl/val.h>
14 #include <isl_space_private.h>
15 #include <isl_point_private.h>
16 
17 #include <isl_pw_macro.h>
18 
19 /* Evaluate "pw" in the void point "pnt".
20  * In particular, return the value NaN.
21  */
FN(PW,eval_void)22 static __isl_give isl_val *FN(PW,eval_void)(__isl_take PW *pw,
23 	__isl_take isl_point *pnt)
24 {
25 	isl_ctx *ctx;
26 
27 	ctx = isl_point_get_ctx(pnt);
28 	FN(PW,free)(pw);
29 	isl_point_free(pnt);
30 	return isl_val_nan(ctx);
31 }
32 
33 /* Evaluate the piecewise function "pw" in "pnt".
34  * If the point is void, then return NaN.
35  * If the point lies outside the domain of "pw", then return 0 or NaN
36  * depending on whether 0 is the default value for this type of function.
37  */
FN(PW,eval)38 __isl_give isl_val *FN(PW,eval)(__isl_take PW *pw, __isl_take isl_point *pnt)
39 {
40 	int i;
41 	isl_bool is_void;
42 	isl_bool found;
43 	isl_ctx *ctx;
44 	isl_bool ok;
45 	isl_space *pnt_space, *pw_space;
46 	isl_val *v;
47 
48 	pnt_space = isl_point_peek_space(pnt);
49 	pw_space = FN(PW,peek_space)(pw);
50 	ok = isl_space_is_domain_internal(pnt_space, pw_space);
51 	if (ok < 0)
52 		goto error;
53 	ctx = isl_point_get_ctx(pnt);
54 	if (!ok)
55 		isl_die(ctx, isl_error_invalid,
56 			"incompatible spaces", goto error);
57 	is_void = isl_point_is_void(pnt);
58 	if (is_void < 0)
59 		goto error;
60 	if (is_void)
61 		return FN(PW,eval_void)(pw, pnt);
62 
63 	found = isl_bool_false;
64 	for (i = 0; i < pw->n; ++i) {
65 		found = isl_set_contains_point(pw->p[i].set, pnt);
66 		if (found < 0)
67 			goto error;
68 		if (found)
69 			break;
70 	}
71 	if (found) {
72 		v = FN(EL,eval)(FN(EL,copy)(pw->p[i].FIELD),
73 					    isl_point_copy(pnt));
74 	} else if (DEFAULT_IS_ZERO) {
75 		v = isl_val_zero(ctx);
76 	} else {
77 		v = isl_val_nan(ctx);
78 	}
79 	FN(PW,free)(pw);
80 	isl_point_free(pnt);
81 	return v;
82 error:
83 	FN(PW,free)(pw);
84 	isl_point_free(pnt);
85 	return NULL;
86 }
87