public void Dump(TextWriter tw) { var set = new HashSet <SymValue> (); var workList = new WorkList <SymValue> (); IImmutableMap <SymValue, int> triggers = ImmutableIntKeyMap <SymValue, int> .Empty(SymValue.GetUniqueKey); tw.WriteLine("EGraphId: {0}", this.egraph_id); tw.WriteLine("LastSymbolId: {0}", LastSymbolId); foreach (TFunc function in TermMap.Keys2(this.const_root)) { SymValue sv = this [this.const_root, function]; tw.WriteLine("{0} = {1}", function, sv); workList.Add(sv); } while (!workList.IsEmpty()) { SymValue sv = workList.Pull(); if (!set.Add(sv)) { continue; } foreach (TFunc function in TermMap.Keys2(sv)) { SymValue target = this [sv, function]; tw.WriteLine("{0}({2}) = {1})", function, target, sv); workList.Add(target); } foreach (var edge in MultiEdgeMap.Keys2(sv)) { foreach (SymValue target in MultiEdgeMap[sv, edge].AsEnumerable()) { if (!UpdateTrigger(target, edge, ref triggers)) { continue; } SymGraphTerm <TFunc> term = EqualMultiTermsMap [target]; if (term.Args != null) { tw.WriteLine("{0}({1}) = {2}", term.Function, term.Args.ToString(", "), target); workList.Add(target); } } } } tw.WriteLine("**Abstract value map"); foreach (SymValue sv in set) { TADomain abstractValue = this [sv]; if (!abstractValue.IsTop) { tw.WriteLine("{0} -> {1}", sv, abstractValue); } } }
private IEnumerable <MultiEdge <TFunc, TADomain> > MultiEdges(SymValue sv) { return(MultiEdgeMap.Keys2(Find(sv))); }
public SymValue this [SymValue[] args, TFunc function] { get { int len = args.Length; for (int i = 0; i < len; i++) { args [i] = Find(args [i]); } SymValue candidate = FindCandidate(args, function); if (candidate != null) { return(candidate); } candidate = FreshSymbol(); for (int i = 0; i < len; i++) { var edge = new MultiEdge <TFunc, TADomain> (function, i, len); MultiEdgeMap = MultiEdgeMap.Add(args [i], edge, MultiEdgeMap [args [i], edge].Cons(candidate)); } EqualMultiTermsMap = EqualMultiTermsMap.Add(candidate, new SymGraphTerm <TFunc> (function, args)); AddMultiEdgeUpdate(args, function); return(candidate); } set { int len = args.Length; for (int i = 0; i < len; i++) { args [i] = Find(args [i]); } bool isTermEqual = true; SymGraphTerm <TFunc> term = EqualMultiTermsMap [value]; if (term.Args != null) { for (int i = 0; i < len; i++) { if (term.Args [i] != args [i]) { isTermEqual = false; break; } } } for (int i = 0; i < len; i++) { var edge = new MultiEdge <TFunc, TADomain> (function, i, len); Sequence <SymValue> list = MultiEdgeMap [args [i], edge]; if (isTermEqual && !Sequence <SymValue> .Contains(list, value)) { isTermEqual = false; } if (!isTermEqual) { MultiEdgeMap = MultiEdgeMap.Add(args [i], edge, list.Cons(value)); } } if (isTermEqual) { return; } EqualMultiTermsMap = EqualMultiTermsMap.Add(value, new SymGraphTerm <TFunc> (function, args)); AddMultiEdgeUpdate(args, function); } }