Advertisement
Guest User

Untitled

a guest
Aug 15th, 2017
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Eiffel 1.99 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Numerics;
  6. using System.Threading.Tasks;
  7.  
  8. namespace Ex7
  9. {
  10.     class LockFreePathCounter
  11.     {
  12.         //Count total paths from start to end of dag
  13.  
  14.         public static BigInteger count(IDAG dag)
  15.         {
  16.             TraversalNode[] traversalNodes = new TraversalNode[dag.NumNodes];
  17.  
  18.             for (var i = 0; i < dag.NumNodes; i += 1)
  19.                traversalNodes[i] = new TraversalNode(dag.GetNode(i));
  20.  
  21.             LockFreeQueue<int> queue = new LockFreeQueue<int>(); // Aenderung
  22.  
  23.             queue.Enqueue(dag.StartNode.Index);
  24.             traversalNodes[dag.StartNode.Index].numReachingPaths = 1;
  25.             while (traversalNodes[dag.EndNode.Index].numUnfinishedPredecessors != 0)
  26.             {
  27.                 int ni;
  28.                 if (queue.TryDequeue(out ni))
  29.                 {
  30.                     TraversalNode n = traversalNodes[ni];
  31.                     // Aenderung
  32.                     Parallel.ForEach(n.node.Successors, (s) =>
  33.                     {
  34.                         traversalNodes[s.Index].numReachingPaths += n.numReachingPaths;
  35.                         traversalNodes[s.Index].numUnfinishedPredecessors -= 1;
  36.  
  37.                         if (traversalNodes[s.Index].numUnfinishedPredecessors == 0)
  38.                         {
  39.                             queue.Enqueue(s.Index);
  40.                         }
  41.                     });
  42.                 }
  43.             }
  44.             return traversalNodes[dag.EndNode.Index].numReachingPaths;
  45.         }
  46.  
  47.         private struct TraversalNode
  48.         {
  49.             public TraversalNode(IDAGNode node)
  50.             {
  51.                 this.node = node;
  52.                 numUnfinishedPredecessors = node.NumPredecessors;
  53.                 numReachingPaths = 0;
  54.             }
  55.             public readonly IDAGNode node;
  56.             public int numUnfinishedPredecessors;
  57.             public BigInteger numReachingPaths;
  58.         }
  59.     }
  60. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement