Beispiel #1
0
        public static (List <long>, bool) FindPath_Greedy(
            DAGNode s,
            DAGNode t,
            GraphDirection direction,
            Predicate <DAGNode> nodeFilter,
            Predicate <DAGEdge> edgeFilter,
            Action <DAGNode> nodeAction,
            Action <DAGEdge> edgeAction)
        {
            List <long> path      = new();
            bool        pathFound = false;

            SortedSet <long> processedNodes = new();
            DAGNode          currentNode    = (direction == GraphDirection.Forward ? s : t);

            if (!nodeFilter(currentNode))
            {
                pathFound = false;

                return(path, pathFound);
            }

            while (true)
            {
                processedNodes.Add(currentNode.Id);
                bool nextNodeFound = false;

                path.Add(currentNode.Id);
                nodeAction(currentNode);

                if (currentNode == (direction == GraphDirection.Forward ? t : s))
                {
                    pathFound = true;

                    return(path, pathFound);
                }

                List <DAGEdge> nextEdges = (direction == GraphDirection.Forward ?
                                            currentNode.OutEdges : currentNode.InEdges);

                foreach (DAGEdge e in nextEdges)
                {
                    DAGNode v = (direction == GraphDirection.Forward ? e.ToNode : e.FromNode);
                    if (edgeFilter(e) && nodeFilter(v))
                    {
                        currentNode = v;
                        edgeAction(e);

                        nextNodeFound = true;

                        break;
                    }
                }

                if (!nextNodeFound)
                {
                    return(path, pathFound);
                }
            }
        }
Beispiel #2
0
        public DAGEdge(long id, DAGNode fromNode, DAGNode toNode)
        {
            this.Id = id;

            this.FromNode = fromNode;
            this.ToNode   = toNode;
        }
        private static void CopyNodesAndEdges(
            DAG graph,
            SortedSet <long> nodeIdSubset,
            DAG subgraph)
        {
            subgraph.NodeEnumeration = new SortedDictionary <long, DAGNode>();

            foreach (long nodeId in nodeIdSubset)
            {
                DAGNode subgraphNode = new(nodeId);
                subgraph.AddNode(subgraphNode);
            }

            List <KeyValuePair <KeyValuePair <long, long>, DAGEdge> > nodePairList1 =
                graph.NodePairEnumeration.Where(
                    t => subgraph.NodeEnumeration.ContainsKey(t.Key.Key)).ToList();
            List <KeyValuePair <KeyValuePair <long, long>, DAGEdge> > nodePairList2 =
                nodePairList1.Where(
                    t => subgraph.NodeEnumeration.ContainsKey(t.Key.Value)).ToList();

            subgraph.NodePairEnumeration =
                new SortedDictionary <KeyValuePair <long, long>, DAGEdge>(
                    new KeyValueComparer());

            foreach (KeyValuePair <KeyValuePair <long, long>, DAGEdge> nodePair in nodePairList2)
            {
                DAGNode uSubgraphNode = subgraph.NodeEnumeration[nodePair.Key.Key];
                DAGNode vSubgraphNode = subgraph.NodeEnumeration[nodePair.Key.Value];

                DAGEdge subgraphEdge = new(nodePair.Value.Id, uSubgraphNode, vSubgraphNode);
                subgraph.AddEdge(subgraphEdge);
            }
        }
        public bool IfThereIsFlowFrom(
            DAGNode fromNode,
            ComputationStep fromCompStep,
            ComputationStep toCompStep)
        {
            uint inputLength = (uint)MEAPSharedContext.Input.Length;

            long L = MEAPSharedContext.MNP.GetLTapeBound(0, inputLength);
            long R = MEAPSharedContext.MNP.GetRTapeBound(0, inputLength);

            if ((toCompStep.kappaTape < L) || (R < toCompStep.kappaTape))
            {
                return(false);
            }

            if (fromCompStep.m == TMDirection.S)
            {
                if (fromCompStep.sNext != toCompStep.s)
                {
                    return(false);
                }
            }

            SortedSet <PropSymbol> procSymPrev = AppHelper.TakeValueByKey(
                propagatedSymbols, fromNode.Id,
                () => new SortedSet <PropSymbol>(new PropSymbolComparer()));

            IEnumerable <PropSymbol> prevPairs = procSymPrev.Where(
                t => (t.Variable == toCompStep.kappaTape));

            IEnumerable <PropSymbol> prevMatchPairs =
                prevPairs.Where(t => t.Symbol == toCompStep.s);

            return(prevMatchPairs.Any());
        }
