Esempio n. 1
0
    def test_copy(self):
        """Test copy operation for ``RawFeatureVector``."""

        circuit = RawFeatureVector(8)
        circuit_copy = circuit.copy()

        # make sure that the copied circuit has the same number of qubits as the original one
        self.assertEqual(circuit.num_qubits, circuit_copy.num_qubits)
        self.assertEqual(circuit.feature_dimension,
                         circuit_copy.feature_dimension)
    def test_fully_bound(self):
        """Test fully binding the circuit works."""

        circuit = RawFeatureVector(8)

        params = np.random.random(8) + 1j * np.random.random(8)
        params /= np.linalg.norm(params)

        bound = circuit.bind_parameters(params)

        ref = QuantumCircuit(3)
        ref.initialize(params, ref.qubits)

        self.assertEqual(bound.decompose(), ref)
    def test_usage_in_vqc(self):
        """Test using the circuit the a single VQC iteration works."""

        # specify quantum instance and random seed
        random_seed = 12345
        quantum_instance = QuantumInstance(
            Aer.get_backend('statevector_simulator'),
            seed_simulator=random_seed,
            seed_transpiler=random_seed)
        np.random.seed(random_seed)

        # construct data
        num_samples = 10
        num_inputs = 4
        X = np.random.rand(num_samples, num_inputs)  # pylint: disable=invalid-name
        y = 1.0 * (np.sum(X, axis=1) <= 2)
        while len(np.unique(y, axis=0)) == 1:
            y = 1.0 * (np.sum(X, axis=1) <= 2)
        y = np.array([y, 1 - y]).transpose()

        feature_map = RawFeatureVector(feature_dimension=num_inputs)

        vqc = VQC(feature_map=feature_map,
                  ansatz=RealAmplitudes(feature_map.num_qubits, reps=1),
                  optimizer=COBYLA(maxiter=10),
                  quantum_instance=quantum_instance)

        vqc.fit(X, y)
        score = vqc.score(X, y)
        self.assertGreater(score, 0.5)
Esempio n. 4
0
    def test_fully_bound(self):
        """Test fully binding the circuit works."""

        circuit = RawFeatureVector(8)

        params = np.random.random(8) + 1j * np.random.random(8)
        params /= np.linalg.norm(params)

        bound = circuit.bind_parameters(params)

        ref = QuantumCircuit(3)
        ref.initialize(params, ref.qubits)

        self.assertEqual(bound.decompose(), ref)

        # make sure that the bound circuit is a successful copy of the original circuit
        self.assertEqual(circuit.num_qubits, bound.num_qubits)
        self.assertEqual(circuit.feature_dimension, bound.feature_dimension)
    def test_bind_after_composition(self):
        """Test binding the parameters after the circuit was composed onto a larger one."""
        circuit = QuantumCircuit(2)
        circuit.h([0, 1])

        raw = RawFeatureVector(4)
        circuit.append(raw, [0, 1])

        bound = circuit.bind_parameters([1, 0, 0, 0])

        self.assertTrue(Statevector.from_label('00').equiv(bound))
    def test_readme_sample(self):
        """ readme sample test """

        # pylint: disable=import-outside-toplevel,redefined-builtin
        def print(*args):
            """ overloads print to log values """
            if args:
                self.log.debug(args[0], *args[1:])

        # --- Exact copy of sample code ----------------------------------------

        from qiskit import BasicAer
        from qiskit.utils import QuantumInstance, algorithm_globals
        from qiskit.algorithms.optimizers import COBYLA
        from qiskit.circuit.library import TwoLocal
        from qiskit_machine_learning.algorithms import VQC
        from qiskit_machine_learning.datasets import wine
        from qiskit_machine_learning.circuit.library import RawFeatureVector

        seed = 1376
        algorithm_globals.random_seed = seed

        # Use Wine data set for training and test data
        feature_dim = 4  # dimension of each data point
        training_size = 12
        test_size = 4

        # training features, training labels, test features, test labels as np.array,
        # one hot encoding for labels
        training_features, training_labels, test_features, test_labels = \
            wine(training_size=training_size, test_size=test_size, n=feature_dim)

        feature_map = RawFeatureVector(feature_dimension=feature_dim)
        ansatz = TwoLocal(feature_map.num_qubits, ['ry', 'rz'], 'cz', reps=3)
        vqc = VQC(feature_map=feature_map,
                  ansatz=ansatz,
                  optimizer=COBYLA(maxiter=100),
                  quantum_instance=QuantumInstance(
                      BasicAer.get_backend('statevector_simulator'),
                      shots=1024,
                      seed_simulator=seed,
                      seed_transpiler=seed))
        vqc.fit(training_features, training_labels)

        score = vqc.score(test_features, test_labels)
        print('Testing accuracy: {:0.2f}'.format(score))

        # ----------------------------------------------------------------------

        self.assertGreater(score, 0.8)
