Exemple #1
0
    def test_compare_internal_edge(self, simulator, config) -> None:
        # Given
        first_vertex = QuantumRegister(2, 'first')
        second_vertex = QuantumRegister(2, 'second')
        target = QuantumRegister(1, 'target')
        first_vertex_measure = ClassicalRegister(2, 'first-vertex-measure')
        second_vertex_measure = ClassicalRegister(2, 'second-vertex-measure')
        target_measure = ClassicalRegister(1, 'target-measure')
        qc = QuantumCircuit(first_vertex,
                            second_vertex,
                            target,
                            first_vertex_measure,
                            second_vertex_measure,
                            target_measure,
                            name="test-circuit")

        # Mix states and measure to obtain random test cases
        qc.h(first_vertex)
        qc.h(second_vertex)
        qc.measure(first_vertex, first_vertex_measure)
        qc.measure(second_vertex, second_vertex_measure)
        # Compare edges
        _compare_internal_edge(qc, first_vertex, second_vertex, target[0])
        # Measure result
        qc.measure(target, target_measure)

        # When
        job: BaseJob = execute(qc, simulator, shots=config['test_runs'])
        # Calculate relative results
        result: Dict[str, float] = {
            key: value / config['test_runs']
            for key, value in job.result().get_counts(qc).items()
        }

        # Then
        # Expected Results are strings 'first second target'
        expected_results: Dict[str, float] = {
            '0 00 00': 0.0625,
            '0 01 01': 0.0625,
            '0 10 10': 0.0625,
            '0 11 11': 0.0625,
            '1 00 01': 0.0625,
            '1 00 10': 0.0625,
            '1 00 11': 0.0625,
            '1 01 00': 0.0625,
            '1 01 10': 0.0625,
            '1 01 11': 0.0625,
            '1 10 00': 0.0625,
            '1 10 01': 0.0625,
            '1 10 11': 0.0625,
            '1 11 00': 0.0625,
            '1 11 01': 0.0625,
            '1 11 10': 0.0625
        }
        assert result == approx(expected_results, abs=config['absolute_error'])
        assert calc_total_costs(qc) - 4 == 129
    def test_and_4(self, simulator: BaseBackend, config: Dict[str,
                                                              Any]) -> None:
        # Given
        input = QuantumRegister(4, 'input')
        ancillas = QuantumRegister(2, 'ancilla')
        output = QuantumRegister(1, 'output')
        input_measure = ClassicalRegister(4, 'input-measure')
        output_measure = ClassicalRegister(1, 'output-measure')
        qc = QuantumCircuit(input,
                            output,
                            ancillas,
                            input_measure,
                            output_measure,
                            name="test-circuit")

        # Mix states to get randomized test cases and record them
        qc.h(input)
        qc.measure(input, input_measure)
        # Add circuit to test
        add_and_4(qc, list(input), list(ancillas), output[0])
        # Measure results
        qc.measure(output, output_measure)

        # When
        job: BaseJob = execute(qc, simulator, shots=config['test_runs'])
        # Calculate relative results
        result: Dict[str, float] = {
            key: value / config['test_runs']
            for key, value in job.result().get_counts(qc).items()
        }

        # Expected Results are strings 'output input'
        expected_results: Dict[str, float] = {
            '0 0000': 0.0625,
            '0 0001': 0.0625,
            '0 0010': 0.0625,
            '0 0011': 0.0625,
            '0 0100': 0.0625,
            '0 0101': 0.0525,
            '0 0110': 0.0625,
            '0 0111': 0.0625,
            '0 1000': 0.0625,
            '0 1001': 0.0625,
            '0 1010': 0.0625,
            '0 1011': 0.0625,
            '0 1100': 0.0625,
            '0 1101': 0.0625,
            '0 1110': 0.0625,
            '1 1111': 0.0625
        }
        assert result == approx(expected_results, abs=config['absolute_error'])
        assert calc_total_costs(qc) - 4 == 213
    def test_cost_grover_without_ancilla(self):
        #Given
        qreg = QuantumRegister(2, "qreg")
        creg = ClassicalRegister(2, "creg")
        qc = QuantumCircuit(qreg, creg, name="grover-without-ancilla-circuit")

        # Add one Grover step
        add_grover_without_ancilla_1_0(qc, qreg)
        # Measure
        qc.measure(qreg[0], creg[0])
        qc.measure(qreg[1], creg[1])

        # When
        result = calc_total_costs(qc)

        # Then
        assert result == 36
    def test_cost_grover_with_ancilla(self):
        #Given
        qreg = QuantumRegister(2, "input")
        ancilla = QuantumRegister(1, "ancilla")
        measure = ClassicalRegister(2, "measure")
        measure_ancilla = ClassicalRegister(1, "ancilla-measure")
        qc = QuantumCircuit(qreg,
                            ancilla,
                            measure,
                            measure_ancilla,
                            name="grover-without-ancilla-circuit")

        # Add one Grover step
        add_grover_with_ancilla_1_0(qc, qreg, ancilla[0])
        # Measure
        qc.measure(qreg[0], measure[0])
        qc.measure(qreg[1], measure[1])

        # When
        result = calc_total_costs(qc)

        # Then
        assert result == 95
