def test_qgan_errors(backend_name): if not K.check_availability("tensorflow"): # pragma: no cover pytest.skip("Skipping StyleQGAN test because tensorflow backend is not available.") original_backend = qibo.get_backend() if backend_name != "tensorflow": qibo.set_backend(backend_name) with pytest.raises(RuntimeError): qgan = models.StyleQGAN(latent_dim=2) qibo.set_backend("tensorflow") with pytest.raises(ValueError): qgan = models.StyleQGAN(latent_dim=2) circuit = models.Circuit(2) with pytest.raises(ValueError): qgan = models.StyleQGAN(latent_dim=2, layers=2, circuit=circuit) with pytest.raises(ValueError): qgan = models.StyleQGAN(latent_dim=2, circuit=circuit) with pytest.raises(ValueError): qgan = models.StyleQGAN(latent_dim=2, layers=2, set_parameters=lambda x: x) reference_distribution = generate_distribution(10) qgan = models.StyleQGAN(latent_dim=2, circuit=circuit, set_parameters=lambda x: x) with pytest.raises(ValueError): qgan.fit(reference_distribution, save=False) initial_params = np.random.uniform(-0.15, 0.15, 18) qgan = models.StyleQGAN(latent_dim=2, layers=2) with pytest.raises(ValueError): qgan.fit(reference_distribution, initial_params=initial_params, save=False) qibo.set_backend(original_backend)
def test_qgan_circuit_error(): if not K.check_availability("tensorflow"): # pragma: no cover pytest.skip("Skipping StyleQGAN test because tensorflow backend is not available.") original_backend = qibo.get_backend() qibo.set_backend("tensorflow") reference_distribution = generate_distribution(10) # use wrong number of qubits so that we capture the error nqubits = reference_distribution.shape[1] + 1 nlayers = 1 circuit = models.Circuit(nqubits) for l in range(nlayers): for q in range(nqubits): circuit.add(gates.RY(q, 0)) circuit.add(gates.RZ(q, 0)) for i in range(0, nqubits - 1): circuit.add(gates.CZ(i, i + 1)) circuit.add(gates.CZ(nqubits - 1, 0)) for q in range(nqubits): circuit.add(gates.RY(q, 0)) initial_params = np.random.uniform(-0.15, 0.15, 18) qgan = models.StyleQGAN( latent_dim=2, circuit=circuit, set_parameters=lambda x: x ) with pytest.raises(ValueError): qgan.fit(reference_distribution, initial_params=initial_params, n_epochs=1, save=False) qibo.set_backend(original_backend)
def test_custom_qgan(): if not K.check_availability("tensorflow"): # pragma: no cover pytest.skip("Skipping StyleQGAN test because tensorflow backend is not available.") original_backend = qibo.get_backend() qibo.set_backend("tensorflow") def set_params(circuit, params, x_input, i): """Set the parameters for the quantum generator circuit.""" p = [] index = 0 noise = 0 for l in range(1): for q in range(3): p.append(params[index]*x_input[noise][i] + params[index+1]) index+=2 noise=(noise+1)%2 p.append(params[index]*x_input[noise][i] + params[index+1]) index+=2 noise=(noise+1)%2 for q in range(3): p.append(params[index]*x_input[noise][i] + params[index+1]) index+=2 noise=(noise+1)%2 circuit.set_parameters(p) nqubits = 3 nlayers = 1 reference_distribution = generate_distribution(10) circuit = models.Circuit(nqubits) for l in range(nlayers): for q in range(nqubits): circuit.add(gates.RY(q, 0)) circuit.add(gates.RZ(q, 0)) for i in range(0, nqubits - 1): circuit.add(gates.CZ(i, i + 1)) circuit.add(gates.CZ(nqubits - 1, 0)) for q in range(nqubits): circuit.add(gates.RY(q, 0)) initial_params = np.random.uniform(-0.15, 0.15, 18) qgan = models.StyleQGAN( latent_dim=2, circuit=circuit, set_parameters=set_params ) qgan.fit(reference_distribution, initial_params=initial_params, n_epochs=1, save=False) assert qgan.latent_dim == 2 assert qgan.batch_samples == 128 assert qgan.n_epochs == 1 assert qgan.lr == 0.5 qibo.set_backend(original_backend)
def test_default_qgan(): if not K.check_availability("tensorflow"): # pragma: no cover pytest.skip("Skipping StyleQGAN test because tensorflow backend is not available.") original_backend = qibo.get_backend() qibo.set_backend("tensorflow") reference_distribution = generate_distribution(10) qgan = models.StyleQGAN(latent_dim=2, layers=1) qgan.fit(reference_distribution, n_epochs=1, save=False) assert qgan.layers == 1 assert qgan.latent_dim == 2 assert qgan.batch_samples == 128 assert qgan.n_epochs == 1 assert qgan.lr == 0.5 qibo.set_backend(original_backend)
def test_qgan_custom_discriminator(): if not K.check_availability("tensorflow"): # pragma: no cover pytest.skip("Skipping StyleQGAN test because tensorflow backend is not available.") from tensorflow.keras.models import Sequential # pylint: disable=E0611,E0401 from tensorflow.keras.layers import Dense # pylint: disable=E0611,E0401 original_backend = qibo.get_backend() qibo.set_backend("tensorflow") reference_distribution = generate_distribution(10) # use wrong number of qubits so that we capture the error nqubits = reference_distribution.shape[1] + 1 discriminator = Sequential() discriminator.add(Dense(200, use_bias=False, input_dim=nqubits)) discriminator.add(Dense(1, activation='sigmoid')) qgan = models.StyleQGAN(latent_dim=2, layers=1, discriminator=discriminator) with pytest.raises(ValueError): qgan.fit(reference_distribution, n_epochs=1, save=False) qibo.set_backend(original_backend)