Esempio n. 7
0
    def test_usage_in_vqc(self):
        """Test using the circuit the a single VQC iteration works."""
        feature_dim = 4
        _, training_input, test_input, _ = wine(training_size=1,
                                                test_size=1,
                                                n=feature_dim,
                                                plot_data=False)
        feature_map = RawFeatureVector(feature_dimension=feature_dim)

        vqc = VQC(COBYLA(maxiter=1), feature_map,
                  EfficientSU2(feature_map.num_qubits, reps=1), training_input,
                  test_input)
        backend = Aer.get_backend('qasm_simulator')
        result = vqc.run(backend)
        self.assertTrue(result['eval_count'] > 0)
    def test_construction(self):
        """Test creating the circuit works."""

        circuit = RawFeatureVector(4)

        with self.subTest('check number of qubits'):
            self.assertEqual(circuit.num_qubits, 2)

        with self.subTest('check parameters'):
            self.assertEqual(len(circuit.parameters), 4)

        with self.subTest('check unrolling fails'):
            with self.assertRaises(QiskitError):
                _ = transpile(circuit,
                              basis_gates=['u', 'cx'],
                              optimization_level=0)
    def test_readme_sample(self):
        """ readme sample test """

        # pylint: disable=import-outside-toplevel,redefined-builtin

        def print(*args):
            """ overloads print to log values """
            if args:
                self.log.debug(args[0], *args[1:])

        # --- Exact copy of sample code ----------------------------------------

        from qiskit import BasicAer
        from qiskit.utils import QuantumInstance, algorithm_globals
        from qiskit.algorithms.optimizers import COBYLA
        from qiskit.circuit.library import TwoLocal
        from qiskit_machine_learning.algorithms import VQC
        from qiskit_machine_learning.datasets import wine
        from qiskit_machine_learning.circuit.library import RawFeatureVector

        seed = 1376
        algorithm_globals.random_seed = seed

        # Use Wine data set for training and test data
        feature_dim = 4  # dimension of each data point
        _, training_input, test_input, _ = wine(training_size=12,
                                                test_size=4,
                                                n=feature_dim)

        feature_map = RawFeatureVector(feature_dimension=feature_dim)
        vqc = VQC(COBYLA(maxiter=100), feature_map,
                  TwoLocal(feature_map.num_qubits, ['ry', 'rz'], 'cz', reps=3),
                  training_input, test_input)
        result = vqc.run(
            QuantumInstance(BasicAer.get_backend('statevector_simulator'),
                            shots=1024,
                            seed_simulator=seed,
                            seed_transpiler=seed))

        print('Testing accuracy: {:0.2f}'.format(result['testing_accuracy']))

        # ----------------------------------------------------------------------

        self.assertGreater(result['testing_accuracy'], 0.8)
    def test_partially_bound(self):
        """Test partially binding the circuit works."""

        circuit = RawFeatureVector(4)
        params = circuit.parameters

        with self.subTest('single numeric value'):
            circuit.assign_parameters({params[0]: 0.2}, inplace=True)
            self.assertEqual(len(circuit.parameters), 3)

        with self.subTest('bound to another parameter'):
            circuit.assign_parameters({params[1]: params[2]}, inplace=True)
            self.assertEqual(len(circuit.parameters), 2)

        with self.subTest('test now fully bound circuit'):
            bound = circuit.assign_parameters({params[2]: 0.4, params[3]: 0.8})
            ref = QuantumCircuit(2)
            ref.initialize([0.2, 0.4, 0.4, 0.8], ref.qubits)
            self.assertEqual(bound.decompose(), ref)
