|
|
|
@ -310,32 +310,20 @@ public class Modules2MTBDD |
|
|
|
// deref spare dds |
|
|
|
globalDDRowVars.derefAll(); |
|
|
|
globalDDColVars.derefAll(); |
|
|
|
for (i = 0; i < numModules; i++) { |
|
|
|
JDD.Deref(moduleIdentities[i]); |
|
|
|
JDD.Deref(moduleRangeDDs[i]); |
|
|
|
} |
|
|
|
for (i = 0; i < numVars; i++) { |
|
|
|
JDD.Deref(varIdentities[i]); |
|
|
|
JDD.Deref(varRangeDDs[i]); |
|
|
|
JDD.Deref(varColRangeDDs[i]); |
|
|
|
} |
|
|
|
JDD.DerefArray(moduleIdentities, numModules); |
|
|
|
JDD.DerefArray(moduleRangeDDs, numModules); |
|
|
|
JDD.DerefArray(varIdentities, numVars); |
|
|
|
JDD.DerefArray(varRangeDDs, numVars); |
|
|
|
JDD.DerefArray(varColRangeDDs, numVars); |
|
|
|
JDD.Deref(range); |
|
|
|
if (modelType == ModelType.MDP) { |
|
|
|
for (i = 0; i < ddSynchVars.length; i++) { |
|
|
|
JDD.Deref(ddSynchVars[i]); |
|
|
|
} |
|
|
|
for (i = 0; i < ddSchedVars.length; i++) { |
|
|
|
JDD.Deref(ddSchedVars[i]); |
|
|
|
} |
|
|
|
for (i = 0; i < ddChoiceVars.length; i++) { |
|
|
|
JDD.Deref(ddChoiceVars[i]); |
|
|
|
} |
|
|
|
JDD.DerefArray(ddSynchVars, ddSynchVars.length); |
|
|
|
JDD.DerefArray(ddSchedVars, ddSchedVars.length); |
|
|
|
JDD.DerefArray(ddChoiceVars, ddChoiceVars.length); |
|
|
|
} |
|
|
|
if (doSymmetry) { |
|
|
|
JDD.Deref(symm); |
|
|
|
for (i = 0; i < numSymmModules-1; i++) { |
|
|
|
JDD.Deref(nonSymms[i]); |
|
|
|
} |
|
|
|
JDD.DerefArray(nonSymms, numSymmModules-1); |
|
|
|
} |
|
|
|
|
|
|
|
expr2mtbdd.clearDummyModel(); |
|
|
|
@ -598,26 +586,20 @@ public class Modules2MTBDD |
|
|
|
// go thru all syncronising action vars |
|
|
|
for (i = 0; i < ddSynchVars.length; i++) { |
|
|
|
// add to list |
|
|
|
JDD.Ref(ddSynchVars[i]); |
|
|
|
JDD.Ref(ddSynchVars[i]); |
|
|
|
allDDSynchVars.addVar(ddSynchVars[i]); |
|
|
|
allDDNondetVars.addVar(ddSynchVars[i]); |
|
|
|
allDDSynchVars.addVar(ddSynchVars[i].copy()); |
|
|
|
allDDNondetVars.addVar(ddSynchVars[i].copy()); |
|
|
|
} |
|
|
|
// go thru all scheduler nondet vars |
|
|
|
for (i = 0; i < ddSchedVars.length; i++) { |
|
|
|
// add to list |
|
|
|
JDD.Ref(ddSchedVars[i]); |
|
|
|
JDD.Ref(ddSchedVars[i]); |
|
|
|
allDDSchedVars.addVar(ddSchedVars[i]); |
|
|
|
allDDNondetVars.addVar(ddSchedVars[i]); |
|
|
|
allDDSchedVars.addVar(ddSchedVars[i].copy()); |
|
|
|
allDDNondetVars.addVar(ddSchedVars[i].copy()); |
|
|
|
} |
|
|
|
// go thru all local nondet vars |
|
|
|
for (i = 0; i < ddChoiceVars.length; i++) { |
|
|
|
// add to list |
|
|
|
JDD.Ref(ddChoiceVars[i]); |
|
|
|
JDD.Ref(ddChoiceVars[i]); |
|
|
|
allDDChoiceVars.addVar(ddChoiceVars[i]); |
|
|
|
allDDNondetVars.addVar(ddChoiceVars[i]); |
|
|
|
allDDChoiceVars.addVar(ddChoiceVars[i].copy()); |
|
|
|
allDDNondetVars.addVar(ddChoiceVars[i].copy()); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
@ -646,8 +628,7 @@ public class Modules2MTBDD |
|
|
|
id = JDD.Constant(1); |
|
|
|
for (j = 0; j < numVars; j++) { |
|
|
|
if (varList.getModule(j) == i) { |
|
|
|
JDD.Ref(varIdentities[j]); |
|
|
|
id = JDD.Apply(JDD.TIMES, id, varIdentities[j]); |
|
|
|
id = JDD.Apply(JDD.TIMES, id, varIdentities[j].copy()); |
|
|
|
} |
|
|
|
} |
|
|
|
moduleIdentities[i] = id; |
|
|
|
@ -668,21 +649,17 @@ public class Modules2MTBDD |
|
|
|
varColRangeDDs = new JDDNode[numVars]; |
|
|
|
for (i = 0; i < numVars; i++) { |
|
|
|
// obtain range dd by abstracting from identity matrix |
|
|
|
JDD.Ref(varIdentities[i]); |
|
|
|
varRangeDDs[i] = JDD.SumAbstract(varIdentities[i], varDDColVars[i]); |
|
|
|
varRangeDDs[i] = JDD.SumAbstract(varIdentities[i].copy(), varDDColVars[i]); |
|
|
|
// obtain range dd by abstracting from identity matrix |
|
|
|
JDD.Ref(varIdentities[i]); |
|
|
|
varColRangeDDs[i] = JDD.SumAbstract(varIdentities[i], varDDRowVars[i]); |
|
|
|
varColRangeDDs[i] = JDD.SumAbstract(varIdentities[i].copy(), varDDRowVars[i]); |
|
|
|
// build up range for whole system as we go |
|
|
|
JDD.Ref(varRangeDDs[i]); |
|
|
|
range = JDD.Apply(JDD.TIMES, range, varRangeDDs[i]); |
|
|
|
range = JDD.Apply(JDD.TIMES, range, varRangeDDs[i].copy()); |
|
|
|
} |
|
|
|
// module ranges |
|
|
|
moduleRangeDDs = new JDDNode[numModules]; |
|
|
|
for (i = 0; i < numModules; i++) { |
|
|
|
// obtain range dd by abstracting from identity matrix |
|
|
|
JDD.Ref(moduleIdentities[i]); |
|
|
|
moduleRangeDDs[i] = JDD.SumAbstract(moduleIdentities[i], moduleDDColVars[i]); |
|
|
|
moduleRangeDDs[i] = JDD.SumAbstract(moduleIdentities[i].copy(), moduleDDColVars[i]); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@ -715,8 +692,7 @@ public class Modules2MTBDD |
|
|
|
// for dtmcs, need to normalise each row to remove local nondeterminism |
|
|
|
if (modelType == ModelType.DTMC) { |
|
|
|
// divide each row by row sum |
|
|
|
JDD.Ref(trans); |
|
|
|
tmp = JDD.SumAbstract(trans, allDDColVars); |
|
|
|
tmp = JDD.SumAbstract(trans.copy(), allDDColVars); |
|
|
|
trans = JDD.Apply(JDD.DIVIDE, trans, tmp); |
|
|
|
} |
|
|
|
} |
|
|
|
@ -783,8 +759,7 @@ public class Modules2MTBDD |
|
|
|
// independent bit |
|
|
|
tmp = JDD.Constant(1); |
|
|
|
for (i = 0; i < numSynchs; i++) { |
|
|
|
JDD.Ref(ddSynchVars[i]); |
|
|
|
tmp = JDD.And(tmp, JDD.Not(ddSynchVars[i])); |
|
|
|
tmp = JDD.And(tmp, JDD.Not(ddSynchVars[i].copy())); |
|
|
|
} |
|
|
|
sysDDs.ind.trans = JDD.Apply(JDD.TIMES, tmp, sysDDs.ind.trans); |
|
|
|
//JDD.Ref(tmp); |
|
|
|
@ -793,12 +768,11 @@ public class Modules2MTBDD |
|
|
|
for (i = 0; i < numSynchs; i++) { |
|
|
|
tmp = JDD.Constant(1); |
|
|
|
for (j = 0; j < numSynchs; j++) { |
|
|
|
JDD.Ref(ddSynchVars[j]); |
|
|
|
if (j == i) { |
|
|
|
tmp = JDD.And(tmp, ddSynchVars[j]); |
|
|
|
tmp = JDD.And(tmp, ddSynchVars[j].copy()); |
|
|
|
} |
|
|
|
else { |
|
|
|
tmp = JDD.And(tmp, JDD.Not(ddSynchVars[j])); |
|
|
|
tmp = JDD.And(tmp, JDD.Not(ddSynchVars[j].copy())); |
|
|
|
} |
|
|
|
} |
|
|
|
sysDDs.synchs[i].trans = JDD.Apply(JDD.TIMES, tmp, sysDDs.synchs[i].trans); |
|
|
|
@ -813,14 +787,12 @@ public class Modules2MTBDD |
|
|
|
// now, for all model types, transition matrix can be built by summing over all actions |
|
|
|
// also build transition rewards at the same time |
|
|
|
n = modulesFile.getNumRewardStructs(); |
|
|
|
JDD.Ref(sysDDs.ind.trans); |
|
|
|
trans = sysDDs.ind.trans; |
|
|
|
trans = sysDDs.ind.trans.copy(); |
|
|
|
for (j = 0; j < n; j++) { |
|
|
|
transRewards[j] = sysDDs.ind.rewards[j]; |
|
|
|
} |
|
|
|
for (i = 0; i < numSynchs; i++) { |
|
|
|
JDD.Ref(sysDDs.synchs[i].trans); |
|
|
|
trans = JDD.Apply(JDD.PLUS, trans, sysDDs.synchs[i].trans); |
|
|
|
trans = JDD.Apply(JDD.PLUS, trans, sysDDs.synchs[i].trans.copy()); |
|
|
|
for (j = 0; j < n; j++) { |
|
|
|
transRewards[j] = JDD.Apply(JDD.PLUS, transRewards[j], sysDDs.synchs[i].rewards[j]); |
|
|
|
} |
|
|
|
@ -833,20 +805,17 @@ public class Modules2MTBDD |
|
|
|
if (modelType != ModelType.MDP) { |
|
|
|
n = modulesFile.getNumRewardStructs(); |
|
|
|
for (j = 0; j < n; j++) { |
|
|
|
JDD.Ref(trans); |
|
|
|
transRewards[j] = JDD.Apply(JDD.DIVIDE, transRewards[j], trans); |
|
|
|
transRewards[j] = JDD.Apply(JDD.DIVIDE, transRewards[j], trans.copy()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// For MDPs, we take a copy of the DDs used to construct the part |
|
|
|
// of the transition matrix that corresponds to each action |
|
|
|
if (modelType == ModelType.MDP && storeTransParts) { |
|
|
|
JDD.Ref(sysDDs.ind.trans); |
|
|
|
transInd = JDD.ThereExists(JDD.GreaterThan(sysDDs.ind.trans, 0), allDDColVars); |
|
|
|
transInd = JDD.ThereExists(JDD.GreaterThan(sysDDs.ind.trans.copy(), 0), allDDColVars); |
|
|
|
transSynch = new JDDNode[numSynchs]; |
|
|
|
for (i = 0; i < numSynchs; i++) { |
|
|
|
JDD.Ref(sysDDs.synchs[i].trans); |
|
|
|
transSynch[i] = JDD.ThereExists(JDD.GreaterThan(sysDDs.synchs[i].trans, 0), allDDColVars); |
|
|
|
transSynch[i] = JDD.ThereExists(JDD.GreaterThan(sysDDs.synchs[i].trans.copy(), 0), allDDColVars); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@ -874,8 +843,7 @@ public class Modules2MTBDD |
|
|
|
//tmp = JDD.ThereExists(JDD.GreaterThan(sysDDs.ind.trans, 0), allDDColVars); |
|
|
|
//transActions = JDD.Apply(JDD.PLUS, transActions, JDD.Apply(JDD.TIMES, tmp, JDD.Constant(1))); |
|
|
|
for (i = 0; i < numSynchs; i++) { |
|
|
|
JDD.Ref(sysDDs.synchs[i].trans); |
|
|
|
tmp = JDD.ThereExists(JDD.GreaterThan(sysDDs.synchs[i].trans, 0), allDDColVars); |
|
|
|
tmp = JDD.ThereExists(JDD.GreaterThan(sysDDs.synchs[i].trans.copy(), 0), allDDColVars); |
|
|
|
transActions = JDD.Apply(JDD.PLUS, transActions, JDD.Apply(JDD.TIMES, tmp, JDD.Constant(1+i))); |
|
|
|
} |
|
|
|
break; |
|
|
|
@ -883,11 +851,9 @@ public class Modules2MTBDD |
|
|
|
case CTMC: |
|
|
|
// Just reference DDs and copy them to new array |
|
|
|
transPerAction = new JDDNode[numSynchs + 1]; |
|
|
|
JDD.Ref(sysDDs.ind.trans); |
|
|
|
transPerAction[0] = sysDDs.ind.trans; |
|
|
|
transPerAction[0] = sysDDs.ind.trans.copy(); |
|
|
|
for (i = 0; i < numSynchs; i++) { |
|
|
|
JDD.Ref(sysDDs.synchs[i].trans); |
|
|
|
transPerAction[i + 1] = sysDDs.synchs[i].trans; |
|
|
|
transPerAction[i + 1] = sysDDs.synchs[i].trans.copy(); |
|
|
|
} |
|
|
|
break; |
|
|
|
} |
|
|
|
@ -970,8 +936,7 @@ public class Modules2MTBDD |
|
|
|
sysDDs.synchs[i] = translateModule(m, module, synch, synchMin[i]); |
|
|
|
} |
|
|
|
// store identity matrix |
|
|
|
JDD.Ref(moduleIdentities[m]); |
|
|
|
sysDDs.id = moduleIdentities[m]; |
|
|
|
sysDDs.id = moduleIdentities[m].copy(); |
|
|
|
|
|
|
|
// store synchs used |
|
|
|
sysDDs.allSynchs.addAll(module.getAllSynchs()); |
|
|
|
@ -1568,11 +1533,9 @@ public class Modules2MTBDD |
|
|
|
} |
|
|
|
|
|
|
|
// deref guards/updates |
|
|
|
for (l = 0; l < numCommands; l++) { |
|
|
|
JDD.Deref(guardDDs[l]); |
|
|
|
JDD.Deref(upDDs[l]); |
|
|
|
//JDD.Deref(rewDDs[l]); |
|
|
|
} |
|
|
|
JDD.DerefArray(guardDDs, numCommands); |
|
|
|
JDD.DerefArray(upDDs, numCommands); |
|
|
|
//JDD.DerefArray(rewDDs, numCommands); |
|
|
|
|
|
|
|
return compDDs; |
|
|
|
} |
|
|
|
|