/** * Cluster conjuncts to produce a partitioned transition relation. * * Conjuncts larger than limit are rejected (unless they are * singletons). */ vector<BDD> BddTrAttachment::clusterConjunctsOld( vector<BDD>& conjuncts, unsigned int limit, Options::Verbosity verbosity, int nvars) const { vector<BDD> clusters; if (conjuncts.size() == 0) { clusters.push_back(bddManager().bddOne()); return clusters; } vector<BDD>::const_reverse_iterator it = conjuncts.rbegin(); BDD cluster = *it++; conjuncts.pop_back(); while (it != conjuncts.rend()) { reportBDD("conjunct", *it, nvars, verbosity, Options::Informative); BDD tmp = cluster.And(*it,limit); if (tmp && (unsigned int) tmp.nodeCount() <= 2*limit) { cluster = tmp; } else { reportBDD("Cluster", cluster, nvars, verbosity, Options::Informative); clusters.push_back(cluster); cluster = *it; } ++it; conjuncts.pop_back(); } reportBDD("Cluster", cluster, nvars, verbosity, Options::Informative); clusters.push_back(cluster); return clusters; } // BddTrAttachment::clusterConjunctsOld
BDD Synth::pre_sys(BDD dst) { /** Calculate predecessor states of given states. ∀u ∃c ∃t': tau(t,u,c,t') & dst(t') & ~error(t,u,c) We use the direct substitution optimization (since t' <-> BDD(t,u,c)), thus: ∀u ∃c: (!error(t,u,c) & (dst(t)[t <- bdd_next_t(t,u,c)])) or for Moore machines: ∃c ∀u: (!error(t,u,c) & (dst(t)[t <- bdd_next_t(t,u,c)])) Note that we do not replace t variables in the error bdd. :return: BDD of the predecessor states **/ // NOTE: I tried considering two special cases: error(t,u,c) and error(t), // and move error(t) outside of quantification ∀u ∃c. // It slowed down.. // TODO: try again: on the driver example static vector<VecUint> orders; static bool did_grouping = false; if (!did_grouping && timer.sec_from_origin() > time_limit_sec/4) { // at 0.25*time_limit we fix the order do_grouping(cudd, orders); did_grouping = true; } dst = dst.VectorCompose(get_substitution()); update_order_if(cudd, orders); if (is_moore) { BDD result = dst.And(~error); vector<BDD> uncontrollable = get_uncontrollable_vars_bdds(); if (!uncontrollable.empty()) { BDD uncontrollable_cube = cudd.bddComputeCube(uncontrollable.data(), NULL, (int)uncontrollable.size()); result = result.UnivAbstract(uncontrollable_cube); update_order_if(cudd, orders); } // ∃c ∀u (...) vector<BDD> controllable = get_controllable_vars_bdds(); BDD controllable_cube = cudd.bddComputeCube(controllable.data(), NULL, (int)controllable.size()); result = result.ExistAbstract(controllable_cube); update_order_if(cudd, orders); return result; } // the case of Mealy machines vector<BDD> controllable = get_controllable_vars_bdds(); BDD controllable_cube = cudd.bddComputeCube(controllable.data(), NULL, (int)controllable.size()); BDD result = dst.AndAbstract(~error, controllable_cube); update_order_if(cudd, orders); vector<BDD> uncontrollable = get_uncontrollable_vars_bdds(); if (!uncontrollable.empty()) { // ∀u ∃c (...) BDD uncontrollable_cube = cudd.bddComputeCube(uncontrollable.data(), NULL, (int)uncontrollable.size()); result = result.UnivAbstract(uncontrollable_cube); update_order_if(cudd, orders); } return result; }