Esempio n. 11
0
    def test_raw_feature_vector_on_wine(self, ):
        """Test VQC on the wine dataset using the ``RawFeatureVector`` as data preparation."""
        feature_dim = 4  # dimension of each data point
        training_dataset_size = 8
        testing_dataset_size = 4

        _, training_input, test_input, _ = wine(
            training_size=training_dataset_size,
            test_size=testing_dataset_size,
            n=feature_dim,
            plot_data=False)

        feature_map = RawFeatureVector(feature_dimension=feature_dim)

        vqc = VQC(COBYLA(maxiter=100), feature_map,
                  TwoLocal(feature_map.num_qubits, ['ry', 'rz'], 'cz', reps=3),
                  training_input, test_input)
        result = vqc.run(self.statevector_simulator)

        self.log.debug(result['testing_accuracy'])
        self.assertGreater(result['testing_accuracy'], 0.7)
Esempio n. 12
0
    def test_usage_in_vqc(self):
        """Test using the circuit the a single VQC iteration works."""

        # specify quantum instance and random seed
        algorithm_globals.random_seed = 12345
        quantum_instance = QuantumInstance(
            Aer.get_backend("aer_simulator_statevector"),
            seed_simulator=algorithm_globals.random_seed,
            seed_transpiler=algorithm_globals.random_seed,
        )

        # construct data
        num_samples = 10
        num_inputs = 4
        X = algorithm_globals.random.random(  # pylint: disable=invalid-name
            (num_samples, num_inputs))
        y = 1.0 * (np.sum(X, axis=1) <= 2)
        while len(np.unique(y, axis=0)) == 1:
            y = 1.0 * (np.sum(X, axis=1) <= 2)
        y = np.array([y, 1 - y]).transpose()

        feature_map = RawFeatureVector(feature_dimension=num_inputs)
        ansatz = RealAmplitudes(feature_map.num_qubits, reps=1)
        # classification may fail sometimes, so let's fix initial point
        initial_point = np.array([0.5] * ansatz.num_parameters)

        vqc = VQC(
            feature_map=feature_map,
            ansatz=ansatz,
            optimizer=COBYLA(maxiter=10),
            quantum_instance=quantum_instance,
            initial_point=initial_point,
        )

        vqc.fit(X, y)
        score = vqc.score(X, y)
        self.assertGreater(score, 0.5)
Esempio n. 13
0
    def test_partially_bound(self):
        """Test partially binding the circuit works."""

        circuit = RawFeatureVector(4)
        params = circuit.parameters

        with self.subTest("single numeric value"):
            circuit.assign_parameters({params[0]: 0.2}, inplace=True)
            self.assertEqual(len(circuit.parameters), 3)

        with self.subTest("bound to another parameter"):
            circuit.assign_parameters({params[1]: params[2]}, inplace=True)
            self.assertEqual(len(circuit.parameters), 2)

        with self.subTest("test now fully bound circuit"):
            bound = circuit.assign_parameters({params[2]: 0.4, params[3]: 0.8})
            ref = QuantumCircuit(2)
            ref.initialize([0.2, 0.4, 0.4, 0.8], ref.qubits)
            self.assertEqual(bound.decompose(), ref)

            # make sure that the bound circuit is a successful copy of the original circuit
            self.assertEqual(circuit.num_qubits, bound.num_qubits)
            self.assertEqual(circuit.feature_dimension,
                             bound.feature_dimension)