void factory_mp3d_homebrew::set_options(maxpool3d &holder, int opt_beg, int ni, mxArray const *vi[]) { // parse option/value pairs if ( ((ni-opt_beg)%2) != 0 ) throw mp3d_ex("Imbalanced option/value pairs."); for (int i = opt_beg; i < ni; i+=2) { if (isStrEqual(vi[i], "pool")) set_pool(holder, vi[i+1]); else if (isStrEqual(vi[i], "stride")) set_stride(holder, vi[i+1]); else if (isStrEqual(vi[i], "pad")) set_pad(holder, vi[i+1]); else throw mp3d_ex("Unrecognized option/value pairs."); } // for i }
/* Check if constraint "c" imposes any stride on dimension data->pos * and, if so, update the stride information in "data". * * In order to impose a stride on the dimension, "c" needs to be an equality * and it needs to involve the dimension. Note that "c" may also be * a div constraint and thus an inequality that we cannot use. * * Let c be of the form * * h(p) + g * v * i + g * stride * f(alpha) = 0 * * with h(p) an expression in terms of the parameters and other dimensions * and f(alpha) an expression in terms of the existentially quantified * variables. * * If "stride" is not zero and not one, then it represents a non-trivial stride * on "i". We compute a and b such that * * a v + b stride = 1 * * We have * * g v i = -h(p) + g stride f(alpha) * * a g v i = -a h(p) + g stride f(alpha) * * a g v i + b g stride i = -a h(p) + g stride * (...) * * g i = -a h(p) + g stride * (...) * * i = -a h(p)/g + stride * (...) * * The expression "-a h(p)/g" can therefore be used as offset. */ static isl_stat detect_stride(__isl_take isl_constraint *c, void *user) { struct isl_detect_stride_data *data = user; int i, n_div; isl_ctx *ctx; isl_stat r = isl_stat_ok; isl_val *v, *stride, *m; isl_bool is_eq, relevant, has_stride; is_eq = isl_constraint_is_equality(c); relevant = isl_constraint_involves_dims(c, isl_dim_set, data->pos, 1); if (is_eq < 0 || relevant < 0) goto error; if (!is_eq || !relevant) { isl_constraint_free(c); return isl_stat_ok; } ctx = isl_constraint_get_ctx(c); stride = isl_val_zero(ctx); n_div = isl_constraint_dim(c, isl_dim_div); for (i = 0; i < n_div; ++i) { v = isl_constraint_get_coefficient_val(c, isl_dim_div, i); stride = isl_val_gcd(stride, v); } v = isl_constraint_get_coefficient_val(c, isl_dim_set, data->pos); m = isl_val_gcd(isl_val_copy(stride), isl_val_copy(v)); stride = isl_val_div(stride, isl_val_copy(m)); v = isl_val_div(v, isl_val_copy(m)); has_stride = isl_val_gt_si(stride, 1); if (has_stride >= 0 && has_stride) { isl_aff *aff; isl_val *gcd, *a, *b; gcd = isl_val_gcdext(v, isl_val_copy(stride), &a, &b); isl_val_free(gcd); isl_val_free(b); aff = isl_constraint_get_aff(c); for (i = 0; i < n_div; ++i) aff = isl_aff_set_coefficient_si(aff, isl_dim_div, i, 0); aff = isl_aff_set_coefficient_si(aff, isl_dim_in, data->pos, 0); aff = isl_aff_remove_unused_divs(aff); a = isl_val_neg(a); aff = isl_aff_scale_val(aff, a); aff = isl_aff_scale_down_val(aff, m); r = set_stride(data, stride, aff); } else { isl_val_free(stride); isl_val_free(m); isl_val_free(v); } isl_constraint_free(c); if (has_stride < 0) return isl_stat_error; return r; error: isl_constraint_free(c); return isl_stat_error; }