Exemple #5
0
    def test_max_cut_on_default_example(self, simulator, config) -> None:
        # Given
        vertices = QuantumRegister(4, 'vertices')
        edges = QuantumRegister(3, 'edges')
        summation = QuantumRegister(2, 'summation')
        ancilla = QuantumRegister(1, 'ancilla')
        vertices_measure = ClassicalRegister(4, 'vertices-measure')
        ancilla_measure = ClassicalRegister(1, 'ancilla-measure')
        qc = QuantumCircuit(vertices,
                            edges,
                            summation,
                            ancilla,
                            vertices_measure,
                            ancilla_measure,
                            name="max-cut-circuit")

        # Add MAX CUT circuit
        add_max_cut_circuit(qc, vertices, edges, summation, ancilla[0])
        # Measure results
        qc.measure(ancilla, ancilla_measure)
        qc.measure(vertices, vertices_measure)

        # When
        job: BaseJob = execute(qc, simulator, shots=config['test_runs'])
        # Calculate relative results
        result: Dict[str, float] = {
            key: value / config['test_runs']
            for key, value in job.result().get_counts(qc).items()
        }

        # Then
        # Expected Results are strings 'ancilla vertices'
        # TODO How to deal with ancilla qubits in a systematic way?
        expected_results: Dict[str, float] = {
            '0 0000': 0,
            '0 0001': 0.25,
            '0 0010': 0,
            '0 0011': 0,
            '0 0100': 0,
            '0 0101': 0,
            '0 0110': 0,
            '0 0111': 0,
            '0 1000': 0,
            '0 1001': 0,
            '0 1010': 0,
            '0 1011': 0,
            '0 1100': 0,
            '0 1101': 0,
            '0 1110': 0.25,
            '0 1111': 0,
            '1 0000': 0,
            '1 0001': 0.25,
            '1 0010': 0,
            '1 0011': 0,
            '1 0100': 0,
            '1 0101': 0,
            '1 0110': 0,
            '1 0111': 0,
            '1 1000': 0,
            '1 1010': 0,
            '1 1001': 0,
            '1 1011': 0,
            '1 1100': 0,
            '1 1101': 0,
            '1 1110': 0.25,
            '1 1111': 0
        }
        assert result == approx(expected_results, abs=config['absolute_error'])
        assert calc_total_costs(qc) == 1538
Exemple #6
0
    def test_compare_2_external_edges(self, simulator, config) -> None:
        # Given
        edges: List[Tuple[QuantumRegister, VertexColor]] = [
            (QuantumRegister(2, "v1"), VertexColor.YELLOW),  # 10
            (QuantumRegister(2, "v2"), VertexColor.GREEN)  # 11
        ]
        ancilla = QuantumRegister(2, 'ancilla')
        target = QuantumRegister(1, 'target')
        target_measure = ClassicalRegister(1, 'target-measure')
        input_measure: List[ClassicalRegister] = [
            ClassicalRegister(2, 'v1-measure'),
            ClassicalRegister(2, 'v2-measure')
        ]
        qc = QuantumCircuit(target,
                            ancilla,
                            target_measure,
                            name="test-circuit")
        for v1, v2 in edges[0:2]:
            qc.add_register(v1)
        for c in input_measure:
            qc.add_register(c)

        # Mix the two states and measure to obtain random test cases
        for (v1, v2), c in zip(edges[0:2], input_measure):
            qc.h(v1)
            qc.measure(v1, c)
        # Compare edges
        _compare_2_external_edges(qc, edges, list(ancilla), target[0])
        # Measure result
        qc.measure(target, target_measure)

        # When
        job: BaseJob = execute(qc, simulator, shots=config['test_runs'])
        # Calculate relative results
        result: Dict[str, float] = {
            key: value / config['test_runs']
            for key, value in job.result().get_counts(qc).items()
        }

        # Then
        # Expected Results are strings 'v2 v1 target'
        # To interpret the expected results, notice that
        # v2 is next to a 11 vertex
        # v1 is next to a 10 vertex
        expected_results: Dict[str, float] = {
            '00 00 1': 0.0625,
            '00 01 1': 0.0625,
            '00 10 0': 0.0625,
            '00 11 1': 0.0625,
            '01 00 1': 0.0625,
            '01 01 1': 0.0625,
            '01 10 0': 0.0625,
            '01 11 1': 0.0625,
            '10 00 1': 0.0625,
            '10 01 1': 0.0625,
            '10 10 0': 0.0625,
            '10 11 1': 0.0625,
            '11 00 0': 0.0625,
            '11 01 0': 0.0625,
            '11 10 0': 0.0625,
            '11 11 0': 0.0625
        }
        assert result == approx(expected_results, abs=config['absolute_error'])
        assert calc_total_costs(qc) - 4 == 353
