| /* |
| * Copyright 2018 Cerebras Systems |
| * |
| * Use of this software is governed by the MIT license |
| * |
| * Written by Sven Verdoolaege, |
| * Cerebras Systems, 175 S San Antonio Rd, Los Altos, CA, USA |
| */ |
| |
| #undef TYPE |
| #define TYPE CAT(isl_,BASE) |
| #define xFN(TYPE,NAME) TYPE ## _ ## NAME |
| #define FN(TYPE,NAME) xFN(TYPE,NAME) |
| |
| /* Compute the optima of the set or output dimensions as a function of the |
| * parameters (and input dimensions), but independently of |
| * the other set or output dimensions, |
| * given a function "opt" that computes this optimum |
| * for a single dimension. |
| * |
| * If the resulting multi piecewise affine expression has |
| * an explicit domain, then assign it the (parameter) domain of the input. |
| * In other cases, the (parameter) domain is stored in the individual elements. |
| */ |
| static __isl_give isl_multi_pw_aff *FN(BASE,opt_mpa)(__isl_take TYPE *obj, |
| __isl_give isl_pw_aff *(*opt)(__isl_take TYPE *obj, int pos)) |
| { |
| int i; |
| isl_size n; |
| isl_multi_pw_aff *mpa; |
| |
| mpa = isl_multi_pw_aff_alloc(FN(TYPE,get_space)(obj)); |
| n = isl_multi_pw_aff_size(mpa); |
| if (n < 0) |
| mpa = isl_multi_pw_aff_free(mpa); |
| for (i = 0; i < n; ++i) { |
| isl_pw_aff *pa; |
| |
| pa = opt(FN(TYPE,copy)(obj), i); |
| mpa = isl_multi_pw_aff_set_pw_aff(mpa, i, pa); |
| } |
| if (isl_multi_pw_aff_has_explicit_domain(mpa)) { |
| isl_set *dom; |
| |
| dom = FN(TYPE,domain)(FN(TYPE,copy)(obj)); |
| mpa = isl_multi_pw_aff_intersect_domain(mpa, dom); |
| } |
| FN(TYPE,free)(obj); |
| |
| return mpa; |
| } |