def test_PrepareAndMeasureOnWFSim_QubitPlaceholders():
    q1, q2 = QubitPlaceholder(), QubitPlaceholder()
    p = Program()
    params = p.declare("params", memory_type="REAL", memory_size=2)
    p.inst(RX(params[0], q1))
    p.inst(RX(params[1], q2))

    def make_memory_map(params):
        return {"params": params}

    ham = PauliSum([PauliTerm("Z", q1), PauliTerm("Z", q2)])
    qubit_mapping = get_default_qubit_mapping(p)
    sim = WavefunctionSimulator()
    with local_qvm():
        cost_fn = PrepareAndMeasureOnWFSim(
            p,
            make_memory_map,
            ham,
            sim,
            enable_logging=True,
            qubit_mapping=qubit_mapping,
            scalar_cost_function=False,
        )
        out = cost_fn([np.pi, np.pi / 2], nshots=100)
        assert np.allclose(cost_fn.log[0].fun, (-1.0, 0.1))
        assert np.allclose(out, (-1, 0.1))
def test_PrepareAndMeasureOnQVM_QubitPlaceholders_nondiag_hamiltonian():
    q1, q2, q3 = QubitPlaceholder(), QubitPlaceholder(), QubitPlaceholder()
    ham = PauliTerm("Y", q1) * PauliTerm("Z", q3)
    ham += PauliTerm("Y", q1) * PauliTerm("Z", q2, -0.3)
    ham += PauliTerm("Y", q1) * PauliTerm("X", q3, 2.0)
    params = [3.0, 0.4, 4.5]

    prepare_ansatz = Program()
    param_register = prepare_ansatz.declare("params",
                                            memory_type="REAL",
                                            memory_size=3)
    prepare_ansatz.inst(RX(param_register[0], q1))
    prepare_ansatz.inst(RY(param_register[1], q2))
    prepare_ansatz.inst(RY(param_register[2], q3))

    def make_memory_map(params):
        return {"params": params}

    qubit_mapping = get_default_qubit_mapping(prepare_ansatz)
    qvm = get_qc("3q-qvm")
    with local_qvm():
        cost_fn = PrepareAndMeasureOnQVM(prepare_ansatz,
                                         make_memory_map,
                                         qvm=qvm,
                                         hamiltonian=ham,
                                         scalar_cost_function=False,
                                         base_numshots=100,
                                         qubit_mapping=qubit_mapping)
        out = cost_fn(params, nshots=10)
        assert np.allclose(out, (0.346, 0.07), rtol=1.1)
def test_PrepareAndMeasureOnQVM_QubitPlaceholders():
    q1, q2 = QubitPlaceholder(), QubitPlaceholder()
    prepare_ansatz = Program()
    param_register = prepare_ansatz.declare("params",
                                            memory_type="REAL",
                                            memory_size=2)
    prepare_ansatz.inst(RX(param_register[0], q1))
    prepare_ansatz.inst(RX(param_register[1], q2))

    def make_memory_map(params):
        return {"params": params}

    ham = PauliSum([PauliTerm("Z", q1), PauliTerm("Z", q2)])
    qubit_mapping = get_default_qubit_mapping(prepare_ansatz)
    qvm = get_qc("2q-qvm")
    with local_qvm():
        #        qvm = proc.qvm
        cost_fn = PrepareAndMeasureOnQVM(prepare_ansatz,
                                         make_memory_map,
                                         qvm=qvm,
                                         hamiltonian=ham,
                                         enable_logging=True,
                                         scalar_cost_function=False,
                                         base_numshots=10,
                                         qubit_mapping=qubit_mapping)
        out = cost_fn([np.pi, np.pi / 2], nshots=10)
        assert np.allclose(cost_fn.log[0].fun, (-1.0, 0.1), rtol=1.1)
        assert np.allclose(out, (-1, 0.1), rtol=1.1)
Beispiel #4
0
def test_append_measure_register():
    q0 = QubitPlaceholder()
    p = Program(H(q0), RX(np.pi/2, 0))
    p = append_measure_register(p)
    assert str(p[-1]) == "MEASURE 0 ro[1]"
import matplotlib.pyplot as plt
from pytest import raises

from entropica_qaoa.qaoa.cost_function import QAOACostFunctionOnWFSim
from pyquil.api import WavefunctionSimulator

from pyquil.paulis import PauliSum, PauliTerm
from pyquil.quil import QubitPlaceholder, Qubit

from entropica_qaoa.qaoa.parameters import (
    ExtendedParams, StandardWithBiasParams, AnnealingParams, FourierParams,
    FourierWithBiasParams, FourierExtendedParams, QAOAParameterIterator,
    AbstractParams, StandardParams, _is_iterable_empty)

# build a hamiltonian to test everything on
q1 = QubitPlaceholder()
# hamiltonian = PauliSum.from_compact_str("1.0*Z0Z1")
hamiltonian = PauliTerm("Z", 0)
hamiltonian *= PauliTerm("Z", 1)
hamiltonian += PauliTerm("Z", q1, 0.5)
next_term = PauliTerm("Z", 0, -2.0)
next_term *= PauliTerm("Z", q1)
hamiltonian += next_term

ham_wo_bias = PauliSum.from_compact_str("1*Z0Z1 + 0.5*Z1Z2 + 0.7*Z2Z2")

# TODO test fourier params
# TODO Test set_hyperparameters and update_variable_parameters


def test_is_iterable_empty():
Beispiel #6
0
from entropica_qaoa.utilities import (random_hamiltonian,
                                      distances_dataset,
                                      gaussian_2Dclusters,
                                      hamiltonian_from_hyperparams,
                                      graph_from_hamiltonian,
                                      graph_from_hyperparams,
                                      hamiltonian_from_graph,
                                      random_k_regular_graph,
                                      plot_graph,
                                      hamiltonian_from_distances,
                                      ring_of_disagrees)

from entropica_qaoa.qaoa.parameters import StandardParams
from entropica_qaoa.qaoa.cost_function import QAOACostFunctionOnWFSim

q1, q2 = QubitPlaceholder(), QubitPlaceholder()
reg = [0, 1, 3, q1, q2]
singles = [0, 3, q1]
biases = [0.4, -0.3, 1.2]
pairs = [(0, 1), (3, q1), (q2, 0)]
couplings = [1.2, 3.4, 4.5]

single_terms = [c * sZ(q) for c, q in zip(biases, singles)]
pair_terms = [c * sZ(q[0]) * sZ(q[1]) for c, q in zip(couplings, pairs)]
hamiltonian = PauliSum([*single_terms, *pair_terms])

graph = nx.Graph()
for node, weight in zip(singles, biases):
    graph.add_node(node, weight=weight)
for edge, weight in zip(pairs, couplings):
    graph.add_edge(edge[0], edge[1], weight=weight)