Skip to content

Commit

Permalink
add is_cluster_neutral
Browse files Browse the repository at this point in the history
  • Loading branch information
quantumjim committed Feb 15, 2024
1 parent 1190241 commit 2480c88
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 5 deletions.
1 change: 1 addition & 0 deletions src/qiskit_qec/circuits/bindings/circuits_bindings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,5 @@ PYBIND11_MODULE(_c_circuits, module)
{
module.doc() = "qiskit-qec code circuit extensions";
module.def("_c_check_nodes", &check_nodes, "check_nodes in C++");
module.def("_c_is_cluster_neutral", &is_cluster_neutral, "is_cluster_neutral in C++");
}
14 changes: 14 additions & 0 deletions src/qiskit_qec/circuits/intern/arctools.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,19 @@
#include "arctools.h"

bool is_cluster_neutral(
std::vector<std::tuple<int, int, int, bool>> nodes, bool ignore_extra_logicals, bool minimal,
std::map<std::tuple<int, int>, std::set<int>> cycle_dict, std::vector<std::tuple<int, int>> link_graph, std::map<int, std::vector<int>> link_neighbors, std::vector<int> z_logicals,
bool linear
) {
if (linear) {
return nodes.size()%2==0;
} else {
std::vector<int> output = check_nodes(nodes, ignore_extra_logicals, minimal, cycle_dict, link_graph, link_neighbors, z_logicals);
return (output[0]==1) and (output.size()==0);
}

};

std::vector<int> check_nodes(
std::vector<std::tuple<int, int, int, bool>> nodes, bool ignore_extra_logicals, bool minimal,
std::map<std::tuple<int, int>, std::set<int>> cycle_dict, std::vector<std::tuple<int, int>> link_graph, std::map<int, std::vector<int>> link_neighbors, std::vector<int> z_logicals
Expand Down
23 changes: 18 additions & 5 deletions src/qiskit_qec/circuits/repetition_code.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
from qiskit_qec.circuits.code_circuit import CodeCircuit
from qiskit_qec.utils import DecodingGraphEdge, DecodingGraphNode
from qiskit_qec.utils.decoding_graph_attributes import _nodes2cpp
from qiskit_qec.circuits._c_circuits import _c_check_nodes
from qiskit_qec.circuits._c_circuits import _c_check_nodes, _c_is_cluster_neutral


def _separate_string(string):
Expand Down Expand Up @@ -1367,11 +1367,24 @@ def is_cluster_neutral(self, atypical_nodes: dict, cpp=False):
atypical_nodes: dictionary in the form of the return value of string2nodes
cpp (bool): Whether to use C++ implementation.
"""
if self._linear:
return not bool(len(atypical_nodes) % 2)
if cpp:
nodes = _nodes2cpp(nodes)
return _c_is_cluster_neutral(
nodes,
False,
False,
self.cycle_dict,
self._cpp_link_graph,
self._cpp_link_neighbors,
self.z_logicals,
self._linear,
)
else:
neutral, logicals, _ = self.check_nodes(atypical_nodes, cpp=cpp)
return neutral and not logicals
if self._linear:
return not bool(len(atypical_nodes) % 2)
else:
neutral, logicals, _ = self.check_nodes(atypical_nodes)
return neutral and not logicals

def transpile(self, backend, echo=("X", "X"), echo_num=(2, 0)):
"""
Expand Down

0 comments on commit 2480c88

Please sign in to comment.