GCC Code Coverage Report


Directory: ./
File: Circuit/CircuitJson.cpp
Date: 2022-10-15 05:10:18
Warnings: 5 unchecked decisions!
Exec Total Coverage
Lines: 45 46 97.8%
Functions: 2 2 100.0%
Branches: 92 168 54.8%
Decisions: 10 22 45.5%

Line Branch Decision Exec Source
1 // Copyright 2019-2022 Cambridge Quantum Computing
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 #include "Circuit.hpp"
16 #include "Utils/Json.hpp"
17
18 namespace tket {
19
20 39 void to_json(nlohmann::json& j, const Circuit& circ) {
21
1/2
✓ Branch 1 taken 39 times.
✗ Branch 2 not taken.
39 const auto name = circ.get_name();
22
2/2
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 33 times.
2/2
✓ Decision 'true' taken 6 times.
✓ Decision 'false' taken 33 times.
39 if (name) {
23
3/6
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
6 j["name"] = name.value();
24 }
25
3/6
✓ Branch 1 taken 39 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 39 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 39 times.
✗ Branch 8 not taken.
39 j["phase"] = circ.get_phase();
26
3/6
✓ Branch 1 taken 39 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 39 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 39 times.
✗ Branch 8 not taken.
39 j["qubits"] = circ.all_qubits();
27
3/6
✓ Branch 1 taken 39 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 39 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 39 times.
✗ Branch 8 not taken.
39 j["bits"] = circ.all_bits();
28
1/2
✓ Branch 1 taken 39 times.
✗ Branch 2 not taken.
39 const auto impl = circ.implicit_qubit_permutation();
29 // empty maps are mapped to null instead of empty array
30
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 39 times.
1/2
✗ Decision 'true' not taken.
✓ Decision 'false' taken 39 times.
39 if (impl.empty()) {
31 j["implicit_permutation"] = nlohmann::json::array();
32 } else {
33
2/4
✓ Branch 1 taken 39 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 39 times.
✗ Branch 5 not taken.
39 j["implicit_permutation"] = impl;
34 }
35
2/4
✓ Branch 1 taken 39 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 39 times.
✗ Branch 5 not taken.
39 j["commands"] = nlohmann::json::array();
36
6/10
✓ Branch 1 taken 39 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 39 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 71 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 71 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 71 times.
✓ Branch 14 taken 39 times.
0/1
? Decision couldn't be analyzed.
110 for (const Command& com : circ) {
37
3/6
✓ Branch 1 taken 71 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 71 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 71 times.
✗ Branch 8 not taken.
71 j["commands"].push_back(com);
38 110 }
39
3/6
✓ Branch 1 taken 39 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 39 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 39 times.
✗ Branch 8 not taken.
39 j["created_qubits"] = circ.created_qubits();
40
3/6
✓ Branch 1 taken 39 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 39 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 39 times.
✗ Branch 8 not taken.
39 j["discarded_qubits"] = circ.discarded_qubits();
41 39 }
42
43 23 void from_json(const nlohmann::json& j, Circuit& circ) {
44
2/4
✓ Branch 1 taken 23 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 23 times.
✗ Branch 5 not taken.
23 circ = Circuit();
45
46
3/4
✓ Branch 1 taken 23 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 17 times.
2/2
✓ Decision 'true' taken 6 times.
✓ Decision 'false' taken 17 times.
23 if (j.contains("name")) {
47
3/6
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
6 circ.set_name(j["name"].get<std::string>());
48 }
49
3/6
✓ Branch 1 taken 23 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 23 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 23 times.
✗ Branch 8 not taken.
23 circ.add_phase(j.at("phase").get<Expr>());
50
2/4
✓ Branch 1 taken 23 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 23 times.
✗ Branch 5 not taken.
23 const auto& qubits = j.at("qubits").get<qubit_vector_t>();
51
2/2
✓ Branch 5 taken 71 times.
✓ Branch 6 taken 23 times.
2/2
✓ Decision 'true' taken 71 times.
✓ Decision 'false' taken 23 times.
94 for (const auto& qb : qubits) {
52
1/2
✓ Branch 1 taken 71 times.
✗ Branch 2 not taken.
71 circ.add_qubit(qb);
53 }
54
2/4
✓ Branch 1 taken 23 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 23 times.
✗ Branch 5 not taken.
23 const auto& bits = j.at("bits").get<bit_vector_t>();
55
2/2
✓ Branch 5 taken 19 times.
✓ Branch 6 taken 23 times.
2/2
✓ Decision 'true' taken 19 times.
✓ Decision 'false' taken 23 times.
42 for (const auto& b : bits) {
56
1/2
✓ Branch 1 taken 19 times.
✗ Branch 2 not taken.
19 circ.add_bit(b);
57 }
58
59
6/10
✓ Branch 1 taken 23 times.
✗ Branch 2 not taken.
✓ Branch 6 taken 1851 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1851 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1874 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1851 times.
✓ Branch 15 taken 23 times.
0/1
? Decision couldn't be analyzed.
1874 for (const auto& j_com : j.at("commands")) {
60
1/2
✓ Branch 1 taken 1851 times.
✗ Branch 2 not taken.
1851 const auto& com = j_com.get<Command>();
61
3/6
✓ Branch 1 taken 1851 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1851 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 1851 times.
✗ Branch 9 not taken.
1851 circ.add_op(com.get_op_ptr(), com.get_args(), com.get_opgroup());
62 1851 }
63
2/4
✓ Branch 1 taken 23 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 23 times.
✗ Branch 5 not taken.
23 const auto& imp_perm = j.at("implicit_permutation").get<qubit_map_t>();
64
1/2
✓ Branch 1 taken 23 times.
✗ Branch 2 not taken.
23 circ.permute_boundary_output(imp_perm);
65 // Check if key exists to work with circuits serialised using older tket
66 // versions
67
3/4
✓ Branch 1 taken 23 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 22 times.
✓ Branch 4 taken 1 times.
0/1
? Decision couldn't be analyzed.
23 if (j.contains("created_qubits")) {
68
6/10
✓ Branch 1 taken 22 times.
✗ Branch 2 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 24 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 2 times.
✓ Branch 15 taken 22 times.
0/1
? Decision couldn't be analyzed.
24 for (const auto& j_q : j.at("created_qubits")) {
69
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 const auto& q = j_q.get<Qubit>();
70
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 circ.qubit_create(q);
71 2 }
72 }
73
3/4
✓ Branch 1 taken 23 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 22 times.
✓ Branch 4 taken 1 times.
1/2
✓ Decision 'true' taken 23 times.
✗ Decision 'false' not taken.
23 if (j.contains("discarded_qubits")) {
74
6/10
✓ Branch 1 taken 22 times.
✗ Branch 2 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 23 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✓ Branch 15 taken 22 times.
0/1
? Decision couldn't be analyzed.
23 for (const auto& j_q : j.at("discarded_qubits")) {
75
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 const auto& q = j_q.get<Qubit>();
76
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 circ.qubit_discard(q);
77 1 }
78 }
79 23 }
80
81 } // namespace tket
82