public override void Init() { G = new TypedDAG <TASGNodeInfo, StdEdgeInfo>("TASG"); TapeLBound = 1; TapeRBound = 1; DAGNode s = new(nodeId++); G.AddNode(s); G.SetSourceNode(s); ComputationStep compStep = new() { q = MEAPSharedContext.MNP.qStart, s = MEAPSharedContext.Input[0], qNext = MEAPSharedContext.MNP.qStart, sNext = MEAPSharedContext.Input[0], m = TMDirection.S, Shift = 1, kappaTape = 1, kappaStep = 0 }; nodeEnumeration[s.Id] = s; compStepToNode[compStep] = s.Id; idToInfoMap[s.Id] = new TASGNodeInfo { CompStep = compStep }; endNodeIds.Add(0); }
public bool RemoveUnusedCommodities1(SortedSet <long> excludedComms) { long excludedCommsCount = excludedComms.Count; SortedDictionary <long, TypedDAG <GTCZNodeInfo, StdEdgeInfo> > gtczSet = new(); foreach (KeyValuePair <long, SortedSet <long> > idCommList in tapeSegContext.KSetZetaSubset) { GraphTConZetaBuilder gtczBuilder = new(meapContext); TypedDAG <GTCZNodeInfo, StdEdgeInfo> gtcz = gtczBuilder.Run(idCommList.Value); gtczSet[idCommList.Key] = gtcz; } foreach (KeyValuePair <long, SortedSet <long> > idCommList in tapeSegContext.KSetZetaSubset) { TypedDAG <GTCZNodeInfo, StdEdgeInfo> gtcz = gtczSet[idCommList.Key]; while (RemoveOrphanCommodities(idCommList.Key, idCommList.Value, gtcz, excludedComms)) { } } MarkUnusedNodes(); while (RemoveNotCoveredCommodities(excludedComms)) { } MarkUnusedNodes(); return(excludedComms.Count > excludedCommsCount); }
public bool RemoveOrphanCommodities( long zeta, SortedSet <long> zetaCommodities, TypedDAG <GTCZNodeInfo, StdEdgeInfo> gtcz, SortedSet <long> excludedComms) { List <long> commsToRemove = new(); foreach (long commodityId in zetaCommodities) { Commodity commodity = meapContext.Commodities[commodityId]; long sNodeId = commodity.Gi.GetSourceNodeId(); long tNodeId = commodity.Gi.GetSinkNodeId(); DAGNode gtcz_u = gtcz.NodeEnumeration[sNodeId]; DAGNode gtcz_v = gtcz.NodeEnumeration[tNodeId]; if ((!meapContext.TArbSeqCFG.IsSourceNode(sNodeId)) && (!gtcz_u.InEdges.Any())) { commsToRemove.Add(commodity.Id); gtcz.RemoveNodePair(sNodeId, tNodeId); continue; } if ((!meapContext.TArbSeqCFG.IsSinkNode(tNodeId)) && (!gtcz_v.OutEdges.Any())) { commsToRemove.Add(commodity.Id); gtcz.RemoveNodePair(sNodeId, tNodeId); continue; } } log.DebugFormat("Removed orphan commodities {0}:", zeta); commsToRemove.ForEach(c => { nodesCoverageKeeper.RemoveCommodity(c, excludedComms); log.DebugFormat("commodity {0}", c); }); return(commsToRemove.Any()); }
public override void Init() { G = new TypedDAG <TASGNodeInfo, StdEdgeInfo>("TASG"); TapeLBound = 0; TapeRBound = 0; DAGNode s = new(nodeId++); G.AddNode(s); G.SetSourceNode(s); MEAPSharedContext.NodeLevelInfo.AddNodeAtLevel(s.Id, 0); processedMu = 0; sCompStep = new ComputationStep { q = MEAPSharedContext.MNP.qStart, s = MEAPSharedContext.Input[0], qNext = MEAPSharedContext.MNP.qStart, sNext = MEAPSharedContext.Input[0], m = TMDirection.R, Shift = 1, kappaTape = 0, kappaStep = 0, sTheSame = OneTapeTuringMachine.blankSymbol }; nodeEnumeration[s.Id] = s; idToInfoMap[s.Id] = new TASGNodeInfo { CompStep = sCompStep }; propSymbolsKeeper = new PropSymbolsKeeperFactCPLTM(MEAPSharedContext); propSymbolsKeeper.Init(s.Id); CPLTMInfo = MEAPSharedContext.CPLTMInfo; endNodeIds.Add(G.GetSourceNodeId()); }
public void Run() { TypedDAG <TASGNodeInfo, StdEdgeInfo> cfg = meapContext.TArbSeqCFG; SortedDictionary <long, TASGNodeInfo> idToInfoMap = meapContext.TArbSeqCFG.IdToNodeInfoMap; long kStepA = kSteps.Item1; long kStepB = kSteps.Item2; long kStepC = kSteps.Item3; foreach (long nodeId in nodeVLevels[kStepB]) { currDUPairs.Add(new KeyValuePair <long, long>(nodeId, nodeId)); } for (long i = kStepB; i >= (kStepA + 1); i--) { foreach (KeyValuePair <long, long> duPair in currDUPairs) { long uNodeId = duPair.Key; long vNodeId = duPair.Value; DAGNode uNode = cfg.GetNode(uNodeId); DAGNode vNode = cfg.GetNode(vNodeId); foreach (DAGEdge uEdge in uNode.InEdges) { foreach (DAGEdge vEdge in vNode.OutEdges) { long defNodeId = uEdge.FromNode.Id; long useNodeId = vEdge.ToNode.Id; ComputationStep defCompStep = idToInfoMap[defNodeId].CompStep; ComputationStep useCompStep = idToInfoMap[useNodeId].CompStep; if ((defCompStep.kappaTape == useCompStep.kappaTape) && (defCompStep.sNext == useCompStep.s)) { nextDUPairs.Add(new KeyValuePair <long, long>(defNodeId, useNodeId)); } } } } currDUPairs.Clear(); nextDUPairs.ForEach(t => currDUPairs.Add(t)); foreach (KeyValuePair <long, long> duPair in currDUPairs) { long defNodeId = duPair.Key; long useNodeId = duPair.Value; ComputationStep defCompStep = idToInfoMap[defNodeId].CompStep; meapContext.TConsistPairSet.Add( new CompStepNodePair( variable: defCompStep.kappaTape, uNode: duPair.Key, vNode: duPair.Value )); meapContext.TConsistPairCount++; } } }