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])
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 = {}
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)
# 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:
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