Entities used per process (in reactions)
This commit is contained in:
3
macro.hh
3
macro.hh
@@ -39,4 +39,7 @@ if (opts->verbose >= (n)) { \
|
|||||||
std::cerr << "ii VERBOSE(" << (n) << "): " << __FILE__ << " (" << __func__ << ":" << __LINE__ << "): " << s << std::endl; \
|
std::cerr << "ii VERBOSE(" << (n) << "): " << __FILE__ << " (" << __func__ << ":" << __LINE__ << "): " << s << std::endl; \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#define SET_ADD(set1, set2) (set1).insert((set2).begin(), (set2).end())
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
102
symrs.cc
102
symrs.cc
@@ -28,6 +28,77 @@ SymRS::SymRS(RctSys *rs, Options *opts)
|
|||||||
encode();
|
encode();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SymRS::encode(void)
|
||||||
|
{
|
||||||
|
VERB("Encoding...");
|
||||||
|
|
||||||
|
if (opts->measure) {
|
||||||
|
opts->enc_time = cpuTime();
|
||||||
|
opts->enc_mem = memUsed();
|
||||||
|
}
|
||||||
|
|
||||||
|
mapStateToAct();
|
||||||
|
|
||||||
|
mapProcEntities();
|
||||||
|
|
||||||
|
initBDDvars();
|
||||||
|
|
||||||
|
if (usingContextAutomaton()) {
|
||||||
|
encodeCtxAutTrans();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
VERB_LN(3, "Not using context automata, not encoding TR for CA")
|
||||||
|
}
|
||||||
|
|
||||||
|
encodeTransitions();
|
||||||
|
encodeInitStates();
|
||||||
|
|
||||||
|
if (opts->measure) {
|
||||||
|
opts->enc_time = cpuTime() - opts->enc_time;
|
||||||
|
opts->enc_mem = memUsed() - opts->enc_mem;
|
||||||
|
}
|
||||||
|
|
||||||
|
VERB("Encoding done");
|
||||||
|
}
|
||||||
|
|
||||||
|
void SymRS::mapProcEntities(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
// Reactions
|
||||||
|
|
||||||
|
for (const auto &proc_rcts : rs->proc_reactions) {
|
||||||
|
Process proc_id = proc_rcts.first;
|
||||||
|
|
||||||
|
for (const auto &rct : proc_rcts.second) {
|
||||||
|
|
||||||
|
// collect entities that can be produced
|
||||||
|
// locally by the process with proc_id
|
||||||
|
|
||||||
|
SET_ADD(usedEntities[proc_id], rct.prod);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Context automaton
|
||||||
|
// for ()
|
||||||
|
|
||||||
|
printUsedEntitiesPerProc();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void SymRS::printUsedEntitiesPerProc(void)
|
||||||
|
{
|
||||||
|
for (const auto &proc_entities : usedEntities) {
|
||||||
|
std::string proc_name = rs->getProcessName(proc_entities.first);
|
||||||
|
cout << proc_name << ": ";
|
||||||
|
|
||||||
|
for (const auto &ent : proc_entities.second) {
|
||||||
|
cout << rs->getEntityName(ent) << " ";
|
||||||
|
}
|
||||||
|
|
||||||
|
cout << endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
BDD SymRS::encEntity_raw(Entity entity, bool succ) const
|
BDD SymRS::encEntity_raw(Entity entity, bool succ) const
|
||||||
{
|
{
|
||||||
BDD r;
|
BDD r;
|
||||||
@@ -455,37 +526,6 @@ void SymRS::mapStateToAct(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SymRS::encode(void)
|
|
||||||
{
|
|
||||||
VERB("Encoding...");
|
|
||||||
|
|
||||||
if (opts->measure) {
|
|
||||||
opts->enc_time = cpuTime();
|
|
||||||
opts->enc_mem = memUsed();
|
|
||||||
}
|
|
||||||
|
|
||||||
mapStateToAct();
|
|
||||||
|
|
||||||
initBDDvars();
|
|
||||||
|
|
||||||
if (usingContextAutomaton()) {
|
|
||||||
encodeCtxAutTrans();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
VERB_LN(3, "Not using context automata, not encoding TR for CA")
|
|
||||||
}
|
|
||||||
|
|
||||||
encodeTransitions();
|
|
||||||
encodeInitStates();
|
|
||||||
|
|
||||||
if (opts->measure) {
|
|
||||||
opts->enc_time = cpuTime() - opts->enc_time;
|
|
||||||
opts->enc_mem = memUsed() - opts->enc_mem;
|
|
||||||
}
|
|
||||||
|
|
||||||
VERB("Encoding done");
|
|
||||||
}
|
|
||||||
|
|
||||||
BDD SymRS::encActStrEntity(std::string name) const
|
BDD SymRS::encActStrEntity(std::string name) const
|
||||||
{
|
{
|
||||||
int id = getMappedStateToActID(rs->getEntityID(name));
|
int id = getMappedStateToActID(rs->getEntityID(name));
|
||||||
|
|||||||
223
symrs.hh
223
symrs.hh
@@ -32,113 +32,6 @@ class SymRS
|
|||||||
friend class ModelChecker;
|
friend class ModelChecker;
|
||||||
friend class FormRSCTL;
|
friend class FormRSCTL;
|
||||||
|
|
||||||
RctSys *rs;
|
|
||||||
Cudd *cuddMgr;
|
|
||||||
Options *opts;
|
|
||||||
|
|
||||||
// Mapping: entity ID -> action/context entity ID
|
|
||||||
StateEntityToAction stateToAct;
|
|
||||||
|
|
||||||
BDD *initStates;
|
|
||||||
|
|
||||||
vector<BDD> *pv;
|
|
||||||
vector<BDD> *pv_succ;
|
|
||||||
BDD *pv_E;
|
|
||||||
BDD *pv_succ_E;
|
|
||||||
|
|
||||||
vector<BDD> *pv_rs;
|
|
||||||
vector<BDD> *pv_rs_succ;
|
|
||||||
BDD *pv_rs_E;
|
|
||||||
BDD *pv_rs_succ_E;
|
|
||||||
|
|
||||||
vector<BDD> *partTrans;
|
|
||||||
|
|
||||||
BDD *monoTrans;
|
|
||||||
|
|
||||||
// Context automaton
|
|
||||||
vector<BDD> *pv_ca;
|
|
||||||
vector<BDD> *pv_ca_succ;
|
|
||||||
BDD *pv_ca_E;
|
|
||||||
BDD *pv_ca_succ_E;
|
|
||||||
BDD *tr_ca;
|
|
||||||
|
|
||||||
vector<BDD> *pv_act;
|
|
||||||
BDD *pv_act_E;
|
|
||||||
|
|
||||||
unsigned int totalStateVars;
|
|
||||||
unsigned int totalReactions;
|
|
||||||
unsigned int totalRctSysStateVars;
|
|
||||||
unsigned int totalActions;
|
|
||||||
unsigned int totalCtxAutStateVars;
|
|
||||||
|
|
||||||
BDD encEntity_raw(Entity entity, bool succ) const;
|
|
||||||
BDD encEntity(Entity entity) const
|
|
||||||
{
|
|
||||||
return encEntity_raw(entity, false);
|
|
||||||
}
|
|
||||||
BDD encActEntity(Entity entity) const
|
|
||||||
{
|
|
||||||
assert(entity < pv_act->size());
|
|
||||||
return (*pv_act)[entity];
|
|
||||||
}
|
|
||||||
BDD encEntitySucc(Entity entity) const
|
|
||||||
{
|
|
||||||
return encEntity_raw(entity, true);
|
|
||||||
}
|
|
||||||
BDD encEntitiesConj_raw(const Entities &entities, bool succ);
|
|
||||||
BDD encEntitiesConj(const Entities &entities)
|
|
||||||
{
|
|
||||||
return encEntitiesConj_raw(entities, false);
|
|
||||||
}
|
|
||||||
BDD encEntitiesConjSucc(const Entities &entities)
|
|
||||||
{
|
|
||||||
return encEntitiesConj_raw(entities, true);
|
|
||||||
}
|
|
||||||
BDD encEntitiesDisj_raw(const Entities &entities, bool succ);
|
|
||||||
BDD encEntitiesDisj(const Entities &entities)
|
|
||||||
{
|
|
||||||
return encEntitiesDisj_raw(entities, false);
|
|
||||||
}
|
|
||||||
BDD encEntitiesDisjSucc(const Entities &entities)
|
|
||||||
{
|
|
||||||
return encEntitiesDisj_raw(entities, true);
|
|
||||||
}
|
|
||||||
BDD encStateActEntitiesConj(const Entities &entities);
|
|
||||||
BDD encStateActEntitiesDisj(const Entities &entities);
|
|
||||||
|
|
||||||
BDD encActEntitiesConj(const Entities &entities);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Complements an encoding of a given state by negating all the variables that are not set to true
|
|
||||||
*
|
|
||||||
* @return Returns the encoded state
|
|
||||||
*/
|
|
||||||
BDD compState(const BDD &state) const;
|
|
||||||
|
|
||||||
BDD compContext(const BDD &context) const;
|
|
||||||
|
|
||||||
std::string decodedRctSysStateToStr(const BDD &state);
|
|
||||||
void printDecodedRctSysStates(const BDD &states);
|
|
||||||
|
|
||||||
BDD encNoContext(void);
|
|
||||||
|
|
||||||
void initBDDvars(void);
|
|
||||||
void encodeTransitions(void);
|
|
||||||
void encodeTransitions_old(void);
|
|
||||||
void encodeInitStates(void);
|
|
||||||
void encodeInitStatesForCtxAut(void);
|
|
||||||
void encodeInitStatesNoCtxAut(void);
|
|
||||||
void mapStateToAct(void);
|
|
||||||
void encode(void);
|
|
||||||
|
|
||||||
int getMappedStateToActID(int stateID) const
|
|
||||||
{
|
|
||||||
assert(stateID < static_cast<int>(totalRctSysStateVars));
|
|
||||||
return stateToAct[stateID];
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t getCtxAutStateEncodingSize(void);
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
SymRS(RctSys *rs, Options *opts);
|
SymRS(RctSys *rs, Options *opts);
|
||||||
|
|
||||||
@@ -300,6 +193,122 @@ class SymRS
|
|||||||
{
|
{
|
||||||
return tr_ca;
|
return tr_ca;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
RctSys *rs;
|
||||||
|
Cudd *cuddMgr;
|
||||||
|
Options *opts;
|
||||||
|
|
||||||
|
// Mapping: entity ID -> action/context entity ID
|
||||||
|
StateEntityToAction stateToAct;
|
||||||
|
|
||||||
|
BDD *initStates;
|
||||||
|
|
||||||
|
vector<BDD> *pv;
|
||||||
|
vector<BDD> *pv_succ;
|
||||||
|
BDD *pv_E;
|
||||||
|
BDD *pv_succ_E;
|
||||||
|
|
||||||
|
vector<BDD> *pv_rs;
|
||||||
|
vector<BDD> *pv_rs_succ;
|
||||||
|
BDD *pv_rs_E;
|
||||||
|
BDD *pv_rs_succ_E;
|
||||||
|
|
||||||
|
vector<BDD> *partTrans;
|
||||||
|
|
||||||
|
BDD *monoTrans;
|
||||||
|
|
||||||
|
// Context automaton
|
||||||
|
vector<BDD> *pv_ca;
|
||||||
|
vector<BDD> *pv_ca_succ;
|
||||||
|
BDD *pv_ca_E;
|
||||||
|
BDD *pv_ca_succ_E;
|
||||||
|
BDD *tr_ca;
|
||||||
|
|
||||||
|
vector<BDD> *pv_act;
|
||||||
|
BDD *pv_act_E;
|
||||||
|
|
||||||
|
unsigned int totalStateVars;
|
||||||
|
unsigned int totalReactions;
|
||||||
|
unsigned int totalRctSysStateVars;
|
||||||
|
unsigned int totalActions;
|
||||||
|
unsigned int totalCtxAutStateVars;
|
||||||
|
|
||||||
|
EntitiesForProc usedEntities;
|
||||||
|
|
||||||
|
BDD encEntity_raw(Entity entity, bool succ) const;
|
||||||
|
BDD encEntity(Entity entity) const
|
||||||
|
{
|
||||||
|
return encEntity_raw(entity, false);
|
||||||
|
}
|
||||||
|
BDD encActEntity(Entity entity) const
|
||||||
|
{
|
||||||
|
assert(entity < pv_act->size());
|
||||||
|
return (*pv_act)[entity];
|
||||||
|
}
|
||||||
|
BDD encEntitySucc(Entity entity) const
|
||||||
|
{
|
||||||
|
return encEntity_raw(entity, true);
|
||||||
|
}
|
||||||
|
BDD encEntitiesConj_raw(const Entities &entities, bool succ);
|
||||||
|
BDD encEntitiesConj(const Entities &entities)
|
||||||
|
{
|
||||||
|
return encEntitiesConj_raw(entities, false);
|
||||||
|
}
|
||||||
|
BDD encEntitiesConjSucc(const Entities &entities)
|
||||||
|
{
|
||||||
|
return encEntitiesConj_raw(entities, true);
|
||||||
|
}
|
||||||
|
BDD encEntitiesDisj_raw(const Entities &entities, bool succ);
|
||||||
|
BDD encEntitiesDisj(const Entities &entities)
|
||||||
|
{
|
||||||
|
return encEntitiesDisj_raw(entities, false);
|
||||||
|
}
|
||||||
|
BDD encEntitiesDisjSucc(const Entities &entities)
|
||||||
|
{
|
||||||
|
return encEntitiesDisj_raw(entities, true);
|
||||||
|
}
|
||||||
|
BDD encStateActEntitiesConj(const Entities &entities);
|
||||||
|
BDD encStateActEntitiesDisj(const Entities &entities);
|
||||||
|
|
||||||
|
BDD encActEntitiesConj(const Entities &entities);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Complements an encoding of a given state by negating all the variables that are not set to true
|
||||||
|
*
|
||||||
|
* @return Returns the encoded state
|
||||||
|
*/
|
||||||
|
BDD compState(const BDD &state) const;
|
||||||
|
|
||||||
|
BDD compContext(const BDD &context) const;
|
||||||
|
|
||||||
|
std::string decodedRctSysStateToStr(const BDD &state);
|
||||||
|
void printDecodedRctSysStates(const BDD &states);
|
||||||
|
|
||||||
|
BDD encNoContext(void);
|
||||||
|
|
||||||
|
void initBDDvars(void);
|
||||||
|
void encodeTransitions(void);
|
||||||
|
void encodeTransitions_old(void);
|
||||||
|
void encodeInitStates(void);
|
||||||
|
void encodeInitStatesForCtxAut(void);
|
||||||
|
void encodeInitStatesNoCtxAut(void);
|
||||||
|
void mapStateToAct(void);
|
||||||
|
void mapProcEntities(void);
|
||||||
|
void encode(void);
|
||||||
|
|
||||||
|
void printUsedEntitiesPerProc(void);
|
||||||
|
|
||||||
|
int getMappedStateToActID(int stateID) const
|
||||||
|
{
|
||||||
|
assert(stateID < static_cast<int>(totalRctSysStateVars));
|
||||||
|
return stateToAct[stateID];
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t getCtxAutStateEncodingSize(void);
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user