def solve_r_iterate(dp0, r1, F, S, trace): LF = LowerSets(F) if do_extra_checks(): LF.belongs(S) F2 = F[1] converged = set() # subset of solutions for which they converged nextit = set() # find the set of all r2s for fa in S.maximals: hr = dp0.solve_r_trace((r1, fa[1]), trace) for fb in hr.maximals: # valid = R.leq(ra, rb) # ra <= rb valid = F.leq(fb, fa) # fb <= fa if valid: nextit.add(fb) feasible = F2.leq(fa[1], fb[1]) if feasible: converged.add(fb) nextit = F.Ls(poset_maxima(nextit, F.leq)) converged = F.Ls(poset_maxima(converged, F.leq)) return nextit, converged
def solve_r(self, r): R = self.R F = self.F options_f = [] for _name, f_max, r_min in self.entries: if R.leq(r_min, r): options_f.append(f_max) rs = poset_maxima(options_f, F.leq) return F.Ls(rs)
def evaluate(self, i): if do_extra_checks(): self.I.belongs(i) options_r = [] options_f = [] for name, f_max, r_min in self.entries: if name != i: continue options_f.append(f_max) options_r.append(r_min) rs = poset_minima(options_r, self.R.leq) fs = poset_maxima(options_f, self.F.leq) ur = UpperSet(rs, self.R) lf = LowerSet(fs, self.F) return lf, ur
def eval_lfunction_anyoffun(lf, context): from .eval_constant_imp import eval_constant from mcdp_posets import FiniteCollectionsInclusion from mcdp_dp import LimitMaximals from mcdp_posets import FiniteCollection assert isinstance(lf, CDP.AnyOfFun) constant = eval_constant(lf.value, context) if not isinstance(constant.unit, FiniteCollectionsInclusion): msg = 'I expect that the argument to any-of evaluates to a finite collection.' raise_desc(DPSemanticError, msg, constant=constant) assert isinstance(constant.unit, FiniteCollectionsInclusion) P = constant.unit.S assert isinstance(constant.value, FiniteCollection) elements = set(constant.value.elements) maximals = poset_maxima(elements, P.leq) if len(elements) != len(maximals): msg = 'The elements are not maximals.' raise_desc(DPSemanticError, msg, elements=elements, maximals=maximals) dp = LimitMaximals(values=maximals, F=P) return create_operation_lf(context, dp=dp, functions=[])
def evaluate(self, m): from mcdp_posets.category_product import get_product_compact _, _, unpack = get_product_compact(self.M0, self.F2, self.R2) m0, _f2, _r2 = unpack(m) LF0, UR0 = self.dp1.evaluate(m0) assert isinstance(LF0, LowerSet), (LF0, self.dp1) assert isinstance(UR0, UpperSet), (UR0, self.dp1) # now extract first components f1 and r1 f1s = set() for fi in LF0.maximals: fi1, _ = fi f1s.add(fi1) f1s = poset_maxima(f1s, self.F.leq) LF = self.F.Ls(f1s) r1s = set() for ri in UR0.minimals: ri1, _ = ri r1s.add(ri1) r1s = poset_minima(r1s, self.F.leq) UR = self.R.Us(r1s) return LF, UR
def eval_lfunction_anyoffun(lf, context): from .eval_constant_imp import eval_constant from mcdp_posets import FiniteCollectionsInclusion from mcdp_dp import LimitMaximals from mcdp_posets import FiniteCollection assert isinstance(lf, CDP.AnyOfFun) constant = eval_constant(lf.value, context) if not isinstance(constant.unit, FiniteCollectionsInclusion): msg = 'I expect that the argument to any-of evaluates to a finite collection.' raise_desc(DPSemanticError, msg, constant=constant) assert isinstance(constant.unit, FiniteCollectionsInclusion) P = constant.unit.S assert isinstance(constant.value, FiniteCollection) elements = set(constant.value.elements) maximals = poset_maxima(elements, P.leq) if len(elements) != len(maximals): msg = 'The elements are not maximals.' raise_desc(DPSemanticError, msg, elements=elements, maximals=maximals) dp = LimitMaximals(values=maximals, F=P) return create_operation_lf(context, dp=dp, functions=[], name_prefix='_anyof')