Esempio n. 1
0
    def setUp(self):
        super().setUp()

        self.seed = 7
        aqua_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 = aqua_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., 3.]
        # 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]]

        # Set an initial state for the generator circuit
        init_dist = UniformDistribution(sum(num_qubits), low=self._bounds[0], high=self._bounds[1])
        q = QuantumRegister(sum(num_qubits), name='q')
        qc = QuantumCircuit(q)
        init_dist.build(qc, q)
        init_distribution = Custom(num_qubits=sum(num_qubits), circuit=qc)

        # Set generator's initial parameters
        init_params = aqua_globals.random.random(2 * sum(num_qubits)) * 2 * 1e-2

        # Set variational form
        var_form = RealAmplitudes(sum(num_qubits), reps=1, initial_state=init_distribution,
                                  entanglement=entangler_map)
        self.generator_circuit = UnivariateVariationalDistribution(sum(num_qubits), var_form,
                                                                   init_params,
                                                                   low=self._bounds[0],
                                                                   high=self._bounds[1])
Esempio n. 2
0
    def __init__(self,
                 bounds: np.ndarray,
                 num_qubits: List[int],
                 generator_circuit: Optional[
                     Union[UnivariateVariationalDistribution,
                           MultivariateVariationalDistribution,
                           QuantumCircuit]] = None,
                 init_params: Optional[Union[List[float], np.ndarray]] = None,
                 snapshot_dir: Optional[str] = None) -> None:
        """
        Args:
            bounds: k min/max data values [[min_1,max_1],...,[min_k,max_k]],
                given input data dim k
            num_qubits: k numbers of qubits to determine representation resolution,
                i.e. n qubits enable the representation of 2**n values [n_1,..., n_k]
            generator_circuit: a UnivariateVariationalDistribution for univariate data,
                a MultivariateVariationalDistribution for multivariate data,
                or a QuantumCircuit implementing the generator.
            init_params: 1D numpy array or list, Initialization for
                the generator's parameters.
            snapshot_dir: str or None, if not None save the optimizer's parameter after every
                update step to the given directory

        Raises:
            AquaError: Set multivariate variational distribution to represent multivariate data
        """
        super().__init__()
        self._bounds = bounds
        self._num_qubits = num_qubits
        self.generator_circuit = generator_circuit
        if self.generator_circuit is None:
            entangler_map = []
            if np.sum(num_qubits) > 2:
                for i in range(int(np.sum(num_qubits))):
                    entangler_map.append(
                        [i, int(np.mod(i + 1, np.sum(num_qubits)))])
            else:
                if np.sum(num_qubits) > 1:
                    entangler_map.append([0, 1])

            if len(num_qubits) > 1:
                num_qubits = list(map(int, num_qubits))
                low = bounds[:, 0].tolist()
                high = bounds[:, 1].tolist()
                init_dist = MultivariateUniformDistribution(num_qubits,
                                                            low=low,
                                                            high=high)
                q = QuantumRegister(sum(num_qubits))
                qc = QuantumCircuit(q)
                init_dist.build(qc, q)
                init_distribution = Custom(num_qubits=sum(num_qubits),
                                           circuit=qc)
                # Set variational form
                var_form = RY(sum(num_qubits),
                              depth=1,
                              initial_state=init_distribution,
                              entangler_map=entangler_map,
                              entanglement_gate='cz')
                if init_params is None:
                    init_params = aqua_globals.random.rand(
                        var_form.num_parameters) * 2 * 1e-2
                # Set generator circuit
                self.generator_circuit = MultivariateVariationalDistribution(
                    num_qubits, var_form, init_params, low=low, high=high)
            else:
                init_dist = UniformDistribution(sum(num_qubits),
                                                low=bounds[0],
                                                high=bounds[1])
                q = QuantumRegister(sum(num_qubits), name='q')
                qc = QuantumCircuit(q)
                init_dist.build(qc, q)
                init_distribution = Custom(num_qubits=sum(num_qubits),
                                           circuit=qc)
                var_form = RY(sum(num_qubits),
                              depth=1,
                              initial_state=init_distribution,
                              entangler_map=entangler_map,
                              entanglement_gate='cz')
                if init_params is None:
                    init_params = aqua_globals.random.rand(
                        var_form.num_parameters) * 2 * 1e-2
                # Set generator circuit
                self.generator_circuit = UnivariateVariationalDistribution(
                    int(np.sum(num_qubits)),
                    var_form,
                    init_params,
                    low=bounds[0],
                    high=bounds[1])

        if len(num_qubits) > 1:
            if isinstance(self.generator_circuit,
                          MultivariateVariationalDistribution):
                pass
            else:
                raise AquaError('Set multivariate variational distribution '
                                'to represent multivariate data')
        else:
            if isinstance(self.generator_circuit,
                          UnivariateVariationalDistribution):
                pass
            else:
                raise AquaError('Set univariate variational distribution '
                                'to represent univariate data')
        # Set optimizer for updating the generator network
        self._optimizer = ADAM(maxiter=1,
                               tol=1e-6,
                               lr=1e-3,
                               beta_1=0.7,
                               beta_2=0.99,
                               noise_factor=1e-6,
                               eps=1e-6,
                               amsgrad=True,
                               snapshot_dir=snapshot_dir)

        if np.ndim(self._bounds) == 1:
            bounds = np.reshape(self._bounds, (1, len(self._bounds)))
        else:
            bounds = self._bounds
        for j, prec in enumerate(self._num_qubits):
            # prepare data grid for dim j
            grid = np.linspace(bounds[j, 0], bounds[j, 1], (2**prec))
            if j == 0:
                if len(self._num_qubits) > 1:
                    self._data_grid = [grid]
                else:
                    self._data_grid = grid
                self._grid_elements = grid
            elif j == 1:
                self._data_grid.append(grid)
                temp = []
                for g_e in self._grid_elements:
                    for g in grid:
                        temp0 = [g_e]
                        temp0.append(g)
                        temp.append(temp0)
                self._grid_elements = temp
            else:
                self._data_grid.append(grid)
                temp = []
                for g_e in self._grid_elements:
                    for g in grid:
                        temp0 = deepcopy(g_e)
                        temp0.append(g)
                        temp.append(temp0)
                self._grid_elements = deepcopy(temp)
        self._data_grid = np.array(self._data_grid)

        self._shots = None
        self._discriminator = None
        self._ret = {}
