Example #1
0
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)
Example #2
0
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)
Example #3
0
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)
Example #4
0
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)
Example #5
0
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)