예제 #1
0
 def test_construct_circuit(self):
     """Test construct_circuit"""
     oracle = QuantumCircuit(2)
     oracle.cz(0, 1)
     grover = Grover(oracle=oracle, good_state=["11"])
     constructed = grover.construct_circuit(1)
     grover_op = GroverOperator(oracle)
     expected = QuantumCircuit(2)
     expected.compose(grover_op.state_preparation, inplace=True)
     expected.compose(grover_op, inplace=True)
     self.assertTrue(Operator(constructed).equiv(Operator(expected)))
예제 #2
0
 def test_run_circuit_oracle(self):
     """Test execution with a quantum circuit oracle"""
     oracle = QuantumCircuit(2)
     oracle.cz(0, 1)
     problem = AmplificationProblem(oracle, is_good_state=["11"])
     qi = QuantumInstance(
         self._provider.get_backend("fake_yorktown"), seed_simulator=12, seed_transpiler=32
     )
     grover = Grover(quantum_instance=qi)
     result = grover.amplify(problem)
     self.assertIn(result.top_measurement, ["11"])
예제 #3
0
 def test_run_circuit_oracle_single_experiment_backend(self):
     """Test execution with a quantum circuit oracle"""
     oracle = QuantumCircuit(2)
     oracle.cz(0, 1)
     problem = AmplificationProblem(oracle, is_good_state=["11"])
     backend = self._provider.get_backend("fake_vigo")
     backend._configuration.max_experiments = 1
     qi = QuantumInstance(backend, seed_simulator=12, seed_transpiler=32)
     grover = Grover(quantum_instance=qi)
     result = grover.amplify(problem)
     self.assertIn(result.top_measurement, ["11"])
예제 #4
0
    def test_max_num_iterations(self):
        """Test the iteration stops when the maximum number of iterations is reached."""
        def zero():
            while True:
                yield 0

        grover = Grover(iterations=zero(), quantum_instance=self.statevector)
        n = 5
        problem = AmplificationProblem(Statevector.from_label('1' * n),
                                       is_good_state=['1' * n])
        result = grover.amplify(problem)
        self.assertEqual(len(result.iterations), 2**n)
예제 #5
0
    def test_run_custom_grover_operator(self):
        """Test execution with a grover operator oracle"""
        oracle = QuantumCircuit(2)
        oracle.cz(0, 1)
        grover_op = GroverOperator(oracle)
        problem = AmplificationProblem(oracle=oracle,
                                       grover_operator=grover_op,
                                       is_good_state=['11'])

        grover = Grover(quantum_instance=self.qasm)
        ret = grover.amplify(problem)
        self.assertIn(ret.top_measurement, ['11'])
예제 #6
0
    def test_construct_circuit(self):
        """Test construct_circuit"""
        oracle = QuantumCircuit(2)
        oracle.cz(0, 1)
        problem = AmplificationProblem(oracle)
        grover = Grover()
        constructed = grover.construct_circuit(problem, 2, measurement=False)

        grover_op = GroverOperator(oracle)
        expected = QuantumCircuit(2)
        expected.h([0, 1])
        expected.compose(grover_op.power(2), inplace=True)

        self.assertTrue(Operator(constructed).equiv(Operator(expected)))
예제 #7
0
 def test_circuit_result(self):
     """Test circuit_result"""
     oracle = QuantumCircuit(2)
     oracle.cz(0, 1)
     # is_good_state=['00'] is intentionally selected to obtain a list of results
     problem = AmplificationProblem(oracle, is_good_state=["00"])
     grover = Grover(iterations=[1, 2, 3, 4], quantum_instance=self.qasm)
     result = grover.amplify(problem)
     expected_results = [
         {"11": 1024},
         {"00": 238, "01": 253, "10": 263, "11": 270},
         {"00": 238, "01": 253, "10": 263, "11": 270},
         {"11": 1024},
     ]
     self.assertEqual(result.circuit_results, expected_results)
예제 #8
0
 def test_oracle_statevector(self):
     """Test StateVector oracle"""
     mark_state = Statevector.from_label('11')
     grover = Grover(oracle=mark_state, good_state=['11'])
     grover_op = grover._grover_operator
     self.assertTrue(
         Operator(grover_op).equiv(Operator(self._expected_grover_op)))
예제 #9
0
 def test_is_good_state_statevector(self):
     """Test StateVector is_good_state"""
     oracle = QuantumCircuit(2)
     oracle.cz(0, 1)
     is_good_state = Statevector.from_label('11')
     grover = Grover(oracle=oracle, good_state=is_good_state)
     self.assertTrue(grover._is_good_state.equiv(Statevector.from_label('11')))
예제 #10
0
 def test_is_good_state_list(self):
     """Test List is_good_state"""
     oracle = QuantumCircuit(2)
     oracle.cz(0, 1)
     is_good_state = ["11", "00"]
     grover = Grover(oracle=oracle, good_state=is_good_state)
     self.assertListEqual(grover._is_good_state, ["11", "00"])
예제 #11
0
 def test_oracle_quantumcircuit(self):
     """Test QuantumCircuit oracle"""
     oracle = QuantumCircuit(2)
     oracle.cz(0, 1)
     grover = Grover(oracle=oracle, good_state=["11"])
     grover_op = grover._grover_operator
     self.assertTrue(Operator(grover_op).equiv(Operator(self._expected_grover_op)))
예제 #12
0
    def test_iterator(self):
        """Test running the algorithm on an iterator."""

        # step-function iterator
        def iterator():
            wait, value, count = 3, 1, 0
            while True:
                yield value
                count += 1
                if count % wait == 0:
                    value += 1

        grover = Grover(iterations=iterator(), quantum_instance=self.statevector)
        problem = AmplificationProblem(Statevector.from_label("111"), is_good_state=["111"])
        result = grover.amplify(problem)
        self.assertEqual(result.top_measurement, "111")