Beispiel #5
0
        public static bool FindPath_DFS(
            DAG dag,
            DAGNode s,
            GraphDirection direction,
            Predicate <DAGNode> nodeFilter,
            Predicate <DAGEdge> edgeFilter,
            Action <DAGNode, long> nodeAction,
            Action <DAGEdge, long> edgeAction,
            List <long> path)
        {
            SortedSet <long> processedNodes = new();

            bool pathFound = FindPath_DFS(
                s,
                dag.t,
                processedNodes,
                direction,
                0,
                nodeFilter,
                edgeFilter,
                nodeAction,
                edgeAction,
                path);

            return(pathFound);
        }
        public override SortedDictionary <long, Commodity> CreateCommodities()
        {
            compStepNodePairEnum.ForEach(p =>
            {
                log.InfoFormat(
                    "Comp step: {0} {1} {2}",
                    p.Value.Variable,
                    p.Value.uNode,
                    p.Value.vNode);
            });

            SortedDictionary <long, DAGNode> nodeEnumeration = meapContext.TArbSeqCFG.NodeEnumeration;
            long i = 0;

            foreach (KeyValuePair <long, CompStepNodePair> compStepNodePairPair in compStepNodePairEnum)
            {
                long             pairId           = compStepNodePairPair.Key;
                CompStepNodePair compStepNodePair = compStepNodePairPair.Value;

                DAGNode sNode = nodeEnumeration[compStepNodePair.uNode];
                DAGNode tNode = nodeEnumeration[compStepNodePair.vNode];

                log.DebugFormat("Build commodities: {0}", i);

                Commodity newCommodity = new("Ki", i, compStepNodePair.Variable, default !);
Beispiel #7
0
        public static void DFS(
            DAGNode s,
            GraphDirection direction,
            Action <DAGNode, long> nodeAction,
            Action <DAGEdge, long> edgeAction)
        {
            SortedSet <long> processedNodes = new();

            DFS(s, processedNodes, direction, 0, nodeAction, edgeAction);
        }
Beispiel #8
0
        public static bool PropagateProperties(
            DAG dag,
            long fromNodeId,
            GraphDirection direction,
            Predicate <DAGNode> nodeFilter,
            Predicate <DAGEdge> edgeFilter,
            Predicate <DAGNode> nodeAction,
            Predicate <DAGEdge> edgeAction)
        {
            QueueWithIdSet <DAGNode> nodeQueue = new();
            bool             status            = false;
            SortedSet <long> processedNodes    = new();
            DAGNode          s = dag.NodeEnumeration[fromNodeId];

            if (nodeFilter(s))
            {
                nodeQueue.Enqueue(s);
            }

            while (nodeQueue.Any())
            {
                DAGNode u = nodeQueue.Dequeue();
                if (processedNodes.Contains(u.Id))
                {
                    continue;
                }

                processedNodes.Add(u.Id);

                bool nodeActionStatus = nodeAction(u);
                status = status || nodeActionStatus;

                foreach (DAGEdge e in (direction == GraphDirection.Forward ?
                                       u.OutEdges : u.InEdges))
                {
                    DAGNode v = (direction == GraphDirection.Forward ? e.ToNode : e.FromNode);

                    if (!edgeFilter(e))
                    {
                        continue;
                    }

                    bool edgeActionStatus = edgeAction(e);
                    status = status || edgeActionStatus;

                    if (nodeFilter(v) && (!nodeQueue.Contains(v)))
                    {
                        nodeQueue.Enqueue((direction == GraphDirection.Forward ? e.ToNode : e.FromNode));
                    }
                }
            }

            return(status);
        }
        public override void FindTConsistPath()
        {
            tapeSegContext.TapeSegTConsistPath = new List <long>();
            tapeSegContext.TapeSegPathFound    = false;

            if (tapeSegContext.KSetZetaSubset.Count == 1)
            {
                if (FindPathInCaseSingleZeta())
                {
                    tapeSegContext.TapeSegPathExists = true;
                    tapeSegContext.TapeSegPathFound  = true;

                    log.Info("Found path in case of single zeta");

                    return;
                }
            }

            List <long> partialTConsistPath = tapeSegContext.PartialTConsistPath;

            while (true)
            {
                if (!SelectNode(partialTConsistPath, out long initNodeId))
                {
                    log.Info("Path not found (select node)");

                    return;
                }

                DAGNode initNode = meapContext.TArbSeqCFG.NodeEnumeration[initNodeId];
                processedNodes.Add(initNodeId);

                (List <long> tConsistPath, bool KPathFound) = DAG.FindPath_Greedy(
                    initNode,
                    meapContext.TArbSeqCFG.t,
                    GraphDirection.Forward,
                    u => !tapeSegContext.TArbSeqCFGUnusedNodes.Contains(u.Id),
                    d => NodeInChain(d.ToNode),
                    u => processedNodes.Add(u.Id),
                    (_) => { });

                if (KPathFound)
                {
                    tapeSegContext.TapeSegTConsistPath.AddRange(partialTConsistPath);
                    tapeSegContext.TapeSegTConsistPath.AddRange(tConsistPath);

                    tapeSegContext.TapeSegPathExists = true;
                    tapeSegContext.TapeSegPathFound  = true;

                    return;
                }
            }
        }
Beispiel #10
0
        public TypedDAG <GTCZNodeInfo, StdEdgeInfo> Run(SortedSet <long> commodities)
        {
            TypedDAG <GTCZNodeInfo, StdEdgeInfo> gtcz            = new("GTCZ");
            SortedDictionary <long, DAGNode>     nodeEnumeration = new();
            long edgeId = 0;

            foreach (long commodityId in commodities)
            {
                Commodity commodity = meapContext.Commodities[commodityId];

                long sNodeId = commodity.sNodeId;
                long tNodeId = commodity.tNodeId;

                if (!nodeEnumeration.ContainsKey(sNodeId))
                {
                    DAGNode newNode = new(sNodeId);
                    gtcz.AddNode(newNode);

                    if (meapContext.TArbSeqCFG.IsSourceNode(sNodeId))
                    {
                        gtcz.SetSourceNode(newNode);
                    }

                    nodeEnumeration[sNodeId] = newNode;
                }

                if (!nodeEnumeration.ContainsKey(tNodeId))
                {
                    DAGNode newNode = new(tNodeId);
                    gtcz.AddNode(newNode);

                    if (meapContext.TArbSeqCFG.IsSinkNode(tNodeId))
                    {
                        gtcz.SetSinkNode(newNode);
                    }

                    nodeEnumeration[tNodeId] = newNode;
                }

                DAGNode from = nodeEnumeration[sNodeId];
                DAGNode to   = nodeEnumeration[tNodeId];

                if (!gtcz.AreConnected(from.Id, to.Id))
                {
                    DAGEdge newEdge = new(edgeId++, from, to);
                    gtcz.AddEdge(newEdge);
                }
            }

            return(gtcz);
        }
        public override void CheckNCGNodesHaveTheSameSymbol(MEAPContext meapContext)
        {
            log.Info("CheckNCGNodesHaveTheSameSymbolFrom");

            foreach (KeyValuePair <long, FwdBkwdNCommsGraphPair> ncgItemPair in
                     meapContext.muToNestedCommsGraphPair)
            {
                NCGraphType bkwdNestedCommsGraph = ncgItemPair.Value.BkwdNestedCommsGraph;

                foreach (KeyValuePair <long, DAGNode> ncgNodeItemPair in bkwdNestedCommsGraph.NodeEnumeration)
                {
                    long    uNCGNodeId = ncgNodeItemPair.Key;
                    DAGNode uNCGNode   = ncgNodeItemPair.Value;

                    if (!meapContext.Commodities.TryGetValue(uNCGNodeId, out Commodity? uComm))
                    {
                        continue;
                    }

                    long            uNodeId   = uComm.tNodeId;
                    ComputationStep uCompStep = meapContext.TArbSeqCFG.IdToNodeInfoMap[uNodeId].CompStep;

                    bool firstEdge = true;
                    int  sTo       = OneTapeTuringMachine.blankSymbol;

                    foreach (DAGEdge e in uNCGNode.InEdges)
                    {
                        long            vNCGNodeId = e.FromNode.Id;
                        Commodity       vComm      = meapContext.Commodities[vNCGNodeId];
                        long            vNodeId    = vComm.tNodeId;
                        ComputationStep vCompStep  = meapContext.TArbSeqCFG.IdToNodeInfoMap[vNodeId].CompStep;

                        if (vNodeId == meapContext.TArbSeqCFG.GetSinkNodeId())
                        {
                            continue;
                        }

                        if (firstEdge)
                        {
                            sTo       = vCompStep.s;
                            firstEdge = false;
                        }
                        else
                        {
                            Ensure.That(vCompStep.s).Is(sTo);
                        }
                    }
                }
            }
        }
Beispiel #12
0
        public static bool BFS(
            DAG dag,
            SortedSet <long> initNodes,
            Predicate <DAGNode> filter,
            Predicate <DAGNode> action)
        {
            SortedSet <long>         processedNodes = new();
            QueueWithIdSet <DAGNode> nodeQueue      = new();
            bool status = false;

            initNodes.ForEach(u =>
            {
                DAGNode uNode = dag.NodeEnumeration[u];

                if (!nodeQueue.Contains(uNode))
                {
                    nodeQueue.Enqueue(uNode);
                }

                processedNodes.Add(u);
            });

            while (nodeQueue.Any())
            {
                DAGNode v = nodeQueue.Dequeue();

                if (!filter(v))
                {
                    continue;
                }

                if (InFlowComputed(initNodes, filter, processedNodes, v))
                {
                    processedNodes.Add(v.Id);

                    bool actionStatus = action(v);
                    status = status || actionStatus;

                    foreach (DAGEdge e in v.OutEdges)
                    {
                        if (!nodeQueue.Contains(e.ToNode))
                        {
                            nodeQueue.Enqueue(e.ToNode);
                        }
                    }
                }
            }

            return(status);
        }
Beispiel #13
0
        public void Run()
        {
            SortedDictionary <long, SortedSet <long> > nodeVLevels =
                meapContext.MEAPSharedContext.NodeLevelInfo.NodeVLevels;

            bkwdKStepSequence = CPLTMInfo.BkwdCommsKStepSequence(kStep).ToArray();
            long bkwdKStepLastIndex = bkwdKStepSequence.LastIndex();

            for (long i = (bkwdKStepLastIndex - 1); i >= 0; i--)
            {
                foreach (long uId in nodeVLevels[bkwdKStepSequence[i]])
                {
                    if (!meapContext.TArbSeqCFG.HasNode(uId))
                    {
                        continue;
                    }

                    DAGNode uNode = meapContext.TArbSeqCFG.GetNode(uId);

                    foreach (DAGEdge e in uNode.InEdges)
                    {
                        DAGNode vNode = e.FromNode;
                        long    vId   = vNode.Id;

                        Connect2CommsByCFGEdge(e.Id, uId, vId);
                    }
                }
            }

            foreach (long uId in nodeVLevels[bkwdKStepSequence[bkwdKStepLastIndex]])
            {
                if (!meapContext.TArbSeqCFG.HasNode(uId))
                {
                    continue;
                }

                DAGNode uNode = meapContext.TArbSeqCFG.GetNode(uId);

                foreach (DAGEdge e in uNode.InEdges)
                {
                    DAGNode vNode = e.FromNode;
                    long    vId   = vNode.Id;

                    ConnectCommAndCFGNodeByCFGEdge(e.Id, uId, vId);
                }
            }
        }
Beispiel #14
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 #15
0
        private static bool InFlowComputed(
            SortedSet <long> initNodes,
            Predicate <DAGNode> filter,
            SortedSet <long> processedNodes,
            DAGNode w)
        {
            if (!w.InEdges.Any())
            {
                return(true);
            }

            if (initNodes.Contains(w.Id))
            {
                return(true);
            }

            return(w.InEdges.All(e => (!filter(e.FromNode) ||
                                       processedNodes.Contains(e.FromNode.Id))));
        }
        public override SortedDictionary <long, Commodity> CreateCommodities()
        {
            log.DebugFormat(
                "Build commodities: {0}",
                meapContext.TConsistPairSet.Count);

            long i = 0;
            IReadOnlyDictionary <long, DAGNode> nodeEnumeration = meapContext.TArbSeqCFG.NodeEnumeration;

            foreach (KeyValuePair <long, CompStepNodePair> compStepNodePairPair in compStepNodePairEnum)
            {
                CompStepNodePair compStepNodePair = compStepNodePairPair.Value;

                DAGNode sNode = nodeEnumeration[compStepNodePair.uNode];
                DAGNode tNode = nodeEnumeration[compStepNodePair.vNode];

                log.DebugFormat("Build commodites: {0}", i);

                Commodity newCommodity = new("Ki", i, compStepNodePair.Variable, default !);
Beispiel #17
0
        public override void FindTConsistPath()
        {
            log.Debug("Finding tconsist path ...");

            TraceKZetaSet();
            TraceLPSolution();

            tapeSegContext.TapeSegTConsistPath = new List <long>();
            tapeSegContext.TapeSegPathFound    = false;

            List <long> partialTConsistPath = tapeSegContext.PartialTConsistPath;
            long        headNodeId          = partialTConsistPath.Last();

            (tConsistPath, integralKPathFound) = DAG.FindPath_Greedy(
                meapContext.TArbSeqCFG.NodeEnumeration[headNodeId],
                meapContext.TArbSeqCFG.t,
                GraphDirection.Forward,
                IsIntegralFlowNode,
                (_) => true,
                (_) => { },
                (_) => { });

            partialTConsistPath.AddRange(tConsistPath.Skip(1));

            if (integralKPathFound)
            {
                tapeSegContext.TapeSegTConsistPath = new List <long>(partialTConsistPath);
                tapeSegContext.TapeSegPathFound    = true;
            }
            else
            {
                log.DebugFormat("Integral KPath not found");

                long    tailNodeId = partialTConsistPath.Last();
                DAGNode tailNode   = meapContext.TArbSeqCFG.NodeEnumeration[tailNodeId];

                tapeSegContext.TConsistPathNodes = tailNode.OutEdges.Where(
                    e => IsPositiveFlowNode(e.ToNode)).Select(e => e.ToNode.Id).ToList();

                tapeSegContext.TapeSegPathFound = false;
            }
        }
        public override void CheckTASGNodesHaveTheSameSymbol(MEAPContext meapContext)
        {
            log.Info("CheckTASGNodesHaveTheSameSymbolFrom");

            foreach (KeyValuePair <long, DAGNode> itemPair in meapContext.TArbSeqCFG.NodeEnumeration)
            {
                long uNodeId = itemPair.Key;

                if (uNodeId == meapContext.TArbSeqCFG.GetSourceNodeId())
                {
                    continue;
                }

                DAGNode         uNode     = itemPair.Value;
                ComputationStep uCompStep = meapContext.TArbSeqCFG.IdToNodeInfoMap[uNodeId].CompStep;

                bool firstEdge = true;
                int  sTo       = OneTapeTuringMachine.blankSymbol;

                foreach (DAGEdge e in uNode.OutEdges)
                {
                    long            vNodeId   = e.ToNode.Id;
                    ComputationStep vCompStep = meapContext.TArbSeqCFG.IdToNodeInfoMap[vNodeId].CompStep;

                    if (vNodeId == meapContext.TArbSeqCFG.GetSinkNodeId())
                    {
                        continue;
                    }

                    if (firstEdge)
                    {
                        sTo       = vCompStep.s;
                        firstEdge = false;
                    }
                    else
                    {
                        Ensure.That(vCompStep.s).Is(sTo);
                    }
                }
            }
        }
        public bool IfThereIsFlowFrom(
            DAGNode fromNode,
            ComputationStep fromCompStep,
            ComputationStep toCompStep)
        {
            if ((fromCompStep.m == TMDirection.S) &&
                (fromCompStep.sNext != toCompStep.s))
            {
                return(false);
            }

            SortedSet <PropSymbol> procSymPrev = AppHelper.TakeValueByKey(
                propagatedSymbols, fromNode.Id,
                () => new SortedSet <PropSymbol>(new PropSymbolComparer()));

            IEnumerable <PropSymbol> prevPairs = procSymPrev.Where(
                t => (t.Variable == toCompStep.kappaTape));

            IEnumerable <PropSymbol> prevMatchPairs =
                prevPairs.Where(t => t.Symbol == toCompStep.s);

            return(prevMatchPairs.Any());
        }
Beispiel #20
0
        private static void DFS(
            DAGNode u,
            SortedSet <long> processedNodes,
            GraphDirection direction,
            long level,
            Action <DAGNode, long> nodeAction,
            Action <DAGEdge, long> edgeAction)
        {
            if (processedNodes.Contains(u.Id))
            {
                return;
            }

            nodeAction(u, level);
            processedNodes.Add(u.Id);

            foreach (DAGEdge e in (direction == GraphDirection.Forward ? u.OutEdges : u.InEdges))
            {
                DFS((direction == GraphDirection.Forward ? e.ToNode : e.FromNode),
                    processedNodes, direction, level + 1, nodeAction, edgeAction);
                edgeAction(e, level);
            }
        }
        public void PropagateSymbol(
            DAGNode fromNode,
            DAGNode toNode,
            ComputationStep toCompStep)
        {
            SortedSet <PropSymbol> procSymPrev = AppHelper.TakeValueByKey(
                propagatedSymbols, fromNode.Id,
                () => new SortedSet <PropSymbol>(new PropSymbolComparer()));

            SortedSet <PropSymbol> nodeProcSym = AppHelper.TakeValueByKey(
                propagatedSymbols, toNode.Id,
                () => new SortedSet <PropSymbol>(new PropSymbolComparer()));

            foreach (PropSymbol p in procSymPrev.Where(
                         t => t.Variable != toCompStep.kappaTape))
            {
                nodeProcSym.Add(p);
            }

            nodeProcSym.Add(new PropSymbol(
                                toCompStep.kappaTape,
                                toCompStep.sNext));
        }
        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++;
                }
            }
        }
Beispiel #23
0
        private static bool FindPath_DFS(
            DAGNode u,
            DAGNode t,
            SortedSet <long> processedNodes,
            GraphDirection direction,
            long level,
            Predicate <DAGNode> nodeFilter,
            Predicate <DAGEdge> edgeFilter,
            Action <DAGNode, long> nodeAction,
            Action <DAGEdge, long> edgeAction,
            List <long> path)
        {
            if (!nodeFilter(u))
            {
                return(false);
            }

            if (processedNodes.Contains(u.Id))
            {
                return(false);
            }

            nodeAction(u, level);
            path.Add(u.Id);

            processedNodes.Add(u.Id);

            if (u.Id == t.Id)
            {
                return(true);
            }

            foreach (DAGEdge e in (direction == GraphDirection.Forward ? u.OutEdges : u.InEdges))
            {
                if (!edgeFilter(e))
                {
                    continue;
                }

                bool pathFound = FindPath_DFS(
                    (direction == GraphDirection.Forward ? e.ToNode : e.FromNode),
                    t,
                    processedNodes,
                    direction,
                    level + 1,
                    nodeFilter,
                    edgeFilter,
                    nodeAction,
                    edgeAction,
                    path);

                edgeAction(e, level);

                if (pathFound)
                {
                    return(true);
                }
            }

            path.RemoveAt(path.Count - 1);

            return(false);
        }