Line data Source code
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 : */
22 0 : 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 0 : ctx = isl_point_get_ctx(pnt);
28 0 : FN(PW,free)(pw);
29 0 : isl_point_free(pnt);
30 0 : 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 : */
38 0 : __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 0 : pnt_space = isl_point_peek_space(pnt);
49 0 : pw_space = FN(PW,peek_space)(pw);
50 0 : ok = isl_space_is_domain_internal(pnt_space, pw_space);
51 0 : if (ok < 0)
52 0 : goto error;
53 0 : ctx = isl_point_get_ctx(pnt);
54 0 : if (!ok)
55 0 : isl_die(ctx, isl_error_invalid,
56 : "incompatible spaces", goto error);
57 0 : is_void = isl_point_is_void(pnt);
58 0 : if (is_void < 0)
59 0 : goto error;
60 0 : if (is_void)
61 0 : return FN(PW,eval_void)(pw, pnt);
62 :
63 0 : found = isl_bool_false;
64 0 : for (i = 0; i < pw->n; ++i) {
65 0 : found = isl_set_contains_point(pw->p[i].set, pnt);
66 0 : if (found < 0)
67 0 : goto error;
68 0 : if (found)
69 0 : break;
70 : }
71 0 : if (found) {
72 0 : v = FN(EL,eval)(FN(EL,copy)(pw->p[i].FIELD),
73 : isl_point_copy(pnt));
74 : } else if (DEFAULT_IS_ZERO) {
75 0 : v = isl_val_zero(ctx);
76 : } else {
77 0 : v = isl_val_nan(ctx);
78 : }
79 0 : FN(PW,free)(pw);
80 0 : isl_point_free(pnt);
81 0 : return v;
82 : error:
83 0 : FN(PW,free)(pw);
84 0 : isl_point_free(pnt);
85 0 : return NULL;
86 : }
|