GCC Code Coverage Report


Directory: ./
File: Placement/MonomorphismCalculation.cpp
Date: 2022-10-15 05:10:18
Warnings: 1 unchecked decisions!
Exec Total Coverage
Lines: 71 75 94.7%
Functions: 3 3 100.0%
Branches: 56 610 9.2%
Decisions: 11 14 78.6%

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 <tkwsm/EndToEndWrappers/MainSolver.hpp>
16
17 #include "Placement/Placement.hpp"
18 #include "RelabelledGraphWSM.hpp"
19
20 namespace tket {
21
22 using namespace WeightedSubgraphMonomorphism;
23
24 using RelabelledPatternGraph =
25 RelabelledGraphWSM<Qubit, QubitGraph::UndirectedConnGraph>;
26 using RelabelledTargetGraph =
27 RelabelledGraphWSM<Node, Architecture::UndirectedConnGraph>;
28 using BimapValue = qubit_bimap_t::value_type;
29
30 // Where should isolated pattern vertices be assigned?
31 // They might NOT have been isolated originally; it may be
32 // that we deliberately erased some pattern edges.
33 // Thus, we still want them connected to useful target components,
34 // so assign to nonisolated target vertices first.
35 34860 static void assign_isolated_pattern_vertices(
36 qubit_bimap_t& map, const RelabelledPatternGraph& relabelled_pattern_graph,
37 const RelabelledTargetGraph& relabelled_target_graph) {
38
2/2
✓ Branch 2 taken 34835 times.
✓ Branch 3 taken 25 times.
2/2
✓ Decision 'true' taken 34835 times.
✓ Decision 'false' taken 25 times.
34860 if (relabelled_pattern_graph.get_relabelled_isolated_vertices().empty()) {
39 34835 return;
40 }
41 // The PV assigned so far must be exactly the nonisolated ones.
42
2/106
✓ Branch 1 taken 25 times.
✗ Branch 2 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 25 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 48 not taken.
✗ Branch 49 not taken.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✗ Branch 62 not taken.
✗ Branch 63 not taken.
✗ Branch 66 not taken.
✗ Branch 67 not taken.
✗ Branch 69 not taken.
✗ Branch 70 not taken.
✗ Branch 72 not taken.
✗ Branch 73 not taken.
✗ Branch 75 not taken.
✗ Branch 76 not taken.
✗ Branch 78 not taken.
✗ Branch 79 not taken.
✗ Branch 81 not taken.
✗ Branch 82 not taken.
✗ Branch 84 not taken.
✗ Branch 85 not taken.
✗ Branch 87 not taken.
✗ Branch 88 not taken.
✗ Branch 90 not taken.
✗ Branch 91 not taken.
✗ Branch 93 not taken.
✗ Branch 94 not taken.
✗ Branch 97 not taken.
✗ Branch 98 not taken.
✗ Branch 100 not taken.
✗ Branch 101 not taken.
✗ Branch 103 not taken.
✗ Branch 104 not taken.
✗ Branch 106 not taken.
✗ Branch 107 not taken.
✗ Branch 109 not taken.
✗ Branch 110 not taken.
✗ Branch 113 not taken.
✗ Branch 114 not taken.
✗ Branch 117 not taken.
✗ Branch 118 not taken.
✗ Branch 120 not taken.
✗ Branch 121 not taken.
✗ Branch 126 not taken.
✗ Branch 127 not taken.
✗ Branch 129 not taken.
✗ Branch 130 not taken.
✗ Branch 132 not taken.
✗ Branch 133 not taken.
✗ Branch 135 not taken.
✗ Branch 136 not taken.
✗ Branch 138 not taken.
✗ Branch 139 not taken.
✗ Branch 141 not taken.
✗ Branch 142 not taken.
✗ Branch 144 not taken.
✗ Branch 145 not taken.
✗ Branch 147 not taken.
✗ Branch 148 not taken.
✗ Branch 150 not taken.
✗ Branch 151 not taken.
✗ Branch 153 not taken.
✗ Branch 154 not taken.
✗ Branch 156 not taken.
✗ Branch 157 not taken.
✗ Branch 159 not taken.
✗ Branch 160 not taken.
✗ Branch 162 not taken.
✗ Branch 163 not taken.
✗ Branch 166 not taken.
✗ Branch 167 not taken.
✗ Branch 170 not taken.
✗ Branch 171 not taken.
✗ Branch 173 not taken.
✗ Branch 174 not taken.
25 TKET_ASSERT(
43 map.size() ==
44 relabelled_pattern_graph.get_relabelled_nonisolated_vertices().size());
45
46 // Also, all PV so far must have been assigned to nonisolated TV.
47
2/106
✓ Branch 1 taken 25 times.
✗ Branch 2 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 25 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 48 not taken.
✗ Branch 49 not taken.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✗ Branch 62 not taken.
✗ Branch 63 not taken.
✗ Branch 66 not taken.
✗ Branch 67 not taken.
✗ Branch 69 not taken.
✗ Branch 70 not taken.
✗ Branch 72 not taken.
✗ Branch 73 not taken.
✗ Branch 75 not taken.
✗ Branch 76 not taken.
✗ Branch 78 not taken.
✗ Branch 79 not taken.
✗ Branch 81 not taken.
✗ Branch 82 not taken.
✗ Branch 84 not taken.
✗ Branch 85 not taken.
✗ Branch 87 not taken.
✗ Branch 88 not taken.
✗ Branch 90 not taken.
✗ Branch 91 not taken.
✗ Branch 93 not taken.
✗ Branch 94 not taken.
✗ Branch 97 not taken.
✗ Branch 98 not taken.
✗ Branch 100 not taken.
✗ Branch 101 not taken.
✗ Branch 103 not taken.
✗ Branch 104 not taken.
✗ Branch 106 not taken.
✗ Branch 107 not taken.
✗ Branch 109 not taken.
✗ Branch 110 not taken.
✗ Branch 113 not taken.
✗ Branch 114 not taken.
✗ Branch 117 not taken.
✗ Branch 118 not taken.
✗ Branch 120 not taken.
✗ Branch 121 not taken.
✗ Branch 126 not taken.
✗ Branch 127 not taken.
✗ Branch 129 not taken.
✗ Branch 130 not taken.
✗ Branch 132 not taken.
✗ Branch 133 not taken.
✗ Branch 135 not taken.
✗ Branch 136 not taken.
✗ Branch 138 not taken.
✗ Branch 139 not taken.
✗ Branch 141 not taken.
✗ Branch 142 not taken.
✗ Branch 144 not taken.
✗ Branch 145 not taken.
✗ Branch 147 not taken.
✗ Branch 148 not taken.
✗ Branch 150 not taken.
✗ Branch 151 not taken.
✗ Branch 153 not taken.
✗ Branch 154 not taken.
✗ Branch 156 not taken.
✗ Branch 157 not taken.
✗ Branch 159 not taken.
✗ Branch 160 not taken.
✗ Branch 162 not taken.
✗ Branch 163 not taken.
✗ Branch 166 not taken.
✗ Branch 167 not taken.
✗ Branch 170 not taken.
✗ Branch 171 not taken.
✗ Branch 173 not taken.
✗ Branch 174 not taken.
25 TKET_ASSERT(
48 map.size() <=
49 relabelled_target_graph.get_relabelled_nonisolated_vertices().size());
50
51 25 std::set<VertexWSM> unused_target_vertices;
52 bool refilled_with_isolated_tv;
53
2/4
✓ Branch 1 taken 25 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 25 times.
✗ Branch 4 not taken.
2/2
✓ Decision 'true' taken 25 times.
✓ Decision 'false' taken 25 times.
50 if (map.size() <
54 25 relabelled_target_graph.get_relabelled_nonisolated_vertices().size()) {
55 25 refilled_with_isolated_tv = false;
56 unused_target_vertices =
57
1/2
✓ Branch 2 taken 25 times.
✗ Branch 3 not taken.
25 relabelled_target_graph.get_relabelled_nonisolated_vertices();
58
7/12
✓ Branch 1 taken 25 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 25 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 64 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 64 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 89 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 64 times.
✓ Branch 16 taken 25 times.
0/1
? Decision couldn't be analyzed.
89 for (const auto& entry : map.left) {
59 // We CANNOT have assigned a nonisolated pattern vertex
60 // to an isolated target vertex.
61 const VertexWSM new_pv =
62
1/2
✓ Branch 1 taken 64 times.
✗ Branch 2 not taken.
64 relabelled_pattern_graph.get_relabelled_vertex(entry.first);
63 const VertexWSM new_tv =
64
1/2
✓ Branch 1 taken 64 times.
✗ Branch 2 not taken.
64 relabelled_target_graph.get_relabelled_vertex(entry.second);
65
2/106
✓ Branch 2 taken 64 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 64 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✗ Branch 51 not taken.
✗ Branch 52 not taken.
✗ Branch 54 not taken.
✗ Branch 55 not taken.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
✗ Branch 65 not taken.
✗ Branch 66 not taken.
✗ Branch 68 not taken.
✗ Branch 69 not taken.
✗ Branch 71 not taken.
✗ Branch 72 not taken.
✗ Branch 74 not taken.
✗ Branch 75 not taken.
✗ Branch 77 not taken.
✗ Branch 78 not taken.
✗ Branch 80 not taken.
✗ Branch 81 not taken.
✗ Branch 83 not taken.
✗ Branch 84 not taken.
✗ Branch 86 not taken.
✗ Branch 87 not taken.
✗ Branch 89 not taken.
✗ Branch 90 not taken.
✗ Branch 92 not taken.
✗ Branch 93 not taken.
✗ Branch 96 not taken.
✗ Branch 97 not taken.
✗ Branch 99 not taken.
✗ Branch 100 not taken.
✗ Branch 102 not taken.
✗ Branch 103 not taken.
✗ Branch 105 not taken.
✗ Branch 106 not taken.
✗ Branch 108 not taken.
✗ Branch 109 not taken.
✗ Branch 112 not taken.
✗ Branch 113 not taken.
✗ Branch 116 not taken.
✗ Branch 117 not taken.
✗ Branch 119 not taken.
✗ Branch 120 not taken.
✗ Branch 125 not taken.
✗ Branch 126 not taken.
✗ Branch 128 not taken.
✗ Branch 129 not taken.
✗ Branch 131 not taken.
✗ Branch 132 not taken.
✗ Branch 134 not taken.
✗ Branch 135 not taken.
✗ Branch 137 not taken.
✗ Branch 138 not taken.
✗ Branch 140 not taken.
✗ Branch 141 not taken.
✗ Branch 143 not taken.
✗ Branch 144 not taken.
✗ Branch 146 not taken.
✗ Branch 147 not taken.
✗ Branch 149 not taken.
✗ Branch 150 not taken.
✗ Branch 152 not taken.
✗ Branch 153 not taken.
✗ Branch 155 not taken.
✗ Branch 156 not taken.
✗ Branch 158 not taken.
✗ Branch 159 not taken.
✗ Branch 161 not taken.
✗ Branch 162 not taken.
✗ Branch 165 not taken.
✗ Branch 166 not taken.
✗ Branch 169 not taken.
✗ Branch 170 not taken.
✗ Branch 172 not taken.
✗ Branch 173 not taken.
64 TKET_ASSERT(
66 relabelled_pattern_graph.get_relabelled_nonisolated_vertices().count(
67 new_pv) != 0);
68
2/106
✓ Branch 2 taken 64 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 64 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✗ Branch 51 not taken.
✗ Branch 52 not taken.
✗ Branch 54 not taken.
✗ Branch 55 not taken.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
✗ Branch 65 not taken.
✗ Branch 66 not taken.
✗ Branch 68 not taken.
✗ Branch 69 not taken.
✗ Branch 71 not taken.
✗ Branch 72 not taken.
✗ Branch 74 not taken.
✗ Branch 75 not taken.
✗ Branch 77 not taken.
✗ Branch 78 not taken.
✗ Branch 80 not taken.
✗ Branch 81 not taken.
✗ Branch 83 not taken.
✗ Branch 84 not taken.
✗ Branch 86 not taken.
✗ Branch 87 not taken.
✗ Branch 89 not taken.
✗ Branch 90 not taken.
✗ Branch 92 not taken.
✗ Branch 93 not taken.
✗ Branch 96 not taken.
✗ Branch 97 not taken.
✗ Branch 99 not taken.
✗ Branch 100 not taken.
✗ Branch 102 not taken.
✗ Branch 103 not taken.
✗ Branch 105 not taken.
✗ Branch 106 not taken.
✗ Branch 108 not taken.
✗ Branch 109 not taken.
✗ Branch 112 not taken.
✗ Branch 113 not taken.
✗ Branch 116 not taken.
✗ Branch 117 not taken.
✗ Branch 119 not taken.
✗ Branch 120 not taken.
✗ Branch 125 not taken.
✗ Branch 126 not taken.
✗ Branch 128 not taken.
✗ Branch 129 not taken.
✗ Branch 131 not taken.
✗ Branch 132 not taken.
✗ Branch 134 not taken.
✗ Branch 135 not taken.
✗ Branch 137 not taken.
✗ Branch 138 not taken.
✗ Branch 140 not taken.
✗ Branch 141 not taken.
✗ Branch 143 not taken.
✗ Branch 144 not taken.
✗ Branch 146 not taken.
✗ Branch 147 not taken.
✗ Branch 149 not taken.
✗ Branch 150 not taken.
✗ Branch 152 not taken.
✗ Branch 153 not taken.
✗ Branch 155 not taken.
✗ Branch 156 not taken.
✗ Branch 158 not taken.
✗ Branch 159 not taken.
✗ Branch 161 not taken.
✗ Branch 162 not taken.
✗ Branch 165 not taken.
✗ Branch 166 not taken.
✗ Branch 169 not taken.
✗ Branch 170 not taken.
✗ Branch 172 not taken.
✗ Branch 173 not taken.
64 TKET_ASSERT(
69 relabelled_target_graph.get_relabelled_nonisolated_vertices().count(
70 new_tv) != 0);
71 TKET_ASSERT(unused_target_vertices.erase(new_tv) == 1);
72 }
73 } else {
74 refilled_with_isolated_tv = true;
75 unused_target_vertices =
76 relabelled_target_graph.get_relabelled_isolated_vertices();
77 }
78 25 for (VertexWSM isolated_pv :
79
2/2
✓ Branch 5 taken 36 times.
✓ Branch 6 taken 25 times.
86 relabelled_pattern_graph.get_relabelled_isolated_vertices()) {
80
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 36 times.
1/2
✗ Decision 'true' not taken.
✓ Decision 'false' taken 36 times.
36 if (unused_target_vertices.empty()) {
81 // We cannot run out of vertices.
82 TKET_ASSERT(!refilled_with_isolated_tv);
83 refilled_with_isolated_tv = true;
84 unused_target_vertices =
85 relabelled_target_graph.get_relabelled_isolated_vertices();
86 TKET_ASSERT(!unused_target_vertices.empty());
87 }
88 36 const VertexWSM next_tv = *unused_target_vertices.cbegin();
89
1/2
✓ Branch 1 taken 36 times.
✗ Branch 2 not taken.
36 unused_target_vertices.erase(next_tv);
90
91
1/2
✓ Branch 1 taken 36 times.
✗ Branch 2 not taken.
36 map.insert(BimapValue(
92
2/4
✓ Branch 1 taken 36 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 36 times.
✗ Branch 5 not taken.
36 relabelled_pattern_graph.get_original_vertices().at(isolated_pv),
93
1/2
✓ Branch 2 taken 36 times.
✗ Branch 3 not taken.
36 relabelled_target_graph.get_original_vertices().at(next_tv)));
94 }
95 25 }
96
97 119 static void write_solver_solutions(
98 std::vector<qubit_bimap_t>& all_maps,
99 const std::vector<SolutionWSM>& solutions,
100 const RelabelledPatternGraph& relabelled_pattern_graph,
101 const RelabelledTargetGraph& relabelled_target_graph) {
102 TKET_ASSERT(all_maps.empty());
103 119 all_maps.resize(solutions.size());
104 const WeightWSM expected_weight =
105 119 relabelled_pattern_graph.get_relabelled_edges_and_weights().size();
106
107
2/2
✓ Branch 1 taken 34858 times.
✓ Branch 2 taken 119 times.
2/2
✓ Decision 'true' taken 34858 times.
✓ Decision 'false' taken 119 times.
34977 for (unsigned ii = 0; ii < solutions.size(); ++ii) {
108 34858 const auto& solution = solutions[ii];
109 34858 auto& map = all_maps[ii];
110 TKET_ASSERT(solution.scalar_product == expected_weight);
111 TKET_ASSERT(solution.total_p_edges_weight == expected_weight);
112
2/2
✓ Branch 4 taken 227326 times.
✓ Branch 5 taken 34858 times.
2/2
✓ Decision 'true' taken 227326 times.
✓ Decision 'false' taken 34858 times.
262184 for (const auto& relabelled_pv_tv : solution.assignments) {
113
1/2
✓ Branch 1 taken 227326 times.
✗ Branch 2 not taken.
227326 map.insert(BimapValue(
114
1/2
✓ Branch 1 taken 227326 times.
✗ Branch 2 not taken.
227326 relabelled_pattern_graph.get_original_vertices().at(
115
1/2
✓ Branch 1 taken 227326 times.
✗ Branch 2 not taken.
227326 relabelled_pv_tv.first),
116 454652 relabelled_target_graph.get_original_vertices().at(
117
1/2
✓ Branch 1 taken 227326 times.
✗ Branch 2 not taken.
227326 relabelled_pv_tv.second)));
118 }
119 34858 assign_isolated_pattern_vertices(
120 map, relabelled_pattern_graph, relabelled_target_graph);
121
2/106
✓ Branch 1 taken 34858 times.
✗ Branch 2 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 34858 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 48 not taken.
✗ Branch 49 not taken.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✗ Branch 62 not taken.
✗ Branch 63 not taken.
✗ Branch 66 not taken.
✗ Branch 67 not taken.
✗ Branch 69 not taken.
✗ Branch 70 not taken.
✗ Branch 72 not taken.
✗ Branch 73 not taken.
✗ Branch 75 not taken.
✗ Branch 76 not taken.
✗ Branch 78 not taken.
✗ Branch 79 not taken.
✗ Branch 81 not taken.
✗ Branch 82 not taken.
✗ Branch 84 not taken.
✗ Branch 85 not taken.
✗ Branch 87 not taken.
✗ Branch 88 not taken.
✗ Branch 90 not taken.
✗ Branch 91 not taken.
✗ Branch 93 not taken.
✗ Branch 94 not taken.
✗ Branch 97 not taken.
✗ Branch 98 not taken.
✗ Branch 100 not taken.
✗ Branch 101 not taken.
✗ Branch 103 not taken.
✗ Branch 104 not taken.
✗ Branch 106 not taken.
✗ Branch 107 not taken.
✗ Branch 109 not taken.
✗ Branch 110 not taken.
✗ Branch 113 not taken.
✗ Branch 114 not taken.
✗ Branch 117 not taken.
✗ Branch 118 not taken.
✗ Branch 120 not taken.
✗ Branch 121 not taken.
✗ Branch 126 not taken.
✗ Branch 127 not taken.
✗ Branch 129 not taken.
✗ Branch 130 not taken.
✗ Branch 132 not taken.
✗ Branch 133 not taken.
✗ Branch 135 not taken.
✗ Branch 136 not taken.
✗ Branch 138 not taken.
✗ Branch 139 not taken.
✗ Branch 141 not taken.
✗ Branch 142 not taken.
✗ Branch 144 not taken.
✗ Branch 145 not taken.
✗ Branch 147 not taken.
✗ Branch 148 not taken.
✗ Branch 150 not taken.
✗ Branch 151 not taken.
✗ Branch 153 not taken.
✗ Branch 154 not taken.
✗ Branch 156 not taken.
✗ Branch 157 not taken.
✗ Branch 159 not taken.
✗ Branch 160 not taken.
✗ Branch 162 not taken.
✗ Branch 163 not taken.
✗ Branch 166 not taken.
✗ Branch 167 not taken.
✗ Branch 170 not taken.
✗ Branch 171 not taken.
✗ Branch 173 not taken.
✗ Branch 174 not taken.
34858 TKET_ASSERT(
122 map.size() == relabelled_pattern_graph.get_original_vertices().size());
123 }
124 119 }
125
126 /**
127 * \cond Somehow doxygen 1.9.1 complains about this. Tell it to be quiet.
128 */
129
130 128 std::vector<qubit_bimap_t> get_unweighted_subgraph_monomorphisms(
131 const QubitGraph::UndirectedConnGraph& pattern_graph,
132 const Architecture::UndirectedConnGraph& target_graph, unsigned max_matches,
133 unsigned timeout_ms) {
134 128 std::vector<qubit_bimap_t> all_maps;
135
136
1/2
✓ Branch 1 taken 128 times.
✗ Branch 2 not taken.
128 const RelabelledPatternGraph relabelled_pattern_graph(pattern_graph);
137
1/2
✓ Branch 1 taken 128 times.
✗ Branch 2 not taken.
128 const RelabelledTargetGraph relabelled_target_graph(target_graph);
138
139 128 if (relabelled_pattern_graph.get_relabelled_edges_and_weights().size() >
140
1/2
✓ Branch 2 taken 121 times.
✗ Branch 3 not taken.
249 relabelled_target_graph.get_relabelled_edges_and_weights().size() ||
141 121 relabelled_pattern_graph.get_relabelled_nonisolated_vertices().size() >
142 121 relabelled_target_graph.get_relabelled_nonisolated_vertices()
143
4/4
✓ Branch 0 taken 121 times.
✓ Branch 1 taken 7 times.
✓ Branch 3 taken 7 times.
✓ Branch 4 taken 121 times.
370 .size() ||
144
145 121 relabelled_pattern_graph.get_relabelled_isolated_vertices().size() +
146 121 relabelled_pattern_graph.get_relabelled_nonisolated_vertices()
147 121 .size() >
148
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 121 times.
242 relabelled_target_graph.get_relabelled_isolated_vertices().size() +
149 121 relabelled_target_graph.get_relabelled_nonisolated_vertices()
150 121 .size()) {
151 // The problem is trivially insoluble.
152 7 return all_maps;
153 }
154
155
2/2
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 119 times.
2/2
✓ Decision 'true' taken 2 times.
✓ Decision 'false' taken 119 times.
121 if (relabelled_pattern_graph.get_relabelled_nonisolated_vertices().empty()) {
156 // Trivial special case: all pattern vertices are isolated!
157
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 all_maps.resize(1);
158
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 assign_isolated_pattern_vertices(
159 2 all_maps[0], relabelled_pattern_graph, relabelled_target_graph);
160 2 return all_maps;
161 }
162
163
1/2
✓ Branch 1 taken 119 times.
✗ Branch 2 not taken.
119 MainSolverParameters solver_parameters;
164 119 solver_parameters.terminate_with_first_full_solution = false;
165 119 solver_parameters.for_multiple_full_solutions_the_max_number_to_obtain =
166 119 max_matches;
167 119 solver_parameters.timeout_ms = timeout_ms;
168
169 const MainSolver main_solver(
170 relabelled_pattern_graph.get_relabelled_edges_and_weights(),
171 relabelled_target_graph.get_relabelled_edges_and_weights(),
172
1/2
✓ Branch 3 taken 119 times.
✗ Branch 4 not taken.
119 solver_parameters);
173
174
1/2
✓ Branch 1 taken 119 times.
✗ Branch 2 not taken.
119 const auto& solution_data = main_solver.get_solution_data();
175
176 119 write_solver_solutions(
177
1/2
✓ Branch 1 taken 119 times.
✗ Branch 2 not taken.
119 all_maps, solution_data.solutions, relabelled_pattern_graph,
178 relabelled_target_graph);
179
180 119 return all_maps;
181 128 }
182
183 /**
184 * \endcond
185 */
186
187 } // namespace tket
188