def setup(self, goods=None, bads=None, taylor_order=6): goods = goods if goods else {} goods.update({1 / k: 1 / v for k, v in bads.items()}) N = check_values_length(goods) exp_S = VectorVariable(N, "e^{S}") VectorVariable(N, "S") self.cost = 1 constraints = [[exp_S >= 1, exp_S.prod() == np.e]] for monomial, options in goods.items(): m_nd = Variable("|%s|" % monomial.latex(excluded=["models", "units"])) exp_m = Variable("e^{%s}" % m_nd.latex(excluded=["models"])) self.cost /= monomial if hasattr(options, "units"): monomial = monomial / (1 * options.units) options = options.magnitude options_scale = options.mean() options /= options_scale constraints.append([ m_nd == monomial / options_scale, (exp_S**options).prod() == exp_m, exp_m >= 1 + te_exp_minus1(m_nd, taylor_order), ]) return constraints