Anders and Briegel in Python
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

140 lines
3.2KB

  1. var abj = {};
  2. abj.node = {};
  3. abj.adj = {};
  4. abj.add_node = function(node, meta) {
  5. abj.adj[node] = {};
  6. abj.node[node] = {};
  7. abj.node[node].vop = tables.clifford.hadamard;
  8. Object.assign(abj.node[node], meta);
  9. };
  10. abj.add_nodes = function(nodes) {
  11. nodes.forEach(add_node);
  12. };
  13. abj.del_node = function(node) {
  14. for (var i in abj.adj[node]) {
  15. abj.del_edge(node, i);
  16. }
  17. delete abj.node[node];
  18. };
  19. abj.add_edge = function(a, b) {
  20. abj.adj[a][b] = {};
  21. abj.adj[b][a] = {};
  22. };
  23. abj.add_edges = function(edges) {
  24. edges.forEach(function(e) {
  25. add_edge(e[0], e[1]);
  26. });
  27. };
  28. abj.del_edge = function(a, b) {
  29. delete abj.adj[a][b];
  30. delete abj.adj[b][a];
  31. };
  32. abj.has_edge = function(a, b) {
  33. return Object.prototype.hasOwnProperty.call(abj.adj[a], b);
  34. };
  35. abj.toggle_edge = function(a, b) {
  36. if (abj.has_edge(a, b)) {
  37. abj.del_edge(a, b);
  38. } else {
  39. abj.add_edge(a, b);
  40. }
  41. };
  42. abj.get_swap = function(node, avoid) {
  43. for (var i in abj.adj[node]) {
  44. if (i != avoid) {
  45. return i;
  46. }
  47. }
  48. return avoid;
  49. };
  50. abj.remove_vop = function(node, avoid) {
  51. var swap_qubit = get_swap(node, avoid);
  52. var decomposition = decompositions[abj.node[node].vop];
  53. for (var i = decomposition.length - 1; i >= 0; --i) {
  54. var v = decomposition[i];
  55. local_complementation(v == "x" ? a : swap_qubit);
  56. }
  57. };
  58. abj.local_complementation = function(node) {
  59. var keys = Object.keys(abj.adj[node]);
  60. for (var i = 0; i < keys.length; ++i) {
  61. for (var j = i + 1; j < keys.length; ++j) {
  62. abj.toggle_edge(keys[i], keys[j]);
  63. }
  64. abj.node[i].vop = tables.times_table[abj.node[keys[i]].vop][6];
  65. }
  66. abj.node[node].vop = tables.times_table[abj.node[node].vop][14];
  67. };
  68. abj.act_local_rotation = function(node, operation) {
  69. var rotation = tables.clifford[operation];
  70. abj.node[node].vop = tables.times_table[rotation][abj.node[node].vop];
  71. };
  72. abj.act_hadamard = function(node) {
  73. abj.act_local_rotation(node, 10);
  74. };
  75. abj.is_sole_member = function(node, group) {
  76. return group.length == 1 && group[0] == node;
  77. };
  78. abj.act_cz = function(a, b) {
  79. if (abj.is_sole_member(abj.adj[a], b)) {
  80. remove_vop(a, b);
  81. }
  82. if (abj.is_sole_member(abj.adj[b], a)) {
  83. remove_vop(b, a);
  84. }
  85. if (abj.is_sole_member(abj.adj[a], b)) {
  86. remove_vop(a, b);
  87. }
  88. var edge = abj.has_edge(a, b);
  89. var new_state = tables.cz_table[edge ? 1 : 0][abj.node[a].vop][abj.node[b].vop];
  90. abj.node[a].vop = new_state[1];
  91. abj.node[b].vop = new_state[2];
  92. if (new_state[0] != edge) {
  93. abj.toggle_edge(a, b);
  94. }
  95. };
  96. abj.edgelist = function() {
  97. var seen = {};
  98. var output = [];
  99. for (var i in abj.adj) {
  100. for (var j in abj.adj[i]) {
  101. if (!Object.prototype.hasOwnProperty.call(seen, j)) {
  102. output.push([i, j]);
  103. }
  104. }
  105. seen[i] = true;
  106. }
  107. return output;
  108. };
  109. abj.log_graph_state = function() {
  110. console.log(JSON.stringify(abj.node));
  111. console.log(JSON.stringify(abj.adj));
  112. };
  113. abj.update = function(newState) {
  114. abj.node = newState.node;
  115. abj.adj = newState.adj;
  116. };
  117. abj.order = function(){
  118. return Object.keys(abj.node).length;
  119. };