Advertisement
Guest User

Untitled

a guest
Mar 25th, 2019
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.10 KB | None | 0 0
  1. import std.stdio;
  2.  
  3. class Graph
  4. {
  5. size_t capacity;
  6. size_t nodesCount;
  7. Node nodes;
  8.  
  9. Node add_node()
  10. {
  11. auto node = new Node(nodesCount);
  12. if (nodes is null)
  13. {
  14. nodes = node;
  15. }
  16. else
  17. {
  18. auto crnt = nodes;
  19. while (crnt.next !is null)
  20. {
  21. crnt = nodes.next;
  22. }
  23. crnt.next = node;
  24. }
  25. nodesCount++;
  26. return node;
  27. }
  28.  
  29. void add_edge(size_t from, size_t to, size_t shift, double weight)
  30. {
  31. Node nodeFrom;
  32. Node nodeTo;
  33. auto crnt = nodes;
  34. size_t done = 0;
  35. while (crnt !is null)
  36. {
  37. if (done == from)
  38. {
  39. nodeFrom = crnt;
  40. }
  41. if (done == to)
  42. {
  43. nodeTo = crnt;
  44. }
  45. crnt = crnt.next;
  46. done++;
  47. }
  48. auto edge = new Edge(shift, weight, nodeTo);
  49. if (nodeFrom.edges is null)
  50. {
  51. nodeFrom.edges = edge;
  52. }
  53. else
  54. {
  55. auto crntEdge = nodeFrom.edges;
  56. while (crntEdge.next !is null)
  57. {
  58. crntEdge = crntEdge.next;
  59. }
  60. crntEdge.next = edge;
  61. }
  62. }
  63.  
  64. void eval(size_t i)
  65. {
  66. auto node = nodes;
  67. while (node !is null)
  68. {
  69. auto val = (i % 2 == 0) ? node.value0 : node.value1;
  70. auto edge = node.edges;
  71. while (edge !is null)
  72. {
  73. if (i % 2 == 0 && edge.shift == 0)
  74. {
  75. edge.to.value0 += val * edge.weight;
  76. }
  77. else if (i % 2 == 0 && edge.shift == 1)
  78. {
  79. edge.to.value1 += val * edge.weight;
  80. }
  81. else if (i % 2 == 1 && edge.shift == 0)
  82. {
  83. edge.to.value1 += val * edge.weight;
  84. }
  85. else if (i % 2 == 1 && edge.shift == 1)
  86. {
  87. edge.to.value0 += val * edge.weight;
  88. }
  89. edge = edge.next;
  90. }
  91. node.res = val;
  92. if (i % 2 == 0)
  93. {
  94. node.value0 = 0;
  95. }
  96. else
  97. {
  98. node.value1 = 0;
  99. }
  100. node = node.next;
  101. }
  102. }
  103. }
  104.  
  105. class Node
  106. {
  107. size_t id;
  108. Node next;
  109. double value0;
  110. double value1;
  111. double res;
  112. Edge edges;
  113.  
  114. this(size_t id)
  115. {
  116. this.id = id;
  117. this.res = 0;
  118. this.value0 = 0;
  119. this.value1 = 0;
  120. }
  121. }
  122.  
  123. class Edge
  124. {
  125. Edge next;
  126. Node to;
  127. size_t shift;
  128. double weight;
  129.  
  130. this(size_t shift, double weight, Node to)
  131. {
  132. this.shift = shift;
  133. this.weight = weight;
  134. this.to = to;
  135. }
  136. }
  137.  
  138. void main()
  139. {
  140. auto g = new Graph();
  141. auto n1 = g.add_node();
  142. auto n2 = g.add_node();
  143.  
  144. g.add_edge(0, 1, 0, 0.5);
  145. g.add_edge(1, 1, 1, 0.5);
  146.  
  147. foreach(i; 0..3) {
  148. n1.value0 = 1.0;
  149. n1.value1 = 1.0;
  150. g.eval(i%2);
  151. }
  152. writeln(n2.res);
  153. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement