// (max)value of an abstract state A = max_{conc state s \in A} max_{t \in succ(s)} maxvalue(B|t \in B) private double doLocalValueIteration(int k, List<Set<int>> abstractMap, List<double> absValue, bool isMax) { double diff = 1.0; double epsilon = 0.01; double alpha = 0.9; double newv; Dictionary<int,double> value = new Dictionary<int,double>(); foreach (int srcStateId in abstractMap[k]) value.Add(srcStateId,absValue[k]); Set<int> valueKeys = new Set<int>(value.Keys); while (diff > epsilon) { diff = 0.0; foreach (int stateHash in valueKeys) { if (activeEdges.ContainsKey(stateHash)) { newv = Math.Min(value[stateHash], alpha * findMax(activeEdges[stateHash],value,k,abstractMap,absValue)); diff = Math.Max(diff,Math.Abs(newv - value[stateHash])); value[stateHash] = newv; } else if (passiveEdges.ContainsKey(stateHash)) { newv = Math.Min(value[stateHash], alpha * findExpectedValue(passiveEdges[stateHash],value,k,abstractMap,absValue)); diff = Math.Max(diff,Math.Abs(newv - value[stateHash])); value[stateHash] = newv; } } } Set<double> vals = new Set<double>(value.Values); return (isMax? vals.Maximum():vals.Minimum()); }