Esempio n. 3
0
    def setUp(self):
        super().setUp()

        # Number training data samples
        N = 5000
        # Load data samples from log-normal distribution with mean=1 and standard deviation=1
        mu = 1
        sigma = 1
        self._real_data = np.random.lognormal(mean=mu, sigma=sigma, size=N)
        # Set the data resolution
        # 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., 3.]
        # 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
        self._params_torch = {
            'algorithm': {
                'name': 'QGAN',
                'num_qubits': num_qubits,
                'batch_size': batch_size,
                'num_epochs': num_epochs
            },
            'problem': {
                'name': 'distribution_learning_loading',
                'random_seed': 7
            },
            'generative_network': {
                'name': 'QuantumGenerator',
                'bounds': self._bounds,
                'num_qubits': num_qubits,
                'init_params': None,
                'snapshot_dir': None
            },
            'discriminative_network': {
                'name': 'PytorchDiscriminator',
                'n_features': len(num_qubits)
            }
        }
        self._params_numpy = {
            'algorithm': {
                'name': 'QGAN',
                'num_qubits': num_qubits,
                'batch_size': batch_size,
                'num_epochs': num_epochs
            },
            'problem': {
                'name': 'distribution_learning_loading',
                'random_seed': 7
            },
            'generative_network': {
                'name': 'QuantumGenerator',
                'bounds': self._bounds,
                'num_qubits': num_qubits,
                'init_params': None,
                'snapshot_dir': None
            },
            'discriminative_network': {
                'name': 'NumpyDiscriminator',
                'n_features': len(num_qubits)
            }
        }

        # 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.quantum_instance_statevector = QuantumInstance(
            backend=BasicAer.get_backend('statevector_simulator'),
            circuit_caching=False,
            seed_simulator=2,
            seed_transpiler=2)
        self.quantum_instance_qasm = QuantumInstance(
            backend=BasicAer.get_backend('qasm_simulator'),
            shots=1000,
            circuit_caching=False,
            seed_simulator=2,
            seed_transpiler=2)
        # Set entangler map
        entangler_map = [[0, 1]]

        # Set an initial state for the generator circuit
        init_dist = UniformDistribution(sum(num_qubits),
                                        low=self._bounds[0],
                                        high=self._bounds[1])
        q = QuantumRegister(sum(num_qubits), name='q')
        qc = QuantumCircuit(q)
        init_dist.build(qc, q)
        init_distribution = Custom(num_qubits=sum(num_qubits), circuit=qc)
        # Set variational form
        var_form = RY(sum(num_qubits),
                      depth=1,
                      initial_state=init_distribution,
                      entangler_map=entangler_map,
                      entanglement_gate='cz')
        # Set generator's initial parameters
        init_params = aqua_globals.random.rand(
            var_form._num_parameters) * 2 * 1e-2
        # Set generator circuit
        g_circuit = UnivariateVariationalDistribution(sum(num_qubits),
                                                      var_form,
                                                      init_params,
                                                      low=self._bounds[0],
                                                      high=self._bounds[1])
        # initial_distribution=init_distribution,
        # Set quantum generator
        self.qgan.set_generator(generator_circuit=g_circuit)