예제 #13
0
 def test_optimal_num_iterations(self):
     """Test optimal_num_iterations"""
     num_qubits = 7
     for num_solutions in range(1, 2**num_qubits):
         amplitude = np.sqrt(num_solutions / 2**num_qubits)
         expected = round(np.arccos(amplitude) / (2 * np.arcsin(amplitude)))
         actual = Grover.optimal_num_iterations(num_solutions, num_qubits)
     self.assertEqual(actual, expected)
예제 #14
0
 def test_grover_operator_getter(self):
     """Test the getter of grover_operator"""
     oracle = QuantumCircuit(2)
     oracle.cz(0, 1)
     grover = Grover(oracle=oracle, good_state=["11"])
     constructed = grover.grover_operator
     expected = GroverOperator(oracle)
     self.assertTrue(Operator(constructed).equiv(Operator(expected)))
예제 #15
0
 def test_grover_operator(self):
     """Test GroverOperator"""
     oracle = QuantumCircuit(2)
     oracle.cz(0, 1)
     grover_op = GroverOperator(oracle)
     grover = Grover(oracle=grover_op.oracle,
                     grover_operator=grover_op, good_state=["11"])
     grover_op = grover._grover_operator
     self.assertTrue(Operator(grover_op).equiv(Operator(self._expected_grover_op)))
예제 #16
0
 def test_state_preparation_quantumcircuit(self):
     """Test QuantumCircuit state_preparation"""
     state_preparation = QuantumCircuit(2)
     state_preparation.h(0)
     oracle = QuantumCircuit(3)
     oracle.cz(0, 1)
     grover = Grover(oracle=oracle, state_preparation=state_preparation,
                     good_state=["011"])
     grover_op = grover._grover_operator
     expected_grover_op = GroverOperator(oracle, state_preparation=state_preparation)
     self.assertTrue(Operator(grover_op).equiv(Operator(expected_grover_op)))
예제 #17
0
    def test_iterations(self):
        """Test the iterations argument"""
        grover = Grover(oracle=self._oracle, good_state=['111'], iterations=2)
        ret = grover.run(self._sv)
        self.assertTrue(Operator(ret.circuit).equiv(Operator(self._expected)))

        grover = Grover(oracle=self._oracle, good_state=['111'], iterations=[1, 2, 3])
        ret = grover.run(self._sv)
        self.assertTrue(ret.oracle_evaluation)
        self.assertIn(ret.top_measurement, ['111'])
 def test_fixed_iterations(self):
     """Test the iterations argument"""
     grover = Grover(iterations=2, quantum_instance=self.statevector)
     problem = AmplificationProblem(Statevector.from_label("111"), is_good_state=["111"])
     result = grover.amplify(problem)
     self.assertEqual(result.top_measurement, "111")
예제 #19
0
 def test_iterations_with_good_state(self, iterations):
     """Test the algorithm with different iteration types and with good state"""
     grover = Grover(iterations, quantum_instance=self.statevector)
     problem = AmplificationProblem(Statevector.from_label("111"), is_good_state=["111"])
     result = grover.amplify(problem)
     self.assertEqual(result.top_measurement, "111")
예제 #20
0
 def test_growth_rate(self):
     """Test running the algorithm on a growth rate"""
     grover = Grover(growth_rate=8 / 7, quantum_instance=self.statevector)
     problem = AmplificationProblem(Statevector.from_label("111"), is_good_state=["111"])
     result = grover.amplify(problem)
     self.assertEqual(result.top_measurement, "111")
예제 #21
0
    def test_is_good_state(self):
        """Test is_good_state"""
        oracle = QuantumCircuit(2)
        oracle.cz(0, 1)
        list_str_good_state = ["11"]
        grover = Grover(oracle=oracle, good_state=list_str_good_state)
        self.assertTrue(grover.is_good_state("11"))

        statevector_good_state = Statevector.from_label('11')
        grover = Grover(oracle=oracle, good_state=statevector_good_state)
        self.assertTrue(grover.is_good_state("11"))

        list_int_good_state = [0, 1]
        grover = Grover(oracle=oracle, good_state=list_int_good_state)
        self.assertTrue(grover.is_good_state("11"))

        def _callable_good_state(bitstr):
            if bitstr == "11":
                return True, bitstr
            else:
                return False, bitstr

        grover = Grover(oracle=oracle, good_state=_callable_good_state)
        self.assertTrue(grover.is_good_state("11"))
예제 #22
0
 def test_run_state_vector_oracle(self):
     """Test execution with a state vector oracle"""
     mark_state = Statevector.from_label('11')
     grover = Grover(oracle=mark_state, good_state=['11'])
     ret = grover.run(self._qasm)
     self.assertIn(ret['top_measurement'], ['11'])
예제 #23
0
 def test_fixed_iterations_without_good_state(self):
     """Test the algorithm with iterations as an int and without good state"""
     grover = Grover(iterations=2, quantum_instance=self.statevector)
     problem = AmplificationProblem(Statevector.from_label("111"))
     result = grover.amplify(problem)
     self.assertEqual(result.top_measurement, "111")
 def test_multiple_iterations(self):
     """Test the algorithm for a list of iterations."""
     grover = Grover(iterations=[1, 2, 3], quantum_instance=self.statevector)
     problem = AmplificationProblem(Statevector.from_label("111"), is_good_state=["111"])
     result = grover.amplify(problem)
     self.assertEqual(result.top_measurement, "111")