Beispiel #1
0
        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);
        }
Beispiel #2
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);
        }
Beispiel #3
0
        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());
        }
Beispiel #4
0
        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++;
                }
            }
        }