Exemple #7
0
    def test_compare_2_internal_edges(self, simulator, config) -> None:
        # Given
        edges = [(QuantumRegister(2,
                                  f"v_{i}0"), (QuantumRegister(2, f"v_{i}1")))
                 for i in range(0, 2)]
        ancilla = QuantumRegister(2, 'ancilla')
        target = QuantumRegister(1, 'target')
        edges_measure = [(ClassicalRegister(2, f"v_{i}0-measure"),
                          ClassicalRegister(2, f"v_{i}1-measure"))
                         for i in range(0, 2)]
        target_measure = ClassicalRegister(1, 'target-measure')
        qc = QuantumCircuit(target,
                            ancilla,
                            target_measure,
                            name="test-circuit")
        for v1, v2 in edges:
            qc.add_register(v1, v2)
        for v1m, v2m in edges_measure:
            qc.add_register(v1m, v2m)

        # Mix states and measure to obtain random test cases
        for v in list(sum(edges, ())):
            qc.h(v)
        for (v1, v2), (c1, c2) in zip(edges, edges_measure):
            qc.measure(v1, c1)
            qc.measure(v2, c2)
        # Compare edges
        _compare_2_internal_edges(qc, edges, list(ancilla), target[0])
        # Measure result
        qc.measure(target, target_measure)

        # When
        job: BaseJob = execute(qc, simulator, shots=config['test_runs'])
        # Calculate relative results
        result: Dict[str, float] = {
            key: value / config['test_runs']
            for key, value in job.result().get_counts(qc).items()
        }

        # Then
        # Expected Results are strings 'target second first'
        expected_results: Dict[str, float] = {
            '00 00 00 00 0': 0.0039,
            '00 00 00 01 0': 0.0039,
            '00 00 00 10 0': 0.0039,
            '00 00 00 11 0': 0.0039,
            '00 00 01 00 0': 0.0039,
            '00 00 01 01 0': 0.0039,
            '00 00 01 10 0': 0.0039,
            '00 00 01 11 0': 0.0039,
            '00 00 10 00 0': 0.0039,
            '00 00 10 01 0': 0.0039,
            '00 00 10 10 0': 0.0039,
            '00 00 10 11 0': 0.0039,
            '00 00 11 00 0': 0.0039,
            '00 00 11 01 0': 0.0039,
            '00 00 11 10 0': 0.0039,
            '00 00 11 11 0': 0.0039,
            '00 01 00 00 0': 0.0039,
            '00 01 00 01 1': 0.0039,
            '00 01 00 10 1': 0.0039,
            '00 01 00 11 1': 0.0039,
            '00 01 01 00 1': 0.0039,
            '00 01 01 01 0': 0.0039,
            '00 01 01 10 1': 0.0039,
            '00 01 01 11 1': 0.0039,
            '00 01 10 00 1': 0.0039,
            '00 01 10 01 1': 0.0039,
            '00 01 10 10 0': 0.0039,
            '00 01 10 11 1': 0.0039,
            '00 01 11 00 1': 0.0039,
            '00 01 11 01 1': 0.0039,
            '00 01 11 10 1': 0.0039,
            '00 01 11 11 0': 0.0039,
            '00 10 00 00 0': 0.0039,
            '00 10 00 01 1': 0.0039,
            '00 10 00 10 1': 0.0039,
            '00 10 00 11 1': 0.0039,
            '00 10 01 00 1': 0.0039,
            '00 10 01 01 0': 0.0039,
            '00 10 01 10 1': 0.0039,
            '00 10 01 11 1': 0.0039,
            '00 10 10 00 1': 0.0039,
            '00 10 10 01 1': 0.0039,
            '00 10 10 10 0': 0.0039,
            '00 10 10 11 1': 0.0039,
            '00 10 11 00 1': 0.0039,
            '00 10 11 01 1': 0.0039,
            '00 10 11 10 1': 0.0039,
            '00 10 11 11 0': 0.0039,
            '00 11 00 00 0': 0.0039,
            '00 11 00 01 1': 0.0039,
            '00 11 00 10 1': 0.0039,
            '00 11 00 11 1': 0.0039,
            '00 11 01 00 1': 0.0039,
            '00 11 01 01 0': 0.0039,
            '00 11 01 10 1': 0.0039,
            '00 11 01 11 1': 0.0039,
            '00 11 10 00 1': 0.0039,
            '00 11 10 01 1': 0.0039,
            '00 11 10 10 0': 0.0039,
            '00 11 10 11 1': 0.0039,
            '00 11 11 00 1': 0.0039,
            '00 11 11 01 1': 0.0039,
            '00 11 11 10 1': 0.0039,
            '00 11 11 11 0': 0.0039,
            '01 00 00 00 0': 0.0039,
            '01 00 00 01 1': 0.0039,
            '01 00 00 10 1': 0.0039,
            '01 00 00 11 1': 0.0039,
            '01 00 01 00 1': 0.0039,
            '01 00 01 01 0': 0.0039,
            '01 00 01 10 1': 0.0039,
            '01 00 01 11 1': 0.0039,
            '01 00 10 00 1': 0.0039,
            '01 00 10 01 1': 0.0039,
            '01 00 10 10 0': 0.0039,
            '01 00 10 11 1': 0.0039,
            '01 00 11 00 1': 0.0039,
            '01 00 11 01 1': 0.0039,
            '01 00 11 10 1': 0.0039,
            '01 00 11 11 0': 0.0039,
            '01 01 00 00 0': 0.0039,
            '01 01 00 01 0': 0.0039,
            '01 01 00 10 0': 0.0039,
            '01 01 00 11 0': 0.0039,
            '01 01 01 00 0': 0.0039,
            '01 01 01 01 0': 0.0039,
            '01 01 01 10 0': 0.0039,
            '01 01 01 11 0': 0.0039,
            '01 01 10 00 0': 0.0039,
            '01 01 10 01 0': 0.0039,
            '01 01 10 10 0': 0.0039,
            '01 01 10 11 0': 0.0039,
            '01 01 11 00 0': 0.0039,
            '01 01 11 01 0': 0.0039,
            '01 01 11 10 0': 0.0039,
            '01 01 11 11 0': 0.0039,
            '01 10 00 00 0': 0.0039,
            '01 10 00 01 1': 0.0039,
            '01 10 00 10 1': 0.0039,
            '01 10 00 11 1': 0.0039,
            '01 10 01 00 1': 0.0039,
            '01 10 01 01 0': 0.0039,
            '01 10 01 10 1': 0.0039,
            '01 10 01 11 1': 0.0039,
            '01 10 10 00 1': 0.0039,
            '01 10 10 01 1': 0.0039,
            '01 10 10 10 0': 0.0039,
            '01 10 10 11 1': 0.0039,
            '01 10 11 00 1': 0.0039,
            '01 10 11 01 1': 0.0039,
            '01 10 11 10 1': 0.0039,
            '01 10 11 11 0': 0.0039,
            '01 11 00 00 0': 0.0039,
            '01 11 00 01 1': 0.0039,
            '01 11 00 10 1': 0.0039,
            '01 11 00 11 1': 0.0039,
            '01 11 01 00 1': 0.0039,
            '01 11 01 01 0': 0.0039,
            '01 11 01 10 1': 0.0039,
            '01 11 01 11 1': 0.0039,
            '01 11 10 00 1': 0.0039,
            '01 11 10 01 1': 0.0039,
            '01 11 10 10 0': 0.0039,
            '01 11 10 11 1': 0.0039,
            '01 11 11 00 1': 0.0039,
            '01 11 11 01 1': 0.0039,
            '01 11 11 10 1': 0.0039,
            '01 11 11 11 0': 0.0039,
            '10 00 00 00 0': 0.0039,
            '10 00 00 01 1': 0.0039,
            '10 00 00 10 1': 0.0039,
            '10 00 00 11 1': 0.0039,
            '10 00 01 00 1': 0.0039,
            '10 00 01 01 0': 0.0039,
            '10 00 01 10 1': 0.0039,
            '10 00 01 11 1': 0.0039,
            '10 00 10 00 1': 0.0039,
            '10 00 10 01 1': 0.0039,
            '10 00 10 10 0': 0.0039,
            '10 00 10 11 1': 0.0039,
            '10 00 11 00 1': 0.0039,
            '10 00 11 01 1': 0.0039,
            '10 00 11 10 1': 0.0039,
            '10 00 11 11 0': 0.0039,
            '10 01 00 00 0': 0.0039,
            '10 01 00 01 1': 0.0039,
            '10 01 00 10 1': 0.0039,
            '10 01 00 11 1': 0.0039,
            '10 01 01 00 1': 0.0039,
            '10 01 01 01 0': 0.0039,
            '10 01 01 10 1': 0.0039,
            '10 01 01 11 1': 0.0039,
            '10 01 10 00 1': 0.0039,
            '10 01 10 01 1': 0.0039,
            '10 01 10 10 0': 0.0039,
            '10 01 10 11 1': 0.0039,
            '10 01 11 00 1': 0.0039,
            '10 01 11 01 1': 0.0039,
            '10 01 11 10 1': 0.0039,
            '10 01 11 11 0': 0.0039,
            '10 10 00 00 0': 0.0039,
            '10 10 00 01 0': 0.0039,
            '10 10 00 10 0': 0.0039,
            '10 10 00 11 0': 0.0039,
            '10 10 01 00 0': 0.0039,
            '10 10 01 01 0': 0.0039,
            '10 10 01 10 0': 0.0039,
            '10 10 01 11 0': 0.0039,
            '10 10 10 00 0': 0.0039,
            '10 10 10 01 0': 0.0039,
            '10 10 10 10 0': 0.0039,
            '10 10 10 11 0': 0.0039,
            '10 10 11 00 0': 0.0039,
            '10 10 11 01 0': 0.0039,
            '10 10 11 10 0': 0.0039,
            '10 10 11 11 0': 0.0039,
            '10 11 00 00 0': 0.0039,
            '10 11 00 01 1': 0.0039,
            '10 11 00 10 1': 0.0039,
            '10 11 00 11 1': 0.0039,
            '10 11 01 00 1': 0.0039,
            '10 11 01 01 0': 0.0039,
            '10 11 01 10 1': 0.0039,
            '10 11 01 11 1': 0.0039,
            '10 11 10 00 1': 0.0039,
            '10 11 10 01 1': 0.0039,
            '10 11 10 10 0': 0.0039,
            '10 11 10 11 1': 0.0039,
            '10 11 11 00 1': 0.0039,
            '10 11 11 01 1': 0.0039,
            '10 11 11 10 1': 0.0039,
            '10 11 11 11 0': 0.0039,
            '11 00 00 00 0': 0.0039,
            '11 00 00 01 1': 0.0039,
            '11 00 00 10 1': 0.0039,
            '11 00 00 11 1': 0.0039,
            '11 00 01 00 1': 0.0039,
            '11 00 01 01 0': 0.0039,
            '11 00 01 10 1': 0.0039,
            '11 00 01 11 1': 0.0039,
            '11 00 10 00 1': 0.0039,
            '11 00 10 01 1': 0.0039,
            '11 00 10 10 0': 0.0039,
            '11 00 10 11 1': 0.0039,
            '11 00 11 00 1': 0.0039,
            '11 00 11 01 1': 0.0039,
            '11 00 11 10 1': 0.0039,
            '11 00 11 11 0': 0.0039,
            '11 01 00 00 0': 0.0039,
            '11 01 00 01 1': 0.0039,
            '11 01 00 10 1': 0.0039,
            '11 01 00 11 1': 0.0039,
            '11 01 01 00 1': 0.0039,
            '11 01 01 01 0': 0.0039,
            '11 01 01 10 1': 0.0039,
            '11 01 01 11 1': 0.0039,
            '11 01 10 00 1': 0.0039,
            '11 01 10 01 1': 0.0039,
            '11 01 10 10 0': 0.0039,
            '11 01 10 11 1': 0.0039,
            '11 01 11 00 1': 0.0039,
            '11 01 11 01 1': 0.0039,
            '11 01 11 10 1': 0.0039,
            '11 01 11 11 0': 0.0039,
            '11 10 00 00 0': 0.0039,
            '11 10 00 01 1': 0.0039,
            '11 10 00 10 1': 0.0039,
            '11 10 00 11 1': 0.0039,
            '11 10 01 00 1': 0.0039,
            '11 10 01 01 0': 0.0039,
            '11 10 01 10 1': 0.0039,
            '11 10 01 11 1': 0.0039,
            '11 10 10 00 1': 0.0039,
            '11 10 10 01 1': 0.0039,
            '11 10 10 10 0': 0.0039,
            '11 10 10 11 1': 0.0039,
            '11 10 11 00 1': 0.0039,
            '11 10 11 01 1': 0.0039,
            '11 10 11 10 1': 0.0039,
            '11 10 11 11 0': 0.0039,
            '11 11 00 00 0': 0.0039,
            '11 11 00 01 0': 0.0039,
            '11 11 00 10 0': 0.0039,
            '11 11 00 11 0': 0.0039,
            '11 11 01 00 0': 0.0039,
            '11 11 01 01 0': 0.0039,
            '11 11 01 10 0': 0.0039,
            '11 11 01 11 0': 0.0039,
            '11 11 10 00 0': 0.0039,
            '11 11 10 01 0': 0.0039,
            '11 11 10 10 0': 0.0039,
            '11 11 10 11 0': 0.0039,
            '11 11 11 00 0': 0.0039,
            '11 11 11 01 0': 0.0039,
            '11 11 11 10 0': 0.0039,
            '11 11 11 11 0': 0.0039
        }
        assert result == approx(expected_results, abs=config['absolute_error'])
        assert calc_total_costs(qc) - 8 == 585
