/*
 * 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;
}