Esempio n. 4
0
# Initialize qGAN
qgan = QGAN(reshaped_data, bounds=bounds, num_qubits=num_qubits,
            batch_size=1, num_epochs=num_epochs, snapshot_dir="data")
print("QGAN set")
qgan.seed = 1
# Set quantum instance to run the quantum generator
quantum_instance = QuantumInstance(
    backend=BasicAer.get_backend('statevector_simulator'))
print("quantum_instance set")

# Set entangler map
entangler_map = [[0, 1]]


# Set an initial state for the generator circuit
init_dist = UniformDistribution(sum(num_qubits), low=bounds[0], high=bounds[1])
q = QuantumRegister(sum(num_qubits), name='q')
qc = QuantumCircuit(q)
init_dist.build(qc, q)
init_distribution = Custom(num_qubits=sum(num_qubits), circuit=qc)
var_form = TwoLocal(int(np.sum(num_qubits)), 'ry', 'cz', entanglement=entangler_map,
                    reps=1, initial_state=init_distribution)
# Set generator's initial parameters
init_params = aqua_globals.random.rand(
    var_form.num_parameters_settable) * 2 * np.pi
# Set generator circuit
g_circuit = UnivariateVariationalDistribution(int(sum(num_qubits)), var_form, init_params,
                                              low=bounds[0], high=bounds[1])

print("g_circuit set")
sortedkeys = sorted(counts)

for i in sortedkeys:
    for j in counts:
        if (i == j):
            sortedcounts.append(counts.get(j))

plt.suptitle('Normal Distribution')
plt.plot(sortedcounts)
plt.show()

print("\n Uniform Distribution")
print("-----------------")

circuit = QuantumCircuit(q, c)
uniform = UniformDistribution(num_target_qubits=5, low=-0, high=1)
uniform.build(circuit, q)
circuit.measure(q, c)

circuit.draw(output='mpl', filename='uniform.png')

job = execute(circuit, backend, shots=8192)
job_monitor(job)
counts = job.result().get_counts()

print(counts)

sortedcounts = []
sortedkeys = sorted(counts)

for i in sortedkeys:
Esempio n. 6
0
def QGAN_method(kk, num_qubit, epochs, batch, bound, snap, data):
    start = time.time()

    real_data = data

    # In[41]:

    # Number training data samples
    N = 1000

    # Load data samples from log-normal distribution with mean=1 and standard deviation=1
    mu = 1
    sigma = 1

    # real_data = np.random.lognormal(mean = mu, sigma=sigma, size=N)
    # print(real_data)

    # Set the data resolution
    # Set upper and lower data values as list of k min/max data values [[min_0,max_0],...,[min_k-1,max_k-1]]
    bounds = np.array([0, bound])

    # Set number of qubits per data dimension as list of k qubit values[#q_0,...,#q_k-1]
    num_qubits = [num_qubit]

    k = kk

    # In[52]:

    # Set number of training epochs
    # Note: The algorithm's runtime can be shortened by reducing the number of training epochs.
    num_epochs = epochs
    # Batch size
    batch_size = batch

    # Initialize qGAN
    qgan = QGAN(real_data,
                bounds,
                num_qubits,
                batch_size,
                num_epochs,
                snapshot_dir=snap)
    qgan.seed = 1
    # Set quantum instance to run the quantum generator
    quantum_instance = QuantumInstance(
        backend=BasicAer.get_backend('statevector_simulator'))

    # Set entangler map
    entangler_map = [[0, 1]]

    # Set an initial state for the generator circuit
    init_dist = UniformDistribution(sum(num_qubits),
                                    low=bounds[0],
                                    high=bounds[1])
    q = QuantumRegister(sum(num_qubits), name='q')
    qc = QuantumCircuit(q)
    init_dist.build(qc, q)
    init_distribution = Custom(num_qubits=sum(num_qubits), circuit=qc)
    var_form = RY(int(np.sum(num_qubits)),
                  depth=k,
                  initial_state=init_distribution,
                  entangler_map=entangler_map,
                  entanglement_gate='cz')

    # Set generator's initial parameters
    init_params = aqua_globals.random.rand(
        var_form._num_parameters) * 2 * np.pi
    # Set generator circuit
    g_circuit = UnivariateVariationalDistribution(int(sum(num_qubits)),
                                                  var_form,
                                                  init_params,
                                                  low=bounds[0],
                                                  high=bounds[1])
    # Set quantum generator
    qgan.set_generator(generator_circuit=g_circuit)
    # Set classical discriminator neural network
    discriminator = NumPyDiscriminator(len(num_qubits))
    qgan.set_discriminator(discriminator)

    # In[53]:

    # Run qGAN
    qgan.run(quantum_instance)

    # Runtime
    end = time.time()
    print('qGAN training runtime: ', (end - start) / 60., ' min')

    return qgan