Exemple #8
0
    def compare_4_internal_edges(self, simulator, config_slow) -> None:
        """
        ONLY RUN THIS TEST ON A LOCAL SIMULATOR IF YOU HAVE SOME TIME.

        On SP's machine this takes about 2 minutes in total.
        """
        # Given
        edges = [(QuantumRegister(2,
                                  f"v_{i}0"), (QuantumRegister(2, f"v_{i}1")))
                 for i in range(0, 4)]
        ancilla = QuantumRegister(6, 'ancilla')
        target = QuantumRegister(1, 'target')
        first_vertex_measure = ClassicalRegister(2, 'first-vertex-measure')
        second_vertex_measure = ClassicalRegister(2, 'second-vertex-measure')
        target_measure = ClassicalRegister(1, 'target-measure')
        qc = QuantumCircuit(target,
                            ancilla,
                            first_vertex_measure,
                            second_vertex_measure,
                            target_measure,
                            name="test-circuit")
        for v1, v2 in edges:
            qc.add_register(v1, v2)

        # Prepare colors of three of four edges to keep the test size reasonable
        for v1, v2 in edges[1:3]:
            TestColoringCircuits.set_color(qc, v1, VertexColor.RED)
            TestColoringCircuits.set_color(qc, v2, VertexColor.BLUE)
        TestColoringCircuits.set_color(qc, edges[3][0], VertexColor.GREEN)
        TestColoringCircuits.set_color(qc, edges[3][1], VertexColor.YELLOW)
        # Mix the remaining states and measure to obtain random test cases
        qc.h(edges[0][0])
        qc.h(edges[0][1])
        qc.measure(edges[0][0], first_vertex_measure)
        qc.measure(edges[0][1], second_vertex_measure)
        # Compare edges
        _compare_4_internal_edges(qc, edges, list(ancilla), target[0])
        # Measure result
        qc.measure(target, target_measure)

        # When
        job: BaseJob = execute(qc, simulator, shots=config_slow['test_runs'])
        # Calculate relative results
        result: Dict[str, float] = {
            key: value / config_slow['test_runs']
            for key, value in job.result().get_counts(qc).items()
        }

        # Then
        # Expected Results are strings 'target second first'
        expected_results: Dict[str, float] = {
            '0 00 00': 0.0625,
            '0 01 01': 0.0625,
            '0 10 10': 0.0625,
            '0 11 11': 0.0625,
            '1 00 01': 0.0625,
            '1 00 10': 0.0625,
            '1 00 11': 0.0625,
            '1 01 00': 0.0625,
            '1 01 10': 0.0625,
            '1 01 11': 0.0625,
            '1 10 00': 0.0625,
            '1 10 01': 0.0625,
            '1 10 11': 0.0625,
            '1 11 00': 0.0625,
            '1 11 01': 0.0625,
            '1 11 10': 0.0625
        }
        assert result == approx(expected_results,
                                abs=config_slow['absolute_error'])
        assert calc_total_costs(qc) - 7 == 1247