Пример #1
0
 def test_qgan_save_model(self):
     """Test the QGAN functionality to store the current model."""
     # Set number of qubits per data dimension as list of k qubit values[#q_0,...,#q_k-1]
     num_qubits = [2]
     # Batch size
     batch_size = 100
     # Set number of training epochs
     num_epochs = 5
     with tempfile.TemporaryDirectory() as tmpdirname:
         _qgan = QGAN(
             self._real_data,
             self._bounds,
             num_qubits,
             batch_size,
             num_epochs,
             discriminator=NumPyDiscriminator(n_features=len(num_qubits)),
             snapshot_dir=tmpdirname)
         _qgan.seed = self.seed
         _qgan.set_generator()
         trained_statevector = _qgan.run(
             QuantumInstance(BasicAer.get_backend('statevector_simulator'),
                             seed_simulator=algorithm_globals.random_seed,
                             seed_transpiler=algorithm_globals.random_seed))
         trained_qasm = _qgan.run(
             QuantumInstance(BasicAer.get_backend('qasm_simulator'),
                             seed_simulator=algorithm_globals.random_seed,
                             seed_transpiler=algorithm_globals.random_seed))
     self.assertAlmostEqual(trained_qasm['rel_entr'],
                            trained_statevector['rel_entr'],
                            delta=0.1)
Пример #2
0
 def test_qgan_training_run_algo_numpy(self):
     """Test QGAN training using a NumPy discriminator."""
     # Set number of qubits per data dimension as list of k qubit values[#q_0,...,#q_k-1]
     num_qubits = [2]
     # Batch size
     batch_size = 100
     # Set number of training epochs
     num_epochs = 5
     _qgan = QGAN(
         self._real_data,
         self._bounds,
         num_qubits,
         batch_size,
         num_epochs,
         discriminator=NumPyDiscriminator(n_features=len(num_qubits)),
         snapshot_dir=None)
     _qgan.seed = self.seed
     _qgan.set_generator()
     trained_statevector = _qgan.run(
         QuantumInstance(BasicAer.get_backend('statevector_simulator'),
                         seed_simulator=algorithm_globals.random_seed,
                         seed_transpiler=algorithm_globals.random_seed))
     trained_qasm = _qgan.run(
         QuantumInstance(BasicAer.get_backend('qasm_simulator'),
                         seed_simulator=algorithm_globals.random_seed,
                         seed_transpiler=algorithm_globals.random_seed))
     self.assertAlmostEqual(trained_qasm['rel_entr'],
                            trained_statevector['rel_entr'],
                            delta=0.1)
Пример #3
0
    def setUp(self):
        super().setUp()

        self.seed = 7
        algorithm_globals.random_seed = self.seed
        # Number training data samples
        n_v = 5000
        # Load data samples from log-normal distribution with mean=1 and standard deviation=1
        m_u = 1
        sigma = 1
        self._real_data = algorithm_globals.random.lognormal(mean=m_u,
                                                             sigma=sigma,
                                                             size=n_v)
        # Set upper and lower data values as list of k
        # min/max data values [[min_0,max_0],...,[min_k-1,max_k-1]]
        self._bounds = [0.0, 3.0]
        # Set number of qubits per data dimension as list of k qubit values[#q_0,...,#q_k-1]
        num_qubits = [2]
        # Batch size
        batch_size = 100
        # Set number of training epochs
        # num_epochs = 10
        num_epochs = 5

        # Initialize qGAN
        self.qgan = QGAN(
            self._real_data,
            self._bounds,
            num_qubits,
            batch_size,
            num_epochs,
            snapshot_dir=None,
        )
        self.qgan.seed = 7
        # Set quantum instance to run the quantum generator
        self.qi_statevector = QuantumInstance(
            backend=BasicAer.get_backend("statevector_simulator"),
            seed_simulator=2,
            seed_transpiler=2,
        )
        self.qi_qasm = QuantumInstance(
            backend=BasicAer.get_backend("qasm_simulator"),
            shots=1000,
            seed_simulator=2,
            seed_transpiler=2,
        )
        # Set entangler map
        entangler_map = [[0, 1]]

        qc = QuantumCircuit(sum(num_qubits))
        qc.h(qc.qubits)

        ansatz = RealAmplitudes(sum(num_qubits),
                                reps=1,
                                entanglement=entangler_map)
        qc.compose(ansatz, inplace=True)
        self.generator_circuit = qc
Пример #4
0
    def test_qgan_training_run_algo_numpy_multivariate(self):
        """Test QGAN training using a NumPy discriminator, for multivariate distributions."""
        # Set number of qubits per data dimension as list of k qubit values[#q_0,...,#q_k-1]
        num_qubits = [1, 2]
        # Batch size
        batch_size = 100
        # Set number of training epochs
        num_epochs = 5

        # Reshape data in a multi-variate fashion
        # (two independent identically distributed variables,
        # each represented by half of the generated samples)
        real_data = self._real_data.reshape((-1, 2))
        bounds = [self._bounds, self._bounds]

        _qgan = QGAN(
            real_data,
            bounds,
            num_qubits,
            batch_size,
            num_epochs,
            discriminator=NumPyDiscriminator(n_features=len(num_qubits)),
            snapshot_dir=None,
        )
        _qgan.seed = self.seed
        _qgan.set_generator()
        trained_statevector = _qgan.run(
            QuantumInstance(
                BasicAer.get_backend("statevector_simulator"),
                seed_simulator=algorithm_globals.random_seed,
                seed_transpiler=algorithm_globals.random_seed,
            ))
        trained_qasm = _qgan.run(
            QuantumInstance(
                BasicAer.get_backend("qasm_simulator"),
                seed_simulator=algorithm_globals.random_seed,
                seed_transpiler=algorithm_globals.random_seed,
            ))
        self.assertAlmostEqual(trained_qasm["rel_entr"],
                               trained_statevector["rel_entr"],
                               delta=0.1)
Пример #5
0
 def test_qgan_gradient_penalty_pytorch(self):
     """
     Test QGAN training with gradient penalty for the discriminator
     """
     num_qubits = [2]
     # Batch size
     batch_size = 100
     # Set number of training epochs
     num_epochs = 5
     _qgan = QGAN(
         self._real_data,
         self._bounds,
         num_qubits,
         batch_size,
         num_epochs,
         discriminator=PyTorchDiscriminator(n_features=len(num_qubits)),
         snapshot_dir=None,
         penalty=True,
     )
     _qgan.seed = self.seed
     _qgan.set_generator()
     trained_statevector = _qgan.run(
         QuantumInstance(
             BasicAer.get_backend("statevector_simulator"),
             seed_simulator=algorithm_globals.random_seed,
             seed_transpiler=algorithm_globals.random_seed,
         ))
     trained_qasm = _qgan.run(
         QuantumInstance(
             BasicAer.get_backend("qasm_simulator"),
             seed_simulator=algorithm_globals.random_seed,
             seed_transpiler=algorithm_globals.random_seed,
         ))
     self.assertAlmostEqual(trained_qasm["rel_entr"],
                            trained_statevector["rel_entr"],
                            delta=0.1)