diff --git a/.github/workflows/ci_optimizers.yml b/.github/workflows/ci_optimizers.yml new file mode 100644 index 00000000..be7203df --- /dev/null +++ b/.github/workflows/ci_optimizers.yml @@ -0,0 +1,39 @@ +# This workflow will install Python dependencies, run tests and lint with a variety of Python versions +# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions + +name: Tequila-Test-Optimizers + +on: + push: + branches: [ master, devel ] + pull_request: + branches: [ master, devel ] + +jobs: + + build: + + runs-on: ubuntu-latest + strategy: + matrix: + python-version: [3.6, 3.7, 3.8] + + steps: + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v1 + with: + python-version: ${{ matrix.python-version }} + - name: Install quantum backends + run: | + pip install --upgrade cirq qiskit qulacs + + - name: Install and test GPyOpt interface (no qibo) + run: | + python -m pip install --upgrade pip + pip install --upgrade -r requirements.txt + pip install --upgrade -r requirements_gpyopt.txt + pip install -e . + + pytest tests/test_gpyopt.py --slow + diff --git a/README.md b/README.md index b89d0a81..41d53820 100644 --- a/README.md +++ b/README.md @@ -6,9 +6,9 @@ Tequila is an Extensible Quantum Information and Learning Architecture where the It operates on abstract data structures allowing the formulation, combination, automatic differentiation and optimization of generalized objectives. Tequila can execute the underlying quantum expectation values on state of the art simulators as well as on real quantum devices. -[You can get an overview from this presentation](/docs/tequila.pdf) +[You can get an overview from this presentation](/docs/tequila.pdf) or from it's [video recording](https://www.youtube.com/watch?v=hUdf0P2fW2E) -[Get started with our Tutorials](/tutorials/) +[Get started with our Tutorials](https://github.com/aspuru-guzik-group/tequila-tutorials) or checkout our [overview article](https://arxiv.org/abs/2011.03057) @@ -22,12 +22,23 @@ Currently supported Tequila detects backends automatically if they are installed on your systems. All of them are available over standard pip installation like for example `pip install qulacs`. -For best performance tt is recommended to have `qulacs` installed. +For best performance it is recommended to have `qulacs` installed. # QuantumChemistry: -Tequila supports [Psi4](https://github.com/psi4/psi4). +Currently supported +- [Psi4](https://github.com/psi4/psi4). In a conda environment this can be installed with -`conda install psi4 -c psi4` +```bash +conda install psi4 -c psi4 +``` +Here is a small [tutorial](https://github.com/aspuru-guzik-group/tequila-tutorials/blob/main/Chemistry.ipynb) that illustrates the usage. + +- [Madness](https://github.com/kottmanj/madness) +Currently you need to compile from a separate [fork](https://github.com/kottmanj/madness). +See the github page of this fork for installation instruction. +Note that the madness interface is currently only available on the `devel` branch of tequila (coming to master soon). +Here is a small [tutorial](https://github.com/aspuru-guzik-group/tequila-tutorials/blob/main/ChemistryMadnessInterface.ipynb) that illustrates the usage. + # Installation We recommend installing in editable mode with @@ -124,6 +135,10 @@ Quantum Computer-Aided design of Quantum Optics Hardware. [arxiv.org/abs/2006.03075](https://arxiv.org/abs/2006.03075) [example code](https://github.com/kottmanj/Photonic) +A. Anand, M. Degroote, A. Aspuru-Guzik. +Natural Evolutionary Strategies for Variational Quantum Computation. +[arxiv.org/abs/2012.00101](https://arxiv.org/abs/2012.00101) + Let us know, if you want your research project to be included in this list! # Dependencies @@ -185,4 +200,5 @@ They can be installed for example over visual studio. Tequila runs on Macs OSX. You might get in trouble with installing qulacs since it currently does not work with Apple's clang compiler. You need to install latest GNU compile (at least gcc-7 and g++7) and set them as default before installing qulacs over pip. - +## Qibo and GPyOpt +Currently you can't use Qibo and GPyOpt within the same environment diff --git a/requirements.txt b/requirements.txt index 4c046f2c..2a665c29 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,7 +6,7 @@ jaxlib #autograd # use if jaxlib gives you trouble, make sure jax is uninstalled then setuptools pytest -openfermion +openfermion <= 0.11* cmake # needed by qulacs, can be removed otherwise qulacs # default simulator, remove if the installation gives you trouble @@ -16,3 +16,6 @@ qulacs # default simulator, remove if the installation gives you trouble #pyquil # you need to install the forest-sdk #qulacs-gpu #qibo <= 0.1.1 + +#optional third party libraries +#pyzx diff --git a/src/tequila/__init__.py b/src/tequila/__init__.py index e3b8caa9..30be3f8e 100644 --- a/src/tequila/__init__.py +++ b/src/tequila/__init__.py @@ -14,6 +14,8 @@ INSTALLED_SAMPLERS, \ INSTALLED_SIMULATORS, SUPPORTED_BACKENDS, INSTALLED_BACKENDS, show_available_simulators from tequila.wavefunction import QubitWaveFunction +from tequila.circuit.qasm import export_open_qasm, import_open_qasm, import_open_qasm_from_file +from tequila.circuit.pyzx import convert_to_pyzx, convert_from_pyzx import tequila.quantumchemistry as chemistry # shortcut from tequila.quantumchemistry import Molecule, MoleculeFromOpenFermion diff --git a/src/tequila/circuit/_gates_impl.py b/src/tequila/circuit/_gates_impl.py index 6230ee6d..257a230f 100644 --- a/src/tequila/circuit/_gates_impl.py +++ b/src/tequila/circuit/_gates_impl.py @@ -6,6 +6,7 @@ from tequila.objective.objective import Variable, FixedVariable, assign_variable,Objective,VectorObjective from tequila.hamiltonian import PauliString, QubitHamiltonian, paulis from tequila.tools import list_assignment +from numpy import pi from dataclasses import dataclass @@ -30,11 +31,16 @@ def control(self): @property def qubits(self): - return self._qubits + # Set the active qubits + if self.control: + qubits = self.target + self.control + else: + qubits = self.target + return sorted(tuple(set(qubits))) @property def max_qubit(self): - return self._max_qubit + return self.compute_max_qubit() def extract_variables(self): return [] @@ -53,13 +59,6 @@ def __init__(self, name, target: UnionList, control: UnionList = None, generator self._target = tuple(list_assignment(target)) self._control = tuple(list_assignment(control)) self.finalize() - # Set the active qubits - if self.control: - self._qubits = self.target + self.control - else: - self._qubits = self.target - self._qubits = sorted(tuple(set(self._qubits))) - self._max_qubit = self.compute_max_qubit() self.generator = generator def copy(self): @@ -96,6 +95,16 @@ def finalize(self): for c in self.target: if c in self.control: raise Exception("control and target are the same qubit: " + self.__str__()) + if hasattr(self,"generator") and self.generator: + if set(list(self.generator.qubits)) != set(list(self.target)): + raise Exception("qubits of generator and targets don't agree -- mapping error?\n gate = {}".format(self.__str__())) + if hasattr(self, "generators"): + genq = [] + for generator in self.generators: + genq += generator.qubits + if set(list(genq)) != set(list(self.target)): + raise Exception("qubits of generator and targets don't agree -- mapping error?\n gate = {}".format(self.__str__())) + def __str__(self): result = str(self.name) + "(target=" + str(self.target) @@ -131,14 +140,12 @@ def __eq__(self, other): def map_qubits(self, qubit_map: dict): mapped = copy.deepcopy(self) mapped._target = tuple([qubit_map[i] for i in self.target]) - qubits = mapped._target if self.control is not None: mapped._control = tuple([qubit_map[i] for i in self.control]) - qubits += mapped._control - mapped._qubits = sorted(tuple(set(qubits))) - mapped._max_qubit = mapped.compute_max_qubit() - if self.generator: - mapped.generator = self.generator.map_qubits(qubit_map) + if hasattr(self, "generator") and self.generator: + mapped.generator = self.generator.map_qubits(qubit_map=qubit_map) + if hasattr(self, "generators"): + mapped.generators = [i.map_qubits(qubit_map=qubit_map) for i in self.generators] mapped.finalize() return mapped @@ -275,14 +282,35 @@ def __pow__(self, power, modulo=None): class PowerGateImpl(ParametrizedGateImpl): + """ + Attributes + --------- + power + numeric type (fixed exponent) or hashable type (parametrized exponent) + parameter + power multiplied by pi + to be consitent with exp(-i a/2 G) representation [a: gate.parameter, G: gate.generator] + """ - def __init__(self, name, target: list, power=None, control: list = None, generator: QubitHamiltonian = None): - super().__init__(name=name, parameter=power, target=target, control=control, generator=generator) + @property + def power(self): + return self._power + + @power.setter + def power(self, other): + self._power = assign_variable(variable=other) + + def __init__(self, name, target: list, power, control: list = None, generator: QubitHamiltonian = None): + super().__init__(name=name, parameter=power * pi, target=target, control=control, generator=generator) + self._power = assign_variable(variable=power) def dagger(self): result = copy.deepcopy(self) + result._parameter = assign_variable(-self.parameter) + result._power = assign_variable(-self.power) return result + class GeneralizedRotationImpl(DifferentiableGateImpl): """ A gate which behaves like a generalized rotation @@ -428,8 +456,3 @@ def dagger(self): angles.append(-angle) result.angles = angles return result - - def map_qubits(self, qubit_map: dict): - mapped = super().map_qubits(qubit_map=qubit_map) - mapped.generators = [generator.map_qubits(qubit_map=qubit_map) for generator in mapped.generators] - return mapped diff --git a/src/tequila/circuit/compiler.py b/src/tequila/circuit/compiler.py index f8295dae..634c90b0 100644 --- a/src/tequila/circuit/compiler.py +++ b/src/tequila/circuit/compiler.py @@ -1,6 +1,6 @@ from tequila import TequilaException from tequila.circuit.circuit import QCircuit -from tequila.circuit.gates import Rx, Ry, H, X, Rz, ExpPauli, CNOT, Phase, T, Z, Y +from tequila.circuit.gates import Rx, Ry, H, X, Rz, ExpPauli, CNOT, Phase, T, Z, Y, S, CX from tequila.circuit._gates_impl import RotationGateImpl, PhaseGateImpl, QGateImpl, \ ExponentialPauliGateImpl, TrotterizedGateImpl, PowerGateImpl from tequila.utils import to_float @@ -54,7 +54,10 @@ def __init__(self, controlled_rotation=False, swap=False, cc_max=False, - gradient_mode=False + gradient_mode=False, + ry_gate=False, + y_gate=False, + ch_gate=False ): """ @@ -93,6 +96,12 @@ def __init__(self, whether or not to break down swap gates into CNOT gates. cc_max: whether or not to break down all controlled gates with 2 or more controls. + ry_gate: + whether or not to break down all rotational y gates + y_gate: + whether or not to break down all y gates + ch_gate: + whether or not to break down all controlled-H gates """ self.multitarget = multitarget self.multicontrol = multicontrol @@ -111,6 +120,9 @@ def __init__(self, self.swap = swap self.cc_max = cc_max self.gradient_mode = gradient_mode + self.ry_gate = ry_gate + self.y_gate = y_gate + self.ch_gate = ch_gate def __call__(self, objective: typing.Union[Objective, QCircuit, ExpectationValueImpl], variables=None, *args, **kwargs): @@ -269,33 +281,35 @@ def compile_circuit(self, abstract_circuit: QCircuit, variables=None, *args, **k if self.multicontrol: raise NotImplementedError("Multicontrol compilation does not work yet") - if self.hadamard_power: - cg = compile_h_power(gate=cg) if self.phase_to_z: cg = compile_phase_to_z(gate=cg) if self.power: cg = compile_power_gate(gate=cg) if self.phase: cg = compile_phase(gate=cg) + if self.ch_gate: + cg = compile_ch(gate=cg) + if self.y_gate: + cg = compile_y(gate=cg) + if self.ry_gate: + cg = compile_ry(gate=cg, controlled_rotation=self.controlled_rotation) if controlled: if self.cc_max: - cg = compile_to_cc(gate=cg) + cg = compile_to_single_control(gate=cg) if self.controlled_exponential_pauli: cg = compile_exponential_pauli_gate(gate=cg) - if self.hadamard_power: - cg = compile_h_power(gate=cg) if self.controlled_power: - cg = compile_power_gate(gate=cg) + cg = compile_controlled_power(gate=cg) if self.controlled_phase: cg = compile_controlled_phase(gate=cg) + if self.phase: + cg = compile_phase(gate=cg) if self.toffoli: cg = compile_toffoli(gate=cg) if self.phase: cg = compile_phase(gate=cg) if self.controlled_rotation: cg = compile_controlled_rotation(gate=cg) - if self.cc_max: - cg = compile_to_cc(gate=cg) compiled_gates.append((idx, cg)) @@ -351,7 +365,7 @@ def wrapper(gate, **kwargs): return wrapper -def change_basis(target, axis, daggered=False): +def change_basis(target, axis=None, name=None, daggered=False): """ helper function; returns circuit that performs change of basis. Parameters @@ -368,6 +382,19 @@ def change_basis(target, axis, daggered=False): QCircuit that performs change of basis on target qubit onto desired axis """ + if axis is None and name is None: + raise TequilaException('axis or name must be given.') + + if name: + name = name.lower() + if name in ['h', 'hadamard'] and daggered: + return Ry(angle=numpy.pi / 4, target=target) + elif name in ['h', 'hadamard']: + return Ry(angle=-numpy.pi / 4, target=target) + else: + name_to_axis = {'rx': 0, 'ry': 1, 'rz': 2} + axis = name_to_axis.get(name, name) + if isinstance(axis, str): axis = RotationGateImpl.string_to_axis[axis.lower()] @@ -420,13 +447,21 @@ def compile_multitarget(gate, variables=None) -> QCircuit: return result +# return index of control qubits in Gray Code order. +def _pattern(n): + if n == 1: + return [0] + pn = _pattern(n - 1) + + return pn + [n - 1] + pn + + @compiler -def compile_controlled_rotation(gate: RotationGateImpl, angles: list = None) -> QCircuit: +def compile_controlled_rotation(gate: RotationGateImpl) -> QCircuit: """ Recompilation of a controlled-rotation gate Basis change into Rz then recompilation of controled Rz, then change basis back :param gate: The rotational gate - :param angles: new angles to set, given as a list of two. If None the angle in the gate is used (default) :return: set of gates wrapped in QCircuit class """ @@ -436,20 +471,22 @@ def compile_controlled_rotation(gate: RotationGateImpl, angles: list = None) -> if not isinstance(gate, RotationGateImpl): return QCircuit.wrap_gate(gate) - if angles is None: - angles = [gate.parameter / 2, -gate.parameter / 2] - if len(gate.target) > 1: - return compile_controlled_rotation(gate=compile_multitarget(gate=gate), angles=angles) + return compile_controlled_rotation(gate=compile_multitarget(gate=gate)) target = gate.target control = gate.control + k = len(control) + cind = _pattern(k) + [k - 1] + result = QCircuit() result += change_basis(target=target, axis=gate._axis) - result += RotationGateImpl(axis="z", target=target, angle=angles[0]) - result += QGateImpl(name="X", target=target, control=control) - result += RotationGateImpl(axis="Z", target=target, angle=angles[1]) - result += QGateImpl(name="X", target=target, control=control) + coeff = - 1 / pow(2, k) + for i, ci in enumerate(cind): + coeff *= -1 + + result += Rz(target=target, angle=coeff * gate.parameter) + result += CNOT(control[ci], target) result += change_basis(target=target, axis=gate._axis, daggered=True) result.n_qubits = result.max_qubit() + 1 @@ -457,9 +494,9 @@ def compile_controlled_rotation(gate: RotationGateImpl, angles: list = None) -> @compiler -def compile_to_cc(gate) -> QCircuit: +def compile_to_single_control(gate) -> QCircuit: """ - break down a gate into a sequence with no more than double-controlled gates. + break down a gate into a sequence with no more than single-controlled gates. Parameters ---------- gate: @@ -474,7 +511,7 @@ def compile_to_cc(gate) -> QCircuit: cl = len(gate.control) target = gate.target control = gate.control - if cl <= 2: + if cl <= 1: return QCircuit.wrap_gate(gate) name = gate.name back = QCircuit() @@ -484,13 +521,14 @@ def compile_to_cc(gate) -> QCircuit: else: power = 1.0 new = PowerGateImpl(name=name, power=power, target=target, control=control) - back += compile_power_gate(gate=new, cut=True) + partial = compile_power_gate(gate=new) + back += compile_to_single_control(gate=partial) elif isinstance(gate, RotationGateImpl): partial = compile_controlled_rotation(gate=gate) - back += compile_to_cc(gate=partial) + back += compile_to_single_control(gate=partial) elif isinstance(gate, PhaseGateImpl): partial = compile_controlled_phase(gate=gate) - back += compile_to_cc(gate=partial) + back += compile_to_single_control(gate=partial) else: print(gate) raise TequilaException('frankly, what the fuck is this gate?') @@ -538,7 +576,7 @@ def compile_toffoli(gate) -> QCircuit: @compiler -def compile_power_gate(gate, cut=False) -> QCircuit: +def compile_power_gate(gate) -> QCircuit: """ break down power gates into the rotation gates. Parameters @@ -552,83 +590,16 @@ def compile_power_gate(gate, cut=False) -> QCircuit: """ if not isinstance(gate, PowerGateImpl): return QCircuit.wrap_gate(gate) - if gate.name.lower() in ['h', 'hadamard']: - return QCircuit.wrap_gate(gate=gate) if not gate.is_controlled(): return compile_power_base(gate=gate) - return power_recursor(gate=gate, cut=cut) - - -@compiler -def power_recursor(gate, cut=False) -> QCircuit: - """ - recursive function for decomposing parametrized, possibly controlled, power gates. - Parameters - ---------- - gate: - the gate. - cut: bool: - whether or not to stop recursion at 2 controls maximum. - Default: False. - Returns - ------- - A QCircuit; the result of compilation. - """ - - result = QCircuit() - cl = 0 - if gate.is_controlled(): - cl = len(gate.control) - if cl == 0: - return compile_power_base(gate=gate) - elif cl == 1: - return get_axbxc_decomp(gate=gate) - - elif cl == 2 and not cut: - v = type(gate)(name=gate.name, power=gate.parameter / 2, target=gate.target, control=gate.control[1]) - result += get_axbxc_decomp(v) - result += CNOT(gate.control[0], gate.control[1]) - vdag = type(gate)(name=gate.name, power=gate.parameter / 2, target=gate.target, - control=gate.control[1]).dagger() - result += get_axbxc_decomp(vdag) - result += CNOT(gate.control[0], gate.control[1]) - again = type(gate)(name=gate.name, power=gate.parameter / 2, target=gate.target, control=gate.control[0]) - result += get_axbxc_decomp(again) - - elif cl == 2 and cut: - if gate.name in ['CCx', 'CCNOT', 'CCX', 'X']: - return QCircuit.wrap_gate(gate) - else: - v = type(gate)(name=gate.name, power=gate.parameter / 2, target=gate.target, control=gate.control[1]) - result += get_axbxc_decomp(v) - result += CNOT(gate.control[0], gate.control[1]) - vdag = type(gate)(name=gate.name, power=gate.parameter / 2, target=gate.target, - control=gate.control[1]).dagger() - result += get_axbxc_decomp(vdag) - result += CNOT(gate.control[0], gate.control[1]) - again = type(gate)(name=gate.name, power=gate.parameter / 2, target=gate.target, control=gate.control[0]) - result += get_axbxc_decomp(again) - - else: - v = type(gate)(name=gate.name, power=gate.parameter / 2, target=gate.target, control=gate.control[-1]) - result += get_axbxc_decomp(v) - result += CNOT(target=gate.control[cl - 1], control=gate.control[0:cl - 1]) - vdag = type(gate)(name=gate.name, power=gate.parameter / 2, target=gate.target, - control=gate.control[-1]).dagger() - result += get_axbxc_decomp(vdag) - result += CNOT(target=gate.control[cl - 1], control=gate.control[0:cl - 1]) - rebuild = type(gate)(name=gate.name, power=gate.parameter / 2, target=gate.target, - control=gate.control[:cl - 1]) - result += power_recursor(gate=rebuild, cut=cut) - - return result + return compile_controlled_power(gate=gate) @compiler def compile_power_base(gate): """ - Base case of power_recursor: convert a 1-qubit parametrized power gate into rotation gates. + Base case of compile_power_gate: convert a 1-qubit parametrized power gate into rotation gates. Parameters ---------- gate: @@ -640,10 +611,20 @@ def compile_power_base(gate): """ if not isinstance(gate, PowerGateImpl): return QCircuit.wrap_gate(gate) - power = gate.parameter - if gate.name in ['H', 'h', 'Hadamard', 'hadamard']: - return compile_h_power(gate=gate) - if gate.name == 'X': + + if gate.is_controlled(): + return QCircuit.wrap_gate(gate) + + power = gate.power + if gate.name.lower() in ['h', 'hadamard']: + ### off by global phase of Exp[ pi power /2] + theta = power * numpy.pi + + result = QCircuit() + result += Ry(angle=-numpy.pi / 4, target=gate.target) + result += Rz(angle=theta, target=gate.target) + result += Ry(angle=numpy.pi / 4, target=gate.target) + elif gate.name == 'X': ### off by global phase of Exp[ pi power /2] ''' if we wanted to do it formally we would use the following @@ -676,362 +657,36 @@ def compile_power_base(gate): @compiler -def get_axbxc_decomp(gate): - """ - Break down single controlled parametrized power gates into CNOT and rotations. - Parameters - ---------- - gate: - the gate. - - Returns - ------- - QCircuit; the result of compilation. - """ - - if not isinstance(gate, PowerGateImpl) or gate.name not in ['X', 'Y', 'Z']: - return QCircuit.wrap_gate(gate) - power = gate.parameter - target = gate.target - result = QCircuit() - if gate.name == 'X': - a = -numpy.pi / 2 - b = numpy.pi / 2 - theta = power * numpy.pi - - ''' - result+=Phase(numpy.pi*power/2,gate.control) - result+=Rz(-(a-b)/2,target) - result+=CNOT(gate.control,target) - #result+=Rz(-(a+b)/2,target) - result+=Ry(-theta/2,target) - result+=CNOT(gate.control,target) - result+=Ry(theta/2,target) - result+=Rz(a,target=target) - ''' - - ''' - result+=Rz((a-b)/2,target) - result+=CNOT(gate.control,target) - #result+=Rz(-(a+b)/2,target) - result+=Ry(-theta/2,target) - result+=CNOT(gate.control,target) - result+=Ry(theta/2,target) - result+=Rz(a,target) - result += Phase(numpy.pi * power / 2, gate.control) - ''' - result += Rx(angle=theta, target=target, control=gate.control) - result += Phase(numpy.pi * power / 2, gate.control) - - elif gate.name == 'Y': - ### off by global phase of Exp[ pi power /2] - - theta = power * numpy.pi - - ''' - result+=Phase(numpy.pi*power/2,gate.control) - result+=CNOT(gate.control,target) - result+=Ry(-theta/2,target) - result+=CNOT(gate.control,target) - result+=Ry(theta/2,target) - ''' - a = 0 - b = 0 - # result+=Rz((a-b)/2,target) - result += CNOT(gate.control, target) - # result+=Rz(-(a+b)/2,target) - result += Ry(-theta / 2, target) - result += CNOT(gate.control, target) - result += Ry(theta / 2, target) - # result+=Rz(a,target) - result += Phase(numpy.pi * power / 2, gate.control) - - - - elif gate.name == 'Z': - a = 0 - b = power * numpy.pi - theta = 0 - - result += Rz(b / 2, target) - result += CNOT(gate.control, target) - result += Rz(-b / 2, target) - result += CNOT(gate.control, target) - # result+=Rz(a,target) - result += Phase(numpy.pi * power / 2, gate.control) - - ''' - result+=Rz(b/2,target) - result+=CNOT(gate.control,target) - result+=Rz(-b/2,target) - result+=CNOT(gate.control,target) - ''' - return result - - -@compiler -def compile_h_power(gate) -> QCircuit: +def compile_controlled_power(gate: PowerGateImpl) -> QCircuit: """ - compile hadamard to some power. - Parameters - ---------- - gate: - the gate. - - Returns - ------- - QCircuit, the result of compilation. + Recompilation of a controlled-power gate + Basis change into Z then recompilation of controled Z, then change basis back + :param gate: The power gate + :return: set of gates wrapped in QCircuit class """ - if not isinstance(gate, PowerGateImpl) or gate.name not in ['H', 'h', 'hadamard']: - return QCircuit.wrap_gate(gate) - if not gate.is_controlled(): - return hadamard_base(gate=gate) - return hadamard_recursor(gate=gate) - - -@compiler -def hadamard_base(gate) -> QCircuit: - """ - base case for hadamard compilation; returns powers of hadamard as sequence of single qubit rotations. - Parameters - ---------- - gate: - the gate. - - Returns - ------- - A QCircuit; the result of compilation. - """ - if not isinstance(gate, PowerGateImpl) or gate.name not in ['H', 'h', 'hadamard']: return QCircuit.wrap_gate(gate) - power = gate.parameter - a = power.wrap(a_calc) - b = power.wrap(b_calc) - theta = power.wrap(theta_calc) - - result = QCircuit() - result += Rz(angle=b, target=gate.target) - result += Ry(angle=theta, target=gate.target) - result += Rz(angle=a, target=gate.target) - - return result - - -@compiler -def hadamard_axbxc(gate) -> QCircuit: - """ - Decompose 1 control parametrized hadamard into single qubit rotation and CNOT. - Parameters - ---------- - gate: - the gate - - Returns - ------- - QCircuit, the result of compilation. - """ - if not isinstance(gate, PowerGateImpl) or gate.name not in ['H', 'h', 'hadamard']: + if not isinstance(gate, PowerGateImpl): return QCircuit.wrap_gate(gate) - power = gate.parameter - target = gate.target - a = power.wrap(a_calc) - b = power.wrap(b_calc) - theta = power.wrap(theta_calc) - phase = power * jnp.pi / 2 - - result = QCircuit() - result += Rz((a - b) / 2, target) - result += CNOT(gate.control, target) - result += Rz(-(a + b) / 2, target) - result += Ry(-theta / 2, target) - result += CNOT(gate.control, target) - result += Ry(theta / 2, target) - result += Rz(a, target) - result += Phase(numpy.pi * power / 2, gate.control) - - return result - - -@compiler -def hadamard_recursor(gate) -> QCircuit: - """ - recursive function for decomposing parametrized hadamard, potentially with controls. - Parameters - ---------- - gate: - the gate. - - Returns - ------- - QCircuit, the result of compilation. + if len(gate.target) > 1: + return compile_controlled_power(gate=compile_multitarget(gate=gate)) - """ + power = gate.power + target = gate.target + control = gate.control - if not isinstance(gate, PowerGateImpl) or gate.name not in ['H', 'h', 'hadamard']: - return QCircuit.wrap_gate(gate) result = QCircuit() - cl = 0 - if gate.is_controlled(): - cl = len(gate.control) - if cl == 0: - return hadamard_base(gate) - if cl == 1: - return hadamard_axbxc(gate) - - if cl == 2: - v = type(gate)(name=gate.name, power=gate.parameter / 2, target=gate.target, control=gate.control[1]) - result += hadamard_axbxc(v) - result += CNOT(gate.control[0], gate.control[1]) - vdag = type(gate)(name=gate.name, power=gate.parameter / 2, target=gate.target, - control=gate.control[1]).dagger() - result += hadamard_axbxc(vdag) - result += CNOT(gate.control[0], gate.control[1]) - again = type(gate)(name=gate.name, power=gate.parameter / 2, target=gate.target, control=gate.control[0]) - result += hadamard_axbxc(again) + result += Phase(target=control[0], control=control[1:], phi=power * pi / 2) + result += change_basis(target=target, name=gate.name) + result += Rz(target=target, control=control, angle=power * pi) + result += change_basis(target=target, name=gate.name, daggered=True) - else: - v = type(gate)(name=gate.name, power=gate.parameter / 2, target=gate.target, control=gate.control[-1]) - result += hadamard_axbxc(v) - result += CNOT(target=gate.control[cl - 1], control=gate.control[0:cl - 1]) - vdag = type(gate)(name=gate.name, power=gate.parameter / 2, target=gate.target, - control=gate.control[-1]).dagger() - result += hadamard_axbxc(vdag) - result += CNOT(target=gate.control[cl - 1], control=gate.control[0:cl - 1]) - rebuild = type(gate)(name=gate.name, power=gate.parameter / 2, target=gate.target, - control=gate.control[:cl - 1]) - result += hadamard_recursor(rebuild) + result.n_qubits = result.max_qubit() + 1 return result -def exp(x): - """ - helper for hadamard decomp. - """ - return jnp.exp(1j * pi * x) - - -def root_exp(x): - """ - helper for hadamard decomp. - """ - return jnp.sqrt(exp(x)) - - -def neg_half_exp(x): - """ - helper for hadamard decomp. - """ - return jnp.exp(-1j * pi * x / 2) - - -def exp_min_1(x): - """ - helper for hadamard decomp. - """ - return exp(x) - 1 - - -def top_a(x): - """ - helper for hadamard decomp. - """ - return root_exp(x) * exp_min_1(x) * neg_half_exp(x) - - -def under_right(x): - """ - helper for hadamard decomp. - """ - return 3 + 2 * jnp.sqrt(2) + exp(x) - - -def bottom(x): - """ - helper for hadamard decomp. - """ - return jnp.sqrt(exp_min_1(x) * under_right(x)) - - -def my_cosecant(x): - """ - helper for hadamard decomp. - """ - return 1 / jnp.sin(pi * x / 2) - - -def back_log_in(x): - """ - helper for hadamard decomp. - """ - return -1 + 2 * (my_cosecant(x) ** 2) - - -def first_log_a(x): - """ - helper for hadamard decomp. - """ - return 4 * jnp.log(top_a(x) / bottom(x)) - - -def second_log_a(x): - """ - helper for hadamard decomp. - """ - return jnp.log(back_log_in(x)) - - -def a_calc(x): - """ - helper for hadamard decomp. - """ - return jnp.real((-(0.5) * 1j * (2 * jnp.arcsinh(1) + first_log_a(x) + second_log_a(x)))) - - -def top_right_in(x): - """ - helper for hadamard decomp. - """ - return ((3 + jnp.cos(pi * x)) * (jnp.sin(pi * x / 2) ** 2)) ** (1 / 4) - - -def top_b(x): - """ - helper for hadamard decomp. - """ - return -(2 ** (3 / 4)) * root_exp(x) * top_right_in(x) - - -def log_b(x): - """ - helper for hadamard decomp. - """ - return 2 * jnp.log(top_b(x) / bottom(x)) - - -def b_calc(x): - """ - helper for hadamard decomp. - """ - return jnp.real((-1j * (jnp.arcsinh(1) + log_b(x)))) - - -def in_the_arc(x): - """ - helper for hadamard decomp. - """ - return -2 / (jnp.sqrt(3 + jnp.cos(pi * x))) - - -def theta_calc(x): - """ - helper for hadamard decomp. - """ - return jnp.real(2 * jnp.arccos(1 / in_the_arc(x))) - - @compiler def compile_phase(gate) -> QCircuit: """ @@ -1052,18 +707,15 @@ def compile_phase(gate) -> QCircuit: if len(gate.control) == 0: return Rz(angle=phase, target=gate.target) - if len(gate.control) == 1: - result += Rz(angle=phase / 2, target=gate.control, control=None) - result += Rz(angle=phase, target=gate.target, control=gate.control) - return result - else: - return compile_controlled_phase(gate) + result = compile_controlled_phase(gate) + result = compile_phase(result) + return result @compiler -def compile_phase_to_z(gate) -> QCircuit: +def compile_controlled_phase(gate) -> QCircuit: """ - Compile phase gate to parametrized Z gate. + Compile multi-controlled phase gates to 1q - phase gate and multi-controlled Rz gates. Parameters ---------- gate: @@ -1072,18 +724,25 @@ def compile_phase_to_z(gate) -> QCircuit: Returns ------- QCircuit, the result of compilation. - """ if not isinstance(gate, PhaseGateImpl): return QCircuit.wrap_gate(gate) + + if len(gate.control) == 0: + return QCircuit.wrap_gate(gate) + phase = gate.parameter - return Z(power=phase / pi, target=gate.target, control=gate.control) + + result = QCircuit() + result += Phase(target=gate.control[0], control=gate.control[1:], phi=phase / 2) + result += Rz(target=gate.target, control=gate.control, angle=phase) + return compile_controlled_phase(result) @compiler -def compile_controlled_phase(gate) -> QCircuit: +def compile_phase_to_z(gate) -> QCircuit: """ - Compile multi-controlled phase gates. + Compile phase gate to parametrized Z gate. Parameters ---------- gate: @@ -1092,31 +751,12 @@ def compile_controlled_phase(gate) -> QCircuit: Returns ------- QCircuit, the result of compilation. + """ if not isinstance(gate, PhaseGateImpl): return QCircuit.wrap_gate(gate) - if len(gate.control) == 0: - return QCircuit.wrap_gate(gate) - count = len(gate.control) - result = QCircuit() phase = gate.parameter - - if count == 1: - result += H(target=gate.target) - result += CNOT(gate.control, gate.target) - result += H(target=gate.target) - result += Phase(gate.parameter + numpy.pi, target=gate.target) - elif count == 2: - result += Rz(angle=phase / (2 ** 2), target=gate.control[0]) - result += Rz(angle=phase / (2 ** (1)), target=gate.control[1], control=gate.control[0]) - result += Rz(angle=phase, target=gate.target, control=gate.control) - - elif count >= 3: - result += Rz(angle=phase / (2 ** count), target=gate.control[0]) - for i in range(1, count): - result += Rz(angle=phase / (2 ** (count - i)), target=gate.control[i], control=gate.control[0:i]) - result += Rz(angle=phase, target=gate.target, control=gate.control) - return result + return Z(power=phase / pi, target=gate.target, control=gate.control) @compiler @@ -1135,15 +775,16 @@ def compile_swap(gate) -> QCircuit: if gate.name.lower() == "swap": if len(gate.target) != 2: raise TequilaCompilerException("SWAP gates needs two targets") - if hasattr(gate, "power") and gate.parameter != 1: - raise TequilaCompilerException("SWAP gate with power can not be compiled into CNOTS") + power = 1 + if hasattr(gate, "power"): + power = gate.power c = [] if gate.control is not None: c = gate.control - return X(target=gate.target[0], control=[gate.target[1]] + list(c)) \ - + X(target=gate.target[1], control=[gate.target[0]] + list(c)) \ - + X(target=gate.target[0], control=[gate.target[1]] + list(c)) + return X(target=gate.target[0], control=[gate.target[1]]) \ + + X(target=gate.target[1], control=[gate.target[0]] + list(c), power=power) \ + + X(target=gate.target[0], control=[gate.target[1]]) else: return QCircuit.wrap_gate(gate) @@ -1223,11 +864,11 @@ def do_compile_trotterized_gate(generator, steps, factor, randomize, control): if randomize: numpy.random.shuffle(paulistrings) for ps in paulistrings: - if len(ps._data) == 0: - print("ignoring constant term in trotterized gate") - continue coeff = to_float(ps.coeff) - circuit += ExpPauli(paulistring=ps.naked(), angle=factor * coeff, control=control) + if len(ps._data) == 0 and len(control) > 0: + circuit += Phase(target=control[0], control=control[1:], phi=-factor * coeff / 2) + else: + circuit += ExpPauli(paulistring=ps.naked(), angle=factor * coeff, control=control) return circuit @@ -1296,3 +937,76 @@ def compile_trotterized_gate(gate, compile_exponential_pauli: bool = False): return compile_exponential_pauli_gate(result) else: return result + + +@compiler +def compile_ry(gate: RotationGateImpl, controlled_rotation: bool = False) -> QCircuit: + """ + Compile Ry gates into Rx and Rz. + Parameters + ---------- + gate: + the gate. + controlled_rotation: + determines if the decomposition of the controlled-Ry gate will be performed in compile_controlled_rotation, + if not, decomposition will be performed here + + Returns + ------- + QCircuit, the result of compilation. + """ + if gate.name.lower() == "ry": + + if not (gate.is_controlled() and controlled_rotation): + + return Rz(target=gate.target, control=None, angle=-numpy.pi / 2) \ + + Rx(target=gate.target, control=gate.control, angle=gate.parameter) \ + + Rz(target=gate.target, control=None, angle=numpy.pi / 2) + + return QCircuit.wrap_gate(gate) + + +@compiler +def compile_y(gate) -> QCircuit: + """ + Compile Y gates into X and Rz. + Parameters + ---------- + gate: + the gate. + + Returns + ------- + QCircuit, the result of compilation. + """ + if gate.name.lower() == "y": + + return Rz(target=gate.target, control=None, angle=-numpy.pi / 2) \ + + X(target=gate.target, control=gate.control, power=gate.parameter if gate.is_parametrized() else None) \ + + Rz(target=gate.target, control=None, angle=numpy.pi / 2) + + else: + return QCircuit.wrap_gate(gate) + + +@compiler +def compile_ch(gate: QGateImpl) -> QCircuit: + """ + Compile CH gates into its equivalent: + CH = Ry(0.25pi) CZ Ry(-0.25pi) + Parameters + ---------- + gate: + the gate. + + Returns + ------- + QCircuit, the result of compilation. + """ + if gate.name.lower() == "h" and gate.is_controlled(): + + return Ry(target=gate.target, control=None, angle=-numpy.pi / 4) \ + + Z(target=gate.target, control=gate.control, power=gate.parameter if gate.is_parametrized() else None) \ + + Ry(target=gate.target, control=None, angle=numpy.pi / 4) + else: + return QCircuit.wrap_gate(gate) \ No newline at end of file diff --git a/src/tequila/circuit/gates.py b/src/tequila/circuit/gates.py index 510e97d5..0f40c191 100644 --- a/src/tequila/circuit/gates.py +++ b/src/tequila/circuit/gates.py @@ -688,6 +688,177 @@ def CRz(control: int, target: int, angle: float) -> QCircuit: return Rz(target=target, control=control, angle=angle) +def U(theta, phi, lambd, target: typing.Union[list, int], control: typing.Union[list, int] = None) -> QCircuit: + """ + Notes + ---------- + Convenient gate, one of the abstract gates defined by OpenQASM. + + .. math:: + U(\\theta, \\phi, \\lambda) = R_z(\\phi)R_x(-\\pi/2)R_z(\\theta)R_x(\\pi/2)R_z(\\lambda) + U(\\theta, \\phi, \\lambda) = \\begin{pmatrix} + e^{-i \\frac{\\phi}{2}} & 0 \\\\ + 0 & e^{i \\frac{\\phi}{2}} + \\end{pmatrix} + \\begin{pmatrix} + \\cos{-\\frac{\\pi}{4}} & -i \\sin{-\\frac{\\pi}{4}} \\\\ + -i \\sin{-\\frac{\\pi}{4}} & \\cos{-\\frac{\\pi}{4}} + \\end{pmatrix} + \\begin{pmatrix} + e^{-i \\frac{\\theta}{2}} & 0 \\\\ + 0 & e^{i \\frac{\\theta}{2}} + \\end{pmatrix} + \\begin{pmatrix} + \\cos{\\frac{\\pi}{4}} & -i \\sin{\\frac{\\pi}{4}} \\\\ + -i \\sin{\\frac{\\pi}{4}} & \\cos{\\frac{\\pi}{4}} + \\end{pmatrix} + \\begin{pmatrix} + e^{-i \\frac{\\lambda}{2}} & 0 \\\\ + 0 & e^{i \\frac{\\lambda}{2}} + \\end{pmatrix} + + U(\\theta, \\phi, \\lambda) = \\begin{pmatrix} + \\cos{\\frac{\\theta}{2}} & + -e^{i \\lambda} \\sin{\\frac{\\theta}{2}} \\\\ + e^{i \\phi} \\sin{\\frac{\\theta}{2}} & + e^{i (\\phi+\\lambda)} \\cos{\\frac{\\theta}{2}} + \\end{pmatrix} + + Parameters + ---------- + theta + first parameter angle + phi + second parameter angle + lamnd + third parameter angle + target + int or list of int + control + int or list of int + + Returns + ------- + QCircuit object + """ + + theta = assign_variable(theta) + phi = assign_variable(phi) + lambd = assign_variable(lambd) + pi_half = assign_variable(np.pi / 2) + + return Rz(angle=lambd, target=target, control=control) + \ + Rx(angle=pi_half, target=target, control=control) + \ + Rz(angle=theta, target=target, control=control) + \ + Rx(angle=-pi_half, target=target, control=control) + \ + Rz(angle=phi, target=target, control=control) + + +def u1(lambd, target: typing.Union[list, int], control: typing.Union[list, int] = None) -> QCircuit: + """ + Notes + ---------- + Convenient gate, one of the abstract gates defined by Quantum Experience Standard Header. + Changes the phase of a carrier without applying any pulses. + + .. math:: + from OpenQASM 2.0 specification: + u1(\\lambda) \\sim U(0, 0, \\lambda) = R_z(\\lambda) = e^{-i\\frac{\\lambda}{2} \\sigma_{z}} + also is equal to: + u1(\\lambda) = \\begin{pmatrix} 1 & 0 \\\\ 0 & e^{i\\lambda} \\end{pmatrix} + which is the Tequila Phase gate: + u1(\\lambda) = Phase(\\lambda) + + Parameters + ---------- + lambd + parameter angle + target + int or list of int + control + int or list of int + + Returns + ------- + QCircuit object + """ + + return Phase(phi=lambd, target=target, control=control) + + +def u2(phi, lambd, target: typing.Union[list, int], control: typing.Union[list, int] = None) -> QCircuit: + """ + Notes + ---------- + Convenient gate, one of the abstract gates defined by Quantum Experience Standard Header. + Uses a single \\pi/2-pulse. + + .. math:: + u2(\\phi, \\lambda) = U(\\pi/2, \\phi, \\lambda) = R_z(\\phi + \\pi/2)R_x(\\pi/2)R_z(\\lambda - \\pi/2) + + u2(\\phi, \\lambda) = \\frac{1}{\\sqrt{2}} + \\begin{pmatrix} + 1 & -e^{i\\lambda} \\\\ + e^{i\\phi} & e^{i(\\phi+\\lambda)} + \\end{pmatrix} + + Parameters + ---------- + phi + first parameter angle + lambd + second parameter angle + target + int or list of int + control + int or list of int + + Returns + ------- + QCircuit object + """ + + return U(theta=np.pi/2, phi=phi, lambd=lambd, target=target, control=control) + + +def u3(theta, phi, lambd, target: typing.Union[list, int], control: typing.Union[list, int] = None) -> QCircuit: + """ + Notes + ---------- + Convenient gate, one of the abstract gates defined by Quantum Experience Standard Header + The most general single-qubit gate. + Uses a pair of \\pi/2-pulses. + + .. math:: + u3(\\theta, \\phi, \\lambda) = U(\\theta, \\phi, \\lambda) + = \\begin{pmatrix} + \\cos{\\frac{\\5theta}{2}} & + -e^{i \\lambda} \\sin{\\frac{\\theta}{2}} \\\\ + e^{i \\phi} \\sin{\\frac{\\theta}{2}} & + e^{i (\\phi+\\lambda)} \\cos{\\frac{\\theta}{2}} + \\end{pmatrix} + + Parameters + ---------- + theta + first parameter angle + phi + second parameter angle + lambd + third parameter angle + target + int or list of int + control + int or list of int + + Returns + ------- + QCircuit object + """ + + return U(theta=theta, phi=phi, lambd=lambd, target=target, control=control) + + if __name__ == "__main__": G = CRx(1, 0, 2.0) diff --git a/src/tequila/circuit/pyzx.py b/src/tequila/circuit/pyzx.py new file mode 100644 index 00000000..d99adf07 --- /dev/null +++ b/src/tequila/circuit/pyzx.py @@ -0,0 +1,52 @@ +""" +Add to tequila the ability to make ZX-Calculus + +Using the pyzx library: https://github.com/Quantomatic/pyzx +""" + +HAS_PYZX = True +try: + import pyzx + HAS_PYZX = True +except ImportError: + HAS_PYZX = False + +from tequila import TequilaException +from tequila import export_open_qasm, import_open_qasm +from tequila.circuit import QCircuit + + +def convert_to_pyzx(circuit: QCircuit, variables=None): + """ + Allow convert from Tequila circuit to pyzx circuit + + Args: + circuit: in Tequila format to be exported to pyzx + variables: optional dictionary with values for variables + + Returns: + pyzx.circuit.Circuit: pyzx circuit + """ + if HAS_PYZX: + return pyzx.circuit.Circuit.from_qasm(export_open_qasm(circuit=circuit, variables=variables, version="2.0", zx_calculus=True)) + else: + raise TequilaException("Pyzx package not installed.") + + +def convert_from_pyzx(circuit) -> QCircuit: + """ + Allow convert from pyzx circuit to Tequila circuit + + Args: + circuit: in pyzx format (pyzx.circuit.Circuit) to be exported to Tequila circuit + + Returns: + QCircuit: Tequila circuit + """ + if HAS_PYZX: + if isinstance(circuit, pyzx.circuit.Circuit): + return import_open_qasm(circuit.to_qasm(), version="2.0") + else: + raise TequilaException("Circuit provided must be of type pyzx.circuit.Circuit") + else: + raise TequilaException("Pyzx package not installed.") \ No newline at end of file diff --git a/src/tequila/circuit/qasm.py b/src/tequila/circuit/qasm.py new file mode 100644 index 00000000..27f41727 --- /dev/null +++ b/src/tequila/circuit/qasm.py @@ -0,0 +1,418 @@ +""" +Export QCircuits as qasm code + +OPENQASM version 2.0 specification from: +A. W. Cross, L. S. Bishop, J. A. Smolin, and J. M. Gambetta, e-print arXiv:1707.03429v2 [quant-ph] (2017). +https://arxiv.org/pdf/1707.03429v2.pdf +""" +from tequila import TequilaException +from tequila.circuit import QCircuit +from tequila.circuit.compiler import Compiler +from tequila.circuit.gates import * +from numpy import pi +from typing import Dict + + +def export_open_qasm(circuit: QCircuit, variables=None, version: str = "2.0", filename: str = None, zx_calculus: bool = False) -> str: + """ + Allow export to different versions of OpenQASM + + Args: + circuit: to be exported to OpenQASM + variables: optional dictionary with values for variables + version: of the OpenQASM specification, optional + filename: optional file name to save the generated OpenQASM code + zx_calculus: indicate if y-gates must be transformed to xz equivalents + + Returns: + str: OpenQASM string + """ + + if version == "2.0": + result = convert_to_open_qasm_2(circuit=circuit, variables=variables, zx_calculus=zx_calculus) + else: + return "Unsupported OpenQASM version : " + version + # TODO: export to version 3 + + if filename is not None: + with open(filename, "w") as file: + file.write(result) + file.close() + + return result + + +def import_open_qasm(qasm_code: str, version: str = "2.0", rigorous: bool = True) -> QCircuit: + """ + Allow import from different versions of OpenQASM + + Args: + qasm_code: string with the OpenQASM code + version: of the OpenQASM specification, optional + rigorous: indicates whether the QASM code should be read rigorously + + Returns: + QCircuit: equivalent to the OpenQASM code received + """ + + if version == "2.0": + result = parse_from_open_qasm_2(qasm_code=qasm_code, rigorous=rigorous) + else: + return "Unsupported OpenQASM version : " + version + # TODO: export to version 3 + + return result + + +def import_open_qasm_from_file(filename: str, version: str = "2.0", rigorous: bool = True) -> QCircuit: + """ + Allow import from different versions of OpenQASM from a file + + Args: + filename: string with the file name with the OpenQASM code + variables: optional dictionary with values for variables + version: of the OpenQASM specification, optional + rigorous: indicates whether the QASM code should be read rigorously + + Returns: + QCircuit: equivalent to the OpenQASM code received + """ + + with open(filename, "r") as file: + qasm_code = file.read() + file.close() + + return import_open_qasm(qasm_code, version=version, rigorous=rigorous) + + +def convert_to_open_qasm_2(circuit: QCircuit, variables=None, zx_calculus: bool = False) -> str: + """ + Allow export to OpenQASM version 2.0 + + Args: + circuit: to be exported to OpenQASM + variables: optional dictionary with values for variables + zx_calculus: indicate if y-gates must be transformed to xz equivalents + + Returns: + str: OpenQASM string + """ + + if variables is None and not (len(circuit.extract_variables()) == 0): + raise TequilaException( + "You called export_open_qasm for a parametrized type but forgot to pass down the variables: {}".format( + circuit.extract_variables())) + + compiler = Compiler(multitarget=True, + multicontrol=False, + trotterized=True, + generalized_rotation=True, + exponential_pauli=True, + controlled_exponential_pauli=True, + hadamard_power=True, + controlled_power=True, + power=True, + toffoli=True, + controlled_phase=True, + phase=True, + phase_to_z=True, + controlled_rotation=True, + swap=True, + cc_max=True, + gradient_mode=False, + ry_gate=zx_calculus, + y_gate=zx_calculus, + ch_gate=zx_calculus) + + compiled = compiler(circuit, variables=None) + + result = "OPENQASM 2.0;\ninclude \"qelib1.inc\";\n" + + qubits_names: Dict[int, str] = {} + for q in compiled.qubits: + name = "q[" + str(q) + "]" + qubits_names[q] = name + + result += "qreg q[" + str(compiled.n_qubits) + "];\n" + result += "creg c[" + str(compiled.n_qubits) + "];\n" + + for g in compiled.gates: + + control_str = '' + if g.is_controlled(): + + if len(g.control) > 2: + raise TequilaException( + "Multi-controls beyond 2 not yet supported for OpenQASM 2.0. Gate was:\n{}".format(g)) + + controls = list(map(lambda c: qubits_names[c], g.control)) + control_str = ','.join(controls) + ',' + + gate_name = name_and_params(g, variables) + for t in g.target: + result += gate_name + result += control_str + result += qubits_names[t] + result += ";\n" + + return result + + +def name_and_params(g, variables): + """ + Determines the quantum gate name and its parameters if applicable + + Args: + g: gate to get its name + variables: dictionary with values for variables + + Returns: + str: name (and parameter) to the gate specified + """ + + res = "" + + for c in range(len(g.control)): + res += "c" + + res += g.name.lower() + + if hasattr(g, "parameter") and g.parameter is not None: + res += "(" + str(g.parameter(variables)) + ")" + + res += " " + + return res + + +def parse_from_open_qasm_2(qasm_code: str, rigorous: bool = True) -> QCircuit: + + lines = qasm_code.splitlines() + clean_code = [] + # ignore comments + for line in lines: + if line.find("//") != -1: + clean_line = line[0:line.find("//")].strip() + else: + clean_line = line.strip() + if clean_line: + clean_code.append(clean_line) + + if clean_code[0].startswith("OPENQASM"): + clean_code.pop(0) + elif rigorous: + raise TequilaException("File must start with the 'OPENQASM' directive") + + if clean_code[0].startswith('include "qelib1.inc";'): + clean_code.pop(0) + elif rigorous: + raise TequilaException("File must import standard library (qelib1.inc)") + + code_circuit = "\n".join(clean_code) + # separate the custom command definitions from the normal commands + custom_gates_map: Dict[str, QCircuit] = {} + while True: + i = code_circuit.find("gate ") + if i == -1: + break + j = code_circuit.find("}", i) + custom_name, custom_circuit = parse_custom_gate(code_circuit[i:j + 1], custom_gates_map=custom_gates_map) + custom_gates_map[custom_name] = custom_circuit + code_circuit = code_circuit[:i] + code_circuit[j + 1:] + + # parse regular commands + commands = [s.strip() for s in code_circuit.split(";") if s.strip()] + qregisters: Dict[str, int] = {} + + circuit = QCircuit() + for c in commands: + partial_circuit = parse_command(command=c, custom_gates_map=custom_gates_map, qregisters=qregisters) + if partial_circuit is not None: + circuit += partial_circuit + + return circuit + + +def parse_custom_gate(gate_custom: str, custom_gates_map: Dict[str, QCircuit]) -> (str, QCircuit): + """ + Parse custom gates code + + Args: + gate_custom: code with custom gates + """ + gate_custom = gate_custom[5:] + spec, body = gate_custom.split("{", 1) + + if "(" in spec: + i = spec.find("(") + j = spec.find(")") + if spec[i + 1:j].strip(): + raise TequilaException("Parameters for custom gates not supported: {}".format(spec)) + spec = spec[:i] + spec[j + 1:] + + spec = spec.strip() + + if " " in spec: + name, qargs = spec.split(" ", 1) + name = name.strip() + qargs = qargs.strip() + else: + raise TequilaException("Custom gate specification doesn't have any arguments: {}".format(spec)) + + custom_qregisters: Dict[str, int] = {} + for qarg in qargs.split(','): + custom_qregisters[qarg] = len(custom_qregisters) + + body = body[:-1].strip() + commands = [s.strip() for s in body.split(";") if s.strip()] + + custom_circuit = QCircuit() + for c in commands: + partial_circuit = parse_command(command=c, custom_gates_map=custom_gates_map, qregisters=custom_qregisters) + if partial_circuit is not None: + custom_circuit += partial_circuit + + return name, custom_circuit + + +def parse_command(command: str, custom_gates_map: Dict[str, QCircuit], qregisters: Dict[str, int]) -> QCircuit: + """ + Parse qasm code command + + Args: + command: open qasm code to be parsed + custom_gates_map: map with custom gates + """ + + name, rest = command.split(" ", 1) + + if name in ("barrier", "creg", "measure", "id"): + return None + if name in ("opaque", "if"): + raise TequilaException("Unsupported operation {}".format(command)) + + args = [s.strip() for s in rest.split(",") if s.strip()] + + if name == "qreg": + regname, sizep = args[0].split("[", 1) + size = int(sizep[:-1]) + for i in range(size): + qregisters[regname + "[" + str(i) + "]"] = len(qregisters) + return None + + for arg in args: + if not (arg in qregisters or arg in [key.split("[",1)[0] for key in qregisters.keys()]): + raise TequilaException("Invalid register {}".format(arg)) + + if name in custom_gates_map: + custom_circuit = custom_gates_map[name] + qregisters_values = [] + for a in args: + qregisters_values.append(get_qregister(a, qregisters)) + return apply_custom_gate(custom_circuit=custom_circuit, qregisters_values=qregisters_values) + + if name in ("x", "y", "z", "h", "cx", "cy", "cz", "ch"): + return QCircuit.wrap_gate(QGateImpl(name=(name[1] if name[0] == 'c' else name).upper(), + control=get_qregister(args[0], qregisters) if name[0] == 'c' else None, + target=get_qregister(args[1 if name[0] == 'c' else 0], qregisters))) + if name in ("ccx", "ccy", "ccz"): + return QCircuit.wrap_gate(QGateImpl(name=name.upper()[2], + control=[get_qregister(args[0], qregisters), get_qregister(args[1], qregisters)], + target=get_qregister(args[2], qregisters))) + if name.startswith("rx(") or name.startswith("ry(") or name.startswith("rz(") or \ + name.startswith("crx(") or name.startswith("cry(") or name.startswith("crz("): + return QCircuit.wrap_gate(RotationGateImpl(axis=name[2 if name[0] == 'c' else 1], + angle=get_angle(name)[0], + control=get_qregister(args[0], qregisters) if name[0] == 'c' else None, + target=get_qregister(args[1 if name[0] == 'c' else 0], qregisters))) + if name.startswith("U("): + angles = get_angle(name) + return U(theta=angles[0], phi=angles[1], lambd=angles[2], + control=None, + target=get_qregister(args[0], qregisters)) + if name.startswith("u1("): + angles = get_angle(name) + return u1(lambd=angles[0], + control=None, + target=get_qregister(args[0], qregisters)) + if name.startswith("u2("): + angles = get_angle(name) + return u2(phi=angles[0], lambd=angles[1], + control=None, + target=get_qregister(args[0], qregisters)) + if name.startswith("u3("): + angles = get_angle(name) + return u3(theta=angles[0], phi=angles[1], lambd=angles[2], + control=None, + target=get_qregister(args[0], qregisters)) + if name.startswith("cu1("): + angles = get_angle(name) + return u1(lambd=angles[0], + control=get_qregister(args[0], qregisters), + target=get_qregister(args[1], qregisters)) + if name.startswith("cu2("): + angles = get_angle(name) + return u2(phi=angles[0], lambd=angles[1], + control=get_qregister(args[0], qregisters), + target=get_qregister(args[1], qregisters)) + if name.startswith("cu3("): + angles = get_angle(name) + return u3(theta=angles[0], phi=angles[1], lambd=angles[2], + control=get_qregister(args[0], qregisters), + target=get_qregister(args[1], qregisters)) + if name in ("s", "t", "sdg", "tdg"): + g = Phase(np.pi / (2 if name.startswith("s") else 4), + control=None, + target=get_qregister(args[0], qregisters)) + if name.find("dg") != -1: + g = g.dagger() + return g + + +def apply_custom_gate(custom_circuit: QCircuit, qregisters_values: list) -> QCircuit: + applied_custom_circuit = QCircuit() + for gate in custom_circuit.gates: + g = gate.copy() + g._target = tuple([qregisters_values[i] for i in gate._target]) + g._control = tuple([qregisters_values[i] for i in gate._control]) if gate.is_controlled() else gate._control + applied_custom_circuit += g + return applied_custom_circuit + + +def get_qregister(qreg: str, qregisters: Dict[str, int]) -> typing.Union[list, int]: + if qreg == qreg.split("[", 1)[0]: + qreg_tequila = [qregisters[key] for key in qregisters.keys() if qreg == key.split("[", 1)[0]] + else: + qreg_tequila = qregisters[qreg] + return qreg_tequila + +def get_angle(name: str) -> list: + i = name.find('(') + j = name.find(')') + if j == -1: + raise TequilaException("Invalid specification {}".format(name)) + angles_str = name[i+1:j].split(',') + angles = [] + for angle in angles_str: + try: + phase = float(angle) + except ValueError: + if angle.find('pi') == -1: + raise TequilaException("Invalid specification {}".format(name)) + angle = angle.replace('pi', '') + try: + if angle.find('*') != -1: + angle = angle.replace('*', '') + phase = float(angle) * pi + elif angle.find('/') != -1: + angle = angle.replace('/', '') + phase = pi / float(angle) + elif len(angle) == 0: + phase = pi + else: + phase = float(angle) + except ValueError: + raise TequilaException("Invalid specification {}".format(name)) + angles.append(phase) + return angles + diff --git a/src/tequila/optimizers/__init__.py b/src/tequila/optimizers/__init__.py index 90113d27..0cd37949 100644 --- a/src/tequila/optimizers/__init__.py +++ b/src/tequila/optimizers/__init__.py @@ -80,7 +80,7 @@ def show_available_optimizers(module=None): def minimize(method: str, objective, variables: list=None, - initial_values: dict=None, + initial_values: typing.Union[dict,numbers.Number]=None, maxiter: int=None, *args, **kwargs): diff --git a/src/tequila/quantumchemistry/madness_interface.py b/src/tequila/quantumchemistry/madness_interface.py index d4ab4c5e..f9fae9d6 100644 --- a/src/tequila/quantumchemistry/madness_interface.py +++ b/src/tequila/quantumchemistry/madness_interface.py @@ -8,6 +8,10 @@ from dataclasses import dataclass +class TequilaMadnessException(TequilaException): + def __str__(self): + return "Error in madness backend:" + self.message + class QuantumChemistryMadness(QuantumChemistryBase): @dataclass @@ -98,7 +102,7 @@ def __init__(self, parameters: ParametersQC, status += "found {}_htensor.npy={}\n".format(name, h != "failed") status += "found {}_gtensor.npy={}\n".format(name, h != "failed") if h == "failed" or g == "failed": - raise TequilaException("Could not initialize the madness interface\n" + raise TequilaMadnessException("Could not initialize the madness interface\n" "Status report is\n" "{status}\n" "either provide {name}_gtensor.npy and {name}_htensor.npy files\n" @@ -130,7 +134,7 @@ def __init__(self, parameters: ParametersQC, kwargs["nuclear_repulsion"] = nuclear_repulsion if pairinfo is None: - raise TequilaException("Pairinfo from madness calculation not found\nPlease provide pnoinfo.txt") + raise TequilaMadnessException("Pairinfo from madness calculation not found\nPlease provide pnoinfo.txt") n_orbitals = h.shape[0] assert h.shape[1] == n_orbitals @@ -155,7 +159,7 @@ def __init__(self, parameters: ParametersQC, if active_orbitals is None or i in active_orbitals: orbitals.append(self.OrbitalData(idx_total=i, idx=len(orbitals), pno_pair=p, occ=occinfo[i])) else: - raise TequilaException("No pairinfo given") + raise TequilaMadnessException("No pairinfo given") self.orbitals = tuple(orbitals) # print warning if read data does not match expectations @@ -275,9 +279,11 @@ def make_pno_upccgsd_ansatz(self, include_singles: bool = True, generalized=Fals def write_madness_input(self, n_pno, n_virt=0, frozen_core=False, filename="input", *args, **kwargs): if n_pno is None: - raise TequilaException("Can't write madness input without n_pnos") + raise TequilaMadnessException("Can't write madness input without n_pnos") data = {} - data["dft"] = {"xc": "hf", "k": 7, "econv": 1.e-4, "dconv": 3.e-4, "ncf": "( none , 1.0 )"} + if self.parameters.multiplicity != 1: + raise TequilaMadnessException("Currently only closed shell supported for MRA-PNO-MP2, you demanded multiplicity={} for the surrogate".format(self.parameters.multiplicity)) + data["dft"] = {"charge":self.parameters.charge, "xc": "hf", "k": 7, "econv": 1.e-4, "dconv": 3.e-4, "ncf": "( none , 1.0 )"} data["pno"] = {"maxrank": n_pno, "f12": "false", "thresh": 1.e-4} if not frozen_core: data["pno"]["freeze"] = 0 diff --git a/src/tequila/quantumchemistry/qc_base.py b/src/tequila/quantumchemistry/qc_base.py index 8d503ee6..4f8965c9 100644 --- a/src/tequila/quantumchemistry/qc_base.py +++ b/src/tequila/quantumchemistry/qc_base.py @@ -39,6 +39,15 @@ def __init__(self, angle, generator, p0, assume_real=True, control=None): self.p0 = p0 self.assume_real = assume_real + def map_qubits(self, qubit_map: dict): + mapped_generator = self.generator.map_qubits(qubit_map=qubit_map) + mapped_p0 = self.p0.map_qubits(qubit_map=qubit_map) + mapped_control = self.control + if mapped_control is not None: + mapped_control=tuple([qubit_map[i] for i in self.control]) + return FermionicGateImpl(angle=self.parameter, generator=mapped_generator, p0=mapped_p0, assume_real=self.assume_real, control=mapped_control) + + def compile(self): return gates.Trotterized(angles=[self.parameter], generators=[self.generator], steps=1) diff --git a/src/tequila/simulators/simulator_api.py b/src/tequila/simulators/simulator_api.py index 9a63c437..e5ca1088 100755 --- a/src/tequila/simulators/simulator_api.py +++ b/src/tequila/simulators/simulator_api.py @@ -342,7 +342,7 @@ def compile_circuit(abstract_circuit: 'QCircuit', else: return abstract_circuit - return CircType(abstract_circuit=abstract_circuit, variables=variables, noise=noise, device=device) + return CircType(abstract_circuit=abstract_circuit, variables=variables, noise=noise, device=device, *args, **kwargs) def simulate(objective: typing.Union['Objective', 'QCircuit'], diff --git a/src/tequila/simulators/simulator_base.py b/src/tequila/simulators/simulator_base.py index b47e74fe..524b60c1 100755 --- a/src/tequila/simulators/simulator_base.py +++ b/src/tequila/simulators/simulator_base.py @@ -1,4 +1,4 @@ -from tequila.utils import TequilaException, to_float +from tequila.utils import TequilaException, to_float, TequilaWarning from tequila.circuit.circuit import QCircuit from tequila.utils.keymap import KeyMapSubregisterToRegister from tequila.utils.misc import to_float @@ -8,7 +8,7 @@ from tequila.objective.objective import Variable, format_variable_dictionary from tequila.circuit import compiler -import numbers, typing, numpy, copy +import numbers, typing, numpy, copy, warnings from dataclasses import dataclass @@ -154,7 +154,8 @@ def __init__(self, abstract_circuit: QCircuit, variables, noise=None, device=Non kwargs """ - self._input_args = {"abstract_circuit":abstract_circuit, "variables":variables, "noise":noise, "qubit_map":qubit_map, "optimize_circuits":optimize_circuit, "device":device, **kwargs} + self._input_args = {"abstract_circuit": abstract_circuit, "variables": variables, "noise": noise, + "qubit_map": qubit_map, "optimize_circuits": optimize_circuit, "device": device, **kwargs} self.no_translation = False self._variables = tuple(abstract_circuit.extract_variables()) @@ -171,6 +172,15 @@ def __init__(self, abstract_circuit: QCircuit, variables, noise=None, device=Non if qubit_map is None: qubit_map = {q: i for i, q in enumerate(abstract_circuit.qubits)} + else: + warnings.warn("reveived custom qubit_map = {}\n" + "This is not fully integrated and might result in unexpected behaviour!" + .format(qubit_map), TequilaWarning) + + if len(qubit_map) > abstract_circuit.max_qubit()+1: + raise TequilaException("Custom qubit_map has too many qubits {} vs {}".format(len(qubit_map), abstract_circuit.max_qubit()+1)) + if max(qubit_map.keys()) > abstract_circuit.max_qubit(): + raise TequilaException("Custom qubit_map tries to assign qubit {} but we only have {}".format(max(qubit_map.keys()), abstract_circuit.max_qubit())) # qubit map is initialized to have BackendQubits as values (they carry number and instance attributes) self.qubit_map = self.make_qubit_map(qubit_map) @@ -179,9 +189,7 @@ def __init__(self, abstract_circuit: QCircuit, variables, noise=None, device=Non compiled = c(abstract_circuit) self.abstract_circuit = compiled - self.noise = noise - self.check_device(device) self.device = self.retrieve_device(device) @@ -191,8 +199,6 @@ def __init__(self, abstract_circuit: QCircuit, variables, noise=None, device=Non if optimize_circuit and noise is None: self.circuit = self.optimize_circuit(circuit=self.circuit) - - def __call__(self, variables: typing.Dict[Variable, numbers.Real] = None, samples: int = None, @@ -278,7 +284,7 @@ def check_device(self, device): TequilaException """ if device is not None: - TequilaException('Devices not enabled for {}'.format(str(type(self)))) + raise TequilaException('Devices not enabled for {}'.format(str(type(self)))) def retrieve_device(self, device): """ @@ -299,19 +305,19 @@ def retrieve_device(self, device): if device is None: return device else: - TequilaException('Devices not enabled for {}'.format(str(type(self)))) + raise TequilaException('Devices not enabled for {}'.format(str(type(self)))) def add_parametrized_gate(self, gate, circuit, *args, **kwargs): - TequilaException("Backend Handler needs to be overwritten for supported simulators") + raise TequilaException("Backend Handler needs to be overwritten for supported simulators") def add_basic_gate(self, gate, circuit, *args, **kwargs): - TequilaException("Backend Handler needs to be overwritten for supported simulators") + raise TequilaException("Backend Handler needs to be overwritten for supported simulators") def add_measurement(self, circuit, target_qubits, *args, **kwargs): - TequilaException("Backend Handler needs to be overwritten for supported simulators") + raise TequilaException("Backend Handler needs to be overwritten for supported simulators") def initialize_circuit(self, *args, **kwargs): - TequilaException("Backend Handler needs to be overwritten for supported simulators") + raise TequilaException("Backend Handler needs to be overwritten for supported simulators") def update_variables(self, variables): """ @@ -349,7 +355,8 @@ def simulate(self, variables, initial_state=0, *args, **kwargs) -> QubitWaveFunc initial_state = list(initial_state.keys())[0].integer all_qubits = [i for i in range(self.abstract_circuit.n_qubits)] - active_qubits = self.abstract_circuit.qubits + active_qubits = self.qubit_map.keys() + # maps from reduced register to full register keymap = KeyMapSubregisterToRegister(subregister=active_qubits, register=all_qubits) @@ -410,7 +417,7 @@ def sample_all_z_hamiltonian(self, samples: int, hamiltonian, variables, *args, """ # make measurement instruction (measure all qubits in the Hamiltonian that are also in the circuit) abstract_qubits_H = hamiltonian.qubits - assert len(abstract_qubits_H) != 0 # this case should be filtered out before + assert len(abstract_qubits_H) != 0 # this case should be filtered out before # assert that the Hamiltonian was mapped before if not all(q in self.qubit_map.keys() for q in abstract_qubits_H): raise TequilaException( @@ -519,7 +526,7 @@ def do_sample(self, samples, circuit, noise, abstract_qubits=None, *args, **kwar the result of sampling. """ - TequilaException("Backend Handler needs to be overwritten for supported simulators") + raise TequilaException("Backend Handler needs to be overwritten for supported simulators") def do_simulate(self, variables, initial_state, *args, **kwargs) -> QubitWaveFunction: """ @@ -540,10 +547,10 @@ def do_simulate(self, variables, initial_state, *args, **kwargs) -> QubitWaveFun the result of simulating the circuit. """ - TequilaException("Backend Handler needs to be overwritten for supported simulators") + raise TequilaException("Backend Handler needs to be overwritten for supported simulators") def convert_measurements(self, backend_result) -> QubitWaveFunction: - TequilaException("Backend Handler needs to be overwritten for supported simulators") + raise TequilaException("Backend Handler needs to be overwritten for supported simulators") def initialize_qubit(self, number: int): """ @@ -734,7 +741,7 @@ def __init__(self, E, variables, noise, device, *args, **kwargs): device for compilation of circuit """ self.abstract_expectationvalue = E - self._input_args = {"variables":variables, "device":device, "noise":noise, **kwargs} + self._input_args = {"variables": variables, "device": device, "noise": noise, **kwargs} self._U = self.initialize_unitary(E.U, variables=variables, noise=noise, device=device, **kwargs) self._reduced_hamiltonians = self.reduce_hamiltonians(self.abstract_expectationvalue.H) self._H = self.initialize_hamiltonian(self._reduced_hamiltonians) diff --git a/src/tequila/simulators/simulator_cirq.py b/src/tequila/simulators/simulator_cirq.py index dfcfe04a..50828b29 100755 --- a/src/tequila/simulators/simulator_cirq.py +++ b/src/tequila/simulators/simulator_cirq.py @@ -254,14 +254,17 @@ def add_parametrized_gate(self, gate, circuit, *args, **kwargs): None """ op, mapping = self.op_lookup[gate.name] - if isinstance(gate.parameter, float): - par = gate.parameter + parameter = gate.parameter + if hasattr(gate, 'power'): + parameter = gate.power + if isinstance(parameter, float): + par = parameter else: try: - par = self.tq_to_sympy[gate.parameter] + par = self.tq_to_sympy[parameter] except: - par = sympy.Symbol('{}_{}'.format(self._name_variable_objective(gate.parameter), str(self.counter))) - self.tq_to_sympy[gate.parameter] = par + par = sympy.Symbol('{}_{}'.format(self._name_variable_objective(parameter), str(self.counter))) + self.tq_to_sympy[parameter] = par self.counter += 1 cirq_gate = op(**mapping(par)).on(*[self.qubit(t) for t in gate.target]) if gate.is_controlled(): diff --git a/src/tequila/simulators/simulator_qiskit.py b/src/tequila/simulators/simulator_qiskit.py index be34b6bf..7eccf1e4 100755 --- a/src/tequila/simulators/simulator_qiskit.py +++ b/src/tequila/simulators/simulator_qiskit.py @@ -126,7 +126,7 @@ class BackendCircuitQiskit(BackendCircuit): "controlled_phase": False, "toffoli": False, "phase_to_z": False, - "cc_max": False + "cc_max": True } numbering = BitNumbering.LSB @@ -402,8 +402,7 @@ def add_parametrized_gate(self, gate, circuit, *args, **kwargs): if len(gate.control) > 2: pass # raise TequilaQiskitException("multi-controls beyond 2 not yet supported for the qiskit backend. Gate was:\n{}".format(gate) ) - ops[1](circuit)(par, q_controls=[self.qubit(c) for c in gate.control], - q_target=self.qubit(gate.target[0]), q_ancillae=None, mode='noancilla') + ops[1](circuit)(par, self.qubit(gate.control[0]), self.qubit(gate.target[0])) else: ops[0](circuit)(par, self.qubit(gate.target[0])) diff --git a/src/tequila/tools/qng.py b/src/tequila/tools/qng.py index 4fddd430..9fc42bc1 100644 --- a/src/tequila/tools/qng.py +++ b/src/tequila/tools/qng.py @@ -5,7 +5,7 @@ from tequila.simulators.simulator_api import compile_objective from tequila.circuit.gradient import __grad_inner from tequila.autograd_imports import jax -from tequila.circuit.compiler import compile_controlled_rotation, compile_h_power, compile_power_gate, \ +from tequila.circuit.compiler import compile_controlled_rotation, compile_power_gate, \ compile_trotterized_gate, compile_controlled_phase, compile_multitarget import typing import numpy @@ -456,7 +456,6 @@ def get_qng_combos(objective, func=stokes_block, objective.contract() compiled = compile_multitarget(gate=objective) compiled = compile_trotterized_gate(gate=compiled) - compiled = compile_h_power(gate=compiled) compiled = compile_power_gate(gate=compiled) compiled = compile_controlled_phase(gate=compiled) compiled = compile_controlled_rotation(gate=compiled) diff --git a/src/tequila/wavefunction/qubit_wavefunction.py b/src/tequila/wavefunction/qubit_wavefunction.py index 120d4bb1..01f9c475 100644 --- a/src/tequila/wavefunction/qubit_wavefunction.py +++ b/src/tequila/wavefunction/qubit_wavefunction.py @@ -27,7 +27,11 @@ def apply_keymap(self, keymap, initial_state: BitString = None): self.n_qubits = keymap.n_qubits mapped_state = dict() for k, v in self.state.items(): - mapped_state[keymap(input_state=k, initial_state=initial_state)] = v + mapped_key=keymap(input_state=k, initial_state=initial_state) + if mapped_key in mapped_state: + mapped_state[mapped_key] += v + else: + mapped_state[mapped_key] = v self.state = mapped_state return self diff --git a/tests/test_chemistry_madness.py b/tests/test_chemistry_madness.py index 904e6cf9..cf26f42b 100644 --- a/tests/test_chemistry_madness.py +++ b/tests/test_chemistry_madness.py @@ -28,7 +28,7 @@ def test_madness_he_data(): print(result.energy) assert (numpy.isclose(-2.87761809, result.energy, atol=1.e-5)) -@pytest.mark.skipif(executable is None, reason="pno_integrals not found") +@pytest.mark.skipif(executable is None, reason="madness was not found") def test_madness_full_he(): # relies on madness being compiled and MAD_ROOT_DIR exported # or pno_integrals in the path @@ -43,7 +43,22 @@ def test_madness_full_he(): result = tq.minimize(method="bfgs", objective=E, initial_values=0.0, silent=True) assert (numpy.isclose(-2.87761809, result.energy, atol=1.e-5)) -@pytest.mark.skipif(executable is None, reason="pno_integrals not found") +@pytest.mark.skipif(executable is None, reason="madness was not found") +def test_madness_full_li_plus(): + # relies on madness being compiled and MAD_ROOT_DIR exported + # or pno_integrals in the path + geomstring="Li 0.0 0.0 0.0" + molecule = tq.Molecule(name="li+", geometry=geomstring, n_pno=1, charge=1) + H = molecule.make_hamiltonian() + UHF = molecule.prepare_reference() + EHF = tq.simulate(tq.ExpectationValue(H=H, U=UHF)) + assert(numpy.isclose(-7.236247e+00, EHF, atol=1.e-5)) + U = molecule.make_upccgsd_ansatz() + E = tq.ExpectationValue(H=H, U=U) + result = tq.minimize(method="bfgs", objective=E, initial_values=0.0, silent=True) + assert (numpy.isclose(-7.251177798, result.energy, atol=1.e-5)) + +@pytest.mark.skipif(executable is None, reason="madness was not found") def test_madness_full_be(): # relies on madness being compiled and MAD_ROOT_DIR exported # or pno_integrals in the path diff --git a/tests/test_circuits.py b/tests/test_circuits.py index 24f3b40d..667e5218 100644 --- a/tests/test_circuits.py +++ b/tests/test_circuits.py @@ -1,10 +1,12 @@ -from tequila.circuit.gates import X, Y, Z, Rx, Ry, Rz, H, CNOT, QCircuit, RotationGate, Phase, ExpPauli, Trotterized +from tequila.circuit.gates import X, Y, Z, Rx, Ry, Rz, H, CNOT, QCircuit, RotationGate, Phase, ExpPauli, Trotterized, \ + U, u1, u2, u3, S, T from tequila.wavefunction.qubit_wavefunction import QubitWaveFunction from tequila.circuit._gates_impl import RotationGateImpl from tequila.objective.objective import Variable from tequila.simulators.simulator_api import simulate from tequila import assign_variable, paulis import numpy, sympy +import pytest def test_qubit_map(): @@ -166,3 +168,103 @@ def test_circuit_from_moments(): moms = c.moments c2 = QCircuit.from_moments(moms) assert c == c2 + + +@pytest.mark.parametrize( + "gate, angle", + [ + (Z(target=0, control=None), numpy.pi), # Z = u1(pi) + (Z(target=0, control=1), numpy.pi), + (S(target=0, control=None), numpy.pi/2), # S = u1(pi/2) + (S(target=0, control=1), numpy.pi/2), + (S(target=0, control=None).dagger(), -numpy.pi/2), # Sdg = u1(-pi/2) + (S(target=0, control=1).dagger(), -numpy.pi/2), + (T(target=0, control=None), numpy.pi/4), # T = u1(pi/4) + (T(target=0, control=1), numpy.pi/4), + (T(target=0, control=None).dagger(), -numpy.pi/4), # Tdg = u1(-pi/4) + (T(target=0, control=1).dagger(), -numpy.pi/4) + ] +) +def test_unitary_gate_u1(gate, angle): + """ + Test some equivalences for u1 gate + """ + c_u1 = u1(lambd=angle, target=gate.gates[0].target, + control=None if len(gate.gates[0].control) == 0 else gate.gates[0].control) + + if len(gate.gates[0].control) > 0: + c_u1 = X(target=gate.gates[0].control) + c_u1 + gate = X(target=gate.gates[0].control) + gate + + wfn1 = simulate(c_u1, backend="symbolic") + wfn2 = simulate(gate, backend="symbolic") + + assert (numpy.isclose(wfn1.inner(wfn2), 1.0)) + + +@pytest.mark.parametrize( + "ctrl, phi, lambd", + [ + (None, numpy.pi / 13, numpy.pi / 7), + (1, numpy.pi / 13, numpy.pi / 7), + (None, 0, 0), + (1, 0, 0), + (None, numpy.pi, numpy.pi), + (1, numpy.pi, numpy.pi), + (None, 0, numpy.pi), + (1, numpy.pi, 0), + ] +) +def test_unitary_gate_u2(ctrl, phi, lambd): + """ + Test some equivalences for u2 gate + Since u2(\\phi, \\lambda) = Rz(\\phi)Ry(\\pi/2)Rz(\\lambda) + """ + c_u2 = u2(phi=phi, lambd=lambd, target=0, control=ctrl) + c_equiv = Rz(target=0, control=ctrl, angle=lambd) + \ + Ry(target=0, control=ctrl, angle=numpy.pi / 2) + \ + Rz(target=0, control=ctrl, angle=phi) + + if ctrl is not None: + c_u2 = X(target=ctrl) + c_u2 + c_equiv = X(target=ctrl) + c_equiv + + wfn1 = simulate(c_u2, backend="symbolic") + wfn2 = simulate(c_equiv, backend="symbolic") + + assert (numpy.isclose(wfn1.inner(wfn2), 1.0)) + + +@pytest.mark.parametrize( + "gate, theta, phi, lambd", + [ + (Rx(target=0, control=None, angle=numpy.pi/5), numpy.pi/5, -numpy.pi/2, numpy.pi/2), # Rx(angle) = u3(angle, -pi/2, pi/2) + (Rx(target=0, control=1, angle=numpy.pi/6), numpy.pi/6, -numpy.pi/2, numpy.pi/2), + (Rx(target=0, control=None, angle=numpy.pi/7), numpy.pi/7, -numpy.pi/2, numpy.pi/2), + (Rx(target=0, control=1, angle=numpy.pi/8), numpy.pi/8, -numpy.pi/2, numpy.pi/2), + (Ry(target=0, control=1, angle=numpy.pi/4), numpy.pi/4, 0, 0), # Ry(angle) = u3(angle, 0, 0) + (Ry(target=0, control=1, angle=numpy.pi/5), numpy.pi/5, 0, 0), + (Ry(target=0, control=1, angle=numpy.pi/3), numpy.pi/3, 0, 0), + (Ry(target=0, control=1, angle=numpy.pi/2), numpy.pi/2, 0, 0), + (Rz(target=0, control=None, angle=numpy.pi), 0, 0, numpy.pi), # Rz(angle) = U(0, 0, angle) + (Rz(target=0, control=1, angle=numpy.pi/6), 0, 0, numpy.pi/6), + (Rz(target=0, control=None, angle=numpy.pi/7), 0, 0, numpy.pi/7), + (Rz(target=0, control=1, angle=numpy.pi/8), 0, 0, numpy.pi/8) + ] +) +def test_unitary_gate_u_u3(gate, theta, phi, lambd): + """ + Test some equivalences for u3 gate (also U gate, because U = u3) + """ + c_u3 = u3(theta=theta, phi=phi, lambd=lambd, target=gate.gates[0].target, + control=None if len(gate.gates[0].control) == 0 else gate.gates[0].control) + + if len(gate.gates[0].control) > 0: + c_u3 = X(target=gate.gates[0].control) + c_u3 + gate = X(target=gate.gates[0].control) + gate + + wfn1 = simulate(c_u3, backend="symbolic") + wfn2 = simulate(gate, backend="symbolic") + + assert (numpy.isclose(wfn1.inner(wfn2), 1.0)) + diff --git a/tests/test_pyzx.py b/tests/test_pyzx.py new file mode 100644 index 00000000..887b7ed3 --- /dev/null +++ b/tests/test_pyzx.py @@ -0,0 +1,178 @@ +from tequila.circuit.pyzx import convert_to_pyzx, convert_from_pyzx +from tequila.circuit.gates import * +from tequila.simulators.simulator_api import simulate +from tequila import TequilaException +import numpy +import pytest +HAS_PYZX = True +try: + import pyzx + HAS_PYZX = True +except ImportError: + HAS_PYZX = False + + +@pytest.mark.skipif(not HAS_PYZX, + reason="Pyzx package not installed, test_convert_to_from_pyzx_simple not executed") +@pytest.mark.parametrize( + "tequila_circuit", + [ + (X(target=3) + Y(target=2) + Z(target=1)), + (Rx(target=1, control=0, angle=5.67) + Ry(target=2, angle=0.98) + Rz(target=3, angle=1.67)), + (H(target=1) + H(target=1, control=0) + X(target=1) + Y(target=0) + Z(target=2) + + CX(target=3, control=0) + CY(target=4, control=2) + CZ(target=5, control=1) + + CNOT(target=3, control=0) + SWAP(first=0, second=3) + + S(target=1, control=0) + T(target=1, control=2)) + ] +) +def test_convert_to_from_pyzx_simple(tequila_circuit): + + pyzx_circuit = convert_to_pyzx(tequila_circuit) + converted_circuit = convert_from_pyzx(pyzx_circuit) + + wfn1 = simulate(tequila_circuit, backend="symbolic") + wfn2 = simulate(converted_circuit, backend="symbolic") + + assert (numpy.isclose(wfn1.inner(wfn2), 1.0)) + + +@pytest.mark.skipif(not HAS_PYZX, + reason="Pyzx package not installed, test_convert_to_from_pyzx not executed") +@pytest.mark.parametrize( + "variabs", + [ + ([2.8, 5.6, 7.6, 1.8, 4.98, 2.35, 3.12, 6.79, 0.12]), + ([1.5, 3.7, 9.2, 3.1, 7.62, 1.98, 8.56, 2.97, 1.34]), + ([0, 0, 0, 0, 0, 0, 0, 0, 0]), + ([numpy.pi/12, numpy.pi, numpy.pi/3, numpy.pi/6, numpy.pi*0.95, numpy.pi/2, numpy.pi*2.3, numpy.pi/7, 0.56]) + + ] +) +def test_convert_to_from_pyzx(variabs): + + variables = {"ang1": variabs[0], + "ang2": variabs[1], + "ang3": variabs[2], + "ang4": variabs[3], + "ang5": variabs[4], + "ang6": variabs[5], + "ang7": variabs[6], + "ang8": variabs[7], + "ang9": variabs[8]} + + tequila_circuit = H(target=[0, 1], control=2) + \ + X(target=1) + \ + Y(target=0) + \ + Z(target=2) + \ + CX(target=3, control=0) + \ + CY(target=4, control=2) + \ + CZ(target=5, control=1) + \ + CNOT(target=3, control=0) + \ + SWAP(first=0, second=3) + \ + Rx(target=1, angle="ang1") + \ + Ry(target=0, angle="ang2") + \ + Rz(target=2, angle="ang3") + \ + CRx(target=5, control=8, angle="ang4") + \ + CRy(target=6, control=9, angle="ang5") + \ + CRz(target=7, control=0, angle="ang6") + \ + Phase(control=0, target=1, phi="ang7") + \ + S(target=1, control=0) + \ + T(target=1, control=2) + \ + Rp(paulistring="Y(1)", angle="ang8") + \ + ExpPauli(paulistring="Z(1)X(2)", control=0, angle="ang9") + \ + Toffoli(target=2, first=4, second=3) + + pyzx_circuit = convert_to_pyzx(tequila_circuit, variables=variables) + converted_circuit = convert_from_pyzx(pyzx_circuit) + + wfn1 = simulate(tequila_circuit, backend="symbolic", variables=variables) + wfn2 = simulate(converted_circuit, backend="symbolic") + + assert (numpy.isclose(wfn1.inner(wfn2), 1.0)) + + +@pytest.mark.skipif(not HAS_PYZX, + reason="Pyzx package not installed, test_convert_to_from_pyzx_trotterized_gate not executed") +@pytest.mark.parametrize( + "string1,string2,angles,steps", + [ + ("1.0 X(1)Z(2) - 0.5 Z(3)X(4)", None, [numpy.pi/12], 1), + ("1.0 X(1)Z(2) + 0.5 Z(3)X(4)", "1.0 Y(1)X(2) - 0.9 X(2)Z(3)", [5.6, numpy.pi], 1), + ("1.5 Z(2)Z(4) + 0.8 Y(3)X(4)", None, [numpy.pi], 1) + ] +) +def test_convert_to_from_pyzx_trotterized_gate(string1, string2, angles, steps): + + variables = {"ang1": angles[0]} if string2 is None else {"ang1": angles[0], "ang2": angles[1]} + + g1 = QubitHamiltonian.from_string(string1) + g2 = None if string2 is None else QubitHamiltonian.from_string(string2) + tequila_circuit = Trotterized(generators=[g1] if string2 is None else [g1, g2], + angles=["ang1"] if string2 is None else ["ang1", "ang2"], + steps=steps) + + pyzx_circuit = convert_to_pyzx(tequila_circuit, variables=variables) + converted_circuit = convert_from_pyzx(pyzx_circuit) + + wfn1 = simulate(tequila_circuit, backend="symbolic", variables=variables) + wfn2 = simulate(converted_circuit, backend="symbolic") + + assert (numpy.isclose(wfn1.inner(wfn2), 1.0)) + + +@pytest.mark.skipif(not HAS_PYZX, + reason="Pyzx package not installed, test_convert_from_pyzx_exception not executed") +def test_convert_from_pyzx_exception(): + + pyzx_circuit = pyzx.circuit.Circuit(qubit_amount=1) + tequila_circuit = QCircuit() + + with pytest.raises(expected_exception=TequilaException, + match="Circuit provided must be of type pyzx.circuit.Circuit"): + convert_from_pyzx(tequila_circuit) + + assert (isinstance(convert_from_pyzx(pyzx_circuit), QCircuit)) + + +@pytest.mark.skipif(not HAS_PYZX, + reason="Pyzx package not installed, test_convert_to_from_pyzx_optimizing_circuit not executed") +@pytest.mark.parametrize( + "tequila_circuit,t_reduce", + [ + (X(target=3) + Y(target=2) + Z(target=1), True), + (Rx(target=1, control=0, angle=5.67) + Ry(target=2, angle=0.98) + Rz(target=3, angle=1.67), False), + (H(target=1) + H(target=1, control=0) + X(target=1) + Y(target=0) + Z(target=2) + + CX(target=3, control=0) + CY(target=4, control=2) + CZ(target=5, control=1) + + CNOT(target=3, control=0) + SWAP(first=0, second=3) + + S(target=1, control=0) + T(target=1, control=2), True) + ] +) +def test_convert_to_from_pyzx_optimizing_circuit(tequila_circuit, t_reduce): + + pyzx_circuit = convert_to_pyzx(tequila_circuit) + + pyzx_graph = pyzx_circuit.to_graph() + + if t_reduce: + pyzx.teleport_reduce(pyzx_graph) + pyzx_circuit_opt = pyzx.Circuit.from_graph(pyzx_graph) + else: + pyzx.full_reduce(pyzx_graph) + pyzx_graph.normalize() + pyzx_circuit_opt = pyzx.extract_circuit(pyzx_graph.copy()) + + # compare_tensors returns True if pyzx_circuit and pyzx_circuit_opt + # implement the same circuit (up to global phase) + assert (pyzx.compare_tensors(pyzx_circuit, pyzx_circuit_opt)) + + # verify_equality return True if full_reduce() is able to reduce the + # composition of the circuits to the identity + assert (pyzx_circuit.verify_equality(pyzx_circuit_opt)) + + converted_circuit = convert_from_pyzx(pyzx_circuit_opt) + + wfn1 = simulate(tequila_circuit, backend="symbolic") + wfn2 = simulate(converted_circuit, backend="symbolic") + + assert (numpy.isclose(wfn1.inner(wfn2), 1.0)) + diff --git a/tests/test_qasm.py b/tests/test_qasm.py new file mode 100644 index 00000000..b39454bd --- /dev/null +++ b/tests/test_qasm.py @@ -0,0 +1,234 @@ +from tequila.circuit.qasm import export_open_qasm, import_open_qasm, import_open_qasm_from_file +from tequila.circuit.gates import * +from tequila.simulators.simulator_api import simulate +import numpy +import os +import pytest + + +@pytest.mark.parametrize( + "zx_calculus", + [ + False, + True, + ] +) +def test_export_import_qasm_simple(zx_calculus): + tequila_circuit = H(target=1) + \ + X(target=1) + \ + Y(target=0) + \ + Z(target=2) + \ + CX(target=3, control=0) + \ + CY(target=4, control=2) + \ + CZ(target=5, control=1) + \ + CNOT(target=3, control=0) + \ + SWAP(first=0, second=3) + \ + S(target=1, control=0) + \ + T(target=1, control=2) + + qasm_code_simple = export_open_qasm(tequila_circuit, zx_calculus=zx_calculus) + imported_circuit = import_open_qasm(qasm_code=qasm_code_simple) + + wfn1 = simulate(tequila_circuit, backend="symbolic") + wfn2 = simulate(imported_circuit, backend="symbolic") + + assert (numpy.isclose(wfn1.inner(wfn2), 1.0)) + + +@pytest.mark.parametrize( + "zx_calculus,variabs", + [ + (False, [2.8, 5.6, 7.6, 1.8, 4.98, 2.35, 3.12, 6.79]), + (True, [1.5, 3.7, 9.2, 3.1, 7.62, 1.98, 8.56, 2.97]), + (False, [0, 0, 0, 0, 0, 0, 0, 0]), + (True, [0, 0, 0, 0, 0, 0, 0, 0]), + (False, [numpy.pi/12, numpy.pi, numpy.pi/3, numpy.pi/6, numpy.pi*0.95, numpy.pi/2, numpy.pi*2.3, numpy.pi/7]), + (True, [numpy.pi/12, numpy.pi, numpy.pi/3, numpy.pi/6, numpy.pi*0.95, numpy.pi/2, numpy.pi*2.3, numpy.pi/7]) + ] +) +def test_export_import_qasm(zx_calculus, variabs): + + variables = {"ang1": variabs[0], + "ang2": variabs[1], + "ang3": variabs[2], + "ang4": variabs[3], + "ang5": variabs[4], + "ang6": variabs[5], + "ang7": variabs[6], + "ang8": variabs[7]} + + tequila_circuit = H(target=[0, 1]) + \ + H(target=0, control=1) + \ + X(target=1) + \ + Y(target=0) + \ + Z(target=2) + \ + CX(target=3, control=0) + \ + CY(target=4, control=2) + \ + CZ(target=5, control=1) + \ + CNOT(target=3, control=0) + \ + SWAP(first=0, second=3) + \ + Rx(target=1, angle="ang1") + \ + Ry(target=0, angle="ang2") + \ + Rz(target=2, angle="ang3") + \ + CRx(target=5, control=8, angle="ang4") + \ + CRy(target=6, control=9, angle="ang5") + \ + CRz(target=7, control=0, angle="ang6") + \ + Phase(control=0, target=1, phi="ang1") + \ + S(target=1, control=0) + \ + T(target=1, control=2) + \ + Rp(paulistring="Y(1)", angle="ang7") + \ + ExpPauli(paulistring="Z(1)X(2)", control=0, angle="ang8") + \ + Toffoli(target=2, first=4, second=3) + + qasm_code = export_open_qasm(tequila_circuit, variables=variables, zx_calculus=zx_calculus) + imported_circuit = import_open_qasm(qasm_code=qasm_code) + + wfn1 = simulate(tequila_circuit, backend="symbolic", variables=variables) + wfn2 = simulate(imported_circuit, backend="symbolic") + + assert (numpy.isclose(wfn1.inner(wfn2), 1.0)) + + +@pytest.mark.parametrize( + "zx_calculus,target1,control1,target2,control2", + [ + (False, 1, None, 0, 1), + (True, 1, None, 0, 1), + (False, [0, 1], None, 0, 1), + (True, [0, 1], None, 0, 1), + (False, [0, 1, 2, 3], 4, 2, 1), + (True, [0, 1, 2, 3], 4, 2, 1), + (False, [1, 2], 4, [0, 3], 1), + (True, [1, 2], 4, [0, 3], 1) + ] +) +def test_export_import_qasm_h_ch_gate(zx_calculus, target1, control1, target2, control2): + + tequila_circuit = H(target=target1, control=control1) + H(target=target2, control=control2) + + qasm_code = export_open_qasm(tequila_circuit, zx_calculus=zx_calculus) + imported_circuit = import_open_qasm(qasm_code=qasm_code) + + wfn1 = simulate(tequila_circuit, backend="symbolic") + wfn2 = simulate(imported_circuit, backend="symbolic") + + assert (numpy.isclose(wfn1.inner(wfn2), 1.0)) + + +@pytest.mark.parametrize( + "zx_calculus,string1,string2,angles,steps", + [ + (False, "1.0 X(1)Z(2) - 0.5 Z(3)X(4)", None, [numpy.pi/12], 1), + (True, "1.0 X(1)Z(2) - 0.5 Z(3)X(4)", None, [numpy.pi/12], 1), + (False, "1.0 X(1)Z(2) + 0.5 Z(3)X(4)", "1.0 Y(1)X(2) - 0.9 X(2)Z(3)", [5.6, numpy.pi], 1), + (True, "1.0 X(1)Z(2) + 0.5 Z(3)X(4)", "1.0 Y(1)X(2) - 0.9 X(2)Z(3)", [5.6, numpy.pi], 1), + (False, "1.5 Z(2)Z(4) + 0.8 Y(3)X(4)", None, [numpy.pi], 1), + (True, "1.5 Z(2)Z(4) + 0.8 Y(3)X(4)", None, [numpy.pi], 2) + ] +) +def test_export_import_qasm_trotterized_gate(zx_calculus, string1, string2, angles, steps): + + variables = {"ang1": angles[0]} if string2 is None else {"ang1": angles[0], "ang2": angles[1]} + + g1 = QubitHamiltonian.from_string(string1) + g2 = None if string2 is None else QubitHamiltonian.from_string(string2) + tequila_circuit = Trotterized(generators=[g1] if string2 is None else [g1, g2], + angles=["ang1"] if string2 is None else ["ang1", "ang2"], + steps=steps) + + qasm_code = export_open_qasm(tequila_circuit, variables=variables, zx_calculus=zx_calculus) + imported_circuit = import_open_qasm(qasm_code=qasm_code) + + wfn1 = simulate(tequila_circuit, backend="symbolic", variables=variables) + wfn2 = simulate(imported_circuit, backend="symbolic") + + assert (numpy.isclose(wfn1.inner(wfn2), 1.0)) + + +@pytest.mark.parametrize( + "zx_calculus,variabs", + [ + (False, [2.8, 5.6, 7.6, 1.8, 4.98]), + (True, [9.6, 4.1, 6.3, 2.5, 5.62]), + (False, [numpy.pi*3, numpy.pi, numpy.pi/3, numpy.pi, numpy.pi*0.95]), + (True, [numpy.pi*2, numpy.pi, numpy.pi/4, numpy.pi, numpy.pi*0.68]) + ] +) +def test_export_import_qasm_file(zx_calculus, variabs): + + variables = {"ang1": variabs[0], + "ang2": variabs[1], + "ang3": variabs[2], + "ang4": variabs[3], + "ang5": variabs[4]} + + tequila_circuit = H(target=[0, 1]) + \ + Y(target=0) + \ + Z(target=2) + \ + CY(target=4, control=2) + \ + SWAP(first=0, second=3) + \ + Ry(target=0, angle="ang1") + \ + Rz(target=2, angle="ang2") + \ + CRx(target=5, control=8, angle="ang3") + \ + CRy(target=6, control=9, angle="ang4") + \ + S(target=1, control=0) + \ + T(target=1, control=2) + \ + ExpPauli(paulistring="Y(1)Z(3)", control=0, angle="ang5") + \ + Toffoli(target=2, first=4, second=3) + + file_name = "test_file_qasm.txt" + + qasm_code = export_open_qasm(tequila_circuit, variables=variables, zx_calculus=zx_calculus, + filename=file_name) + imported_circuit = import_open_qasm(qasm_code=qasm_code) + imported_circuit_from_file = import_open_qasm_from_file(filename=file_name) + + wfn1 = simulate(tequila_circuit, backend="symbolic", variables=variables) + wfn2 = simulate(imported_circuit, backend="symbolic") + wfn3 = simulate(imported_circuit_from_file, backend="symbolic") + + # remove file + if os.path.exists(file_name): + os.remove(file_name) + + assert (numpy.isclose(wfn1.inner(wfn2), 1.0)) + assert (numpy.isclose(wfn1.inner(wfn3), 1.0)) + assert (numpy.isclose(wfn2.inner(wfn3), 1.0)) + + +def test_import_qasm_with_custom_gates(): + + openqasmcode = "OPENQASM 2.0;\n" \ + "include \"qelib1.inc\";\n" \ + "gate mycustom a,b,c\n" \ + "{\n" \ + "cx c,b;\n" \ + "cx c,a;\n" \ + "}\n" \ + "qreg q1[3];\n" \ + "qreg q2[4];\n" \ + "creg c[3];\n" \ + "y q1[1];\n" \ + "z q2[2];\n" \ + "mycustom q1[0],q2[0],q1[2];\n" \ + "h q2[1];\n" \ + "mycustom q2[3],q1[1],q2[2];\n" \ + "y q2[1];\n" + + imported_circuit = import_open_qasm(qasm_code=openqasmcode) + + # openqasm -> tequila qbits + # qreg q1[3] -> 0, 1, 2 + # qreg q2[4] -> 3, 4, 5, 6 + + tequila_circuit = Y(target=1) + Z(target=5) + \ + CX(target=3, control=2) + CX(target=3, control=0) + \ + H(target=4) + \ + CX(target=1, control=5) + CX(target=6, control=5) + \ + Y(target=4) + + wfn1 = simulate(tequila_circuit, backend="symbolic") + wfn2 = simulate(imported_circuit, backend="symbolic") + + assert (numpy.isclose(wfn1.inner(wfn2), 1.0)) + diff --git a/tests/test_recompilation_routines.py b/tests/test_recompilation_routines.py index 8d43ca46..a7ca4da1 100644 --- a/tests/test_recompilation_routines.py +++ b/tests/test_recompilation_routines.py @@ -1,6 +1,7 @@ import tequila.simulators.simulator_api from tequila.circuit import gates -from tequila.circuit.compiler import compile_controlled_rotation, change_basis, compile_phase, compile_swap +from tequila.circuit.compiler import compile_controlled_rotation, change_basis, compile_phase, compile_swap, \ + compile_ry, compile_y, compile_ch from numpy.random import uniform, randint from numpy import pi, isclose from tequila.hamiltonian import paulis @@ -90,4 +91,70 @@ def test_compile_swap(): equivalent_swap = gates.X(target=0, control=3) + gates.X(target=3, control=0) + gates.X(target=0, control=3) assert (equivalent_circuit == equivalent_swap) - + + +@pytest.mark.parametrize( + "target,control,angle", + [ + (2, 4, 3.14), + (1, 0, numpy.pi / 7), + (1, None, numpy.pi / 5), + (5, None, 1.093) + ] +) +def test_compile_ry(target, control, angle): + + circuit = gates.Ry(target=target, control=control, angle=angle) + equivalent_circuit = compile_ry(circuit) + + equivalent_ry = gates.Rz(target=target, control=None, angle=-numpy.pi / 2) + \ + gates.Rx(target=target, control=control, angle=angle) + \ + gates.Rz(target=target, control=None, angle=numpy.pi / 2) + + assert (equivalent_circuit == equivalent_ry) + + +@pytest.mark.parametrize( + "target,control,power", + [ + (2, 4, 1.5), + (4, 0, 1.0), + (0, 5, 2.9), + (1, None, 4.2), + (5, None, 3.9) + ] +) +def test_compile_y(target, control, power): + + circuit = gates.Y(target=target, control=control, power=power) + equivalent_circuit_y = compile_y(circuit) + + equivalent_y = gates.Rz(target=target, control=None, angle=-numpy.pi / 2) + \ + gates.X(target=target, control=control, power=power) + \ + gates.Rz(target=target, control=None, angle=numpy.pi / 2) + + assert (equivalent_circuit_y == equivalent_y) + + +@pytest.mark.parametrize( + "target,control,power", + [ + (2, 4, 1.5), + (4, 2, 1.0), + (0, 5, 2.9), + (1, None, 4.2), + (5, None, 3.9) + ] +) +def test_compile_ch(target, control, power): + + circuit = gates.H(target=target, control=control, power=power) + equivalent_circuit = compile_ch(circuit) + + equivalent_ch = gates.Ry(target=target, control=None, angle=-numpy.pi / 4) + \ + gates.Z(target=target, control=control, power=power) + \ + gates.Ry(target=target, control=None, angle=numpy.pi / 4) + + if control is not None: + assert (equivalent_circuit == equivalent_ch) + diff --git a/tests/test_simulator_backends.py b/tests/test_simulator_backends.py index aac0850f..a47ab918 100644 --- a/tests/test_simulator_backends.py +++ b/tests/test_simulator_backends.py @@ -56,6 +56,16 @@ def test_interface(backend): INSTALLED_SIMULATORS = tequila.simulators.simulator_api.INSTALLED_SIMULATORS.keys() INSTALLED_SAMPLERS = tequila.simulators.simulator_api.INSTALLED_SAMPLERS.keys() +@pytest.mark.parametrize("backend", INSTALLED_SAMPLERS) +def test_sampling_accumulation(backend): + # minimal test that was added after a bug was discovered + # just needs to asssure that it runs through and no errors are thrown within the process + U = tq.gates.Ry(angle=numpy.pi/2, target=0) + tq.gates.CNOT(1,3) + H = tq.paulis.Qm(1) + E = tq.ExpectationValue(H=H, U=U) + result = tq.simulate(E, backend=backend, samples=100) + assert result == 0.0 + @pytest.mark.parametrize("backend", INSTALLED_SAMPLERS) def test_sampling_circuits(backend): diff --git a/tutorials/BasicUsage.ipynb b/tutorials/BasicUsage.ipynb deleted file mode 100644 index fc35a281..00000000 --- a/tutorials/BasicUsage.ipynb +++ /dev/null @@ -1,969 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Tequila Basic Usage" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Create and Simulate Quantum Circuits\n", - "\n", - "Tequila operators on abstract data types which can be translated and executed on various backends. \n", - "In this part of the tutorial we show how to initialize and execute those.\n", - "\n", - "First import tequila and check which backends are installed on your system. \n", - "If supported backends are not installed you can for most of them just install them with\n", - "`pip install --upgrade name` in your command line \n", - "If you have old versions of supported backends installed that might get you in trouble. \n", - "You can upgrade them with the same command." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "backend | wfn | sampling | noise | installed \n", - "--------------------------------------------------------------------\n", - "qulacs_gpu | False | False | False | False \n", - "qulacs | True | True | True | True \n", - "qibo | False | False | False | False \n", - "qiskit | True | True | True | True \n", - "cirq | True | True | True | True \n", - "pyquil | True | True | True | True \n", - "symbolic | True | False | False | True \n" - ] - } - ], - "source": [ - "import tequila as tq\n", - "tq.show_available_simulators()\n", - "from numpy import pi\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Create Simple Circuits" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Lets create some simple unparametrized circutis. \n", - "With unparametrized we mean here, that possible angles in the circuits are fixed. \n", - "You can create tequila circuits and gates over the `tq.gates` module. \n", - "Gates and circuits can be glued together with the `+` operation. \n", - "\n", - "Gates can receive the keyword arguments `target` and `control` which defines qubit(s) on which the gates act" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "circuit = tq.gates.H(target=0) + tq.gates.CNOT(target=1,control=0)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Circuits can be printed out in list-type form or can be drawn by the backends. \n", - "The result of tq.draw will depend which backends you have installed. \n", - "If you want to draw with a specific backend, just pass the `backend` keyword, e.g. tq.draw(circuit,`backend='cirq'`)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "circuit: \n", - "H(target=(0,))\n", - "X(target=(1,), control=(0,))\n", - "\n" - ] - } - ], - "source": [ - "print(circuit)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0: ───H───@───\n", - " │\n", - "1: ───────X───\n" - ] - } - ], - "source": [ - "tq.draw(circuit)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Lets do the same with a list of qubits and see what happens" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0: ───H───@───\n", - " │\n", - "1: ───H───X───\n" - ] - } - ], - "source": [ - "circuit = tq.gates.H(target=[0,1]) + tq.gates.X(target=1, control=0)\n", - "tq.draw(circuit)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Some gates have to be parametrized by `angle` and some can be parametrized by `power`. \n", - "Note that if you use cirq to draw circuits, it will display those in different units. This does not affect the simulation.\n", - "\n", - "Tequila uses the standard convention for qubit rotations:\n", - "$$\n", - "R_i(\\theta) = e^{-i\\frac{\\theta}{2} \\sigma_i}, \\qquad i \\in \\left\\{ X, Y, Z \\right\\}\n", - "$$\n", - "\n", - "which is carried over for multi-qubit rotations\n", - "$$\n", - "R_P(\\theta) = e^{-i\\frac{\\theta}{2} P}\n", - "$$\n", - "where $P$ is a paulistring like e.g. $X(0)Y(1)$" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0: ───H──────────@────────────────@───H───────────\n", - " │ │\n", - "1: ───Rx(0.5π)───X───Rz(0.318π)───X───Rx(-0.5π)───\n" - ] - } - ], - "source": [ - "# Some further examples\n", - "circuit0 = tq.gates.Ry(angle=1.0, target=0) + tq.gates.X(target=1, control=0)\n", - "circuit1 = tq.gates.Y(power=0.5, target=0) + tq.gates.Ry(angle=1.0, target=1, control=0)\n", - "circuit2 = tq.gates.Rp(angle=1.0, paulistring=\"Y(0)\") + tq.gates.X(target=1, control=0) # acts the same as circuit0\n", - "circuit3 = tq.gates.Rp(angle=1.0, paulistring=\"X(0)Y(1)\")\n", - "\n", - "generator = tq.paulis.Y(0)\n", - "circuit4 = tq.gates.Trotterized(generators=[generator], angles=[1.0], steps=1) # acts the same as circuit0\n", - "generator = tq.paulis.X(0)*tq.paulis.Y(1)\n", - "circuit5 = tq.gates.Trotterized(generators=[generator], angles=[1.0], steps=1) # acts the same as circuit3\n", - "\n", - "tq.draw(circuit3)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Simulate and Sample Simple Circuits" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Lets simulate our last created circuit. \n", - "This can be done by the `tq.simulate` function. \n", - "The return type is a `QubitWaveFunction`" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+0.5000|00> +0.5000|10> +0.5000|01> +0.5000|11> \n" - ] - } - ], - "source": [ - "wfn = tq.simulate(circuit)\n", - "print(wfn)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can control on which backend the simulation is executed with the `backend=name` keyword where name is one of the backends that are installed on your system (see first cell) " - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+0.5000|00> +0.5000|10> +0.5000|01> +0.5000|11> \n" - ] - } - ], - "source": [ - "# simulate on 'qulacs' backend (which is the default)\n", - "# Note that this cell will crash if qulacs is not installed\n", - "# just switch the name with something that is installed on your system (check the first cell)\n", - "wfn = tq.simulate(circuit, backend='qulacs')\n", - "print(wfn)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If you don't want to simulate a full wavefunction but rather simulate individual samples from it you can pass down the `samples=integer` keyword" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+4.0000|11> +2.0000|10> +4.0000|00> \n" - ] - } - ], - "source": [ - "measurements = tq.simulate(circuit, samples=10)\n", - "print(measurements)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can access the individual measurements either by integers in binary notation or by binary strings" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "4\n", - "4\n", - "2\n", - "2\n" - ] - } - ], - "source": [ - "print(measurements(0))\n", - "print(measurements(\"00\"))\n", - "print(measurements(2))\n", - "print(measurements(\"10\"))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Individual measurement instructions can be added over the `read_out_qubits` keyword" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "+1.0000|0> +5.0000|1> " - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "compiled_circuit = tq.compile(circuit, samples=10, backend=\"qulacs\")\n", - "\n", - "compiled_circuit(samples=10, read_out_qubits=[0])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Create Parametrized Circuits\n", - "\n", - "Now we will explore how to create parametrized circuits. \n", - "This works analogue to the simple circuits before, just that `angle` and `power` can be set to hashable types. \n", - "You can either initialize the variable directly or you can create a tequila variable object and use that. \n", - "The latter is only important if you intend to pass down a manipulated variable (like for example $a^2$ instead of just $a$)\n", - "\n", - "Lets start with something simple: A parametrized rotation on a single qubit. \n", - "We will call the variable $a$. \n", - "If the circuit gets simulated the value of the variable has to be specified. \n", - "This is done by passing down a dictionary holding the names and values of all variables." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# initialize the parametrized circuit\n", - "circuit = tq.gates.Ry(angle=\"a\", target=0)\n", - "pi = tq.numpy.pi\n", - "# set the value we want to simulate\n", - "variables = {\"a\" : pi**2}\n", - "wfn = tq.simulate(circuit, variables=variables)\n", - "print(wfn)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can see if a circuit is parametrized by calling `extract_variables` from the circuit. \n", - "Note that if you use the cirq backend to draw the circuit" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(\"circuit has variables: \", circuit.extract_variables())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now the same thing a little more sophisticated. \n", - "We will parametrized the gate by $a^2$ and also we want the $a$ to be in units of $\\pi$ " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "a = tq.Variable(\"a\")\n", - "\n", - "circuit = tq.gates.Ry(angle=(a*pi)**2, target=0)\n", - "\n", - "# set the value we want to simulate\n", - "variables = {\"a\" : 1.0}\n", - "wfn = tq.simulate(circuit, variables=variables)\n", - "print(wfn)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now the same again with a stronger transformation on the variables: \n", - "In general, if you want to apply transformations on Variables (and later on Objectives) this can be done with \n", - "`variable.apply(your_function)`. \n", - "Here we will take the exponential function of numpy. Note that it is adviced to take those functions from `tq.numpy` since this will be the `jax` numpy used for automaticl differentiation. \n", - "By doing so consistently you will avoid potential problems with gradients later." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "a = tq.Variable(\"a\")\n", - "\n", - "circuit = tq.gates.Ry(angle=((a*pi)**2).apply(tq.numpy.exp), target=0)\n", - "\n", - "# set the value we want to simulate\n", - "variables = {\"a\" : 1.0}\n", - "wfn = tq.simulate(circuit, variables=variables)\n", - "print(wfn)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Lets do the same thing once more, but this time with a customized transformation (which will do the same as in the last cell)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# define your own transformation\n", - "def my_trafo(x):\n", - " return tq.numpy.exp(x**2)\n", - "\n", - "a = tq.Variable(\"a\")\n", - "\n", - "# we will put the variable manipulation here for more overview\n", - "a = a*pi # a is now in a*pi\n", - "a = a.apply(my_trafo) # a is now exp((a*pi)**2)\n", - "\n", - "circuit = tq.gates.Ry(angle=a, target=0)\n", - "\n", - "# set the value we want to simulate\n", - "variables = {\"a\" : 1.0}\n", - "wfn = tq.simulate(circuit, variables=variables)\n", - "print(wfn)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note that you don't have to use strings as variable names. \n", - "You can use any hashable type except numeric types since those will be interpeted as fixed numbers.\n", - "Here is one example using a combination of strings and tuples" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "circuit = tq.gates.Ry(angle=(1,\"a\", \"its a stupid example\"), target=0)\n", - "print(circuit.extract_variables())\n", - "circuit = tq.gates.Ry(angle=(1,2,3), target=0)\n", - "print(circuit.extract_variables())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Create and Simulate Objectives/Expectationvalues" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Within tequila you can define qubit operators which can either be used to generate gates and circuits over `tq.gates.Rp`, `tq.gates.Trotterized` or `tq.gates.GeneralizedRotation` or as Hamiltonians defining the measurements on the quantum experiments. \n", - "\n", - "`QCircuit` and `QubitHamiltonian` objects can be combined to expectation values which can be combined and transformed to become more general `Objectives` (in tequila an expectation value is already objective in its simplest form).\n", - "\n", - "We will start by demonstrating this with a simple one qubit example. \n", - "We will take the one qubit rotation gate from previous sections and use a simple pauli operator as hamiltonian.\n", - "So our expectation value will be: \n", - "\n", - "$$\n", - "E = \\langle\\Psi(a)\\rvert H \\lvert\\Psi(a) \\rangle = \\langle0\\rvert U^\\dagger\\left(a\\right) H U\\left(a\\right) \\lvert 0\\rangle = \\langle H \\rangle_{ U\\left(a\\right)}\n", - "$$ \n", - " \n", - "where $H = \\sigma_x = X $ and $ U\\left(a\\right) = Ry(a)$" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# the circuit\n", - "U = tq.gates.Ry(angle=\"a\", target=0)\n", - "# the Hamiltonian\n", - "H = tq.paulis.X(0)\n", - "# the Objective (a single expectation value)\n", - "E = tq.ExpectationValue(H=H, U=U)\n", - "print(\"Hamiltonian \", H)\n", - "print(E)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# better not use it for large objectives\n", - "tq.draw(E)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Lets simulate the objective for some choices of our variable. \n", - "Note that the simulate function is the same as before for the circuits, you can use the `backend` and `sample` key in the same way. \n", - "\n", - "Since the objective is defined with parametrized quantum circuits, the values of the variables have to be passed down in the same way as before. \n", - "\n", - "Note that not all expectationvalues in the objective need to be parametrized and that the parameters don't need to be the same. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "variables = {\"a\": 1.0}\n", - "value = tq.simulate(E, variables=variables)\n", - "print(\"Objective({}) = {}\".format(variables[\"a\"], value))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here are some more intuitive examples of Hamiltonians. \n", - "Note that those operators are not automatically hermitian. \n", - "You can use the `split` function to get the hermitian and/or antihermitian part \n", - "Check also the `FAQ` notebook for some more information." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Pauli Operators can be initialilzed and added/multipled \n", - "H = tq.paulis.X(qubit=[0,1,2,3]) + tq.paulis.Y(2) + tq.paulis.Z(qubit=[0,1])*tq.paulis.X(2)\n", - "print(H, \" is hermitian = \", H.is_hermitian())\n", - "\n", - "H = tq.paulis.Z(0)*tq.paulis.Y(0) + tq.paulis.X(0)\n", - "print(H, \" is hermitian = \", H.is_hermitian())\n", - "\n", - "hermitian_part, anti_hermitian_part = H.split()\n", - "print(\"hermitian part = \", hermitian_part)\n", - "print(\"anti-hermitian part = \", anti_hermitian_part)\n", - "\n", - "H = tq.paulis.Projector(\"|00>\")\n", - "print(H, \" is hermitian = \", H.is_hermitian())\n", - "\n", - "H = tq.paulis.Projector(\"1.0*|00> + 1.0*|11>\")\n", - "print(H, \" is hermitian = \", H.is_hermitian())\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Lets proceed with our previous simple example of a single qubit rotation and a single X as Hamiltonian.\n", - "\n", - "If you intent to evaluate the objective with lots of different choices of the variables it is useful to compile it. A compiled objective is tied to a specific backend and can be used like a function taking a dictionary of variables.\n", - "\n", - "The compile function takes also the `backend` and `sample` keyword. If no backend is chosen tequila will pick automatically from the installed ones. If you intent to sample your objective instead of fully simulate it you can give a dummy integer of samples to `compile`. This will help tequila pick the best available backend but will not fix the number of samples for future evaluations.\n", - "\n", - "Compiling first will make your code faster since then the abstract circuits do not need to be re-translated to the backend every time." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "compiled_objective = tq.compile(E)\n", - "\n", - "# the compiled objective can now be used like a function\n", - "for value in [0.0, 0.5, 1.0]:\n", - " evaluated = compiled_objective(variables={\"a\": value})\n", - " print(\"objective({}) = {}\".format(value, evaluated))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Lets simulate our compiled objetive and plot the results" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def compile_and_evaluate(objective, steps=25, samples=None, start=0, stop=2*pi):\n", - " from matplotlib import pyplot as plt\n", - " plt.figure()\n", - " \n", - " compiled_objective = tq.compile(objective, samples=samples)\n", - " values = [start + (stop-start)*step/steps for step in range(steps)]\n", - " evaluated = [compiled_objective(variables={\"a\": value}, samples=samples) for value in values]\n", - "\n", - " plt.plot(values, evaluated)\n", - " plt.show()\n", - " return values, evaluated\n", - "\n", - "compile_and_evaluate(E);" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Lets do the same again with a more complicated objective. \n", - "Lets take the square of our original expectation value and shift it by 1\n", - "\n", - "$$\n", - "L = E^2 + 1\n", - "$$" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# this is the new objective\n", - "L = E**2 + 1\n", - "\n", - "compile_and_evaluate(L);" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And the same, but shifted by $e^{-a^2}$, so the shift is not constant and will only affect $L$ for small values of $a$.\n", - "\n", - "$$\n", - "L = E^2 + e^{-a^2}\n", - "$$" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# For completeness we initialize the variable again here\n", - "a = tq.Variable(\"a\")\n", - "# to be sure that the variable is the same as the one from the objective we could also do\n", - "# a = objective.extract_variables()[0]\n", - "\n", - "# this is the new objective\n", - "L = E**2 + (-a**2).apply(tq.numpy.exp)\n", - "\n", - "compile_and_evaluate(L);" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we also transform the expectation value in a more complicated way. It works the same way as it works for variables\n", - "\n", - "$$\n", - "L = exp(-E^2) + exp(-a^2)E\n", - "$$\n", - "\n", - "Note that the original expectation value now enters two times into the objective. \n", - "But tequila will only evaluate it once per run." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# For completeness we initialize the variable again here\n", - "a = tq.Variable(\"a\")\n", - "# to be sure that the variable is the same as the one from the objective we could also do\n", - "# a = objective.extract_variables()[0]\n", - "\n", - "# this is the new objective\n", - "L = E**2 + (-a**2).apply(tq.numpy.exp)*E\n", - "\n", - "compile_and_evaluate(L);\n", - "\n", - "# check how many (unique) expectation values are in the objective\n", - "print(L)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "At last, lets take our last objective but sample from it. \n", - "This means that in the evaluation of the expectation value the measurements on the underlying circuit are sampled. \n", - "Feel free to play with the number of samples." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# For completeness we initialize the variable again here\n", - "a = tq.Variable(\"a\")\n", - "# to be sure that the variable is the same as the one from the objective we could also do\n", - "# a = objective.extract_variables()[0]\n", - "\n", - "# this is the new objective\n", - "L = E**2 + (-a**2).apply(tq.numpy.exp)*E\n", - "\n", - "compile_and_evaluate(L, samples=1000);\n", - "\n", - "# check how many (unique) expectation values are in the objective\n", - "print(L)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Derivatives of Objectives\n", - "\n", - "Derivatives of objectives are objectives themselves.\n", - "They can be simply created by applying `tq.grad` on a objective. \n", - "\n", - "Lets take first objective and plot its derivative.\n", - "The first is easy to check since the derivative should just be the shifted sinus curve.\n", - "Feel free to change the objective and play around.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "L = E\n", - "\n", - "dLda = tq.grad(L, \"a\")\n", - "d2Ld2a = tq.grad(dLda, \"a\")\n", - "print(\"Objective:\\n\", L)\n", - "compile_and_evaluate(L);\n", - "print(\"First Derivative:\\n\",dLda)\n", - "compile_and_evaluate(dLda);\n", - "print(\"Second Derivative:\\n\",d2Ld2a)\n", - "compile_and_evaluate(d2Ld2a);\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# another example\n", - "L = E**2 + (-a**2).apply(tq.numpy.exp)*E\n", - "dLda = tq.grad(L, \"a\")\n", - "d2Ld2a = tq.grad(dLda, \"a\")\n", - "print(\"Objective:\\n\", L)\n", - "compile_and_evaluate(L);\n", - "print(\"First Derivative:\\n\",dLda)\n", - "compile_and_evaluate(dLda);\n", - "print(\"Second Derivative:\\n\",d2Ld2a)\n", - "compile_and_evaluate(d2Ld2a);\n", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# All in one\n", - "\n", - "At last we will create a small toy objective and use the phoenics optimizer to find local minima. \n", - "\n", - "As expectation value we will use an entangled circuit with one CNOT gate and one Ry rotation and an arbitrary chosen Hamiltonian.\n", - "\n", - "Our objective is defined as\n", - "\n", - "$$\\displaystyle\n", - "L = \\langle H \\rangle_{U(a)} + e^{-\\left(\\frac{\\partial}{\\partial a} \\langle H \\rangle_{U_{a}}\\right)^2 }\n", - "$$\n", - "\n", - "with \n", - "\n", - "$$\n", - "H = -X(0)X(1) + \\frac{1}{2}Z(0) + Y(1)\n", - "$$\n", - "\n", - "and \n", - "\n", - "$$\n", - "U = e^{-\\frac{e^{-a^2}}{2} Y(0)} \\text{CNOT}(0,1)\n", - "$$" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# All in one\n", - "\n", - "a = tq.Variable(\"a\")\n", - "U = tq.gates.Ry(angle=(-a**2).apply(tq.numpy.exp)*pi, target=0)\n", - "U += tq.gates.X(target=1, control=0)\n", - "\n", - "H = tq.QubitHamiltonian.from_string(\"-1.0*X(0)X(1)+0.5Z(0)+Y(1)\")\n", - "\n", - "E = tq.ExpectationValue(H=H, U=U)\n", - "dE = tq.grad(E, \"a\")\n", - "\n", - "objective = E + (-dE**2).apply(tq.numpy.exp)\n", - "\n", - "param, values = compile_and_evaluate(objective, steps=100, start =-5, stop=5);" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# We need to specify the phoenics config here\n", - "# the only change is that we are changing the interval for periodic boundary conditions to [-3,3] istead df [0, 2pi]\n", - "# not that the original interval would also work here\n", - "# we are restricting the search to 10 iterations here\n", - "# check out the notebook on phoenics for more information\n", - "phoenics_config = {'general': {'auto_desc_gen': 'False', 'batches': 5, 'boosted': 'False', 'parallel': 'False'}, 'parameters': [{'name': a, 'periodic': 'True', 'type': 'continuous', 'size': 1, 'low': -3., 'high': 3.}], 'objectives': [{'name': 'Energy', 'goal': 'minimize'}]}\n", - "result = tq.minimize(method='phoenics', objective = objective, phoenics_config = phoenics_config, maxiter=10)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# plot the points phoenics visited\n", - "# the information is in the optimizer history\n", - "# we have 'angles' and `energies' giving us information about every evaluation\n", - "import matplotlib.pyplot as plt\n", - "points = {}\n", - "energies = result.history.energies\n", - "angles = result.history.angles\n", - "for it, energy in enumerate(energies):\n", - " angle = angles[it][tq.Variable(\"a\")]\n", - " points[angle] = energy\n", - "\n", - "plt.plot(param, values, linestyle=\"--\")\n", - "plt.plot(list(points.keys()), list(points.values()), marker = \"o\", linestyle=\" \", label=\"phoenics\")\n", - "plt.legend()\n", - "plt.show()\n", - " \n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In case you want to play with different optimizers (see also the SciPyOptimizers and FAQ notebooks)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tq.show_available_optimizers()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "tequila-3.6", - "language": "python", - "name": "tequila-3.6" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/tutorials/Chemistry.ipynb b/tutorials/Chemistry.ipynb deleted file mode 100644 index a969eda2..00000000 --- a/tutorials/Chemistry.ipynb +++ /dev/null @@ -1,1046 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Tequila Chemistry Basics\n", - "\n", - "Here we show the basics of the tequila chemistry module. \n", - "In order for this to work you need to have psi4 installed in the same python environment as tequila. \n", - "If you are in a conda environment installing psi4 is easy:\n", - "`conda install psi4 -c psi4` \n", - "But better check the [psi4 website](http://www.psicode.org/) for up to date instructions.\n", - "\n", - "In some cases, problems with the environment were observed which are suspected to originate from conflicts between psi4 and tequila dependcies. Usually the safest way is to install psi4 **first** and then install tequila. \n", - "\n", - "Basic functionality is currently also provided with PySCF which might be easier to install. \n", - "\n", - "At the moment we only support automatized handling of closed-shell molecules\n", - "\n", - "This tutorial will give an overview over:\n", - "\n", - "- Initialization of molecules within tequila\n", - "- Usage of different qubit encodings from openermion (JW, BK, BKSF, Tapered-BK)\n", - "- Using basic functionality of Psi4 with tequila\n", - "- Setting up active spaces\n", - "- Constructing UCC based quantum circuits with tequila\n", - "\n", - "**There might be issues with psi4 and jupyter, currently the workarround is to reload the kernel before a cell gets executed, or run as a regular python script** \n", - "(issue seems to be resolved, leaving this warning in, just in case)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import tequila as tq" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Initialize Molecules\n", - "\n", - "Molecules can be initialized by passing their geometries as string or the name of a `xyz` file." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Qubit Encoding\n", - "transformation=\n", - "basis_set : sto-3g \n", - "geometry : H 0.0 0.0 0.0\n", - "Li 0.0 0.0 1.6 \n", - "description : \n", - "multiplicity : 1 \n", - "charge : 0 \n", - "closed_shell : True \n", - "name : molecule \n", - "\n", - "Psi4 Data\n", - "Point Group (full) : c_inf_v \n", - "Point Group (used) : c2v \n", - "nirrep : 4 \n", - "irreps : ['A1', 'A2', 'B1', 'B2'] \n", - "mos per irrep : [4, 0, 1, 1] \n", - "\n", - "The Orbitals are:\n", - "0 : 0A1 energy = -2.348839 \n", - "1 : 1A1 energy = -0.285276 \n", - "2 : 2A1 energy = +0.078216 \n", - "3 : 0B1 energy = +0.163950 \n", - "4 : 0B2 energy = +0.163950 \n", - "5 : 3A1 energy = +0.547769 \n" - ] - } - ], - "source": [ - "import tequila as tq\n", - "molecule = tq.chemistry.Molecule(geometry = \"H 0.0 0.0 0.0\\nLi 0.0 0.0 1.6\", basis_set=\"sto-3g\")\n", - "print(molecule)\n", - "\n", - "# lets also print some information about the orbitals\n", - "# we need it later\n", - "\n", - "print(\"The Orbitals are:\")\n", - "for orbital in molecule.orbitals:\n", - " print(orbital)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can initialize a tequila `QubitHamiltonian` from a molecule with `make_hamiltonian`.\n", - "The standard transformation is the `jordan-wigner` transformation. \n", - "You can use other transformations by initializing the molecule with the `transformation` keyword." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Hamiltonian has 631 terms\n", - "Hamiltonian has 12 qubits\n" - ] - } - ], - "source": [ - "import tequila as tq\n", - "H = molecule.make_hamiltonian()\n", - "# the LiH Hamiltonian is already quite large, better not print the full thing\n", - "print(\"Hamiltonian has {} terms\".format(len(H)))\n", - "print(\"Hamiltonian has {} qubits\".format(H.n_qubits))" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Hamiltonian has 631 terms\n", - "Hamiltonian has 12 qubits\n" - ] - } - ], - "source": [ - "molecule = tq.chemistry.Molecule(geometry = \"H 0.0 0.0 0.0\\nLi 0.0 0.0 1.6\", basis_set=\"sto-3g\", transformation=\"bravyi_kitaev\")\n", - "H = molecule.make_hamiltonian()\n", - "print(\"Hamiltonian has {} terms\".format(len(H)))\n", - "print(\"Hamiltonian has {} qubits\".format(H.n_qubits))" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "trafo_args = {'active_orbitals': 12, 'active_fermions': 4}\n", - "trafo_args = {'active_orbitals': 12, 'active_fermions': 4}\n", - "Hamiltonian has 631 terms\n", - "Hamiltonian has 10 qubits\n" - ] - } - ], - "source": [ - "molecule = tq.chemistry.Molecule(geometry = \"H 0.0 0.0 0.0\\nLi 0.0 0.0 1.6\", basis_set=\"sto-3g\", transformation=\"symmetry_conserving_bravyi_kitaev\")\n", - "H = molecule.make_hamiltonian()\n", - "print(\"Hamiltonian has {} terms\".format(len(H)))\n", - "print(\"Hamiltonian has {} qubits\".format(H.n_qubits))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Using different Qubit Encodings of OpenFermion" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The different qubit encodings of openfermion can be applied by passing the keyword `transformation` to the molecule and setting it to the name of the corresponding openfermion function. \n", - "\n", - "Some of those transformation might require additional keywords. Following `psi4` conventions those should be given to the `Molecule` initialization with the prefix `transformation__`. For most of them, `tequila` is however able to assign the keys automatically (see above for the `symmetry_conserving_bravyi_kitaev` transformation, that tapers off two qubits.\n", - "\n", - "In the following we provide some examples using various transformations from openfermion" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Jordan-Wigner\n", - " -0.0421+0.1777Z(0)+0.1777Z(1)-0.2427Z(2)-0.2427Z(3)+0.1706Z(0)Z(1)+0.0448Y(0)X(1)X(2)Y(3)-0.0448Y(0)Y(1)X(2)X(3)-0.0448X(0)X(1)Y(2)Y(3)+0.0448X(0)Y(1)Y(2)X(3)+0.1229Z(0)Z(2)+0.1677Z(0)Z(3)+0.1677Z(1)Z(2)+0.1229Z(1)Z(3)+0.1763Z(2)Z(3)\n", - "lowest energy = -1.1361894540879054\n", - "Bravyi-Kitaev\n", - " -0.0421+0.1777Z(0)+0.1777Z(0)Z(1)-0.2427Z(2)-0.2427Z(1)Z(2)Z(3)+0.1706Z(1)+0.0448Y(0)Z(1)Y(2)Z(3)+0.0448X(0)Z(1)X(2)+0.0448X(0)Z(1)X(2)Z(3)+0.0448Y(0)Z(1)Y(2)+0.1229Z(0)Z(2)+0.1677Z(0)Z(1)Z(2)Z(3)+0.1677Z(0)Z(1)Z(2)+0.1229Z(0)Z(2)Z(3)+0.1763Z(1)Z(3)\n", - "lowest energy = -1.136189454087905\n", - "trafo_args = {'active_orbitals': 4, 'active_fermions': 2}\n", - "trafo_args = {'active_orbitals': 4, 'active_fermions': 2}\n", - "Symmetry conserving Bravyi-Kitaev\n", - " -0.2879+0.4205Z(0)+0.4205Z(1)+0.0115Z(0)Z(1)+0.1790X(0)X(1)\n", - "lowest energy = -1.1361894540879054\n" - ] - } - ], - "source": [ - "import tequila as tq\n", - "import numpy\n", - "geomstring = \"H 0.0 0.0 0.0\\nH 0.0 0.0 0.7\"\n", - "basis_set = \"sto-3g\"\n", - "\n", - "# Jordan-Wigner (this is the default)\n", - "mol = tq.chemistry.Molecule(geometry=geomstring, basis_set=basis_set, transformation=\"jordan_wigner\")\n", - "H = mol.make_hamiltonian()\n", - "print(\"Jordan-Wigner\\n\", H)\n", - "eigenValues = numpy.linalg.eigvalsh(H.to_matrix())\n", - "print(\"lowest energy = \", eigenValues[0])\n", - "\n", - "# Bravyi-Kitaev\n", - "mol = tq.chemistry.Molecule(geometry=geomstring, basis_set=basis_set, transformation=\"bravyi_kitaev\")\n", - "H = mol.make_hamiltonian()\n", - "print(\"Bravyi-Kitaev\\n\", H)\n", - "eigenValues = numpy.linalg.eigvalsh(H.to_matrix())\n", - "print(\"lowest energy = \", eigenValues[0])\n", - "\n", - "# symmetry_conserving_bravyi_kitaev\n", - "# this transformation will taper off two qubits of the Hamiltonian\n", - "# it needs additional information on the number of spin-orbitals and the active_fermions/electrons in the system\n", - "mol = tq.chemistry.Molecule(geometry=geomstring, basis_set=basis_set,\n", - " transformation=\"symmetry_conserving_bravyi_kitaev\")\n", - "H = mol.make_hamiltonian()\n", - "print(\"Symmetry conserving Bravyi-Kitaev\\n\", H)\n", - "eigenValues = numpy.linalg.eigvalsh(H.to_matrix())\n", - "print(\"lowest energy = \", eigenValues[0])\n", - "\n", - "# Symmetry " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Setting active spaces\n", - "\n", - "You can define active spaces on your molcule by passing down a dictionary of active orbitals. \n", - "The orbitals are grouped into the irreducible representation of the underlying symmetry group (see the printout of `print(molecule)` above).\n", - "\n", - "Lets take the LiH molecule from above but initialize it with an active space containing the second two A1 orbitals (meaning the first 0A1 orbital is frozen) and the B1 orbital" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Hamiltonian has 62 terms\n" - ] - } - ], - "source": [ - "import tequila as tq\n", - "active_orbitals = {\"A1\":[1,2], \"B1\":[0]}\n", - "molecule = tq.chemistry.Molecule(geometry = \"H 0.0 0.0 0.0\\nLi 0.0 0.0 1.6\", basis_set=\"sto-3g\", active_orbitals=active_orbitals)\n", - "H = molecule.make_hamiltonian()\n", - "print(\"Hamiltonian has {} terms\".format(len(H)))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Lets make the active space even smaller, so that we can print out the full Hamiltonian" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Hamiltonian has 15 terms\n", - "-7.4711+0.1352Z(0)+0.1352Z(1)-0.0310Z(2)-0.0310Z(3)+0.1218Z(0)Z(1)+0.0059Y(0)X(1)X(2)Y(3)-0.0059Y(0)Y(1)X(2)X(3)-0.0059X(0)X(1)Y(2)Y(3)+0.0059X(0)Y(1)Y(2)X(3)+0.0617Z(0)Z(2)+0.0675Z(0)Z(3)+0.0675Z(1)Z(2)+0.0617Z(1)Z(3)+0.0782Z(2)Z(3)\n" - ] - } - ], - "source": [ - "import tequila as tq\n", - "active_orbitals = {\"A1\":[1], \"B1\":[0]}\n", - "molecule = tq.chemistry.Molecule(geometry = \"H 0.0 0.0 0.0\\nLi 0.0 0.0 1.6\", basis_set=\"sto-3g\", active_orbitals=active_orbitals)\n", - "H = molecule.make_hamiltonian()\n", - "print(\"Hamiltonian has {} terms\".format(len(H)))\n", - "print(H)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Computing classical methods with Psi4\n", - "\n", - "We can use psi4 to compute the energies (and sometimes other quantities) with the `compute_energy` function.\n", - "Here are some examples. Note that the energies are computed within the active space if one is set.\n", - "\n", - "Note also that not all active spaces can be represented by psi4 which will mean you can/should not use the classical psi4 methods with those (a warning will be printed). You will still get the right active space hamiltonian however.\n", - "\n", - "Active spaces which will not work for psi4 methds are the ones where the orbitals of individual irreps are not in one block ( e.g. {`\"A1\":[1,3]`} )" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "There are known issues with some psi4 methods and frozen virtual orbitals. Proceed with fingers crossed for mp2.\n", - "{(1, 0, 1, 0): -0.026069395810974533, (2, 0, 2, 0): -0.026069395810972833}\n", - "{(1, 0, 1, 0): -0.027418022914682542, (2, 0, 2, 0): -0.027418022914682535}\n" - ] - } - ], - "source": [ - "import tequila as tq\n", - "active_orbitals = {\"A1\":[1], \"B1\":[0], \"B2\":[0]}\n", - "molecule = tq.chemistry.Molecule(geometry = \"H 0.0 0.0 0.0\\nLi 0.0 0.0 1.6\", basis_set=\"sto-3g\", active_orbitals=active_orbitals)\n", - "\n", - "mp2 = molecule.compute_energy(method=\"mp2\")\n", - "\n", - "# Note there are known issues for some methods when the active space as frozen virtuals as is the case here\n", - "# detci based methods are fine again \n", - "fci = molecule.compute_energy(method=\"fci\")\n", - "\n", - "# for most coupled-cluster like models you can compute amplitudes\n", - "# Amplitudes are computed in c1 and in the full space, this is why the active space troubles from above usually don't hold\n", - "# Note that amplitudes are in closed-shell\n", - "amplitudes = molecule.compute_amplitudes(\"mp2\")\n", - "\n", - "# you can export a parameter dictionary which holds the indices of the amplitude as keys and values as values\n", - "# for this small active space that is only one amplitude for mp2\n", - "variables = amplitudes.make_parameter_dictionary()\n", - "print(variables)\n", - "\n", - "# similar for ccsd since the singles are 0 due to symmetry (that changes if you change the active space)\n", - "amplitudes = molecule.compute_amplitudes(\"ccsd\")\n", - "variables = amplitudes.make_parameter_dictionary()\n", - "print(variables)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Hello World \"H2\" optimization with LiH in an active space" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Lets do a small hand-constructed VQE like it would be done for the Hydrogen molecule in STO-3G, just that we use our active space LiH molecule from the cell above.\n", - "For consistency reasons we initialize everything again. \n", - "\n", - "Check the `BasicUsage` and `SciPyOptimizers` tutorial notebooks for more information about then" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Optimizer: \n", - "backend : qulacs\n", - "device : None\n", - "samples : None\n", - "save_history : True\n", - "noise : None\n", - "\n", - "Method : BFGS\n", - "Objective : 1 expectationvalues\n", - "gradient : 2 expectationvalues\n", - "\n", - "active variables : 1\n", - "\n", - "E=-7.19702401 angles= {a: 0.0} samples= None\n", - "E=-7.19766373 angles= {a: -0.0234220027923584} samples= None\n", - "E=-7.20203763 angles= {a: -0.11711001396179199} samples= None\n", - "E=-7.24749228 angles= {a: -0.49186205863952637} samples= None\n", - "E=-7.68640044 angles= {a: -1.9908702373504639} samples= None\n", - "E=-7.59671569 angles= {a: -7.986902952194214} samples= None\n", - "E=-7.86212174 angles= {a: -3.129600457337474} samples= None\n", - "E=-7.59889693 angles= {a: -1.7104055550334691} samples= None\n", - "E=-7.86268191 angles= {a: -3.0777237637496633} samples= None\n", - "E=-7.86268890 angles= {a: -3.0712456201159126} samples= None\n", - "Optimization terminated successfully.\n", - " Current function value: -7.862689\n", - " Iterations: 3\n", - " Function evaluations: 10\n", - " Gradient evaluations: 10\n", - "VQE : -7.8626889f\n", - "FCI : -7.8626889f\n" - ] - } - ], - "source": [ - "import tequila as tq\n", - "# define the active space\n", - "active_orbitals = {\"A1\":[1], \"B1\":[0]}\n", - "\n", - "# define the molecule\n", - "molecule = tq.chemistry.Molecule(geometry = \"H 0.0 0.0 0.0\\nLi 0.0 0.0 1.6\", basis_set=\"sto-3g\", active_orbitals=active_orbitals)\n", - "\n", - "# make the hamiltonian\n", - "H = molecule.make_hamiltonian()\n", - "\n", - "# define a hand designed circuit\n", - "U = tq.gates.Ry(angle=\"a\", target=0) + tq.gates.X(target=[2,3])\n", - "U += tq.gates.X(target=1, control=0)\n", - "U += tq.gates.X(target=2, control=0)\n", - "U += tq.gates.X(target=3, control=1)\n", - "\n", - "# define the expectationvalue\n", - "E = tq.ExpectationValue(H=H, U=U)\n", - "\n", - "# optimize\n", - "result = tq.minimize(objective=E, method=\"BFGS\", initial_values={k:0.0 for k in E.extract_variables()})\n", - "\n", - "# compute a reference value with psi4\n", - "fci = molecule.compute_energy(method=\"fci\")\n", - "\n", - "print(\"VQE : {:+2.8}f\".format(result.energy))\n", - "print(\"FCI : {:+2.8}f\".format(fci))\n" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# some more information from the optimization\n", - "result.history.plot(\"energies\", baselines={\"fci\":fci})" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Unitary Coupled-Cluster Style Construction\n", - "\n", - "Here we show how to initialize in the style of unitary coupled-cluster. \n", - "See also the overview article [arxiv.org/abs/2011.03057](https://arxiv.org/abs/2011.03057) for more details about the underlying methods.\n", - "\n", - "In the next example we are gonna compute the `mp2` amplitudes and build a UCC type circuit from them. \n", - "Here we use the cc2 amplitudes only to define an order on the trotterized gates and remove small amplitudes as classical prescreening.\n", - "\n", - "We use again an active space to make the computation fast.\n", - "\n", - "First we start with the manual construction and then show how to use in build convenience functions of tequila to.\n", - "\n", - "An important function is the `make_excitation_generator` function of the molecule. \n", - "This initializes a `QubitHamiltonian` which can be used to define a unitary gate which acts as excitation operation of electrons.\n", - "\n", - "$$\\displaystyle\n", - "U(\\theta) = e^{-i\\frac{\\theta}{2} G_{iajbkc\\dots}}\n", - "$$\n", - "\n", - "In fermionic language the generator is defined as\n", - "\n", - "$$\n", - "G_{ia,jb,jc,\\dots} = i ( a^\\dagger_a a_i a^\\dagger_b a_j a^\\dagger_c a_k \\dots - h.c. )\n", - "$$\n", - "\n", - "The `make_excitation_generator` function gives back this generator in the qubit representation (depends on the chosen `transformation` of the molecule) and takes the indices as list of tuples \n", - " \n", - "$$\n", - "\\texttt{make_excitation_generator(indices=[(a,i),(b,j),...])} \\longrightarrow G_{ia,jb,jc,\\dots}\n", - "$$\n", - "\n", - "You can use those generators to initialize \\textit{formally} Trotterized Gates (one step is exact): \n", - "$$\n", - "\\texttt{tq.gates.Trotterized(generators=[generator], angles=[\"a\"], steps=1)} \\longrightarrow U(\\theta) = e^{-i\\frac{\\theta}{2} G_{iajbkc\\dots}}\n", - "$$\n", - "\n", - "The last part was the general construction of gates over their parameters. In the case of Unitary coupled-cluster you can define fermionic gates directly, \\textsc{tequila} will then be able to compute analytical gradients with substantially reduced cost (see this article for an in-depth description: [arxiv.org/abs/2011.05938](https://arxiv.org/abs/2011.05938)). The fermionic gate is initialized over the same list of index-tuples that initialize generators:\n", - "\n", - "$$\n", - "\\texttt{make_excitation_gate(indices=[(a,i),(b,j),...])} \\longrightarrow U(\\theta) = e^{-i\\frac{\\theta}{2} G_{iajbkc\\dots}}\n", - "$$\n", - "\n", - "Angles can be either numeric types (such as 1.0, 1.5, numpy.pi/2) for fixed angles, any hashable type (such as \"a\", \"xyz\", (1,2,3) ) for variables, or a tequila objective for variable dependent transformations (see also the BasicUsage tutorial here). \n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Manual Construction" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "MP2 Amplitudes:\n", - " {(1, 0, 1, 0): -0.026069395810974533}\n", - "This is our circuit:\n", - "circuit: \n", - "X(target=(0,))\n", - "X(target=(1,))\n", - "FermionicEx(target=(0, 1, 2, 3), control=(), parameter=Objective with 0 unique expectation values\n", - "variables = [a]\n", - "types = [])\n", - "\n", - "Optimizer: \n", - "backend : qulacs\n", - "device : None\n", - "samples : None\n", - "save_history : True\n", - "noise : None\n", - "\n", - "Method : BFGS\n", - "Objective : 1 expectationvalues\n", - "gradient : 2 expectationvalues\n", - "\n", - "active variables : 1\n", - "\n", - "E=-7.86132988 angles= {a: 0.01} samples= None\n", - "E=-7.86253976 angles= {a: -0.05013059616088867} samples= None\n", - "E=-7.86268890 angles= {a: -0.03515792946196591} samples= None\n", - "Optimization terminated successfully.\n", - " Current function value: -7.862689\n", - " Iterations: 2\n", - " Function evaluations: 3\n", - " Gradient evaluations: 3\n", - "VQE : -7.8626889f\n", - "FCI : -7.8626889f\n", - "MP2 Amplitudes: {(1, 0, 1, 0): -0.026069395810974533}\n", - "Optimized UCC Amplitudes: a : -0.03515792946196591\n", - "\n" - ] - } - ], - "source": [ - "import tequila as tq\n", - "threshold = 1.e-6\n", - "\n", - "# define the active space\n", - "active_orbitals = {\"A1\":[1], \"B1\":[0]}\n", - "\n", - "# define the molecule\n", - "molecule = tq.chemistry.Molecule(geometry = \"H 0.0 0.0 0.0\\nLi 0.0 0.0 1.6\", basis_set=\"sto-3g\", active_orbitals=active_orbitals)\n", - "# make the hamiltonian\n", - "H = molecule.make_hamiltonian()\n", - "\n", - "# compute classical amplitudes\n", - "amplitudes = molecule.compute_amplitudes(method=\"mp2\")\n", - "\n", - "# in this example there is only one closed-shell MP2 amplitude, therefore manual construction is reasonable in this tutorial\n", - "# first we make a dictionary out of the non-zero MP2 amplitudes\n", - "ampdict = amplitudes.make_parameter_dictionary(threshold=threshold)\n", - "print(\"MP2 Amplitudes:\\n\", ampdict)\n", - "# lets get the indices of the only amplitude which is there manually\n", - "indices = list(ampdict.keys())[0]\n", - "\n", - "# the (1, 0, 1, 0) index in closed shell leads to the (2, 0, 3, 1) and (3, 1, 2, 0) excitations on the qubits\n", - "# but first we need to initialize the hartree fock state\n", - "U = molecule.prepare_reference()\n", - "\n", - "# UCC excitation gates can be directly initialized as follows:\n", - "# This will lead to significantly reduced cost in gradient evaluation (see text cell above)\n", - "# We also illustrate here how to define transformed angles by scaling the angle with 2.0\n", - "# (this makes it comarable to the MP2 amplitude, since it cancels out the conventional factor of 1/2 in the definition of the gates)\n", - "a = tq.Variable(\"a\")\n", - "U += molecule.make_excitation_gate(indices=[(3, 1),(2, 0)], angle=2.0*a)\n", - "\n", - "print(\"This is our circuit:\")\n", - "print(U)\n", - "\n", - "# lets form the expectation value\n", - "E = tq.ExpectationValue(H=H, U=U)\n", - "\n", - "# optimize\n", - "result = tq.minimize(objective=E, method=\"BFGS\", initial_values={k:0.01 for k in E.extract_variables()})\n", - "\n", - "# compute a reference value with psi4\n", - "fci = molecule.compute_energy(method=\"fci\")\n", - "print(\"VQE : {:+2.8}f\".format(result.energy))\n", - "print(\"FCI : {:+2.8}f\".format(fci))\n", - "print(\"MP2 Amplitudes:\", ampdict) # indices in spatial orbital notation\n", - "print(\"Optimized UCC Amplitudes:\", result.variables) # indices in spin-orbital notation\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Automatic Construction" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Optimizer: \n", - "backend : qulacs\n", - "device : None\n", - "samples : None\n", - "save_history : True\n", - "noise : None\n", - "\n", - "Method : BFGS\n", - "Objective : 1 expectationvalues\n", - "gradient : 4 expectationvalues\n", - "\n", - "active variables : 1\n", - "\n", - "E=-7.86186477 angles= {(1, 0, 1, 0): 0.0} samples= None\n", - "E=-7.86259809 angles= {(1, 0, 1, 0): -0.0468440055847168} samples= None\n", - "E=-7.86268890 angles= {(1, 0, 1, 0): -0.03516504106977361} samples= None\n", - "Optimization terminated successfully.\n", - " Current function value: -7.862689\n", - " Iterations: 2\n", - " Function evaluations: 3\n", - " Gradient evaluations: 3\n", - "VQE : -7.8626889f\n", - "FCI : -7.8626889f\n" - ] - } - ], - "source": [ - "import tequila as tq\n", - "threshold = 1.e-6\n", - "\n", - "# define the active space\n", - "active_orbitals = {\"A1\":[1], \"B1\":[0]}\n", - "\n", - "# define the molecule\n", - "molecule = tq.chemistry.Molecule(geometry = \"H 0.0 0.0 0.0\\nLi 0.0 0.0 1.6\", basis_set=\"sto-3g\", active_orbitals=active_orbitals)\n", - "\n", - "# make the hamiltonian\n", - "H = molecule.make_hamiltonian()\n", - "\n", - "# make the UCCSD ansatz (note that this will be without singles since it starts from mp2)\n", - "U = molecule.make_uccsd_ansatz(initial_amplitudes=\"mp2\", threshold=threshold, trotter_steps=1)\n", - "\n", - "# define the expectationvalue\n", - "E = tq.ExpectationValue(H=H, U=U)\n", - "\n", - "# optimize\n", - "result = tq.minimize(objective=E, method=\"BFGS\", initial_values={k:0.0 for k in E.extract_variables()})\n", - "\n", - "# compute a reference value with psi4\n", - "fci = molecule.compute_energy(method=\"fci\")\n", - "\n", - "print(\"VQE : {:+2.8}f\".format(result.energy))\n", - "print(\"FCI : {:+2.8}f\".format(fci))\n", - " \n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Pi System of Benzene\n", - "Here is the \\pi-system of Benzene, computed with the [UpCCGSD](https://pubs.acs.org/doi/10.1021/acs.jctc.8b01004) ansatz. The fermionic gradient techniques from [arxiv.org/abs/2011.05938](https://arxiv.org/abs/2011.05938) allow us to compute analytical gradients with a cost factor of 2 (this is the same cost as the cheapest 2-point numerical stencils). We neglect the singles here to speed-up the computation - so essentially this is UpCCGD. You can increase the `order` (in other words, the number of UpCCGD layers) to yield better energies. You can also try to build a batched optimization by re-using results from previous optimizations (get the optimized variables over `result.variables`)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "There are known issues with some psi4 methods and frozen virtual orbitals. Proceed with fingers crossed for mp2.\n", - "Optimizer: \n", - "backend : qulacs\n", - "device : None\n", - "samples : None\n", - "save_history : True\n", - "noise : None\n", - "\n", - "Method : BFGS\n", - "Objective : 1 expectationvalues\n", - "gradient : 30 expectationvalues\n", - "\n", - "active variables : 15\n", - "\n", - "E=-227.88792153\n", - "E=-227.91711515\n", - "E=-227.92873702\n", - "E=-227.92990736\n", - "E=-227.93052215\n", - "E=-227.93056604\n", - "E=-227.93057449\n", - "Optimization terminated successfully.\n", - " Current function value: -227.930574\n", - " Iterations: 6\n", - " Function evaluations: 7\n", - " Gradient evaluations: 7\n", - "VQE : -227.93057f\n", - "MP2 : -227.9475f\n", - "CISD: -227.98666f\n", - "FCI : -227.99711f\n" - ] - } - ], - "source": [ - "import tequila as tq\n", - "threshold = 1.e-6\n", - "active = {\"B1u\": [0], \"B3g\": [0, 1], \"B2g\": [0], \"Au\": [0], \"b1u\": [1]}\n", - "molecule = tq.quantumchemistry.Molecule(geometry=\"data/benzene.xyz\", basis_set='sto-3g', active_orbitals=active)\n", - "H = molecule.make_hamiltonian()\n", - "\n", - "U = molecule.make_upccgsd_ansatz(order=1, include_singles=False)\n", - "\n", - "# define the expectationvalue\n", - "E = tq.ExpectationValue(H=H, U=U)\n", - "\n", - "# compute reference energies\n", - "mp2 = molecule.compute_energy(\"mp2\")\n", - "cisd = molecule.compute_energy(\"detci\", options={\"detci__ex_level\": 2})\n", - "fci = molecule.compute_energy(\"fci\")\n", - "\n", - "# optimize\n", - "result = tq.minimize(objective=E, method=\"BFGS\", initial_values=0.0, print_level=2)\n", - "\n", - "print(\"VQE : {:+2.8}f\".format(result.energy))\n", - "print(\"MP2 : {:+2.8}f\".format(mp2))\n", - "print(\"CISD: {:+2.8}f\".format(cisd))\n", - "print(\"FCI : {:+2.8}f\".format(fci))" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "result.history.plot(\"energies\", baselines={\"fci\":fci, \"cisd\": cisd, \"mp2\":mp2}, filename=\"benzene_result_bfgs\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Noisy optimization of an active space molecule with tapered qubit embeding\n", - "\n", - "This example shows the combination of several features of tequila in a few lines. \n", - "Note that you will need to have `qiskit` installed for this. \n", - "If not: replace the `backend` and set `device=None` (there will be no specialized noise emulation in that case, see our tutorial on noise model on how to construct your own!)\n", - "\n", - "- automatic handling of active spaces\n", - "- consitent usage of qubit encodings (here the symmetry_conserving_bravyi_kitaev encoding from openfermion which reduces the number of qubits by 2)\n", - "- custom circuit construction\n", - "- unitary cluster circuits\n", - "- optimization of measurements (here the Hamiltonian will be grouped into two commuting groups, this can be seen by the optimizer output which holds two expectation values). See the [MeasurementGroups](https://github.com/aspuru-guzik-group/tequila/blob/master/tutorials/MeasurementGroups.ipynb) tutorial for more background information.\n", - "- interface to different quantum backends (you will need qiskit to run this cell)" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "trafo_args = {'active_orbitals': 12, 'active_fermions': 4}\n", - "trafo_args = {'active_orbitals': 4, 'active_fermions': 2}\n", - "Optimizer: \n", - "backend : qulacs\n", - "device : None\n", - "samples : None\n", - "save_history : True\n", - "noise : None\n", - "\n", - "Method : COBYLA\n", - "Objective : 2 expectationvalues\n", - "\n", - "active variables : 1\n", - "\n", - "E=-7.19702387 angles= {a: 0.0} samples= None\n", - "E=-7.33012819 angles= {a: 1.0} samples= None\n", - "E=-7.64648247 angles= {a: 2.0} samples= None\n", - "E=-7.85523319 angles= {a: 3.0} samples= None\n", - "E=-7.76445484 angles= {a: 4.0} samples= None\n", - "E=-7.84895802 angles= {a: 3.5} samples= None\n", - "E=-7.82776165 angles= {a: 2.75} samples= None\n", - "E=-7.86143017 angles= {a: 3.125} samples= None\n", - "E=-7.86244774 angles= {a: 3.25} samples= None\n", - "E=-7.85826778 angles= {a: 3.375} samples= None\n", - "E=-7.86100483 angles= {a: 3.3125} samples= None\n", - "E=-7.86268139 angles= {a: 3.21875} samples= None\n", - "E=-7.86258984 angles= {a: 3.1875} samples= None\n", - "E=-7.86267614 angles= {a: 3.203125} samples= None\n", - "E=-7.86265326 angles= {a: 3.2265625} samples= None\n", - "E=-7.86268759 angles= {a: 3.21484375} samples= None\n", - "E=-7.86268902 angles= {a: 3.2109375} samples= None\n", - "E=-7.86268473 angles= {a: 3.20703125} samples= None\n", - "E=-7.86268759 angles= {a: 3.208984375} samples= None\n", - "E=-7.86268902 angles= {a: 3.2119375} samples= None\n", - "Optimizer: \n", - "backend : qiskit\n", - "device : fake_rome\n", - "samples : 10000\n", - "save_history : True\n", - "noise : None\n", - "\n", - "Method : COBYLA\n", - "Objective : 2 expectationvalues\n", - "\n", - "active variables : 1\n", - "\n", - "E=-7.19702387 angles= {a: 0.0} samples= 10000\n", - "E=-7.32791853 angles= {a: 1.0} samples= 10000\n", - "E=-7.64811182 angles= {a: 2.0} samples= 10000\n", - "E=-7.85427999 angles= {a: 3.0} samples= 10000\n", - "E=-7.76262712 angles= {a: 4.0} samples= 10000\n", - "E=-7.85026312 angles= {a: 3.5} samples= 10000\n", - "E=-7.82797718 angles= {a: 2.75} samples= 10000\n", - "E=-7.86140490 angles= {a: 3.125} samples= 10000\n", - "E=-7.86260271 angles= {a: 3.25} samples= 10000\n", - "E=-7.85750961 angles= {a: 3.375} samples= 10000\n", - "E=-7.86095858 angles= {a: 3.3125} samples= 10000\n", - "E=-7.86324453 angles= {a: 3.21875} samples= 10000\n", - "E=-7.86271811 angles= {a: 3.1875} samples= 10000\n", - "E=-7.86283731 angles= {a: 3.203125} samples= 10000\n", - "E=-7.86209965 angles= {a: 3.2265625} samples= 10000\n", - "E=-7.86232805 angles= {a: 3.21484375} samples= 10000\n", - "E=-7.86293221 angles= {a: 3.220703125} samples= 10000\n", - "E=-7.86276293 angles= {a: 3.21775} samples= 10000\n", - "Optimizer: \n", - "backend : qulacs\n", - "device : None\n", - "samples : None\n", - "save_history : True\n", - "noise : None\n", - "\n", - "Method : COBYLA\n", - "Objective : 2 expectationvalues\n", - "\n", - "active variables : 1\n", - "\n", - "E=-7.86186457 angles= {(0, ((0, 2), (1, 3)), None): 0.0} samples= None\n", - "E=-7.72876072 angles= {(0, ((0, 2), (1, 3)), None): 1.0} samples= None\n", - "E=-7.68934298 angles= {(0, ((0, 2), (1, 3)), None): -1.0} samples= None\n", - "E=-7.80994129 angles= {(0, ((0, 2), (1, 3)), None): -0.5} samples= None\n", - "E=-7.85732555 angles= {(0, ((0, 2), (1, 3)), None): 0.24999999999999997} samples= None\n", - "E=-7.85635090 angles= {(0, ((0, 2), (1, 3)), None): -0.12499999999999999} samples= None\n", - "E=-7.86267853 angles= {(0, ((0, 2), (1, 3)), None): 0.06249999999999999} samples= None\n", - "E=-7.86219120 angles= {(0, ((0, 2), (1, 3)), None): 0.125} samples= None\n", - "E=-7.86243439 angles= {(0, ((0, 2), (1, 3)), None): 0.031249999999999993} samples= None\n", - "E=-7.86267900 angles= {(0, ((0, 2), (1, 3)), None): 0.078125} samples= None\n", - "E=-7.86264801 angles= {(0, ((0, 2), (1, 3)), None): 0.0859375} samples= None\n", - "E=-7.86268663 angles= {(0, ((0, 2), (1, 3)), None): 0.07421875} samples= None\n", - "E=-7.86268902 angles= {(0, ((0, 2), (1, 3)), None): 0.0703125} samples= None\n", - "E=-7.86268616 angles= {(0, ((0, 2), (1, 3)), None): 0.06640625} samples= None\n", - "E=-7.86268854 angles= {(0, ((0, 2), (1, 3)), None): 0.068359375} samples= None\n", - "E=-7.86268854 angles= {(0, ((0, 2), (1, 3)), None): 0.0713125} samples= None\n", - "Optimizer: \n", - "backend : qiskit\n", - "device : fake_rome\n", - "samples : 10000\n", - "save_history : True\n", - "noise : None\n", - "\n", - "Method : COBYLA\n", - "Objective : 2 expectationvalues\n", - "\n", - "active variables : 1\n", - "\n", - "E=-7.86185074 angles= {(0, ((0, 2), (1, 3)), None): 0.0} samples= 10000\n", - "E=-7.72668314 angles= {(0, ((0, 2), (1, 3)), None): 1.0} samples= 10000\n", - "E=-7.68907213 angles= {(0, ((0, 2), (1, 3)), None): -1.0} samples= 10000\n", - "E=-7.80885315 angles= {(0, ((0, 2), (1, 3)), None): -0.5} samples= 10000\n", - "E=-7.85614920 angles= {(0, ((0, 2), (1, 3)), None): 0.25} samples= 10000\n", - "E=-7.85703373 angles= {(0, ((0, 2), (1, 3)), None): -0.125} samples= 10000\n", - "E=-7.86282635 angles= {(0, ((0, 2), (1, 3)), None): 0.0625} samples= 10000\n", - "E=-7.86291409 angles= {(0, ((0, 2), (1, 3)), None): 0.125} samples= 10000\n", - "E=-7.86130190 angles= {(0, ((0, 2), (1, 3)), None): 0.15625} samples= 10000\n", - "E=-7.86234283 angles= {(0, ((0, 2), (1, 3)), None): 0.109375} samples= 10000\n", - "E=-7.86158419 angles= {(0, ((0, 2), (1, 3)), None): 0.1328125} samples= 10000\n", - "E=-7.86303949 angles= {(0, ((0, 2), (1, 3)), None): 0.12109375} samples= 10000\n", - "E=-7.86273146 angles= {(0, ((0, 2), (1, 3)), None): 0.1171875} samples= 10000\n", - "E=-7.86206484 angles= {(0, ((0, 2), (1, 3)), None): 0.119140625} samples= 10000\n", - "E=-7.86176157 angles= {(0, ((0, 2), (1, 3)), None): 0.12209375} samples= 10000\n", - "VQE = -7.86268902\n", - "VQE (noisy) = -7.86324453\n", - "UCC = -7.86268902\n", - "UCC (noisy) = -7.86303949\n" - ] - } - ], - "source": [ - "import tequila as tq\n", - "# define the active space\n", - "active_orbitals = {\"A1\":[1], \"B1\":[0]}\n", - "samples = 10000\n", - "if 'qiskit' in tq.INSTALLED_SIMULATORS:\n", - " backend = \"qiskit\"\n", - " device = \"fake_rome\"\n", - "else:\n", - " backend = None\n", - " device = None\n", - "\n", - "# define the molecule\n", - "molecule = tq.chemistry.Molecule(geometry = \"H 0.0 0.0 0.0\\nLi 0.0 0.0 1.6\",\n", - " basis_set=\"sto-3g\",\n", - " active_orbitals=active_orbitals,\n", - " transformation=\"symmetry_conserving_bravyi_kitaev\")\n", - "\n", - "fci = molecule.compute_energy(\"fci\")\n", - "\n", - "H = molecule.make_hamiltonian()\n", - "\n", - "# Toy circuit (no deeper meaning)\n", - "U = tq.gates.Ry(angle=\"a\", target=0)\n", - "U += tq.gates.X(target=1, control=0)\n", - "E = tq.ExpectationValue(H=H, U=U, optimize_measurements=True)\n", - "\n", - "vqe = tq.minimize(method=\"cobyla\", objective=E, initial_values=0.0)\n", - "noisy_vqe = tq.minimize(method=\"cobyla\", objective=E, samples=samples, backend=backend, device=device, initial_values=0.0)\n", - " \n", - "# The same with UpCCGSD\n", - "UpCCGSD = molecule.make_upccgsd_ansatz(include_singles=False)\n", - "E2 = tq.ExpectationValue(H=H, U=UpCCGSD, optimize_measurements=True)\n", - "ucc = tq.minimize(method=\"cobyla\", objective=E2, initial_values=0.0)\n", - "noisy_ucc = tq.minimize(method=\"cobyla\", objective=E2, samples=samples, backend=backend, device=device, initial_values=0.0)\n", - "\n", - "print(\"VQE = {:2.8f}\".format(min(vqe.history.energies)))\n", - "print(\"VQE (noisy) = {:2.8f}\".format(min(noisy_vqe.history.energies)))\n", - "print(\"UCC = {:2.8f}\".format(min(ucc.history.energies)))\n", - "print(\"UCC (noisy) = {:2.8f}\".format(min(noisy_ucc.history.energies)))\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "tequila-3.6", - "language": "python", - "name": "tequila-3.6" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/tutorials/ChemistryBasisSetFreeVQE.ipynb b/tutorials/ChemistryBasisSetFreeVQE.ipynb deleted file mode 100644 index e6d5eb32..00000000 --- a/tutorials/ChemistryBasisSetFreeVQE.ipynb +++ /dev/null @@ -1,300 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Basis Set Free VQE calculations with Tequila" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import tequila as tq\n", - "import numpy\n", - "\n", - "# global variables\n", - "# symmetry_conserving_bravyi_kitaev will result in a underlying 2-qubit simulation instead of 4 (for all vqe calculations)\n", - "transformation = \"jordan_wigner\" # alternatives: bravyi_kitaev, symmetry_conserving_bravyi_kitaev (will taper 2 qubits), bravyi_kitaev_tree\n", - "data_directory=\"data/h2_pnos/\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This tutorial illustrates one of the explicit calculations of [arxiv.org/abs/2008.02819](https://arxiv.org/abs/2008.02819). We restrict ourselves to a minimal calculation of the Hydrogen molecule since this will execute within a jupyter environment without taking to much resources.\n", - "\n", - "Note that you can use this tutorial without having `madness` installed. If you want to compute the MRA-PNOs yourself, checkout our tutorial on the `tequila`-`madness` interface!.\n", - "\n", - "In this notebook we will compute the Hydrogen molecule in a minimal representation (2 spatial orbitals i.e. 4 spin-orbitals) using standard Gaussian basis sets (GBS) and the basis-set-free MRA-PNO representation. In the end we will show a comparisson with a large GBS computation that would require around 120 qubits.\n", - "\n", - "This notebook illustrates how to:\n", - "- define custom molecules from integral values\n", - "- use the in-build UpGCCSD ansatz in `tequila`\n", - "- compare to classical methods like FCI\n", - "- manually diagonalize a qubit Hamiltonian\n", - "\n", - "\n", - "The Hamiltonians are computed with a modified pno code of [`madness`](https://github.com/m-a-d-n-e-s-s/madness) which will be public soon (feel free to contact [me](mailto:jakob.kottmann@utoronto.ca) for early access or more information). The `madness` PNO-Code is described in more detail here [/doi.org/10.1063/1.5141880](https://doi.org/10.1063/1.5141880).\n", - "\n", - "The main difference in usage will be, that we will create the Hamiltonians directly from integral files that were originally obtained with `madness` and are for this tutorial provided in the `data` directory. Those integrals can be used to create `tequila` molecule objects which can then be handeled in the same way as other `tequila` molecules - for example obtained with the `psi4` backend. See the general [chemistry tutorial](https://github.com/aspuru-guzik-group/tequila/blob/master/tutorials/Chemistry.ipynb). Note however, that access to the classical `psi4` methods is not possible.\n", - "\n", - "We begin with reading in the `.npy` files which hold the molecular integrals obtained from the direct-determined PNOs that are stored in the `data/h2_pnos` directory for Hydrogen molecules in minimal representation (2 spatial-orbitals i.e. 4 spin-orbitals) and different bond lengths R in the directories `h2_R_4so`. Theese integral files can be passed to the `tequila` molecule object.\n", - "\n", - "We define a function here to reuse it later when we compute the whole potential energy surface (PES)." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "def initialize_molecule(R):\n", - " geomstring = \"H 0.0 0.0 0.0\\nH 0.0 0.0 {R}\".format(R=R)\n", - " directory = data_directory + \"h2_{:1.1f}_4so/\".format(R)\n", - " \n", - " # load the integral files\n", - " one_body_integrals = numpy.load(directory+\"one_body_integrals.npy\")\n", - " two_body_integrals = numpy.load(directory+\"two_body_integrals.npy\")\n", - " # resort from Mulliken notation to openfermion convetions\n", - " two_body_integrals = numpy.einsum(\"psqr\", two_body_integrals)\n", - " \n", - " # compute the nuclear repulsion (optional)\n", - " angstrom_to_bohr=1.8897\n", - " nuclear_repulsion = 1.0/(angstrom_to_bohr*R)\n", - "\n", - " \n", - " molecule = tq.chemistry.Molecule(geometry=geomstring,\n", - " one_body_integrals=one_body_integrals,\n", - " two_body_integrals=two_body_integrals,\n", - " nuclear_repulsion=nuclear_repulsion,\n", - " transformation=transformation,\n", - " backend=\"base\") # necessary if psi4 or others are installed\n", - " \n", - " return molecule\n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next we define the 1-UpCCGSD calculation used in [arxiv.org/abs/2008.02819](https://arxiv.org/abs/2008.02819) as a function to be called later for the whole PES" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "def compute_upgccsd_energy(molecule, method=\"BFGS\", *args, **kwargs):\n", - " U = molecule.make_upccgsd_ansatz()\n", - " H = molecule.make_hamiltonian()\n", - " E = tq.ExpectationValue(H=H, U=U)\n", - " \n", - " result = tq.minimize(objective=E, method=method, initial_values=0.0, *args, **kwargs)\n", - " \n", - " return result.energy" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now lets compute all MRA datapoints in two simple lines (remove the `silent=True` key to get live updates about the individual VQE simulatins)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "points = [0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 2.0, 3.0, 4.0]\n", - "mra_vqe = {R:compute_upgccsd_energy(initialize_molecule(R), silent=True) for R in points} " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here are the results of our basis-set-free calculations" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "import matplotlib.pyplot as plt\n", - "plt.figure()\n", - "plt.plot(list(mra_vqe.keys()), list(mra_vqe.values()), marker=\"o\", label=\"UpCCGSD(2,4)\")\n", - "plt.legend()\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "For the case that psi4 is installed within your environment we can compute also the STO-3G energies in exact diagonalization (or with the VQE using the function above, but for this size the results will be the same, we compute both to illustrate that).\n", - "See the [paper](https://arxiv.org/abs/2008.02819) for the numbers close to the complete basis set limit (CBS), which is the exact solution with respect to electron correlation (FCI) and one-particle basis and larger MRA caluclations.\n", - "Set `no_compute=True` to avoid recomputing and save time." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "no_compute = True\n", - "# in case you have psi4 installed you can compute the reference values here\n", - "if \"psi4\" in tq.quantumchemistry.INSTALLED_QCHEMISTRY_BACKENDS and not no_compute:\n", - " def initialize_psi4_molecule(R):\n", - " geomstring = \"H 0.0 0.0 0.0\\nH 0.0 0.0 {R}\".format(R=R)\n", - " molecule = tq.chemistry.Molecule(basis_set=\"sto-3g\", geometry=geomstring, transformation=transformation)\n", - " return molecule\n", - " gbs_fci = {R:initialize_psi4_molecule(R).compute_energy(\"fci\") for R in points}\n", - " gbs_vqe = {R:compute_upgccsd_energy(initialize_psi4_molecule(R), silent=True) for R in points}\n", - "else:\n", - " # otherwise, here they are\n", - " gbs_vqe = {0.5: -1.05515979168155, 0.6: -1.1162859536932939, 0.7: -1.1361894250426225, 0.8: -1.1341473711383794, 0.9: -1.120560281221029, 1.0: -1.1011503300331484, 1.1: -1.0791929437201784,1.2: -1.0567407365989585,1.3: -1.0351862019508562,1.4: -1.015467897671673,2.0: -0.9486410371613808,3.0: -0.9336318373138941,4.0: -0.9331713618417009}\n", - " gbs_fci = {0.5: -1.0551597946880178,0.6: -1.1162860069722242,0.7: -1.1361894540879063,0.8: -1.1341476666428472,0.9: -1.1205602812268745,1.0: -1.1011503301329566,1.1: -1.079192944852247,1.2: -1.05674074617943,1.3: -1.035186266306758,1.4: -1.0154682491653277,2.0: -0.9486411121296501,3.0: -0.933631844555985,4.0: -0.9331713618435854}\n", - " \n", - "# close to CBS: FCI/cc-pVQZ calculation\n", - "# can be computed with the tequila psi4 interface in the same way as STO-3G (but takes time)\n", - "close_to_cbs = {0.5:-1.10338122, 0.6:-1.15531049,0.7:-1.1725277, 0.8:-1.17182109,0.9:-1.16178264,1.0:-1.14710242,1.1:-1.13045400,1.2:-1.11340654,1.3:-1.09689852,1.4:-1.08149165,2.0:-1.02143838,3.0:-1.00109047,4.0:-0.99995503}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here are the comparisson plots. We use the notation (number_of_electrons, number_of_spin_orbitals) to indicate the sizes of the Hamiltonians. \n", - "In this case we have minimal sizes (the smallest size where a treatment beyond mean-field is possible) which results in 4 spin-orbitals (and usually 4 qubits)." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plt.figure()\n", - "plt.plot(list(mra_vqe.keys()), list(mra_vqe.values()), marker=\"o\", label=\"UpCCGSD/MRA(2,4)\")\n", - "plt.plot(list(gbs_vqe.keys()), list(gbs_vqe.values()), marker=\"o\", label=\"UpCCGSD/STO-3G(2,4)\")\n", - "plt.plot(list(gbs_fci.keys()), list(gbs_fci.values()), marker=\"x\", label=\"FCI/STO-3G(2,4)\")\n", - "plt.plot(list(close_to_cbs.keys()), list(close_to_cbs.values()), marker=\"x\", label=\"FCI/cc-pVQZ(2,120)\")\n", - "\n", - "plt.legend()\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To provide a complete picutre here are the values from the exact diagonalization of the Hamiltonian in MRA reprentation\n", - "(we initialize the `tequila` molecule, create the hamiltonian, export it as matrix and diagonalize with `numpy`).\n", - "The UpGCCSD is as good for MRA as it is for GBS (compared with exact diagonalization within those representations)." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "mra_diag = {R:numpy.linalg.eigvalsh(initialize_molecule(R).make_hamiltonian().to_matrix())[0] for R in points} " - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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k5CQEG644QYAPvroI0JCQujWrRsdOnTgzTffPGv9InLWvAtZWVn88Y9/xOVyERcXR+/evenUqRNdunQp+AZ5Sd544w1EhOPHjwN512t65plnLu4NqMFcTifxa79m49Q/kTO5Dd1/Hk/rjFi2hNzIb9d9TpNndtJ73DRaRVxudVRVhemeRGHNI2H+HXDLR9DqqrwCkf/YC4GBgcTFxZVBwLPFxcURExPDddddV9C2Zs2agstf165dm/j4eLKysggMDGTZsmU0b37mcejbbruNt99+m9TUVNq3b8+IESMICwsD8i7bHR0dzezZs8+49MaHH37ITTfdhM1mo1atWsycOZO2bduSlJREjx49GDRoEMHBZ58IPXToEN9///0Z33O4/vrrefrpp3niiSeoVatWmb4/1Y1xu9m9dS2p6z6l9dHvuIwT/G4C2BZ8Ff7dbqNjnxvp5edf+oqUOk81q0gsfQKO/HruPnWbwifD836eToaQDrBySt6tOE06w+AL3zM4deoUPXv2ZNGiRbRv355Ro0bRv39/7rnnHu6//342bdpEVlYWI0aMKLgUx6ZNm3jooYf4/fff8ff3Z9myZTzzzDNkZWWxZs0aJk2axG233ca33357xuQ71113HYsXL2bEiBHMnj2bUaNGsXr16rMyNWzYkDZt2pCcnExYWBjGGObPn8+yZcu48soryc7OLpiJ7tNPP+Wzzz4DoF27dgXraNasGZdccgkpKSnFFom//vWvvPrqqwXzQkDe3k7fvn355ptvuPXWWy/4vawJDu3+lcRVMwk99A1tTRItjI2E2r04dNkIIv54K5fXrmt1RFVN6eGmogKC8wrEqUN5PwO8HxaYlZV1xuGmuXPnUq9ePd5++23uuOMO5syZw8mTJ7nnnnuAvEt4x8TEsHXrVn766Se2bt1Kbm4ut912G1OnTmXLli0sX7684JpMt912G3Fxcdx2221A3jWJipsAKDs7m61bt9KrV69icx48eJDs7OyCy3b//PPPtGrViksvvZS+ffuyePFiAHJzc9m7d+9Zl/8G2LhxI7m5uQXXpSps4cKFNG/enK5du561LCoqqtjCVZMdTzrA+s9eZOdLlxM2K5peB94n3R7Cxs7PkfXQDro/vpQe191FoBYIVY5q1p7E+Xzizz/EdNXjEPMB9J2Yd+jJCyUdbrr66quZP38+48ePZ8uW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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plt.figure()\n", - "plt.plot(list(mra_vqe.keys()), list(mra_vqe.values()), marker=\"o\", label=\"UpGCCGSD/MRA(2,4)\")\n", - "plt.plot(list(mra_diag.keys()), list(mra_vqe.values()), marker=\"x\", label=\"Exact/MRA(2,4)\")\n", - "plt.legend()\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "tequila-chemistry", - "language": "python", - "name": "tequila-chemistry" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.7" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/tutorials/ChemistryExcitedState.ipynb b/tutorials/ChemistryExcitedState.ipynb deleted file mode 100644 index 9992d61c..00000000 --- a/tutorials/ChemistryExcitedState.ipynb +++ /dev/null @@ -1,505 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Example for an excited state calculation\n", - "\n", - "Short example of how to form the objectives for the ''hangman's'' approach to excited states. \n", - "Here the states are sequentially computed and are kept orhogonal towards previous states by projection. \n", - "\n", - "The method was for example applied in:\n", - "https://pubs.acs.org/doi/pdf/10.1021/acs.jctc.8b01004\n", - "\n", - "See also our overview article [arxiv.org/abs/2011.03057](http://arxiv.org/abs/2011.03057) and our article on optimized fermionic gradients [arxiv.org/abs/2011.05938](https://arxiv.org/abs/2011.05938) for more information.\n", - "\n", - "The overlap objective is formed from the quantum circuits of the optimized lower lying states $U_i$ and the current parametrized circuit $U(a)$ like this:\n", - "\n", - "$$\n", - "S_i^2(a) = \\|\\langle \\Psi_i \\rvert \\Psi(a) \\rangle\\|^2 = \\|\\langle 0 \\rvert U_i^\\dagger U(a) \\lvert 0 \\rangle\\|^2 = \n", - " \\langle 0 \\rvert U^\\dagger(a) U_i P_0 U_i^\\dagger U(a) \\lvert\\rangle = \\langle P_0 \\rangle_{U_i^\\dagger U(a)} $$\n", - " \n", - "where $P_0 = \\lvert 0..0 \\rangle \\langle 0..0 \\rvert = \\otimes^n Q_+ = \\frac{1}{2^n} \\otimes^n (1 + Z)$.\n", - "\n", - "Bound states can then be kept orthogonal by projecting lower lying states out which is equivalent as minimizing the objective:\n", - "\n", - "$$\n", - " L = \\langle H \\rangle_{U(a)} - E_i S_i^2(a)\n", - "$$\n", - "\n", - "\n", - "We will use an active space Beryllium Hydride molecule with two orbitals because the circuit template is easy to construct for this example and it executes fast.\n", - "\n", - "" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "geomstring=\"be 0.0 0.0 0.0\\nh 0.0 0.0 {R}\\nh 0.0 0.0 -{R}\"" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Optimizing point R=0.7\n", - "Starting to optimize state 0\n", - "finished with energy -15.08170491\n", - "Starting to optimize state 1\n", - "finished with energy -14.15900421\n", - "Optimizing point R=0.8\n", - "Starting to optimize state 0\n", - "finished with energy -15.36599843\n", - "Starting to optimize state 1\n", - "finished with energy -14.48743629\n", - "Optimizing point R=0.9\n", - "Starting to optimize state 0\n", - "finished with energy -15.54369428\n", - "Starting to optimize state 1\n", - "finished with energy -14.70864582\n", - "Optimizing point R=1.0\n", - "Starting to optimize state 0\n", - "finished with energy -15.65189560\n", - "Starting to optimize state 1\n", - "finished with energy -14.85821915\n", - "Optimizing point R=1.1\n", - "Starting to optimize state 0\n", - "finished with energy -15.71447523\n", - "Starting to optimize state 1\n", - "finished with energy -14.95919037\n", - "Optimizing point R=1.2\n", - "Starting to optimize state 0\n", - "finished with energy -15.74678206\n", - "Starting to optimize state 1\n", - "finished with energy -15.02665710\n", - "Optimizing point R=1.3\n", - "Starting to optimize state 0\n", - "finished with energy -15.75882309\n", - "Starting to optimize state 1\n", - "finished with energy -15.07069683\n", - "Optimizing point R=1.4\n", - "Starting to optimize state 0\n", - "finished with energy -15.75724857\n", - "Starting to optimize state 1\n", - "finished with energy -15.09814167\n", - "Optimizing point R=1.5\n", - "Starting to optimize state 0\n", - "finished with energy -15.74656111\n", - "Starting to optimize state 1\n", - "finished with energy -15.11368465\n", - "Optimizing point R=1.6\n", - "Starting to optimize state 0\n", - "finished with energy -15.72985528\n", - "Starting to optimize state 1\n", - "finished with energy -15.12058067\n", - "Optimizing point R=1.7\n", - "Starting to optimize state 0\n", - "finished with energy -15.70927740\n", - "Starting to optimize state 1\n", - "finished with energy -15.12111282\n", - "Optimizing point R=1.8\n", - "Starting to optimize state 0\n", - "finished with energy -15.68632055\n", - "Starting to optimize state 1\n", - "finished with energy -15.11689854\n", - "Optimizing point R=1.9\n", - "Starting to optimize state 0\n", - "finished with energy -15.66202362\n", - "Starting to optimize state 1\n", - "finished with energy -15.10909748\n", - "Optimizing point R=2.0\n", - "Starting to optimize state 0\n", - "finished with energy -15.63711497\n", - "Starting to optimize state 1\n", - "finished with energy -15.09854221\n", - "Optimizing point R=2.1\n", - "Starting to optimize state 0\n", - "finished with energy -15.61210615\n", - "Starting to optimize state 1\n", - "finished with energy -15.08584404\n", - "Optimizing point R=2.2\n", - "Starting to optimize state 0\n", - "finished with energy -15.58736645\n", - "Starting to optimize state 1\n", - "finished with energy -15.07144165\n", - "Optimizing point R=2.3\n", - "Starting to optimize state 0\n", - "finished with energy -15.56316904\n", - "Starting to optimize state 1\n", - "finished with energy -15.05565071\n", - "Optimizing point R=2.4\n", - "Starting to optimize state 0\n", - "finished with energy -15.53971717\n", - "Starting to optimize state 1\n", - "finished with energy -15.03869534\n", - "Optimizing point R=2.5\n", - "Starting to optimize state 0\n", - "finished with energy -15.51716630\n", - "Starting to optimize state 1\n", - "finished with energy -15.02072334\n", - "Optimizing point R=2.6\n", - "Starting to optimize state 0\n", - "finished with energy -15.49563432\n", - "Starting to optimize state 1\n", - "finished with energy -15.00182438\n", - "Optimizing point R=2.7\n", - "Starting to optimize state 0\n", - "finished with energy -15.47520982\n", - "Starting to optimize state 1\n", - "finished with energy -14.98204422\n", - "Optimizing point R=2.8\n", - "Starting to optimize state 0\n", - "finished with energy -15.45595568\n", - "Starting to optimize state 1\n", - "finished with energy -14.96139622\n", - "Optimizing point R=2.9\n", - "Starting to optimize state 0\n", - "finished with energy -15.43791611\n", - "Starting to optimize state 1\n", - "finished with energy -14.93987083\n", - "Optimizing point R=3.0\n", - "Starting to optimize state 0\n", - "finished with energy -15.42111687\n", - "Starting to optimize state 1\n", - "finished with energy -14.91745281\n", - "Optimizing point R=3.1\n", - "Starting to optimize state 0\n", - "finished with energy -15.40557042\n", - "Starting to optimize state 1\n", - "finished with energy -14.89412975\n" - ] - } - ], - "source": [ - "import tequila as tq\n", - "\n", - "fci_gs = []\n", - "fci_es = []\n", - "energies_gs = []\n", - "energies_es = []\n", - "P0 = tq.paulis.Projector(\"|00>\")\n", - "for R in [0.7 + 0.1*i for i in range(25)]:\n", - " print(\"Optimizing point R={:2.1f}\".format(R))\n", - " active = {\"b1u\": [0], \"b2u\": [0]}\n", - " mol = tq.chemistry.Molecule(geometry=geomstring.format(R=R), basis_set=\"6-31g\", active_orbitals=active)\n", - " H = mol.make_hamiltonian()\n", - " results = []\n", - " for i in range(2):\n", - " U = tq.gates.Ry((i, \"a\"), 0)\n", - " U += tq.gates.CNOT(0, 1) + tq.gates.CNOT(0, 2)\n", - " U += tq.gates.CNOT(1, 3) + tq.gates.X([2, 3])\n", - " E = tq.ExpectationValue(U, H)\n", - " active_vars = E.extract_variables()\n", - " angles = {angle: 0.0 for angle in active_vars}\n", - " for data, U2 in results:\n", - " S2 = tq.ExpectationValue(H=P0, U=U + U2.dagger())\n", - " E -= data.energy * S2\n", - " angles = {**angles, **data.angles}\n", - " print(\"Starting to optimize state \", i)\n", - " result = tq.optimizer_scipy.minimize(E, method=\"bfgs\", variables=active_vars, initial_values=angles, silent=True)\n", - " print(\"finished with energy {:2.8f}\".format(result.energy))\n", - " results.append((result, U))\n", - " energies_gs.append(results[0][0].energy)\n", - " energies_es.append(results[1][0].energy)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "import matplotlib.pyplot as plt\n", - "R = [0.7 + 0.1*i for i in range(len(energies_gs))]\n", - "plt.figure()\n", - "plt.plot(R, energies_gs, marker=\"o\", label=\"VQE GS\")\n", - "plt.plot(R, energies_es, marker=\"o\", label=\"VQE ES\")\n", - "plt.legend()\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here is the same calculation using the [UpCCGSD](https://pubs.acs.org/doi/10.1021/acs.jctc.8b01004) construction for the untitary circuit with \\textsc{tequila}s [optimized scheme for fermionic gradients](https://arxiv.org/abs/2011.05938). \n", - "In addition we changed to numerical gradients in order to not spend to much time on computing in this notebook. \n", - "Note that in this super restricted active space we do not need to change the reference (allthough we could speed up convergence by switching from the Hartree-Fock reference (in jordan_wigner encoding: $\\lvert 1100 \\rangle)$ to the double excited configuration ($\\lvert 0011 \\rangle$). \n", - "\n", - "Try it out by setting `include_reference=False` in `make_upccgsd` and adding the gates to prepare the reference manually." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Optimizing point R=0.7\n", - "Starting to optimize state 0\n", - "finished with energy -15.08170497\n", - "Starting to optimize state 1\n", - "finished with energy -14.15900421\n", - "Optimizing point R=0.8\n", - "Starting to optimize state 0\n", - "finished with energy -15.36599853\n", - "Starting to optimize state 1\n", - "finished with energy -14.48743439\n", - "Optimizing point R=0.9\n", - "Starting to optimize state 0\n", - "finished with energy -15.54369454\n", - "Starting to optimize state 1\n", - "finished with energy -14.70864582\n", - "Optimizing point R=1.0\n", - "Starting to optimize state 0\n", - "finished with energy -15.65189604\n", - "Starting to optimize state 1\n", - "finished with energy -14.85821915\n", - "Optimizing point R=1.1\n", - "Starting to optimize state 0\n", - "finished with energy -15.71447564\n", - "Starting to optimize state 1\n", - "finished with energy -14.95918560\n", - "Optimizing point R=1.2\n", - "Starting to optimize state 0\n", - "finished with energy -15.74678225\n", - "Starting to optimize state 1\n", - "finished with energy -15.02665520\n", - "Optimizing point R=1.3\n", - "Starting to optimize state 0\n", - "finished with energy -15.75882312\n", - "Starting to optimize state 1\n", - "finished with energy -15.07069683\n", - "Optimizing point R=1.4\n", - "Starting to optimize state 0\n", - "finished with energy -15.75724857\n", - "Starting to optimize state 1\n", - "finished with energy -15.09814167\n", - "Optimizing point R=1.5\n", - "Starting to optimize state 0\n", - "finished with energy -15.74656115\n", - "Starting to optimize state 1\n", - "finished with energy -15.11368179\n", - "Optimizing point R=1.6\n", - "Starting to optimize state 0\n", - "finished with energy -15.72985545\n", - "Starting to optimize state 1\n", - "finished with energy -15.12057972\n", - "Optimizing point R=1.7\n", - "Starting to optimize state 0\n", - "finished with energy -15.70927757\n", - "Starting to optimize state 1\n", - "finished with energy -15.12111282\n", - "Optimizing point R=1.8\n", - "Starting to optimize state 0\n", - "finished with energy -15.68632048\n", - "Starting to optimize state 1\n", - "finished with energy -15.11689758\n", - "Optimizing point R=1.9\n", - "Starting to optimize state 0\n", - "finished with energy -15.66202368\n", - "Starting to optimize state 1\n", - "finished with energy -15.10909748\n", - "Optimizing point R=2.0\n", - "Starting to optimize state 0\n", - "finished with energy -15.63711399\n", - "Starting to optimize state 1\n", - "finished with energy -15.09854412\n", - "Optimizing point R=2.1\n", - "Starting to optimize state 0\n", - "finished with energy -15.61210472\n", - "Starting to optimize state 1\n", - "finished with energy -15.08584499\n", - "Optimizing point R=2.2\n", - "Starting to optimize state 0\n", - "finished with energy -15.58736515\n", - "Starting to optimize state 1\n", - "finished with energy -15.07144260\n", - "Optimizing point R=2.3\n", - "Starting to optimize state 0\n", - "finished with energy -15.56316923\n", - "Starting to optimize state 1\n", - "finished with energy -15.05564880\n", - "Optimizing point R=2.4\n", - "Starting to optimize state 0\n", - "finished with energy -15.53971719\n", - "Starting to optimize state 1\n", - "finished with energy -15.03869534\n", - "Optimizing point R=2.5\n", - "Starting to optimize state 0\n", - "finished with energy -15.51716630\n", - "Starting to optimize state 1\n", - "finished with energy -15.02072334\n", - "Optimizing point R=2.6\n", - "Starting to optimize state 0\n", - "finished with energy -15.49563265\n", - "Starting to optimize state 1\n", - "finished with energy -15.00182533\n", - "Optimizing point R=2.7\n", - "Starting to optimize state 0\n", - "finished with energy -15.47520834\n", - "Starting to optimize state 1\n", - "finished with energy -14.98204517\n", - "Optimizing point R=2.8\n", - "Starting to optimize state 0\n", - "finished with energy -15.45595480\n", - "Starting to optimize state 1\n", - "finished with energy -14.96139526\n", - "Optimizing point R=2.9\n", - "Starting to optimize state 0\n", - "finished with energy -15.43791527\n", - "Starting to optimize state 1\n", - "finished with energy -14.93987083\n", - "Optimizing point R=3.0\n", - "Starting to optimize state 0\n", - "finished with energy -15.42111621\n", - "Starting to optimize state 1\n", - "finished with energy -14.91745281\n", - "Optimizing point R=3.1\n", - "Starting to optimize state 0\n", - "finished with energy -15.40557002\n", - "Starting to optimize state 1\n", - "finished with energy -14.89412975\n" - ] - } - ], - "source": [ - "import tequila as tq\n", - "\n", - "fci_gs = []\n", - "fci_es = []\n", - "energies_gs = []\n", - "energies_es = []\n", - "P0 = tq.paulis.Projector(\"|00>\")\n", - "for R in [0.7 + 0.1*i for i in range(25)]:\n", - " print(\"Optimizing point R={:2.1f}\".format(R))\n", - " active = {\"b1u\": [0], \"b2u\": [0]}\n", - " mol = tq.chemistry.Molecule(geometry=geomstring.format(R=R), basis_set=\"6-31g\", active_orbitals=active)\n", - " H = mol.make_hamiltonian()\n", - " results = []\n", - " for i in range(2):\n", - " # labeling ensures that tequila can distinguish the variables\n", - " # singles can break the symmetry here falling into different states than the two above\n", - " # (i.e. the open-shell singly excited manifold: in jordan_wigner those states are build from\n", - " # |1001> and |0110>)\n", - " U = mol.make_upccgsd_ansatz(label=i, include_singles=False) \n", - " E = tq.ExpectationValue(U, H)\n", - " active_vars = E.extract_variables()\n", - " angles = {angle: 0.0 for angle in active_vars}\n", - " for data, U2 in results:\n", - " S2 = tq.ExpectationValue(H=P0, U=U + U2.dagger())\n", - " E -= data.energy * S2\n", - " angles = {**angles, **data.angles}\n", - " print(\"Starting to optimize state \", i)\n", - " result = tq.optimizer_scipy.minimize(E, silent=True, method=\"bfgs\", method_options={\"finite_diff_rel_step\":1.e-4, \"eps\":1.e-4}, variables=active_vars, initial_values=angles)\n", - " print(\"finished with energy {:2.8f}\".format(result.energy))\n", - " results.append((result, U))\n", - " energies_gs.append(results[0][0].energy)\n", - " energies_es.append(results[1][0].energy)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "import matplotlib.pyplot as plt\n", - "R = [0.7 + 0.1*i for i in range(len(energies_gs))]\n", - "plt.figure()\n", - "plt.plot(R, energies_gs, marker=\"o\", label=\"VQE GS\")\n", - "plt.plot(R, energies_es, marker=\"o\", label=\"VQE ES\")\n", - "plt.legend()\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "tequila-chemistry", - "language": "python", - "name": "tequila-chemistry" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.7" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/tutorials/ChemistryMadnessInterface.ipynb b/tutorials/ChemistryMadnessInterface.ipynb deleted file mode 100644 index 81ee8171..00000000 --- a/tutorials/ChemistryMadnessInterface.ipynb +++ /dev/null @@ -1,326 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Basis-Set-Free VQEs with the Tequila - Madness interface" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This tutorial covers the basic usage of the `tequila`-`madness` interface. \n", - "It is currently brief and stenographic since the interface is still under development. \n", - "The current version is however powerful enough to reproduce all results from our [article](https://arxiv.org/abs/2008.02819)!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "One of `tequila`s primary aims is to simplify usage of many specialized algorithms and programs. The underlying technology should however be acknowledged, so if you are using the interface please acknowledge/cite the following articles:\n", - "- Our initial [article](https://arxiv.org/abs/2008.02819) describing the interface and introducint MRA-PNOs to quantum computing.\n", - "- The original [article](https://doi.org/10.1063/1.5141880) that describes the underlying MRA-PNO-MP2 implementation in `madness`.\n", - "- The `madness` overview [article](https://doi.org/10.1137/15M1026171).\n", - "- The `tequila` overview [article](https://arxiv.org/abs/2011.03057).\n", - "- In case you are using our automatically differentiable framework for unitary coupled-cluster, please also cite the [article](https://arxiv.org/abs/2011.05938) describing this simulation.\n", - "- Please also cite the corresponding articles of the quantum simulators and optimizers that you are using within `tequila`.\n", - "\n", - "If you just want to play with the hydrogen molecule in a minimal basis-set-free representation without installing `madness`, there is a short tutorial on this as well!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Installation of madness and depenencies\n", - "\n", - "Currently the necessary version of `madness` is available over a fork under: https://github.com/kottmanj/madness . It is not yet merged into the main repository of madness, but will be at some point in the near future. \n", - "You find installation instructions in the [README](https://github.com/kottmanj/madness) respectively github page of this fork. `madness` can be a beast to install, feel free to contact [me](mailto:jakob.kottmann@utoronto.ca) if you are running into trouble.\n", - "\n", - "After you compiled madness from the fork (make sure the `tequila` branch was checked out - it is the default, but it doesn't hurt to check). There are two ways to let `tequila` know about is.\n", - "- export the path to the madness root (that is the directory where you compiled the code) as the environment variable 'MAD_ROOT_DIR'. E.g `export MAD_ROOT_DIR=/path/to/where/you/compiled/madness/`. You need to do this in your terminal (Linux or Mac) before you run your python script. `tequila` is then able to find the corresponding executable directly\n", - "- you provide the path to the `pno_integrals` executable yourself. E.g `tq.Molecule(..., executable=\"/path/to/madness/src/apps/pno/pno_integrals\")`.\n", - "\n", - "You can exploit the second option and provide the path to a customized script that will itself call `pno_integrals` in some way (this is for example an option if you are using windows and want to run madness over docker or some kind of virtual machine. See the above github fork of madness for more information on how to use it with docker).\n", - "\n", - "In the following I will use the second option and provide the path to madness on my laptop. I'll leave that in, since that might clarify the usage a bit." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "executable = \"/home/jsk/devel/madness/build-opt/src/apps/pno/pno_integrals\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Use Tequila to compute a QubitHamiltonian with madness\n", - "\n", - "Here is how you can create a simple QubitHamiltonian over the interface. \n", - "Checkout the main chemistry tutorial and see what you can further do with this (the usage is equivalent). \n", - "- Choose different qubit encodints over the `transformation` keyword (the default is Jordan-Wigner - see the main chemistry tutorial)\n", - "- the `name` keyword is optional, the default is just `molecule`, it will mostly affect the output files names\n", - "- the `n_pno` keyword specifies how many pnos shall be computed and used. Note that the total number of orbitals is always `n_pno` plus all occupied Hartree-Fock orbitals." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Starting madness calculation with executable: /home/jsk/devel/madness/build-opt/src/apps/pno/pno_integrals\n", - "output redirected to helium_1pno_pno_integrals.out logfile\n", - "finished after 45.39036822319031s\n" - ] - } - ], - "source": [ - "import tequila as tq\n", - "geomstring = \"He 0.0 0.0 0.0\"\n", - "mol = tq.Molecule(geometry=geomstring, n_pno=1, executable=executable, name=\"helium_1pno\")\n", - "H = mol.make_hamiltonian()" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Qubit Encoding\n", - "transformation=\n", - "\n", - "Parameters\n", - "basis_set : custom \n", - "geometry : He 0.0 0.0 0.0 \n", - "description : \n", - "multiplicity : 1 \n", - "charge : 0 \n", - "closed_shell : True \n", - "name : helium_1pno \n", - "\n", - "MRA Orbitals :\n", - "orbital 0, occupied reference orbital (0,), energy -0.917962 \n", - "orbital 1, pno from pair (0, 0), MP2 occ 0.00437667 \n", - "\n", - "executable : /home/jsk/devel/madness/build-opt/src/apps/pno/pno_integrals\n", - "htensor : helium_1pno_htensor.npy\n", - "gtensor : helium_1pno_gtensor.npy\n", - "\n" - ] - } - ], - "source": [ - "# some information about the molecule\n", - "print(mol)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Read in already existing madness outputs\n", - "\n", - "If you give `n_pno=None` tequila will try to read in the orbital data form madness. \n", - "The following files are required: `name_htensor.npy` (or `molecule_htensor.bin`) `name_gtensor.npy` (or `molecule_gtensor.bin`) and `pnoinfo.txt`. Note that the `.bin` files should not be copied between different computers. `name` can be specific as keyword (default is just `molecule`)." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Qubit Encoding\n", - "transformation=\n", - "\n", - "Parameters\n", - "basis_set : custom \n", - "geometry : He 0.0 0.0 0.0 \n", - "description : \n", - "multiplicity : 1 \n", - "charge : 0 \n", - "closed_shell : True \n", - "name : helium_1pno \n", - "\n", - "MRA Orbitals :\n", - "orbital 0, occupied reference orbital (0,), energy -0.917962 \n", - "orbital 1, pno from pair (0, 0), MP2 occ 0.00437667 \n", - "\n", - "executable : /home/jsk/devel/madness/build-opt/src/apps/pno/pno_integrals\n", - "htensor : helium_1pno_htensor.npy\n", - "gtensor : helium_1pno_gtensor.npy\n", - "\n" - ] - } - ], - "source": [ - "mol2 = tq.Molecule(geometry=geomstring, n_pno=None, executable=executable, name=\"helium_1pno\")\n", - "print(mol2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Use the PNO-UpCCD ansatz\n", - "Check our [article](https://arxiv.org/abs/2008.02819) for more details on the ansatz. \n", - "Note that the PNOs do not need to be directly determined over a basis-set-free approach for this ansatz, but this is currently the only implementation. \n", - "Note, that the following four lines use all the technology mentioned in the first cell of this notebook. Please acknowledge it if you use it :-).\n", - "The used simulator is not specified hiere, so tequila will pick depending on what you have installed (you can see it in the printout)." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Starting madness calculation with executable: /home/jsk/devel/madness/build-opt/src/apps/pno/pno_integrals\n", - "output redirected to molecule_pno_integrals.out logfile\n", - "finished after 9.489994764328003s\n", - "refs= [orbital 0, occupied reference orbital (0,), energy -0.917962 ]\n", - "Optimizer: \n", - "backend : qulacs\n", - "device : None\n", - "samples : None\n", - "save_history : True\n", - "noise : None\n", - "\n", - "Method : BFGS\n", - "Objective : 1 expectationvalues\n", - "gradient : 6 expectationvalues\n", - "\n", - "active variables : 3\n", - "\n", - "E=-2.86152285 angles= {(0, ((0, 2), (1, 3)), None): 0.0, (0, (0, 2), None): 0.0, (0, (1, 3), None): 0.0} samples= None\n", - "E=-2.85540235 angles= {(0, ((0, 2), (1, 3)), None): 0.2644369900226593, (0, (0, 2), None): 6.854534149169922e-06, (0, (1, 3), None): 6.854534149169922e-06} samples= None\n", - "E=-2.87761682 angles= {(0, ((0, 2), (1, 3)), None): 0.12154174082914501, (0, (0, 2), None): 3.150512388571456e-06, (0, (1, 3), None): 3.150512388571456e-06} samples= None\n", - "E=-2.87761855 angles= {(0, ((0, 2), (1, 3)), None): 0.12159293536327934, (0, (0, 2), None): -0.0016298963380842438, (0, (1, 3), None): -0.0016298963380842438} samples= None\n", - "Optimization terminated successfully.\n", - " Current function value: -2.877619\n", - " Iterations: 2\n", - " Function evaluations: 4\n", - " Gradient evaluations: 4\n" - ] - } - ], - "source": [ - "import tequila as tq\n", - "geomstring = \"He 0.0 0.0 0.0\"\n", - "mol = tq.Molecule(geometry=geomstring, n_pno=1, executable=executable)\n", - "U = mol.make_pno_upccgsd_ansatz(generalized=False)\n", - "H = mol.make_hamiltonian()\n", - "E = tq.ExpectationValue(H=H, U=U)\n", - "result = tq.minimize(method=\"bfgs\", objective=E, initial_values=0.0)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Customize the madness calculation\n", - "\n", - "The underlying madness calculation can be customized by giving the corresponding sub-programs as keywords combined with dictionaries that hold the parameters.\n", - "To get an idea what is there: Check the output file `name_pno_integrals.out` generated by a madness calculation with default parameters and also the input file `input` writen by tequila. Here is some example how to customize it (here we change the polynomial order of the MRA which needs to be set in the scf calculation and increase the maximum rank of the PNOs which will result in 4 computed PNOs where the most important one is used for the QubitHamiltonian - this is just to illustrate the API, neither will have a notable effect on the Helium Hamiltonian with 1 PNO.). Note that the `scf` section is called `dft` in madness for historic reasons." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Starting madness calculation with executable: /home/jsk/devel/madness/build-opt/src/apps/pno/pno_integrals\n", - "output redirected to helium_1pno_alt_pno_integrals.out logfile\n", - "finished after 37.68571734428406s\n" - ] - } - ], - "source": [ - "mol3 = tq.Molecule(geometry=geomstring, n_pno=1, executable=executable, name=\"helium_1pno_alt\", dft={\"k\":9}, pno={\"maxrank\":4})\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Compute orbitals with frozen-core approximation\n", - "You can freeze occupied HF orbitals in the MP2-PNO calculation by setting the freeze keyword (e.g. `pno={\"freeze\":1}` or you just set `frozen_core=True` when intializing the Molecule." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Starting madness calculation with executable: /home/jsk/devel/madness/build-opt/src/apps/pno/pno_integrals\n", - "output redirected to molecule_pno_integrals.out logfile\n", - "finished after 16.654462337493896s\n" - ] - } - ], - "source": [ - "mol = tq.Molecule(geometry=\"Be 0.0 0.0 0.0\", n_pno=1, executable=executable, frozen_core=True)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "tequila-3.6", - "language": "python", - "name": "tequila-3.6" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/tutorials/FAQ.ipynb b/tutorials/FAQ.ipynb deleted file mode 100644 index 38d61e86..00000000 --- a/tutorials/FAQ.ipynb +++ /dev/null @@ -1,819 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Frequently Asked Questions:\n", - "\n", - "### It is recommended to take a look at the `BasicUsage` notebook before looking at this" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "running build_ext\n", - "skipping '/Users/sumneralperin-lea/.pyxbld/temp.macosx-10.9-x86_64-3.6/pyrex/BayesianNetwork/kernel_prob_reshaping.cpp' Cython extension (up-to-date)\n", - "skipping 'BayesianNetwork.kernel_prob_reshaping' extension (up-to-date)\n", - "running build_ext\n", - "skipping '/Users/sumneralperin-lea/.pyxbld/temp.macosx-10.9-x86_64-3.6/pyrex/BayesianNetwork/kernel_evaluations.cpp' Cython extension (up-to-date)\n", - "skipping 'BayesianNetwork.kernel_evaluations' extension (up-to-date)\n" - ] - } - ], - "source": [ - "import tequila as tq\n", - "import numpy" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Which optimization methods can I use?\n", - "\n", - "`tq.show_available_optimizers` shows you all installed modules no your systems and the methods which `tq.minimize` understands. Method names are not case sensitive when passed to `tq.minimize`. \n", - "\n", - "In the end you see which modules are supported and which of them are actually installed on your system. \n", - "The table with methods and modules will only show you the methods for modules that are currently installed within your environment. \n", - "\n", - "Of course you can also use tequila objectives for your own optimizers. \n", - "You don't need to use the modules here." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "available methods for optimizer modules found on your system:\n", - "method | optimizer module\n", - "--------------------------\n", - "NELDER-MEAD | scipy\n", - "COBYLA | scipy\n", - "POWELL | scipy\n", - "SLSQP | scipy\n", - "L-BFGS-B | scipy\n", - "BFGS | scipy\n", - "CG | scipy\n", - "TNC | scipy\n", - "TRUST-KRYLOV | scipy\n", - "NEWTON-CG | scipy\n", - "DOGLEG | scipy\n", - "TRUST-NCG | scipy\n", - "TRUST-EXACT | scipy\n", - "TRUST-CONSTR | scipy\n", - "adam | gd\n", - "adagrad | gd\n", - "adamax | gd\n", - "nadam | gd\n", - "sgd | gd\n", - "momentum | gd\n", - "nesterov | gd\n", - "rmsprop | gd\n", - "rmsprop-nesterov | gd\n", - "lbfgs | gpyopt\n", - "direct | gpyopt\n", - "cma | gpyopt\n", - "phoenics | phoenics\n", - "Supported optimizer modules: ['scipy', 'phoenics', 'gpyopt', 'gd']\n", - "Installed optimizer modules: ['scipy', 'gd', 'gpyopt', 'phoenics']\n" - ] - } - ], - "source": [ - "tq.show_available_optimizers()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Which simulators/Quantum-Backends can I use?\n", - "\n", - "`tq.show_available_simulators` shows all simulators/quantum backends which are supported by tequila as well as which are installed within your current environment. \n", - "\n", - "The default choice if you don't specify a backend when for example simulating a tequila objective with `tq.simulate` is the first entry of the supported backends which is installed on your system." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "backend | wfn | sampling | noise | devices | installed \n", - "--------------------------------------------------------------------\n", - "qulacs | True | True | True | False | True \n", - "qiskit | True | True | True | True | True \n", - "cirq | True | True | True | True | True \n", - "pyquil | True | True | True | True | True \n", - "symbolic | True | False | False | False | True \n" - ] - } - ], - "source": [ - "tq.show_available_simulators()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Can I avoid re-translation/compilation on my objectives/circuits?\n", - "\n", - "Yes you can. By calling `tq.compile` instead of `tq.simulate`.\n", - "This will give you back a callable objective. \n", - "Check also the `basic usage` tutorial notebook" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+0.7071|00> +0.6205|01> -0.3390i|11> \n", - "+0.7071|00> +0.3821|01> -0.5950i|11> \n", - "compiled circuit: \n", - "+0.7071|00> +0.6205|01> -0.3390i|11> \n", - "+0.7071|00> +0.3821|01> -0.5950i|11> \n", - "compiled objective: Objective with 1 unique expectation values\n", - "variables = [a]\n", - "types = not compiled\n", - "1.1770184\n", - "1.2067055\n", - "compiled objective: Objective with 1 unique expectation values\n", - "variables = [a]\n", - "types = []\n", - "1.1770184\n", - "1.2067055\n" - ] - } - ], - "source": [ - "U = tq.gates.H(target=1) + tq.gates.Rx(angle=\"a\", target=0, control=1)\n", - "\n", - "# simulate the wavefunction with different variables\n", - "wfn0 = tq.simulate(U, variables={\"a\": 1.0})\n", - "wfn1 = tq.simulate(U, variables={\"a\": 2.0})\n", - "\n", - "print(wfn0)\n", - "print(wfn1)\n", - "\n", - "# the same, but avoiding re-compilation\n", - "# Note that your compiled object is translated to a quantum backend\n", - "# if the backend was not set, tequila it will pick the default which depends\n", - "# on which backends you have installed. You will seee it in the printout of the\n", - "# compiled circuits\n", - "compiled_U = tq.compile(U)\n", - "wfn0 = compiled_U(variables={\"a\":1.0})\n", - "wfn1 = compiled_U(variables={\"a\":2.0})\n", - "\n", - "print(\"compiled circuit:\", compiled_U)\n", - "print(wfn0)\n", - "print(wfn1)\n", - "\n", - "\n", - "# With Objectives it works in the same way\n", - "H = tq.paulis.Y(0)\n", - "E = tq.ExpectationValue(H=H, U=U)\n", - "objective = E**2 + 1.0\n", - "\n", - "# simulate the objective with different variables\n", - "result0 = tq.simulate(objective, variables={\"a\": 1.0})\n", - "result1 = tq.simulate(objective, variables={\"a\": 2.0})\n", - "\n", - "print(\"compiled objective:\", objective)\n", - "print(result0)\n", - "print(result1)\n", - "\n", - "# compile and then simulate\n", - "compiled_objective = tq.compile(objective)\n", - "result0 = compiled_objective(variables={\"a\":1.0})\n", - "result1 = compiled_objective(variables={\"a\":2.0})\n", - "\n", - "print(\"compiled objective:\", compiled_objective)\n", - "print(result0)\n", - "print(result1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# how can I run on a real quantum computer?\n", - "Tequila can both emulate -- and when possible, operate via -- real quantum devices.\n", - "For example:\n", - "IBM's Qiskit can be used to run on some of IBM's public accessible quantum computers.\n", - "All you need for this is an ibm account (Follow the instructions under \"Configure your IBM Quantum Experience credentials\" here: https://github.com/Qiskit/qiskit-ibmq-provider). \n", - "Tequila also supports Rigetti's PyQuil and Google's Cirq, but currently there are no publicly available devices.\n", - "\n", - "Here is a small example with Qiskit (you need to have qiskit installed, and an activaged IBMQ account for this).\n", - "Alternatively you can also externally initialize your chosen device, and pass this down instead of a string.\n", - "\n", - "You always need to set samples if you intend to run on a real (or emulated) backend.\n", - "\n", - "If you have special access rights you can initialize the `qiskit` quantum backend yourself and pass it down as `device` instead of the device name. \n", - "`device = provider.get_backend(name)` \n", - "or as a dictionary with `qiskit` provider and devicename \n", - "`device = {\"provider\":provider_instance, \"name\":device_name}`\n", - "\n", - "Here is a small toy example that minimizes the square of a one qubit expectation value (minimum is 0.0)" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Optimizer: \n", - "backend : qiskit\n", - "device : ibmq_ourense\n", - "samples : 1000\n", - "save_history : True\n", - "noise : None\n", - "\n", - "Method : COBYLA\n", - "Objective : 1 expectationvalues\n", - "\n", - "active variables : 1\n", - "\n", - "E=+0.68889999 angles= {a: 1.0} samples= 1000\n", - "E=+0.83539593 angles= {a: 2.0} samples= 1000\n", - "E=+0.00270400 angles= {a: 0.0} samples= 1000\n", - "E=+0.64963597 angles= {a: -1.0} samples= 1000\n", - "E=+0.22657602 angles= {a: -0.5} samples= 1000\n", - "E=+0.03240000 angles= {a: 0.25} samples= 1000\n", - "E=+0.01537600 angles= {a: -0.125} samples= 1000\n", - "E=+0.00313600 angles= {a: 0.0625} samples= 1000\n", - "E=+0.00270400 angles= {a: -0.03125} samples= 1000\n", - "E=+0.00025600 angles= {a: -0.00390625} samples= 1000\n", - "E=+0.00250000 angles= {a: -0.01171875} samples= 1000\n", - "E=+0.00115600 angles= {a: 0.0} samples= 1000\n", - "E=+0.00001600 angles= {a: -0.005859375} samples= 1000\n", - "E=+0.00010000 angles= {a: -0.0078125} samples= 1000\n", - "E=+0.00057600 angles= {a: -0.006859375} samples= 1000\n" - ] - } - ], - "source": [ - "import tequila as tq\n", - "U = tq.gates.Ry(angle=\"a\", target=0)\n", - "H = tq.paulis.X(0)\n", - "E = tq.ExpectationValue(H=H, U=U)\n", - "\n", - "# simulate the square of the expectation value with a specific set of variables\n", - "result = tq.simulate(E**2, variables={\"a\":1.0}, samples=1000, backend=\"qiskit\", device='ibmq_ourense'\n", - "\n", - "# optimize using ond of IMB's quantum computers as quantum backend\n", - "# (check your ibm account for more information and keywords)\n", - "# note that the names of the computer might have changed \n", - "result = tq.minimize(objective=E**2, method=\"cobyla\", initial_values={\"a\":1.0}, samples=1000, backend=\"qiskit\", device='ibmq_ourense')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# how can I emulate a real quantum computer?\n", - "Emulation is performed similarly to running on real devices. All you need to do is pass down the right string to the 'device' keyword. For qiskit, these are the same as for regular backends, but have'fake_' at the beginning; I.E to emulate 'armonk;, set `device=\"fake_armonk\"`. For PyQuil, this is done by adding '-qvm' to the end of the chosen string, i.e, 'Aspen-8' becomes `device=Aspen-8-qvm'`. For Cirq, only emulation is currently possible; the only string options for cirq are 'foxtail','bristlecone','sycamore', and 'sycamore23'.\n", - "\n", - "When emulating, a few things about the real device will be mimicked, principally its native gate set and its connectivities. Emulation will NOT include noisy emulation by default; If you want to emulate noise, pass down the keyword `noise='device'`. Using this option without specifying a device will result in an error.\n", - "\n", - "Below, we will emulate pyquil's Aspen 8, with emulated noise. You need pyquil installed for this to work.\n", - "\n", - "additionally: when real backends cannot be accessed, emulation will be attempted, with a warning." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "sampling from pyquil yielded: 0.72931594\n", - "sampling from pyquil while emulating Aspen-8 yielded: 0.662596\n", - "Optimizer: \n", - "backend : pyquil\n", - "backend_options : {}\n", - "samples : 1000\n", - "save_history : True\n", - "noise : None\n", - "\n", - "Method : BFGS\n", - "Objective : 1 expectationvalues\n", - "gradient : 3 expectationvalues\n", - "\n", - "active variables : 1\n", - "\n", - "E=+0.69889605 angles= {a: 1.0} samples= 1000\n", - "E=+0.00291600 angles= {a: 0.06450396776199341} samples= 1000\n", - "E=+0.00270400 angles= {a: -0.07299610341382534} samples= 1000\n", - "E=+0.00270400 angles= {a: -0.0670304288095181} samples= 1000\n", - "E=+0.00883600 angles= {a: -0.07190446966909138} samples= 1000\n", - "E=+0.00270400 angles= {a: -0.07299381043520212} samples= 1000\n", - "E=+0.00336400 angles= {a: -0.07299541886967227} samples= 1000\n", - "E=+0.01210000 angles= {a: -0.07299610340533144} samples= 1000\n", - "E=+0.00270400 angles= {a: -0.07299610341382534} samples= 1000\n", - "E=+0.00672400 angles= {a: -0.07299610341382534} samples= 1000\n", - "E=+0.00577600 angles= {a: -0.07299610341382534} samples= 1000\n", - "E=+0.01081600 angles= {a: -0.0670304288095181} samples= 1000\n", - "E=+0.00960400 angles= {a: -0.07001326611167172} samples= 1000\n", - "E=+0.01742400 angles= {a: -0.07150468476274853} samples= 1000\n", - "E=+0.00774400 angles= {a: -0.07225039408828693} samples= 1000\n", - "E=+0.01638400 angles= {a: -0.07262324875105614} samples= 1000\n", - "E=+0.00774400 angles= {a: -0.07280967608244074} samples= 1000\n", - "E=+0.00250000 angles= {a: -0.07290288974813304} samples= 1000\n", - "E=+0.00025600 angles= {a: -0.0728562829152869} samples= 1000\n", - "E=+0.00160000 angles= {a: -0.07283297949886382} samples= 1000\n", - "E=+0.01081600 angles= {a: -0.07284463120707535} samples= 1000\n", - "E=+0.00577600 angles= {a: -0.07285045706118112} samples= 1000\n", - "E=+0.00547600 angles= {a: -0.07285336998823401} samples= 1000\n", - "Warning: Desired error not necessarily achieved due to precision loss.\n", - " Current function value: 0.002704\n", - " Iterations: 2\n", - " Function evaluations: 23\n", - " Gradient evaluations: 13\n", - "optimizing while emulating Aspen-8 with noise yielded a best energy of: 0.002704000100493431\n" - ] - } - ], - "source": [ - "U = tq.gates.Ry(angle=\"a\", target=0)\n", - "H = tq.paulis.X(0)\n", - "E = tq.ExpectationValue(H=H, U=U)\n", - "\n", - "# simulate the square of the expectation value with a specific set of variables\n", - "result = tq.simulate(E**2, variables={\"a\":1.0}, samples=1000, backend=\"pyquil\")\n", - "print('sampling from pyquil yielded: ', result)\n", - "result = tq.simulate(E**2, variables={\"a\":1.0}, samples=1000, backend=\"pyquil\",device='Aspen-8-qvm')\n", - "print('sampling from pyquil while emulating Aspen-8 yielded: ', result)\n", - "result = tq.optimizer_scipy.minimize(E**2, initial_values={\"a\":1.0}, samples=1000,\n", - " backend='pyquil', device=\"Aspen-8-qvm\", \n", - " noise='device')\n", - "print('optimizing while emulating Aspen-8 with noise yielded a best energy of: ', result.energy)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Can I compile Objectives into different backends?\n", - "Yes you can. Tequila will print a warning if this happens. Warnings can be ignored by filtering them out (see the python warnings documentation) \n", - "\n", - "If a compiled circuit is used as input to compile then tequila will re-compile the circuit to the new backend (it it differs from the previous one) \n", - "\n", - "If a compiled objective is used as input to compile then tequila will only compile non-compiled expectationvalues into the different backend. Already compiled expectation values will remain untouched \n", - "\n", - "Note that you need at least two different backends for the following cell to execute. \n", - "Just change the key to whatever you have installed." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "backend1 = \"qulacs\"\n", - "backend2 = \"cirq\"\n", - "\n", - "U = tq.gates.X(target=[0,1])\n", - "print(\"Example Circuit: \", U)\n", - "compiled_1 = tq.compile(U, backend=backend1)\n", - "compiled_2 = tq.compile(compiled_1, backend=backend2)\n", - "print(\"Circuit compiled to {} -> \".format(backend1), compiled_1)\n", - "print(\"Circuit compiled to {} -> \".format(backend1), compiled_1)\n", - "\n", - "H = tq.paulis.X(0)*tq.paulis.Y(1) + tq.paulis.X([0,1])\n", - "print(\"\\nmake objective with H = \", H)\n", - "objective = tq.ExpectationValue(H=H, U=U)\n", - "compiled_1 = tq.compile(objective, backend=backend1)\n", - "\n", - "print(\"\\nExpectationValues of objective 1:\")\n", - "print(compiled_1)\n", - " \n", - "objective2 = compiled_1 + objective # Its recommended to avoid those hybrids, but in principle it works\n", - "\n", - "print(\"\\nExpectationValues of partly compiled objective:\")\n", - "print(objective2)\n", - " \n", - "compiled_2 = tq.compile(objective2, backend=backend2)\n", - "print(\"\\nExpectationValues of hybdrid compiled objective:\")\n", - "print(compiled_2)\n", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# How do I transform Measurements into Hamiltonians?\n", - "\n", - "We can not answer this question in general, but we can try to give a small example here. \n", - "\n", - "Assume you have a quantum circuit with $4$ Qubits and you are measuring Qubit $0$ and $2$. \n", - "You define your cost function in the following way:\n", - "\n", - "$$\n", - "L(AB) = A + B, \\qquad A,B \\in \\left\\{ 0,1 \\right\\} \n", - "$$\n", - "\n", - "meaning you accumulate the number of ones measured in your circuit. \n", - "\n", - "The corresponding expectationvalue would be \n", - "\n", - "$$\n", - "L = \\langle \\Psi \\rvert H \\lvert \\Psi \\rangle \\qquad H = 1 - \\frac{1}{2}\\left(Z(0) + Z(1)\\right) \n", - "$$\n", - "\n", - "The Hamiltonian could also be written as\n", - "\n", - "$$\n", - "H = 2\\lvert 11 \\rangle \\langle 11 \\rvert + \\lvert 10 \\rangle \\langle 10 \\rvert + \\lvert 01 \\rangle \\langle 01 \\rvert\n", - "$$\n", - "\n", - "Tequila provides the convenience function `tq.gates.Projector` to initialize Hamiltonians like that\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "2*tq.paulis.Projector(\"|11>\") + tq.paulis.Projector(\"|01>\") + tq.paulis.Projector(\"|10>\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The projector can also be initialized with more structured `QubitWaveFunction`s which can itself be initialized from array or string. \n", - "Here are some examples" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "wfn = tq.QubitWaveFunction.from_string(\"1.0*|00> + 1.0*|11>\")\n", - "wfnx = tq.QubitWaveFunction.from_array(arr=[1.0, 0.0, 0.0, 1.0])\n", - "print(wfn == wfnx)\n", - "wfn = wfn.normalize()\n", - "print(wfn)\n", - "\n", - "P = tq.paulis.Projector(wfn=wfn)\n", - "print(\"P = \", P)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Apart from `Projector` there is also `KetBra` which intialized more general operators like\n", - "$$\n", - "\\lvert \\Psi \\rangle \\langle \\Phi \\rvert\n", - "$$\n", - "\n", - "Keep in mind that those are not hermitian. \n", - "But they can be split up into their hermitian and anti hermitian part where both can then be used as hamiltonians for expectationvalues.\n", - "\n", - "If the `hermitian = True` key is set, the function returns the hermitian version of the operator (which is the same as the hermitian part of the old operator)\n", - "\n", - "$$\n", - "\\frac{1}{2}\\left(\\lvert \\Psi \\rangle \\langle \\Phi \\rvert + \\lvert \\Phi \\rangle \\langle \\Psi \\rvert \\right)\n", - "$$" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "wfn1 = tq.QubitWaveFunction.from_string(\"1.0*|00> + 1.0*|11>\").normalize()\n", - "\n", - "op = tq.paulis.KetBra(bra=wfn1, ket=\"|00>\")\n", - "\n", - "H1, H2 = op.split()\n", - "\n", - "print(\"operator=\", op)\n", - "print(\"hermitian part = \", H1)\n", - "print(\"anti-hermitian part =\", H2)\n", - "\n", - "H = tq.paulis.KetBra(bra=wfn1, ket=\"|00>\", hermitian=True)\n", - "print(\"hermitianized operator = \", H)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Can I do basic operations on wavefunctions and operators without quantum backends?\n", - "\n", - "In principle yes. But keep in mind that tequila was not made for this. \n", - "However, some of those operations might come in handy for debugging or small examples. \n", - "\n", - "You can not execute circuits without a simulator since they are just abstract data types (no matrices or anything). Tequila has however its own small debug simulator `backend = symbolic` but there is no reason to use it if you have any other quantum backend installed.\n", - "\n", - "Hamiltonians can be converted to matrices.\n", - "\n", - "We give a few examples here" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "wfn = tq.QubitWaveFunction.from_string(\"1.0*|0> + 1.0*|1>\").normalize()\n", - "H = 1.0/numpy.sqrt(2.0)*(tq.paulis.Z(0) + tq.paulis.X(0))\n", - "wfn2 = wfn.apply_qubitoperator(H).simplify()\n", - "\n", - "print(\"|wfn> = \", wfn)\n", - "print(\"H = \", H)\n", - "print(\"H|wfn> = \", wfn2)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "wfn1 = tq.QubitWaveFunction.from_string(\"1.0*|0> + 1.0*|1>\").normalize()\n", - "wfn2 = tq.QubitWaveFunction.from_string(\"1.0*|0> - 1.0*|1>\").normalize()\n", - "print(\" = \", wfn1.inner(wfn2))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "H = 1.0/numpy.sqrt(2.0)*(tq.paulis.Z(0) + tq.paulis.X(0))\n", - "print(H.to_matrix())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Can I import an Hamiltonian from OpenFermion?\n", - "\n", - "Yes! OpernFermion is currently tequilas backend for Hamiltonians, which makes importing from it straight forward.\n", - "You just need to wrap the OpenFermion QubitOperator into tequilas QubitHamiltonian.\n", - "\n", - "We show a few examples" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from openfermion import QubitOperator\n", - "\n", - "# get OpenFermion QubitOperator from tequila QubitHamiltonian\n", - "H = tq.paulis.X(0)\n", - "of_operator = H.to_openfermion()\n", - "\n", - "print(\"{} = {}\".format(type(H), H))\n", - "print(\"{} = {}\".format(type(of_operator), of_operator))\n", - "\n", - "# init tequila QubitHamiltonian with OpenFermion QubitOperator\n", - "H = tq.QubitHamiltonian.from_openfermion(of_operator)\n", - "print(\"{} = {}\".format(type(H), H))\n", - "\n", - "# initialization from file os often read in the string form\n", - "of_string = str(of_operator)\n", - "tq_string = str(H)\n", - "\n", - "print(of_string)\n", - "print(tq_string)\n", - "\n", - "H = tq.QubitHamiltonian.from_string(string=of_string, openfermion_format=True)\n", - "print(H)\n", - "H = tq.QubitHamiltonian.from_string(string=tq_string, openfermion_format=False)\n", - "print(H)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Can I compile into a regular function instead of one which takes dictionaries?\n", - "\n", - "Not recommended but yes. The order of the function arguments is the order you get from `extract_variables`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "U = tq.gates.Ry(angle=\"a\", target=0)\n", - "U += tq.gates.X(power = \"b\", target=1)\n", - "H = tq.QubitHamiltonian.from_string(\"X(0)Z(1)\")\n", - "E = tq.ExpectationValue(H=H, U=U)\n", - "\n", - "f = tq.compile_to_function(E)\n", - "\n", - "print(\"order is : \", E.extract_variables())\n", - "print(f(0.5, 1.0))\n", - "print(tq.simulate(E, variables={\"a\":0.5, \"b\":1.0}))\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If you also want to fix the samples and other entries to your compiled objective you can build wrappers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def mywrapper(compiled_obj, samples):\n", - " return lambda *x: compiled_obj(*x, samples=samples)\n", - "\n", - "wrapped = mywrapper(f, samples=100)\n", - "\n", - "# don't expect same results, since samples are taken individually\n", - "print(wrapped(1.0, 0.5)) # always takes 100 samples\n", - "print(f(1.0, 0.5, samples=100)) # samples need to be given\n", - "print(f(1.0, 0.5, samples=1000)) # but sampling rate can be changed\n", - "print(f(1.0, 0.5)) # you can go back to full simulation which you cannot with the wrapped function" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# How do numerical gradients work?\n", - "\n", - "Yes this is possible by passing for example `gradient={'method':'2-point', 'stepsize': 1.e-4}` to the `tq.minimize` function. \n", - "\n", - "The default is a central 2-point derivative stencil where `h` is the stepsize:\n", - "$$\\displaystyle\n", - "\\frac{\\partial f}{\\partial a} = \\frac{f(a+\\frac{h}{2}) - f(a-\\frac{h}{2})} {h}\n", - "$$\n", - "\n", - "\n", - "Other methods are:\n", - "`2-point-forward`: Forward derivative stencil:\n", - "\n", - "$$\\displaystyle\n", - "\\frac{\\partial f}{\\partial a} = \\frac{f(a+h) - f(a)} {h}\n", - "$$\n", - "\n", - "\n", - "`2-point-backward`: Backward derivative stencil:\n", - "\n", - "$$\\displaystyle\n", - "\\frac{\\partial f}{\\partial a} = \\frac{f(a) - f(a-h)} {h}\n", - "$$\n", - "\n", - "\n", - "You can also use your own numerical derivative stencil by passing a callable function as `method`. \n", - "The function should have the signature which is given in the example below.\n", - "\n", - "Here is an example:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import tequila as tq\n", - "# form a simple example objective\n", - "H = tq.paulis.X(0)\n", - "U = tq.gates.Ry(angle=\"a\", target=0)\n", - "E = tq.ExpectationValue(U=U, H=H)\n", - "\n", - "# make it more interesting by using analytical gradients for the objective\n", - "# and numerical gradients to optimize it\n", - "\n", - "objective = tq.grad(E, 'a')**2 # integer multiples of pi/2 are minima\n", - "\n", - "# start from the same point in all examples\n", - "initial_values = {'a': 2.3}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# optimize with analytical derivatives\n", - "result = tq.minimize(objective=objective, method=\"bfgs\", initial_values=initial_values)\n", - "#result.history.plot(\"energies\")\n", - "#result.history.plot(\"gradients\")\n", - "\n", - "# optimize with 2-point stencil\n", - "result = tq.minimize(objective=E, method=\"bfgs\", gradient={'method': '2-point', 'stepsize':1.e-4}, initial_values=initial_values)\n", - "#result.history.plot(\"energies\")\n", - "#result.history.plot(\"gradients\")\n", - "\n", - "# optimize with custom stencil\n", - "# here this is the same as the default\n", - "import copy\n", - "def mymethod(obj, angles, key, step, *args, **kwargs):\n", - " left = copy.deepcopy(angles)\n", - " left[key] += step / 2\n", - " right = copy.deepcopy(angles)\n", - " right[key] -= step / 2\n", - " return 1.0 / step * (obj(left, *args, **kwargs) - obj(right, *args, **kwargs))\n", - "\n", - "result = tq.minimize(objective=E, method=\"bfgs\", gradient={'method': mymethod, 'stepsize':1.e-4}, initial_values=initial_values)\n", - "#result.history.plot(\"energies\")\n", - "#result.history.plot(\"gradients\")\n", - "\n", - "# optimize with a scipy method and use scipys 2-point\n", - "# the scipy protocol will have more function evaluations and less gradient evaluations for some methods\n", - "# the stepsize in scipy has to be passed with the `method_options` dictionary\n", - "# with the keyword `eps`\n", - "result = tq.minimize(objective=E, method=\"bfgs\", gradient='2-point', method_options={'eps':1.e-4}, initial_values=initial_values)\n", - "#result.history.plot(\"energies\")\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Can I use the numerical gradient protocols from SciPy?\n", - "\n", - "Yes you can for all scipy methods by passing `gradient='2-point'` to `tq.minimize`. \n", - "See the scipy documentation for the stepsize and more options which can be passed with `method_options` dictionary where the key for the stepsize is usually `eps`. Note that not all scipy methods support numerical gradients,but cyou can always fall back to tequilas numerical gradients.\n", - "See the previous cell for an example." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/tutorials/MeasurementGroups.ipynb b/tutorials/MeasurementGroups.ipynb deleted file mode 100644 index 1e8334bd..00000000 --- a/tutorials/MeasurementGroups.ipynb +++ /dev/null @@ -1,346 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Optimize Measurements by grouping into commuting cliques\n", - "\n", - "Quantum mechanics allows simultaneuous measurements of all mutually commuting operators. VQE however permits only the measurements of a much more restricted set of operators, the qubit-wise commuting operators (Verteletskyi et al., “Measurement Optimization in the Variational Quantum Eigensolver Using a Minimum Clique Cover\" [J. Chem. Phys. 152, 124114 (2020)](https://doi.org/10.1063/1.5141458)). But through certain unitary transformations any group of mutually commuting operators can be tranformed into their qubit-wise commuting form (Yen et al., \"Measuring all compatible operators in one series of single-qubit measurements using unitary transformations\" [Chem. Theory Comput. 2020, 16, 4, 2400–2409](https://doi.org/10.1021/acs.jctc.0c00008)). \n", - "\n", - "## How to Use:\n", - "This is how the technique can be used in tequila. Note that you will only benefit from optimizing measurements when you are running on a real quantum backend or when you simulate with finite samples. The difference in timings is just an indicator that different processes happen, in this specific example we have an Hamiltonian with 4 terms where optimization of the measurements reduces those to 2 commuting groups (see the next section for details)" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "backend | wfn | sampling | noise | installed \n", - "--------------------------------------------------------------------\n", - "qulacs | True | True | True | True \n", - "qiskit | True | True | True | True \n", - "cirq | True | True | True | True \n", - "pyquil | True | True | True | True \n", - "symbolic | True | False | False | True \n", - "+1.0000Z(0)Z(1)+1.0000Y(0)Y(1)+1.0000X(0)X(1)+1.0000X(0)+1.0000Z(0)Z(1)Z(2)Z(3)Z(4)Z(5)Z(6)\n", - "0.0006999999999999229\n", - "time : 1.0035152435302734s\n", - "0.00050002337\n", - "time : 0.47684693336486816s\n" - ] - } - ], - "source": [ - "import tequila as tq\n", - "import time\n", - "tq.show_available_simulators()\n", - "backend = None\n", - "\n", - "H = tq.paulis.Z([0,1]) + tq.paulis.Y([0,1]) + tq.paulis.X([0,1]) + tq.paulis.X(0) + tq.paulis.Z([0,1,2,3,4,5,6])\n", - "\n", - "U = tq.gates.ExpPauli(angle = \"a\", paulistring=tq.PauliString.from_string('X(0)Y(1)'))\n", - "U += tq.gates.X(target=[0,1,2,3,4,5,6])\n", - "\n", - "E1 = tq.ExpectationValue(H=H, U=U) \n", - "E2 = tq.ExpectationValue(H=H, U=U, optimize_measurements = True)\n", - "\n", - "print(H)\n", - "start = time.time()\n", - "print(tq.simulate(E1, variables={\"a\":1.0}, samples=100000, backend=backend))\n", - "print(\"time : {}s\".format(time.time()-start))\n", - "\n", - "start = time.time()\n", - "print(tq.simulate(E2, variables={\"a\":1.0}, samples=100000, backend=backend))\n", - "print(\"time : {}s\".format(time.time()-start))\n", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Behind the Scenes" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "import tequila as tq\n", - "import numpy as np\n", - "from tequila.hamiltonian import QubitHamiltonian, paulis\n", - "from tequila.grouping.binary_rep import BinaryHamiltonian" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following examples shows how to partition a given Hamiltonian into commuting parts and how to find the unitary transformation needed to transform the commuting terms into qubit-wise commuting form that is easy to measure. \n", - "\n", - "The Hamiltonian is simply \n", - "$$ H = \\sigma_z(0)\\sigma_z(1) + \\sigma_y(0)\\sigma_y(1) + \\sigma_x(0)\\sigma_x(1) + \\sigma_x(0)$$\n", - "where $\\sigma_z(0)\\sigma_z(1)$, $\\sigma_y(0)\\sigma_y(1)$ does not commute with $\\sigma_x(0)$, so two separate measurements are needed." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "H = paulis.Z(0) * paulis.Z(1) + paulis.Y(0) * paulis.Y(1) + \\\n", - " paulis.X(0) * paulis.X(1) + paulis.X(0) \n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here we use the binary representation of the Hamiltonian for partitioning. The method commuting_groups gets back a list of BinaryHamiltonian whose terms are mutually commuting. \n", - "\n", - "Call to_qubit_hamiltonian to visualize." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "binary_H = BinaryHamiltonian.init_from_qubit_hamiltonian(H)\n", - "commuting_parts = binary_H.commuting_groups()" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2\n", - "+1.0000X(0)X(1)+1.0000X(0)\n", - "+1.0000Z(0)Z(1)+1.0000Y(0)Y(1)\n" - ] - } - ], - "source": [ - "print(len(commuting_parts)) # Number of measurements needed\n", - "print(commuting_parts[0].to_qubit_hamiltonian())\n", - "print(commuting_parts[1].to_qubit_hamiltonian())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The second group of terms $H_2$ are not currently qubit-wise commuting and cannot be directly measured on current hardware. They require further unitary transformation $U$ to become qubit-wise commuting. The following code identifies two bases (list of BinaryPauliString) that encodes the unitary transformation as\n", - "$$ U = \\prod_i \\frac{1}{\\sqrt{2}} (\\text{old_basis}[i] + \\text{new_basis}[i])$$\n", - "such that $UH_2U$ is qubit-wise commuting." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "qubit_wise_parts, old_basis, new_basis = commuting_parts[1].single_qubit_form()" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Old Basis\n", - "+1.0000Z(0)Z(1)\n", - "+1.0000X(0)X(1)\n", - "\n", - "New Basis\n", - "+1.0000X(0)\n", - "+1.0000Z(1)\n" - ] - } - ], - "source": [ - "def display_basis(basis):\n", - " for term in basis:\n", - " print(QubitHamiltonian.from_paulistrings(term.to_pauli_strings()))\n", - "print('Old Basis')\n", - "display_basis(old_basis)\n", - "print('\\nNew Basis')\n", - "display_basis(new_basis)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The transfromed term $UH_2U$ is qubit-wise commuting. " - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+1.0000X(0)-1.0000X(0)Z(1)\n" - ] - } - ], - "source": [ - "print(qubit_wise_parts.to_qubit_hamiltonian())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Get the circuit for the unitary transformation to implement the measurement scheme.\n", - "The next function illustrates what is happening if expectation values are formed with the `optimize_measurements` keyword meaning it does the same as `tq.ExpectationValue(H=H,U=U, optimize_measurements=True)`" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "def optimize_measurements(H, U):\n", - " binary_H = BinaryHamiltonian.init_from_qubit_hamiltonian(H)\n", - " commuting_parts = binary_H.commuting_groups()\n", - " result = tq.Objective()\n", - " for cH in commuting_parts:\n", - " qwc, Um = cH.get_qubit_wise()\n", - " Etmp = tq.ExpectationValue(H=qwc, U=U+Um)\n", - " result += Etmp\n", - " \n", - " return result\n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The new measurement scheme produces the same expectation values" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Without measurement grouping\n", - "1.2040990959786004\n", - "\n", - "With measurement grouping\n", - "1.204099\n" - ] - } - ], - "source": [ - "U = tq.gates.ExpPauli(angle = \"a\", paulistring=tq.PauliString.from_string('X(0)Y(1)'))\n", - "E1 = tq.ExpectationValue(H=commuting_parts[1].to_qubit_hamiltonian(), U=U)\n", - "E2 = optimize_measurements(H=commuting_parts[1].to_qubit_hamiltonian(), U=U)\n", - "\n", - "variables = {\"a\" : np.random.rand(1) * 2 * np.pi}\n", - "print('Without measurement grouping')\n", - "print(tq.simulate(E1, variables))\n", - "print('\\nWith measurement grouping')\n", - "print(tq.simulate(E2, variables))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The get_qubit_wise methods always transforms the hamiltonian into the qubit-wise commuting form with only z on each qubit. This is done via extra single-qubit unitaries. " - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The qubit-wise commuting hamiltonian, but does not have all z\n", - "+1.0000X(0)X(1)+1.0000X(0)\n", - "\n", - "The same qubit-wise commuting hamiltonian with all z\n", - "+1.0000Z(0)Z(1)+1.0000Z(0)\n", - "\n", - "The corresponding single qubit unitaries\n", - "circuit: \n", - "Rz(target=(0,), parameter=-1.5707963267948966)\n", - "Rx(target=(0,), parameter=-1.5707963267948966)\n", - "Rz(target=(0,), parameter=-1.5707963267948966)\n", - "Rz(target=(1,), parameter=-1.5707963267948966)\n", - "Rx(target=(1,), parameter=-1.5707963267948966)\n", - "Rz(target=(1,), parameter=-1.5707963267948966)\n", - "\n" - ] - } - ], - "source": [ - "print('The qubit-wise commuting hamiltonian, but does not have all z')\n", - "print(commuting_parts[0].to_qubit_hamiltonian())\n", - "\n", - "qwc, U = commuting_parts[0].get_qubit_wise()\n", - "print('\\nThe same qubit-wise commuting hamiltonian with all z')\n", - "print(qwc)\n", - "print('\\nThe corresponding single qubit unitaries')\n", - "print(U)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "tequila-3.6", - "language": "python", - "name": "tequila-3.6" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/tutorials/Noise_tutorial.ipynb b/tutorials/Noise_tutorial.ipynb deleted file mode 100644 index 05b4358c..00000000 --- a/tutorials/Noise_tutorial.ipynb +++ /dev/null @@ -1,469 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Hello, and welcome to this tutorial on simulating circuit noise in Tequila! In this tutorial, we will briefly detail what quantum noise is, its mathematical modeling, and how specific popular simulation packages handle noisy simulation, before diving in to building Tequila `NoiseModel`s and applying them to sampling different circuits." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#
What is noise?
\n", - "\n", - "In case you need a quick refresher: Real quantum systems undergo the effects of noise, a catch-all term for 'anything the user didn't ask the computer to do'. Such noise can be caused by a number of physical processes, including but not limited to: \n", - "\n", - " - **Thermal fluctuations**\n", - " - **Interaction with the environment**\n", - " - **Uncontrolled interaction between qubits (cross-talk)**\n", - " - **Imperfections in gate implementation**\n", - " \n", - "\n", - "\n", - "#
How is noise represented mathematically?
\n", - "\n", - "\n", - "Commonly, the effects of noise on quantum systems are treated as the evolution of the system's density matrix under Krauss maps. Krauss maps are mappings of the form $ A: \\rho \\rightarrow \\rho' = \\sum_{i} A_i \\rho A_{i}^{\\dagger}$, where $\\sum_{i} A_i A_{i}^{\\dagger} = I$. These Krauss maps are parametrized, in general by probabilities.\n", - "\n", - "For example, bit flip noise -- which takes qubits from the 0 to the 1 state and vice versa-- is a krauss map with two operators, and a single probabilistic parameter, p. The operators are:\n", - "$$A_0 = \\sqrt{1-p} I, A_1 = \\sqrt{p} X$$\n", - "**Note that the square root is present, so that bit flip map is:**\n", - "$$ A_{bf}(p): \\rho \\rightarrow (1-p) * I\\rho I + p * X\\rho X$$\n", - "other noise operations may be defined similarly.\n", - "\n", - "**Note that such krauss operators may only affect subsystems of the system;** one can have a single qubit undergo bit-flip noise in an 8 qubit state. In such cases, the krauss maps are merely the 1-qubit maps tensored with the identity on all other qubits. Multi-qubit krauss operators will involve tensor products of single qubit krauss operators.\n", - "\n", - "For example, the 2-qubit bit flip krauss map has 4 operators:\n", - "$$A_{00}=(1-p)I\\otimes I, A_{01}=\\sqrt{p-p^2}I\\otimes X,A_{10}=\\sqrt{p-p^2}X \\otimes I,A_{11}=pX\\otimes X$$\n", - "Which are just all the tensor products of $A_{0}$ and $A_{1}$." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#
3. How is noise simulated?
\n", - "\n", - "Different simulation packages handle noise in radically different ways.\n", - "\n", - "*Cirq* and *Qulacs*, for example, use noise channels, parametrized operations which are inserted into circuits the same way regular, unitary gates are. \n", - "\n", - "*Pyquil* asks its users to define noisy gate operations, and then instantiate those. \n", - "\n", - "*Qiskit*, meanwhile, simply takes a dictionary-like object as an argument to its simulator, and applies the noise on the user-chosen gates.\n", - "\n", - "In tequila, we try to hew toward making users write as few lines of code as possible. We therefore implement a simple framework for the application of noise, meant to be compatible with all our supported platforms. To do this, we make a few assumptions:\n", - "\n", - "1. If noise is present, any gate may be affected by noise.\n", - "2. The noise that affects 1..k..n-qubit gates is independent of the noise on 1...k-1,k+1...n qubit gates.\n", - "3. Noise probabilities are independent of position in the circuit.\n", - "4. The number of qubits involved in a gate, not the operation performed, dictates what noises may occur.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#
Noise in Tequila: Overview
\n", - "\n", - "noise in Tequila is centered upon the `NoiseModel` class, itself used to store and combine `QuantumNoise` objects. \n", - "Each `QuantumNoise` internally designates what operation it will perform, with what probability (or probabilities), and on how many qubits. Only at the time of translation to a backend -- or in the case of *Qiskit*, at time of simulation -- do`NoiseModel`s and simulateables -- circuits, ExpectationValues, Objectives -- interact.\n", - "\n", - "Tequila at present supports six common quantum noise operations, all of which can at present be employed by all the noise-supporting simulation backgrounds. These six operations are:\n", - "\n", - "1. Bit flips, a probabilistic application of pauli X;\n", - "2. Phase flips, a probablistic application of pauli Z;\n", - "3. Amplitude damps, which take qubits in state |1> to |0>;\n", - "4. Phase damps, which are a different formalization of the phase flip;\n", - "5. Phase-Amplitude damps, which simultaneously perform said operations;\n", - "6. (Symmetric) depolarizing, which (equi)probabilistically performs pauli X, Y, and Z.\n", - "\n", - "in Tequila, custom members of the `QuantumNoise` class are not possible, and so they should be initialized by the constructor function for each supported channel, which creates a `NoiseModel` containing one operation. all six of which are shown in the import statement below.\n", - "\n", - "`NoiseModel`s combine with eachother through addition, creating a new `NoiseModel` with all the operations of the two summands. Note that in those simulators which employ noise channels, the order of the noises in the noise model will dictate the order of application in the circuit; users should be mindful of this.\n", - "\n", - "To use a `NoiseModel` to apply noise, one may provide a noise model to the *tq.compile*, *tq.simulate*, and optimization calls like *tq.minimize*, through the keyword `noise=my_noise_model`. Noise is only supported when sampling; if in the above functions the keyword *samples* is `None` (defaullt), noise cannot function.\n", - "\n", - "additionally, Tequila supports the use of device-noise-emulation for those backends which allow the emulation of specific real devices. If in compilation, simulation, or optimization, emulated backends have been selected (such as 'fake_vigo', for IBMQ), the known noise of this device may be employed. In these cases, the keyword assignment *noise='device'* should be used, if these known noise models are desired.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "### first, we import tequila!\n", - "import tequila as tq\n", - "from tequila.circuit.noise import BitFlip,PhaseFlip,AmplitudeDamp,PhaseDamp,PhaseAmplitudeDamp,DepolarizingError" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We will first examine bit flip noise on a simple circuit with a simple Hamiltonian." - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "simulating: +0.5000-0.5000Z(1)\n", - "acting on: \n", - "0: ───X───@───\n", - " │\n", - "1: ───────X───\n" - ] - } - ], - "source": [ - "H=tq.paulis.Qm(1) ### this hamiltonian is 0 for a qubit that is 0, and 1 for a qubit that is 1.\n", - "U=tq.gates.X(0)+tq.gates.CNOT(0,1)\n", - "O1=tq.ExpectationValue(U=U,H=H)\n", - "\n", - "print('simulating: ',H)\n", - "print('acting on: ')\n", - "tq.draw(U)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Say that we wanted a noise model where 1-qubit gates and 2-qubit gates undergo bit flips, but with different probabilities." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "bf_1=BitFlip(p=0.1,level=1)\n", - "bf_2=BitFlip(p=0.3,level=2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " `NoiseModel` objects, like those initialized above, can be combined into new `NoiseModel`s by simple addition." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "applying: NoiseModel with: \n", - "bit flip on 1 qubit gates, probs = [0.1],\n", - "bit flip on 2 qubit gates, probs = [0.3],\n", - "\n" - ] - } - ], - "source": [ - "my_nm=bf_1+bf_2\n", - "print('applying:',my_nm)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "we will now sample our `Objective` O1, both with and without noise." - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Without noise, E = 1.0\n", - "With noise, E = 0.6664\n" - ] - } - ], - "source": [ - "E=tq.simulate(O1)\n", - "### noise models are fed to tequila functions with the noise keyword.\n", - "E_noisy=tq.simulate(O1,samples=5000,noise=my_nm)\n", - "print('Without noise, E =',E)\n", - "print('With noise, E =',E_noisy)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Because noise is stochastic, results may vary wildly if the number of samples is low.**" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "round 1 sampling with 5 samples, E = 0.8\n", - "round 2 sampling with 5 samples, E = 1.0\n", - "round 3 sampling with 5 samples, E = 0.6\n", - "round 4 sampling with 5 samples, E = 0.6\n", - "round 5 sampling with 5 samples, E = 0.4\n", - "round 6 sampling with 5 samples, E = 0.2\n", - "round 7 sampling with 5 samples, E = 0.8\n", - "round 8 sampling with 5 samples, E = 0.4\n", - "round 9 sampling with 5 samples, E = 0.8\n", - "round 10 sampling with 5 samples, E = 0.6\n" - ] - } - ], - "source": [ - "for i in range(1,11):\n", - " print('round',i,'sampling with 5 samples, E = ', tq.simulate(O1,samples=5,noise=my_nm))\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note that the *BitFlip* functions returned applicable `NoiseModel`s in their own right:\n" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "With 1-qubit noise only, E = 0.9139999999999999\n", - "With 2-qubit noise only, E = 0.69\n" - ] - } - ], - "source": [ - "E_1_only=tq.simulate(O1,samples=1000,noise=bf_1)\n", - "print('With 1-qubit noise only, E =',E_1_only)\n", - "E_2_only=tq.simulate(O1,samples=1000,noise=bf_2)\n", - "print('With 2-qubit noise only, E =',E_2_only)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Below, we demonstrate the effects of the ordering of the noise operations applied. \n" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "WARNING - WARNING: all-qubit error already exists for instruction \"x\", composing with additional error.\n", - "WARNING - WARNING: all-qubit error already exists for instruction \"y\", composing with additional error.\n", - "WARNING - WARNING: all-qubit error already exists for instruction \"z\", composing with additional error.\n", - "WARNING - WARNING: all-qubit error already exists for instruction \"u3\", composing with additional error.\n", - "WARNING - WARNING: all-qubit error already exists for instruction \"u1\", composing with additional error.\n", - "WARNING - WARNING: all-qubit error already exists for instruction \"u2\", composing with additional error.\n", - "WARNING - WARNING: all-qubit error already exists for instruction \"h\", composing with additional error.\n", - "WARNING - WARNING: all-qubit error already exists for instruction \"x\", composing with additional error.\n", - "WARNING - WARNING: all-qubit error already exists for instruction \"y\", composing with additional error.\n", - "WARNING - WARNING: all-qubit error already exists for instruction \"z\", composing with additional error.\n", - "WARNING - WARNING: all-qubit error already exists for instruction \"u3\", composing with additional error.\n", - "WARNING - WARNING: all-qubit error already exists for instruction \"u1\", composing with additional error.\n", - "WARNING - WARNING: all-qubit error already exists for instruction \"u2\", composing with additional error.\n", - "WARNING - WARNING: all-qubit error already exists for instruction \"h\", composing with additional error.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "amplitude damping before bit flip leads to E = -0.08186\n", - "amplitude damping after bit flip leads to E = 0.15744\n" - ] - } - ], - "source": [ - "amp=AmplitudeDamp(0.3,1)\n", - "bit=BitFlip(0.4,1)\n", - "forward=amp+bit\n", - "backward=bit+amp\n", - "\n", - "H = tq.paulis.Z(0)\n", - "U = tq.gates.X(target=0)\n", - "O = tq.ExpectationValue(U=U, H=H)\n", - "\n", - "E_1 = tq.simulate(O,samples=100000,noise=forward)\n", - "E_2 = tq.simulate(O,samples=100000,noise=backward)\n", - "print('amplitude damping before bit flip leads to E = ',E_1)\n", - "print('amplitude damping after bit flip leads to E = ',E_2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Tequila will *always* attempt to apply noise to the circuit *in the order each noise was added to the noise model*. Some backends have behavior which is harder to control than others, but in general, this order will be preserved." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Below, we will optimize a noisy circuit." - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "import numpy as np" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Consider the 1-qubit expectation value, $<0|U^{\\dagger}\\hat{Y}U|0>$, with $U=H Rz(\\theta) H $. In the absence of noise, this expectation value just yields $Sin(\\theta)$. This circuit therefore has a minimum at $\\theta = -\\pi$. We can minimize this circuit under phase flip noise -- which is probabilistic application of pauli Z -- and see what happens!" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "optimizing expectation value with phase flip probability 0.08991331275688234.\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "U=tq.gates.H(0) +tq.gates.Rz('a',0)+tq.gates.H(0)\n", - "H=tq.paulis.Y(0)\n", - "O=tq.ExpectationValue(U=U,H=H)\n", - "\n", - "### we pick a random, small probability to apply noise\n", - "p=np.random.uniform(0,.1)\n", - "NM=PhaseFlip(p,1)\n", - "\n", - "print('optimizing expectation value with phase flip probability {}.'.format(str(p)))\n", - "result=tq.minimize(objective=O,lr=0.5,maxiter=60,initial_values={'a':np.pi},method='adam',samples=5000,noise=NM,silent=True)\n", - "\n", - "result.history.plot()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The final energy is not -1.0, because the application of noise leads the expected output to be $(-1+2*p)^{3} Sin(\\theta)$. One sees that this is approximately the value reached by minimizing $\\theta$. Because the number of samples is not infinite, the 'expected' best energy may be exceeded:" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "best energy: -0.5688\n", - "expected best -0.5517178049632779\n" - ] - } - ], - "source": [ - "out=result.energy\n", - "best=((-1+2*p)**3)*np.sin(np.pi/2)\n", - "print('best energy: ',out)\n", - "print('expected best ',best)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## This concludes our brief tutorial on Noise. Stay tuned (and up to date) for more exciting noise features in the future!" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.7" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/tutorials/OptimizeDistributions.ipynb b/tutorials/OptimizeDistributions.ipynb deleted file mode 100644 index 34546252..00000000 --- a/tutorials/OptimizeDistributions.ipynb +++ /dev/null @@ -1,531 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Training Distributions with KM Divergence" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Short tutorial on how to form objectives like in this paper \n", - "https://arxiv.org/pdf/1801.07686.pdf\n", - "\n", - "First some imports and the advice to use `tq.numpy` for functions in objectives (avoid issues in automatic differentiations and use the regular `numpy` for everything else (avoid issues with jax where you don't want them)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import tequila as tq\n", - "import numpy" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "First we define the $\\max(x,\\epsilon)$ function we will need further down the road and some global variables for this example" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "# global variables, change here if you want\n", - "eps = 1.e-8\n", - "n_qubits = 5\n", - "n_layers = 1\n", - "\n", - "def my_max(x):\n", - " if x +0.2500|01000> +0.2500|00100> -0.2500|11100> +0.2500|00010> -0.2500|11010> -0.2500|10110> -0.2500|01110> +0.2500|00001> -0.2500|11001> -0.2500|10101> -0.2500|01101> -0.2500|10011> -0.2500|01011> -0.2500|00111> +0.2500|11111> \n" - ] - } - ], - "source": [ - "variables = {k : 1.0 for k in U.extract_variables()}\n", - "wfn = tq.simulate(U, variables=variables)\n", - "print(\"wfn with variables = \", variables)\n", - "print(wfn)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Instead of simulating directly the circuit can also be compiled and afterwards be used like a function" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+0.2500|10000> +0.2500|01000> +0.2500|00100> -0.2500|11100> +0.2500|00010> -0.2500|11010> -0.2500|10110> -0.2500|01110> +0.2500|00001> -0.2500|11001> -0.2500|10101> -0.2500|01101> -0.2500|10011> -0.2500|01011> -0.2500|00111> +0.2500|11111> \n" - ] - } - ], - "source": [ - "compiledU = tq.compile(U)\n", - "wfn = compiledU(variables=variables)\n", - "print(wfn)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next we will define the target distribution which we want to optimize for. It is the distribution of a GHZ state, i.e. $P(00..0) = 0.5$ and $P(11..1)=0.5$ where in the following we will use binary notation for easier coding i.e $00...0=0$ and $11..1=2^{n-1}+2^{n-2}+..+1$" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "one = sum([2**i for i in range(n_qubits)])\n", - "target_distribution = {0:0.5, one:0.5}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "For the tequila objective Born's rule will be used. In order to make this work we need to reformulate this as an expectation value. This can be achieved as \n", - "$$\\displaystyle \\lvert\\langle ijk..l \\rvert \\Psi \\rangle\\rvert^2 = \\langle \\Psi \\rvert H \\lvert \\Psi \\rangle$$\n", - "where $i,j,k..,l \\in \\left\\{0,1 \\right\\}$ and the Hamiltonian is\n", - "$$ \\displaystyle H = \\lvert ijk..l \\rangle \\langle ijk..l \\rvert = \\otimes_{m \\in (ijk..l)} \\frac{1}{n}\\left( 1 + (-1)^{m}\\sigma_Z \\right)$$\n", - "\n", - "Tequila has a convenience shortcut for the operator $$Q_{\\pm} = \\frac{1}{2}\\left( 1 \\pm \\sigma_Z \\right) $$\n", - "\n", - "Lets build the Kullback–Leibler divergence of the distribution P generated by our template U and the target distribution Q\n", - "\n", - "$$ \\displaystyle D(P,Q) = -\\frac{1}{2^n} \\sum_{x} P(x) \\ln\\left(\\frac{P(x)}{Q(x)}\\right) $$\n", - "\n", - "where we use the same safety barrier as in the paper to prevent taking logarithms of zero (this is where the mymax function fron above is needed). In the end we will square the objective to avoid negative values and assure that zero is the minimum." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "objective = tq.Objective()\n", - "\n", - "for k, Q in target_distribution.items():\n", - " Q = my_max(Q) # here we apply the mymax function to avoid having zeros\n", - " wfn = tq.QubitWaveFunction.from_int(k, n_qubits=n_qubits)\n", - " H = tq.paulis.Projector(wfn=wfn)\n", - " P = tq.ExpectationValue(H=H, U=U) # this is the born rule expectation value from above\n", - " P = P.apply(my_max) # here we apply the mymax function to avoid having zeros\n", - " objective += Q*(Q / P).apply(tq.numpy.log) # here we take the logarithm and sum up\n", - " \n", - "objective = 1.0/2.0**n_qubits *objective\n", - "objective = objective**2 # here we take the square" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Lets see what we created here.\n", - "Tequila created an objective with 4 expectationvalues (we had 2 values in the target_distribution, and P entered twice each) but only 2 unique expectationvalues (meaning the simulator will only evaluate those two)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Objective with 2 unique expectation values\n", - "variables = [(0, 0), (0, 1), (0, 2), (0, 3), (0, 4)]\n", - "types = not compiled\n" - ] - } - ], - "source": [ - "print(objective)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Objectives can be compiled and simulated in the same way as the circuits above. \n", - "Here is a small demonstration. \n", - "Since our objective is parametrized we need to pass the variables down again. We will use the same as in the example above.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "value1 = 0.09578033\n", - "value2 = 0.09578033\n", - "value3 = 0.004561313\n" - ] - } - ], - "source": [ - "value1 = tq.simulate(objective, variables=variables)\n", - "compiled = tq.compile(objective)\n", - "value2 = compiled(variables=variables)\n", - "variables2 = {k:1.1 for k in objective.extract_variables()}\n", - "value3 = compiled(variables=variables2)\n", - "print(\"value1 = \", value1)\n", - "print(\"value2 = \", value2)\n", - "print(\"value3 = \", value3)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Lets optimize our objective with one of the inbuildt optimizers in tequila. \n", - "If no initial_values are passed down, random initialization will be used. \n", - "Check the OptimizerSciPy Tutorial for more information" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Optimizer: \n", - "backend : qulacs\n", - "device : None\n", - "samples : None\n", - "save_history : True\n", - "noise : None\n", - "\n", - "Method : COBYLA\n", - "Objective : 2 expectationvalues\n", - "\n", - "active variables : 5\n", - "\n", - "E=+0.02747765 angles= {(0, 0): 1.196973294671848, (0, 1): 3.487261445909955, (0, 2): 1.2546004948085328, (0, 3): 4.323339379115283, (0, 4): 4.297460215759149} samples= None\n", - "E=+0.04326624 angles= {(0, 0): 2.196973294671848, (0, 1): 3.487261445909955, (0, 2): 1.2546004948085328, (0, 3): 4.323339379115283, (0, 4): 4.297460215759149} samples= None\n", - "E=+0.01335919 angles= {(0, 0): 1.196973294671848, (0, 1): 4.4872614459099545, (0, 2): 1.2546004948085328, (0, 3): 4.323339379115283, (0, 4): 4.297460215759149} samples= None\n", - "E=+0.00350544 angles= {(0, 0): 1.196973294671848, (0, 1): 4.4872614459099545, (0, 2): 2.2546004948085328, (0, 3): 4.323339379115283, (0, 4): 4.297460215759149} samples= None\n", - "E=+0.01896261 angles= {(0, 0): 1.196973294671848, (0, 1): 4.4872614459099545, (0, 2): 2.2546004948085328, (0, 3): 5.323339379115283, (0, 4): 4.297460215759149} samples= None\n", - "E=+0.01654562 angles= {(0, 0): 1.196973294671848, (0, 1): 4.4872614459099545, (0, 2): 2.2546004948085328, (0, 3): 4.323339379115283, (0, 4): 5.297460215759149} samples= None\n", - "E=+0.01034847 angles= {(0, 0): 0.685979841439285, (0, 1): 4.944201361642773, (0, 2): 2.573514021010323, (0, 3): 3.823072690958975, (0, 4): 3.875418739491467} samples= None\n", - "E=+0.01162174 angles= {(0, 0): 1.651670921989714, (0, 1): 4.597812748750098, (0, 2): 2.3317579166074354, (0, 3): 4.20230566715666, (0, 4): 4.195352184817832} samples= None\n", - "E=+0.00508079 angles= {(0, 0): 1.1149671676348478, (0, 1): 4.022498117220029, (0, 2): 2.326934146654208, (0, 3): 4.209872519048047, (0, 4): 4.2017358306182535} samples= None\n", - "E=+0.00512684 angles= {(0, 0): 1.1634208877002723, (0, 1): 4.485383631676708, (0, 2): 2.0144306100441, (0, 3): 4.2769149666437, (0, 4): 4.258295050381908} samples= None\n", - "E=+0.00376778 angles= {(0, 0): 1.196973294671848, (0, 1): 4.4872614459099545, (0, 2): 2.2546004948085328, (0, 3): 4.403941715367235, (0, 4): 4.201918270045619} samples= None\n", - "E=+0.00116350 angles= {(0, 0): 1.0780493007238203, (0, 1): 4.48060567397981, (0, 2): 2.2885035613418996, (0, 3): 4.474044450349771, (0, 4): 4.453829483671055} samples= None\n", - "E=+0.00017348 angles= {(0, 0): 0.8699840955232891, (0, 1): 4.572790893282165, (0, 2): 2.3848653520405336, (0, 3): 4.436950182559852, (0, 4): 4.446816900871537} samples= None\n", - "E=+0.00009692 angles= {(0, 0): 0.8055200929315092, (0, 1): 4.619292958946304, (0, 2): 2.5031750271015456, (0, 3): 4.5571752667279055, (0, 4): 4.613342274861681} samples= None\n", - "E=+0.00019319 angles= {(0, 0): 0.8164684670910927, (0, 1): 4.721878819459653, (0, 2): 2.4354367831154837, (0, 3): 4.5723238621269875, (0, 4): 4.626122129521147} samples= None\n", - "E=+0.00003109 angles= {(0, 0): 0.634151845128931, (0, 1): 4.522137670542379, (0, 2): 2.3599390854610816, (0, 3): 4.579886606200957, (0, 4): 4.664931359578641} samples= None\n", - "E=+0.00003188 angles= {(0, 0): 0.6208976455692607, (0, 1): 4.521395878020473, (0, 2): 2.3637176165598133, (0, 3): 4.676879253218375, (0, 4): 4.587298086652804} samples= None\n", - "E=+0.00000198 angles= {(0, 0): 0.45154420387279026, (0, 1): 4.581848929569584, (0, 2): 2.4700800093744517, (0, 3): 4.490977398508964, (0, 4): 4.590411935484344} samples= None\n", - "E=+0.00000310 angles= {(0, 0): 0.4133452137548334, (0, 1): 4.483007553848742, (0, 2): 2.528528788960446, (0, 3): 4.504241522559719, (0, 4): 4.618767230891968} samples= None\n", - "E=+0.00000060 angles= {(0, 0): 0.46449680275183974, (0, 1): 4.5520927290127196, (0, 2): 2.455111064181742, (0, 3): 4.460249548201935, (0, 4): 4.549365880789348} samples= None\n", - "E=+0.00000960 angles= {(0, 0): 0.3641970260110508, (0, 1): 4.5492602200774455, (0, 2): 2.382763975953847, (0, 3): 4.44274253343372, (0, 4): 4.545324230417266} samples= None\n", - "E=+0.00000269 angles= {(0, 0): 0.47214839390618013, (0, 1): 4.553045421003813, (0, 2): 2.4540802386928084, (0, 3): 4.411631116972945, (0, 4): 4.587862388090924} samples= None\n", - "E=+0.00000167 angles= {(0, 0): 0.4645626506745066, (0, 1): 4.592461390035946, (0, 2): 2.548790652977351, (0, 3): 4.435075601401865, (0, 4): 4.481647538245871} samples= None\n", - "E=+0.00000018 angles= {(0, 0): 0.5181716041993695, (0, 1): 4.537191377732638, (0, 2): 2.4528745216579866, (0, 3): 4.485998751404, (0, 4): 4.537738678563787} samples= None\n", - "E=+0.00000056 angles= {(0, 0): 0.5245353706849274, (0, 1): 4.56167978051848, (0, 2): 2.4363047352941503, (0, 3): 4.4823263309619685, (0, 4): 4.530786080986661} samples= None\n", - "E=+0.00000012 angles= {(0, 0): 0.49818500717094444, (0, 1): 4.502231423735846, (0, 2): 2.4333119900939852, (0, 3): 4.510369016782503, (0, 4): 4.501572602194428} samples= None\n", - "E=+0.00000004 angles= {(0, 0): 0.49632111804785545, (0, 1): 4.512847616661284, (0, 2): 2.455467554700634, (0, 3): 4.513780035209803, (0, 4): 4.482654865137477} samples= None\n", - "E=+0.00000006 angles= {(0, 0): 0.5182014754216003, (0, 1): 4.476513061786526, (0, 2): 2.474398777313323, (0, 3): 4.47538264986223, (0, 4): 4.466085324042166} samples= None\n", - "E=+0.00000006 angles= {(0, 0): 0.5050017983420092, (0, 1): 4.488857851451768, (0, 2): 2.491875113314596, (0, 3): 4.5532843951611, (0, 4): 4.501871581179305} samples= None\n", - "E=+0.00000003 angles= {(0, 0): 0.4688996976913859, (0, 1): 4.5089760859588655, (0, 2): 2.465526151442391, (0, 3): 4.505029251280438, (0, 4): 4.488301799514845} samples= None\n", - "E=+0.00000007 angles= {(0, 0): 0.46406939287955223, (0, 1): 4.501057186321916, (0, 2): 2.4598934921923568, (0, 3): 4.511081200539074, (0, 4): 4.478828317108222} samples= None\n", - "E=+0.00000003 angles= {(0, 0): 0.4714479395429383, (0, 1): 4.5327729413049616, (0, 2): 2.4846840624229762, (0, 3): 4.499501551546495, (0, 4): 4.485812297232392} samples= None\n", - "E=+0.00000007 angles= {(0, 0): 0.4662188530848333, (0, 1): 4.5409500871447435, (0, 2): 2.4785597989911414, (0, 3): 4.5086685347603295, (0, 4): 4.491140653630323} samples= None\n", - "E=+0.00000001 angles= {(0, 0): 0.4828606984382382, (0, 1): 4.523969633207974, (0, 2): 2.4902514009755663, (0, 3): 4.476637706688408, (0, 4): 4.5004773079958875} samples= None\n", - "E=+0.00000003 angles= {(0, 0): 0.48575608081819605, (0, 1): 4.509969854600638, (0, 2): 2.5018347737522344, (0, 3): 4.463177170608753, (0, 4): 4.479103845398909} samples= None\n", - "E=+0.00000004 angles= {(0, 0): 0.48021226459622424, (0, 1): 4.529979283053911, (0, 2): 2.4800305136581473, (0, 3): 4.46778228902862, (0, 4): 4.496219894176555} samples= None\n", - "E=+0.00000001 angles= {(0, 0): 0.48756842274314555, (0, 1): 4.5139317949398485, (0, 2): 2.5093696998754766, (0, 3): 4.487943282137166, (0, 4): 4.519459305933884} samples= None\n", - "E=+0.00000001 angles= {(0, 0): 0.491670615898347, (0, 1): 4.497862413901057, (0, 2): 2.525185554644173, (0, 3): 4.4831373652547875, (0, 4): 4.498764586675032} samples= None\n", - "E=+0.00000000 angles= {(0, 0): 0.5020834658658918, (0, 1): 4.515810317274042, (0, 2): 2.5058926274574302, (0, 3): 4.491612543796369, (0, 4): 4.51736842376104} samples= None\n", - "E=+0.00000002 angles= {(0, 0): 0.5110192782411185, (0, 1): 4.510471172324929, (0, 2): 2.5225701308558586, (0, 3): 4.510823840069483, (0, 4): 4.532234299594948} samples= None\n", - "E=+0.00000001 angles= {(0, 0): 0.5077644587451166, (0, 1): 4.515301547348465, (0, 2): 2.503340331011883, (0, 3): 4.477616859868862, (0, 4): 4.520403998224697} samples= None\n", - "E=+0.00000001 angles= {(0, 0): 0.5024086468089339, (0, 1): 4.5220976962257975, (0, 2): 2.5101895037205124, (0, 3): 4.490457876148, (0, 4): 4.5161027711535375} samples= None\n", - "E=+0.00000000 angles= {(0, 0): 0.49951388087611553, (0, 1): 4.51620822689089, (0, 2): 2.495156476772887, (0, 3): 4.496516610281995, (0, 4): 4.507465660192193} samples= None\n", - "E=+0.00000000 angles= {(0, 0): 0.5020781816194445, (0, 1): 4.50900384905753, (0, 2): 2.493797717568015, (0, 3): 4.509852770989498, (0, 4): 4.509907486913885} samples= None\n", - "E=+0.00000000 angles= {(0, 0): 0.5011082246509242, (0, 1): 4.513007258249391, (0, 2): 2.489815845774154, (0, 3): 4.510840728965155, (0, 4): 4.515126269399038} samples= None\n", - "E=+0.00000000 angles= {(0, 0): 0.5086052742522993, (0, 1): 4.498742708380191, (0, 2): 2.4874129667703864, (0, 3): 4.50337563133552, (0, 4): 4.506229403456834} samples= None\n", - "E=+0.00000000 angles= {(0, 0): 0.5019235130316978, (0, 1): 4.494809833655521, (0, 2): 2.487727164715163, (0, 3): 4.502786192605719, (0, 4): 4.505539793946878} samples= None\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "E=+0.00000000 angles= {(0, 0): 0.5013061597176728, (0, 1): 4.4960270840878, (0, 2): 2.48566776555843, (0, 3): 4.503869897155823, (0, 4): 4.502714829363983} samples= None\n", - "E=+0.00000000 angles= {(0, 0): 0.5029198512608419, (0, 1): 4.492672827965057, (0, 2): 2.493668010701275, (0, 3): 4.503215745083131, (0, 4): 4.501067936759923} samples= None\n", - "E=+0.00000000 angles= {(0, 0): 0.5010813367874862, (0, 1): 4.486658600996661, (0, 2): 2.4982437752170585, (0, 3): 4.502987542012001, (0, 4): 4.500364802911858} samples= None\n", - "E=+0.00000000 angles= {(0, 0): 0.5050821929857228, (0, 1): 4.4913470678686, (0, 2): 2.493017039272258, (0, 3): 4.506066486124667, (0, 4): 4.501592283216655} samples= None\n", - "E=+0.00000000 angles= {(0, 0): 0.5077514527347123, (0, 1): 4.494003301783319, (0, 2): 2.494760747894221, (0, 3): 4.497595579045114, (0, 4): 4.499295852676457} samples= None\n", - "E=+0.00000000 angles= {(0, 0): 0.5018493108267006, (0, 1): 4.4982290636498865, (0, 2): 2.49878720103826, (0, 3): 4.504549996864767, (0, 4): 4.502083321869336} samples= None\n", - "E=+0.00000000 angles= {(0, 0): 0.5005249133046364, (0, 1): 4.499506414630132, (0, 2): 2.498249627588381, (0, 3): 4.504836006709628, (0, 4): 4.498691810717365} samples= None\n", - "E=+0.00000000 angles= {(0, 0): 0.5007158035310001, (0, 1): 4.500719695272272, (0, 2): 2.4968556934942825, (0, 3): 4.504826323187917, (0, 4): 4.4992943571813235} samples= None\n", - "E=+0.00000000 angles= {(0, 0): 0.49757043741954216, (0, 1): 4.499971825001763, (0, 2): 2.4988572241771903, (0, 3): 4.502611804222587, (0, 4): 4.499690311681204} samples= None\n", - "E=+0.00000000 angles= {(0, 0): 0.49865506396009296, (0, 1): 4.50035037475882, (0, 2): 2.4991499263432067, (0, 3): 4.5011270559366405, (0, 4): 4.499237729551664} samples= None\n", - "E=+0.00000000 angles= {(0, 0): 0.4986323051581947, (0, 1): 4.502780651059029, (0, 2): 2.502089667980496, (0, 3): 4.501905823886104, (0, 4): 4.499559393648119} samples= None\n", - "E=+0.00000000 angles= {(0, 0): 0.4971725668684522, (0, 1): 4.498464068163066, (0, 2): 2.5002086734531486, (0, 3): 4.49867644934646, (0, 4): 4.497696165164443} samples= None\n", - "E=+0.00000000 angles= {(0, 0): 0.4983265071934182, (0, 1): 4.50150275326537, (0, 2): 2.497907404314546, (0, 3): 4.500265580376056, (0, 4): 4.499542311824862} samples= None\n", - "E=+0.00000000 angles= {(0, 0): 0.4986634557901244, (0, 1): 4.5001031961219855, (0, 2): 2.4993345249803203, (0, 3): 4.500838211533058, (0, 4): 4.500118069752259} samples= None\n", - "E=+0.00000000 angles= {(0, 0): 0.5004906881768819, (0, 1): 4.499595239620232, (0, 2): 2.4988754502180437, (0, 3): 4.500886758937621, (0, 4): 4.500187299622162} samples= None\n", - "E=+0.00000000 angles= {(0, 0): 0.5008384869266571, (0, 1): 4.500204797427772, (0, 2): 2.4995815791111857, (0, 3): 4.500924159611765, (0, 4): 4.500273662141612} samples= None\n", - "E=+0.00000000 angles= {(0, 0): 0.5008595001177585, (0, 1): 4.500091588799973, (0, 2): 2.499715711072797, (0, 3): 4.500500893315355, (0, 4): 4.500074673419346} samples= None\n", - "E=+0.00000000 angles= {(0, 0): 0.5008591025053959, (0, 1): 4.499395788451458, (0, 2): 2.500391866649934, (0, 3): 4.5007317589041325, (0, 4): 4.50014799757864} samples= None\n", - "E=+0.00000000 angles= {(0, 0): 0.5008376553544984, (0, 1): 4.500062152389838, (0, 2): 2.499707552584497, (0, 3): 4.500292215317942, (0, 4): 4.500527490420508} samples= None\n", - "E=+0.00000000 angles= {(0, 0): 0.5012520661509299, (0, 1): 4.500475995882607, (0, 2): 2.499896472382163, (0, 3): 4.499756860506933, (0, 4): 4.499740213207289} samples= None\n", - "E=+0.00000000 angles= {(0, 0): 0.5012182219360312, (0, 1): 4.499849353299078, (0, 2): 2.4994654623482226, (0, 3): 4.500504741677361, (0, 4): 4.500073496490982} samples= None\n", - "E=+0.00000000 angles= {(0, 0): 0.500000019905168, (0, 1): 4.4998915963773305, (0, 2): 2.4994430906135046, (0, 3): 4.500186509021493, (0, 4): 4.499855271058377} samples= None\n" - ] - } - ], - "source": [ - "result = tq.optimizer_scipy.minimize(objective=objective, method=\"Cobyla\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Lets compute our wavefunction with the optimized angles" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "-0.7071i|00000> +0.0001|01000> +0.0006|00100> -0.0002|00010> -0.0002i|11110> +0.0002|00001> +0.0002i|11101> -0.0006i|11011> -0.0001i|10111> -0.7071|11111> \n" - ] - } - ], - "source": [ - "final_wfn = tq.simulate(U, variables=result.angles)\n", - "print(final_wfn)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And plot some information about the optimization " - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAD4CAYAAADiry33AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nO3dfXxU9Zn38c+VyeQBQkiBgBJEUBHFB0SBYtXutlSg1gq1ttVuud3d9tbb1t2226VKbdW67WpLt+629W6rq3t31Va8ESmtKNaHXatFFIgKSFFEhQSF8BgIM5CHa/+Yk5CESTLAZGYy5/t+vfJyzjm/OefKcLzml9/5neuYuyMiIvmrINsBiIhI71KiFxHJc0r0IiJ5ToleRCTPKdGLiOS5wmwH0NmQIUN81KhR2Q5DRKRPWbly5XZ3r0y2LecS/ahRo1ixYkW2wxAR6VPM7N2utmnoRkQkzynRi4jkOSV6EZE8l3Nj9CISDo2NjdTU1BCPx7MdSp9SUlLCiBEjiEajKb9HiV5EsqKmpoYBAwYwatQozCzb4fQJ7s6OHTuoqalh9OjRKb8vbxP9oupa5i1dz5bdMYZXlDJn+lhmTajKdlgiEojH40ryR8jMGDx4MHV1dUf0vrxM9Iuqa5m7cDWxxmYAanfHmLtwNYCSvUgOUZI/ckfzmeXlxdh5S9e3JflWscZm5i1dn6WIRESyJy8T/ZbdsSNaLyKSCR/60Ieycty8HLoZXlFKbZKkPryiNAvRiEg69IXrbk1NTRQWdp1W//SnP2UwmkPyskc/Z/pYSqORDutKoxHmTB+bpYhE5Fi0Xner3R3DOXTdbVF17THt94EHHmDy5Mmcc845XHvttTQ3N1NWVsZNN93E+PHjmTJlClu3bgWgrq6OT3/600yaNIlJkybxwgsvAHDrrbcye/ZsLrjgAmbPnk1dXR0XX3wxZ5xxBl/60pc48cQT2b59OwBlZWVtx543bx6TJk3i7LPP5pZbbgGgoaGBT3ziE4wfP54zzzyT+fPnH9Pv1yove/St3/Jfm/8KAFU5+u0vIod87pfLDlt36dnHM/v8UfzwiT8nve526+/WMmtCFTsbDnLdAys7bJ9/7fndHm/dunXMnz+fF154gWg0ype//GUefPBBGhoamDJlCt///vf55je/yT333MO3v/1tvvrVr/L1r3+dCy+8kE2bNjF9+nTWrVsHwOuvv87zzz9PaWkp119/PR/96EeZO3cuTzzxBPfee+9hx37yySd58803eemll3B3LrvsMp577jnq6uoYPnw4jz32GAB79uw5os+wK3mZ6AEuGz+8LdG/cONHsxyNiByL9/Ykv6lq9/7Go97n008/zcqVK5k0aRIAsViMoUOHUlRUxKWXXgrAeeedxx/+8AcAnnrqKV5//fW299fX17Nv3z4ALrvsMkpLE0PDzz//PI8++igAM2bM4AMf+MBhx37yySd58sknmTBhAgD79u3jzTff5KKLLuIb3/gGN9xwA5deeikXXXTRUf9+7eVtot93sAmAr31sTJYjEZFUdNcD7+q6W1Vw3W1Q/6Iee/CduTtXX301t99+e4f1P/rRj9qmMEYiEZqaErmkpaWFF198kZKSksP21b9//yM+9ty5c7n22msP27Zq1SqWLFnCt7/9baZOncrNN998RPtOJi/H6AHqY4lvel2AFen7euO629SpU1mwYAHbtm0DYOfOnbz7bpeVfpk2bRo//elP25ZfeeWVpO0uuOACHn74YSDRc9+1a9dhbaZPn859993X9hdBbW0t27ZtY8uWLfTr148vfOELzJkzh1WrVh3179de3vbo62OJb+GfPbOBK84dQUGBbswQ6atar6+lc9bNuHHj+N73vse0adNoaWkhGo1y1113ddn+Jz/5CV/5ylc4++yzaWpq4sMf/jC/+MUvDmt3yy23cNVVV3H//fdz/vnnc9xxxzFgwIAObaZNm8a6des4//zEXyFlZWU88MADbNiwgTlz5lBQUEA0GuXnP//5Uf9+7Zm7p2VH6TJx4kRPx4NHXt28m5l3Ja6Kr7ttBqVFkR7eISKZtG7dOk4//fRsh5F2Bw4cIBKJUFhYyLJly7juuuu67P0frWSfnZmtdPeJydrnbY9+/AkV3PLJcXz3d69zoKlZiV5EMmLTpk189rOfpaWlhaKiIu65555sh5S/iR6guDCR3OONLVmORETCYsyYMVRXV2c7jA7y9mLs46vf41uPJgqZHWhq7qG1iGRDrg0d9wVH85mllOjNbIaZrTezDWZ2Y5LtxWY2P9i+3MxGddo+0sz2mdk/HnGER+mNrfvaXqtHL5J7SkpK2LFjh5L9EWitR59simd3ehy6MbMIcBdwMVADvGxmi9399XbN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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "result.history.plot(\"energies\")" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAWoAAAD4CAYAAADFAawfAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nO2deXxU1dnHvyeTSWaSkIWQkA1lX5SdWMAFFSyLiKB1q1pLLWqtC2rrq9alal/f+ta2ovVtrVatWDdEhWJQcQFxAcsOKpvsCQkJSwJZZjLLef+4k0lmMkkmySS5JM/384Fk7px77jM3d373uc95znOU1hpBEATBvER1tAGCIAhC44hQC4IgmBwRakEQBJMjQi0IgmByRKgFQRBMTnRbdNqjRw/du3fvtuhaEAShU7Ju3brDWuu0UO+1iVD37t2btWvXtkXXgiAInRKl1L6G3pPQhyAIgskRoRYEQTA5ItSCIAgmR4RaEATB5IhQC4IgmJxOJ9RlS5awc+Iktg45jZ0TJ1G2ZElHmyQIgtAq2iQ9r6MoW7KEwgcfQjscALgPHmT9vHfZ96mdiqooErrHMn5mPwaOzehgSwVBEMKnUwl18ZPz/CINUJSey7a+l+OtMh4cyo86Wf7qNgARa0EQTho6VejDXVgY8HpX34vxWmID21R7WbV4V3uaJQiC0Co6lVBHZ2YGvHbGdg/Zrvyosz3MEQRBiAidSqjT77wDZbX6X8c6j4Zsl9A9NuR2QRAEM9KphDppxgy6XXih//WAYyuxWAKXGouOiWL8zH7tbZogCEKL6VRCDRDdIxWAqMREzl38FyZedzpxSTEAJKTEcv41g2UgURCEk4pOlfUB4D5UDID3+HG8lZUMOKMn/XLTsVg63T1JEIQuQqdTr6w//C89778fAFfRIY4WVvDsLStY/+E+HOWuDrZOEASh+XQ6oVZRUdhOG4K1Vy+8FRWUHzMyPFa9u4udaw91sHWCIAjNp1MJtfZ4KHzot2iXi/4fLcM+bCjlx2onwDgqxKMWBOHko1MJtfvwEUoXLMC5e7d/W/kxJ0qBNdZC1QkRakEQTj7CGkxUSu0FTgAewK21zm1Lo1qK+1ARANaMTAru+hUxffpQnjiRuKRYoq1ROMqrO9hCQRCE5tOcrI/ztdaH28ySCOAq9Al1ZgbV+/bhOXGCU266nO6ZCezaUEyVDCYKgnAS0qnS89xFRq2P6IwMojMzcO3bx4DcngCkZMYRZVFGw80L4JNHoSwfknJg0kMw/IqOMlsQBKFRwo1Ra2CZUmqdUurGUA2UUjcqpdYqpdaWlJREzsJm4K2sJKpbNyzJyVgzMqkuOsTxI1V4PF56D+vBKaelGiK95HYoOwBo4+eS243tgiAIJiRcoT5baz0amAbcopSaENxAa/2c1jpXa52blpYWUSPDpcfNNzPw69UopbBm9KS6ysMr969iy/J8Ksqc5G8/hv74UXBVBe7oqjI8bEEQBBMSllBrrQt8P4uBd4EftKVRrUFFGR8ppn9/1JizAUhIsbH96yIWP7kBV2kDYfay/PYyURAEoVk0KdRKqXilVLea34HJwDdtbVhLKLj7vyh9+x0Aup13Ht1+/SBg1PiwJxhV9RwJA0PvnJTTLjYKgiA0l3A86p7AF0qpTcB/gDyt9Qdta1bz0W43x/PyqD6w37+tZlZiQooNW4JRmMkx+g5QlsCdrXZjQFEQBMGENJn1obXeDYxoB1tahfvwYfB6sWYYiwdor5f8v89HdfsBcUkx2I8ZHnVVxgSIiQe3EzxOsCXBhX+UrA9BEExLp5mZ6PItw2XNNEqYqqgoUku+YXj8DqKiFLZ4X+ijqACcx2Hq7yFzBKQOEJEWBMHUdJo8aneRMdklOqN2Oa4eyW4sx9YCRpx62i+Gkd7DBXH/Df0vgKpj8OnvoKwAkrI7xG5BEISm6DQetfZ6sWZn+z1qgPK0QZSXHAcgOsZC35FpJORkwZm3QcqpcNpMo+HWJR1hssHmBfDkUHg42fgp+dyCIATRaYQ6afp0+n/yMZbERAC01nzhncDuqCFobSzHVbD9KEXL34eKI8ZOPQZA2hDY+u+OMVom3wiCEAadJvQRjKPchVdHkdi7J7hcEBPDyte+Jbl0A9Pi8+EHNxgNZ8yDhPSOMfKT0JNvdryTx6o3sik/6iSheywjTikjfsGfcBcWEp2ZSfqdd5A0Y0bH2CwIQrvTaTzqgl/fTfGT8/yva1LzsmdfjooxUvPslnKqvN3g1LNqdzxlHHTv2662+gkxyWZH5TksL7qS8qOG/eVHnaxaF0W+Owu0xn3wIIUPPkTZkg4M1wiC0K50Go+68uuviT/nHP/rmgUD4pNj0V6vsfKLp4SjpEDa4MCdd34MBzfAuXe3vaF1C0IpxY6Ks1lVfi3l3h4kRB3GrW24sQXs4rXEsKvvxWQUGwOj2uGg+Ml5AV71jq+LWLV4l98LHz+znyziKwidhE4h1Nrlwn34MNaMOgOJPo+6+KqZxN71S1KuvAKbcx8ORkNU0IPEmudhxwew/LG2raa3eQE73niDVaUPUO7tQSwncBGHFyN1sNybjlH/qj7O2O4Br/Pd2Xz1my8pP+okNt6Cy+HF6zH2LT/qZPmr2wCaL9ZSWVAQTEenEGp3cTFoTXSdjI9TTk/lgp8OwrPyMK6iQigrwO4qwOE+E+3VqKg6JU93L/ftVWdADyIjUHWEb0fVBJaX/cLvMTtJCrGDCt2P9vLpuc8Q6zxK6uEtFGWdidcXHnFWeOo1d1d7WbV4V5NCHeCJJ3gYH/MGA2MOGG9G+lwIgtAiOoVQuw4Zi9Za6+RQJ6XZSUrLZmd6Gu7CIkjMYsjNd9LbZQ/c+ZNHjVmKAR36qum1Vpxqsjp8A4arTlxdL6wREq1BqcDXUca0d6ctlYPZ5wa+3wDlRx28fOtCyt3JJESX0jurjL0Hk2pfD7Kxbbsdt9voq7zcwnLmQGI1A+M+NzoJdS4i5HWXLVlC8ZPzWj9IKk8BQienUwg1SmEfM4aYXrWFlQ5sO4o9IQZrz564DhWBUiT2H0Ri8L4NVc2LRDW9oKyOck+PBh3mulhc5UR7q41wh/b6RdpPGCLtP6a7u//nN/tTqDGg3N2db77VBBvkxsaq8mtrhRrYUdibVTWCbzlK75i17HUa4ZuE4sOML3mDgdAscSxbsoTCBx9CO4yxhJpBUqBpsa4rzPYUqC4Hj2+ZtbIDsOiX8P49xoSmhoQ7hLjvqJrQZJx/x8JFrFrhDrjZ7S1MCdiHA6sD2wTdIMefF83AgdVN3lxk3EGoQdXkGEeS3NxcvXbt2oj32xxeeeArevZJ4rQt/8C5bRv97hxNVdYk9hwfTK8h3enW3efZPjnUl8ccRFIvuLOVRQIfTqZuzPn5/f+kOiZUuKOWKI+Twdtf8w8cfnruM80S5lrqi3D4eLkl40eALwvl+C+DngQC+47GQR/vVxxwjcAR0x1b9VGGRn1B903LcJdrohMU6T+7lKRbHvPvs3PiJPLdWezqezHO2O7EOo/Sb/e/yaz8FgtV/v0ShvWifMuB2n5mDIf9X1G8wYa70kJ0nIej/UbyTcIV/mP3sqylMGaUf4B2fPICBp7ZG3Yu84v7jmMjWHX8Kn+b3vYNbHNMwu2p9V2U8hCrqnB44/yCu3VfFh4VW+dUBD79KNwotH/cIVQbi3bS1/sZB9xj/DZnVm+gMGZU7WfIqGR3aRYeXXuTVtpNtNuBKzoeW/VRxvQzyias25VZ249lD4WePv7XIdvYDlFYnYUjOgmbu4wxZ9jg8PfN7yeoTUv26cxtRj5we2NfsnoopdY1tB7tySXUwV7QgMm1X74arwTQH/+OZ3f8kRHdP+N0+26qt20ibcBBStRwFhQ+wrRfDKPvyLTaPuuEJwCjmt6Mp5t+3IeAbWXHT6d4yWZDVOI16cPKSOpt9FvttfFS/t9xWxNA1RnM9LqIdjtxW+P9YlUj0gBfjnsUpy21/rkIDo8E9eOM7d5CgQeFB43yZ6E4dL3nkGbb02/vYuL6pfKN92wcMd2xuMrxRtvRUbXCGOVxklG4iiM9hvnFO/XwloDX/XYvBgW7+szEGVvTjw0d1bgwDrF/zN7qM2oHcXUcXtXwPmF9xtYQKrzV2OtQeF0oaPSzt2ubjjy2ydpEeZyMP3Vns8S6cwh1KEH1cXB1Mh6XoteE46CiqHDF88+Slzin23MMj3/f3+6EpwfzS57n/PNOcNpVMwP7buwxNNSxVbTxh/EaC+aW7bWzfu8F7Oo9s1ZU9i4mpb+DTTGXUe5NAw09SjZwIvHUAC+yrjCjvCil0F7jj16Unsu2QVfjtdR6caEELWyBr0ew5x30OlLiFOriDmlOOF9+FSDwYRFJkRWEMLA5j/Dzly4Pu31jQn3yxKhDzeLz4SyLxhLrBe0B7aHc2wOABMsRtAavS6EsGluUUfej6pvlQB2hHn6F8e/9e6C8uH48M9SxtTsgk25j/kS2DbjGL6hOWyrfDfyJIU5enzgpOJp6ekBog+hoLMnJeMrKjAG1wYVQeZTizd1wV1rIKV9NiqeCTdYr/I/pp3z3HhnF6+D7txo8Xf12/7uewIe66/fjMwqtIyn39kCh0bQ8Ht4oUdYGEg+DCD5e8Otw+2mqX0FoYxwx3ZtuFCYnj1A3MrjnqrRgS3H5X1d4DE+ym+UwjqNW9n6URs45R+iW7SRaOXBUNvBVd1UZqXrB3lcDxy7ba/cL6s5xlwSKIoQUFa8llt39Z5FRsi50poPPe0/qXVxnr08YySf+VzsreuIOFtQgam4EdWPA9cMIRky4D4txl2s+Pff/Qoe1I/GYfjLQkvBHOB5/S89XZzmvXRRb9dGI9XXyCHVSTshBP68HPE5jUKmG7JgtXNL9fpKj88G33V1pCJtNHacquoGR88wRsP5l4zjJpzR67LK9dgrXJKE9Rrw5eEJKYzisyQzZ+l3oN2u8+UZi8enXz6Tw+aX+jAmD+iGMjOK1gWEVqOeFa8ANgDJi2yHCJXWzUEIJfurhLRRljq9/o2oukRKmFghjcDipVTF0VKM3yNQj31CUMR6vJaZBG6M8TjKKVnEkdVjDsXiTxWXNHjdu7xh1zaBjJDh5hHrSQ7D4lto0LB/uKkOArXEeiLKCUsRSSVaMIYQ6FlAal0+oZ6Y/Tuy0+0MfI3Ok8bNwU6BQT3oIFv8SPLVee/HmRL9IAw2KXChinU3caWtCMQ2QBHDKuNoc5NREElIOUV4Q7c+E0J4oPM7miV6ocEmUx8mg7xc2KvjKZiPrVPimchiOmO5Euw2R86o6GRTaDVrXE5pYVYVTJfgzL7ZWTMTTSMaEwojhe3Xgtmi3A5fFjs1VSvfDWzjS/fTGbyT1BjvzyDy8Fl3ncxWl5wZmpezPY/C5fSj/7Fl/7nfC0CzKv3qrNkvlzFzKVn5Dxuo65ys6Gsvhj2rDW3fewZ4CL+vWlPozLzJjDlLo6BmQNdBnpIfilx7y9310xGS+cZ3d+gwF1wYKrbUZJmMsCyB1AOuKR0nWRwdmfTSGaQYTgyc/JJw7gfLPVgZMhuDr5yleutUQo5rUrU0HcFdqLHZFzzmXknTOCPYsfgdVUULvnocoO346B9/YbMxcDJEmFoCrCv4nG865CyY+EPjeC1Mg/z+GcCTlsPXvgbMBi9Jz2Tr42iAhcvvuvIFe2WnFSzl38V+adX6aJGhAtCwmlNfdNPXEafe/yaz+HktcXKN/m+Dc51A5wJUfLQi4uMekb2Bkxr8bzWXuPTSVvd8cCcxThkbzi0NdS9tW7mNXr2l1BnrzyHZsDxBPoMlrMJwJORGbyNNWyAQhU2L6rI+yJUtYP+/dgC9SvUfKvXlGWtap0xtuc+B9Ui6/jFXf2PG6NfF2L6dufo2MglX+Yx1LH4blsp8x9vZpoY1ZfAv0Ggujrwvc/uQwyB4FV8xHu1xsGzUa3O6AJkXpuewecAkOa7K/POmxtxYGCsSB9xl9xyXt8sVt6uanKyvxlJY22oey2cj83aPmEpoWYHrxFLo8phfqz2bexnfpFzaaoRDWIE2INsETSHb0v4yizPHc9PyF4X+gqmOU3XWmMXB4tJzozEysp/TCsX4DuroajSI/+1wyyrZw6m/vCRAAMwtE8OxAwHhMT0gI8DTNYq8gdGZMn563M2VC/YGocNKywmjjtcQGlAi1uspxW2x43F4s0Q2U43Y5jEkp0cZgT9nHX7B+x3h2DQj0jAf/6FLKP1tJkTOFnQMuJ33kDJJmBN4AkmbMMK3Q1dhl1huJIAgGphDq5mRMtLb/GFc5YKwAE58cIkvh4Eb4xyS46jUYOAWAjf9Yxra+lwfkSG/rezlR65dy7qef8N28DcQXVTLshvPa9HO0BWa+kQiCYGAKoY6P01RUtV2+aN0sCytG1khVHaHe+OxS1q1x1NY+0OfCK2tZd7ACR3QS9Ly4XmEkryWWrakXsPueL6gsqybGHs2utcVSNEcQhIhjiqW4zrxqKBZLcNAi8LXCS5R2Nd5GaaIsgYJvsWgGHFtpvB8bS8Z1xui2o9wQ7I3PLmXVuigc1mRQCoc1mS+jb+KrQ2f4t9WrXufDY02gsszop7rKzfJXt7Hj66JwP7YgCEJYmEKoB47NYOJ1p5PQ3fBwE7rHMnRCdsDrCy6OYVLSX0hI1A23mX06k64bErBt4nWnc+7iv5D0o0uJstnod/VUrn/ibLIGpgCwbo0jcOIBGLHucGpJBMXIa4r1C4IgRBJThD7AEOvgsMG5dV9sfgviPmfgLX+CtEGh29TpK5i4UaMoe/sdPPn7sfft49/uiG687GjDhC4jWrMorSAIQqQwhUcdFn3PhR+/Ccmntmh3+0hj1mHlho18/e/d7N1yGACbuyz8TrQxySWheyy2+NBV4Gq8eUEQhEhhGo+6SRLSYdDUFu8e07cvvZ77O/ZRo9jy2w04KzPoPawHY86wsWpddWD4I+SMwmrGj/Ey8hc/BIyZd8tf3Ya72utvEx0T5Z85JwiCEClOHo/6+49h36qm2zWAiooiYcIELN26YYu3+gcTR9w0jezsKGLcJ0BrbK5Szhrt5syhJ7BVl/q3GSJdmyM9cGwG518zOCAefv41gyXrQxCEiHPyeNSfPArx6XDqwhZ3UZ2fz/H38rDFjaSq3MggObzrMAeKojnnqhEMv6B3bePnzmfkKRuM35Ny4MyH6vUXKq4uCIIQacL2qJVSFqXUBqXUe21pUIOUFUBSdqu6cO3fT8m8eVjdVTgqDKH+dslmlNdDdnSdkoSbF0DRFowBQ22UOF1yu7FdEAShnWlO6GMusLWtDGkUlwMqD0Ni64TaNnw4REURXXEUZ6Ub7dXs3umk+/EddD9zTG3DTx71L7FVa0OVsV0QBKGdCUuolVI5wHTgH21rTgOcOGj8bKVQWxISiB0wgNNLPuAn/z2ewu+PUeW1cWpaFSqmzmBiQ6vJNLLKjCAIQlsRrkc9D/gvwNtQA6XUjUqptUqptSUlJRExzk9ZgfGzlaEPAPuokTg3bQCtObJ5NzHOMvqf2z+wUVJO6J0b2i4IgtCGNCnUSqmLgGKt9brG2mmtn9Na52qtc9PS0iJmIAA5ufCLLyB7TNNtm8A+ciRl1p58/Ox6kg9t5qzVD5AycUJgo0kPgdUeuM1qN7YLgiC0M+FkfZwFXKyUuhCwAYlKqX9pra9tW9PqYLVDxrCIdJU4bRrVzsHsWH6QHfQm4aK/Er2zmoFj6zQKtW6hrIIhCEIH0ayFA5RS5wG/1lpf1Fi7lizF1SjbloKjDEb+uNVd7fi6iE9f2YrHXfu5o2OiJAdaEIQOpbGFA06OCS/rX4ZV/xeRrlYt3hUg0iDFlARBMDfNmvCitV4BrGgTSxojAjnUNZQfdRC6mFLzFoEVBEFoL04Oj/p4PiRmRaQrmyt0EaaGtguCIHQ05hfq6kqoOtbqHOoa+u5cRJQnsBRplMdJ352LItK/IAhCpDG/UB+vyaGOTA5zTnQBg7e/RqzjCGhNrOMIg7e/Rk50QUT6FwRBiDTmL8qU2h/+aw9ER6bOc/qdd+B58CEyVtdmpSibjfTfyfRwQRDMifmFWimIi9wq5TUrbhc/OQ93YSHRmZmk33mHrMQtCIJpMb9Qb1sKB9fD+ffXW6OwpSTNmCHCLAjCSYP5Y9Q7P4S1L0VMpAVBEE42zC/UEcyhFgRBOBkxv1AfL4BEqVonCELXxfxCXVYQsckugiAIJyPmFurqSvBUS+hDEIQujXmyPjYvCCwrOmAy7FwGbges+YcxM1HKjAqC0AUxh1BvXmAsHuuqMl6XHYC1L9S+X5ZvvA8i1oIgdDnMEfr45NFakW4IWVxWEIQuijmEOtxFY2VxWUEQuiDmEOpwCy7J4rKCIHRBzCHUoRaTDUYWlxUEoYtiDqEefgXMeBqSegHK+Jn788DXM56WgURBELok5sj6AEOERYgFQRDqYQ6PWhAEQWgQEWpBEASTI0ItCIJgckSoBUEQTI4ItSAIgskRoRYEQTA5ItSCIAgmR4RaEATB5IhQC4IgmBwRakEQBJMjQi0IgmByRKgFQRBMTpNCrZSyKaX+o5TapJT6Vin1SHsYJgiCIBiEUz3PCUzUWpcrpazAF0qp97XWq9vYNkEQBIEwhFprrYFy30ur759uS6MEQRCEWsKKUSulLEqpjUAx8JHW+usQbW5USq1VSq0tKSmJtJ2CIAhdlrCEWmvt0VqPBHKAHyilhoZo85zWOldrnZuWlhZpOwVBELoszcr60FqXAsuBqW1jjiAIghBMOFkfaUqpZN/vduCHwLa2NkwQBEEwCCfrIxN4WSllwRD2BVrr99rWLEEQBKGGcLI+NgOj2sEWQRAEIQQyM1EQBMHkiFALgiCYHBFqQRAEkyNCLQiCYHJEqAVBEEyOCLUgCILJEaEWBEEwOSLUgiAIJqdLCnXe7jwmL5zM8JeHM3nhZPJ253W0SYIgCA0SzhTyTkXe7jwe/uphHB4HAIUVhTz81cMATO87vQMtMwd5u/N4av1TFFUUkRGfwdzRc+W8CEIH0+WE+qn1T/lFugaHx8FT6586qQUpEgLb1W9iwedwQs4EVuavbPSchnPe5eYntBZlLOASWXJzc/XatWsj3m8kGP7ycHSIBWoUis0/3dzmx2+LL22wwALYLDYePvPhZvU9eeFkCisK623PjM9k2WXLWmVjKFp6LpraL9T7QJP7BJ/DYGwWGzP7z/SLd2JMIpXuSlxeV6vaNHRTCLbZ7G3Mbl97t2nu91optU5rnRvyva4m1O0tRnWJlKDW9FVzoSil8GpvvTbN/UxtfROra3NLBWxCzgQWf7844BxGq2gSYhIoc5aF7DdaRaOUqretZp+M+Ayq3FWUOktb/RkjRSibzd7G7Pa1Z5uWfK9FqOvwxrY3eOzrxwK2tVQsm0tDN4koFYXWOuw7cTjeXw2Z8ZlhP5YDIYXabrGTbEtutbcVLLCC0JlprqMkQl2Hf333L/53zf+SZk+jpMpY23Hu6LnMGTanzY/dkMdal3BuGg0JflME990cwW+MlnhbgtDZae6TaGNC3eUGE5fuWcqQ7kNYMGMBZc4yJi+cTLRqu9NQ12NtSqQhvIHNGu+3uTg8Dn7zxW+47/P7yIjPoNJdGVKk63r44YQE3Not69ILQhAZ8RkR66tLCfX+4/vZcngLvxrzKwCSYpNYeulSUu2pbXK8lnqshRWFTF44OWQYIT0unSgVhUd76u1XV2Ab8rhrYtmNeeRaa78nMPzl4c2y3YyE6/EnxSQRZ41rcXy8NW1aYrPZ2pjdvvaOUdeEBCNBlxLqpXuWolBM7VO7Nm+qPZW83XnMWzePQ5WHIpo+FSoVEGoFtaFBQKgV0sKKQt7c/qZ/+6HKQwBYlCVArIPDGi0Nj0CgJ9CY6LeWlghYOFkVwf0Gx9AbGsi8b+x9Tf7dR6WPajJTpSVtOjpDIRJtzG6f2bM+GqNLxaiLKopYU7SGGf1m+Lfl7c7jwS8fbDL7oCUnvqksitbEiIO9v5akm4WiJXHscD2McM5pW+UyByO5zYLZkMHERgjX8wxnkC/4y1/prqTMWVavXd3R4OB9wvVewxmoCCeFrynBD2WjGTwMQehsiFADi75fhD3azpTeUwK2h5OJUUNj6TahPM9QnmZTgh/ujaO5qT+RzOEWBCHydNqsj3BmoNV4doUVhcRaYnF73QHC1BwvNjjboimP1a3dJFmb9ljrMnf03LBmyDV3oKLmmPK4LwgnHyetRx3KQ7QoCwplpIs1QGtyiYNDFuHs15JZfS2J0wqCcHJzUnrUizYU8MSH2zlYWkVWsp27pwxi1qhs//uhMipCpawFE5ynHMrTDJV9EOzFNpTREUxLcimn950uQiwIgh9TCvWiDQXc984WqlyG8BaUVnHfO1sA/GLd0kkfofYNJYw16VOFFYVYo6z1YrnhHD/SuZSCIHRNTLlwwBMfbveLdA1VLg9PfLjd/7o1s37C2Xd63+ksu2wZc0fPxeV1MTwtcOJHQ5NkolQUCkVmfKYM1AmCEBFM6VEfLK1qcnuoQbe2mDE0vc90Ptr3EUcdR+nVrZd/e1Z8FoerDtfrW8RZMDMul4v8/HwcDimO1VHYbDZycnKwWq1h72NKoc5KtlMQQqyzku3+36f3nY5Xe3lk1SM4PU4y4zPbJJ83MyGTNy96M2DbgRMH+ObIN0zInsDO0p0yyCecNOTn59OtWzd69+6NUqqjzelyaK05cuQI+fn59OnTJ+z9TCnUd08ZFBCjBrBbLdw9ZVBAu/FZ43F6nNz3g/u4esjV/u1tIZYVrgocbgep9lRe/vZlLMrCb8/8Lelx6RE/liC0FQ6HQ0S6A1FKkZqaSklJSbP2M2WMetaobH5/6TD/6yR7NL+/dFhA1gfAoQqj7kUkq1SFotpTzeSFk3l+y/O4vC6+LPiSi/tdLCItnJSISHcsLTn/phRqgAuHZfp/v3rsqfVEGmozL9paqGMsMZzS7RRe3/o6Y14Zg1u7OT319DY9piAIQg1NCrVSqpdSarlS6jul1LdKqXbJNys+YQx2PHjRadwzdXDINkWV7SPUebvz2H5sO168aDRFFUX8Yc0fyNud16bHFYSOZtGGAs56/FP63BvM4VgAACAASURBVJvHWY9/yqINBR1tkp+9e/cydOjQiPR12WWXsXv3bgDWrVvHsGHD6N+/P7fffjtNTQrUWnP77bfTv39/hg8fzvr16wEoKSlh6tSpje4bLuF41G7gV1rr04BxwC1KqdMicvRGKCwzhLp/ekKDbaxRVvol9SMlNqVNbXlq/VP1MklqJs4IQmelZj5DQWkVmtr5DGYS60jw7bff4vF46Nu3LwA333wzzz//PDt37mTnzp188MEHje7//vvv+9s+99xz3HzzzQCkpaWRmZnJl19+2WobmxRqrXWh1nq97/cTwFagfhwiwtQI9Yb9x3j439+GbHPFoCtYNGtRm8fcGprc0ppJN4JgBq78+6p6/15ZtReAP3ywLeR8hoeXGN/HoxXV9fYNh1mzZjFmzBhOP/10nnvuOf/2hIQE7r//fkaMGMG4ceM4dMgYg9q1axfjxo1j2LBhPPDAAyQk1HfePB4Pd999N2eccQbDhw/n73//OwCFhYVMmDCBkSNHMnToUD7//PN6+7766qvMnDnT3/748eOMGzcOpRTXXXcdixYtavTzLF68mOuuuw6lFOPGjaO0tJTCwkL/Z3311VfDOi+N0awYtVKqNzAK+DrEezcqpdYqpdY2d0QzFFNPz+Czu8+jqtrDK6v34fF23FpPDYVW2jrkIggdSY2zFExpZevWxnzxxRdZt24da9eu5emnn+bIkSMAVFRUMG7cODZt2sSECRN4/vnnAZg7dy5z585ly5Yt5OTkhOzzhRdeICkpiTVr1rBmzRqef/559uzZw2uvvcaUKVPYuHEjmzZtYuTIkfX2/fLLLxkzZgwABQUFAcfIycmhoKDxJ4iCggJ69aqdY1F3n9zc3JA3h+YSdnqeUioBeBu4Q2t9PPh9rfVzwHM+41qtqjHRUZyaGk+v7nF4vJqSE04ykmwBbX7+4c8ZnzW+zRemDTW5RqaHC52BN28a3+B7Dc1nyPbNZ+geH9Po/g3x9NNP8+677wJw4MABdu7cSWpqKjExMVx00UUAjBkzho8++giAVatW+b3aq6++ml//+tf1+ly2bBmbN29m4cKFAJSVlbFz507OOOMMrr/+elwuF7NmzQop1IWFhaSlpTX7c4RDeno6Bw8ebHU/YQm1UsqKIdKvaq3fafVRw2DBmgNYohSZPnE+WFYVINQer4f1h9bXm9rdFkiJUKErEu58huawYsUKPv74Y1atWkVcXBznnXeef5ak1Wr1hzEtFgtud8NVMIPRWvOXv/yFKVOm1Htv5cqV5OXlMXv2bO666y6uu+66gPftdrvfhuzsbPLz8/3v5efnk53deKQ3OzubAwcOhNzH4XBgt9sb2jVswsn6UMALwFat9Z9bfcQweWX1PhZvOkhmkvEhi4Iew444juDWbjLi2if8UFP7Y/NPN7PssmUi0kKnp2Y+Q3ayHYXhSYeaz9AcysrKSElJIS4ujm3btrF69eom9xk3bhxvv/02AG+88UbINlOmTOFvf/sbLpcRltmxYwcVFRXs27ePnj17csMNNzBnzhx/RkZdhgwZwvfffw9AZmYmiYmJrF69Gq018+fP98evn3nmGZ555pl6+1988cXMnz8frTWrV68mKSmJzMxMvx2RyEwJx6M+C/gJsEUptdG37Tda66WtPnojFJY5OD0rkaxkGwmx0VQ4A++u7ZVDLQhdmVmjslslzMFMnTqVZ599liFDhjBo0CDGjRvX5D7z5s3j2muv5bHHHmPq1KkkJSXVazNnzhz27t3L6NGj0VqTlpbGokWLWLFiBU888QRWq5WEhATmz59fb9/p06ezYsUKLrjgAgD++te/Mnv2bKqqqpg2bRrTpk0DYNu2bZx11ln19r/wwgtZunQp/fv3Jy4ujpdeesn/3vLly5k+PQJOndY64v/GjBmjW4PD5dan3vOenvfRDu31ekO2WbZ3mR76z6F665GtrTqWIHQlvvvuu442odlUVFT4deD111/XF198cUT7r6ys1GPHjtVut7vRdtOnT9dOp7NZfZ9zzjn66NGj9baH+jsAa3UDmmrKWh+HypwAZCbbGky9i4uO4wcZPyAzPjPk+4IgdA7WrVvHrbfeitaa5ORkXnzxxYj2b7fbeeSRRygoKOCUU05psN17773XrH5LSkq46667SElp/TwPUwp1zazELF98+q8rvqfgWBWPXVJb/+Os7LM4K7v+Y4ggCJ2Lc845h02bNrXpMUINQraWtLQ0Zs2aFZG+TFnrI7d3d7b9bipj+3YHYHdJBR9vPdTBVgmCIHQMphRqAJvVgtVimJeVZKP4hBOXp3aV7znL5nD/F/d3lHmCIAjthimF+o3/7OePdZbdyky2ozUUn3D6t+0t29sBlgmCILQ/phTqj7ceCgh11Ex6KSozZkm5vW5Kqkoilppn5gphgiAIphTqg6UOvzgD5KTEMSA9AZfHmJl+uOowXu2NiFB3lQphgtAiNi+AJ4fCw8nGz80LOtoiP2Ypc7pt2zbGjx9PbGwsf/zjH/3bq6urmTBhQrNmWDaEKYW6sKyKzDrrI/ZPT+Cju85lXF9j5e+ayS4943q2+ljhrHguCF2SzQtgye1QdgDQxs8lt5tKrCNBa8ucdu/enaeffrpeDZKYmBgmTZrEm2++2cCe4WM6oXa4PByrdJEVVICpLvHWeC7udzF9EsNfHLIhwlnxXBA6LS9Nr//vP0bVOj5+BFxB3wNXFbx/j/F7xZH6+4ZBZytzmp6ezhlnnBFyVfEOKXPaHhytqCY1PiZgxXGAXy3YxIOLvgFgQMoAHjv7MXol9grVRbMIPk5T2wWhy3C8gfBf1dFWddvZypw2xtChQ1mzZk2L96/BdBNespLtrHvwh/XiQsUnHByvMgquOD1OYqJiIrJgQFtUCBOEk4afNbKcXFKOL+wRvN3nIMWnNr5/A3SlMqcWi4WYmBhOnDhBt27dWtyP6TzqGoJFOCvJzkFfBb17V97Lle9dGZHjtEWFMEHoFEx6CKxBT5ZWu7G9hdQtc7pp0yZGjRoV0TKnGzduZOPGjezZs4fJkyczYcIEVq5cSXZ2NrNnzw5ZlKm1ZU6bwul0YrM1HMoNB9MJ9cJ1+dz8r3X1VnTJTLZxuNxJtdvLocpDJMcmR+yY/dMTsFmjWHjzmXx570QRaUEAGH4FzHja50Er4+eMp43tLaQzljltjCNHjtCjR4+Q8evmYLrQx/r9x1i9+wiWqECPOjPJhtZw6LiDoooizs4+O2LHzD9Wya6SCjbsP8Zv3tnCP36aS6/ucRHrXxBOWoZf0SphDqYzljktKioiNzeX48ePExUVxbx58/juu+9ITEzsvGVOZ7/4tZ42b2W97Wv3HtHX/mO13n7omB72z2H6mQ3PtPgYwbzw+W596j3v6c+2F+tT73lPv7fpYMT6FgQzIWVO69OWZU4vueQSvX379nrbT/oyp4VlDnJS6mdcjDm1O6/8fCwF5QVodERXdjlYWoXdamFc31RiLFFsyi9l+nApnyoIZuBkLXNaXV3NrFmzGDhwYGtNNKdQn9G7e4Pvx1piuWHYDQztEZkZSWCsx5iVbCMmOorTshLZeKA0Yn0LgtA6TtYypzExMfXWZ2wpphLqareXXt3t9E+vn9AOMP3pzxnXN5UHL7o9oscd1DORnBQjJj0iJ4m31uXj8ep6cXJBEISOwFRCHRMdxXu3ndPg+26PZteRQ5Q5s0mKrT+g0FLmXjDA//s5A9Ioq3JR7nCTFNe6kVpBEIRIYLr0vMbITLaxw/kO096eFrE+a4L1NVxwWk/mXTVKRFoQBNNgGo86b3cej6/+M6XVxfSMy+C8U85lZf5KiiqKyIjPYO7ouXjs+znBl+ByMXnhZOaOnsv0vq1LfTlwtIqpT63kT5ePYNowYwBRa80Jp5tEm4i1IAgdjyk86rzdeTz81cOUuopBwaGqIt7c/iaFFYVoNIUVhTzwxQNsdj4HUUZCe2FFIQ9/9TB5u5s/hbUuBaVVVFZ7SLTXivLN/1rP1c83nYgvCJ2dvN15TF44meEvD2fywsmt/r5FErOUOX311VcZPnw4w4YN48wzz/QPfHa6MqdPrX8Kh8fRaBu3duMl8AM7PA6eWv9Uq45dUyWvbhGmPmnxbCs8gSOo/KkgdCVqHKi6DlMknCOz0doyp3369OGzzz5jy5YtPPjgg9x4441AZMucmiL0UVNfuiUUlhfS5948spLt/kJKT3y4nYOlVWQl2zl/cBrLt5X4X989ZVDAFPFC36oxdRcqGJGTjNur+a7wOKNPaXip90UbCgKOFdy3IJidn33ws3rbpvSewlWDr2Leunn1HCiHx8Hv//N7pvedzjHHMe5acVfA+y9NfanJY86aNYsDBw7gcDiYO3euX9gSEhKYO3cu7733Hna7ncWLF9OzZ0927drFNddcQ0VFBTNnzmTevHmUl5cH9OnxeLj33ntZsWIFTqeTW265hZtuuonCwkKuvPJKjh8/jtvt5m9/+xvnnBOYsNBQmVPAX+a0ZnZiKM4880z/7+PGjQuoFTJr1izuu+8+rrnmmibPS2OYwqNOtLa8cpXXlexfmeXutzZy98JNAau1/Gv1/kZXbykoddAjIQab1eLfNrKXUUdkc5186uDluh5YtEVWhhE6NYcqD4XcXuYsa1W/nbnM6QsvvBAg6p2qzKmzeAo66Q2UL/4MoDUEFNDzRqFRqKjacIT2WnGW1Caqu7wAjceTalZvqfF8x5yaQo+EmIA2GUk20rvFsinfuCBrluuqKYVacwNoqm9BMDuNecAZ8RkUVhTW254Zbwy6p9hSwvKgg+msZU6XL1/OCy+8wBdffOHfFqkyp6YQ6sNFp2OpvJTYtA9R1lK0Kxl3+WCiE7ZhiSkjIz6DPTsmoCGgjbNkCu7jo5p9vLqrt1w2JvQdeuLgdD767hB97s0jSik8TQwohOpbEE5m5o6ey8NfPRwQ/rBZbMwdPbfFfdYtcxoXF8d5550X0TKnoWYYrly5kry8PGbPns1dd91Vb7ZgJMqcbt68mTlz5vD++++Tmpoa8F4kypyaQqizku0UlI6qJ7o9nHa+vHciAGc9/ikFpVUtEuZQxwPjj3u8yk2iPTqg/vWiDQUs3njQ70GHK9IAUUoFxMzFuxZOVmpSX59a/1RAmmxrUmJbU+b0yiuvbLLM6cSJE7FarezYsYPs7GwOHz5MTk4ON9xwA06nk/Xr19cT6poyp7179w4oczp27Fjmz5/PbbfdBuAvcXrrrbcG7L9//34uvfRSXnnllXp1PSJV5tQUMeq7pwzCXidGDPVXWQnVJhhrlMJqaXzad91+jzvcjHh0GS9+uTegTagFb0MR6kgerSVmLXQapvedzrLLlrH5p5tZdtmyVs9bmDp1Km63myFDhnDvvfeGXeb0z3/+M8OHD+f7779vsMzpaaedxujRoxk6dCg33XQTbrebFStWMGLECEaNGsWbb77J3Ln1nwZqypzW8Ne//pU5c+bQv39/+vXrF1DmNNhbBnj00Uc5cuQIv/zlLxk5ciS5ubn+9yJV5lQ1lSPYEnJzc/XatWubtU84GRTBbUJldEDorI+C0ipiLFH84bLh/n63Fh5n2lOf839Xjw6oltfn3rwmIt2G4P9oTLb/+A2FR7KTa58KBKGj2bp1K0OGDOloM5pFZWUldrsdpRRvvPEGr7/+OosXL45Y/1VVVZx//vl8+eWXWCwNO4MXXXQR77zzDjExMQ22CebSSy/l8ccfr+dph/o7KKXWaa1zCUGToQ+l1IvARUCx1jpyJeuCmDUqu8kwQThtatoF81jed7y8ah8XDqsV5Noc6sD4kRGKqR9rtiiFV+uQN5I+94bOLZWYtSC0DilzGl6M+p/AM0D9pRFOIkadksLzn+/hu8Lj/vS7mjUYs4NWHG9owdvG1lJsSNxlNXNBaB1S5jSMGLXWeiXQuvXhTcDoU1LokRDL4RNO/7aDpVVYLYoeCbEBbVuy4G2oGLrNGiWrmQuC0GpMkfXRHmQk2Vhz/6SA7I6z+/cgyW4lKkTd6XDDLHXbQ218XAPn9O8hWR+CILSaiAm1UupG4Eag0ThPR6JUoCCf1b8HZ/XvEbH+64r77a9v4Os9R3C6PcRGN56tIgiC0BgRS8/TWj+ntc7VWudGYpZPW7B8WzHnPrGc4hNGbPr74hOUO1tf2SoUD0wfwod3TBCRFgSh1Zgij7q9SLRHs+9IJRv3l+LxaqbM+5xnV+xqk2OlJ9pIjovh3XX5jP/9J/4aIZJXLZxMlC1Zws6Jk9g65DR2TpxE2ZIlHW2SH7OUOV28eDHDhw/351DXTCEvKSlh6tSpEbGvSaFWSr0OrAIGKaXylVI/j8iRO4DTs5KwWhQbDpRSfMKBx6vbNCvj3fX5/GrhJgrLHDIJRjjpKFuyhMIHH8J98CBojfvgQQoffMhUYh0JWlvmdNKkSWzatImNGzfy4osvMmfOHADS0tLIzMzkyy+/bLWNTcaotdY/bvVRTILNauG0zETW7zvGBUPSAWN5r7bij8t24A26GVe5PPxqwSbufHNjWGVYBaEt2feT+ulj3aZNpfvVV1P85yfRjsAyp9rhoOix/yFpxgzcx45RcHvgTL9TX2k6i7ezlTlNSKhdjLuioiJgLGzWrFm8+uqrnHXWWU2el8boUqEPMPKpN+eXceCokfMcnEMdSRqa7FJ3mnlTZVgFoaNwF4WuE+8tLQ25PVw6Y5nTd999l8GDBzN9+vSACTm5ubl8/vnn4Z+cBugy6Xk1nDcoDYfLw87iE0DgggGRpqFJMI0hpVKF9qQxDzg6M9MIewRvz8oyfqakhOVBB9MZy5xecsklXHLJJaxcuZIHH3yQjz/+GID09HQOhjiHzaXLedTnDUrn8R8N5+IRxqSWbm24gG04haRCIdPOBTOQfucdqKDynMpmI/3OO1rcZ90yp5s2bWLUqFERLXO6ceNGNm7cyJ49e5g8eTITJkxg5cqVZGdnM3v2bObPr39jiUSZ0xomTJjA7t27OXz4MAAOhwO7vfVP7V1OqAG8Xk1KvJUf/6Bt872DZzhaVOOV/WqQaeeCGUiaMYPM3z1qeNBKEZ2VRebvHiVpxowW99maMqdAk2VOXS5j8ZEdO3ZQUVHBvn376NmzJzfccANz5sxh/fr19fatKXMKBJQ51Vozf/58f/z6mWee8Zc6rcv333/vzwxZv349TqfTX2Vvx44dEclM6XKhD4Af/e0rNhwoRUGbD+DVnQQTvFJMKILLuwpCR5I0Y0arhDmYqVOn8uyzzzJkyBAGDRoUdpnTa6+9lscee4ypU6c2WOZ07969jB49Gq01aWlpLFq0iBUrVvDEE09gtVpJSEgI6VHXlDm94IILAKPM6ezZs6mqqmLatGkBZU5DDQq+/fbbzJ8/H6vVit1u58033/Q/GXS6MqftxaINBfz6rU2466RjNFVwKdLHb6xU62Vjcki0W/n52X3a3Bah6yFlTuvTlmVOJ0yYwOLFi0lJCVwkO+JlTjsbT3y4PUCkoX0H8JqqIfLAoi089clOnv1sF4dPOCVlT+jynKxlTktKSrjrrrvqiXRL6HJC3dBAnVkG8E7LSgSgxFflz1hdfROPLPmW0kqXCLfQ5ThZy5ympaUxa9asiPTV5QYTGxqoM8sA3v99Wn9Ku8urOVbpklxrQeiidDmhDmd9xo4kHM++JlQjCELXoMsJdUsWBWhPwvXszRKqEQSh7elyMWpo/qIA7UmoZcBC0Z6hmnAWFQ7nfEaqn46kNQssN2fh5nD7aW6bF2dlkXiskhMON9UeLzGWKHr6ZuceKnP4t3WzRTe7Tah9UuLCz5BoLccqq1v9GVrapq0/a5dLzzsZqPulTbJbqah24/IE/p1+NXkgt00c0C62hJP7XXdF9lCCcf7gNN5eV9BkP5F4umkr0QvnM1ijFCjq/b2CP2fd8xXqbxxOPy1p8/zFmfQ8pW9AG4XRJpQWFH9zhL3LD+IscxGbFEPv8zNJH5ra4PHqEqUUKXHWJsUcWiae23bu4qafXMF7K76mmy2aY5UuvI3oWWOf81c3/ZQ7f/MIvU7tw3dbNvLAnTfjdDg4e+IPueeRxwMKLYXqR6H4bvN6rrn4h/zpby9y3TVX4a4o4yc/+UnI6nvNTc8ToT4JqCs8GUk2nG4PFw7LbJGX1lSbYHGqrHZzrNLVbp812W4lPja6xYLalqLXGQgl1A1R/M0Rdubtx+uqPSdRVsWA6aeELdZNoXz/G2XKmtem4MB+bpt9Je98sqpVNny/fSvPPPEY8/7xLwCuvmgS9z76OMNG5XLLdZdz9fU3cfb5P2y0D4/Hw01XX0JsbCyzrryWKRfNIjvFzl233MScOXPqTZSRPOpOSHCoZuHaAzy4+Fu/Z1eTCVLTFup7wuG2+dfq/f7jNLegVCQorXJRWuVq0J6739oISvkFNbhNzb51cQXXmg1BOG06I5vn76i3rcdpKWTlprH304MBIg3gdWl2fZhP+tBUXJVuti7cHfD+8OsGNnnMO35+DUWFBTidTq65/iYuu2Y2AOMG5XDN9Tex8pMPibXZeeqFV0lNS2f/3j3cd/uNVFVWcP7kC/nXC8+yent+QJ8ej4enfv8wa1d9SXW1kyt/OofLr/0ZJYeK+K9fXk9F+QncbjcP/M+fGD32zIB9l777FudPvhCAkkNFVJSfYPjoMwCY8aOr+PTDvCaF+vWXnuOCaTP4dtMG4zxpzaEyh5Q57co8+fHOeo/fNXWua1aSeWTJtyHb1M0WeeLD7U3Gws2Gy9v5vV6z4Dwe+knKXdW6a+aRPz7DG0tX8Pp7n/Lai3+n9NhRAKoqKxg2Ope3ln3BmLHjefs1Y7r3/z58L9dcfxNvf/wV6ZlZIft8941XSOiWxGt5n/Lae5/yzmvzyd+/j6WLFnLmuRNZ8OHnvLXsCwadPqzevhvXfs1pw0YAUFxUSM86x+iZmUVxUWGjn+dQ4UE+/eA9rrgucE2Vao9Xypx2ZRqrcw2Ne8J1942Ux6ygkQfX5rczM019hnBCKOGch7aKUQcz/LqBDcZuY5OsOMvqi3VsklFx0hoXHZYHHcxrL/2dTz8wZvkdKixg/55dJKd0xxoTw7kXGEtXDRk2ktWfrwBg87o1zPvHqwBcOOsy/vzfD9Xrc9XK5ezY+i0fLzWmlp84cZz9e3YxdMQofvvr23C73UycMp3BQ4fX+5wlxYdISTUWuVY0XTgt+Hw98chvuOM3DxMVFej3xliiSO8RmTKnItQnIS2pc11DlFL0uTeP7vHhj1A3FTcOd6CwqQHHtoqHR0r0wvkMLR2UtEYpEmzRAbNPm+qnJW2ioxSp8TFhDdb1m5TDtiV7g2LUUfQ+PyusrI9QA3xrVn3B6i9WMH/xMuz2OH5++UVUO41ZuNHRgWVOPXXKnKqmKk9qzf/84U+MOev8eva8uDCPr1Z8xKN338ovb5vL+RddFtDGbrfjdDqJsUQxYnAfjhYXEmOJotrj5cihIk7JyfG/DnW+vtu8gXtuMbzpY0eP8vnyj4iOjua6H18esTKnItQnIeGm8IWixus+UlENgNWimhSnhy8+vclMjNxTu7c69S6cDJNwRbetRC/cjJTmnq+G+g7neM1ps3XrVrJT4kK2CU4vy57ch+wkO6sW76L8qJOE7rGMn9mPgWMzmjxeDXGxgSlzqrqS5KQU7PY48nd/z5YNa0nrFkuMxfBGa8QzOkr5X/9g7FjWf/YBZ/1wBh/8+x0UkBofQ4mlts2FF07lrX+9xBUzL8RqtbJjxw6SE7NxHz/G+aMGckHuELrbotj+7WZuvuH6ABtHDjsda0UxgzOHA4kkJyVRuu87xo4dyz1L3uK2225jcGaiv8TprbfeGnC+8vfv86cG3nP7L5g4eSrX/fhyUuJiWLdui5Q57arUfOlqvuhRSvkFuC51PeGG2sTHRDeZZRGuELQ2rS74c0VaUCMlepHAzLn8dRk4NqNZwhxMSlxMwA2gz2UzeetfL3HlD8f7y5x2s1kZnJlIlILBmUatm+yUOFLiYxicmcj//eVprr32Wp764/8ydepUkpOTyE6Jw5XeDZvVwuDMRAb+8heUHMzvkDKndT9nSnyMYbvvM0uZU8FPKE80OCe5z715IeOiCtjzeOsvJOHkQMqc1kfKnArtQihPNNirbCiubZZiVILQEFLmVDzqLkM4XrfQ+TkZPerOiHjUQkjC8bqFroHWuuksCqHNaIlzLELdhThZBrCEtsNms3HkyBFSU1NFrDsArTVHjhzBFrS6e1OIUAtCFyInJ4f8/HxKSko62pQui81mIycnp1n7iFALQhfCarXSp48snHyyIbU+BEEQTI4ItSAIgskRoRYEQTA5bZJHrZQqAfa1cPcewOEImtNazGSPmWwBsacpxJ6GMZMtYA57TtVap4V6o02EujUopdY2lPTdEZjJHjPZAmJPU4g9DWMmW8B89gQjoQ9BEASTI0ItCIJgcswo1M91tAFBmMkeM9kCYk9TiD0NYyZbwHz2BGC6GLUgCIIQiBk9akEQBKEOItSCIAgmxzRCrZSaqpTarpT6Xil1rwnsuVMp9a1S6hul1OtKqeaVu2r98V9UShUrpb4J2n6bUmqbz7Y/tKM9vZRSy5VS3/mOPTfo/V8ppbRSqkc72GJTSv1HKbXJZ8sjvu2v+q6hb3znz9rWtgTZZVFKbVBKved73Ucp9bXvmn5TKRX+0iBtY88kpdR6pdRGpdQXSqn+7WjLXqXUFt+x19bZ3lHXc7JSaqHv2FuVUuPrvNdu13LYaK07/B9gAXYBfYEYYBNwWgfakw3sAey+1wuA2e1swwRgNPBNnW3nAx8Dsb7X6e1oTyYw2vd7N2BHzd8I6AV8iDHJqUc72KKABN/vVuBrYBxwoe89BbwO3NzOf7O7gNeA9+pcN1f5fn/WBPbsAIb4fv8l8M92tGVv8LXRwdfzy8Ac3+8xQLLvJbgemgAAA91JREFU93a9lsP9ZxaP+gfA91rr3VrrauANYGYH2xQN2JVS0UAccLA9D661XgkcDdp8M/C41trpa1PcjvYUaq3X+34/AWzFuKEBPAn8F4RclrEtbNFa63LfS6vvn9ZaL/W9p4H/AM2rJdkKlFI5wHTgH77XCpgILPQ1eRmY1VH2+NBAou/3JNr5mg5Bh1zPSqkkDEfoBd9xq7XWpb632/VaDhezCHU2cKDO63xqRaDd0VoXAH8E9gOFQJnWellH2VOHgcA5vsfpz5RSZ3SEEUqp3sAo4Gul1EygQGu9qZ1tsCilNgLFwEda66/rvGcFfgJ80I4mzcP4gnt9r1OBUq212/e6va/pYHsA5gBLlVL5GOfn8Xa0RwPLlFLrlFI3+rZ11PXcBygBXvKFhv6hlIrvqGs5HMwi1KZCKZWC4dH3AbKAeKXUtR1rFWB4+d0xHvPvBhaodl6mQymVALwN3AG4gd8AD7WnDQBaa4/WeiSG1/wDpdTQOm//FViptf68PWxRSl0EFGut17XH8ZqiEXvuBC7UWucALwF/bkezztZajwamAbcopSbQcddzNEZY8W9a61FABfAwHXQth4NZhLoAIzZUQ45vW0dxAbBHa12itXYB7wBndqA9NeQD7/ie7v+D4S2124CHz1N9G3hVa/0O0A/jZrZJKbUX4++2XimV0V42+R5ZlwNTfTb+FkjDiM+2F2cBF/vOwRsYIY+ngGRf6Aza95quZ49SKg8YUefJ403a8Zr2PaXWhDfexQh3dtT1nA/k1zkXCzGEu0Ov5cYwi1CvAQb4RsljgKuAf3egPfuBcUqpON8dfhJGTLajWYQxAINSaiDGIEi7VPzynYcXgK1a6z8DaK23aK3Ttda9tda9Mb4Ao7XWRW1sS5pSKtn3ux34IbBNKTUHmAL8WGvtbayPSKK1vk9rneM7B1cBn2qtr8G4gVzma/ZTYHFH2YPxhJjku27AOGftck37wgrdan4HJgPf0EHXs+/6PKCUGuTbNAlY3xHXcriYYikurbVbKXUrxmirBXhRa/1tB9rztVJqIbAe4/F+A+08xVQp9TpwHtDDF1P8LfAi8KIvZa8a+Klv4Kw9OAsjrrnFFxsG+I3Wemk7Hb8umcDLSikLhrOxQGv9nlLKjTFav8r3BP2O1vrRDrCvhnuAN5RS/41xDb3QUYb4vmM3AG8rpbzAMeD6djp8T+Bd398kGnhNa/2BzynrqOv5NuBVnw27gZ+103FbhEwhFwRBMDlmCX0IgiAIDSBCLQiCYHJEqAVBEEyOCLUgCILJEaEWBEEwOSLUgiAIJkeEWhAEweT8P7w6eHJq+dX9AAAAAElFTkSuQmCC\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "result.history.plot(\"angles\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "tequila-chemistry", - "language": "python", - "name": "tequila-chemistry" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.7" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/tutorials/Optimizer_Tutorial.ipynb b/tutorials/Optimizer_Tutorial.ipynb deleted file mode 100644 index ccd8f7bc..00000000 --- a/tutorials/Optimizer_Tutorial.ipynb +++ /dev/null @@ -1,2295 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Optimization" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Hello, and welcome to our tutorial on optimization. Here, we will explore the four different optimizers which already have `Tequila` interfaces: a native GD optimizer, alongside interfaces for `SciPy`, `GPyOpt`, and `Phoenics`." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "### start at the start: import statements!\n", - "import tequila as tq\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Overview\n", - "\n", - "**How to optimize an `Objective`:**\n", - "\n", - " In `tequila`, optimizers are accessed in several ways. They may be instantiated as objects directly, which can then be called; they are also accessible through `tq.minimize`. Either of these methods have an obligatory argument: an `Objective`. `tq.minimize` also requires you supply a `method`, which must be a string; the call methods of the GD, `SciPy`, and `GPyOpt` optimizers accept this key as well.\n", - " \n", - "As keywords to any optimization call, you can pass down the usual compilation kwargs for quantum simulation in `Tequila`:\n", - "* `backend`, a string indicating which quantum simulator to use\n", - "* `samples`, an int indicating how many shots of the circuit to measure (None means full wf simulation)\n", - "* `device`, (generally) a string indicating which (real or emulated) quantum computer to sample from (requires samples be specified),\n", - "* `noise`, the NoiseModel object to apply to the circuits simulated (see the tutorial on noise). \n", - "\n", - "additional keywords you might use include:\n", - "* `variables`, a `list` of the `Variable`s you want to optimize (the default is all of them).\n", - "* `initial_values`, which gives a start point to optimization. If you supply arguments to `variables`, you also need to supply arguments to `initial_values` so that all non-optimized parameters have a value to use. The default is random initialization (not recomended) \n", - "* `gradient`, which specifies which type of gradient will be used : analytical gradients (Default): gradient=None, numerical gradients: gradient={'method':'2-point', \"stepsize\":1.e-4}, custom gradient objectives: gradient={tq.Variable:tq.Objective}, module specific gradients: gradient=\"2-point\" (to use for example `SciPy` finite difference stencils).\n", - "* `silent`, silence outputs\n", - "\n", - "Some of the optimizers take more, or different, keywords from the others, so check the documentation for each one. \n", - "In case the optimizer has some degree of verbosity (currently, they all do), you can deactivate this with `silent=True`. \n", - "\n", - "The following optimization methods are available on your system in `Tequila`:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "available methods for optimizer modules found on your system:\n", - "method | optimizer module\n", - "--------------------------\n", - "NELDER-MEAD | scipy\n", - "COBYLA | scipy\n", - "POWELL | scipy\n", - "SLSQP | scipy\n", - "L-BFGS-B | scipy\n", - "BFGS | scipy\n", - "CG | scipy\n", - "TNC | scipy\n", - "TRUST-KRYLOV | scipy\n", - "NEWTON-CG | scipy\n", - "DOGLEG | scipy\n", - "TRUST-NCG | scipy\n", - "TRUST-EXACT | scipy\n", - "TRUST-CONSTR | scipy\n", - "adam | gd\n", - "adagrad | gd\n", - "adamax | gd\n", - "nadam | gd\n", - "sgd | gd\n", - "momentum | gd\n", - "nesterov | gd\n", - "rmsprop | gd\n", - "rmsprop-nesterov | gd\n", - "Supported optimizer modules: ['scipy', 'phoenics', 'gpyopt', 'gd']\n", - "Installed optimizer modules: ['scipy', 'gd']\n" - ] - } - ], - "source": [ - "tq.optimizers.show_available_optimizers()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We will use two different `Objective`s for optimization in this tutorial. The first of these is a two qubit expectation value with the tractable but non trivial hamiltonian $[Y(0)+Qm(0)]\\otimes X(1)$, where $Qm=\\frac{1}{2} (I - Z)$, the projector onto the |1> state. " - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "We will optimize the following objective: \n", - "\n", - "Objective with 1 unique expectation values\n", - "variables = [a, b, c, d]\n", - "types = not compiled\n", - "\n", - "Expectation Value 0\n", - "Hamiltonian : (+1.0000Y(0)X(1)+0.5000X(1)-0.5000Z(0)X(1),)\n", - "variables : [a, b, c, d]\n", - "circuit:\n", - "\n", - " ┌───┐┌───────────────┐ ┌───────────────┐ \n", - "q_0: ┤ H ├┤ RY(f((a,))_0) ├─■─┤ RX(f((c,))_2) ├─■─\n", - " ├───┤├───────────────┤ │ ├───────────────┤ │ \n", - "q_1: ┤ H ├┤ RZ(f((b,))_1) ├─■─┤ RX(f((d,))_3) ├─■─\n", - " └───┘└───────────────┘ └───────────────┘ \n", - "c: 2/═════════════════════════════════════════════\n", - " \n" - ] - } - ], - "source": [ - "### optimizing the circuit in terms of pi makes the result of the optimization easier to interpret.\n", - "\n", - "a = tq.Variable(name=\"a\")*tq.numpy.pi\n", - "b = tq.Variable(name=\"b\")*tq.numpy.pi\n", - "c = tq.Variable(name=\"c\")*tq.numpy.pi\n", - "d = tq.Variable(name='d')*tq.numpy.pi\n", - "\n", - "U1 = tq.gates.H(target=[0])\n", - "U1 += tq.gates.H(target=1)\n", - "U1 += tq.gates.Ry(target=0, angle=a)\n", - "U1 += tq.gates.Rz(target=1, angle=b)\n", - "U1 += tq.gates.Z(target=1,control=0)\n", - "U1 += tq.gates.Rx(target=0, angle=c)\n", - "U1 += tq.gates.Rx(target=1,angle=d)\n", - "U1 += tq.gates.Z(target=1,control=0)\n", - "\n", - "\n", - "### once we have a circuit, we pick a hamiltonian to optimize over\n", - "H1=(tq.paulis.Y(0)+tq.paulis.Qm(0))*tq.paulis.X(1)\n", - "O1=tq.ExpectationValue(U=U1,H=H1)\n", - "\n", - "### we use the .draw function to pretty-print circuits via backend printers.\n", - "print('We will optimize the following objective: \\n')\n", - "tq.draw(O1,backend='qiskit')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Our second `Objective`, O2, will measure a 3-qubit circuit with respect to the Hamiltonian $Y(0)\\otimes X(1) \\otimes Y(2)$" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "We will optimize the following objective: \n", - "\n", - "Objective with 1 unique expectation values\n", - "variables = [a, b, c, d]\n", - "types = not compiled\n", - "\n", - "Expectation Value 0\n", - "Hamiltonian : (+1.0000Y(0)X(1)Y(2),)\n", - "variables : [a, b, c, d]\n", - "circuit:\n", - "\n", - " ┌──────────┐┌───────────────┐ \n", - "q_0: ┤ RY(pi/2) ├┤ RZ(f((a,))_0) ├──■──────────────────────────■───────\n", - " ├──────────┤├───────────────┤┌─┴─┐ ┌───────────────┐┌─┴─┐ \n", - "q_1: ┤ RY(pi/3) ├┤ RZ(f((b,))_1) ├┤ X ├──■──┤ RY(f((c,))_2) ├┤ X ├──■──\n", - " ├──────────┤└───────────────┘└───┘┌─┴─┐├───────────────┤└───┘┌─┴─┐\n", - "q_2: ┤ RY(pi/4) ├──────────────────────┤ X ├┤ RX(f((d,))_3) ├─────┤ X ├\n", - " └──────────┘ └───┘└───────────────┘ └───┘\n", - "c: 3/══════════════════════════════════════════════════════════════════\n", - " \n" - ] - } - ], - "source": [ - "### this time, don't scale by pi\n", - "\n", - "H2 = tq.paulis.Y(0)*tq.paulis.X(1)*tq.paulis.Y(2)\n", - "U2 = tq.gates.Ry(tq.numpy.pi/2,0) +tq.gates.Ry(tq.numpy.pi/3,1)+tq.gates.Ry(tq.numpy.pi/4,2)\n", - "U2 += tq.gates.Rz('a',0)+tq.gates.Rz('b',1)\n", - "U2 += tq.gates.CNOT(control=0,target=1)+tq.gates.CNOT(control=1,target=2)\n", - "U2 += tq.gates.Ry('c',1) +tq.gates.Rx('d',2)\n", - "U2 += tq.gates.CNOT(control=0,target=1)+tq.gates.CNOT(control=1,target=2)\n", - "O2 = tq.ExpectationValue(H=H2, U=U2)\n", - "\n", - "print('We will optimize the following objective: \\n')\n", - "tq.draw(O2, backend=\"qiskit\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Local Optimizers\n", - "\n", - "We will begin this tutorial by focusing on local optimizers. By local optimization, we mean the any optimization schema where the suggested parameters at step t are always a transformation of the parameters suggested at step t-1. This includes a large number of the standard optimization techniques in use today, like gradient descent. `Tequila` comes with two local optimizers: a native gradient descent optimizer, implementing a number of the most popular gradient descent algorithms used in classical machine learning, as well as a plugin for the `SciPy` package (which is installed alongside `Tequila`), which allows the use of a number of gradient-free, gradient-based, and hessian-based optimization methods.\n", - "\n", - "### The GD Optimizer\n", - "we will start this tutorial by looking at the GD optimizer. Here is an overview over the available optimization methods.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "available methods for optimizer module gd\n", - "method | optimizer module\n", - "--------------------------\n", - "adam | gd\n", - "adagrad | gd\n", - "adamax | gd\n", - "nadam | gd\n", - "sgd | gd\n", - "momentum | gd\n", - "nesterov | gd\n", - "rmsprop | gd\n", - "rmsprop-nesterov | gd\n" - ] - } - ], - "source": [ - "tq.show_available_optimizers(module=\"gd\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As one sees, a variety of methods are available for optimization. Here, 'sgd' refers to the standard gradient descent algorithm, without momentum. like all tequila optimizers, the GD optimizer has a minimize function and most of the arguments are the same. However, there is one important difference: the GD optimizer takes a learning rate, lr. This parameter mediates step size in all of the GD optimizer methods; it is a positive float which scales the step in the direction of the gradient. \n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We will now optimize O1, our two-qubit expectation value, choosing starting angles equivalent to $\\frac{1}{4}\\pi$ for all four variables, and optimizing via the ['Adam'](https://towardsdatascience.com/_adam-latest-trends-in-deep-learning-optimization-6be9a291375c) method." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "init={'a':0.25,'b':0.25,'c':0.25,'d':0.25}\n", - "lr=0.1\n", - "\n", - "### For even more fun, try using sampling with the samples keyword, \n", - "### or pick your favorite backend with the 'backend' keyword!\n", - "\n", - "adam_result=tq.minimize(objective=O1,lr=lr,\n", - " method='adam',\n", - " maxiter=80,\n", - " initial_values=init,\n", - " silent=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The plots below show the trajectory of both the value of the objective and the values of the angles as a function of time." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "best energy: -1.6179942172570136\n", - "optimal angles: a : 0.14749682605178346\n", - "b : 1.0037044962376886\n", - "c : -0.0020942074899867142\n", - "d : -0.498209057390019\n", - "\n" - ] - } - ], - "source": [ - "adam_result.history.plot('energies')\n", - "adam_result.history.plot('angles')\n", - "print('best energy: ',adam_result.energy)\n", - "print('optimal angles: ',adam_result.angles)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**We see that, minus a few hiccups, all the angles converge to optimimum values.**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Let's repeat what we did above, but with a few of the other methods! Here's RMSprop:**" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "RMSprop optimization results:\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "best energy: -1.6180339887498905\n", - "optimal angles: a : 0.14758363531643576\n", - "b : 1.0000000183809166\n", - "c : -1.625339216876925e-08\n", - "d : -0.5000000021961905\n", - "\n" - ] - } - ], - "source": [ - "init={'a':0.25,'b':0.25,'c':0.25,'d':0.25}\n", - "lr=0.01\n", - "rms_result=tq.minimize(objective=O1,lr=lr,\n", - " method='rmsprop',\n", - " maxiter=80,\n", - " initial_values=init,\n", - " silent=True)\n", - "print('RMSprop optimization results:')\n", - "rms_result.history.plot('energies')\n", - "rms_result.history.plot('angles')\n", - "print('best energy: ',rms_result.energy)\n", - "print('optimal angles: ',rms_result.angles)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**... And here's Momentum:**" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "momentum optimization results:\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXwAAAD4CAYAAADvsV2wAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/d3fzzAAAACXBIWXMAAAsTAAALEwEAmpwYAABUHElEQVR4nO2dd5xU1dnHv2fK9jJL2WV3AelNRAQ7VkgARRJjQY0tJlHzBhM0iQkmSoixkPgaQN9Eo9FEjQWCiiJGERSxS0eQJkXZAkvbBbZOOe8fd2aYnbl35t6Z2Trn68fPMvfeOfeZuzu/85znPOc5QkqJQqFQKDo/trY2QKFQKBStgxJ8hUKhSBGU4CsUCkWKoARfoVAoUgQl+AqFQpEiONragGh069ZN9unTp63NUCgUig7D6tWrD0gpu+uda9eC36dPH1atWtXWZigUCkWHQQjxtdE5FdJRKBSKFEEJvkKhUKQISvAVCoUiRVCCr1AoFCmCEnyFQqFIEZTgtxUb5sPs4TDTpf3cML+tLVIoFJ2cdp2W2anYMB+W3Qs1ZZBZAE3HwNuknavZA4t+rv17xJS2s1GhUHRqlIffGmyYrwl6zR5AQv2h42IfwF2vdQgKhULRQijBbw2W3asJeixqylreFoVCkbIowW8NzAp5fs+WtUOhUKQ0SvBbAzNC7syEcTNa3haFQpGyKMFvDcbNAEdm82M2J2R2AQRkd4OL/qwmbBUKRYuiBD+UlkqVHDEFzrjF/0JAfi+49G/wm11w05tQewDSspNzL4VCoTBApWUGCGTSBCZXk50q6cwGBEz/BjLyjh/vdQZkF8KXr8PwyxO/j0KhUBigPPwAepk0yUyVLFsJhUObiz2AzQ5DL4Ht75jL5FEoFIo4UYIfwCiTJhmpklJC+Sroear++aHfAXctfLUs8XspFAqFAUrwAxhl0ghb4jH9+sNQ0Ad6n6V/vs852urbr5bG175CoVCYQAl+gHEzNHEPR3oBeTymH4/oZ3WBW5bDyO/rn7c74dxfwlfvqNo6CoWixVCCH6B0NEgfpOcDAoQ98pp4Y/pSRj+/YT68d78/fJRg56JQKBQGKMEPsPpfmshP/QxmVmvir0c8Mf1/Xgxv/874fEtPGCsUCgVK8DU8jbDueRh8EeQVa8eMYvpWyx801cGez8CRbnxNS04YKxQKhZ/UFvzAQqv7iqDuIHTtf/zcuBlauYNQ4il/ULlemwfoeZrxNcnqXBQKhSIKqSv44SWLAT5/4njcfMQUmPwI5Po9/gyX9trqIqyyldrPUoOUTEhe5xJAba6iUCh0SF3BNxM3HzEFfrEZsrrCkEusiX1AdN+5R1tctfM942sDnUt+L+21Myu+ziVw39COLNkTwKozUSg6LKlbWsFs3FwIKB6phWbMEl6mweeNXaZhxBTt/zfv1OL98ZZzMOrIXv0JvHKLFiYaNyOxzqSlyk8oFIoWJXU9fCtx8+KTYf9mcDeYazuRrJuLH4Lx95m7jx5GHVki6wkCXv0rN3esbCI1GlEompG6gm8lbt7rdCg5BWr3m2s70awbKbXsnngwM9FrRaSbhYgMaI/ZRHqhrYU/hT/1VR2AImVJXcEPxM0Dq2vzexnHzQdfBD9eCq5e5tpONOvm8XO00E48jJuh1dqPhVmRNrM9Y3vMJtKz2+fW9hNWi9sUKUrqCj5A/3HaAqsJD8AdG2PHoWOtmA2QaNZNQR/4+kNz14bT6wxN2NLzMFwxDOZFOmbHIOC8X1mxsHUw06G153CUQtECpLbgNx2DgeO1SdlYvPlrbcWsGUZMgUmzj7+ONnrQ44QxcHh3fKGSNc9oo5affqKtGP7e45GdjyPDfOcTrWPIKQQkLJ2ZvDBJsuLuWV3MXRdvOKqjzA+E2/nGLzqG3YoWIbUFv+AEuPY/0GdM7GudGVqJY0+TubYLh2o/r3ja3OghlIA9uz8y/x4ArxvWPAeDJh4X6mYpn0I7NnC8eXuGXxF5zJkJlz0J4+/XMorqD5OUMEmiKaWh4lZ3kODnjYq0LnwdJfVVz85VT7Wc3cmmo3SqHQghzYYpojUixNPAJUCVlHK4znkBzAUuBuqAH0gp18Rq99RTT5WrVq1K2D5DfD6wmezzNr4MC34It67QsnZi8fmT8Oav4PYvwNXbol1e+HNfGPZd+M6jsa/fMF8LTQQmVs/6OUz4o/61/74c9n4Bt28ER1rstp+7TFs8lpEHNeXN0zpnD9efzM3vpXVyVkmkvfCUUQDh0OyuP6yVn246Bl6DDtuZGX0UFnzGZdoISnojrxF2LURoNfU1tG09O21OSM/VPkests3Y2RJ25/fUHIntS46/tpr+G+s5IACp/T3EajuWbYnaGu1ebdyWEGK1lFJ3pWeyBP884BjwrIHgXwz8DE3wzwDmSinPiNVuiwv+C1dpcflrTXgOB3fAo6M0AR51Q+zrD+2EXStg1I1aLr9VVj6lxfIHjIt+nZ7QRROv7Uvh+cvhe0/AyVfFtqOmHA7tgL7nRZ6b6SK4SrkZQgsnmSH0D1y3LT+xvuRmOovwjjHateE2hj/jWMTqQFqi7XjaMtt26D2Cz9AvwAm3ZSTwUQjvBEMF3GpbQLPOJFbnEOtesWwD83ab/TsK/SQtLfj+m/QB3jAQ/L8Dy6WUL/pfbwUukFJWRmuzxQV/zgitLPKV/4x9rc8HfzoBTroSLvlLy9kUwGxPb9Ur9vng4cHQcBi8nsQ8kkQ9fKsCFe2P30rnY7WjMvqcsTDzHOJtO9QrD4pGHO2YbjtOIU1mW6mKxRFzNMFvrZW2pUDoX2OZ/1hUwW9R3PVQ/Y3xpiTh2Gxwxq1Q0Df2tfXV2u5V/ceanzwMxcqKVqs5/xsXQEO1Fu83anvDfHhnBhythNwe8O0/6ovsuBmRgm1PMz8hbCblM5RAVo2eLTmFcGxf5HG9Sef8nvriKITWGYSLUzQvNho1e463F9qpmh3VRCMQqgnE5ZOJUdv1h9q2rVQlietcWmvSVi+mofuXLoS4RQixSgixav9+kwud4uHgDs2EbgPNv2fs3XDKtbGv2/MZvPwjqPoyPtusrNS1mvO/7N5Iryq07UBnc9TfFx/dazyxFz4hLOxah2h2tBDPH3Loe0In9Y5VRV5rlAqrlzYL/j0QdCY3jRB2oqa+ao02nxzVK9rX0gTszO8Fp/6o+e9L0f5J4jqX1vLwy4DQVUs9gQq9C6WUTwBPgBbSaTGLDmzVfnYbbP49G+ZrKYhHKqKHQspWahNmJafEZ5sVr33cDHj9Z+AJKfsQLec/VtvROhu9zxqoAQTw0SPa8zn8tZYBFYusLv5smjACReSieeF6IQFhh4z82JObgWNWJzdDCQ0vmQlNueu10hTCHvteoTHgREMf0cJgyYj5tyTB53CImPMFnZVEqubq0FqC/zpwmxDiJbRJ25pY8fsWJ783jP5B8xr40dgwv7mwRguzlK2EohMhLTtO2wxCDno9/YgpWvhowzw0Ly5GTD5W24mUhTj1Jq0y6L8mmcsy6HchbHq5+YK20D9wPTEK7ESmFxKQXu2Z/2ZXbFtDO6qZrtjXB9F5xuEdSDRhiir2Br+/eDJvIPZEdzI6PqPJznjaipaNZHWCN9rEacS8R4KdSTI7aCsZWXGQrCydF4ELgG7APuD3gBNASvm4Py3z/4CJaGmZN0kpY87GtvikrRXMTlAGJ3evgEtmR15vBquZN/+cpHnKUz+Nr23Q6v031Phf6PxNxJsaGW53RLrct2H7O/odRFxCZyFDKIDZiVOzk2fxTMQmc6I7jswO022bFaRktmVka7JSQq2mcMa6V7T2omXpJEngW3zSVkp5TYzzEpiajHsljZpybULSZjKOadbzPbgdGo9E3+EqFs08rz1gcxh/gWsPwjcfw7m/jKPtMu0L13hEm8g1wuywMlY4SG8yev2Lxp8tHi88nnin3uRzOFaG1mbai7ft8N9fMkUjmW23pJ2B9pPl+SazrZZoL4kkLS2zJWgxD9/ngweK4bQfw4T7zb3HrIcvJRwp14Q0Iz9xW6v3aLFuo/CQ1wNff6TFzAv6WG/f6HPFsxgnVrpjImmcZrzmeD1baMFFRAY2x7vYSaGIQXtIy2xf1HyjxeKtZOjoeW3hnlkyV9wFiFWh0+6AfufH375h/Xyf9dCIYbqjLUpnEMWGUPSefzLjnS3l5VkNzykULUhq1tI5sF37aSVDJzwFMbckMjbdUvVVNr4CL1wdWa2z8RgsucefYhonydxA3TDd0b/5ilUbQgl//vm94NK/aRO0M6ut1ytqLfTsVmKvaCNS08M/sE372W2QtfdF8wKtpjNaoekYbPsv7N1wvI7Phvnw1nRtsnb9i1qJ53juY2bkYpZ4sj6sxq87olB2VLsVnY7U9PD3b9U2Js/uGn8bW/+redcBEt3lKhqDJ2kx3y9f114HRhOBHPba/fGPJpLtgY6YonnbM6uPp1DqorxdhaK1SU0P/6QrtW0LE6FyA3z8CJx+s1YNM7NAPzc8GavksrtC1wHw0Rz44GF9zzmR0URLeaCGOf9xVtNUKBQJkVqCHz6pak+LX+hOvhqWPwCPnaOlNSKJWMCRrFVyG+Zr1Td9Hu21UZikve0tm8xwkUKhSJjUCekke1J1z2eap91YQ1DkhR0yu5D0cMWye7VtC2PR3vaWVROWCkW7InU8/GRPqi67NzJGLT3ml/ZbwYzn3l49ZzVhqVC0G1LHw0/2pGpLTtKGY+S5h1ZBVJ6zQqGIQep4+FYKkrVFe9EwioUrkVcoFBZIHQ9fb1FQImGQZLcXDRULVygUSSB1PPyAOAZKHJvZCNlMe8kupRDtfkrgFQpFAqSO4IMmmN0HQ8MR6HtuctpTIqxQKDoIqSX4cLw0gUKhUKQYqRPDB23S84sF7W+BkkKhULQCqSX4h3drm4t/Y2JnKIVCoehkpJbgBzz7/Bg15hUKhaITkmKC78+bb28lCBQKhaIVSDHBL9NWp+b2aGtLFAqFotVJPcHPKzG/cblCoVB0IlIrLfNbf4C6A21thUKhULQJqSX4ecXa/wqFQpGCpE5Ix+eDD+fA3i/a2hKFQqFoE1JH8I/tg6W/1zYuUSgUihQkdQRf5eArFIoUJ4UE35+Dn1fatnYoFApFG5FCgh/w8NWiK4VCkZqkluCn5UJGfltbolAoFG1C6gj++Pvgts9BiOChxTsXM37BeEY8M4LxC8azeOfiNjRQoVAoWpbUycN3pLH4wFrmLvkBe2v3kpeWR52nDrfPDUBlbSUzP54JwKR+k9rQUIVCoWgZUsbDX/zaTcz86B4qayuRSGqaaoJiH6DB28DcNXPbyEKFQqFoWVJD8JvqmLv/UxrCBF6PvbV7W8EghUKhaH1SQ/CPlLPXYa5gWo9sVUlToVB0TlJD8GvK6OHxxrwsw57BtFHTWsEghUKhaH2SIvhCiIlCiK1CiK+EENN1zl8ghKgRQqzz/z8jGfc1TU0Z0w5Xk2FPb3bYIRy40l3B11MGT1ETtgqFotOSsOALIezAX4GLgGHANUKIYTqXfiClHOn//95E72uJuoNMqmvkV6N/ETxUnF3MfefcxwdXf8Ca69dQkF7Avrp9rWqWQqFQtCbJSMs8HfhKSrkTQAjxEvBd4MsktJ0czrkdzprKuKYaKuuquKjvRQzuMjh42mlz8vAFD9M3v2/b2ahQKBQtTDIEvxTYE/K6DDhD57qzhBDrgQrgV1LKTXqNCSFuAW4B6N27dxLM82N30i2zG7ePvl339Gk9TkvevRQKhaIdkowYvtA5JsNerwFOkFKeDDwKLDRqTEr5hJTyVCnlqd27d0/cug3z4YESmJnPhkeG07juBcNL3/3mXf688s+J31OhUCjaIckQ/DIgtOZwTzQvPoiU8oiU8pj/328CTiFEtyTcOzob5sOin0NTLQdtNq7NF/x7xe+04zos3rmY5758TpVaUCgUnZJkCP5KYKAQoq8QIg24Gng99AIhRA8htCI2QojT/fc9mIR7R2fZveCuB2BVhpahc1rtMe14GIt3Lub9svcBkMhgqQUl+gqForOQsOBLKT3AbcDbwGZgvpRykxDiJ0KIn/gvuwLY6I/hPwJcLaUMD/skn0BJZGBlZgZZPh/DGpuaHQ8wd81cGr2NzY6pUgsKhaIzkZTiaf4wzZthxx4P+ff/Af+XjHtZIr9ncOOTlRkZjGpo1D6wTk18o5IKqtSCQqHoLHTulbbjZoDNwQG7jZ1pTk5vaABnpnY8DKOSCqrUgkKh6Cx07vLII6YA4Fp2L89V7KNHZiFMnhE8Hsq0UdOY+fFMGrwNwWPtudTCwrXlPPT2Viqq68nPdCIEVNe5KXFlcueEwVx6itrKUaFQNKdzCz6wOCebub1K2Ftro0d2D6blZKNXPCFQUmHumrnsrd2rXTtqWrsstbBwbTl3vfIF9W6tPlB1/fEqoOXV9dz1yhcASvQVCkUzOnVIZ/GH9zNzxfRgDfxYmTeT+k1iyRVLmDJ4CiU5Je1S7AEeentrUOz1qHd7eejtra1okUKh6Ah0asGfu/t1GsKWhZnJvEmzp7HpwCa8vtgVNtuCiur6pFyjUChSi04t+Hu9dfrHY2TeDCoYRIO3gW+OftMSZiVMiSszKdcoFIrUovMKvpT08Ph0T8XKvBlcoBVW23Z4W9LNSgZ3ThiM065X0UIj02njzgmDDc8rFIrUpPMK/qGd/LD6cMRhM5k3/Vz9sAs7Ww+1zzj4paeU8tAVJ1PqykQArkwnBVnO4Pn/uaC/mrBVKBQRdN4sHSnp3+tcspt2kpWWy4H6A6Yzb9Lt6Vwz5BoGdRnU7HhoKmSs9Ecr11qluq6JC4cURrRXXdfE6PuW0uDWH9koFIrURrRGhYN4OfXUU+WqVasSasPr82ITNvylfOImPBUSINNp58HLTooQXivXxsOjy7YzZ9l21s34NrkZzmbnrvvHZ1RU17Psl+cn/JkVCkXHQwixWkp5qt65ThvS8RzZi/T5sNvscQvf4YbDuL1ajrteKmS928sv56+n7/TFjJn1LgvXlke9Nlmpkp/vPsTAwpwIsQeYMLwHOw/Usr3qWFLuBVoHNmbWuxGfU6FQdCw6Z0jH52Xh02fxZLdCrh/0FI+9W2U5tPJx+cfcuvRW/jXxX4wuGm2Y5uj1j5BCFzwZXVteXU/f6YsTCvG4vT5Wf32YK0ZH1gMCmHRSMQO659CvW7bltvUIH62ohV0KRcelc3r4+7fyTrodj3Rw/6I9lFfXIzkuVmY81H6ufsDxTB0zaY4BLz7atVbtCGdTxRHqmryc3reL7vku2Wmc1b8rDntyfrUtPVpRKBStR6cT/Pl3X8WHky/n53OdzHz0EN/f+2iz82bFqiiriLy0vKDg3zlhMJlOe8z3lVfXU15dr7sNWDx2hLNy1yEATu+jL/gA//xoFyf+/q2khGCMRitqYZdC0fHoVCGd+XdfxaCFG0j3aK+7HYHJn+yCs/7KU12nBq8rr65nzKx3o4ZVhBAM7jKYbYc0wQ9cF8i8sQkRDOfoIdH2fow2JR6PaI4/sQhXlpPCvAzd8wvXljPrv1to9K9BiCcEE8gwKo9in1rYpVB0PDqVh1+y5LjYB0j3wIXrd0VcayasMqhgENurt+OTPnbsP8azn+zm8etGs2vWJB6ecnJMj18Cpa5MSg3EMR7RPKFrNlee2svw/ENvbw2KfQAro4lAzD6a2Gc67Wphl0LRAelUHn7BEWvHA0Jo5Ple1PciBhcMxuvzsmLbftZ8U43Lv8Ap3OM38uQrquuZfdVI3TRNq6JZdriOVbsPM25ooW6GTuB+Vo6HY1SYze4f0QjgnkuGxj1hG74+4cIh3Xlvy/4WWa+gUCia06kE/3AedNUR98N5xu+JJoRlR8t4bP1j/P7j3+OUXSgpnUSvLscXbV16SmlQnMbMelfXKy5xZTbrHMqr60l32Czn5C9cW87vX99ETb2borx07rpIX3RLXJmGdpjB6Hn4pOTNn5/LDU9/zuAeuabtDkUv4+ffnx6vV5RoBlBLLnZTKDoDnSqkUzF+BI1hXVijQztuNayyeOdiZn48M1hauUkcpC7vJcPSynqTuqFe/KWnlPLR9LFcdWovstMdfHdkienPFRDKGn/d+31HGg3DUbHsiIXR8yhxZTKsJI+7LhrMz19cF9eEcKyyzhD/ZHZoKCrRTCij9tVaBEVHp1MJ/pT75rHt0hFU52iva9Nh26UjmHLfPF0hzIhSZGzumrnNdr8C8NJkWFr50lNKefCyk4L1bUpdmbpe/OAeuRyqbWL/sUbddvSwkhpp1g4j7pwwmAxn8z+LQIexcG05dy/cFLeomg0rxTOZbWVhnBlCBX7kH5Zw54L1SetMVOehaCs6VUgHNNHnPtgx8SKye/Xi1PueAPRj7pePKjUUwng2NQ8N8RgxvDSfk0rzqa5zU5irn2kTjtW4fLgdVspnhD+n0NDImFnvGnY8ZjqUElcG5dUNJq6zPpltZWFcLFuj7SgWwMrnjtZ2eXU9d/5nPX9YtCkpW1SqsJYiGp1O8APkTpiAe88epJTB0goBIZRS8rflO7j4pGLD9/fI7kFlbaXu8UQ4vW8XFv3sHEvviTcuX1Fdz/ef/JQ7vj2I744096V/d8s+vqw8wtJfnE9mWvMRUaITwpNPLuHx93dGvSbaqCucUHETAmL1a2ZF2kzoCeJbOa3XttsnOVznDraZSBptaCpwMlZFt+Qku+qcWp9OK/iFd9xueE4IwdQLB0R9/7RR07jnw9/jlsdDL06R3iabmt85YTB3vbKB+pAqmGbi8kV5GRyqbeKTHQdNC/7r6yr48KsDTJ84JOJcIhPCUko+3XkIV6aDrDQHlTUNEQKS4bTRp2u2qS99uKdsdhCT7N3CQkM8oC+socJmxkwro4eI56DT1i/nr+eOeessi2qyJ9lDn0N+ppPaJg9u7/ERWCIjnVgdk5WOKplttWbbZuj01TJ99fXYMiMFyeeTvL9tPzkZDk7TWbW6cG05v13yDKLb69gctfjcOciDk3lg/I0J/wL++MaXbKqo4aVbzjL9nni9oR8/s4pt+46y4tcXxrxWSslp9y/j7P5deeSaU3RtCE8vzXDamHXZiJi2vLe1ipv+uZIHvncS3z+jt+41T6zYwQNvbqFbThoHjzVF/ZxGWVF2IfBJabgwrtSVyUfTx0a19exZy6gwEXoy07beMzOLgJi/a6PnYESsqq3hoyafSXko1bEzmsCbwWkT5GQ4qK5zk5/pRAiCnUGoMCaz7UTbiibi4SMwM8RTZTdatcxO6+EDVM74PXVrVtP/jTcizgkBdy/cyKCiHP550+kR5x96eyt11ScjjgzAllGOt743+DLiituGY7cJ1nxTjcfrM13zZs+hurh6+7P7d2Xp5n2UHa6jZ0FW1Gu37jvKgWONnDOwm+55vXmQi4f3iGqT9qXfQnl1A3YhSIuyU1dBVhoCOHCsCYjuQUZLH901a5Ku0DpswnBUFCpOaY5IG0O/1NHWXIRjNjykh9HoweqIIZRwjz+acFrxBcM99PC29OZBYhEa6gp9f/hII5ltJ9qW3igo9HU8v69kaE6ATi34aX37Uj1/Pu7KSpzFzeP1QgguGVHMUx/uoqbOTX5W84VMgS+v9GbjrR0UcTwRBhfl0uTxsftgLQMKY+e0Syl56qNdXBRDXPU4q39XAD7ZcZArT40u+B9uPwDAOQP0BR+aTwiv/vowp/RyGV4bLrpeKbnntU047DbdzzFn6XbdkITeH3y3nHTdTKdAeCm8c8pMs1PX5OX+NzdHhDfC7Wz0aAvMXFlO3fCCkVdtEyIiph/t70WAKY8yVKTj8UDDCZ3ITlQ4QzESUUViJLNuVacW/JxzxlD1Jzj24YcUXHllxPnsdDsen+Tke5dEDElD49X27K0g7XjrBiSlhsyQYk3kt+w9akrwD9Y2UV3nNnUtaGsI5q6Zy97avfTI7sH5o75Hn26xw0eNHh+jTygw/RlHn1AQ9Xy0dFI9wY81KRzq2eoRPq8R2jm98NnX/PbVjew/qnUSoZ6znp0SyEpzsHbG+Ij7aHMqkWGaUCENeLtGshwa/jHjsQfaNiOkgbCBPUa9J0XHIJl1qzpVHn44aQMGIPLy2Hf/A2weOoztY8dRs2gRoH3JHlu+I3hteG71z8b2D55LL3yLtK4fJK2GzIDCHOw2wZbKo6au375P28xkYGFOzGvDF4xV1lbyZdPTVPk+ifneqRcO4OX/OduUTQGeXLGT219aq3vOTFbP4p2LGb9gPCOeGUHuwD+RXrSQ7P6zyBkynez+s3DkraXElRmxsEoTNCjIcppab/DX93ZEHAt0PvGkvYaudbDpRKlCvd1w9Dqmj6aPZdesSYYLBM0QeA6zrxrJbpP1nsxgFyLY9nVn9k7IxlCcNhH8/bkynTijhPtSlWTXrerUHv6RN95A1taCV/PEPBUVVN4zA4CHNmU3y3qB5t7n1aefQKPHx2Pv76TGXUBaxiH+kKQtCtMddr5/em8GmBBwgK+qtI5hYFHs6/UWjDV4G3h45WzG9Pg2rqy0iPcsXFvOn9/eQmV1g+XMgNVfH+atTXt5bV1FxHsL89LZd8Q47BLonIL2Og7jLPiUwAZlIq2ajOJX2FcJv5zfEOGteqWxFx5OtE1pbAYpndE8q9DRQ9/p+quv9dCb3AzFaPRgpt3wCWOrFV71sLKNZyzCJzeTOclrduLUTNvJbEuPwAistA2ydDq14FfNnhMU+wCyoYGq2XOoOP0Xuu+pqK6nyeMjzWHjxrP7cuPZffnT56t4efvLlsohxOKPlw43fe3hOjcFWU56GJREDg3hSIOgQFX9Pkbe+06E4CSyo9XCteUs31oFRE4wfndkCXkZjgjBD/VY9Dqn8N0ohc1Neve3qT0SmTUE5uObRimloJ+JYrUchZlMGQExM4TiEelotoZ2TGZEOpYoG9mpJ3xm29KzNWBvaPtGWTrxCGO0thNpqy1SLa3QqdMyNw8dpu+6CcGPb/w/g4k3TQDSHTZmfe8kvje6J89uepaHVj3EB1d9gCvDFbc94RxtcJPhtOM0kanj9UnsOrGDCC/ZAF+Ti9od04HmXpvRBKSZ9MVoqZEBkTq9bwHlhxt0/9hHPDPCsIMKRUo4tmWW7jkzdoI5sQukdCaar26EWVtjtW1VSMPbUwupOjcpm5bpKC7GU1Ghe9xo6Bzw9ho9Pn67cCPCJijtov3RlteWJ03wV2zbzw1Pf87L/3N2zMlPQFfsQd9LDkf6bGBrImfIdKTbReP+CTz0dlrULBKj46GjCW/XfBy+CXjCvO9Qj/SLshoeDMnT12L2N0UdjUTY73bpHrfihYdXLNUjkNJpFTPebryx2GilLuLBTPmPeGnJthXJoVMLfuEdt1N5zwxkw3FBFBkZFN5xOwNNDJ0DMf23fnE6r333NXrlGm88YpVAXP7yxz6OGtetrmvip8+vYeqFAxijky4ZrbaPQOD1ZCBsjdgcddoxf1y8qhJgrKXVs+GjCVtaNRnF/0EWLULY64KdSWgHUO/2BedFzI5GQpEShLOa7P6zaNw/AXl0VFxeOBwXpGilrM0Sngl1Xs/zyB6wgtzavRRm92BMl+tZ8nlpuxdpRWrRqQU/f/JkgKDoO0pKKLzj9uBxMxNvFdX15KblkpsWXw14PQJD3wDR4ubbq47x8Y6D3HxeP922jGr+FGcXs+SKJYx46jykrbm4CZubzKIlwN1MOa0ns9/Z3uy8kTeqG3O3+RC25p1JAzQT/cBowWg0YhM2pJRB4VxRtkLLMpJETOBeeeYJ/H7s9brPwix6ozsrHnh4x1VZW8m8rfOC5ytrK3mj4RFmTpnJpH6xRwx6nceKshXB19NGTTPVjkIRi04t+KCJfsPGTRyeP58By5YGC6mFE8vTXbBtAQUZBYzrPS5hm7S87+YZQu7MVcxY8wAzNlQ3+5LHSsmcNmoav/vwd3hlSLkDe0aw5o90VOu+L3D8tgsHcvBYE+98uY+9NdGzdKKNJgIEJllDBT/wDI3eL6Vkw40bmh0bv2B8REcmbG4+OvQckJjgxxMmCRVlIQQ+6TO8FrTMqN9++Fvu+uCuCNEObSsvLY86Tx1un5bCqdd5zPx4JkC7E33VUXU8kiL4QoiJwFzADvxDSjkr7Lzwn78YqAN+IKVck4x7m8HZsyeyvh7vwYM4uumvIo3l9T2/+Xl65vZMiuBXVNfjyFtLeve3Ec5qpDcTYWtC2rR7h37Jt1f1ISvNTkm+frihb35fvNJLtjObOnddxBet2GAEUJRVBGhzA/d+dzj3fjd21pDRaCIc4awO/jv0GVqpQBpPeepYhAvUb6eYE6Rwj95sokOgUwj9fQLN2qppqonZTrTOwyrhz8BqW4H3h/8e9Tqquz+8m1mfz6KmsUb3XrE6jGR2IIl0TlbttPI5WrvTTDhLRwhhB7YB3wbKgJXANVLKL0OuuRj4GZrgnwHMlVKeEavtZBRPAzj63nuU/c9POeHFF8g6RT+9D6JnGUxdNpV9tftY8J0FCdtz2pw/U5//EsIWfdVkcXYxRTV/pKbezeu3NS+pHPrFs2HjnrPu4YpBV0S0oRs3l068+y6n7vBI8jOd/OE7J5qKET+z6Rn+d9X/xv6A0obEh81bwGmFY9jTuFrXmwVtNDLz7MjQh56HD8dDVWaI5klHu3c4RrbEg03YYo4OYmHWboj9DBzCQU5ajilR1nu/FULvlUhbxdnFMYUxXrvD2070M0cjPy0/ZttWftcBomXpJEPwzwJmSikn+F/fBSClfDDkmr8Dy6WUL/pfbwUukFJG/RYlS/A9hw/TsHETmSNPxp4bXyz+/k/vZ/HOxXz8/Y8TtuecF8ZR466KeZ1AMC7jWbpmp3H3JcOCx/VEPNofRugff5Y9n8N7xtNYMyp4PlZFvsU7FzNn9Rz21mnedV5aHkebjsb1ZYglMNE+o13Yuf+c++Pyyo0w04GYTR9tTULnPcyGi8yQLFFubTqq3Waw4uRAy6dllgJ7Ql6XoXnxsa4pBSIEXwhxC3ALQO/e+mV0reIoKCDnXGubjoRTmlPKUfdRjjYdTXgC94h7v6nremT3YPYVIyOOG62mnbtmrq4YTuo3KXh8zKx3aaxpPlcRrb6NnnA2eZt48NwHmdRvkuXYtkd6yHRk8sHVH0S9LmBvoO1sZzbj+4yPKvZWbQEt9DB+wfioHqJA6Aq+3mSzlXsnQmi4KBA6qW6sbnaNmXBROB7pCbYTz/vbio5qtxkSCWOGkwzB15sFDf92mLlGOyjlE8AToHn4iZl2nGMffoSwCbLPtlYrJkBxjlZts7K2MmHBNxsLr3XXMuKZERFeXCLx7YojB0kvXI7n6FC89X2PHzfITY/VuYR2JiOeGRHz/mbthOYdFRyvu2MUC40nzg6RE6MRben8qcYaUVlJPw0f9VjtPELFTtH5SHSXvVCSIfhlQGiCek8gfLWTmWtalAOPPorIzIxb8M/veT6fff8zspzRSwybYdqoaRGCYMNOXnouNY015DhzOOo+ypGmI0CkIBVkFHCo4VBEu2b+MIrz8jhS8AnOgk9AuIO580U2/edipXMx25HF8weslwoZ+kzMLECLRujEqJHIGoVRwgkdnRg9D7NtxbN2oS1ozdh3KhGacZcMklEtcyUwUAjRVwiRBlwNvB52zevADULjTKAmVvw+2Th79cJdVhb3+zMcGUkRe9AE4cJeFyL8/+Ep4ETnLXxw9QdsuHEDOWmRKZgBQRrxzAhdsTf7hzHh9CoQXoTNjRCBxVOvMP70ct3rXeku3eN6oj1t1DQy7NE3Zo/3D9hopBF4JmY6GodwGH4e0MIkEmnoUQfSR5dcsSTmPMKkfpNYcsUSZp07K+KZZNgzeOCcB0y1NanfJGaePZPi7GIEAptI7CsbeAYCQX5aPk6bM/abDN5fnF3MrHNn8cWNX7DkiiXcfebdLLliCRtu3MCH13zIH8f8MWi33r3C27pq8FXB60NfJwOjeyXyXquv42nb6oRtzM+SaANSSo8Q4jbgbbS0zKellJuEED/xn38ceBMtQ+crtLTMmxK9r1WcPUs58t//Ij0ehCO+j/3XdX+ld25vJvefrHu+ZtEiqmbPwVNZiaO4uNkir4hrm2rol9+PhZcuZOoLa1i561Bww/VKA686VIjswk5uWm7Myc9wPjr0HEI0FzSj/PYGTwMenycihm0k2uFx92SmmRmNNGKFO/Q86XizbuIZmeg9E6vPIDS0lWi4yGo2i9lJ9lh2h9/LalvR0hcTtbs1UyMTTYtNlE5dPC2U6gULqLz7HvovfYe0nj3jauM7C7/DANcA/nLBXyLO1SxapFvGofiP90aIfqO3kTEvjuHKQVfym9N/w/yVe/j1yxtY+ovzGVCYo62OdRyOaY/V2XswzjgRiIjFT//44h/MXTOXm0+6mTd2vtGmC2riEWmjOHs8YZJ40uNaCrOZOMXZxXHn2Xe0xVMd1e6WIGWLp4Xi9Iu8u6wsbsEvySmh/Jh+6KNq9pxmYg/HSzGHC/7aqrU0ehs5q0Tbheqik3pw3qDu9MjXhv71+8aTXvxKzDz9eGbvzSx+WrxzMbNXz2Zf3T7S7en0d/W33LEkG715DyMEIuqXPtzrTjRm39ok03OO1XZHoaPa3dqkjOBnjhhBv8Vv4OwVfwG0kuwSNh3YpHvOU6nvfeod/6TiExzCweii0QDkZjjJzTge3yy0nc2+SoIrcUEgRKRXHk+IQU84Q0M04d5vo7exXSztNyvSZkc9scIk7cmjj4USO4VZUkbwbVlZpPfvH/vCKJTklFDdWE2duy5iAjdaKeZwJvSZQK/cXmQ7s4PHZr+zlb+v2Emj26dtyNA0KrjphyNvLRlhHn+8k5/hwtktsxvptnRmr55tmKESLce/NTEj0sl4Ju3No1cokkXKCD4Q3M/WaCI1FqU5peSm5XKw/mCE4BfecTsV0+9qtsNWoBRzOMO6DmNY1+MrZ7X9dXfS5NWEtrrejdOm7ddaXeemyHY24084gY8OPZf0Yftj6x7jb+v/FjxnNKeTzMUfySDZIq28ZEUqkFKCX/3yK8iGhrgFf2KfiVzU9yLdc4E2q2bPxlO51zBLZ8uhLRyoP8CZxWfisGmP/6G3twbFPoDbp7dfa2JVIvV49atXTV2XzMUfyUKJtEJhjZQSfGfPUo4tfz/u97+5601Dj9J77Bj5kyc3E3j33kiv+KUtL7Fk9xJWXL0ieMzqrlPJxIznnuzFHwqFom1IKcFP69kT74ED+OrrsWWa390Ioq/0vLjPReyc/B3yxo+n6C5t39iyX/6So4vfBCFwFBdTfu35PJD/IZW1laTb03l799vBzsLKrlPJxihrp71mqCgUivhJxkrbDoOz1J+aWa6fWhmNaDVlGr74Ak9lJRnDhgLaXMGxpcu0i6TEU1GBa86L9PtcW+kbyHxZvFPbZevOCYPJdNqbtR3vHqhW0Vsda2UlqEKh6DikluD31KpBug1SKKMRrabMkbeXgNNJzoUXAv6c/MbGZtelu+H7y49PiAY6C9B2YHrwspModWUigFJXZtRyxckkfOl+SyznVigU7YOUCulkDh/OoFWrsOdkx744DMMFS1lFHH37bbLPPgt7Xh5gnJPf9Ujz16GdSFtuVK0mPxWK1CClPHzhdMYl9qAf+rhws52H/1KDu7yc+vUbgmmfern3AAfzmr9uj5kvCoWi85JSgg9w6NlnOfjU05bfFwh9FGYWAjBhaya3/teH4/BRAHzV1VTeM4OaRYsovON2REbzzqHRCS9ccHxbgGRmvtQsWsT2sePYPHQY28eOC3Y8CoVCEUpKhXQAaj/+BPfevXT90Q8tvzc09LF97Dg8jUebnQ/Uzhn4rjZhG1o5c/NlI1hb8DHCU5/UzJfwom2eigoq75kBxL/ATKFQdE5SSvBrFi2ibuVKfLW1bB87lsI77ohbFGPVzgnk5Dft2cORxW9ydISbuu1L+fDqD8lPz4/7M4RjpWibQqFIbVImpBPwhH21tQB4KiqDIRirPL/5eQ7l6z+68Pi9u7yc/XPmcGDtp/TO7Z00sQ+EcfTq94Bxh6RQKFKXlBH8aJ6wVTLsGTx3ng+czQdIerVzMoYMAcCzZTvDuw23fC89Ap2XkdgDYLOpmL5CoWhGygi+lfLFsRjcZTAfnWin7ky/gAuBo6REd7MTu8uFrbgHXcuOclK3kyzfSw+9zisCrze46CvekYxCoehcpIzgG6VKGh2PxgDXAGzCRrW9EUf37gzd/CUD311mGDP3DujFwP32pHn4UTspuz3iULwjGT1URpBC0XFJGcHXS5U0Kl8ciwxHBifknQBllThP6B3z+u4jz6DomIOTcpNTKsGw8yopAZ/+Hq/JiOk3CyWp0YNC0eFIGcHPnzyZ4j/eq4kiYMvL0w3BmOU7/b9Dxe+up+TBB2Ne2/UHP2Dwys+xWyzYZkT3aT+POBbovJI5kgknmfMgCoWi9elwm5i73W7KyspoiBXDjoKnqgocDhxduiRqYkwkkv11+8l2Zjfb4SoRfI2NeA8eBJtN8+jtduy5udiysvDV1eGtqYHA79XnQ5RXUNK9G10nJZb3v3nosOPthiIEQzd/mVDbCoUiOXSqTczLysrIzc2lT58+CCFiv0GHxowM8EnS+/eL2w5fUxOew4exu/Kxp2cYXtfoaURWS3o35pCZloWje/e47xmgqbwcX1oa6UOGIGyRgzRPdTWeffuQbjdSwtFBgzji89E1wfta2cZRoVC0PzpcSKehoYGuXbvGLfYAwuFEejwJ2eGpq8W7fz9H6qujXlfv0ercO5q8muedIFJKZF09ttw8XbEHcLhcZAweTFqvXji7d6N7r14JjYgCFN5xe+SksNMZ1zyIQqFofTqchw8kJPYAwulAejxIKeNuS7i1DqPe5qEgynX1nnpswoYjMwvPwYNIn89QqE3dVwjSBvQ3nJwNxZ6fjz0/eat6s07VRokiM1OL5TsciKwscsePj/FOhULRHuhwHn4yEGlp2NKc+vFok8gmNz6boN7XqHu+urGabYe2cajhEBJJg8MHUkbUybd8X38nJXTSL3Wv9/nwNTUldM8A+x/9P4TdTv/FbzB085f0fvJJZE0Nh//976S0DyrtU6FoSTq94C9cW86YWe/Sd/pixsx6l4Vry3F06UL6wIEJedqyqRGvw0aDp4FNBzax7dA2qhurAU3sK45V4Pa5tWulZK9XO+cLCa3s3r2b4cPN5+ZLn4/G7dsthYaavvkG9zffmL5ej5pFi9h27nnUvPIKwumkbvVqALLPPIO0IYOp+svspAi0XtpnxZ2/ZvOQoUr8FYok0CFDOmZZuLacu175gnq3F4Dy6nrueuULgIQ3G/G6G2m0HQ+ruH1uKo5pE5pVtVWEZz+lNWnXusvL8VRV4SgqsnQ/T3U1nspKpNeLu7ISKSUOlyvm+2yZmXj2H0DGGQULr8bpq60NVuMEcO/ara3qJfFKndFWEKsqoApF4nR4wb/q759EHLtkRDHXn9WHP7+1JSj2AerdXma+vomL8hs5ku3itoVbm52fd+tZMe956aWX8tXur2hoaOC6W67jyhuuBODU3qdy46038u6Sd8nIyOCRZx+hW2E3Dm75hpumTsfr9TL+nHN49Nln2b9yFR7v8Yljr9fL9OnTWb58OY2NjUydOpVbb72VyspKplx+OTWHDuH1epl7992MGT0ad7nWuThcLu69914WLVpEfX09Z599Nn//+9+DcxO2rCxAIt3xTVLHyr0PD1ElUqkz1uKwZFYBrVm0qFn56sI7blcdiaLT06lDOpU1+t5idb0bX10dsjG+2PbTTz/NvKXzmPfOPJ5/8nmqD1UDUF9Xz/DRw1m0YhGjzxrNy8+9DMADd89i6rXX8uFLL1FcqG2ggvTh3b8/2OZTTz1Ffn4+K1euZOXKlTz55JPs2rWLF154gW+dcQafLVjAZwsWMMJfjA3pw7NvHwC33XYbK1euZOPGjdTX1/PGG28E29UEH2SccfxoNYiSWZ8IzKV3qhXDCkX8dHgPP5pHXuLKpLy6PuJ4qSsDhKAgTZjy6MOZ+/DDvPzKAjw22Fu+l693fo2riwtnmpNvTfwWhdmFDBsxjE/e10YfK9et5z9ztA3Lr7r4Yn77v/8L0Cw1dMmSJWzYsIEFCxYAUFNTw/bt2znttNO4ae5cmhobmTx2LCcHBB+Qbm2O4L333uPPf/4zdXV1HDp0iBNPPJHJfm9V2O3Y0jOQ1dWWPyfEzr1PZl5+wbXXsv+hh2LakyitsYeAGkEo2iOd2sO/c8JgMp3Ns1kynXbunDAE4XDElYu/fPlyli5dxvvP/pvX3nuVIScNodEf1nA4HRTlFJFhz8But+PzanF7o1wg4Tje30opefTRR1m3bh3r1q1j165djB8/nvPOO493/v1vSgoL+fFdd/H8668ff7/TSUNDAz/96U9ZsGABX3zxBTfffHNEzr2jRxH23FzLnxWg+89/Fmm3v4xDMusTAXgPHNAqjwbmN8JSZhNpG1pvDwE1glC0Vzq14F96SikPXnYSpa5MBFDqyuTBy07i0lNK/YLvttxmTU0NrrxcsrOzqak8xobVG4LnBAJXuov99fsRQpCblsuJ3U7kzNNPZ+FSbdvD//z3v/6LbdhDVt1OmDCBxx57DLffa9+2bRu1tbV8/fXXlAwbxg+vnMKNl13Gus2bg+93FBUFxb1bt24cO3YsOEIIxZ6bi0hLs/xZAdJ6n6C1UVAQUQY6vD4RQtBj5sy4PFlfYyM1r75K7vjxDHx/OUO3bKbkz3/S2o5SftosZvYQSNaKYaMRRMWdv05KtpFKXVXES4cP6cTi0lNKdTNybFlZceXhT5w4kb/Nns1pl13GkJNO4qwzz6Jvfl9cGS6klGw9tBWPTxs5BH7O/etfufaaa5j77DNMPPdc8nJzcZaW4AgJs/z4xz9m9+7djBo1Cikl3bt3Z+HChSxfvpyHHnoIhxBkp6fzj/vuQzidOIqKcLhcuICbb76Zk046iT59+nDaaadF2Oyprsa9dy+bv3cZjpISS+GF2k8/ASHo9+ZiHAWRS8wCwn/kzTcp/8UvSR8wwPIzBTj6zlK81dW4plwZ0TaAe18VR5csiXuxnJk9BHy1tWweOizhEEy0kUKi2UZ6exhX3PVb9t3/AN6amqSHj1RoqnPR4Yqnbd68maFDh7aRRRoN27Zjy0gnrffx0siHGg5Reaz5F10IQUlOCWneNDIzMxFC8NwjjzD/9ddZtHSp6ftJKWncvBm7qwBniTUv1FNdjbu8gu17K3FOvU2zKyPDtLf89Q034j12lH6vvBL1OndVFfvnzqXrD35A+sCBlmwE2Hvf/Rx7/336v/2W7vqI6lcXUnnXXZzw/L/JGj3acvuGhd8AkZeHrK0NppeCtWcEzYURiOlMOEpKgpvdWyFaSCqAVdtDCf0cIj8famuDc0WJth3tXqozSR7RiqcpwbeIlJKmr77ClpeHMySXftuhbcGFVqE4bU72bdrHbbfdhpSS/Oxsnnj4YYaefbbpe/oaG2ncvh1nSYnlCp8NW7ci3W6279sXFHwwLzhH3l4C0kfexImW7muWZl/6oiIKf/kL3S+9r66O7eecS+7EiZQ8cL/l+2w//4JgVlMogXCU7uSzyWcU7nWbIs4Ko9E6rlDi6VBMfw67HXw+yyIdqzPB4cCek5OUkUp4Z5Jz/nkce39FUjqXlmw7GbSY4AshugDzgD7AbmCKlPKwznW7gaOAF/AYGRNOSwq+t6YG9969pPfv32zyNF42HdhkeO7Ebicm1La3poamPXtI798fm8Wa+vUbNwJECH5LlDSWUtK0axdpffuaCrvoCUw0D3L3DTdQv1L7e7D6xdpz2884FjaqCtyr4te/Sajss6HXbbc3GzWEYkWQm40eLHxfrYbvzIwewjHr8cfTKVoZTcTsTFqxbSsdV0t0Hi0p+H8GDkkpZwkhpgMFUsrf6Fy3GzhVSnnASvstLfhNe/aQPmAAtgzj8sZmiebhD+oyqNkxKSVIabq0g3vfPjz7D5AxbKjlchCJePh1a9Ziy8kmY9CgqNcFqH75ZSp/dzf9/vsm6X37xrzeSGD0bKtZtIjK393dbD2B2S+tr76ery4ci6OkBK9/xXLol8mKHXpE2yeg5M9/stSphRPX6CHUhBj3irczCcXoOTVr22Yz7PyiYjCasCzCrd12KCEdgMjPxwbBfyezYwq+pwUFfytwgZSyUghRDCyXUkbs49cuBb+2VvNG+/TBnpNj/n01NXgOHyatV69mBcwC9XNCn2cghu9KdwWPSY+Hhq3bcPYowtHVXIX6pq+/RjY1xRUbTySGv+uqqxA2O31efMHUvRp37GDnpEsovv8+XJdfHvN6KxuqJCLKUkpqP/wQR9euZAwbFnFed6SRlkbx/feZ+qJtv3Cs7kRtwLZwL85RXEzT1q34amtjenFRRw8+nynRiCbIiXQm4fcIF81ktR2OcLkSF+E2aDterIbnogl+ommZRVLKSgD/z0KD6ySwRAixWghxS7QGhRC3CCFWCSFW7Q9ZiZpsAmEcK7n4mniW4zt2jMavvsITkmXjSndRklOC0+YENM8+XOwBsNsRQuCzUDXT3rWb5do7ARwuF87SEk0ghMBRXGxK7L1Hj9LwxUayzjzD9L3S+vXD7nJRt2q1OdssbMcYz6reQPrilmEnUvn7mTTu2KF7XbP0UiHAZsNRXEzeJZeY+BRQ+Is7oq5HyJ88mYHvLmPo5i8pvON2Gtatw3fsmKkcfcPP5/MxdPOXDPn0E4ofuP94aqxeGxUVuimcZjKXcDiwu1zac4lSoTWQLbTtzLPYPHQYFdPvahGxB5DV1S0myC3Zdrwka30ImEjLFEIsBXronPqdhfuMkVJWCCEKgXeEEFuklCv0LpRSPgE8AZqHb+EelgjG7U3+cgOeMtK/mMrtblbPBjTRjxD48PsKgUhPt1Qm2Z6T2NaIDpcLZ1GRpZh93apV4PORfcaZpt8jhCBz9Gjq1pgT/O4/u43Ku37bvA2DxVVWd9vSS1+Mlg4ZmgJ6+KV57Lv/fpp27DBMM23mtffoQf73LjUVe62aPScitBG+ytdMKCT0cwdsjxqDD1QfDUnhjBrC8TsHlrx2jwdvwAkyE74JC3W0N8+6vZDMHeVievhSym9JKYfr/P8asM8fysH/s8qgjQr/zyrgVeD0pH2CWGyYD7OHw0yX9nPDfEArOWDPyzO9IMmzb19Q7IOE1LOxgsjQBN9MeWRfUxPeo8eQUTY86dOnDwcOxI6WNe7YQeU9M3DHmJirWbSIil/dCUDFXXdZWtiTNXo07q+/wWNidObopi08s3eJXNQVjtVVvYlsuO66/DK6/+pXfHPLrbqeccRK2spKal5dSOEdtzN085cMfHeZ4QjKcKTi98K3nHkWlb/9XbBtPeE0+tx6zyjyRn5RjiL2jpIS3c8RsdAuHgIjzZISSh58gEGffhI5UokxmjBFyMjEUVKC65qrW6Vt4XIhnM7E2g8h0dXl4SSanvI6cCMwy//ztfALhBDZgE1KedT/7/HAvQne1xwb5sOin4PbX0+nZo/2GmDElGZ59LEw8jzi8Uhs6el4Dx82FU7y1RzBvW8vGUOGaN5eAvgaGqj+z3/IPutMnAZf2gjPuLLS2kIhuw17QQHbzzs/Znw6rW9fut12G11v/jG29PSozQbaCJ1gzJ0wwbqwmhgeH3nrLfbPnm04OkikFo/RSEVrRBrXPDKRCqn3jKwSS2BMjSaitB0tnBg6yrI8B2AxM6al2g60b3rSN6ztlk7xTFTwZwHzhRA/Ar4BrgQQQpQA/5BSXgwUAa/60/QcwAtSyrcSvO9x/jkp8tiJl8LpN8PSPxwX+wDuevjvb2DEFKg9iJx/PYKQFMKbFuveRjidwV/alJ//nLK9e2lsamLqDTcw1e+l5+TkMG3aNN544w0yMzN57bXXKCoqYseOHVx77bV4vV4uuugi/vKXv3B45044ciTYvlF55PJvvubaW3/CMY8bj8fDY489xrnnnhth30MPPcR7770HwAsvvMAAnVBExqBBiLQ06r/YSN7FF+t+zkTErGbRIvaHvD9WGCWtZyndb5satc1QQgVh11VX0bB+veGWkY4ePfQnUk0Mj2M9g0Q6k8I7bo9vMtMfs49F6DOyJMo6IZxomP4ccebsN+u8Kio0zzy0A0sgZ78l2w60H3p9eAcQyNJpi5z9hARfSnkQGKdzvAK42P/vncDJidwnbo6U6x+vPwRA095KHPUNCBO57Y6iomAM//E//pEu+fnUNzZx3nXXcvXUqXTt2pXa2lrOPPNM7r//fn7961/z5JNPcvfddzNt2jSmTZvGNddcw+OPPw6As7AQUVcXbD+0PHJjYyNjxoxh/PjxzP/Pfxh/4QXMeOghvF4vdSHvCSUvL4/PP/+cZ599lttvv71ZieQAwukkY+hQ6r/YoNOCRiJiZqWzaNi2DXdZOTnnnhPXELjLtddS8evfUPvJJ+SMGRNxPuv00znyWvMBp9nhcaywixFmOpN4vfB44rhmRTmeRVrhn6MlVuWGe/zJXJXbkm1Hu1db0/Fr6Rh45ADk99TCOBHHewEgMrvQdOFfyTCR5hmYmPXs28ffnn+eRe++Cw4Heyoq2L59O127diUtLY1L/Jkdo0eP5p133gHgk08+YeHChQB8//vf51e/+hXS42m216xeeeRtW7cyashQ/ucPM/FlZ3PppZcycuRIXfuuueaa4M877rjD8HNknHQS1S+/jPR4dBecWZ0cDcVKZ3H4xRepWfgagz7+KC7Bz504EfGHeymbehuysTHii9rt1lvw1dbS8OUmPJV7LX2RY4Vd9LASa7XqhccbxzUryvHGiKN5sskWzpYUzfYkyC1Np66WybgZ4Azz3p2Z2nEAhwPp9UadEG2Gx8OKlSt5f8MGPl2zhg0bN3LKKacEK1Y6nc7gClO73Y4nSoy+afdu3FXH57j1yiN/+/zzOefU0bz33/9SWlrK9ddfz7PPPqvbXujK1mirXDNHnISje3c8BpO80cohx8JsmqX0ejn6zlJyzj/f8srhAEfffhvcbs17DclACaQFfvPjm8mbMJ6B774bcyI1HFOTn9BsAjJeT1b3XmGTgol6yYGU0PCJ0UTbjnYvK89b0Xp0fA8/GiOmaD+X3Qs1ZZrHP25G8HhoLr6ZbB1fYyM1NTUUFBSQlZXFli1b+PTTT2O+78wzz+Tll1/mqquu4qWXXtLunZEBIamZgfLIY8eOxel08uWqVRTZ7RzYv5/S0lJuuvJKamtrWbNmDTfccEPEPebNm8f06dOZN28eZ51lvKlL3uTJ5H/nO4bnA5O59oICvNXVCcd1wzuLmkWL2DfrT3gPHqTus8+oWbQoLmGomj0nchevkLTARKpSmg67mIyrW7lXS8d1U8mbVUTSuQUfNHEPCH8YwZCGxwMmBF82NTHhwrE8/cYbjBgxgsGDB3PmmbHz1OfMmcN1113Hww8/zKRJk8jPz0ekpTfL0mlWHtnjoWtuLvPmzmXFypXMmToVh8NBrsvFcy/or3ptbGzkjDPOwOfz8eKLLxraEqvGTe2KFeB00v+dJZZWIINBJs348YaZF97Dh+MWZTNzConsYmUm7JKs/GglworWIqWrZfoaG/EcPIija9eYaYGg1aWxZWWT1qunpfvU1dUFyyO/9NJLvPjii7zy3HM0ffMN6f36BfedDb2PXhqXcDrJGBxRucIUoc9t/6P/R/3GL+j9979HXLdz8mTsXbtxwr/+Gdd9Qvn6xh+QOXJk0MNPtGZNKKYzUJJQJM5qkTeFoi2JVlqh83v4UbClp5NmchGJ9PmQbjcizfoE4+rVq4PlkV0uF08//TTC38H4GhsjBD+ZOf9G7dR+9LF275COztfQgKN7ITljxyblPr3/+XSzlMlkbnpuOgMlCV54a4ddFIqWIqUFHyxUrpQSu8sVIc5mOPfcc1m/fn2zY57D1Qi7HXd5OZ6qquAOVtA85z+UZK3g8zbUg8fD1pGnNBMvW0YGvZ9+Kin3ABA2m5a58dD/Rl15G48ot3QGit79lMArOjopL/iNW7Ziz88zXHkaQNjtpPW0FsoxwlNdrZU3MKjL4ygqwl1WFmaALe4CaqHULFpEzTytvERo8S6A3HHj4urQot2r4re/i1qvqKOkBSoUnYGUF3wcdlMlDqTPp9XKiGM/1XCi1eVxuFzYc3Jwo3nI0udrtodtolTNnhNRuE02NFD1l9ns/f1Muk2dStcf/TDh+wTupSv2ca6+jIXywhWK6KS84AuHw5Tge6qq8B4+TPqQIQmLfqwYvWxyI5xO0nr1SqrHDbHj6AefegpHYfekCGes0r4KhaJ16dwLr2Lgqa7GV1+Pr66Ohq1bm9W3D0c2uYO17BPFKBYfOG7LyiR90CBTJR+sEite7j10KGp99mTcK5nlXhUKhXk6veAv3rmY8QvGM+KZEYxfMJ7FO7VSDMH69r7mcXQj0ZfuJtOllGPhKCoCYePr8nJO/d73tINC4Cgq0rKBpNTq5iehcwnHzCpSs2WE47lXssu9KhQK83TqkM7inYuZ+fFMGrxa6l5lbSUzP54JwDj3gKhx9HBkUxO2/Pyk2BXMxtkbCHkIhMOBPT8f7+HDePZVkTagP7Yk1tUOYHYVaTJ22VHpjApF+6LDC/5Nb90UcWxCnwlcPeRq5qyeExT7AA3eBh78/EHGDn+cas8Rpu+Y0+z844NnRLQnvV6k1xsU4EsvvZQ9e/bQ0NDAtGnTuOUWbddGK+WRjx07Rnr//oj0dJylJTQdOsSdv/oVy5cupbGhgal33MFPfvITKisrueqqqzhy5IhheeSVK1cybdo0amtrSU9PZ9myZeTm5ho+M7WKVKFITTp1SGdfnf5uVDWNNTHj6M2QEkf37tiyta0Gn376aVavXs2qVat45JFHOHjwIECwPPL69es577zzePLJJwGC5ZFXrlxJiU76p93l4plFi8jxePng+ef5cN48nvz739m1axcvvPACEyZMYN26daxfvz6iWmZTUxNXXXUVc+fOZf369SxdupRMC7F/FXZRKFKHDu/h/3OicQmAHtk9qKyNDE0UZxfjKCrCVe5t7tEb5LoLhwNnyPFHHnmEV199FYA9e/bEVR45FG9NDUvefJON27bxytva3jBHjh1jy9q1nHbaafzwhz/E7XbrlkfeunUrxcXFnHbaaYBWF98KKuyiUKQOHV7wozFt1LRmMXyADHsG00ZNa1bfXrrdIATO0hL9+L0/bVM4HCxfvpylS5fyySefkJWVxQUXXBBXeeRQPPv2IaXk4bvu4tshm3kEauesWLGCxYsXc/3113PnnXc2q5YZmOBNBBV2UShSg04d0pnUbxIzz55JcXYxAkFxdjEzz57JpH7atogOl4uMwYOxF3RB2GzYDSZlPVVVNG7fDpBQeWQgWB45FOl2862zz+bJefNw+3Pxt+/ezbGaGr7++msKCwu5+eab+dGPfsSaNWuavXfIkCFUVFSwcuVKAI4ePWq6o1EoFKlFp/bwQRP9gMAbYctIx3vY6y+OFpl66WtqQji14xMnTuTxxx9PuDxyKMLp5KbLL+frigrOnjIFCXQrKGD+3/7G8uXLeeihh3A6neTk5ERsgJKWlsa8efP42c9+Rn19PZmZmSxdupQci6WNFQpF5yelyyMH8NbV0bRzJ2m9e2PXiYE3bNuGLSODtN6942pfrzzyayH7rQbXBISmiQqbYYgpHlriuSkUivaHKo8cA1t6Os6ePXVXtkopNc/f4mRoKHrlkUMJn09IZu0chUKhCKAEH60SppG4So9HK5+cwCpbvfLI4ThcLiXwCoWiRenUk7ZW8DU26pZVEELgLCkJ5uArFApFR0V5+H68NTV4qqqw5+Yi7HZAi62rMItCoegsKA/fj82/2tTXoNWKD0ykBksWxyiuplAoFO0dJfh+AuUFZEM9EH2TEoVCoeiIdHrBr1m0iO1jx7F56DC2jx1nWOddOJ0Iux2ff9VsS28kDrB7926GDx+etPYAli9fHizvoFAoFKF06hh+zaJFVN4zA+kX8dD9W8NLCQghEOkZwWtbeiNxhUKhaG06vOB/ff0NEcdyL5pIl+9/n6q/zA4KeADZ0MDe+x8gf/JkPIcPU/7zacfPSR8n/OtfADi6d9c2Gg/FX1wtWeWRQ/F6vUyfPp3ly5fT2NjI1KlTufXWW02VR37rrbe4/fbb6datG6NGjYr3USoUik5Opw7pePbu1T3uM5h4FcKGcGh9oHA6tU3LQ14HVr4muzwywFNPPUV+fj4rV65k5cqVPPnkk6bKIzc0NHDzzTezaNEiPvjgA/YafGaFQqHo8B7+Cc89a3jOUVysv7mHX3QdBQXN3i+9XtxVVdiyc7Dn5pIxZEgwRTOUZJdHBliyZAkbNmxgwYIFgFakbfv27THLI2/ZsoW+ffsycOBAAK677jqeeOIJw2eiUChSl07t4Vvd3MN75Aieqiqadu2kYetWvEePRlwTWh55/fr1nHLKKQmXRwathMOjjz7KunXrWLduHbt27WL8+PGcd955rFixgtLSUq6//vqI4mlAi+x9q1AoOh+dWvDzJ0+m+I/3ah69EDhKSij+4726td891dW4K45vlmKUd98S5ZEBJkyYwGOPPRYsj7xt2zZqa2tNlUfetWsXO3bsAODFF1+MaY9CoUhNOnxIJxZmN/eIlncfurq2JcojA/z4xz9m9+7djBo1Cikl3bt3Z+HChTHLI2dkZPDEE08wadIkunXrxjnnnMPGjRtj2qRQKFIPVR7ZT30UkcxMMFc+Vnnk1kCVR1YoUoNo5ZETCukIIa4UQmwSQviEELo38F83UQixVQjxlRBieiL3bCksbWpukdWrVzNy5EhGjBjB3/72Nx5++OGE21QoFAqrJBrS2QhcBvzd6AIhhB34K/BtoAxYKYR4XUr5ZYL3TiqOoiLdTUj0NjW3ipnyyAqFQtHSJCT4UsrNEDNL5HTgKynlTv+1LwHfBeIW/GRs3B1OZ96EpD2H7RQKRevRGpO2pcCekNdlwBlGFwshbgFuAeits6VgRkYGBw8epGvXri0i+p1B4EORUnLw4EEywtJTFQpF6hFT8IUQS4EeOqd+J6U0M/Oop8qGLqeU8gngCdAmbcPP9+zZk7KyMvbv32/i1grQOsmePXu2tRkKhaKNiSn4UspvJXiPMqBXyOueQOTyV5M4nU769u2boEkKhUKRerTGwquVwEAhRF8hRBpwNfB6K9xXoVAoFCEkmpb5PSFEGXAWsFgI8bb/eIkQ4k0AKaUHuA14G9gMzJdSbkrMbIVCoVBYJdEsnVeBV3WOVwAXh7x+E3gzkXspFAqFIjHa9UpbIcR+4Os4394NOJBEc5JFe7UL2q9t7dUuaL+2tVe7oP3a1l7tAmu2nSCl7K53ol0LfiIIIVYZLS9uS9qrXdB+bWuvdkH7ta292gXt17b2ahckz7ZOXS1ToVAoFMdRgq9QKBQpQmcW/Pa67VN7tQvar23t1S5ov7a1V7ug/drWXu2CJNnWaWP4CoVCoWhOZ/bwFQqFQhGCEnyFQqFIETqd4LenzVaEEE8LIaqEEBtDjnURQrwjhNju/1nQBnb1EkK8J4TY7N/AZlo7si1DCPG5EGK937Y/tBfb/HbYhRBrhRBvtDO7dgshvhBCrBNCrGovtgkhXEKIBUKILf6/t7PaiV2D/c8q8P8RIcTt7cS2O/x/+xuFEC/6vxNJsatTCX7IZisXAcOAa4QQw9rQpH8BE8OOTQeWSSkHAsv8r1sbD/BLKeVQ4Exgqv85tQfbGoGxUsqTgZHARCHEme3ENoBpaCVCArQXuwAulFKODMnXbg+2zQXeklIOAU5Ge3ZtbpeUcqv/WY0ERgN1aFUD2tQ2IUQp8HPgVCnlcMCOVn8sOXZJKTvN/2g1fd4OeX0XcFcb29QH2BjyeitQ7P93MbC1HTy319B2JGtXtgFZwBq0/RPa3Da0Sq/LgLHAG+3p9wnsBrqFHWtT24A8YBf+5JD2YpeOneOBj9qDbRzfP6QLWumbN/z2JcWuTuXho7/ZSmkb2WJEkZSyEsD/s7AtjRFC9AFOAT6jndjmD5usA6qAd6SU7cW2OcCvgZB9MNuFXaDtMbFECLHav4lQe7CtH7Af+Kc/DPYPIUR2O7ArnKuBF/3/blPbpJTlwP8C3wCVQI2Uckmy7Opsgm9ps5VURwiRA7wM3C6lPNLW9gSQUnqlNtTuCZwuhBjexiYhhLgEqJJSrm5rWwwYI6UchRbOnCqEOK+tDULzUEcBj0kpTwFqaduQVwT+ku3fAf7T1rYA+GPz3wX6AiVAthDiumS139kEP6mbrbQQ+4QQxQD+n1VtYYQQwokm9s9LKV9pT7YFkFJWA8vR5kHa2rYxwHeEELuBl4CxQoh/twO7gGCFWqSUVWix6NPbgW1lQJl/hAawAK0DaGu7QrkIWCOl3Od/3da2fQvYJaXcL6V0A68AZyfLrs4m+B1hs5XXgRv9/74RLX7eqgghBPAUsFlK+Zd2Zlt3IYTL/+9MtC/Alra2TUp5l5Syp5SyD9rf1btSyuva2i4AIUS2ECI38G+0mO/GtrZNSrkX2COEGOw/NA74sq3tCuMajodzoO1t+wY4UwiR5f+ejkOb6E6OXW05WdJCkx4XA9uAHWj77ralLS+ixeHcaN7Oj4CuaBN/2/0/u7SBXeeghbo2AOv8/1/cTmwbAaz127YRmOE/3ua2hdh4AccnbdvcLrRY+Xr//5sCf/ftxLaRwCr/73MhUNAe7PLblgUcBPJDjrW5bcAf0JycjcBzQHqy7FKlFRQKhSJF6GwhHYVCoVAYoARfoVAoUgQl+AqFQpEiKMFXKBSKFEEJvkKhUKQISvAVCoUiRVCCr1AoFCnC/wNyFn5Bka9DpQAAAABJRU5ErkJggg==\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "best energy: -1.6178164176706864\n", - "optimal angles: a : 0.153130292696303\n", - "b : 0.9975386964199592\n", - "c : -0.0008949959645234715\n", - "d : -0.5018114831041253\n", - "\n" - ] - } - ], - "source": [ - "init={'a':0.25,'b':0.25,'c':0.25,'d':0.25}\n", - "lr=0.1\n", - "mom_result=tq.minimize(objective=O1,lr=lr,\n", - " method='momentum',\n", - " maxiter=80,\n", - " initial_values=init,\n", - " silent=True)\n", - "\n", - "print('momentum optimization results:')\n", - "mom_result.history.plot('energies')\n", - "mom_result.history.plot('angles')\n", - "print('best energy: ',mom_result.energy)\n", - "print('optimal angles: ',mom_result.angles)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note that when using the [RMSprop](https://towardsdatascience.com/understanding-rmsprop-faster-neural-network-learning-62e116fcf29a) method, we reduced the learning rate from 0.1 to 0.01. Different methods may be more or less sensitive to choices of initial learning rate. Try going back to the previous examples, and choosing different learning rates, or different initial parameters, to gain a feel for how sensitive different methods are." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Accelerated gradient descent to achieve numerical accuracy:**\n", - "\n", - "One issue with gradient descent is that they are slow when it comes to converging to machine precision. Indeed, as one approaches an optimum, the gradient goes to zero, which means that each successive step is smaller and smaller, and convergence slows down. This is not really a problem in machine learning, where convergence to many digits is not needed, but it is an issue in chemistry.\n", - "\n", - "The standard method used to converge quantum chemical calculations is an accelerated form of gradient descent alternatively called Direct Inversion of the Iterative Subspace (DIIS) or Pulay mixing (for its inventor Peter Pulay). Basically, DIIS extrapolates from the error on past function evaluation to where the error is zero using a subspace approach. It is closely related to other subpsace and Krylov methods, such as GMRES.\n", - "\n", - "DIIS works best once we are pretty close to our solution. In this case, we start from a significantly better initial guess, and try to achieve a tolerance of 1e-9 with just standard gradient descent,\n" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Optimizer: \n", - "backend : qulacs\n", - "device : None\n", - "samples : None\n", - "save_history : True\n", - "noise : None\n", - "\n", - "Objective : 1 expectationvalues\n", - "Gradient : 8 expectationvalues\n", - "gradient instr : None\n", - "active variables : 4\n", - "iter. Δ max(d) rms(d)\n", - " 1 -1.61467625 -2.87e-01 1.603e-01 1.169e-01 \n", - " 2 -1.61755894 -2.88e-03 3.376e-02 2.077e-02 \n", - " 3 -1.61770417 -1.45e-04 2.436e-02 1.566e-02 \n", - " 4 -1.61779488 -9.07e-05 2.099e-02 1.332e-02 \n", - " 5 -1.61786059 -6.57e-05 1.788e-02 1.135e-02 \n", - " 6 -1.61790828 -4.77e-05 1.523e-02 9.665e-03 \n", - " 7 -1.61794287 -3.46e-05 1.297e-02 8.230e-03 \n", - " 8 -1.61796795 -2.51e-05 1.104e-02 7.008e-03 \n", - " 9 -1.61798613 -1.82e-05 9.403e-03 5.966e-03 \n", - " 10 -1.61799931 -1.32e-05 8.006e-03 5.079e-03 \n", - " 11 -1.61800886 -9.55e-06 6.815e-03 4.324e-03 \n", - " 12 -1.61801579 -6.92e-06 5.801e-03 3.680e-03 \n", - " 13 -1.61802080 -5.02e-06 4.939e-03 3.133e-03 \n", - " 14 -1.61802443 -3.63e-06 4.203e-03 2.667e-03 \n", - " 15 -1.61802707 -2.63e-06 3.578e-03 2.270e-03 \n", - " 16 -1.61802897 -1.91e-06 3.046e-03 1.932e-03 \n", - " 17 -1.61803036 -1.38e-06 2.592e-03 1.644e-03 \n", - " 18 -1.61803136 -1.00e-06 2.206e-03 1.400e-03 \n", - " 19 -1.61803208 -7.25e-07 1.878e-03 1.191e-03 \n", - " 20 -1.61803261 -5.25e-07 1.598e-03 1.014e-03 \n", - " 21 -1.61803299 -3.81e-07 1.360e-03 8.629e-04 \n", - " 22 -1.61803326 -2.76e-07 1.158e-03 7.345e-04 \n", - " 23 -1.61803346 -2.00e-07 9.851e-04 6.252e-04 \n", - " 24 -1.61803361 -1.45e-07 8.390e-04 5.322e-04 \n", - " 25 -1.61803371 -1.05e-07 7.139e-04 4.528e-04 \n", - " 26 -1.61803379 -7.60e-08 6.078e-04 3.855e-04 \n", - " 27 -1.61803384 -5.50e-08 5.168e-04 3.281e-04 \n", - " 28 -1.61803388 -3.99e-08 4.406e-04 2.792e-04 \n", - " 29 -1.61803391 -2.89e-08 3.747e-04 2.377e-04 \n", - " 30 -1.61803393 -2.09e-08 3.189e-04 2.023e-04 \n", - " 31 -1.61803395 -1.52e-08 2.713e-04 1.721e-04 \n", - " 32 -1.61803396 -1.10e-08 2.313e-04 1.465e-04 \n", - " 33 -1.61803397 -7.94e-09 1.962e-04 1.248e-04 \n", - " 34 -1.61803397 -5.76e-09 1.674e-04 1.062e-04 \n", - " 35 -1.61803398 -4.18e-09 1.428e-04 9.036e-05 \n", - " 36 -1.61803398 -3.02e-09 1.209e-04 7.702e-05 \n", - " 37 -1.61803398 -2.20e-09 1.037e-04 6.542e-05 \n", - " 38 -1.61803398 -1.58e-09 8.750e-05 5.576e-05 \n", - " 39 -1.61803399 -1.15e-09 7.463e-05 4.749e-05 \n", - " 40 -1.61803399 -8.37e-10 6.390e-05 4.041e-05 \n", - " 41 -1.61803399 -6.04e-10 5.436e-05 3.437e-05 \n", - " 42 -1.61803399 -4.39e-10 4.625e-05 2.923e-05 \n", - " 43 -1.61803399 -3.16e-10 3.910e-05 2.491e-05 \n", - " 44 -1.61803399 -2.28e-10 3.314e-05 2.124e-05 \n", - " 45 -1.61803399 -1.69e-10 2.909e-05 1.818e-05 \n", - " 46 -1.61803399 -1.22e-10 2.432e-05 1.527e-05 \n", - "delta f smaller than tolerance 1e-10. Stopping optimization.\n" - ] - } - ], - "source": [ - "init={'a':0.18,'b':0.8,'c':-0.1,'d':-0.4}\n", - "lr=0.1\n", - "no_diis_result=tq.minimize(objective=O1,lr=lr,\n", - " method='sgd',\n", - " tol=1e-10,\n", - " maxiter=80,\n", - " initial_values=init,\n", - " silent=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We run out of iterations. Looking at the printout (obtained with `silent=False`), we see that convergence is achieved after 46 steps. We note that specifically convergence slows down significantly after 5 steps, as the gradients (and thus step sizes) become smaller the closer we get to the minima. This is the problem DIIS solves.\n", - "\n", - "Let's try again with acceleration." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Optimizer: \n", - "backend : qulacs\n", - "device : None\n", - "samples : None\n", - "save_history : True\n", - "noise : None\n", - "\n", - "Objective : 1 expectationvalues\n", - "Gradient : 8 expectationvalues\n", - "gradient instr : None\n", - "active variables : 4\n", - "iter. Δ max(d) rms(d)\n", - " 1 -1.61467625 -2.87e-01 1.603e-01 1.169e-01 \n", - " 2 -1.61755894 -2.88e-03 3.376e-02 2.077e-02 \n", - " 3 -1.61770417 -1.45e-04 2.436e-02 1.566e-02 DIIS\n", - " 4 -1.61783934 -1.35e-04 1.908e-02 1.203e-02 DIIS\n", - " 5 -1.61803383 -1.94e-04 1.855e-03 9.289e-04 DIIS\n", - " 6 -1.61802839 +5.45e-06 1.098e-02 5.504e-03 DIIS\n", - " 7 -1.61803399 -5.60e-06 7.242e-05 3.631e-05 DIIS\n", - " 8 -1.61803399 -2.04e-10 2.974e-05 1.492e-05 DIIS\n", - "delta f smaller than tolerance 1e-10. Stopping optimization.\n" - ] - } - ], - "source": [ - "diis_result=tq.minimize(objective=O1,lr=lr,\n", - " method='sgd',\n", - " diis={'tol':1e-1},\n", - " tol=1e-10,\n", - " maxiter=80,\n", - " initial_values=init,\n", - " silent=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Convergence is obtained in just 8 steps. We can see here that DIIS kicks in at step 3, that is, when max(gradient) is below 1e-1 (the `tol=` argument in the DIIS dictionary) and we have accumulated at least 3 vectors. Once DIIS starts, convergence is very rapid, with a four orders of magnitude drop in the error in only three steps.\n", - "\n", - "We can see this most clearly in a log plot of the error," - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "SGD + DIIS optimization results:\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "print('SGD + DIIS optimization results:')\n", - "Emin = diis_result.history.energies[-1]\n", - "plt.semilogy(no_diis_result.history.energies[:-1] - Emin)\n", - "plt.semilogy(diis_result.history.energies[:-1] - Emin)\n", - "plt.ylabel('Error on energy')\n", - "plt.legend(['without DIIS', 'with DIIS'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We clearly see here that when DIIS kicks in, convergence rapidly accelerates. In comparison, the convergence rate of standard gradient descent actually gets slower the closer we are to a solution. However, it should be noted that DIIS is not entirely stable and only really works close to an optima. Furthermore, the implementation here is somewhat experimental. Use at your own risk!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**The GD optimizer, with the Quantum Natural Gradient:**\n", - "\n", - "The Quantum Natural Gradient, or QNG, is a novel method of calculating gradients for quantum systems, inspired by the natural gradient sometimes employed in classical machine learning. The usual gradient we employ is with respect to a euclidean manifold, but this is not the only geometry -- nor even, the optimal geometry -- of quantum space. The QNG is, in essence, a method of taking gradients with respect to (an approximation to) the Fubini-Study metric. For information on how (and why) the QNG is used, see [Stokes et.al](https://arxiv.org/abs/1909.02108). \n", - "\n", - "Using the qng in Tequila is as simple as passing in the keyword gradient='qng' to optimizers which support it, such as the GD optimizer. We will use it to optimize O2, our 3 qubit `Objective`, and then compare the results to optimizing the same circuit with the regular gradient." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "### the keyword stop_count, below, stops optimization if no improvement occurs after 50 epochs.\n", - "### let's use a random initial starting point:\n", - "init={k:np.random.uniform(-2,2) for k in ['a','b','c','d']}\n", - "\n", - "lr=0.01\n", - "qng_result = tq.minimize(objective=O2,\n", - " gradient='qng',\n", - " method='sgd', maxiter=200,lr=lr,\n", - " initial_values=init, silent=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "best energy with qng: -0.3094659562236847\n", - "optimal angles with qng: a : -1.949589374320652\n", - "b : -2.5183083763768193\n", - "c : 1.1753365433636513\n", - "d : 1.2325405724983405\n", - "\n" - ] - } - ], - "source": [ - "qng_result.history.plot('energies')\n", - "qng_result.history.plot('angles')\n", - "print('best energy with qng: ',qng_result.energy)\n", - "print('optimal angles with qng: ',qng_result.angles)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To gain appreciation for why one might use the QNG, let's optimize the same circuit with the same learning rate and the same method, but without QNG." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "plotting what happens without QNG\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXwAAAD4CAYAAADvsV2wAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAei0lEQVR4nO3dfZhVdd3v8feXYRQE4lkYBAOP3kgqIswQang6WQyJCGWKmJWVYqeoQa8wDTKO10UZnnOLdnfLQ+GtnRI8hgjirUjGqU5YMxiIj/EQXgwMiiijwgwww/f8sdfgHmbvmdkPs5/W53Vdw9577bXX+u21N5/fb/3W2r9l7o6IiBS+TtkugIiIZIYCX0QkJBT4IiIhocAXEQkJBb6ISEh0znYBWtOvXz8fOnRotoshIpI3Nm3a9I6794/1XE4H/tChQ6mqqsp2MURE8oaZvRnvOXXpiIiEhAJfRCQkFPgiIiGhwBcRCQkFvohISOT0WTrJWLtzLT/960+pPVrb4jnDcJySbiVUjK5g0lmTslBCEZHssFweLbO0tNQTOS1z7c61zP3zXBq8IaH1NFUE6aKKRUSyxcw2uXtpzOcKKfAnPD6BmkM1HVii3KVKRkQgRIE/8uGRaW2pS0tt7Q2p4hHJrtAEfphb+IUm3d1svU7txR1j71AFJAUvNIGfbB++hFe6K5Z0rEd7SZKK0AQ+tH6Wjkihy8UKLJr2tDpeqAK/NWt3ruX+F+9v0e2Tqf8kIpKYXK/AEll2pvbYFPgZFl2xdLJOHPfj2S6SiOSZZPeGWgv8gvvhVS6YdNakrOyyZqI7S3tDIplx8MhBfvT/fgSQtjxRC1/SKl63WaJUsYhElHQrYd2X1rV7frXwJWOytXfTmvYMt9HRVIFJsvYd2pe2ZSnwpeDlYiXUmlT2klSBFZ6B3QambVkKfJEck28VVHslc4wp7BVYcadiKkZXpG15CnwRyYhCrcjakuxZex3xmwUFvohIB8qlik4XQBERCQkFvohISCjwRURCQoEvIhISCnwRkZBQ4IuIhIQCX0QkJNIS+GY20czeMLPtZnZHjOdvNLP9ZrY5+LspHesVEZH2S/mHV2ZWBPwC+BxQDVSa2Wp3f/WkWVe4+8xU1yciIslJRwt/LLDd3Xe6+1FgOTAlDcsVEZE0SkfgnwHsjnpcHUw72dVm9pKZPW5mQ+ItzMxmmFmVmVXt378/DcUTERHI3EHbNcBQdx8JPAc8HG9Gd1/i7qXuXtq/f/8MFU9EpPClI/D3ANEt9sHBtBPc/YC7Hwke/hIYk4b1iohIAtIR+JXAOWY2zMxOAa4DVkfPYGYlUQ+vAl5Lw3pFRCQBKZ+l4+4NZjYTeBYoApa5+ytmdjdQ5e6rge+Z2VVAA/AucGOq6xURkcToIuYiIgWktYuY65e2IiIhocAXEQkJBb6ISEgo8EVEQkKBLyISEgp8EZGQUOCLiISEAl9EJCQU+CIiIaHAFxEJCQW+iEhIKPBFREJCgS8iEhIKfBGRkFDgi4iEhAJfRCQkUr7ilYiIxFe7Zg1v37eQhr17oagIGhvBDNq4+FRRr14MmPNDek6enLayKPBFRJJQu2YNNfN/gh882P4XNTZGbttxpcHGgwep+eEcgLSFvgJfRCTQrDXejlZ4R/Njx3j7voUKfBGRRLTaIo8V7jlyve+Gmpq0LUuBLyJ5K20t8hwJ91g6l5Skb1lpW5KISBoke5Azl0M7WVZczOm3zkrb8hT4IpIxCbfIEzjImVd0lo6I5KukzlgptBCPJwj3zoMGcfqts9Ia4IlS4ItIXHFb5E33c+BMlmzqiFZ4R1Lgi4RUwt0r0c833S+UsG96/8Exg1xojXeEtAS+mU0E7geKgF+6+z0nPX8q8AgwBjgATHP3XelYt4g0p+6V+PKtRZ5uKQe+mRUBvwA+B1QDlWa22t1fjZrtm8B77n62mV0H/AyYluq6RcIk134UlFHx3m8O9Y/ng3S08McC2919J4CZLQemANGBPwWYF9x/HPg3MzP3MH1jReJLqXul0CjEO0w6Av8MYHfU42rgk/HmcfcGM6sF+gLvnLwwM5sBzAA488wz01A8kexSmEdRmGdVzh20dfclwBKA0tLSAv7mSyFIuL+8UMI8xlk6Ye8fzwfpCPw9wJCox4ODabHmqTazzkBPIgdvRXJWUgc/C41a5AUlHYFfCZxjZsOIBPt1wPUnzbMa+BqwEfgS8Lz67yVbkv7pfqFRmIdOyoEf9MnPBJ4lclrmMnd/xczuBqrcfTXwK+DXZrYdeJdIpSCSVh09PnleUIhLK9LSh+/uTwNPnzTtrqj79cA16ViXhFeoT0sEhbmkLOcO2ko4tWidt/XT/UILe4W5ZIACXzpcSr/8LJBg1xkskgsU+JISncmiMJf8ocCXmEI3SmKc96Mwl0KiwA+h0I+SqP7ynHPs2DGqq6upr6/PdlHyRpcuXRg8eDDFxcXtfo0Cv8CE/Wf8apHnp+rqanr06MHQoUMxs2wXJ+e5OwcOHKC6upphw4a1+3UK/DzSan95rHDP5zCP1XWklnnBqq+vV9gnwMzo27cv+/fvT+h1CvwcktJ55vkc7gG1zsNNYZ+YZLaXAj9D1NWiMJdw2LVrF1deeSUvv/xytovSggI/DcLe1aIwl0xb9fc93PvsG+w9WMegXl2ZXT6cqRedke1i5TwFfhtSPs88X8Nd/eWSo1b9fQ93rtxK3bHIOEh7DtZx58qtACmF/tSpU9m9ezf19fVUVFQwY8YMALp3705FRQVPPfUUXbt25cknn2TAgAHs2LGDL3/5yxw6dIgpU6awcOFCPvzww2bLbGxs5I477mDDhg0cOXKE73znO9xyyy3U1NQwbdo03n//fRoaGnjwwQcZP358s9fefffdrFmzhrq6Oi655BIWL16ccrdXaAM/1CMmKswlx01bvLHFtCtHlvCVi4ey4JnXT4R9k7pjjcxb8wpTLzqDdw8d5b//703Nnl9xy8VtrnPZsmX06dOHuro6ysrKuPrqq+nbty+HDh1i3LhxzJ8/n9tvv52lS5cyd+5cKioqqKioYPr06SxatCjmMn/1q1/Rs2dPKisrOXLkCJdeeikTJkxg5cqVlJeXM2fOHBobGzl8+HCL186cOZO77ooMSfaVr3yFp556iskp/l8t6MBvd+u8EEZMbKqsgspLYS6FqqY29rn6Bw8fS2m5DzzwAE888QQAu3fvZtu2bfTt25dTTjmFK6+8EoAxY8bw3HPPAbBx40ZWrVoFwPXXX8/3v//9Fstct24dL730Eo8//jgAtbW1bNu2jbKyMr7xjW9w7Ngxpk6dyqhRo1q89g9/+AMLFizg8OHDvPvuu5x33nkK/JMV+k/91V8uYdBai3xQr67sOVjXYvoZvboC0KfbKe1q0UfbsGED69evZ+PGjZx22ml8+tOfPvEjsOLi4hNdKUVFRTQ0NLR7ue7Oz3/+c8rLy1s898c//pG1a9dy4403ctttt/HVr371xHP19fV8+9vfpqqqiiFDhjBv3ry0/CitU8pLyCG1a9aw984f5m/YB1+qzoMGMejeBYx4/bUWf//ywkaFvYTa7PLhdC0uajata3ERs8uHJ73M2tpaevfuzWmnncbrr7/OCy+80OZrxo0bx+9+9zsAli9fHnOe8vJyHnzwQY4di+x9/OMf/+DQoUO8+eabDBgwgJtvvpmbbrqJF198sdnrmsK9X79+fPjhhyf2EFJVUC38t+9bCAnUvhmhrhaRtGo6MJvOs3QmTpzIokWLGDFiBMOHD2fcuHFtvmbhwoXccMMNzJ8/n4kTJ9KzZ88W89x0003s2rWL0aNH4+7079+fVatWsWHDBu69916Ki4vp3r07jzzySLPX9erVi5tvvpnzzz+fgQMHUlZWlvR7i2a5fKXB0tJSr6qqavf8r434RNb64dXVIpK81157jREjRmS7GAk5fPgwXbt2xcxYvnw5jz76KE8++WRGyxBru5nZJncvjTV/QbXwO5eURM66SZZGTBSRdtq0aRMzZ87E3enVqxfLli3LdpHaVFCBf/qts9h75w/b162jUxNFJAXjx49ny5Yt2S5GQgoq8JtCO/osHbXORUQiCirwIRL6CncRkZYK6rRMERGJT4EvIhISCnwRkTTatWsX559/fsrLGTp0KO+8804aSvQRBb6I5J+XHoP7zod5vSK3Lz2W7RLlBQW+iOSXlx6DNd+D2t2AR27XfC/l0J86dSpjxozhvPPOY8mSJSemd+/enTlz5nDhhRcybtw43nrrLQB27NjBuHHjuOCCC5g7dy7du3dvsczGxkZmz55NWVkZI0eOZPHixQDU1NRw2WWXMWrUKM4//3z+9Kc/xSzTggULuOCCCxg7dizbt29P6f1BioFvZn3M7Dkz2xbc9o4zX6OZbQ7+VqeyThEJgYcmtfz729LIc+v/Bxw7afC0Y3Xwnz+I3D90oOVr22HZsmVs2rSJqqoqHnjgAQ4cOBBZXDA88pYtW7jssstYujRSjqbhkbdu3crgwYNjLjN6eOTKykqWLl3KP//5T377299SXl7O5s2b2bJlS8zRMgF69uzJ1q1bmTlzJrNmzWrX+2hNqi38O4Dfu/s5wO+Dx7HUufuo4O+qFNcpImH2/p7Y0+veTWmxDzzwwIlWfNPwyECL4ZF37doFRIZHvuaaa4DI8MixrFu3jkceeYRRo0bxyU9+kgMHDpwYHvmhhx5i3rx5bN26lR49esR8/fTp00/cbtzY8hoBiUr1PPwpwKeD+w8DG4AfpLhMEQm7r6+N/1zPwUF3zsnTh0Ruu/Vt/fUx5NrwyE2ir3CVjou8p9rCH+DuNcH9fcCAOPN1MbMqM3vBzKa2tkAzmxHMW7V///4UiyciBefyu6C4a/NpxV0j05OUa8MjN1mxYsWJ24svTmyM/1jabOGb2XpgYIyn5kQ/cHc3s3hDVX7c3feY2VnA82a21d13xJrR3ZcASyAyWmZb5RORkBl5beT293dDbXWkxX/5XR9NT0KuDY/c5L333mPkyJGceuqpPProo0m/vyYpDY9sZm8An3b3GjMrATa4e6tXITCz/wCecvc2R/RPdHhkEclPGh45OZkeHnk18DXgnuC2xbsNztw57O5HzKwfcCmwIMX1iohkVRiHR74HeMzMvgm8CVwLYGalwLfc/SZgBLDYzI4TOWZwj7u/muJ6RUSyKnTDI7v7AeDyGNOrgJuC+38BLkhlPSIikjr90lZEJCQU+CIiIaHAFxEJCQW+iEgapWt45I6gwBeRvLN251omPD6BkQ+PZMLjE1i7M7GhFMJKgS8ieWXtzrXM+8s8ag7V4Dg1h2qY95d5KYd+rg2PXFlZySWXXMKFF17I2LFj+eCDD1J6f1CAFzEXkfz39We+3mJa+dByrjv3OhZuWkh9Y32z5+ob6/np337KpLMm8V79e9y24bZmzz808aE217ls2TL69OlDXV0dZWVlXH311fTt2/fE8Mjz58/n9ttvZ+nSpcydO/fE8MjTp09n0aJFMZcZPTzykSNHuPTSS5kwYQIrV66kvLycOXPm0NjYyOHDh5u97ujRo0ybNo0VK1ZQVlbG+++/T9euXWOuIxFq4YtIXnnr8Fsxp9ceqU1pubk0PPIbb7xBSUkJZWVlAHzsYx+jc+fU2+dq4YtIzmmtRT6w20BqDtW0mF7SrQSA3l16t6tFHy1Xh0dON7XwRSSvVIyuoEtRl2bTuhR1oWJ0RdLLzLXhkYcPH05NTQ2VlZUAfPDBBwlVNPGohS8ieWXSWZFLFt7/4v3sO7SPgd0GUjG64sT0ZOTa8MinnHIKK1as4Lvf/S51dXV07dqV9evXxzwwnIiUhkfuaBoeWSQcNDxycjI9PLKISCiFcXhkEZFQysfhkXXQVkQkJBT4IiIhocAXEQkJBb6ISEgo8EVE0qgjhkfesGHDieEdUqHAF5G8U7tmDds+czmvjfgE2z5zObVr1mS7SHlBgS8ieaV2zRpqfnQXDXv3gjsNe/dS86O7Ug79XBse+ZlnnuHcc89l9OjRrFy5MqX31kTn4YtIznnzKy0HEuvx+Yn0uf563v7X+/D65sMje309++b/hJ6TJ9Pw3nvs+V7zcXU+/uvmQxfEkkvDI9fX13PzzTfz/PPPc/bZZzNt2rQ2y98eauGLSF5p2Lcv5vTjBw+mtNxcGh759ddfZ9iwYZxzzjmYGTfccENK762JWvgiknNaa5F3LimJdOecPH3QoMht797tatFH0/DIIiI56PRbZ2Fdmg+PbF26cPqts5JeZq4Nj3zuueeya9cuduzYAcCjjz6a9HuLpha+iOSVnpMnA/D2fQtpqKmhc0kJp98668T0ZOTa8MhdunRhyZIlTJo0idNOO43x48en5Zq2KQ2PbGbXAPOAEcBYd485lrGZTQTuB4qAX7r7Pe1ZvoZHFgkHDY+cnEwPj/wy8EVgcbwZzKwI+AXwOaAaqDSz1e7+aorrFhHJmtANj+zurwEnDmjEMRbY7u47g3mXA1MABb6I5C0NjxzbGcDuqMfVwbSYzGyGmVWZWdX+/fs7vHAiImHRZuCb2XozeznG35SOKJC7L3H3Uncv7d+/f0esQkRyUC5fbjUXJbO92uzScffPJlWaj+wBhkQ9HhxMExEBImelHDhwgL59+7bVRSxEwv7AgQN0Oen01LZk4rTMSuAcMxtGJOivA2L/LE1EQmnw4MFUV1ejbtz269KlC4MHD07oNSkFvpl9Afg50B9Ya2ab3b3czAYROf3yCndvMLOZwLNETstc5u6vpLJeESksxcXFDBs2LNvFKHipnqXzBPBEjOl7gSuiHj8NPJ3KukREJDUaWkFEJCQU+CIiIaHAFxEJCQW+iEhIKPBFREJCgS8iEhIKfBGRkFDgi4iEhAJfRCQkFPgiIiGhwBcRCQkFvohISCjwRURCQoEvIhISCnwRkZBQ4IuIhIQCX0QkJBT4IiIhocAXEQkJBb6ISEgo8EVEQkKBLyISEgp8EZGQUOCLiISEAl9EJCQU+CIiIZFS4JvZNWb2ipkdN7PSVubbZWZbzWyzmVWlsk4REUlO5xRf/zLwRWBxO+b9b+7+TorrExGRJKUU+O7+GoCZpac0IiLSYTLVh+/AOjPbZGYzWpvRzGaYWZWZVe3fvz9DxRMRKXxttvDNbD0wMMZTc9z9yXau51PuvsfMTgeeM7PX3f2PsWZ09yXAEoDS0lJv5/JFRKQNbQa+u3821ZW4+57g9m0zewIYC8QMfBER6Rgd3qVjZt3MrEfTfWACkYO9IiKSQamelvkFM6sGLgbWmtmzwfRBZvZ0MNsA4M9mtgX4G7DW3Z9JZb0iIpK4VM/SeQJ4Isb0vcAVwf2dwIWprEdERFKnX9qKiISEAl9EJCQU+CIiIaHAFxEJCQW+iEhIKPBFREJCgS8iEhIKfBGRkFDgi4iERKoXQMk5lasXc/aLd9PLPwQi4zI3jdYfff84RiecPd6P/9l4LasaP4UF87Sm92nF/HjyeUy96IwOKb+ISEcx99wdgbi0tNSrqtp/RcTK1YsZuelOTrXGhNbTtAmO89EuT7yKItH7TRVLI50o4jh7vB8LGq5l9fFPtSiHKhMRSZWZbXL3mJecLajA3zfvbAaS+xdNid7kHVmxNO25nNGrK7PLh6siEQmB0AT+8R/3pJOutnhCR1Qs79Gdece+yqaPfU6ViEgOai3wC6oP/23rnxct/EyJvtRwdD2Yyv0+fMj9xf+O1/07tgp8VXr2TN6y/uwePZuyq25p35sTkYQVVODvHj2b3kn04UtizNJXgRQFh8kHsp8Bm27HN90OfFQRJHxcJSibAXTtA5//GYy8NoF3J1K4CqpLB9p/lg40bwFLYWr6ere1hxGzYgn+MRx6DoHL71LlITkvNH34CXnpMfj93VC7G6wIvBHaODHTgz9rI0RiBQqogsl3SR8TUcUhGaTAzwXRFUyMiiWZykQVS35qa69DlYakQoEfJlEVy3GCnPD0naWjyiQ3xNvbUBeVKPAlPYLKxIPKpFOSeyM6lpIbEuqiUmWRNxT4krMqVy9myIv3crrvx/moVZr0WTpobyQTEvp1us6cyigFvoTCqr/vYd7qVzhYd4yrOv2ZH3d+hD7WvjGV4gUXqOJIt0SOYRy3yOdj2qtoNwW+SAJW/X0P9z77BnsO1jGl05+Z3fkxBtk7zfZAku3GUuWRvGQPdh8t7sWpk+8NTWWhwBfJguiKo8iMSfandu116HhH+iXze4yD1oPto3+Ud7/+VuCL5KlE9zbURZVeiexV5Mo4Uwp8kRBLVxcVqLJoSzJ7EumuKDos8M3sXmAycBTYAXzd3Q/GmG8icD9QBPzS3e9pz/IV+CLZFa+yOB4Mw53oWVSqMGKLVVEk26XUkYE/AXje3RvM7GcA7v6Dk+YpAv4BfA6oBiqB6e7+alvLV+CL5LdkzpzSwe6PHPXObBnzk4RCPyNdOmb2BeBL7v7lk6ZfDMxz9/Lg8Z0A7v7TtpapwBcJr6a9izHvP5fSwe58ryz20Z+B87a3e/5MjYf/DWBFjOlnALujHlcDn4y3EDObAcwAOPPMM9NYPBHJJ1MvOiPoz/4M8FH7sD3Dbj+ZYGURq289VyqK0/2dtC2rzcA3s/XAwBhPzXH3J4N55gANwG9SLZC7LwGWQKSFn+ryRCR8Eq0sik66be8w65nYk3jb+sUM4GS0Gfju/tnWnjezG4Ergcs9dv/QHmBI1OPBwTQRkZxUdtUtENVv3uZexUuPcWTN9znlWG2rgxUmuidx1Duze8zszAV+a4Kzb24H/qu7H44zWyVwjpkNIxL01wHXp7JeEZGcMvJaTo36JW979yRaqygOWg+2j0nvD79S7cP/N+BU4DmLVFMvuPu3zGwQkdMvrwjO4JkJPEvkfS5z91dSXK+ISP5rpaLoDZSleXUpBb67nx1n+l7giqjHTwNPp7IuERFJTae2ZxERkUKgwBcRCQkFvohISCjwRURCIqdHyzSz/cCbSb68H5C+n6ilj8qVuFwtm8qVGJUrccmU7ePu3j/WEzkd+Kkws6p440lkk8qVuFwtm8qVGJUrcekum7p0RERCQoEvIhIShRz4S7JdgDhUrsTlatlUrsSoXIlLa9kKtg9fRESaK+QWvoiIRFHgi4iERMEFvplNNLM3zGy7md2RxXIMMbM/mNmrZvaKmVUE0+eZ2R4z2xz8XdHWsjqofLvMbGtQhqpgWh8ze87MtgW3vTNcpuFR22Wzmb1vZrOysc3MbJmZvW1mL0dNi7l9LOKB4Dv3kpmNzkLZ7jWz14P1P2FmvYLpQ82sLmrbLcpwueJ+dmZ2Z7DN3jCz8gyXa0VUmXaZ2eZgeia3V7yM6LjvmbsXzB+R4Zd3AGcBpwBbgE9kqSwlwOjgfg8iF3L/BDAP+H4ObKtdQL+Tpi0A7gju3wH8LMuf5T7g49nYZsBlwGjg5ba2D5GRYf+TyOi244C/ZqFsE4DOwf2fRZVtaPR8WShXzM8u+L+whcjw6sOC/7dFmSrXSc//L+CuLGyveBnRYd+zQmvhjwW2u/tOdz8KLAemZKMg7l7j7i8G9z8AXiNyfd9cNgV4OLj/MDA1i2W5HNjh7sn+0jol7v5H4N2TJsfbPlOARzziBaCXmZVksmzuvs7dG4KHLxC5slxGxdlm8UwBlrv7EXf/J7CdyP/fjJbLIhfyuBZ4tCPW3ZpWMqLDvmeFFvixLpie9ZA1s6HARcBfg0kzg12yZZnuNoniwDoz22SRC8cDDHD3muD+PmBAdooGRK6MFv2fMBe2Wbztk2vfu28QaQk2GWZmfzez/2tm47NQnlifXa5ss/HAW+6+LWpaxrfXSRnRYd+zQgv8nGNm3YHfAbPc/X3gQeC/AKOAGiK7k9nwKXcfDXwe+I6ZXRb9pEf2IbNyzq6ZnQJcBfyfYFKubLMTsrl9WmNmc4AG4DfBpBrgTHe/CLgN+K2ZfSyDRcq5z+4k02nesMj49oqRESek+3tWaIGfUxdMN7NiIh/kb9x9JYC7v+Xuje5+HFhKB+3GtsXd9wS3bwNPBOV4q2kXMbh9OxtlI1IJvejubwVlzIltRvztkxPfOzO7EbgS+HIQFARdJgeC+5uI9JX/S6bK1Mpnl/VtZmadgS8CK5qmZXp7xcoIOvB7VmiBf+KC6UEr8TpgdTYKEvQN/gp4zd3/NWp6dJ/bF4CXT35tBsrWzcx6NN0ncsDvZSLb6mvBbF8Dnsx02QLNWl25sM0C8bbPauCrwVkU44DaqF3yjDCzicDtwFXufjhqen8zKwrunwWcA+zMYLnifXargevM7FQzGxaU62+ZKlfgs8Dr7l7dNCGT2yteRtCR37NMHI3O5B+RI9n/IFIzz8liOT5FZFfsJWBz8HcF8GtgazB9NVCShbKdReQMiS3AK03bCegL/B7YBqwH+mShbN2AA0DPqGkZ32ZEKpwa4BiRvtJvxts+RM6a+EXwndsKlGahbNuJ9O82fdcWBfNeHXzGm4EXgckZLlfczw6YE2yzN4DPZ7JcwfT/AL510ryZ3F7xMqLDvmcaWkFEJCQKrUtHRETiUOCLiISEAl9EJCQU+CIiIaHAFxEJCQW+iEhIKPBFRELi/wO4SKMWcAIQYgAAAABJRU5ErkJggg==\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "best energy without qng: -0.1101990865736325\n", - "optimal angles without qng: a : -1.9977162739218457\n", - "b : -2.0000101558168653\n", - "c : 0.7197529470316536\n", - "d : 0.15019291645695712\n", - "\n" - ] - } - ], - "source": [ - "lr=0.01\n", - "sgd_noqng_result = tq.minimize(objective=O2,\n", - " gradient=None,\n", - " method='sgd', maxiter=200,lr=lr,\n", - " initial_values=init, silent=True)\n", - "print('plotting what happens without QNG')\n", - "sgd_noqng_result.history.plot('energies')\n", - "sgd_noqng_result.history.plot('angles')\n", - "print('best energy without qng: ',sgd_noqng_result.energy)\n", - "print('optimal angles without qng: ',sgd_noqng_result.angles)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Though the starting point was random you will most likely see that the QNG run achieved a greater degree of improvement -- it will not perform worse --, and that the trajectories followed by angles there were different from those followed by angles in the sgd-only optimization. Feel free to play around with other methods, learning rates, or circuits in the space below!\n" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "### Use this space to optimize your own circuits!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### The SciPy Optimizer\n", - "\n", - "`SciPy` is one of the most popular optimization packages in `Python`. It offers a wide variety of optimization strategies. We will not cover them here; for a full exploration of all the `SciPy` methods, see [their docs](https://docs.scipy.org/doc/scipy/reference/tutorial/optimize.html). Here, we will exhibit a few of the more powerful options available. Most `SciPy` keywords like `method_options` can just be passed to `minimize` directly in the same way as when using `SciPy` directly. " - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "available methods for optimizer module scipy\n", - "method | optimizer module\n", - "--------------------------\n", - "NELDER-MEAD | scipy\n", - "COBYLA | scipy\n", - "POWELL | scipy\n", - "SLSQP | scipy\n", - "L-BFGS-B | scipy\n", - "BFGS | scipy\n", - "CG | scipy\n", - "TNC | scipy\n", - "TRUST-KRYLOV | scipy\n", - "NEWTON-CG | scipy\n", - "DOGLEG | scipy\n", - "TRUST-NCG | scipy\n", - "TRUST-EXACT | scipy\n", - "TRUST-CONSTR | scipy\n" - ] - } - ], - "source": [ - "tq.show_available_optimizers(module=\"scipy\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We will try three different optimizers: `COBYLA`, which is gradient-free, `L-BFGS-B`, which employs gradients, and `NEWTON-CG`, which employs the Hessian." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "As a reminder: we will optimize:\n", - "Objective with 1 unique expectation values\n", - "variables = [a, b, c, d]\n", - "types = not compiled\n", - "\n", - "Expectation Value 0\n", - "Hamiltonian : (+1.0000Y(0)X(1)+0.5000X(1)-0.5000Z(0)X(1),)\n", - "variables : [a, b, c, d]\n", - "circuit:\n", - "\n", - " ┌───┐┌───────────────┐ ┌───────────────┐ \n", - "q_0: ┤ H ├┤ RY(f((a,))_0) ├─■─┤ RX(f((c,))_2) ├─■─\n", - " ├───┤├───────────────┤ │ ├───────────────┤ │ \n", - "q_1: ┤ H ├┤ RZ(f((b,))_1) ├─■─┤ RX(f((d,))_3) ├─■─\n", - " └───┘└───────────────┘ └───────────────┘ \n", - "c_0: ═════════════════════════════════════════════\n", - " \n", - "c_1: ═════════════════════════════════════════════\n", - " \n" - ] - } - ], - "source": [ - "print('As a reminder: we will optimize:')\n", - "tq.draw(O1, backend=\"qiskit\")" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "best energy with cobyla: -1.6180095801270247\n", - "optimal angles with cobyla: a : 2.1466459827493174\n", - "b : 1.002273376125911\n", - "c : -0.003983388162904869\n", - "d : -0.5006752029196884\n", - "\n" - ] - } - ], - "source": [ - "init={'a':0.25,'b':0.25,'c':0.25,'d':0.25}\n", - "\n", - "cobyla_result = tq.minimize(objective=O1,\n", - " method=\"cobyla\", \n", - " initial_values=init, \n", - " tol=1.e-3, method_options={\"gtol\":1.e-3},\n", - " silent=True)\n", - "\n", - "cobyla_result.history.plot('energies')\n", - "cobyla_result.history.plot('angles')\n", - "print('best energy with cobyla: ',cobyla_result.energy)\n", - "print('optimal angles with cobyla: ',cobyla_result.angles)" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "best energy with L-BFGS-B: -1.6178070201838934\n", - "optimal angles with L-BFGS-B: a : 0.14354383870194684\n", - "b : 1.0061131726451131\n", - "c : -0.00825692744088291\n", - "d : -0.5036909480382052\n", - "\n" - ] - } - ], - "source": [ - "lb_result = tq.minimize(objective=O1,\n", - " method=\"l-bfgs-b\", \n", - " initial_values=init, \n", - " tol=1.e-3, method_options={\"gtol\":1.e-3},\n", - " silent=True)\n", - "\n", - "lb_result.history.plot('energies')\n", - "lb_result.history.plot('angles')\n", - "print('best energy with L-BFGS-B: ',lb_result.energy)\n", - "print('optimal angles with L-BFGS-B: ',lb_result.angles)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "best energy with NEWTON-CG: -1.6180323934132854\n", - "optimal angles with NEWTON-CG: a : 0.14753463639545006\n", - "b : 1.0008716211744726\n", - "c : -0.0011067836511529652\n", - "d : -0.4998455957582174\n", - "\n" - ] - } - ], - "source": [ - "newton_result = tq.minimize(objective=O1,\n", - " method=\"newton-cg\", \n", - " initial_values=init, \n", - " tol=1.e-3, method_options={\"gtol\":1.e-3},\n", - " silent=True)\n", - "\n", - "newton_result.history.plot('energies')\n", - "newton_result.history.plot('angles')\n", - "print('best energy with NEWTON-CG: ',newton_result.energy)\n", - "print('optimal angles with NEWTON-CG: ',newton_result.angles)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "All three of the methods converged to the same minimum, but not necessarily to the same angles; the gradient and hessian based methods converged to approximately the same angles in similar time. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Scipy Extras: numerical gradients and Hessians**\n", - "Scipy allows for the use of numerical gradients. To use them, pass down keywords to the `gradient` argument, like `'2-point'`. When using the numerical gradients of `SciPy` it is often crucial to determine a feasible stepsize for the procedure. This can be done with the `method_options` entry `finite_diff_rel_step` (for `SciPy` version 1.5 or higher) or `eps` (for `SciPy` version < 1.5).\n", - "\n", - "Here is one example. **Please check your SciPy version!**" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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1i+575KzHnP8+PGkpKRgNptJSEhgypQpAPj7+5OQkMDKlSsxmUx8/fXXREREcOjQIW699VYKCwsZN24cc+fOpaCgoNI+bTYbs2bNYu3atZSUlDB16lTuu+8+0tPTmThxInl5eVitVhYsWMBll11W6bnPPvssK1asoLi4mEsvvZS3335btdsr50w16ShNQnqu85EpOUWWWu130aJFbNmyhc2bNzN//nyysrSZOQsLCxk4cCA7duxgyJAhvPPOOwAkJCSQkJDArl27iImJcbrPd999l6CgIDZt2sSmTZt45513SE5O5pNPPmHEiBFs376dHTt20KtXr2rPnTZtGps2bWL37t0UFxezcuXKWr0+pXmpVQ1fCNESWALEA0eACVLK7Crb9AIWAIGADZgtpVxSm+MqzVNNNXJXk7xHl03y3tLP65xq9FXNnz+fr776CoCUlBQOHDhASEgIXl5eXHPNNQD07duXH374AYANGzawbNkyAG655RYefvjhavtctWoVO3fu5IsvvgAgNzeXAwcO0L9/f+666y4sFgvjx493GvB/+uknXnzxRYqKijh9+jQXXXQRY8aMOe/XpTRPta3hzwLWSCk7AGvKHldVBNwupbwIGAnMFUIE1/K4ilLJIyM6YTLqKy2r7STva9euZfXq1WzYsIEdO3bQu3dvxxh3o9HoaErR6/VYrdXnWXVFSslrr73G9u3b2b59O8nJyQwfPpwhQ4awbt06oqOjmTx5Mh9++GGl55nNZh544AG++OILdu3axb333qvG3CvnpbYBfxzwQdnfHwDjq24gpdwvpTxQ9ncacAIIq+VxFaWS8b2j+c913YkONiHQavb/ua57rTpsc3NzadGiBb6+vvz1119s3LjxrM8ZOHAgX375JQCLFy92us2IESNYsGABFovW3LR//34KCws5evQoERER3Hvvvdxzzz1s3bq10vPKg3toaCgFBQWOXwiKcq5q22kbIaUsn2AyA4ioaWMhxADACzjkYv0UYApAXFxcLYumNDfje0e7dUTOyJEjeeutt+jSpQudOnVi4MCBZ33O3Llzue2225g9ezYjR44kKCio2jb33HMPR44coU+fPkgpCQsLY9myZaxdu5Y5c+ZgNBrx9/evVsMPDg7m3nvvpVu3bkRGRtK/f3+3vValeTjrJOZCiNVApJNVjwMfSCmDK2ybLaVs4WI/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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "best energy with L-BFGS-B: -1.6180322764615407\n", - "optimal angles with L-BFGS-B: a : 0.14737921020398723\n", - "b : 0.9991028633007109\n", - "c : 0.0010812477825766602\n", - "d : -0.5000405396241386\n", - "\n" - ] - } - ], - "source": [ - "lb_result = tq.minimize(objective=O1,\n", - " method=\"l-bfgs-b\", \n", - " initial_values=init,\n", - " gradient=\"2-point\",\n", - " tol=1.e-3, method_options={\"gtol\":1.e-3, \"finite_diff_rel_step\":1.e-4}, # eps for scipy version < 1.5\n", - " silent=True)\n", - "\n", - "lb_result.history.plot('energies')\n", - "lb_result.history.plot('angles')\n", - "print('best energy with L-BFGS-B: ',lb_result.energy)\n", - "print('optimal angles with L-BFGS-B: ',lb_result.angles)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Scipy Extras: the QNG in SciPy**\n", - "Scipy is also configured to use the qng, just as the gd optimizer is. All one needs to do is set `gradient=qng`. Let's See how QNG interacts with the `BFGS` optimizer. We will use 02, our 3-qubit expectationvalue, that we used previously." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "plotting what happens with QNG\n" - ] - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAD4CAYAAADhNOGaAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nO3de3hV5Zn38e+d4w6QhFMI4WwLVZCTNXgo6lRFsRULrR2n046N7WuttdPLdt7R4mun40x1pNWeT1atLY6dmVpq1dYDBdrayngKyCGAiFgpIUACyDEhx/v9Y6/QEHaSHfZOFsn6fa4rV9Ze61l73YmS336e9ay1zN0REZHoygi7ABERCZeCQEQk4hQEIiIRpyAQEYk4BYGISMRlhV3AyRg+fLhPmDAh7DJERPqUVatW7XH3ovbr+2QQTJgwgfLy8rDLEBHpU8xsW6L1GhoSEYk4BYGISMSlFARmNtTMlpnZluD7kARtZprZC2a2wczWmdnftdl2qZmtNrM1Zva8mU1MpR4REem+VM8RLARWuPsiM1sYvP5iuza1wMfdfYuZjQJWmdlSd98P/BCY7+6bzOwm4EvAdSnWJCL9QGNjI5WVlRw9ejTsUvqcWCzGmDFjyM7OTqp9qkEwH3hvsLwY+APtgsDdX2+zXGVm1UARsB9woCDYXAhUpViPiPQTlZWV5OfnM2HCBMws7HL6DHdn7969VFZWctpppyW1T6pBUOzuO4PlXUBxZ43N7BwgB9garLoeeNrM6oCDwHmd7HsDcAPAuHHjul3o46/u4J6lm6naX8eowXncMvd0Fpw1utvvIyK94+jRowqBk2BmDBs2jJqamqT36fIcgZktN7OKBF/z27bz+G1MO7yVqZmVAP8JfMLdW4LVXwDe7+5jgJ8A3+hof3e/391L3b20qOiEabCdevzVHdz22Hp27K/DgR3767jtsfU8/uqObr2PiPQuhcDJ6e7vrcsegbvP6eRgu82sxN13Bn/oqztoVwA8Bdzu7i8G64qAGe7+UtDs58Cz3ao+Sfcs3UxdY/Nx6+oam7ln6Wb1CkQk8lKdPvokUBYslwFPtG9gZjnAr4CH3X1Jm01vA4Vm9q7g9WXAphTrSahqf1231ouIhOX9738/+/fv79VjpnqOYBHwqJn9H2AbcA2AmZUCN7r79cG6i4BhZnZdsN917r7GzD4F/NLMWogHwydTrCehUYPz2JHgj/6owXk9cTgRCUFfOQ/Y1NREVlbHf3qffvrpXqwmLqUegbvvdfdL3X2Su89x933B+vIgBHD3R9w9291ntvlaE2z7lbtPc/cZ7v5ed38z9R/pRLfMPZ287Mzj1uVlZ3LL3NN74nAi0st68jzgI488wjnnnMPMmTP59Kc/TXNzM4MGDeL2229nxowZnHfeeezevRuAmpoarr76ambNmsWsWbNYuXIlAHfccQfXXnsts2fP5tprr6W2tpZrrrmGKVOm8MEPfpBzzz332G1zJkyYwJ49ezo8dnNzM9dddx1Tp05l2rRpfPOb30z5Z+yT9xrqrtZPBXf8egP7axspLsjltvdNPiU/LYhIYn/3oxdOWDdvegnXnj+Brz37WsLzgHf8egMLzhrNviMNfOaRVcdt//mnz+/ymJs2beLnP/85K1euJDs7m5tuuomf/exnHDlyhPPOO4+77rqLW2+9lQceeIAvfelL3HzzzXzhC1/gggsu4C9/+Qtz585l06b4iPfGjRt5/vnnycvL495772XIkCFs3LiRiooKZs6cmfSxzzzzTHbs2EFFRQVAWoaRIhEEEA+DoQNz+PhDL/O9j76bWROGhl2SiKTJzgOJLzrbX9uY0vuuWLGCVatWMWvWLADq6uoYMWIEOTk5zJs3D4Czzz6bZcuWAbB8+XI2btx4bP+DBw9y+PBhAD7wgQ+Qlxcfjn7++ee5+eabAZg6dSrTp09P+thXXXUVb775Jp/73Oe48sorufzyy1P6GSFCQQAwZkge7x43GE1IE+l7OvsE39F5wNHBecChA3OS6gG05+6UlZVx9913H7f+3nvvPTZFMzMzk6amJgBaWlp48cUXicViJ7zXwIED03JsgLVr17J06VLuu+8+Hn30UR566KFuvXd7kbrp3DuKBvHYTbMpVW9ApF/pqfOAl156KUuWLKG6Oj4zft++fWzblvBOzgBcfvnlfPe73z32es2aNQnbzZ49m0cffRSIDxmtX78+6WPv2bOHlpYWrr76au68805Wr1590j9fq0j1CESkf2o935fuWUNTpkzhzjvv5PLLL6elpYXs7Gy+//3vd9j+O9/5Dp/97GeZPn06TU1NXHTRRdx3330ntLvpppsoKytjypQpnHHGGZx55pkUFhYmdey8vDw+8YlP0NIS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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "best energy with qng: -0.3535533676156721\n", - "optimal angles with qng: a : -1.570884542409681\n", - "b : 0.754829536265003\n", - "c : -1.5708867115312135\n", - "d : -1.5704585913166933\n", - "\n" - ] - } - ], - "source": [ - "init={k:np.random.uniform(-2,2) for k in ['a','b','c','d']}\n", - "lr=0.01\n", - "bfgs_qng_result = tq.minimize(objective=O2,\n", - " gradient='qng',\n", - " method='bfgs', maxiter=200,lr=lr,\n", - " initial_values=init, silent=True)\n", - "print('plotting what happens with QNG')\n", - "bfgs_qng_result.history.plot('energies')\n", - "bfgs_qng_result.history.plot('angles')\n", - "print('best energy with qng: ',bfgs_qng_result.energy)\n", - "print('optimal angles with qng: ',bfgs_qng_result.angles)" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "plotting what happens without QNG\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "best energy without qng: -0.35355296837705463\n", - "optimal angles without qng: a : -1.5699318047491537\n", - "b : 0.6835176416172444\n", - "c : -1.5699495726072827\n", - "d : -1.5717565421037312\n", - "\n" - ] - } - ], - "source": [ - "bfgs_noqng_result = tq.minimize(objective=O2,\n", - " gradient=None,\n", - " method='bfgs', maxiter=200,lr=lr,\n", - " initial_values=init, silent=True)\n", - "print('plotting what happens without QNG')\n", - "bfgs_noqng_result.history.plot('energies')\n", - "bfgs_noqng_result.history.plot('angles')\n", - "print('best energy without qng: ',bfgs_noqng_result.energy)\n", - "print('optimal angles without qng: ',bfgs_noqng_result.angles)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Numerical and Customized Gradients\n", - "\n", - "By default `tequila` compiles analytical gradients of the objectives using `jax`, internal recompilation and the parameter shift rule. The default is not setting the `gradient` keyword or setting it to `None`. The keyword can also be set to a dictionary (keys are the variables, values are the `tequila` objectives which are assumed to evaluate to the corresponding gradients of the objective). \n", - "For example `gradient=tq.grad(objective)` will results have the same results as `gradient=None` or simply not setting it.\n", - "\n", - "`tequila` offers its own way of compiling numerical gradients which can then be used troughout all gradient based optimizers. It can be activated by setting `gradient` to a dictionary holding the finite difference stencil as `method` as well as the `stepsize`. \n", - "\n", - "Numerical gradients of that type come with the cost of 2*`len(variables)` and can lead to significantly cheaper gradients, especially if many expectation values are involved in the objective and/or if heavy recompilation of parametrized gates is necessary. \n", - "Here is a small example using our `O2` objective, here the numerical 2-point procedure leads to 4 expectation values in the gradients (while anayltial gradients would lead to 8, set silent to False in the upper example or remove the gradient statement here)." - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Optimizer: \n", - "backend : qulacs\n", - "device : None\n", - "samples : None\n", - "save_history : True\n", - "noise : None\n", - "\n", - "Objective : 1 expectationvalues\n", - "Gradient : 4 expectationvalues\n", - "gradient instr : {'method': '2-point', 'stepsize': 0.0001}\n", - "active variables : 4\n", - "Iteration: 1 , Energy: -0.60003241, angles: {a: 0.09936269222059471, b: 0.09939775441865076, c: 0.09936269222059471, d: 0.09936269222060581}\n", - "Iteration: 2 , Energy: -0.60018803, angles: {a: 0.09872953938259146, b: 0.09879900936485822, c: 0.09872953938259146, d: 0.09872953938264697}\n", - "Iteration: 3 , Energy: -0.60034166, angles: {a: 0.0981005608850504, b: 0.09820379122594805, c: 0.09810056088502819, d: 0.0981005608850948}\n", - "Iteration: 4 , Energy: -0.60049334, angles: {a: 0.09747568193347869, b: 0.09761199308737636, c: 0.09747568193347869, d: 0.09747568193355641}\n", - "Iteration: 5 , Energy: -0.60064311, angles: {a: 0.09685487540521667, b: 0.09702364170889313, c: 0.09685487540521667, d: 0.09685487540527218}\n", - "Iteration: 6 , Energy: -0.60079098, angles: {a: 0.09623806839960106, b: 0.09643871923710182, c: 0.09623806839960106, d: 0.09623806839964547}\n", - "Iteration: 7 , Energy: -0.60093698, angles: {a: 0.0956252806498358, b: 0.0958572078908814, c: 0.0956252806498358, d: 0.09562528064989131}\n", - "Iteration: 8 , Energy: -0.60108113, angles: {a: 0.0950164855547663, b: 0.09527908992764669, c: 0.0950164855547441, d: 0.09501648555481071}\n", - "Iteration: 9 , Energy: -0.60122346, angles: {a: 0.09441165665331477, b: 0.09470434768407135, c: 0.09441165665330367, d: 0.09441165665333698}\n", - "Iteration: 10 , Energy: -0.60136397, angles: {a: 0.09381076767438482, b: 0.0941329635311349, c: 0.09381076767435151, d: 0.09381076767439592}\n", - "Iteration: 11 , Energy: -0.60150271, angles: {a: 0.0932137924882114, b: 0.09356496217552959, c: 0.0932137924881892, d: 0.09321379248824471}\n", - "Iteration: 12 , Energy: -0.60163968, angles: {a: 0.09262074932341316, b: 0.09300024119288644, c: 0.09262074932337985, d: 0.09262074932344647}\n", - "Iteration: 13 , Energy: -0.60177491, angles: {a: 0.09203156762944689, b: 0.09243882573122245, c: 0.09203156762939138, d: 0.0920315676294691}\n", - "Iteration: 14 , Energy: -0.60190844, angles: {a: 0.09144617816974057, b: 0.09188069835390769, c: 0.09144617816967396, d: 0.09144617816976278}\n", - "Iteration: 15 , Energy: -0.60204027, angles: {a: 0.09086459969669383, b: 0.09132588302063196, c: 0.09086459969666053, d: 0.09086459969673824}\n", - "Iteration: 16 , Energy: -0.60217043, angles: {a: 0.0902868068917039, b: 0.09077432059370052, c: 0.0902868068916706, d: 0.09028680689175941}\n", - "Iteration: 17 , Energy: -0.60229894, angles: {a: 0.08971277462606056, b: 0.09022595297237804, c: 0.08971277462603836, d: 0.08971277462612717}\n", - "Iteration: 18 , Energy: -0.60242582, angles: {a: 0.0891424779130067, b: 0.08968084491347553, c: 0.08914247791298449, d: 0.08914247791307331}\n", - "Iteration: 19 , Energy: -0.60255110, angles: {a: 0.08857589196267215, b: 0.0891388978221496, c: 0.08857589196266105, d: 0.08857589196272767}\n", - "Iteration: 20 , Energy: -0.60267478, angles: {a: 0.08801299212510819, b: 0.08860013546788661, c: 0.08801299212508598, d: 0.0880129921251859}\n", - "Iteration: 21 , Energy: -0.60279690, angles: {a: 0.08745375389718194, b: 0.08806454080229056, c: 0.08745375389714863, d: 0.08745375389724855}\n", - "Iteration: 22 , Energy: -0.60291747, angles: {a: 0.08689815296898376, b: 0.08753213655906525, c: 0.08689815296895045, d: 0.08689815296908368}\n", - "Iteration: 23 , Energy: -0.60303651, angles: {a: 0.08634616512834806, b: 0.08700286567778762, c: 0.08634616512832585, d: 0.08634616512843687}\n", - "Iteration: 24 , Energy: -0.60315405, angles: {a: 0.085797766404938, b: 0.08647667211360002, c: 0.08579776640486028, d: 0.08579776640499351}\n", - "Iteration: 25 , Energy: -0.60327009, angles: {a: 0.08525293292241934, b: 0.08595361772982804, c: 0.08525293292236383, d: 0.08525293292250816}\n", - "Iteration: 26 , Energy: -0.60338466, angles: {a: 0.08471164095450448, b: 0.08543360763502142, c: 0.08471164095444897, d: 0.0847116409546155}\n", - "Iteration: 27 , Energy: -0.60349778, angles: {a: 0.08417386696589749, b: 0.08491666433226844, c: 0.08417386696585308, d: 0.08417386696600851}\n", - "Iteration: 28 , Energy: -0.60360947, angles: {a: 0.08363958756893988, b: 0.0844027712452399, c: 0.08363958756887327, d: 0.08363958756907311}\n", - "Iteration: 29 , Energy: -0.60371973, angles: {a: 0.08310881904757253, b: 0.08389191184905434, c: 0.08310881904746151, d: 0.08310881904766135}\n", - "Iteration: 30 , Energy: -0.60382861, angles: {a: 0.08258145896503635, b: 0.08338406963162007, c: 0.08258145896493643, d: 0.08258145896513627}\n", - "Iteration: 31 , Energy: -0.60393610, angles: {a: 0.08205752419070392, b: 0.08287922821224028, c: 0.0820575241905818, d: 0.08205752419078163}\n", - "Iteration: 32 , Energy: -0.60404223, angles: {a: 0.08153703073238142, b: 0.08237737117848801, c: 0.08153703073223709, d: 0.08153703073245913}\n", - "Iteration: 33 , Energy: -0.60414701, angles: {a: 0.08101987812521019, b: 0.08187851946049865, c: 0.08101987812503256, d: 0.08101987812528791}\n", - "Iteration: 34 , Energy: -0.60425047, angles: {a: 0.08050608291584319, b: 0.0813825822311042, c: 0.08050608291565445, d: 0.0805060829159209}\n", - "Iteration: 35 , Energy: -0.60435261, angles: {a: 0.07999566079792678, b: 0.08088958075037614, c: 0.07999566079777135, d: 0.0799956607980267}\n", - "Iteration: 36 , Energy: -0.60445347, angles: {a: 0.07948851325788589, b: 0.08039949887581602, c: 0.07948851325771936, d: 0.0794885132579525}\n", - "Iteration: 37 , Energy: -0.60455305, angles: {a: 0.07898465652929057, b: 0.07991232060372547, c: 0.07898465652913514, d: 0.07898465652934608}\n", - "Iteration: 38 , Energy: -0.60465136, angles: {a: 0.07848406874542127, b: 0.07942802994639334, c: 0.07848406874522143, d: 0.07848406874543237}\n", - "Iteration: 39 , Energy: -0.60474843, angles: {a: 0.077986765170479, b: 0.07894661097470604, c: 0.07798676517024586, d: 0.07798676517049011}\n", - "Iteration: 40 , Energy: -0.60484426, angles: {a: 0.07749268667027734, b: 0.07846804786745257, c: 0.07749268667003309, d: 0.07749268667031065}\n", - "Iteration: 41 , Energy: -0.60493889, angles: {a: 0.07700177522291787, b: 0.0779923248581226, c: 0.07700177522269583, d: 0.07700177522299559}\n", - "Iteration: 42 , Energy: -0.60503231, angles: {a: 0.07651404654044339, b: 0.07751942619080845, c: 0.07651404654024355, d: 0.0765140465405322}\n", - "Iteration: 43 , Energy: -0.60512455, angles: {a: 0.07602951552859719, b: 0.07704933626402335, c: 0.07602951552838624, d: 0.0760295155286749}\n", - "Iteration: 44 , Energy: -0.60521563, angles: {a: 0.07554808871127464, b: 0.07658203945176681, c: 0.0755480887110748, d: 0.07554808871136345}\n", - "Iteration: 45 , Energy: -0.60530555, angles: {a: 0.07506978153447577, b: 0.07611752027070198, c: 0.07506978153429814, d: 0.07506978153454238}\n", - "Iteration: 46 , Energy: -0.60539433, angles: {a: 0.07459460865013581, b: 0.0756557632139109, c: 0.07459460864996928, d: 0.07459460865019132}\n", - "Iteration: 47 , Energy: -0.60548199, angles: {a: 0.07412247838141087, b: 0.07519675293004005, c: 0.07412247838119992, d: 0.07412247838143307}\n", - "Iteration: 48 , Energy: -0.60556854, angles: {a: 0.0736534058718207, b: 0.07474047412463483, c: 0.07365340587159866, d: 0.0736534058718207}\n", - "Iteration: 49 , Energy: -0.60565400, angles: {a: 0.07318737079271545, b: 0.07428691147928204, c: 0.07318737079253781, d: 0.07318737079272655}\n", - "Iteration: 50 , Energy: -0.60573837, angles: {a: 0.07272435291552073, b: 0.07383608344428963, c: 0.0727243529153431, d: 0.07272435291553184}\n", - "Iteration: 51 , Energy: -0.60582167, angles: {a: 0.0722643664621602, b: 0.07338790751161275, c: 0.07226436646196036, d: 0.0722643664621491}\n", - "Iteration: 52 , Energy: -0.60590392, angles: {a: 0.0718073227090276, b: 0.07294240240046648, c: 0.07180732270884996, d: 0.0718073227090276}\n", - "Iteration: 53 , Energy: -0.60598513, angles: {a: 0.07135323632113658, b: 0.07249958611063026, c: 0.07135323632093674, d: 0.07135323632112547}\n", - "Iteration: 54 , Energy: -0.60606531, angles: {a: 0.07090208766855613, b: 0.07205937752444705, c: 0.07090208766836739, d: 0.07090208766858944}\n", - "Iteration: 55 , Energy: -0.60614448, angles: {a: 0.07045385717230337, b: 0.07162179500369562, c: 0.07045385717212574, d: 0.07045385717233668}\n", - "Iteration: 56 , Energy: -0.60622264, angles: {a: 0.07000852540416372, b: 0.07118685616414036, c: 0.07000852540396388, d: 0.07000852540420813}\n", - "Iteration: 57 , Energy: -0.60629982, angles: {a: 0.06956607313460808, b: 0.07075448126260256, c: 0.06956607313439714, d: 0.06956607313464139}\n", - "Iteration: 58 , Energy: -0.60637602, angles: {a: 0.06912648118542189, b: 0.07032468823070506, c: 0.06912648118519985, d: 0.0691264811854552}\n", - "Iteration: 59 , Energy: -0.60645126, angles: {a: 0.068689730528848, b: 0.06989746250267706, c: 0.06868973052860375, d: 0.06868973052891461}\n", - "Iteration: 60 , Energy: -0.60652554, angles: {a: 0.06825583459099108, b: 0.06947282119906797, c: 0.06825583459074683, d: 0.06825583459106879}\n", - "Iteration: 61 , Energy: -0.60659888, angles: {a: 0.06782470974672208, b: 0.06905068638762826, c: 0.06782470974647783, d: 0.0678247097467776}\n", - "Iteration: 62 , Energy: -0.60667130, angles: {a: 0.06739640180498654, b: 0.06863107550498784, c: 0.06739640180473119, d: 0.06739640180505316}\n", - "Iteration: 63 , Energy: -0.60674280, angles: {a: 0.0669708282178604, b: 0.0682139742203102, c: 0.06697082821761616, d: 0.06697082821793812}\n", - "Iteration: 64 , Energy: -0.60681340, angles: {a: 0.06654803422241332, b: 0.06779936826630797, c: 0.06654803422223568, d: 0.06654803422252434}\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Iteration: 65 , Energy: -0.60688310, angles: {a: 0.0661279383438961, b: 0.06738724349811812, c: 0.06612793834369626, d: 0.06612793834398492}\n", - "Iteration: 66 , Energy: -0.60695193, angles: {a: 0.06571055413201457, b: 0.06697758574548676, c: 0.06571055413177032, d: 0.06571055413208118}\n", - "Iteration: 67 , Energy: -0.60701988, angles: {a: 0.06529586361294629, b: 0.0665703810021955, c: 0.06529586361269094, d: 0.0652958636130129}\n", - "Iteration: 68 , Energy: -0.60708697, angles: {a: 0.06488387954099997, b: 0.06616561524409584, c: 0.06488387954073352, d: 0.06488387954105548}\n", - "Iteration: 69 , Energy: -0.60715322, angles: {a: 0.06447452255616817, b: 0.0657633045205274, c: 0.06447452255590172, d: 0.06447452255623479}\n", - "Iteration: 70 , Energy: -0.60721863, angles: {a: 0.06406780590619823, b: 0.06536337486069402, c: 0.06406780590594288, d: 0.06406780590628705}\n", - "Iteration: 71 , Energy: -0.60728321, angles: {a: 0.06366371207211499, b: 0.06496584259177976, c: 0.06366371207190405, d: 0.06366371207221491}\n", - "Iteration: 72 , Energy: -0.60734698, angles: {a: 0.06326222358892233, b: 0.0645706940255785, c: 0.06326222358871139, d: 0.06326222358901115}\n", - "Iteration: 73 , Energy: -0.60740995, angles: {a: 0.06286332318993218, b: 0.06417791550119559, c: 0.06286332318974344, d: 0.0628633231900321}\n", - "Iteration: 74 , Energy: -0.60747211, angles: {a: 0.0624670232160173, b: 0.06378749343165505, c: 0.06246702321582856, d: 0.062467023216150525}\n", - "Iteration: 75 , Energy: -0.60753349, angles: {a: 0.06207324735175704, b: 0.06339944319798665, c: 0.06207324735152389, d: 0.06207324735187916}\n", - "Iteration: 76 , Energy: -0.60759410, angles: {a: 0.06168202294652972, b: 0.06301369335092169, c: 0.06168202294632988, d: 0.061682022946662945}\n", - "Iteration: 77 , Energy: -0.60765394, angles: {a: 0.0612933039175311, b: 0.06263025955511861, c: 0.06129330391736457, d: 0.061293303917653225}\n", - "Iteration: 78 , Energy: -0.60771302, angles: {a: 0.06090708821473437, b: 0.06224912852079703, c: 0.060907088214523425, d: 0.06090708821483429}\n", - "Iteration: 79 , Energy: -0.60777136, angles: {a: 0.060523359230513135, b: 0.0618702869668141, c: 0.060523359230268886, d: 0.06052335923059085}\n", - "Iteration: 80 , Energy: -0.60782897, angles: {a: 0.060142114673189445, b: 0.061493735727058324, c: 0.060142114672945196, d: 0.060142114673244956}\n", - "Iteration: 81 , Energy: -0.60788584, angles: {a: 0.059763309662730274, b: 0.06111943352621321, c: 0.05976330966245272, d: 0.05976330966275248}\n", - "Iteration: 82 , Energy: -0.60794200, angles: {a: 0.059386956240159355, b: 0.06074738141711436, c: 0.0593869562398929, d: 0.059386956240203764}\n", - "Iteration: 83 , Energy: -0.60799745, angles: {a: 0.05901302405618694, b: 0.06037756640113737, c: 0.0590130240559649, d: 0.05901302405623135}\n", - "Iteration: 84 , Energy: -0.60805220, angles: {a: 0.05864148321026433, b: 0.060009989237441635, c: 0.05864148321006449, d: 0.058641483210353146}\n", - "Iteration: 85 , Energy: -0.60810626, angles: {a: 0.058272345532173114, b: 0.05964460957863507, c: 0.05827234553193997, d: 0.05827234553223973}\n", - "Iteration: 86 , Energy: -0.60815963, angles: {a: 0.05790558127225501, b: 0.059281428407376074, c: 0.05790558127197745, d: 0.057905581272288315}\n", - "Iteration: 87 , Energy: -0.60821234, angles: {a: 0.05754116112437471, b: 0.058920432986886345, c: 0.05754116112410826, d: 0.057541161124441326}\n", - "Iteration: 88 , Energy: -0.60826438, angles: {a: 0.057179083215841336, b: 0.05856162399068268, c: 0.05717908321557488, d: 0.057179083215885745}\n", - "Iteration: 89 , Energy: -0.60831576, angles: {a: 0.05681934544328185, b: 0.058204962013264, c: 0.05681934544297099, d: 0.05681934544330405}\n", - "Iteration: 90 , Energy: -0.60836649, angles: {a: 0.05646190551384925, b: 0.057850461149155846, c: 0.05646190551350508, d: 0.056461905513838145}\n", - "Iteration: 91 , Energy: -0.60841659, angles: {a: 0.056106774842035106, b: 0.057498082424500746, c: 0.05610677484170204, d: 0.05610677484204621}\n", - "Iteration: 92 , Energy: -0.60846605, angles: {a: 0.05575392483794231, b: 0.05714782671275556, c: 0.05575392483758704, d: 0.05575392483793121}\n", - "Iteration: 93 , Energy: -0.60851489, angles: {a: 0.05540332734432765, b: 0.056799681656527407, c: 0.05540332734397238, d: 0.05540332734432765}\n", - "Iteration: 94 , Energy: -0.60856311, angles: {a: 0.055054993569170124, b: 0.05645364785705756, c: 0.05505499356883706, d: 0.055054993569170124}\n", - "Iteration: 95 , Energy: -0.60861073, angles: {a: 0.054708895484123415, b: 0.05610970004585872, c: 0.054708895483768144, d: 0.05470889548409011}\n", - "Iteration: 96 , Energy: -0.60865774, angles: {a: 0.054365018307123064, b: 0.05576781331171335, c: 0.05436501830676779, d: 0.05436501830705645}\n", - "Iteration: 97 , Energy: -0.60870417, angles: {a: 0.05402334735740136, b: 0.055428001110746555, c: 0.05402334735702388, d: 0.05402334735731254}\n", - "Iteration: 98 , Energy: -0.60875001, angles: {a: 0.05368385539673551, b: 0.05509022600685967, c: 0.05368385539640244, d: 0.05368385539668}\n", - "Iteration: 99 , Energy: -0.60879527, angles: {a: 0.053346540759779876, b: 0.054754488768293724, c: 0.05334654075944681, d: 0.05334654075971326}\n", - "Iteration: 100 , Energy: -0.60883996, angles: {a: 0.05301138904574279, b: 0.05442077748341037, c: 0.05301138904544303, d: 0.05301138904569838}\n", - "Iteration: 101 , Energy: -0.60888409, angles: {a: 0.05267839837312929, b: 0.054089080298247355, c: 0.052678398372840635, d: 0.052678398373084884}\n", - "Iteration: 102 , Energy: -0.60892766, angles: {a: 0.05234752966062342, b: 0.05375938541807282, c: 0.05234752966031256, d: 0.05234752966057901}\n", - "Iteration: 103 , Energy: -0.60897068, angles: {a: 0.05201878130105522, b: 0.05343168112743593, c: 0.052018781300722156, d: 0.05201878130098861}\n", - "Iteration: 104 , Energy: -0.60901317, angles: {a: 0.05169215145586206, b: 0.053105967892885714, c: 0.051692151455528995, d: 0.05169215145580655}\n", - "Iteration: 105 , Energy: -0.60905511, angles: {a: 0.05136760182175007, b: 0.052782221830982495, c: 0.05136760182146141, d: 0.05136760182171676}\n", - "Iteration: 106 , Energy: -0.60909653, angles: {a: 0.05104514283457143, b: 0.05246041940384352, c: 0.05104514283427167, d: 0.051045142834515916}\n", - "Iteration: 107 , Energy: -0.60913743, angles: {a: 0.050724736682305954, b: 0.052140573199310675, c: 0.050724736682006194, d: 0.05072473668225044}\n", - "Iteration: 108 , Energy: -0.60917781, angles: {a: 0.05040638182247639, b: 0.05182265972982761, c: 0.05040638182217663, d: 0.050406381822431984}\n", - "Iteration: 109 , Energy: -0.60921769, angles: {a: 0.0500900647415258, b: 0.05150666763481518, c: 0.05009006474122604, d: 0.050090064741492496}\n", - "Iteration: 110 , Energy: -0.60925706, angles: {a: 0.04977578369990124, b: 0.05119257392403034, c: 0.04977578369956817, d: 0.04977578369985683}\n", - "Iteration: 111 , Energy: -0.60929594, angles: {a: 0.04946350187282614, b: 0.05088037920786262, c: 0.049463501872515275, d: 0.04946350187282614}\n", - "Iteration: 112 , Energy: -0.60933433, angles: {a: 0.04915322934060376, b: 0.05057007230410129, c: 0.04915322934027069, d: 0.04915322934057045}\n", - "Iteration: 113 , Energy: -0.60937224, angles: {a: 0.048844941230063915, b: 0.05026165359260917, c: 0.04884494122974195, d: 0.048844941230019506}\n", - "Iteration: 114 , Energy: -0.60940967, angles: {a: 0.04853861306262078, b: 0.04995508896422632, c: 0.04853861306233212, d: 0.04853861306257637}\n", - "Iteration: 115 , Energy: -0.60944663, angles: {a: 0.048234243402500626, b: 0.04965037898660976, c: 0.048234243402200866, d: 0.04823424340245622}\n", - "Iteration: 116 , Energy: -0.60948312, angles: {a: 0.047931819370816614, b: 0.049347512719066705, c: 0.04793181937055016, d: 0.04793181937080551}\n", - "Iteration: 117 , Energy: -0.60951916, angles: {a: 0.04763132814186158, b: 0.049046479281689065, c: 0.047631328141550716, d: 0.04763132814182827}\n", - "Iteration: 118 , Energy: -0.60955474, angles: {a: 0.04733276812546308, b: 0.048747267855153625, c: 0.04733276812509671, d: 0.047332768125374264}\n", - "Iteration: 119 , Energy: -0.60958988, angles: {a: 0.047036104379505256, b: 0.048449867681732345, c: 0.04703610437913888, d: 0.04703610437938313}\n", - "Iteration: 120 , Energy: -0.60962457, angles: {a: 0.04674133553895779, b: 0.04815427906412753, c: 0.04674133553856921, d: 0.04674133553882456}\n", - "Iteration: 121 , Energy: -0.60965883, angles: {a: 0.046448460055059565, b: 0.04786046927470747, c: 0.04644846005469319, d: 0.04644846005494854}\n", - "Iteration: 122 , Energy: -0.60969265, angles: {a: 0.04615745449400013, b: 0.047568438807732344, c: 0.046157454493655964, d: 0.04615745449387801}\n", - "Iteration: 123 , Energy: -0.60972605, angles: {a: 0.04586830656352339, b: 0.04727818795132724, c: 0.045868306563190325, d: 0.04586830656341237}\n", - "Iteration: 124 , Energy: -0.60975904, angles: {a: 0.04558099335413282, b: 0.046989684537335125, c: 0.04558099335378865, d: 0.045580993354044}\n", - "Iteration: 125 , Energy: -0.60979161, angles: {a: 0.045295513580778574, b: 0.04670293971593678, c: 0.0452955135804233, d: 0.04529551358066755}\n", - "Iteration: 126 , Energy: -0.60982377, angles: {a: 0.04501185520323628, b: 0.046417921703545334, c: 0.04501185520289211, d: 0.04501185520314746}\n", - "Iteration: 127 , Energy: -0.60985552, angles: {a: 0.04473000625739845, b: 0.04613463095041173, c: 0.0447300062571209, d: 0.04473000625734294}\n", - "Iteration: 128 , Energy: -0.60988688, angles: {a: 0.04444996529975312, b: 0.045853067707735035, c: 0.04444996529949777, d: 0.04444996529970871}\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Iteration: 129 , Energy: -0.60991784, angles: {a: 0.044171709961215916, b: 0.04557320074181073, c: 0.04417170996097167, d: 0.04417170996118261}\n", - "Iteration: 130 , Energy: -0.60994842, angles: {a: 0.04389521821988032, b: 0.045295030473535475, c: 0.04389521821962497, d: 0.04389521821982481}\n", - "Iteration: 131 , Energy: -0.60997861, angles: {a: 0.04362048886594741, b: 0.04501854684014753, c: 0.04362048886570316, d: 0.043620488865903}\n", - "Iteration: 132 , Energy: -0.61000842, angles: {a: 0.04334751034099629, b: 0.044743739818764366, c: 0.04334751034074094, d: 0.04334751034092968}\n", - "Iteration: 133 , Energy: -0.61003786, angles: {a: 0.043076281278386835, b: 0.04447059944927548, c: 0.04307628127810928, d: 0.04307628127830912}\n", - "Iteration: 134 , Energy: -0.61006693, angles: {a: 0.042806769993153276, b: 0.04419912593658362, c: 0.04280676999287572, d: 0.04280676999308666}\n", - "Iteration: 135 , Energy: -0.61009563, angles: {a: 0.042538975318639954, b: 0.04392929919156954, c: 0.0425389753183624, d: 0.04253897531858444}\n", - "Iteration: 136 , Energy: -0.61012398, angles: {a: 0.04227288602460791, b: 0.04366110942012327, c: 0.04227288602431925, d: 0.0422728860245524}\n", - "Iteration: 137 , Energy: -0.61015196, angles: {a: 0.042008500771106766, b: 0.043394536949581314, c: 0.04200850077084031, d: 0.04200850077106236}\n", - "Iteration: 138 , Energy: -0.61017960, angles: {a: 0.04174578870885784, b: 0.04312959201888669, c: 0.04174578870860249, d: 0.04174578870885784}\n", - "Iteration: 139 , Energy: -0.61020689, angles: {a: 0.041484748721276526, b: 0.04286625501318522, c: 0.04148474872098787, d: 0.04148474872128763}\n", - "Iteration: 140 , Energy: -0.61023384, angles: {a: 0.041225379532938616, b: 0.04260451634566778, c: 0.04122537953267216, d: 0.04122537953294972}\n", - "Iteration: 141 , Energy: -0.61026045, angles: {a: 0.04096766048476966, b: 0.04234435679069107, c: 0.04096766048452541, d: 0.04096766048479186}\n", - "Iteration: 142 , Energy: -0.61028673, angles: {a: 0.04071158077960649, b: 0.0420857863397294, c: 0.040711580779340034, d: 0.04071158077961759}\n", - "Iteration: 143 , Energy: -0.61031267, angles: {a: 0.040457120204551084, b: 0.04182877623999373, c: 0.04045712020427353, d: 0.040457120204562186}\n", - "Iteration: 144 , Energy: -0.61033830, angles: {a: 0.04020428714152083, b: 0.04157333632992524, c: 0.04020428714128768, d: 0.04020428714158744}\n", - "Iteration: 145 , Energy: -0.61036360, angles: {a: 0.03995305211110792, b: 0.04131944766464493, c: 0.03995305211087477, d: 0.03995305211117453}\n", - "Iteration: 146 , Energy: -0.61038858, angles: {a: 0.039703414071534576, b: 0.041067091581603515, c: 0.039703414071334736, d: 0.039703414071634496}\n", - "Iteration: 147 , Energy: -0.61041326, angles: {a: 0.039455362602447336, b: 0.040816277741573176, c: 0.039455362602247496, d: 0.03945536260252505}\n", - "Iteration: 148 , Energy: -0.61043762, angles: {a: 0.03920888733551778, b: 0.040566978243605695, c: 0.039208887335306836, d: 0.03920888733557329}\n", - "Iteration: 149 , Energy: -0.61046167, angles: {a: 0.03896398708873586, b: 0.04031920260368907, c: 0.03896398708851381, d: 0.038963987088769164}\n", - "Iteration: 150 , Energy: -0.61048543, angles: {a: 0.038720642404488276, b: 0.04007293243876156, c: 0.03872064240427733, d: 0.03872064240452158}\n", - "Iteration: 151 , Energy: -0.61050889, angles: {a: 0.03847884311820585, b: 0.03982814962089068, c: 0.03847884311801711, d: 0.03847884311822805}\n", - "Iteration: 152 , Energy: -0.61053205, angles: {a: 0.038238570199411376, b: 0.03958486349957538, c: 0.03823857019924484, d: 0.038238570199455785}\n", - "Iteration: 153 , Energy: -0.61055493, angles: {a: 0.03799982270052951, b: 0.03934304698750549, c: 0.03799982270032967, d: 0.037999822700551716}\n", - "Iteration: 154 , Energy: -0.61057752, angles: {a: 0.0377625906577638, b: 0.03910270035457622, c: 0.037762590657530654, d: 0.0377625906577527}\n", - "Iteration: 155 , Energy: -0.61059982, angles: {a: 0.03752686420623866, b: 0.038863814814893344, c: 0.037526864206016614, d: 0.03752686420623866}\n", - "Iteration: 156 , Energy: -0.61062185, angles: {a: 0.0372926335089562, b: 0.038626381601936016, c: 0.03729263350875636, d: 0.03729263350898951}\n", - "Iteration: 157 , Energy: -0.61064360, angles: {a: 0.037059888827706194, b: 0.03839040081616832, c: 0.037059888827461945, d: 0.03705988882769509}\n", - "Iteration: 158 , Energy: -0.61066508, angles: {a: 0.03682862047565952, b: 0.03815584616995152, c: 0.03682862047541527, d: 0.036828620475648416}\n", - "Iteration: 159 , Energy: -0.61068629, angles: {a: 0.036598827389266925, b: 0.037922717916316545, c: 0.03659882738897827, d: 0.03659882738924472}\n", - "Iteration: 160 , Energy: -0.61070724, angles: {a: 0.03637048284031988, b: 0.03769100750248269, c: 0.03637048284002012, d: 0.036370482840297674}\n", - "Iteration: 161 , Energy: -0.61072792, angles: {a: 0.036143585962511354, b: 0.037460706417580175, c: 0.036143585962222696, d: 0.03614358596250025}\n", - "Iteration: 162 , Energy: -0.61074834, angles: {a: 0.035918127321499155, b: 0.037231806216053626, c: 0.035918127321199395, d: 0.03591812732146585}\n", - "Iteration: 163 , Energy: -0.61076851, angles: {a: 0.03569409755772571, b: 0.03700429849461387, c: 0.035694097557414844, d: 0.0356940975576924}\n", - "Iteration: 164 , Energy: -0.61078843, angles: {a: 0.03547149566778254, b: 0.03677817489234894, c: 0.03547149566747168, d: 0.035471495667738134}\n", - "Iteration: 165 , Energy: -0.61080810, angles: {a: 0.035250295784394675, b: 0.03655342711391665, c: 0.03525029578410602, d: 0.03525029578436137}\n", - "Iteration: 166 , Energy: -0.61082752, angles: {a: 0.03503049707730402, b: 0.03633004688313726, c: 0.03503049707700426, d: 0.03503049707725961}\n", - "Iteration: 167 , Energy: -0.61084670, angles: {a: 0.034812098563308164, b: 0.036108034271731176, c: 0.0348120985629973, d: 0.03481209856324155}\n", - "Iteration: 168 , Energy: -0.61086564, angles: {a: 0.034595082961152906, b: 0.03588737273404466, c: 0.03459508296086425, d: 0.03459508296108629}\n", - "Iteration: 169 , Energy: -0.61088434, angles: {a: 0.03437943324486872, b: 0.03566804598604803, c: 0.03437943324456896, d: 0.03437943324481321}\n", - "Iteration: 170 , Energy: -0.61090281, angles: {a: 0.034165148626230574, b: 0.03545005422254102, c: 0.034165148625930813, d: 0.03416514862615286}\n", - "Iteration: 171 , Energy: -0.61092105, angles: {a: 0.03395222024817893, b: 0.03523339748645596, c: 0.033952220247868065, d: 0.03395222024810121}\n", - "Iteration: 172 , Energy: -0.61093906, angles: {a: 0.033740647174307276, b: 0.03501805161578711, c: 0.03374064717402972, d: 0.033740647174251764}\n", - "Iteration: 173 , Energy: -0.61095684, angles: {a: 0.03353040483913264, b: 0.03480402476959679, c: 0.033530404838866185, d: 0.03353040483907713}\n", - "Iteration: 174 , Energy: -0.61097440, angles: {a: 0.033321500272376264, b: 0.03459129306752065, c: 0.03332150027210981, d: 0.03332150027230965}\n", - "Iteration: 175 , Energy: -0.61099175, angles: {a: 0.03311390923246274, b: 0.03437986455977474, c: 0.033113909232229594, d: 0.033113909232385025}\n", - "Iteration: 176 , Energy: -0.61100887, angles: {a: 0.03290763865381177, b: 0.034169723485499764, c: 0.032907638653534216, d: 0.03290763865371185}\n", - "Iteration: 177 , Energy: -0.61102579, angles: {a: 0.03270266461431462, b: 0.033960862086190785, c: 0.032702664614048166, d: 0.0327026646142036}\n", - "Iteration: 178 , Energy: -0.61104249, angles: {a: 0.032498993978224894, b: 0.03375327266884601, c: 0.03249899397794734, d: 0.032498993978080565}\n", - "Iteration: 179 , Energy: -0.61105898, angles: {a: 0.03229660311994112, b: 0.03354693988619753, c: 0.032296603119663564, d: 0.03229660311979679}\n", - "Iteration: 180 , Energy: -0.61107527, angles: {a: 0.032095498812212325, b: 0.033341863899038954, c: 0.03209549881194587, d: 0.0320954988120791}\n", - "Iteration: 181 , Energy: -0.61109135, angles: {a: 0.03189565774370787, b: 0.03313804472581108, c: 0.03189565774341921, d: 0.03189565774357464}\n", - "Iteration: 182 , Energy: -0.61110724, angles: {a: 0.03169708662253959, b: 0.03293545961460245, c: 0.03169708662228424, d: 0.03169708662243967}\n", - "Iteration: 183 , Energy: -0.61112292, angles: {a: 0.03149976242702293, b: 0.03273410871613694, c: 0.03149976242676758, d: 0.03149976242691191}\n", - "Iteration: 184 , Energy: -0.61113841, angles: {a: 0.03130368448542856, b: 0.03253399204056198, c: 0.0313036844851621, d: 0.03130368448529533}\n", - "Iteration: 185 , Energy: -0.61115371, angles: {a: 0.031108844719707124, b: 0.03233508724238546, c: 0.031108844719429568, d: 0.031108844719562795}\n", - "Iteration: 186 , Energy: -0.61116882, angles: {a: 0.030915238737416667, b: 0.032137394464426455, c: 0.030915238737150214, d: 0.03091523873728344}\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Iteration: 187 , Energy: -0.61118373, angles: {a: 0.030722854915010617, b: 0.03194090640388217, c: 0.030722854914744163, d: 0.03072285491487739}\n", - "Iteration: 188 , Energy: -0.61119847, angles: {a: 0.03053168534846709, b: 0.031745615778777575, c: 0.030531685348222842, d: 0.030531685348344967}\n", - "Iteration: 189 , Energy: -0.61121301, angles: {a: 0.03034172219574796, b: 0.03155151537334025, c: 0.030341722195470405, d: 0.030341722195603632}\n", - "Iteration: 190 , Energy: -0.61122738, angles: {a: 0.030152957642504058, b: 0.031358605190812044, c: 0.030152957642204298, d: 0.030152957642348627}\n", - "Iteration: 191 , Energy: -0.61124157, angles: {a: 0.029965383958363484, b: 0.031166870815446585, c: 0.02996538395804152, d: 0.02996538395819695}\n", - "Iteration: 192 , Energy: -0.61125558, angles: {a: 0.029778989963113928, b: 0.03097630159609724, c: 0.029778989962847474, d: 0.029778989962958496}\n", - "Iteration: 193 , Energy: -0.61126941, angles: {a: 0.029593774982561355, b: 0.0307868940690236, c: 0.029593774982306004, d: 0.029593774982417026}\n", - "Iteration: 194 , Energy: -0.61128308, angles: {a: 0.02940972450158333, b: 0.030598641225920625, c: 0.029409724501316875, d: 0.029409724501439}\n", - "Iteration: 195 , Energy: -0.61129657, angles: {a: 0.029226837858620153, b: 0.030411536079410967, c: 0.0292268378583537, d: 0.02922683785846472}\n", - "Iteration: 196 , Energy: -0.61130989, angles: {a: 0.02904510410530739, b: 0.030225571697328674, c: 0.029045104105040936, d: 0.02904510410515196}\n", - "Iteration: 197 , Energy: -0.61132305, angles: {a: 0.028864515811177688, b: 0.03004074119153924, c: 0.028864515810922337, d: 0.02886451581103336}\n", - "Iteration: 198 , Energy: -0.61133605, angles: {a: 0.028685065584954567, b: 0.02985703770623785, c: 0.028685065584710318, d: 0.028685065584810238}\n", - "Iteration: 199 , Energy: -0.61134888, angles: {a: 0.028506746073497707, b: 0.02967445442967334, c: 0.02850674607322015, d: 0.028506746073331174}\n" - ] - } - ], - "source": [ - "lr=0.01\n", - "num_result = tq.minimize(objective=O2,\n", - " gradient={\"method\":\"2-point\", \"stepsize\":1.e-4},\n", - " method='sgd', maxiter=200,lr=lr,\n", - " initial_values=0.1, silent=False)" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "num_result.history.plot('energies')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`tequila` currently offers `2-point` as well as `2-point-forward` and `2-point-backward` stencils as `method`.\n", - "The method can also be set to a python function performing the task. Here is an example which implements the same as `2-point`. The function can be replaced by any function with the same signature." - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "import copy\n", - "def my_finite_difference_stencil(obj, var_vals, key, step, *args, **kwargs):\n", - " \"\"\"\n", - " calculate objective gradient by symmetric shifts about a point.\n", - " Parameters\n", - " ----------\n", - " obj: Objective:\n", - " objective to call.\n", - " var_vals:\n", - " variables to feed to the objective.\n", - " key:\n", - " which variable to shift, i.e, which variable's gradient is being called.\n", - " step:\n", - " the size of the shift; a small float.\n", - " args\n", - " kwargs\n", - "\n", - " Returns\n", - " -------\n", - " float:\n", - " the approximated gradient of obj w.r.t variable key at point var_vals[key] as a float.\n", - "\n", - " \"\"\"\n", - " left = copy.deepcopy(var_vals)\n", - " left[key] += step / 2\n", - " right = copy.deepcopy(var_vals)\n", - " right[key] -= step / 2\n", - " return 1.0 / step * (obj(left, *args, **kwargs) - obj(right, *args, **kwargs))\n", - "\n", - "num_result = tq.minimize(objective=O2,\n", - " gradient={\"method\":my_finite_difference_stencil, \"stepsize\":1.e-4},\n", - " method='sgd', maxiter=200,lr=lr,\n", - " initial_values=0.1, silent=True)\n", - "num_result.history.plot('energies')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The `gradient` keyword can also be replaced by a dictionary of `tequila` objectives which evaluate to gradients approximations of it." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Bayesian optimization\n", - "\n", - "\n", - "[Bayesian optimization](https://arxiv.org/abs/1807.02811) is a method of global optimization, often used to tune hyperparameters in classical learning. It has also seen use in the optimization of [quantum circuits](https://arxiv.org/pdf/1812.08862.pdf). Tequila currently supports 2 different bayesian optimization algorithms: [Phoenics](https://github.com/aspuru-guzik-group/phoenics) and [GPyOpt](https://github.com/SheffieldML/GPyOpt), optimizers originally developed for optimizing expensive experimental procedures in chemistry. Click the links to get to the respective github pages, and download the optimizers before continuing this tutorial." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### GPyOpt\n", - "\n", - "GPyOpt can be used like any of our other optimizers. Like the GD and SciPy optimizers, it also takes a 'method' keyword. 3 methods are supported: `'lbfgs'`,`'DIRECT'`, and `'CMA'`. See the `GPyOpt` github for more info." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "As a reminder, we will optimize\n", - "Objective with 1 unique expectation values\n", - "variables = [a, b, c, d]\n", - "types = not compiled\n", - "\n", - "Expectation Value 0\n", - "Hamiltonian : (+1.0000Y(0)X(1)+0.5000X(1)-0.5000Z(0)X(1),)\n", - "variables : [a, b, c, d]\n", - "circuit:\n", - "\n", - " ┌───┐┌───────────────┐ ┌───────────────┐ \n", - "q_0: ┤ H ├┤ RY(f((a,))_0) ├─■─┤ RX(f((c,))_2) ├─■─\n", - " ├───┤├───────────────┤ │ ├───────────────┤ │ \n", - "q_1: ┤ H ├┤ RZ(f((b,))_1) ├─■─┤ RX(f((d,))_3) ├─■─\n", - " └───┘└───────────────┘ └───────────────┘ \n", - "c_0: ═════════════════════════════════════════════\n", - " \n", - "c_1: ═════════════════════════════════════════════\n", - " \n" - ] - } - ], - "source": [ - "print('As a reminder, we will optimize')\n", - "tq.draw(O1,backend='qiskit')" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Optimizer: \n", - "backend : qulacs\n", - "device : None\n", - "samples : None\n", - "save_history : True\n", - "noise : None\n", - "\n", - "method : lbfgs\n", - "Objective : 1 expectationvalues\n", - "num acquisition: 1, time elapsed: 0.22s\n", - "num acquisition: 2, time elapsed: 0.47s\n", - "num acquisition: 3, time elapsed: 0.73s\n", - "num acquisition: 4, time elapsed: 1.46s\n", - "num acquisition: 5, time elapsed: 1.67s\n", - "num acquisition: 6, time elapsed: 1.96s\n", - "num acquisition: 7, time elapsed: 2.39s\n", - "num acquisition: 8, time elapsed: 2.78s\n", - "num acquisition: 9, time elapsed: 3.20s\n", - "num acquisition: 10, time elapsed: 3.68s\n", - "num acquisition: 11, time elapsed: 3.83s\n", - "num acquisition: 12, time elapsed: 4.06s\n", - "num acquisition: 13, time elapsed: 4.24s\n", - "num acquisition: 14, time elapsed: 4.41s\n", - "num acquisition: 15, time elapsed: 4.59s\n", - "num acquisition: 16, time elapsed: 5.07s\n", - "num acquisition: 17, time elapsed: 5.25s\n", - "num acquisition: 18, time elapsed: 5.50s\n", - "num acquisition: 19, time elapsed: 5.69s\n", - "num acquisition: 20, time elapsed: 5.89s\n", - "num acquisition: 21, time elapsed: 6.14s\n", - "num acquisition: 22, time elapsed: 6.35s\n", - "num acquisition: 23, time elapsed: 6.53s\n", - "num acquisition: 24, time elapsed: 7.06s\n", - "num acquisition: 25, time elapsed: 7.42s\n", - "num acquisition: 26, time elapsed: 7.70s\n", - "num acquisition: 27, time elapsed: 7.97s\n", - "num acquisition: 28, time elapsed: 8.65s\n", - "num acquisition: 29, time elapsed: 9.12s\n", - "num acquisition: 30, time elapsed: 9.43s\n", - "num acquisition: 31, time elapsed: 9.79s\n", - "num acquisition: 32, time elapsed: 10.20s\n", - "num acquisition: 33, time elapsed: 10.57s\n", - "num acquisition: 34, time elapsed: 10.91s\n", - "num acquisition: 35, time elapsed: 11.37s\n", - "num acquisition: 36, time elapsed: 11.55s\n", - "num acquisition: 37, time elapsed: 11.80s\n", - "num acquisition: 38, time elapsed: 11.99s\n", - "num acquisition: 39, time elapsed: 12.16s\n", - "num acquisition: 40, time elapsed: 12.66s\n", - "num acquisition: 41, time elapsed: 13.06s\n", - "num acquisition: 42, time elapsed: 13.91s\n", - "num acquisition: 43, time elapsed: 14.20s\n", - "num acquisition: 44, time elapsed: 14.66s\n", - "num acquisition: 45, time elapsed: 15.16s\n", - "num acquisition: 46, time elapsed: 15.58s\n", - "num acquisition: 47, time elapsed: 15.93s\n", - "num acquisition: 48, time elapsed: 16.30s\n", - "num acquisition: 49, time elapsed: 16.83s\n", - "num acquisition: 50, time elapsed: 17.29s\n", - "num acquisition: 51, time elapsed: 17.50s\n", - "num acquisition: 52, time elapsed: 17.81s\n", - "num acquisition: 53, time elapsed: 18.09s\n", - "num acquisition: 54, time elapsed: 18.38s\n", - "num acquisition: 55, time elapsed: 18.86s\n", - "num acquisition: 56, time elapsed: 19.08s\n", - "num acquisition: 57, time elapsed: 19.25s\n", - "num acquisition: 58, time elapsed: 19.64s\n", - "num acquisition: 59, time elapsed: 19.92s\n", - "num acquisition: 60, time elapsed: 20.11s\n", - "num acquisition: 61, time elapsed: 20.47s\n", - "num acquisition: 62, time elapsed: 20.78s\n", - "num acquisition: 63, time elapsed: 21.10s\n", - "num acquisition: 64, time elapsed: 21.48s\n", - "num acquisition: 65, time elapsed: 21.73s\n", - "num acquisition: 66, time elapsed: 21.94s\n", - "num acquisition: 67, time elapsed: 22.19s\n", - "num acquisition: 68, time elapsed: 22.39s\n", - "num acquisition: 69, time elapsed: 22.90s\n", - "num acquisition: 70, time elapsed: 23.60s\n", - "num acquisition: 71, time elapsed: 24.06s\n", - "num acquisition: 72, time elapsed: 24.64s\n", - "num acquisition: 73, time elapsed: 25.01s\n", - "num acquisition: 74, time elapsed: 25.46s\n", - "num acquisition: 75, time elapsed: 25.89s\n", - "num acquisition: 76, time elapsed: 26.31s\n", - "num acquisition: 77, time elapsed: 26.85s\n", - "num acquisition: 78, time elapsed: 27.29s\n", - "num acquisition: 79, time elapsed: 27.60s\n", - "num acquisition: 80, time elapsed: 27.97s\n", - "GPyOpt optimization results:\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "best energy: -1.584212943157413\n", - "optimal angles: {a: 1.870128626698086, b: 5.887193501069059, c: 5.18274634095629, d: 1.5011709655643113}\n" - ] - } - ], - "source": [ - "### let's use the lbfgs method.\n", - "init={'a':0.25,'b':0.25,'c':0.25,'d':0.25}\n", - "### note: no lr is passed here! there are fewer tunable keywords for this optimizer.\n", - "result=tq.minimize(objective=O1,\n", - " method='lbfgs',\n", - " maxiter=80,\n", - " initial_values=init)\n", - "\n", - "print('GPyOpt optimization results:')\n", - "result.history.plot('energies')\n", - "result.history.plot('angles')\n", - "print('best energy: ',result.energy)\n", - "print('optimal angles: ',result.angles)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Don't worry, the plot's not broken!**\n", - "Perhaps you are looking at the plots above in horror. But, do take note: bayesian optimization is a global, exploratory optimization method, designed to explore large portions of parameter space while still seeking out optimality. Look at the optimal energy again, and one sees that the best performance of this optimization method matched that of all the gradient descent methods. We will apply gpyopt, next, to the QNG example circuit above, and see how bayesian optimization compares to QNG and SGD." - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Hey, remember me?\n", - "Objective with 1 unique expectation values\n", - "variables = [a, b, c, d]\n", - "types = not compiled\n", - "\n", - "Expectation Value 0\n", - "Hamiltonian : (+1.0000Y(0)X(1)Y(2),)\n", - "variables : [a, b, c, d]\n", - "circuit:\n", - "\n", - "0: ───Ry(0.5π)─────Rz(0.318309886183791*pi*f((a,))_0)───@────────────────────────────────────────────@───────\n", - " │ │\n", - "1: ───Ry(0.333π)───Rz(0.318309886183791*pi*f((b,))_1)───X───@───Ry(0.318309886183791*pi*f((c,))_2)───X───@───\n", - " │ │\n", - "2: ───Ry(0.25π)─────────────────────────────────────────────X───Rx(0.318309886183791*pi*f((d,))_3)───────X───\n", - "Optimizer: \n", - "backend : qulacs\n", - "device : None\n", - "samples : None\n", - "save_history : True\n", - "noise : None\n", - "\n", - "method : lbfgs\n", - "Objective : 1 expectationvalues\n", - "num acquisition: 1, time elapsed: 0.14s\n", - "num acquisition: 2, time elapsed: 0.45s\n", - "num acquisition: 3, time elapsed: 0.76s\n", - "num acquisition: 4, time elapsed: 1.04s\n", - "num acquisition: 5, time elapsed: 1.37s\n", - "num acquisition: 6, time elapsed: 1.67s\n", - "num acquisition: 7, time elapsed: 2.02s\n", - "num acquisition: 8, time elapsed: 2.40s\n", - "num acquisition: 9, time elapsed: 2.71s\n", - "num acquisition: 10, time elapsed: 2.96s\n", - "num acquisition: 11, time elapsed: 3.20s\n", - "num acquisition: 12, time elapsed: 3.43s\n", - "num acquisition: 13, time elapsed: 3.73s\n", - "num acquisition: 14, time elapsed: 4.06s\n", - "num acquisition: 15, time elapsed: 4.42s\n", - "num acquisition: 16, time elapsed: 4.63s\n", - "num acquisition: 17, time elapsed: 4.95s\n", - "num acquisition: 18, time elapsed: 5.30s\n", - "num acquisition: 19, time elapsed: 5.55s\n", - "num acquisition: 20, time elapsed: 5.88s\n", - "num acquisition: 21, time elapsed: 6.10s\n", - "num acquisition: 22, time elapsed: 6.31s\n", - "num acquisition: 23, time elapsed: 6.71s\n", - "num acquisition: 24, time elapsed: 7.04s\n", - "num acquisition: 25, time elapsed: 7.36s\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "best energy: -0.6123724356957851\n", - "optimal angles: {a: 0.0, b: 0.0, c: 0.0, d: 6.283185307179586}\n" - ] - } - ], - "source": [ - "print('Hey, remember me?')\n", - "tq.draw(O2)\n", - "### the keyword stop_count, below, stops optimization if no improvement occurs after 50 epochs.\n", - "### let's use a random initial starting point:\n", - "init={k:np.random.uniform(-2,2) for k in ['a','b','c','d']}\n", - "\n", - "gpy_result = tq.minimize(objective=O2,maxiter=25,method='lbfgs',\n", - " initial_values=init)\n", - "\n", - "gpy_result.history.plot('energies')\n", - "print('best energy: ',gpy_result.energy)\n", - "print('optimal angles: ',gpy_result.angles)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**In a very, very small number of steps, GPyOpt is able to match the performance of SGD with the QNG.**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**There's a few extras you can access if you are well-familiar with GPyOpt.** We return as part of `result` an attribute `result.gpyopt_instance`, which is an instance of the native `GPyOpt` `BayesianOptimization` object -- the one built and run during your optimization. It has some plotting features you can use. " - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "obj=gpy_result.gpyopt_instance\n", - "obj.plot_convergence()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If your function has 1 or 2 parameters (but no more) you can also see a plot of its acquisition function! see [here](https://www.blopig.com/blog/2019/10/a-gentle-introduction-to-the-gpyopt-module/) for more info!\n", - "\n", - "You can also extract the acquisition function of the model itself, and play with it (it takes ones object, an np array, as input), using:\n", - "\n", - "`acq=result.gpyopt_instance.acquisition.acquisition_function`" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Phoenics\n", - "\n", - "Finally, we turn to [`Phoenics`](https://github.com/aspuru-guzik-group/phoenics). This algorithm, originally developed within the Aspuru-Guzik group, can be accessed in the usual fashion. It's performance on the two-qubit optimization circuit is shown below. Note that the number of datapoints exceeds the provided __maxiter__; __maxiter__ here controls the number of parameter __batches__ suggested by phoenics. phoenics suggests a number of parameter sets to try out, per batch, that scales with the number of parameters (in a nonlinear fashion), so you may want to set maxiter lower if you are only playing around." - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "With phoenics we will optimize:\n", - "Objective with 1 unique expectation values\n", - "variables = [a, b, c, d]\n", - "types = not compiled\n", - "Phoenics config:\n", - "\n", - "{'general': {'auto_desc_gen': 'False', 'batches': 5, 'boosted': 'False', 'parallel': 'False'}, 'parameters': [{'name': a, 'periodic': 'True', 'type': 'continuous', 'size': 1, 'low': 0, 'high': 6.283185307179586}, {'name': b, 'periodic': 'True', 'type': 'continuous', 'size': 1, 'low': 0, 'high': 6.283185307179586}, {'name': c, 'periodic': 'True', 'type': 'continuous', 'size': 1, 'low': 0, 'high': 6.283185307179586}, {'name': d, 'periodic': 'True', 'type': 'continuous', 'size': 1, 'low': 0, 'high': 6.283185307179586}], 'objectives': [{'name': 'Energy', 'goal': 'minimize'}]}\n", - "phoenics has recieved\n", - "objective: \n", - "\n", - "Objective with 1 unique expectation values\n", - "variables = [a, b, c, d]\n", - "types = not compiled\n", - "noise model : None\n", - "samples : None\n", - "maxiter : 5\n", - "variables : [a, b, c, d]\n", - "passive var : {}\n", - "now lets begin\n", - "[TIME]: 0:00:00.001013 (overall)\n", - "***********************************************\n", - "energy = -0.29609650 , angles= {a: 6.237680912017822, b: 4.117485046386719, c: 1.029970407485962, d: 1.9295929670333862}\n", - "energy = -0.59038616 , angles= {a: 2.3871936798095703, b: 4.896121978759766, c: 2.3418636322021484, d: 0.12066761404275894}\n", - "energy = -0.26690391 , angles= {a: 5.304489612579346, b: 3.034426689147949, c: 3.76320219039917, d: 0.8069871664047241}\n", - "energy = +0.43135729 , angles= {a: 3.035806179046631, b: 0.9094901084899902, c: 5.705395221710205, d: 5.713986873626709}\n", - "energy = -0.27043020 , angles= {a: 1.9153386354446411, b: 5.5784382820129395, c: 3.728203535079956, d: 4.011273384094238}\n", - "energy = -0.40218865 , angles= {a: 5.176544666290283, b: 5.341585636138916, c: 5.676353931427002, d: 4.678478717803955}\n", - "energy = +0.30506690 , angles= {a: 2.712526798248291, b: 4.21279239654541, c: 4.61173152923584, d: 6.0248637199401855}\n", - "energy = -0.08816349 , angles= {a: 5.385326385498047, b: 5.44980001449585, c: 2.605787992477417, d: 2.9794654846191406}\n", - "energy = +0.32159788 , angles= {a: 1.376722812652588, b: 2.962172269821167, c: 2.562309980392456, d: 2.237804412841797}\n", - "energy = +0.66997147 , angles= {a: 2.3023128509521484, b: 3.7119622230529785, c: 2.8415794372558594, d: 2.4819388389587402}\n", - "Quantum Objective evaluations: 0.022472858428955078s Wall-Time\n", - "==========\n", - "\u001b[0;37m[INFO] Acquisition ... starting process for 0 ...\n", - "\u001b[0m\u001b[0;37m[INFO] Acquisition ... starting process for 1 ...\n", - "\u001b[0m[TIME]: 82.91020917892456 (optimizing proposals)\n", - "[TIME]: 0:01:31.765821 (overall)\n", - "***********************************************\n", - "energy = +0.36786933 , angles= {a: 2.0853826999664307, b: 4.634885787963867, c: 2.061150550842285, d: 0.26250821352005005}\n", - "energy = +0.01851594 , angles= {a: 0.003306345082819462, b: 1.980368971824646, c: 0.30129608511924744, d: 1.9018864631652832}\n", - "energy = -0.73104112 , angles= {a: 2.4472453594207764, b: 5.115787029266357, c: 2.1066818237304688, d: 0.43426579236984253}\n", - "energy = -0.41926522 , angles= {a: 0.10517703741788864, b: 3.627812385559082, c: 0.04848513379693031, d: 1.2869781255722046}\n", - "energy = -0.87322996 , angles= {a: 2.5099880695343018, b: 5.172698497772217, c: 2.082657814025879, d: 0.38423633575439453}\n", - "energy = -1.49111438 , angles= {a: 0.00037171694566495717, b: 2.5451977252960205, c: 0.4486967623233795, d: 1.4575597047805786}\n", - "energy = -0.14131340 , angles= {a: 2.2483391761779785, b: 5.067838668823242, c: 2.0422258377075195, d: 0.401293009519577}\n", - "energy = -0.44592199 , angles= {a: 0.15016400814056396, b: 3.554527759552002, c: 0.04311426728963852, d: 1.2492430210113525}\n", - "energy = -0.28994584 , angles= {a: 2.499864339828491, b: 4.610923767089844, c: 2.253262996673584, d: 0.42330190539360046}\n", - "energy = -0.23522167 , angles= {a: 0.08437494933605194, b: 2.5218212604522705, c: 0.10680994391441345, d: 1.9883257150650024}\n", - "Quantum Objective evaluations: 0.02498912811279297s Wall-Time\n", - "==========\n", - "\u001b[0;37m[INFO] Acquisition ... starting process for 0 ...\n", - "\u001b[0m\u001b[0;37m[INFO] Acquisition ... starting process for 1 ...\n", - "\u001b[0m[TIME]: 29.99247694015503 (optimizing proposals)\n", - "[TIME]: 0:00:39.753281 (overall)\n", - "***********************************************\n", - "energy = -1.01252001 , angles= {a: 0.0462680421769619, b: 2.7883026599884033, c: 0.03881902992725372, d: 1.1791245937347412}\n", - "energy = -1.22907347 , angles= {a: 4.0027337074279785, b: 0.09763965010643005, c: 0.7208928465843201, d: 3.698227643966675}\n", - "energy = -1.01233697 , angles= {a: 0.029933353886008263, b: 2.7854623794555664, c: 0.06852176785469055, d: 1.1778004169464111}\n", - "energy = -1.22907347 , angles= {a: 4.0027337074279785, b: 0.09763965010643005, c: 0.7208928465843201, d: 3.698227643966675}\n", - "energy = -0.88516505 , angles= {a: 0.022830920293927193, b: 2.727048635482788, c: 0.16732501983642578, d: 1.1276936531066895}\n", - "energy = -0.55817715 , angles= {a: 4.064866542816162, b: 1.30270516872406, c: 4.971987247467041, d: 1.681876540184021}\n", - "energy = -1.19048299 , angles= {a: 0.11043459922075272, b: 2.793375253677368, c: 0.01577768288552761, d: 1.239717721939087}\n", - "energy = -0.55817715 , angles= {a: 4.064866542816162, b: 1.30270516872406, c: 4.971987247467041, d: 1.681876540184021}\n", - "energy = -1.41154797 , angles= {a: 0.15773962438106537, b: 2.832333564758301, c: 0.01315511018037796, d: 1.3356469869613647}\n", - "energy = +1.09178703 , angles= {a: 4.163552284240723, b: 0.2528429329395294, c: 1.9030687808990479, d: 6.191180229187012}\n", - "Quantum Objective evaluations: 0.025141477584838867s Wall-Time\n", - "==========\n", - "\u001b[0;37m[INFO] Acquisition ... starting process for 0 ...\n", - "\u001b[0m\u001b[0;37m[INFO] Acquisition ... starting process for 1 ...\n", - "\u001b[0m[TIME]: 48.34318137168884 (optimizing proposals)\n", - "[TIME]: 0:01:00.187099 (overall)\n", - "***********************************************\n", - "energy = -0.98060805 , angles= {a: 0.21618297696113586, b: 2.6016123294830322, c: 0.2853825092315674, d: 1.219753384590149}\n", - "energy = -0.25808323 , angles= {a: 3.4333252906799316, b: 6.278115749359131, c: 3.4610934257507324, d: 5.684024333953857}\n", - "energy = -1.05799937 , angles= {a: 0.11564324796199799, b: 2.6404154300689697, c: 0.3493330180644989, d: 1.1831600666046143}\n", - "energy = -0.25808323 , angles= {a: 3.4333252906799316, b: 6.278115749359131, c: 3.4610934257507324, d: 5.684024333953857}\n", - "energy = -0.98552410 , angles= {a: 0.007972335442900658, b: 2.642519950866699, c: 0.37203270196914673, d: 1.1596922874450684}\n", - "energy = -0.94007391 , angles= {a: 5.723466396331787, b: 6.273910999298096, c: 2.6695010662078857, d: 3.162034749984741}\n", - "energy = -0.98552410 , angles= {a: 0.007972335442900658, b: 2.642519950866699, c: 0.37203270196914673, d: 1.1596922874450684}\n", - "energy = -0.94007391 , angles= {a: 5.723466396331787, b: 6.273910999298096, c: 2.6695010662078857, d: 3.162034749984741}\n", - "energy = -1.03289837 , angles= {a: 0.08608753234148026, b: 2.6485812664031982, c: 0.37535393238067627, d: 1.1694862842559814}\n", - "energy = -0.31476750 , angles= {a: 1.627071499824524, b: 6.256295204162598, c: 3.108327627182007, d: 6.261186599731445}\n", - "Quantum Objective evaluations: 0.024885892868041992s Wall-Time\n", - "==========\n", - "\u001b[0;37m[INFO] Acquisition ... starting process for 0 ...\n", - "\u001b[0m\u001b[0;37m[INFO] Acquisition ... starting process for 1 ...\n", - "\u001b[0m[TIME]: 68.03577494621277 (optimizing proposals)\n", - "[TIME]: 0:01:20.377163 (overall)\n", - "***********************************************\n", - "energy = +0.00793908 , angles= {a: 0.05368649587035179, b: 2.886265516281128, c: 0.5431649684906006, d: 0.9369292855262756}\n", - "energy = -0.13862884 , angles= {a: 0.7798250913619995, b: 4.2954206466674805, c: 5.3001627922058105, d: 5.039661884307861}\n", - "energy = -1.47627820 , angles= {a: 0.0034380992874503136, b: 2.746985673904419, c: 0.3536768853664398, d: 1.4768966436386108}\n", - "energy = -0.13862884 , angles= {a: 0.7798250913619995, b: 4.2954206466674805, c: 5.3001627922058105, d: 5.039661884307861}\n", - "energy = -1.49312955 , angles= {a: 0.0, b: 2.70723295211792, c: 0.2528174817562103, d: 1.4755951166152954}\n", - "energy = -0.60500240 , angles= {a: 0.7093976736068726, b: 0.5523882508277893, c: 1.441382646560669, d: 2.139066696166992}\n", - "energy = -1.49312955 , angles= {a: 0.0, b: 2.70723295211792, c: 0.2528174817562103, d: 1.4755951166152954}\n", - "energy = +0.20032241 , angles= {a: 6.004479885101318, b: 4.0001044273376465, c: 6.148054599761963, d: 5.081597328186035}\n", - "energy = -1.48791277 , angles= {a: 0.0, b: 2.645176887512207, c: 0.2961067259311676, d: 1.5270349979400635}\n", - "energy = +0.20032241 , angles= {a: 6.004479885101318, b: 4.0001044273376465, c: 6.148054599761963, d: 5.081597328186035}\n", - "Quantum Objective evaluations: 0.02483844757080078s Wall-Time\n", - "best energy after 5 iterations : -1.49312955\n", - "Phoenics optimization results on 2 qubit circuit:\n" - ] - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXwAAAD4CAYAAADvsV2wAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nOydd3hb5dnG71dbsi3vPeIkzp7ODiaQQMgACoEApWxKC/0IFCijCaOljJKW1cEqs6WshJWEEgghhJBBJs52nDjb8p6yrS293x/SkTXO0V623991cREfnfHakp7znGfcD6GUgsFgMBj9H1G8F8BgMBiM2MAMPoPBYAwQmMFnMBiMAQIz+AwGgzFAYAafwWAwBgiSeC/AF1lZWbS0tDTey2AwGIw+w549e1oopdl8ryW0wS8tLcXu3bvjvQwGg8HoMxBCTgu9xkI6DAaDMUBgBp/BYDAGCMzgMxgMxgAhoWP4DAaj/2M2m1FbWwuDwRDvpfQpFAoFioqKIJVKAz6GGXwGgxFXamtrkZKSgtLSUhBC4r2cPgGlFK2traitrcXgwYMDPo4ZfAYjgVlVqcGz66pR16FHQZoSD84fgUXlhfFeVkQxGAzM2AcJIQSZmZlobm4O6jhm8BmMBGVVpQbLPjsAvdkKANB06LHsswMA0O+MPjP2wRPK34wlbRmMBOXZddVOY8+hN1vx7LrqOK2I0ddhBp/BSFDqOvRBbWf0LS6++GJ0dHTE9JospMNgJCgFaUpoeIx7QZoyDqtJHPpKXsNisUAiETaxa9eujeFq7DAPn8FIUB6cPwJKqdhtm1IqxoPzR8RpRfGHy2toOvSg6M1rrKrUhH3u9957D9OmTcPEiRNxxx13wGq1Ijk5GY888ggmTJiAGTNmoLGxEQDQ3NyMxYsXY+rUqZg6dSq2bt0KAHj88cdx4403oqKiAjfeeCN0Oh2uueYajB49GldccQWmT5/ulIspLS1FS0uL4LWtVituueUWjB07FuPGjcOLL74Y9u/IPHwGI0HhvNZ7V+wFABQmsDcbSX7+rx+9tl06Ph83zizFX78+wpvXePyLQ1hUXoi2HhP+7709bq+vuGOm32tWVVVhxYoV2Lp1K6RSKe688068//776OnpwYwZM/D000/joYcewhtvvIFHH30U99xzD+677z6ce+65OHPmDObPn4+qqioAwOHDh7FlyxYolUo899xzSE9Px+HDh3Hw4EFMnDgx4GuPGTMGGo0GBw8eBICIhH8iYvAJIW8DuBRAE6V0LM/rBMDfAVwMQAfgFkrpT5G4NoPRn1lUXug0+FuXXhDn1cSf+k7+5qwOnTms827YsAF79uzB1KlTAQB6vR45OTmQyWS49NJLAQCTJ0/G+vXrAQDffvstDh8+7Dxeq9Wiu7sbAHDZZZdBqbSH3bZs2YJ77rkHADB27FiMHz8+4Gv/7Gc/w4kTJ3D33Xfjkksuwbx588L6HYHIefj/BvASgHcFXl8IYJjjv+kAXnX8n8Fg+IBSGu8lxBxfHrlQXqPQkdfISJIF5NF7QinFzTffjGeeecZt+3PPPecsfxSLxbBYLAAAm82G7du3Q6FQeJ0rKSkpItcGgH379mHdunV47bXXsHLlSrz99ttBnduTiMTwKaU/AGjzscvlAN6ldrYDSCOE5Efi2gxGf4YQghtnDEK6KvD2+f5MtPIaF154IT755BM0NTUBANra2nD6tKDKMObNm4d//vOfzp/37t3Lu19FRQVWrlwJwB7qOXDgQMDXbmlpgc1mw+LFi/HUU0/hp5/CD4rEKoZfCOCsy8+1jm31njsSQm4HcDsAlJSUxGRxDEYio5SJveLWAxUufxHpKp3Ro0fjqaeewrx582Cz2SCVSvHyyy8L7v+Pf/wDS5Yswfjx42GxWHDeeefhtdde89rvzjvvxM0334zRo0dj5MiRGDNmDFJTUwO6tlKpxK233gqbzQYAvE8AwUIi9chICCkF8D+BGP7/ACynlG5x/LwBwO8ppT6nm0yZMoWyASiMgUyHzoTfvLcHN80sxcXj+udDcVVVFUaNGhXvZUQFq9UKs9kMhUKB48ePY+7cuaiuroZMJovI+fn+doSQPZTSKXz7x8rD1wAodvm5yLGNwWD4oMtgwfYTbVg8qSjeS2GEgE6nw5w5c2A2m0EpxSuvvBIxYx8KsTL4awDcRQj5CPZkbSel1Cucw2Aw3DFa7KGcF9YfxcJx+UiWs0rqvkRKSkpCjWmNVFnmhwBmA8gihNQC+CMAKQBQSl8DsBb2kswa2Msyb43EdRmM/o7BbI/f1nca0Kk391uDTyllAmpBEko4PiKfHkrpL/y8TgEsicS1GIyBBOfhA4De1D8TtwqFAq2trcjMzGRGP0A4PXy+slBf9E93gcHoJ4hcDKChn1bqFBUVoba2Nmht94EON/EqGJjBZzASmPKSdLx323Tc8NaOfluaKZVKg5raxAgdJp7GYCQ4Spn9a9pfQzqM2ME8fAYjgdl0tBkvb6zBlt/PQVG6Kt7LYfRxmIfPYCQwDZ167DzZxpKZjIjADD6DkcAYLfayzKe/PIztJ1rjvBpGX4cZfAYjgeEqc9YeaEBVvTbOq2H0dZjBZzASGKOj8QpAv63SYcQOZvAZjAQmI1mGMQVqEAIYWJUOI0yYwWcwEpjrpw/Cl7+dBaWUSSQzwocZfAajD6BWSGEbeMOvGBGG1eEzGAnMC+uP4qCmE9sfvjDeS2H0A5iHz2AkMKdaenCiuTvey2D0E5jBZzASGKPFCrlEjBfXH8XLG2vivRxGH4cZfAYjgTFabFBIRfjxeCu2HGuJ93IYfRxm8BmMBMZgtnv4CpkYOlalwwgTlrRlMBKYkXlqiEUEte06NHYyg88ID2bw+xirKjV4dl016jr0KEhT4sH5I7CovDDey2JEiccvGwMAuPejSlaHzwgbZvD7EKsqNVj22QHnF1/Toceyzw4AADP6/ZzMZDnUSvZ1ZYQH+wT1IZ5dV+3l5enNVjy7rpoZ/H7K1a9tw+RBGXjs0tHxXgqjH8CStn2Iug59UNsZfZ+TLTp06s3xXgajn8AMfh+iIE0Z1HZG38dosUIhFWHtgXrc8s5OmK02/wcxGAIwg9+HeHD+CMgl7m+ZUirGg/NHxGlFjGhjNNsgl4hR16HH99XNLHHLCAsWw+9DcHF6VqUzMLDZKExWG+QSERRSMQC7RLJaIY3zyhh9FWbw+xA1Td2w2CjW3XcefjjajC01LczY92MsNop5o3MxLDfZOQiFefiMcGAhnT7EukMNeODjfTBbbDjV2oMPdpxBU5ch3stiRAmZRITXb5qCS8cXQCVzePhmFsNnhA4z+H2I3afaMCwnGelJMswqywYAbKthg60HAmkqGYZkJ8V7GYw+DjP4fQSbjWLP6XZMKU0HAIwuUCNNJcVmJqjVbznbpsOkJ9fjy/31mDk0E9/dPxsj8lLivSxGH4YZ/D7CsaZuaA0WTBmUAQAQiwgqhmZhS00zKGWjkPojerMVbT0mULD3lxEZImLwCSELCCHVhJAaQshSntdvIYQ0E0L2Ov77VSSuO5A4VNcJAE4PHwBmj8jGoIwkaPWWeC2LEUW4RK1cIkZtuw7X/OtHJpHMCIuwq3QIIWIALwO4CEAtgF2EkDWU0sMeu66glN4V7vUGKldOKsK5w7KQnSx3brt6SjGunlIcx1UxoonRYq/IkUtEoBTYebINDVqWpGeETiQ8/GkAaiilJyilJgAfAbg8AudleJCTogAhxGs7ZxgY/Qujxe7hK6RiZx0+K8tkhEMkDH4hgLMuP9c6tnmymBCynxDyCSFE0C0lhNxOCNlNCNnd3NwcgeX1fRo6DfjNf/fgoKbT67XXfziOaU9vYC33/ZCMJBkWTSxAToocCqn9q2owMYPPCJ1YJW2/AFBKKR0PYD2A/wjtSCl9nVI6hVI6JTs7O0bLS2x2nWrD14cawJebLclQoVNvRuWZjtgvjBFVRuWr8bdry1GalcQ8fEZEiITB1wBw9diLHNucUEpbKaVGx49vApgcgesOGHafaoNKJsaofO+SvJlDsyAiwJZj7GmoPyMVizChOA2ZybJ4L4XRh4mEwd8FYBghZDAhRAbgWgBrXHcghOS7/HgZgKoIXDeqrKrUoGL5dxi89EtULP8Oqyo1/g+KErtOtaO8JA0SsffblaqUYnxRGrbUsOqN/saKXWcw8rGv0NBpT9SuXlKB66cPivOqGH2ZsA0+pdQC4C4A62A35CsppYcIIU8QQi5z7PZbQsghQsg+AL8FcEu4140m3GQpTYceFL2TpeJh9LsMZhxp0Drr7/mYNSwL+2o7oTUw3fT+hN5khcFsg0zC2mUYkSEi4mmU0rUA1nps+4PLv5cBWBaJa8WCRJos1dxlxNjCVEwfLGzwF47Nh1oh5Y3xM/ouvVU6doN/+7u7UZqVhIcvHhXPZTH6MEwtk4dEmiw1JDsZa+461+c+owvUGF2gjtGKGLGCE0qTOUJ5Z9p08VwOox/AnhV5SKTJUjZbYG57h86EDVWNUV4NI5YYLVZIRMSZu1HKxKxKhxEWzODz8OD8EVA6yuA44jFZymy1YerT3+KdrSf97vv4mkO47T+7EyLJzIgME4rTcMOM3iStUiqGgRl8RhiwkA4PXJz+oU/2w2S1QSUT489XjIt5/P5wnRatPSZkp8h97reqUoOvDjYAgFuSGQAbkNKHmT8mD/PH5Dl/VkrFLDHPCAvm4QuwqLwQWY6a50kl6XExnLtPtwOAzwodwJ5k5hJ8HFySmdF3MVlsbiG9sYWpGFeYGscVMfo6zMMXwGK1obHL3ivW2mOK6bVXVWrw7LpqaDr0EIsItp9o9XnDSaQkMyNy3P/xPhzUdGLjA7MBAPddNDy+C2L0eZjBF6BDb0ZWsgxL5pThxhnhNbtwBjyQweNcDwCXnLPaqN/wTEGaEhoe4x6PJDMjchjNVshZDT4jgrBPkwBZyXLseHgubppZyqtQGSjBNnH56gEQIlGSzIzIYrDYIHd5X1/bdBxznvs+fgti9HmYwfdDTVMXfrdyL040d4d0fLAGPJTwzKLyQjxz5TgUpilBABSmKfHMlbFPMjMii6eHrzNZcbKlJ+BSXQbDE2bwBfh0Ty1+/e5uaA0WfPaTBjVNoRn8YA14qD0Ai8oLsXXpBXjn1qlYVF7AjH0/wGixOVUyATif4jwT9AxGoDCDL8C+2g7sPNmGkgwVgNAToMEa8HDDM/vOduKV74+z8r1+wJWTCnHp+F7dQaVDYoE1XzFChRl8Aeo69MhPVSAzSQaZRIT6ztBGywVrwBeVF+LPi8aCyxoEG56ZUpoOSoGfHCWdjL7LTTNLcY3LCEuljGniM8KDVekIoOkw2GPihKBQoAomEBaVF8JgtmKpo9JGrZDgicvH+jTgE0rSQAH8ZfE4/HxqSVDXm1icBrGIYPepdswekRPSmhmJQVuPCUqp2GnoB2UmYeHYPEhEoRcRMAY2zMMXgCuhBICh2UlhVepMGpTu/HdFWZZfb/1gnRaAvdEmWJLkEozOV2P36bagj2UkFhe9sAlPfXnY+fOMIZl49YbJyFUr4rgqRl+Gefg8mCw2lGYlYXhuMgDgzZunhnU+Lv5/ybh8zBqW5Xf/g5pOyMQiDM/1nnAVCFNK07HrVBsopWHdqBjxxWixQS4R+9+RkbAE04MTyv7Bwgw+DzKJCKuXVETsfFz8/5FLRgXUDHXNlGKUF6dByjPhKhAeu2Q0ROyxv89jtFghl/Z+BvbXduCmt3fi5esmoaLMv+PAiC+eTZT+NK6C3T8UWEgnALafaMUvXt+O+s7Q4vh1HXqICJCTIkdTlwHNXUaf+5flJGPhuHyf+/iCGfu+j9VGYbZSKFw8fLGIoENnRrfREseVMQIl2B6cUJoug4UZfB5WVWpw6T83o82hoWOy2PDjiVbUtodm8IfnpuAX00pgstow488b8N7204L7NncZsapSgw5dePo9j646gKWf7g/rHIz4YbTYv/iuHj5X7cUkkvsGwfbgxEITixl8Ho43d+NwnRZqhT3iVZBmT5KF+of/2YQCPH3FOKhkEpTlJGN/bYfgvttPtOLeFXtDvrlw6IxWfFvVCMrmHvZJRITgoQUjMM1ltKWzLNPEDH5fINgenFgMXmIGnwdNhx55aoVz0lB+qtK5PRRcv6Dji9Kwv7ZT0BAfrOuEVExCTthyTCnNQEu3Cadb2Vi8vohCKsads8swqaS3wovz8Fkdft8g2B6cWGhiMYPPQ12HHvkud9UkuQRpKinqO4JvvqKUYsIT3+A5RxxuQlEqWntMgjePg5pOjMhLgSxMlcQppXZDsesUK8/si5gsNpxt07k5C0qZGIsnFWFIdnIcV8YIlEXlhXjkkt6B8/6aKDlNLO67Hw1NLGbweajvNHg9Rk0rzUCaShr0uVp7TDBZbM5hKuOL0gAAB2o7vfallOKgRhuRIRdl2clIVUqxh3Xc9klOtvRg1l834rsjTc5tcokYz18zAecPz47jyhjBMKZADQCQS0TYuvQCv8Z7UXkhRualYPaI7ID2DxZWlslDeXGaW7MUALx+05SQzsU9FXBPDCPzU/D81RO8zg8Ate16dOrNITVceSISEVw7rRjZyb7HIzISEy5pq5B6+2Ssv6LvoHM8oT1/zYSAj1m2cBSk4ui8v8zg8/C3a8sjdq46RylnocPgyyViLJ5cxLtvUboSPy67ACppZN6WZQtH+d+JkZAYzHZFTM/Gqxl/3oC5o3Pw1KJx8VgWI0h6HCW0pZlJAR8zc2hmtJbDQjqBsnqvBrOf3eh8AwOFq+zJT+1th9d06LFy11kvXXNCCPJTlUgNIXQkhMFsRaeOKWf2NfjKMgF7Lb7exOSR+wo9Jru9+GJ/XcDHbKxuwsmWnqishxl8D746UI/JT67HcZ6BJ6dadUE3X40tTMUd5w9BRpLMuW3rsRY89Ol+nGx1f1Nf+b4Gq/fyT8IKBbPVhilPfYtXNtVE7JyM2GB0ePgKDw9fKROzOvw+RI/R/l69s/VUQPtTSnHbv3fh0z21UVkPM/geaDr0aO0xIdPFQAO9tbCaICt1ppZmYNnCUW4x1/HF9hi9az0+pRRv/HAC22paQ126F1KxCMNzk7H7FEvc9jWG56bgT5eNcfaAcCilYlaW2Yf42YQCTBucEfBsYqPFBhsFVPLoaCgxg+9BXYcBKpkYqUr3sApn8INtvqpt10Fncg8DlWUnQykVY9/Z3kodTYce7TozxhaFn7B1ZWppBg7UdjKvsI9RkqnCzeeUItMj6a6UilnjVR8iVSlFeUlawFPKuJBxkiw66VVm8D3gVOo8qyByU+QQEaA+SIN/9Ws/4rFVh9y2ScQijC1Uu3n4BzV24x+JkkxXLFYbTFYbRj32NSqWfyc4PJ2RWLR2G3GkQQuL1d1QXDI+H/PH5MZpVYxg2VrTgtWVdTBZbDBb/Rt9rqpHJWMefkyo69TztjJLxCJcPC4fhemBtzlbrDY0ag0oTPPWLx9flIbD9b1f6AOaTohFBCPzwuuwdWVVpQbv7zwDAKDoVd9jRj/xWbOvDgv+ttlLKO3mc0pxS8XgOK0q/qyq1KBi+XcYvPTLPuHA/G9/HRq09jCwzuj/yYx7v5Pl0fHwI3JWQsgCAH8HIAbwJqV0ucfrcgDvApgMoBXAzymlpyJx7UhzwcgcZAnUrr903aSgztXYZYSNwq1rl+OO84dgyZwyp3xDh86M0flqt6HV4fLsumpneR8Hp77HhpwnNkJlmRarDUaLDUlRMgiJTCzkgyNNj9GKrGQ5vr53FlIU/t+z4gwVPvjVdAyPoOPnStifGkKIGMDLAC4CUAtgFyFkDaX0sMtutwFop5SWEUKuBfAXAD8P99rR4N65w32+HkzTCxfv53tiyElx9/qfvmIcrLbICp3FQn2PER2cZZkeyb7HVh/Ehqom7HxkbjyWFVd8yQcnqsHXmSzISZELOpGeJMslOCeKsw4iEdKZBqCGUnqCUmoC8BGAyz32uRzAfxz//gTAhSQBWwXNVpvP5Oar3x/HxCfWB6xA6TT4qfwj6d7ZetJNKlkcYR37WKjvMaKD0WKDTCzymm2gGMBVOn3RgekxWtHaY8Rz66pR2+5fyPBsmw5f7KtDlyE6vTORMPiFAM66/Fzr2Ma7D6XUAqATAG87GSHkdkLIbkLI7ubm5ggsL3B2nWzDyMe+xo4T/KWRKpkYnXozWnsC06ofV5iKP/5sNIrSVbyvb6hqwoc7z2DT0Wb84vXtIatxChEL9T1GdDCYrbylfErpwK3D74sOTI/JAq3egpc21uBMAMq1O0624e4PK9Hek7gGP6JQSl+nlE6hlE7Jzo6tSFSdYxRhnoBHznXLBupRDMlOxq0Vg5065p6ML0pFdUMXttW0YMfJVmSoZLz7hQqnvsf1FGQnyyOuvseIDosmFuKpK8Z6bVdKxTBbaUAVH/0NPgdGKiYJ7cC8+8tpePUGe+6vJ4ByWq6EOymB6/A1AIpdfi5ybOPdhxAiAZAKe/I2oeAMuZDBD7YW/1BdJ862Cd/VxxelwWKjWLn7LMpykgVvDOGwqLwQ/71tOgDgicvHMGPfR5hQnIbLJ3q/V84hKAPQy19UXohlC0cgP1UBAkAhEeGScfkJ/ZlOU8lQkmF/wg9EloWr0olWUj4SZ90FYBghZDDshv1aANd57LMGwM0AfgRwFYDvaAKOYqrr0CMrWe5VGcFR6DT4gXXbPvjxfuSq5Xjn1mm8rzdo7TeOdp0ZBrMNqyo1Ufnwcjcwbpg6I/E52tgFs9WGMQXufRnlJem458JhkAzQucX7arWw2ChOPHMxACS8aug/Nhxz2o0ek3+DrzNaISLeyfpIEfZZHTH5uwCsA1AFYCWl9BAh5AlCyGWO3d4CkEkIqQHwOwBLw71uNNB06Hlr5jnSVFJcO7UYQ7IDU76rF6jpB+wlZn/56ojzZ73ZGrUa+XSVFDKJyFkPzEh8/vp1NR742Hsm8eRB6bjvouFQRakTM9HZfqIVUwalgxACQggopfj6YH1ACdFYQynFPzYcczZYBuLh95gsSJJJonYji8inhlK6FsBaj21/cPm3AcDVkbhWNFk0sdBnaSQhBMsXjw/oXHqTFe06s6DBt5eYxaZGnhCCd26Z6ny0ZCQ+RouVVwvfZLGhQ2dCmkoW9lS0vsbZNh00HXrcft4Q57bmLiPu+WgvFo7Ni6iseSQwWmyw2Chy1AocfmK+V/6BjzvOG4ory/nl0yPBwPrE+GHx5CJcM7XY5z6UUmgDKJnidPA9xa+cr8e4xKyiLAvFzOD3GYxmG+9j/daaFkz78wYcqvOemNbf+dFRPeeqF5+jVuBXswZj1d46N6mSRICTSUiWS6AK0GvPS1VgXIT1tFxhBt+ByWLDqZYemPyIHD38+UHMfX6T3/P16uDHb0K9K4fqOiMqvcyILkaLlTeXpBjAg8y3n2hFRpIMw3LcZ/r+5vyhSJKJcdWrPwYluRBtmQYuhKOSifHi+qP4vNK/5PH6w4349nBjRNfhCjP4Do41dWH2c99jQ5XvP3auWo7mbqPfG8PofDVeu2EyRuWpeV+PdY38F/vq8eDH+wNuGosEfU33JJEwWvg9fK5KZyDW4t9+3hD8ZfF4L095Q1UTTA6RwEA1oziZBk2HPmo6U5yHnySXYNVeDTZV++8remPzCby55UTE1uAJM/gOuNmz/jzsglQlKAUa/SRAM5PlWDA2T3B6FVcjX5imBEF0JtS7kp+qgMlqQ1uATWPhEosvVH/mDz8bjf+bPdRrO+ckeGokDQRG5qlx0WhvpdBn11XDbHV3ZLh8mBC+ZBoixfDcZBx+Yj7mjsqFSiYJuA4/WtLIAJtp66Q35u7H4DsHoeh9xsR3nWoDpcC0wRmC+ywqL4xZDXGuurc001NjPRr0Rd2TROKcofx6Kpxs7kDTxN9zug31nQYsGJPnFBzkCCUfFoscGiHEWU2VLBcHVqVjtEKVFT2zzDx8B5oOPWRikdekK0+4JKy/UYf/2HAMT3952Oc+sYTrEm6IUS1+X9Q9SSQ2HW1GTVOX1/b0JBmWLRyJsRGem5DovLf9DB5fc4hXbyqUfFgscmgHNZ144ovDaOoyBOzh9xgtSI5Sly3ADL6Tug4D8tMUXmJVnhSkKfHbC8owLMe3fCk3SCVRcBr8GNXi90Xdk0Tizvf24KOdZ722J8sluOP8oRgRJfncRIRSih+Pt2L6kEzeSpdQ8mH2Y9zNX6RzaNUNXXh760noTVYkyyWwBaCGqzNZo9pjwUI6Dn4xrRjzeOKDniikYvxunu8PBaUUdR0GnD88J1LLC5usZDm+/O25GJQZWNNYuDw4f4SbdjnAhNuCwWCxQc5Thw8Ap1p6kKyQBCy529c53apDg9aAGUN49RadIcLlXx1Bg9aAVKUUf7rMt4zIovJC6M0WLPvsIAB7Du3B+SMiGm7kdHFUMgleuq48oLLMr+6ZFdGZGJ4wD9/BOUOz8LMJBQHt26Ez4XRrj+DrnXoz9GarYA1+PBCJCMYUpEZtko4nXFLaVQLA35eQYcditcFqo4ISH/Ne/AFvbzkZ41XFD2f9vYDBB+yft+8fnA3APlwokM/ZnBG9Dt7WpRdE/LPZbeSqdMQBd84WZ6iQnRK9Gzkz+LB/wbYdbwm4guXBT/bj9nf3CL6u8TH4JJ58c6gBK3d7hwmixaLyQrx6w2Tc4eiMFBKlC4SBVOLJDbzm67TltusGUNL2UF0nslPkGOpH0kQuEUEqJugy+E+OAvbP4y8rBiMpSvNjdSYLCLE/2a471ID7Vuz1WRbdZTDjle9rcKRBG5X1AMzgA7CPIrzujR1Yd6ghoP0L05Q+k49Ds5Ox5q4KnDNU2COJB6v31uG1Tcdjes2LRufinrnDIBOLsKWmJaRzDLQST67GXsjDV/jQxA/lxpjoN9MnLx+Lr+6Z5ddLJoRArZBCqw9cSz5FYU+meg6LjwQmqw3Jjg7bmqZufF6pgcnHdVq7Tfjr19U4XMcMftRYVanB5S9tAQA8t646oA97W48RXUaL4BdEIRVjfFEa0iKsbx8uuWoFGjoNMWu+stkotp9oRbfBgkmD0rDlWGgGPxY104lEikKKD389gyY/g9YAACAASURBVLfmHLA3X/F12oZyY+wLN1NCSMD5it/NG46FY/MD2nfv2Q78fcMxAPAaFh8Jli0chX1/nAegt5zW1yDzHpeYf7QY0Aaf+7C3dNtDOa09poC+IF8dtD8JCH1Btta04LOf/LdRx5r8VAV0Jiu0AT7yhku3yYJrX9+O1XvrMGtYtj23EUIoYqCVeMokIswcmikYElRKxbx/x1BujIl+M/1iXx3uW7HXmQD1x/XTB+HcYYHNhD3R3O38d6BhoGDhqv44fXtfEsmu2jvRot9V6ayq1ODZddXOskhfmfdQmoN8dfVxx6zcfRY/nWnHlZOip3oXClwMvdFRyRBtuC9RikKCxZOLcOfsoX4fy13fvxy1HMsWjkJBmpJ3/GOi5UgiRYfOhE1HmzFjSKazYc6V3144jNcoJGoDUjh8c7gRO060BqQ0Cdg/2z1GC4ZkJ/vdlwv9fPDr6bx/53B5/YfjMFsplswpc3bP9vjw8LmnDBWrww+MYB9Po/UFqe8woEBANC2exHoQCjeIWa2UQioWBWTsXd+/Rq0Rv/90P+aMzB5Qs3lPtepwz0d7BRUxLx6Xj/OGe4//TNQGpFCh1B4SnCFQf8/H42sO4Y7/ChdUuMI5JFMGZURFanpDVRN+OGrXz1ErJchMkvkcTcmFe6Lp4fcrgx/s42m0viCaBGu64hhflIqfHrsI5wX4yBsuWn2vhw8A72w9iSte2SqYQ+B7/4wWGzYeacYzV45zjraLtu5QvDH6SdqeadWhqt47sRd6A1Li3UxXVWow/c8b0NxlxA9HmwPOKaQoJAGHZziZ8w93nsFxl/BOpNCZrM5Qzqxh2djz2EU+O6TnjcnFrkfmYnBW9Hpl+pXBD9Zjj9wXROQ8xmqjaNQaEqoGn0MuESMjSRazsXBOD19hDx9JRASVZzpwupV/OpGv929ReSF+XHYhTi6/JCo104mEv7LMv3x9BHd98JPXds/eh3SV1O+NcVF5IR69ZBSkYvsxiXAz5Z70mrqMAIAOvTngRLJaIQ1oXgUASMQiyMQi/HHNIew9E3kt/R6TxZmsDQSpWITsFDmk4uiZ5X5l8IP12BeVF+LWc0uRppIG7Dm6qlxyLHQZpNzcZYTFRgV18OPNvzYdx8cxqsUfV5SK126YjMGO+umKMvuThVB5plAclXv/apq68cQXh3nj+f2JwMoy+UMDi8oLnX/HG2YMCshwi0XEmZfa8vs5cb+ZhpNITlFIoQuwzPL3C0Zi+8MXAuh1TiJJj7FX+bKl24jb393ts1Jty7EWPP9NdUASDKHSrwx+KB772TY95BIRTjxzccCe46LyQmxdegFOPnMxZg3LwjeHGp1yyblqOXY9MheXTQysazfWfLG/Dl8eqI/JtXJSFFgwNs/p4Q/OSkJhmhJbBQz+7xeMgEzs/vTh+v619Zjw9taTON4U+cfvRILz8IUGWStlIp8DUM4bbr+x+pPw5mjU2j3p6qcWJMRQ8HASyWql3cAGGtbhwo3RqFxTSMVIS7J/9im1J6BPtgh/drceb8Frm4771fMKh35l8DnvO1dtr9lNVUp8euyhJIVcIYTgicvHwmS14cn/HXZuy06RO41copGnVsZMMfNYYxc2Vjc5Y/aEEFSUZWLb8Vbe2cFXTCrCX6+aIDgjIE8dWwG4eHHesGysXlIhKL+tkkl8lrc+c+V4jC9KdRpyfzR2GZCZJBN8oog14SSSZw3LwvNXTwhIj+YPqw/iX5uOQykVR8XD3/TgHCxbOAqAXV4BgE/FTJ3REvXh9P2uLJPTmJ/z3PcozVT59NiPN/egucvoU6PDH4OzkrBkdhle/PYofjWrA1q9GZVnOrBkzlAv3e5EID9Vgd2n22JyrU/21OLf206h+qmFzm0Lx+VDKRVDZ7IgxeWm+OiqAyhKV+E35w8VfM9yHDfyxhjdsOJFqkqKCao0wdcVUnvjFaXUy1Gx2SgIsT9d1bbz50o8adIaQAjB7z/Zj2umFmPyoPSw1h8uD84fgaWf7XcLWwWaSC7LSUGZHyVbji3HWjC6QI0UhcRZYBAtFBIxCLEbdSF6TNaoyTxw9DuDz3Hp+Hy/5YfbHaJMQip8gfKb2UMwKj8FJ5u78ejqg+gxWrFy9xk8OH9k3OOhnuSlKtChszdAKaP84dIa3I06AMwZkYM5I9xVRKsbuvD+jjO44zzvCU+uKKRipKuk/d7DP1TXif21nVg8qYi3XPDicXkYkZsCSgHPB9P1VY2456NKXDwuH+NUgWnmN2qNyE9VYMXusxhdoI67wV9UXojWbiOe/LIKQHBKljqTBVX1WgzOSkaGn9kWWoMZaqUUny+pcIZ2IkWnzowHPtmHm2YOwqxh2RCJCFRSsW8P32RxVvVEi35r8O/3I2EM2JOAeWoFBmUKT64KBLlEDJ3Jioc/P+iMrWo6DFj22QEASCijn6dWQC4RoaXb6HNiVyToMpih5vkiWW0UJ1t6UOYYRv38N9VIlknwm/OH+D1nrloRlTb4RGLT0Wb89etqXCHwuRmZp8ZIgVnJDZ0GGMw2PHzxqMDlCC4aDomY4LZ/73ZOfos3Yxzli+/dNj3gzlkAONnSg8Wv/ojXbpiEBX4kFuwOicStACNSdOrNWH+4EfPH5Dm3leWm+DToPUYrVMzgh0e30SLYyPD4ZWNw/7zhEUlU9ZWRfovKC3HlpEKfv3Mw3cq+0BosSOHp6H3+m2q8ufkk9v1xHo42duGbw424b+7wgLSH/nf3uQkZKoskXChDKGnb3GVEdUMXJg9K93pKq+u0T27LCELHac5I+xNXXqoiZvkdf3AT5fKDLG/mcmf+krAGsxUmiw1qhRRrD9SjtceEG2cMCm2xPHBOiev0qtVLKnwe884tU32Kq0WCfv3NuW/FXlz92o8+9/EMOYRKoreoc4hFxK+xj5SYlpCHP31IJkxWG3adasNz31QjI0mG22YNDuic/d3YA4DRYoVMItyZvO14C254awdveWp9hwF5qQrsOdOOyU+ux57T7T6v1WO0YGtNCzp0JuSlKlDfkRgGv86xjmA71p0G349iptFsw/DcZOSnKrD2QD3eifB8AV0IQmgiEYnq8BOgnxv8spxkVNVr0dTl/SH+7Kda3PHf3QGLMvkjkVvUXbHaKO5fuQ9f7KvjfT2SYlpPLRqLpQtHem1vdHhvN729E0caunD5xIKA28k3Vjfhzvf3+GxR7+sYzTZB7x6As/SYTyK5vlOP/FQFkmQStPaY0OQn33G8uRvXv7kDu061ozRT5ZUTiBdDs5Nw1eSioPNMyYrAyjJTVVJ8c9/5uHJSEVIU0oiXZXKx+iQXD//pLw/jsVUHBY95dt2RqKuU9muDf75Db2TzUe+67w1VTThQ2xmwKJM/ErVF3ROxiGD94QbsOsVfqRPJJ5UxBakYU+CeOFxVqcEf1/QOd2/uMuKjnWcD/qDXdeix9kADWroDKznsixgtNp+eHmcE+Wrx54/Jw2UTC5ylyf5q8bnSzVy1HH+9agJW3DEz1GVHlAVj8/Hc1ROCPk4sIkiRSwLutgUAtUIS8bJMEQGK0pVu5dk1Td3Ye1a4o3fFrrPYKfC9jNi6onr2ODM6X43MJBk2H2t22x5u/T0frh24ia73kp8qXIsfySeVT/fUek3vCfcJwlmLnyCx5mhw/7zhWOnD8HKOBV8t/q9mDcH10wchXSWDVEzQ2OX7xtjbMJhYUiBGS+gTvV78+UT8fGqxz332nG7HVa9uw7HGLqiVUhgttrCu6cmsYdnY8vsLMCy3t0RUJZegx0fBQbfREvWyzH5t8EUignOHZWHzsRa3duWapm609pjCLsf0xNmBm+B6L7mpCsHSxkg9qZitNtz/8T6sP9Totj3cJwjOMAXaRdoXyUqW+xTQ4rx/zxunyWJDe48JlFKIRAQ5KQq/f6cmrQEiAmQmyXCorhM3vrUD1Q1d4f8SYTLt6Q146n+H/e/Iw9zRuYJVTBwNnQbsPt0OG+3tto2WJj5HskwiqIdvtVEYzLaol2WGZfAJIRmEkPWEkGOO//MW8BJCrISQvY7/1oRzzWC5YcYgPHrpKFhdFBojVX/fV8lXKwR7FEbmp2BiSapTuKswTRHSk4qrFr4r4T5B9Br8/hvSWXugHqv3Coe4SrOS8M6tUzGpxP3rdrhei/In12NDVRMAYFF5AcpLfNfUN2qNyEqWQyIWgVJg87EWnGzpCf+XCAOdyYJOvRnpfurohThQ24kdju+4EFqndLcE10wpRtUTC5AZ4vX4+LyyFje+tcMt16SSiwUnXnG5xKQE77RdCmADpXQ5IWSp4+ff8+ynp5RODPNaITG1NANTSzPctqUopLhwZA6KMxIroRorSjJVSFFIYLVRiD10O76vbsaPx9uwfdmFYQ0d56okPKugHpw/Ass+O+DmnQbzBJGZJEOeWgFbjMY0xoMPdpyBzmTB5RP5b7LJcolX8xoA1He4lzI+ON87Ye7Jr88bgssduk/5znkJ8a0s45yRUBVn//btUTRoDfjyt7ME9+Fi9ikKaVQqY4439WDb8VancikADMpQYVhuMm+HtN5shVIqjurwEyB8g385gNmOf/8HwPfgN/hx5XRrDw5qtLhkvL0Rg5NfGKgsmVOGJXPKeF/bWtOCYTnJYRl7oNfDV3vU4XN/91Dr/EUi4lQ47K8YLVafujZmqw3fHWlCWU4yhrpMduIMpatSq79zleUkOxvgMpJkkElEcc+PcKWhoSrOpigkONbkOzyj1VsgIkCSTAxNhx5vbzmJn08txvDcwGQZ/MFJI7sa9lsqBuOWCv7y45wUBaqeXBCRa/si3Bh+LqWUk15sAMA/dRlQEEJ2E0K2E0IW+TohIeR2x767m5ubfe0aMB/sOIN7V1Six2iBzmSJaHKmP2G0WLHrVBsqyrJAKcX/vbcH/9l2KqRzaZ0elLdP0VdyHfHCXqUj/NW02iju+O8erDvU4La9vtOu/Jqust9k3/jhBEY8+jVv+SbH6r0aHGu0x+wJIchPVaAuzgaf6/YNdWqcWulfEz8rWYbpg+1FG10GM97achI1EVRh7fHR8BlP/Bp8Qsi3hJCDPP9d7roftUsiCj1nD6KUTgFwHYC/EUIERVMopa9TSqdQSqdkZ3uPcQuF84Znw2y1V+Z8vLsW4x//hrc2f6DQ0GnA9W9ux6aj7jfUvWc6YDDbMHOo/YtQ3diFbceF9bt9UV6ShrW/nYVxPib8hMrrPxzHEp4BILFmVaUGFcu/w+ClX6Ji+XcBlZYGcozB7Nsrl0tEIAQweFTp1HUaUJCmdHqVaQ7DL5S4NVlsuOejvVh7oPfGUV6chgxVfJVeh+Uk49ezBiM3NTBpCE+4qVdCk9UAu7f94e0zHPvbf99Ilmb2mKxew082Vjdh4d838zbMVTd04Z6PKqMyecsVv7cgSulcodcIIY2EkHxKaT0hJB9Ak8A5NI7/nyCEfA+gHMDx0JYcPFNK06GQirD5WAsatQZkJcuRHaDOSH9EKRVja00r5ozIcfYqAEC7zozCNKUzmT0qT42DAnNV/aGSSTC6wHelRKjUdRiwqToyT3+hwnUk92on6f1qJwV6jNFig9yHh08IgdKhmOnK5RMK3MZX9g6tN2JQpnfVT3N3bw0+x9+uLRe8bqwoL0n3m2z2hVohhdVG3UYM+iIaVTp5PGWuRrMVVfVaaPVmL/0eTYcOq/fW4ZcCIZ9IEe4zxxoANwNY7vj/as8dHJU7OkqpkRCSBaACwF/DvG5QyCVizBiSiU1Hm9GpN2POiJyEGPQQL9RKCZRSsVesdsHYPCwY2yv2NDIvBV8eqLdP7gny8XTv2Q4cqO3AtdNKIj6yLS/VLqDmSycp2oSinRToMavurPDb8cpn8Oe5CHUB/ktYufc/0WrwGzoNSFVKQ1ZzvXSCvTrJ12Dyuz+sRLJcjGeuHI9kmQSE+JdjCIbHLh3ttY2TWeCrxe82enfmRoNwv4nLAVxECDkGYK7jZxBCphBC3nTsMwrAbkLIPgAbASynlIZWYBsG6UopTrb0oK3HhA1HGqPewpzIcLHaehdDYLNRr0fgEXn2BFZ1Y/B12RuPNOGx1YcgisKNNRGar0LpJwj0mPQkmV8hOYVUDL2pt+TPaqM4VNfppiSam+Lb4DfxNF19e7gRc1/YFNeQ541v7cC9KypDPr4wTYlpgzN8OhrHGrvQ2m0CYC8ESJFLYLBEV67D1xAUTic/2gNQwjL4lNJWSumFlNJhlNK5lNI2x/bdlNJfOf69jVI6jlI6wfH/tyKx8GBYVanBVy4Jrg5d4EOR+yt5qQq3QSKbjjVjxjMbcNTFuI/KV6O8JA0Wa/AlkF0Gu/ftWfYZCRKh+SqUfoJAj3lx/VGfs08B4JXrJ+HuC3orrZq6DLjkH1vc6vfVSgl+PWuwl7wFh+tYTg4Ke2NiXRxF1Oo7DWHNhG7tNuLzylqfOkJavdmtZLjyD/Pw8MWjfJ43mJzNbf/ehRfWH3Xbxj0l83v4Frd9okW/7rTleHZdtdfQ51AFwfoL44vSUJje+6XaVtOC9h4zitN7NfKLM1T4/M4KTBucwXcKn2gN5ogPleAoTFNibKEa8QzKhdKR/OD8EV43QM9jKKX453fHnM2BQkwoTkOpSzdunbOUsddbJ4TgkUtGY+ZQ/gbDK8qLsHpJBdJdnia44xviVIuvNZjRbbS4/R7BcqZNh/tW7MOhOq3gPl0Gi3P+LQC/jkmwKrL7NZ1o9nhKSlPKMHNIJu/4U7GIICNJ5pXojTSJVzcUBfqKdHEs8VSx3FrTikmD0njjpnyNIv6wSyNHp9qjJFOF/90t3FQTCxaVF6KqQYt3t52G3mxFVrIMj14y2meJ6aLyQpxt1+GtzSfRqTfz9iBYbBQ2Cp9lmQCw+VgzTBYbLhxlr4R26sd7eMYGsxVavRk5PHF6vlGK3NNGvDx8Zw1+GCqzKU5NfP6YvNVG0WW0uH0+39x8AjqTFb+9cBjvMcHmbPjm0+alKpyVQZ7cWjEYt0Y5YQsMEINfkKbkLYVKNOnieNHeY8Lhei1+d9Fwr9de3liD//54Gj8uuyAoo6/VW6Lm4ScK1Q1dMDh6Oh67dLRgZ6wrd18wDHdfwG9UgF7JY38Dxd/YfBJavbnX4Avox9//8T5U1Wnx3QOzvc6xqlKDFIXEeQ4ASFdJIZeI4tZt21uDH7qHz3nuQpLHZqsNF47McWuy2n6iFXUdBkGDH4zTaLNR6MzRn08bCgMipNNXpItjye5Tbbjgue9xUNOJHx3hg4oy70d/tUKCBq3B73xgT165fhJeum5SRNbKx90fVmLZZ/ujdn5/WKw27D7VjmunFqPysYtw2YSCgI7bfKwZT/7vMF74hj+caHQkDn2VZQKAUipya6iq69RDJRO7hSkAe+JWKNfx8sYafLy71m0bIQQLxuahKD264y+FKMtOxmOXjnbrIA4Wf0NQFFIx3rplqrPzHrA/FXQZhat0gsnZ2AfM88fj576wCa9+712R/tqm43jk8wOC148U/dsFcxBuO39/RC4R40RLDzQdepRkqHDLOaUYX5Tmtd/IfHst/ZEGbVBPRKEKXwVKe48JZ9viN9v2UJ0W3UYLZg7NCvh31ZksuPGtnQDskga/45m7zBl8hR8P37Msc/GkIpSXpHs9heWo5egxWXlLWJu6jLzx/b/HsRa/OEOF284NL7Qhl4ggE4uC0sTnmrWECEYDymKjmDkkEyU8M6ObtAbeG3DlmXacbtUFvN5QGRAGH2D6OZ7kpfaWNs4fk4exAh2xXGnmkYYuXDBSSDnDm5c31mBicRoqygIfQB0MuWoFjofYBRwJnIqrgzOwYtcZNHcZcZePUA0AaNrtj/+pSimaBXTqC1IVOPLkAr/lrEqZ2E0Pf2xhKu976DoIJdnFazaYrejUmxOuBv9YYxdkEhFvo1igEELw2Z3nCP5uu0+14c73f8JrN052Ko6qFVJndy5f6JKzHc98VYVGrRGZSTI8dil/ziZVKRWM1SfJJbxT9nQ8nbnRYECEdBjeZCbZB2QcaejC/toOWG38pZdqhRSFaUocqQ+8Fp9SihfWH8XWmugZ5LxUOZq6jILrjjbHmroxJDsJOWoFfjzeig93nvV7zNl2uwc3eVA6OvVmXk0nQuxzTX01DQH2JzRXb/OHo828eSqhWvwmh7x0Top3x/mbm09gwp++icvf9o9rDuHeFXvDPs/YwlRk8/xugL2jvKnLCKmo92+ckSRDukrqVc3nyqLyQmQmyXHLOaXY89hFITmQKpmYtw4/lObGUGAGf4DCDcj4cOcZXPbSVq/JVK5cP6ME04cEXpqpN1thtdGIDYjnI1etgNVG0doTH138566egM/vrABgD0PUd+r9ztk922Y3yJNK7KEzPi//bJsOf/rikF9Nld+cP9R5fbPVhpvf2YkVu7xvOmW5yXj0klFu5bYA0Ngl3GUrl4rRqTcLPoVEk/pOQ8iiaa58c6gBaw/U877GxfZd8x2/PHcwdj96kd/u3jNtOr9d0HvPduD8Zzei8oz3APkkgalXPUbm4TOizLwx9hBNRpIMo3xMCLpzdhmunz4o4PP2SiNHz2MZnpuCi0bnhtQUFilSHdLPxekq2GhvpYwQZ9t0UEhFGFOYijy1wq0rlqO2XY93tp7y21SWl6pwyho3ag2glL+yJSdFgV/NGoJij3jypJJ07Hz4Qt4ei4I46eJTSlHXoQ+rBp/j3R9P443NJ3hfc9XCDwadyS7n8c7WUz6ncbXrTILx+HPLsjCBJ1eWm6rwuilHgwETw2e4s6pSg28c3cd6kwVr9tX5fETt0JkgFYsCeuwUGn4SSWYMyYzbxLIVu85g87EWvHDNRMgkIhQ5BumcbdehJFP4S3vzOaWYPSIH5w7LEtT058I8/soyq+q12FrTghtmDOrVwRdIqp9utU+wco2Li0WEtzYf6K3lr+80IJbp23adGUaLLawafA61UiI4xlPLM43tSIMWz39zFA/MG+HMW3nS0mVy/vuARlhUUOfUxfH+rjy0gH8ozbu/nCZ4vkjCPPwBSG/XoP0LoTfbfHYNnmjuxsQn1uPrgw28r3vCfaHU/bQOf/3hRhyq0zrj7MXpKiikInTofFeFFGeocO4w30lsZ5WOn7LMPafb8dSXVdAazM5acCHP+NZ3duGvHl3lXx+s5y0PdD1PrBsTueuFU4PPoVZIBcsyy3KSsWhigZvWjs5kxfrDjT5/Z05dVCUTo6VbONzFza2NRYgmWJjBH4D46hrkoyRDBZlEFLCI2qSSNBz803ycMzQ6FTqAvbll5jMb8KKHXkm0sdoodpxsw3SXUEhRuhJVTyxwq+vm46OdZ3CssQuUUvzqP7vxwY4zXvs46/ADKMsEAIPJ5hSREzL4OWq5l67M1wcb8MHO07z7p6mkuGpyEYZkh14pEwrF6Sq8ev0kTB4UujQyh68yy4vH5XvJQHPOia9SzhSFBIsnFWHyoHSf+Q1OCI1vPu0za6sw57nv3bZZrDYsfnVbTLS9mMEfgAQrNSERizA8NxlV9cKJXVcIIUiWS/xWmoSDSERgc8R8Y0lVvRZdBotbOIkQ4rcLuVNvxtLPDmBjdRMIIag8084bFjBbbCDEXkvuCy65qDdbcdnEArxz61TBEFquWuE19L1Ra3RW8HhCCMFzV08Iqgw3EqSqpFg4Ll8w1BQMaoUUerOVN5HONxhF7RyCIlyLPzw3Bc9fMwHTSjOgNQhPzstPU+LCkTm8IR2rjXrlZ3pMVuw53e7zqSFS9M9nboZPQpGaGJmn9pqQJcT2E63YUNWIe+cOj2qpWZ5aIRinjRZc/b1n1dK/Nh2HpkOPJy4fy3vc2TZ7Eo9LzGWnyHm9xMWTi3DlJP/lfpyHrzNZMCIvxae6pN3gG9xqzBu7DD4T9ZRS6M3WqMv1unKgthNdRnNEngxvnDkIV08pdhsiznHzO7tAKcV/b5vu3OZPfwewTwiTigmG5SajoiwTehP/ZLL5Y/Iw32M2AYdKLoHOZIXNRiFyrI2r2onFbAfm4Q9AQpGaGJmXguYuI1oD8EIqz3Tgjc0no6KF7wpnyGJJikKCC0fmeBnY483d+MpHjqPWUYPPVctkp8idMWFPAnliUEh7Pfwv99fzlgBy5KTIYbTYoNX3eq9NWiNy1MJT3x7+/AAufH6TzzVEmre2nMBDn0RGLiNNJUNeqoL379ipM3l9NhVSEUozVT47nP/0xSHMeGYDFozNx/u/muF3ZgEfSS5PZhxcI5YqBgafefgDkFCkJmaPyEGyXAJpAGGaLoMZEhHxm3gMl1y1AjtOtkX1Gp78fGoJfj61xGt7cboKzV1GGMxWpzF2havB5zz8nBQFjjd5N6atP9yIbw834ukrxkLiY4BHeUkati29AJnJMlQs/w5zR+UKjgWc47hBcSE2nckCg9nqs8s2M8ne2Gax2nyuI5LURagGH7A/UX1eqcFVk4u8nly1BgtKPDp5CSH4/sE5Ps/Z0m10luL64rFVB7H3bAe+uPtcr9ecmvgmi4s+vt34J0d52hXADP6AJVipibKcZGfdtz+6DHalzGiPkTxnaCYIgdvjcTQxmK2QiAivAeQ899p2HcpyvMv6zrbrkKKQINUxIHxYbrIzzOPKgdoOrNxzFssXj/O5FoVUjII0JYwWK1q6TT5DOkOzk93EyFQyCY4+tRAWH520+Wn2xrbmbmNYw0iCob5T75Q6CJe6Dj1eWH8Ukwelext8fWizGpq7jMhKtofirnptG+65cBiunFTktV9rj9GrKIJjeG4KrplSBIlLl69YRDChKBWZSdGfs80MPiNgapq60WUw+x0wrTWYoQ7AEwqXhePysXCc78qYSPLBjjN4Yf1RbH5ojpdgWpFjmMzZNj2vwb9/3gjcOKO3ee035w/Fb84f6rWf0WKDXCLye7PUGsz4z9ZTGOq4CeenCXvrZqsNu061oShN5ewTEIkIZD5uRg6L6AAAIABJREFUkvnO5qvwpk8Fis1G0RDBa6U4k7DuMXlKqX34CU+C+w+rD0IqFvHOowWAlm4TykvSkKKQ4HSrTrBgoNsoPDx92uAMr2a3sYWpWH2X99NANGAxfEbAPL7mEP6w+pDf/Qxma8y08M1WG0xRnkXKsf1Eq11zhUcdsyRDhSFZSYJec6pSimG5/A09rhjM/IlAvv2eX3/UKR/gKxRisVJc98YOfLG/zvl7LP10P9p7TILHcIY3VnODW3qMMFspCnzcuILBqYmvd6+6sVHguuklmFrq7bTUNHVj79kO4TV22z18hVSMFIVEsDRTZ7T41MKn1Ht+dKxgBp8RMCPzUnC0scuvqNa/bpyC1Uui77GcaO7G8Ee/wlcH+TVTIonNRrHzVBtmCGgK5agV+O6B2bhotHcpI6UUL3xT7ZZYPdKgxcV/34xdp9xzEJyH7w8u6X6yxd5F68vDV8rEUCskzlr8/bUd+GjXWUjEwh5+UboS/zd7KErDUK0MhjSlDKuWVAhWtwSLUNWNWETw+GVj3Ia+9B4j8Xoi4LDaKG47dzBmORrnslPkaOnmv2H2mISrm/bXdqDska/wfXVvxduafXVY+PfNaPNxA44ULKTDCJgekwVGiw1lD6/1m+iNxvByT7JS5KA0+sPMV1Vq8Oe1VejQmbH+cCNWVWqCyn80dxvxj+9qkJksd4bDpGIRDtdroWnXY2pp774SsX22qT+4xPB5w7Px/DUTeLXXXXGtxW/UGqGSiX2WAaYopPi9gAxANJBJRJhY7K0xEyopcgkI8Z56ZbHaYLFR3sR6ikMimQ+xiOB+l/kFWcnCVVZzRmTzqpAC9vfNaqPOblwAaOw0oKpeC6mPG3CkYAafERCrKjX47Cd7J6DrEGcAXsbv8TWHMKE4FVeUeye0IkmKXAKVTIyGzug1rHAyFFwSrl1nFvy9n113BMcau/H6TVPctjsrdDJ6wy6cQWjyGHT91CLfyVoOqVgEqZiAwN4j4Y9ctcKpkNmoNSBXzV+y6IrWYEa3wRKTUaB7z3bgWGMXrigvjEhVkEhEUPnYRV43tf2aTlz5yja8c8tUzBmZ4/aaLzkGvckKvdmKNKUUIhHB+cOzeVUvAWG9HKBXbsH12F4pBlaHz0gQnl1X7Wz75xCSY/hkTy0O1AbWlRsOhBDkuRiyaBCMDEWn3sxbJuqswXdRQ0yWS6CQisKSIFZIxfhg5xl8ud9/SMsur2C/VpPWKOiBuvJ/7+3Bkg9+Cnl9wbD2QD0eXXUwok+GaSqZ183Dl5JraZYKw/NSYOMJWW462oRJT65HlUNGfMmcMkHD7is+n+xRimn/twVKqTgmT8XM4DMCIlA5BquNotsYuwHmOWo5GqOYWAxGhqI4XYVOvdkrbsyVX7rOiSXEPo+gycPgv7D+KF4IUB9oy0MXIDtZjk/2+B++csd5Q/HSdQ79GIKAZtbmpyr9Sj5HCk4WOZKlvP/eehLv73DXC/Kl5HrTzFJ8fmcFb4lvsyNen53ce6PkS75abRRlj3yFlzfW8K6J8+Jdp171mISreiINC+kwAiJQOYZuHunZaHL15GIYBDRNIkEwMhTOWvw2PUYX9BqU+k4DspLlXsM1Zg3L8prKtLWmJeCGtVSVFC3dRkzl0bT3xFXyd+UdMwM6f0GqAk1dhpg0X0Wj/HPtgQaIRHCb5eD08IOU7m7uMoIQOPMra/bV4YGP9+G7+893u3lyw39kAn8vmUSEW84pxTgXTfzBmUmoKIuN1Dfz8BkBEagcA+fdxqIOH7BrzwQznCVYHpw/wiuZJiRDwYVsuFGGHE8tGosN95/vtf/TV4zDvXOHu20zWgIrywSAV78/jnadOSA54ZZuIz77qdYrZ+CLvFQlbBReTyGrKjWoWP4dBi/9EhXLvwtI5dHfMfUdep+VRqGQopB4lWX2fj69HZIdJ1qx4G8/4BiPKmxLtxEZLiGiJJkYJovNq1KHU8pU+eiaffyyMTh/eLbz51+fNyRmg+OZwWcExKLyQjxz5TinjGxBqgLPXDnOK3FpMFuRrpIiLUYG32y1obZdF7Va/EXlhZhQlAoRAQiAwjQl7+8N2Gvxzxma6aWDTggJqCUfAIzmwMoyAeD1H+x69oF4xqdbdfjdyn1Yu78eN7+902e9OQdngOtdQma9sxT0bsl7X0bf3zFWG0VjlzFisgocaqUUXUb38NrE4jT85vyhXs4Lt44jDV1o5SmP5LpsObgnM88cTHcAQmhGi5V3kHksYAafETCLygvx5CK7GuS/fzmN1+gNy01B5R/mYV6E6qn9sf5wI879y0bUNPmeARsOjV1GzBudh5PLL8HWpRcIlmSmqqT44NczMGtYr/dmtVE88PE+3oHu7+84jUlPrneT2TVabLwlg3x0OOLRgXjGuQ6htN2n27HpaDOMAq3/rozJV+PJy8c4u4iB4GcpAMDyr474PEZEgB+XXoBbK0r9rikY+Dz8GUMysXThSN5cQYoPieSrJhfh9vOGOH/mjL+npLHOMaDcV8XNz/65Bb9bsc/5863v7MRDn+wT3D+SsBg+Iyi4OPXZNh2GB9A5Gm04AbBGrQGjC/yXJwZLQ6cBZ9v0uHlmacDHuMoQ13fq8cmeWkwelI4Kj/0kIoK2HhNauk0odOQEMpNlXnF9PlZVaiATi2C02PDAyn14aMFIn70B3DkPOjT4fQmncWw73orXNp3AH1YfQkGaEtdNL+HNZwB2r/2zPbV4fv1RpyDfPReWoa7TIChhzSW+CREetxgOaoUUBrPV7f1o6zFBIia8MXwu78TXfOXZEJaZbI/lt3h4+KlKKW45pxSlPkZdqmQStzr8s+16v8PTI0VYHj4h5GpCyCFCiI0QMsXHfgsIIdWEkBpCyNJwrsmIL1yDzxke4S8A2HysGXf8d3dMhjkA9mHeAKKmi7/7tL3Mkm/YNx+PrjqAn720xfmzp0qmK5wRdp1G9fmdFXj44lE+r8GFSLgy2bpOg9+wilwiRrpKilOO4dq+pJFdr+Eahnl2XTV8VQ4+8Mk+t/0f+vQA/vbtMSgFktBc4nt/bQf+seEYOgVq4EPlvouG48iTC9y8+Qc+3ofr3tjOuz+Xd/KsxaeU4nCd1q36Si4R45ZzSr2cjOIMFR6/bIxPGY0kudj5JADY4/6xmjsQbkjnIIArAfwgtAMhRAzgZQALAYwG8AtCCL86ESPhyUySQSUTOw2ZJ8eburHuUGPUtfA5th+3h0qWfXYgoARisAnH+WPysOauCozKD+zpQSYW43hTj7Ncj0vguoZFOLKT7TerYGvxQwmrAL1efYpC4tfA8F2DO9Y7eS9CkkwMPsWNrGQZnrlyPG/M/BfTiwEAO060BVyKGgxikfdcgS6DGSly/nxKikKCmUMyke0xCazHZMXF/9iMDz1GUvJJNJgsNhgtVp+1+CqZxKPxyupTeyeShGXwKaVVlFLfnzJgGoAaSukJSqkJwEcALg/nuoz4QQjB1/ech4cW8A9L6YphWeaqSg0eXdUr5uYvgRhKwlEqFmF8UZrbwGtfFGcooTdbnYm/2jYdCOEv4+S8bK4KhlKKG97cgc8ra31eI9gRlRwvXTcJ10wpCkjCQOhcWr0Fz1w5DoVpSpck9ng3j9WV1m6TM+HPHZOnViBVKcG7205D06FHXaceSQ69n0hyqK4T96/c52x849bPV6ED2N/rD2+f4TWbmAvbuCZtAbu+kmf457OfajHi0a9R56M3JFneG9KhlKLHaOlXdfiFAFw7Q2oBTBfYF4SQ2wHcDgAlJd6DJhjxp8RHfFJrMEMhFQVsIMPBl6fLF88Odn+twYwXvjmK66aXBJyvcJZmtumQlWyfNDU4M4l3vm9mkgyXjM9HocP7N1lt2FLTgplDfddkhzKiErDPNPjrVRMC+j18XYNvlsKz66p9rsnzmCMNWtz41k7898dT+HDnGRjMNpz7l41+B/EEQ1uPCZ/+VItrpxU7a+W7DGbB2b9CcJo5nrmVe1fsxQFNJzY+MNu5rcdx40v28QQ1f0wexjhCQTYKLBibF5X8Ex9+v5WEkG8JIQd5/ouKl04pfZ1SOoVSOiU7O9v/AYyYs/NkG55ZW8X72CqkNR4NgvV0g93+0+l2/HvbKa/EnC+cSe12+zmXXTyKtwYfsA+Hf/m6SZgzwq7pwsXk/ZVlhjKiErAnbF/eWONX7TSUawS7/8g8NR6aPwL/2XYaBrP99w7kiSsY+DTxtX4+nze9vRNLP3Ufsyjk4Wckybw+G1wdvq8k7IKxefjVLHvFj1hE8NJ1k3Dp+AJ/v05E8OvhU0rnhnkNDYBil5+LHNsYfZRDdZ341w8n8Ovzhnh9CZLkErfpStEkWE832P13nWqDREQwsSRwFcfiDCWumlzkHCACwK9cANfJanA8fcj9lGWGMqISAN7ZehKf/qTBs+uqUejnmGCvEcqa/vbtsaCeuIKFCxG5lmbeP2+4T7G5LoMZGg9HhvPws1LcVUyzU+ToMlrcxlr2mKyQiUW8T3QcepMV7ToT8tSKmExqcyUWIZ1dAIYRQgbDbuivBXBdDK7LiBKulTqeBl9oWlA0eHD+CDclS8C/F+q5v1wiEtx/16l2jClMDaqCQiWT4Lmr7WETo8WKW9/ZhVsrBvPq5APAHf/djQatEauXVMBoDszDB4IfUbmqUoM1++qcP/tSOw31GsHuH2ouIlD4PPxbKwb7PcazWuicoVlYfuU4ZHgMLed0dZq7jM4nO3s83vcN+/0dp/HUl1XY//g8NHQasPiVbXjx5xMxV+AzEknCLcu8ghBSC2AmgC8JIesc2wsIIWsBgFJqAXAXgHUAqgCspJT6H5vESFhca/HjiWsykGPZxb690D9fMdaZPFTJxHhoAf/+RosVe892YOqg4GesUkqhNZihaddj2/FWQcldwP5E1OxSljkyLwWZAejhB8uz66phtrp7roFU9kQTX09ikUCtlCBFLnGGsAxmK441dvnscuUbglKWk4xrp5V46QlxHr+rLv55w7Pxa5cGLT64BK3OaEW30YIuo8XnMJpIEpaHT+n/t3fu8VFV1x7/rkzeb0ISICbIGwEFeRS0gKgIIqKtFq311mtbKbdVrxTb2+uj1Vb78oP1cdvba1vf9VGtCtwiSLWlVqqAQMTwFJBXQmISkkCSIZPMZPePc2YySeadyZkh2d/PJx/OHPZwVph91qyz91q/pVYCK32cPw4s9Hq9Fljbk2tp4gfvjcmu3P7SdsYNyea2S0ZZYos7qjxQ3cRlj7yLo83/+rS91ckv3/6E7y8YyxfODxyJVtSfJictiWnDQsu/92b5Kx/x0bEGfvwFoyrZV0qmm8KsVGqaHCilKMlL563vXBT29UKht6PpSAj3CS1cUhJtlP34cs/rgzVNXPk/G3niq1NZcK7vSnBDE7/zF8LH5Q2kJdm65daPLsxi2dzRnRQ0540f5Pdpzo1beqPJ4cRuyiRblaWjpRU0YZOWbCM/03eLt02fnqC83nonMqowk8lDc3ltW7nfHOj1u6oorz/t0Z5RSrHjWAMHqruLZY0oyGTLPXOZH8Fj9uAcY6/g6Amj/WBJgG5UBVkptLlU1IuOutLb0XQkdE3XDKRTFA06lDL9O9fJQ3O5eGznZJEfrt7FA2t2dxtbkpfO8nljOn2+J5oc3eSxu5LhJZHs1t7pqr/UW2hpBU1EbPzvS3xqvhhZELGZVounFvPo2/upaXT4LNV/bVs5Q/PSPQ2sHc52vvrkZuZPGMwvr++erigiRFI/VpKXRptLse1IPUk2CShj4Km2bXRw5ISdH/15Fz/54rlMKMoJ/8IB6O1oOlLCXfcPlwfX7CYvI5nbLhnlWVoLpOR6/bQSrp9W0ulcbaODkfm+e/u6ZZPde1lL/7CNtCQbLyzxm3nuUdJsdnSIqGWcIZW2mn6KL2ff0uai1dlumTRyVxZPLWbT3Zf6dPbl9XbeP3iCxVOLPVkzqUk2Fk0awrqdlZ0qH9vbFQsff49XPjza7d8JBfeSV529jRnDBwbsZDRucBZLZg0nIyWROnsrpUcbekX50+poOl7YeqTe04XsVARFgUopapsc5PvRN5r36Ls89k5HlXCzwxk0Wh9ZkMkPrhxHSV4aJXnpXD+tmAHp0d+38YWO8DUR8Y9Panjlw2M8dsP5niIrK6tsfeHWkXdv0nk72pXbK1AKrp3S2cEtnlrMy1uOsbaskuvMyG5/dRO7K09hS4gsHnI/4l89qYjFUwP39R09KIsfmJlNZeUNnX6PaNPb0XQ8ku21Cev+M1Ae/rqySr73px2suWM2w/MzaHQ4cTjbO63Te1OQmUJtY8fSZnOrM6A0MhgSF+48/OIB6Xwugn2iSNERviYiqk618GZZZadNP1e7YlJxTtR1zcPhyIlmZj30N97eXdXp/JyxBdyz8Jxurf2mDB3A8PwMXtvWIWew5bAREbqXfsKlKDeVOy4dxTmDQ6vOtbc6OdXS1lF4FWLHK01wvBuTzxyVz8+uOS9gQJKcmEBzq8vzHk/RVZbvCNzYy+rI0rE7XAGbn4BxnxyobqKuuRVXe/c2ib2JnlmaiPClmjk4J5XVt8+yJJ/YH8UD0mlXqpMDB5hYnMvSi0Z2Gy8iLJ5azO7KU5y0Gzf5h4fqKMxK8fyO4ZKSaGPpnJHc/tL2TrnvvlBKMfXBd/jVX/d78vBD1cPXBMdIszSePMcMyuLGGd3TKzuP76yJPyg7lWe//jkuHJHvc3xBVkqntMzmVmfQ9fjmVieXPfIub2wv52dr93D+A2+H9Tv1BO3wNREx1JOLH7u0Pl/YEoRrpxSzYV+Np53fqtIKyspP+n3PzZ8fxof3XkZOunGzbz1cx+eG5UXcUHtVaQUXr9jA4RN27l+9M6BUgIhQkJVCdaOD3PQkJg/NJV07/KhRlJvm2VA9UN3E3qpTAcd31cTPSEnk4rGFHhnuruRnpnieApRSfG/+WC49pzDgNdyfr73VRbPDGXKHs2igHb4mIgZlp5JsS+gU4W/YV83Cx9/j6InYFmR9aUoxrnbF6tLj2Fud3LuyjOc/OOx3fGZKIqlJNpRSOJwu5owtZP6EyJ5S3Iqc7pTVentbUH2YgqwUahodzJ8wmJW3zmRALxRe9VfumDuatctmA/Dw+n3c8XJpwPEeTXzT4e+ramT9riqcLt8b6VdOHMwPF433NFlZMnsEM0YEFr9LtCWQmpRAs8NJc6sr6Jp/NNEOXxMRtgRhXFE2io71x89OtrC78pRlVYP+8M7Jf2tnFc2trqCbpweqG7nskXfZfqSBn197XtDCLH9EolVfkJnSrVG4Jvo0OoIrZQ5IT+LL00o4e6CRhvnnHce59cXtfvs7TD07jxumD0VEaHW2c6C6qVPGlz8yzK5XzQ5n0DX/aKIdviZiVt82k7uv6OjOFOssHW8uGD6Q2iYHd766A1uCcDxIMdhZuemU19n52jNbQm6O4otIKlrdEf5TGw9xxePvhX1NjX/eP1jL9b/9gPJ6u6GFH2Rupicn8tDiiVxgRum1TQ7yMpL9ipy1tLkoKz/JSXsbR+vsXPbIu7yz57OgdqWn2LA7XGYap3X3S+zvTE2fobGlDRHrikj8saq0gmffP+yJtF3tintW7UQSxG9a4vpdVTgVuFydpXrBv7iYLyLRql9w7mCG5WdQ2XCaw7XNIV9LExy7w8WWQ3WcaGqlsaWN4X4KqLxRSuFsVyTZEqhpdPhNyQRjX+CqXxtyDUVmM/lQ5v9dC8aRn5nM3qpGSxUzdYSviZi/7vmMa37zT89656kWJ1kpiZZLvnYlkmWVFev3ddOJj0RcLBKt+pmj8rll1nBaXe06JTPKdGzCOo0qcD/drryZs+Lv3PW68WUfqOgKOiqla5scHTIJISzRXDlxCDNGDOTmzw/jpgvODjo+WugIXxMxrc52So82cKzOzoSiHEry0pk9OvZNayJZVomWuFgkuvCtznaO1ds50dRKai8VXfVXvDdhH75uIoVZ/mUu3KQn2zxBTE2jg5GF/vs75GUkI2KMG2xWeIeyCXuotplmh5OSAemkp9gs6RAH2uFreoC3TPKEohxumTWcW2YF1hu3gkiWVSJtG+iLcCta91ad4upf/5P0ZFu3NnqanuGdZrnwvNBapmanJnnSMp/7xvSAzjjJlsCA9GRqmxyePrWhrMk/tG4vn9Y2UdnQwnXTSrjvKmv6SOjnR03ElPgovooHIllWibRtYDRwR50D0pO5MEhKnyY8ctKSGD8kGxHhr3s+o/qU/+bibryLtUYPymJYkHX//MxkahodTCrO5WfXnMeg7OBf2ukpNpodLqNQS2fpaM4EctKSyElL8hRf3fTUZu5dWRZjqyITCouluNjATGNZYPHUYn7xpYm9fr3+RFZqEmuXzWbK0FxueW4rm0whtUBkpyVxqqWN2iYHz39w2OeTnzf3Xjmeb108kmH5Gdw4Y2hITdIzUxKpa26lXYX2RBAt9JKOpkdcNKaAgZlGodCh2uaAGQ1WEolQWKzExZJsCeSlJ3cq0ddEl3CUMueOK2RUYSb7P2vivtW7GFmQ2amrWlfmjDH2rcrr7dQ3t3FecXBp6/TkRE9igZURvnb4mh7xq69M9hw3tjjjIgf/TKQgK4WXNh/ldKuLR798fqzN6VMsfX4rx8w6jEBKmW4WTSwCjKIrIOi+yrE6O3urGtl6uI7nPjjM3gevCHqNTC8nb2Uas747NVFBKUVjS/BKRo1vls8bw3/8YVu3fqqannOs/jR7Kg0NnVCa87S52jl1uo3PzPX+/CBPrW+WVfKLdXu5dvJZITvvBecOIT8zheMnW5hwVnZI74kG2uFresT6XVXcv3oXLyyZTrsipDxnTXcunzCYkQUZvaaF35/xfuoMpTnPq1uPce/KnVw75SwSE4TcIO9xfyEcqbOHLJMwqjCTUQHSPXsLvWmr6RFpSTaqTrVwqNbOoolDujV61oRGdWMLB2uaSbZQObG/kJ2aRH5mMi/cMoO8EITp3Ms+h2qbGZjpX1bBjXvJ58iJ5pAj/BNNDtaWVbKvqpE2P8JsvYEOxzQ9wp2aefJ0G7++cUqMrTlz+fOOSgAcTleQkZpwyU411FBnjfatad8V9xPBsrmjGVkQPArPN5MWaptaPaJrwfi4/CS3vrgdgHXLZjNuiDXLOjqc0PSIs3LTEIm/XPwzDXeUOCSG3cL6KuOLsnG6FO/sDi5qBh1NUBQdAU0g3JlpiyYO4c55Y0K6hnffWy2PrDljSE5MoCgnjRc2HeG8H61nZ4X/RiMa/+wzG3M8tfFQxEqdGt8smT2C6cPzePDN3SGNzzH3oR5at5f39tcEHT8wM4UXbpnBfVeNZ+ao0J4iMrycfLCm59FEO3xNj7lqUhElA9JobHGSZuHk7SusKq3gyfcOeV67lTq1048eRgZZaJF0YXYq3503hr1Vjbx/8ETQ8bYEYdbofA5UN3Gwpimka3g7/Awd4WvOJO664hwWTysB4kML/0xjxfp9ngbmbiJR6tT4Zl1ZJRv21WB3hLY/kp2axE0XGgqWwVIy3WzcX8uNv9/Ms/88HNL4DK/AyMoWh/ru1ESFOrOlXyiFLZrOREupU+Mb1eXPUPjY7IHs3pANxhPvHgRCj9YHZCSzbO5oWl3tEfdOjgTt8DU95q2dVTz6zieAtdFKXyGaSp2a7kTy1PnvT28BglfZuslJNwKdjBCXNJNsCSwPcYM3mui7U9Nj3DdF8YA0S6OVvkIslTr7A6VH6wEjrz7cDfFQtaHcjj6cPaynNh7izY8rQx4fDXrk8EXkOhHZJSLtIjItwLjDIlImIh+JyNaeXFMTf+w6bjz+ltef1hkmERBLpc6+zqrSCv53w0HP61A2xFeVVpBkMwKXm5/ZEtJ8rjxpyDD85M09Id0Dq0oreHDNbm57abul90xPl3R2AtcCvw1h7CVKqdoeXk8TZ6wqreDna/d4XkfaC7a/Eyulzr5OoA1xX//fq0oruPuNMtpcxor/8YaWoPN5VWkFmz7tyOYJdg+4rxHq+GjSowhfKbVHKaVTCfoxRv9YnWGiiU/C3RCPtB+y+wsilPdEco1oYdUavgL+IiLbRGRpoIEislREtorI1pqa4EUPmtiiM0w08Yy/jW9/563ohxzLeyaowxeRd0Rkp4+fL4RxnVlKqSnAFcBtInKRv4FKqd8ppaYppaYVFMS+IbYmMOHeUBqNlYS7IR7JfA73PbG8Z4I6fKXUZUqpc338rA71IkqpCvPPamAlMD1ykzXxhM4w0cQz4W6IW9EPOZb3TK/n4YtIBpCglGo0j+cDD/T2dTXW4L5xVqzfx/GG0xTlpvFfl4/VG5CauCGcDfFI5nO474nlPSNKhVN/1uXNItcAvwIKgAbgI6XU5SJSBDyplFooIiMwonowvmBeUkr9NJR/f9q0aWrrVp3FqdFoNKEiItuUUj7T5HsU4SulVtLhzL3PHwcWmsefApN6ch2NRqPR9BxdaavRaDT9BO3wNRqNpp+gHb5Go9H0E7TD12g0mn5Cj7J0ehsRqQGORPj2fCDetHu0TaETj3Zpm0IjHm2C+LSrN2w6Wynls2o1rh1+TxCRrf5Sk2KFtil04tEubVNoxKNNEJ92WW2TXtLRaDSafoJ2+BqNRtNP6MsO/3exNsAH2qbQiUe7tE2hEY82QXzaZalNfXYNX6PRaDSd6csRvkaj0Wi80A5fo9Fo+gl9zuGLyAIR2SciB0Tkrljb40ZEckXkNRHZKyJ7ROTCGNjwtIhUi8hOr3MrTJs+FpGVIpIbBzadLyKb3E3vRcTS/gkiUiIiG0Rkt4jsEpFlXf7+uyKiRCTfYrtSRWSLiOww7fqxeX64iGw25/wrIpIcBzaJiPxURD4x5/sdVtnkZZtNREpFZI35+kXTN+w0511SHNg0V0S2m3N9o4iM6lUDlFJ95gewAQeBEUAysAMYH2u7TNueA5aYx8lAbgxsuAiSfCGqAAAECUlEQVSYAuz0OjcfSDSPHwIeigOb/gJcYR4vBP5usU1DgCnmcRbwiXseASXAeoyCwHyL7RIg0zxOAjYDFwCvAjeY558Avh0HNn0deB6jFwZAoZX/V+Y17wReAtZ4zSUxf1628v8pgE2fAOPM41uBZ3vz+n0twp8OHFBKfaqUagX+CITTirFXEJEcDMf2FIBSqlUp1WC1HUqpfwB1Xc79RSnlNF9uAopjbRNGD+Rs8zgHOG6xTZVKqe3mcSOwB3B3p3gU+L5po6UogybzZZL5o4BLgdfM888BX4wDm74NPKCUajfHVVtlE4CIFANXAk962brWtFcBW7B4rvuyCYvnel9z+GcBx7xel9Nxo8aS4UAN8Iz5OPek2f0r3vgGsC7WRgDfAVaIyDHgYeDuWBkiIsOAycBms49zhVJqRwztsYnIR0A18DbGE22D15e25XO+q01Kqc3ASODL5pLcOhEZbaVNwGMYX8ztXf/CXMq5CXgrDmxaAqwVkXLTpl/0pgF9zeHHK4kYyxb/p5SaDDQDcbO/ACAi9wJO4MVY24IRHS5XSpUAyzGfjKxGRDKB1zG+gJzAPcB9sbDFjVLKpZQ6HyM6nQ6cE0t7oLtNInIukAK0KEM24PfA01bZIyKLgGql1DY/Q34D/EMp9V4c2LQcWKiUKgaeAR7pTTv6msOvwFhjdVNsnos15UC5GfmA8fg9JYb2dEJEvgYsAv7NfNyNNTcDb5jHfyIGTe/NKPB14EWl1BsYEetwYIeIHMaYW9tFZLDVtgGYS4IbgAuBXBFxd6+L2Zz3smkBxpx3f4YrgYkWmjITuNr8nP4IXCoiLwCIyP0YLVnvtNAefza9CUzy8guvAJ/vTSP6msP/EBhtZi0kAzcA/x9jm1BKVQHHRMTdln4usDuGJnkQkQUYj5lXK6XssbbH5Dgwxzy+FNhv5cVFRDCeKvYopR4BUEqVKaUKlVLDlFLDMBzaFPOztcquAncWlYikAfMw9hc2AIvNYTcDq2Ns015gFXCJOWwOxuakJSil7lZKFZuf0w3A35RSXxWRJcDlwFfcewuxtAljfzFHRMaYw9yfZ6/Ro5628YZSyikit2NkUdiAp5VSu2Jslpv/BF40v4g+xchisBQReRm4GMg31wzvx1gfTwHeNvwcm5RS34qxTd8EHjej1hZgqVX2mMzEWE8tM9emAe5RSq212I6uDAGeExEbRrD2qlJqjYjsBv4oIj8BSrF2CcyfTRsx5vtyoAljrTrWPIGRXfWBOdffUEo9ECtjTH/1TeB1EWkH6jH20XoNLa2g0Wg0/YS+tqSj0Wg0Gj9oh6/RaDT9BO3wNRqNpp+gHb5Go9H0E7TD12g0mn6CdvgajUbTT9AOX6PRaPoJ/wLGK7/7Q1ZxVgAAAABJRU5ErkJggg==\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "best energy: -1.4931295501440078\n", - "optimal angles: {a: 0.0, b: 2.70723295211792, c: 0.2528174817562103, d: 1.4755951166152954}\n" - ] - } - ], - "source": [ - "init={'a':0.25,'b':0.25,'c':0.25,'d':0.25}\n", - "print('With phoenics we will optimize:')\n", - "print(O1)\n", - "### to see what you can pass down to phoenics, see the tequila documentation for that module.\n", - "p_result=tq.minimize(objective=O1,\n", - " method='Phoenics',\n", - " maxiter=5,\n", - " initial_values=init,\n", - " silent=False)\n", - "\n", - "print('Phoenics optimization results on 2 qubit circuit:')\n", - "p_result.history.plot('energies')\n", - "p_result.history.plot('angles')\n", - "print('best energy: ',p_result.energy)\n", - "print('optimal angles: ',p_result.angles)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We also have returned to you the phoenics object. One interesting object we can extract from this is the acquisition function. You can obtain this indirectly, using resut.object.bayesian_network.kernel_contribution. This function takes a numpy array ( a point in your parameter space) and returns 2 numbers, x and y; the acquisition function then has the value x*y. Note: this is often zero.\n", - "\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "random point [3.506517 3.41045123 1.98397105 5.59827826] has acquisition function value 0.0\n" - ] - } - ], - "source": [ - "kc=p_result.phoenics_instance.bayesian_network.kernel_contribution\n", - "random_point=np.random.uniform(0,2*np.pi,4)\n", - "f,s=kc(random_point)\n", - "random_ac=f*s\n", - "print('random point ', random_point, ' has acquisition function value ',random_ac)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## This concludes our tutorial. Hope you had fun! Happy optimizing!" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.9" - }, - "pycharm": { - "stem_cell": { - "cell_type": "raw", - "metadata": { - "collapsed": false - }, - "source": [] - } - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/tutorials/Pytorch_Interface.ipynb b/tutorials/Pytorch_Interface.ipynb deleted file mode 100644 index a59c6b75..00000000 --- a/tutorials/Pytorch_Interface.ipynb +++ /dev/null @@ -1,326 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Hello, and welcome to the Tequila PyTorch tutorial!\n", - "\n", - "### In this tutorial, we will demonstrate how to use the Tequila PyTorch interface. If you do not already have the PyTorch module -- as well as a quantum chemistry backend -- this tutorial will not function.\n", - "\n", - "In this tutorial we will learn how to transform a Tequila `Objective` into a PyTorch `nn.Module` object, and will optimize such an objective using PyTorch. In particular, we are going to train a Quantum Autoencoder on the $\\text{H}_{2}$, sto-3g, UCC-SD ansatz. We will consider, as input data, the angles of the UCC-SD state prep circuit, calculated at different bond lengths, and as internal weights to the model, the angles of rotation gates within the autoencoder circuit.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import tequila as tq\n", - "import torch\n", - "import numpy as np\n", - "from matplotlib import pyplot as plt\n", - "\n", - "#cuda0 = torch.device('cuda:0')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 1: generate the data." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### We start by creating a number of molecule objects, each representing $\\text{H}_{2}$ at different bond lengths. \n", - "### Subsequently, we extract the parameter value (there is only one) of the UCCSD ansatz, for preparing that state." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "bond_lengths=np.linspace(.3,1.6,20) # our bond length, in angstrom.\n", - "amp_arrays = []\n", - "state_preps = []\n", - "for i in bond_lengths:\n", - " # the line below initializes a tequila molecule object for H2 at a specific bond length.\n", - " # see the quantum chemistry tutorial for more details.\n", - " molecule = tq.chemistry.Molecule(geometry = \"H 0.0 0.0 0.0\\n H 0.0 0.0 {}\".format(str(i)), basis_set=\"sto-3g\")\n", - " amplitude = molecule.compute_amplitudes(method='ccsd') # get the state prep amplitudes\n", - " amp_arrays.append(np.asarray([v for v in amplitude.make_parameter_dictionary().values()]))\n", - " state_preps.append(molecule.make_uccsd_ansatz(trotter_steps=1,initial_amplitudes=amplitude))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Next, we create the pytorch `DataSet` and `DataLoader` to load data from. To do so, we must implement our own inheritor from the basic pytorch `DataSet` class\n", - "\n", - "Our `Dataset` inheritor, named `AngleData`, needs to define `__len__` and `__getitem__` methods to function properly." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "class AngleData(torch.utils.data.Dataset):\n", - " \n", - " def __init__(self,data_list):\n", - " self.data_list=data_list\n", - " \n", - " def __len__(self):\n", - " return len(self.data_list)\n", - " \n", - " def __getitem__(self,idx):\n", - " return torch.from_numpy(self.data_list[idx]).to(torch.device('cuda:0'))\n", - " \n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### We now construct a `DataLoader`. We will enable batching, so that we train over random subsets over the data when we finally train the model." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "my_data = AngleData(amp_arrays)\n", - "my_loader = torch.utils.data.DataLoader(my_data,batch_size=4,shuffle=True) ### here's our data loader!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 2: Create an Ansatz `Objective`.\n", - "\n", - "Our autoencoder ansatz must be a circuit that both constructs the hydrogen wavefunction, and then compresses it. Furthermore, the autoencoder cost function must be encoded into the objective. The cost function can be defined as a hamiltonian which projects all the non-latent, or 'trash' qubits, onto the all zero state." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "combined state prep, encoder circuit: \n", - " circuit: \n", - "X(target=(0,))\n", - "X(target=(1,))\n", - "Trotterized(target=(0, 1, 2, 3), control=(), angles=[(1, 0, 1, 0), (1, 0, 1, 0), Objective with 0 unique expectation values\n", - "variables = [(1, 0, 1, 0)]\n", - "types = [], Objective with 0 unique expectation values\n", - "variables = [(1, 0, 1, 0)]\n", - "types = []], generators=[+0.1250X(0)X(1)Y(2)X(3)-0.1250Y(0)X(1)X(2)X(3)-0.1250Y(0)Y(1)Y(2)X(3)-0.1250X(0)Y(1)X(2)X(3)+0.1250Y(0)X(1)Y(2)Y(3)+0.1250X(0)X(1)X(2)Y(3)+0.1250X(0)Y(1)Y(2)Y(3)-0.1250Y(0)Y(1)X(2)Y(3), -0.1250Y(0)Y(1)Y(2)X(3)+0.1250Y(0)X(1)Y(2)Y(3)+0.1250X(0)X(1)Y(2)X(3)+0.1250X(0)Y(1)Y(2)Y(3)-0.1250Y(0)X(1)X(2)X(3)-0.1250Y(0)Y(1)X(2)Y(3)-0.1250X(0)Y(1)X(2)X(3)+0.1250X(0)X(1)X(2)Y(3)])\n", - "Rx(target=(0,), parameter=a)\n", - "Rx(target=(1,), parameter=b)\n", - "X(target=(3,), control=(1,))\n", - "X(target=(2,), control=(0,))\n", - "X(target=(1,), control=(0,))\n", - "\n" - ] - } - ], - "source": [ - "encoder = tq.gates.Rx('a',0) +tq.gates.Rx('b',1) +tq.gates.CNOT(1,3) +tq.gates.CNOT(0,2)+tq.gates.CNOT(0,1)\n", - "state_prep = state_preps[0] # every member of this list is the same object; it doesn't matter which we pick.\n", - "combined = state_prep + encoder\n", - "print('combined state prep, encoder circuit: \\n', combined)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "H2 autoencoder: Objective with 1 unique expectation values\n", - "variables = [(1, 0, 1, 0), a, b]\n", - "types = not compiled\n" - ] - } - ], - "source": [ - "# we decide that the 3rd and 4th qubits will be trash qubits. The hamiltonian below projects onto zero.\n", - "hamiltonian = tq.hamiltonian.paulis.Qm(2)*tq.hamiltonian.paulis.Qm(3)\n", - "h2_encoder = tq.ExpectationValue(U=combined,H=hamiltonian)\n", - "print('H2 autoencoder: ', h2_encoder)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 3: Convert the Tequila `Objective` into a PyTorch `Module`.\n", - "\n", - "in order for pytorch to interact with Tequila objectives, we need to build wrappers which allow the classes of pytorch and tequila to work together. For user convenience, this can be done with the class `TorchLayer`. \n", - "This class takes an `Objective`, a dict of compilation args (optional), and a list of `Variable`s of the objective which should be treater as input (I.e, loaded from the `DataLoader`), and will treat all the remaining variables as internal weights of the quantum neural network layer that the objective constitutes. If not specified in the compile_args dictionary, random values (between 0 and $2 \\pi$) will be used for the weights." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "input_variable=h2_encoder.extract_variables()[0]\n", - "inits={'a':1.5, 'b':1.5}\n", - "compile_args={'backend':'qulacs', 'initial_values':inits} # dict. allowed keys: backend, samples, noise, device, initial_values" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "WARNING:absl:No GPU/TPU found, falling back to CPU. (Set TF_CPP_MIN_LOG_LEVEL=0 and rerun for more info.)\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "TorchLayer(\n", - " Tequila TorchLayer. Represents: \n", - " Objective with 1 unique expectation values\n", - " variables = [(1, 0, 1, 0), a, b]\n", - " types = not compiled \n", - " Current Weights: {'b': Parameter containing:\n", - " tensor(1.5000, dtype=torch.float64, requires_grad=True), 'a': Parameter containing:\n", - " tensor(1.5000, dtype=torch.float64, requires_grad=True)}\n", - ")\n" - ] - } - ], - "source": [ - "my_torch_encoder = tq.ml.interface_torch.TorchLayer(h2_encoder,compile_args,input_vars=[input_variable])\n", - "print(my_torch_encoder)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 4: Optimize using PyTorch and plot the results.\n", - "\n", - "Once converted to a PyTorch layer, Tequila `Objective`'s can be optimized with the inbuilt tools of PyTorch. Do note that `TorchLayer` objects cannot be optimized with the tequila optimizers." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "*** Epoch 0 ***\n", - "0.2866195387587957\n", - "0.28661953875879626\n", - "0.2866195387587953\n", - "0.28661953875879653\n", - "0.28130235607019866\n", - "0.2813023560701979\n", - "0.28130235607019843\n", - "0.2813023560701981\n", - "0.27603301556135906\n", - "0.2760330155613586\n", - "0.2760330155613589\n", - "0.2760330155613585\n", - "0.27081289963294786\n", - "0.270812899632948\n", - "0.27081289963294825\n", - "0.2708128996329484\n" - ] - } - ], - "source": [ - "optim = torch.optim.Adam(my_torch_encoder.parameters(),lr=0.01)\n", - "loss_values = []\n", - "for epoch in range(30):\n", - " print('*** Epoch {} ***'.format(epoch))\n", - " batch = 0\n", - " batched_loss = []\n", - " for point in my_loader:\n", - " batch += 1\n", - " optim.zero_grad()\n", - " loss = my_torch_encoder(point)\n", - " loss = loss.mean()\n", - " batched_loss.append(loss)\n", - " loss.backward()\n", - "\n", - " optim.step()\n", - " bv = np.mean([l.detach().numpy() for l in batched_loss])\n", - " loss_values.append(bv)\n", - " print('Batched Average Loss: ', bv)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "plt.plot(loss_values, label='loss per epoch')\n", - "plt.legend()\n", - "plt.xlabel('Epoch', fontsize=18)\n", - "plt.ylabel('Autoencoder Loss', fontsize=16)\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## This concludes our tutorial. We hope you've enjoyed it!\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/tutorials/Quanv_Neural_Net/Filters.png b/tutorials/Quanv_Neural_Net/Filters.png deleted file mode 100644 index 9af19db8..00000000 Binary files a/tutorials/Quanv_Neural_Net/Filters.png and /dev/null differ diff --git a/tutorials/Quanv_Neural_Net/Our_approach.jpg b/tutorials/Quanv_Neural_Net/Our_approach.jpg deleted file mode 100644 index 73fe0e28..00000000 Binary files a/tutorials/Quanv_Neural_Net/Our_approach.jpg and /dev/null differ diff --git a/tutorials/Quanv_Neural_Net/Plots.png b/tutorials/Quanv_Neural_Net/Plots.png deleted file mode 100644 index dbd1b503..00000000 Binary files a/tutorials/Quanv_Neural_Net/Plots.png and /dev/null differ diff --git a/tutorials/Quanv_Neural_Net/Quantum_circuit.jpg b/tutorials/Quanv_Neural_Net/Quantum_circuit.jpg deleted file mode 100644 index 15760519..00000000 Binary files a/tutorials/Quanv_Neural_Net/Quantum_circuit.jpg and /dev/null differ diff --git a/tutorials/Quanvolutional Neural Networks.ipynb b/tutorials/Quanvolutional Neural Networks.ipynb deleted file mode 100644 index 5e636c4a..00000000 --- a/tutorials/Quanvolutional Neural Networks.ipynb +++ /dev/null @@ -1,714 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Exploring the application of quantum circuits in convolutional neural networks" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This tutorial will guide you through implementing a hybrid quantum-classical convolutional neural network using Tequila along with other packages such as Tensorflow. We will then train the model on the MNIST dataset, which contains images of handwritten numbers classifed according to the digit they represent. Finally, we will compare the accuracy and loss of models with and without the quantum preprocessing.\n", - "\n", - "Inspriation for this tutorial comes from [Pennylane: Quanvolutional Neural Networks](https://pennylane.ai/qml/demos/tutorial_quanvolution.html). We will similarly follow the method proposed in the reference paper used for this tutorial, [Henderson at al (2020)](https://doi.org/10.1007/s42484-020-00012-y)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Background" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Convolutional Neural Nets" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "An excellent high-level explanation of convolutional neural networks can be found [here](https://www.youtube.com/watch?v=FmpDIaiMIeA). Alternatively, an excellent written explanation can be found [here](http://neuralnetworksanddeeplearning.com/chap6.html) and for more information, the wikipedia article can be found [here](https://en.wikipedia.org/wiki/Convolutional_neural_network).\n", - "\n", - "In summary, a convolutional neural network includes preprocessing layers prior to optimisation layers so that features in the input (which are often images) are extracted and amplified. The result is a model with greater predictive power. This processing also improves classification of images as it extracts features even if they are translocated between images. This means that searching for a particular pixel distribution (for example the shape of a curve or line may be a useful feature when classifying digits) is not dependant on the distribution being in an identical location in each image where it is present. The convolutional process extracts this information even if it is slightly rotated or translocated.\n", - "\n", - "The implementation of the convolutional layer involves a grid for each feature being passed over the entire image. At each location, a score is calculated representing how well the feature and the section of the image match, and this becomes the value of the corresponding pixel in the output image. As a guide, a large score represents a close match, generally meaning that the feature is present at that location of the image, and a low score represents the absence of a match." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Our Approach" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Our general approach is similar to that used in a conventional convolutional neural network however the initial processing occurs by running the images through a quantum circuit instead of a convolutional filter. Each simulation of a circuit represents one 3x3 filter being applied to one 3x3 region of one image. The construction of the circuit is randomised (see below), however this construction only occurs once per filter such that each region of the image being transformed by the same filter gets run through the same circuit. A single, scalar output is generated from the circuit which is used as the pixel strength of the output image, and the remainder of the neural net uses only classical processing, specifically two further convolutional layers, max pooling and two fully connected layers. This architecture has been chosen to closely mimic the structure used in our reference paper (Henderson et al, 2020), however as they note, \"The QNN topology chosen in this work is not fixed by nature ... the QNN framework was designed to give users complete control over the number and order of quanvolutional layers in the architecture. The topology explored in this work was chosen because it was the simplest QNN architecture to use as a baseline for comparison against other purely classical networks. Future work would focus on exploring the impact of more complex architectural variations.\"" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Quantum Processing" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Henderson et al summarise the use of quantum circuits as convolutional layers: \"Quanvolutional layers are made up of a group of N quantum filters which operate much like their classical convolutional layer counterparts, producing feature maps by locally transforming input data. The key difference is that quanvolutional filters extract features from input data by transforming spatially local subsections of data using quantum circuits.\" Our approach to the circuit design is based on the paper and is as follows:\n", - "\n", - "1) The input images are iterated over and each 3x3 region is embedded into the quantum circuit using the threshold function: \n", - "$$|\\psi \\rangle = \\begin{cases} \n", - " |0\\rangle & if & strength\\leq 0 \\\\\n", - " |1\\rangle & if & strength > 0\n", - " \\end{cases}$$ \n", - "\n", - "As the pixel strengths are normalised to values between -0.5 and 0.5, it is expected that brighter regions of the image will intialise their corresponding qubit in the state $|1\\rangle$ and darker regions will intitialise the state $|0\\rangle$. Each pixel is represented by one qubit, such that 9 qubits are used in total, and this quantum circuit is reused for each 3x3 square in the filter.\n", - "\n", - "2) We next apply a random circuit to the qubits. To implement this, a random choice from Rx, Ry and Rz gates is applied to a random qubit, and the total number of gates applied in each layer is equal to the number of qubits. With a set probability (which we set to 0.3), a CNOT gate will be applied instead of the rotation to two random qubits. We have chosen to set the parameters of rotation with random numbers between (0,2π) however futher optimisation of the model could be found from using a variational circuit and optimising these parameters.\n", - "\n", - "3) Further layers could be applied of the random gates. To simplify, we only apply one layer.\n", - "\n", - "4) A scalar is outputted from the circuit and used as the corresponding pixel in the output image. We generate this number using the following method. The state vector of the final state of the circuit is simulated and the state corresponding to the most likely output (largest modulus) is selected. We then calculate the number of qubits for this state which are measured as a $|1\\rangle$. \n", - "\n", - "5) A total of four filters are applied to each image, and for each filter steps 1-3 are repeated with a different randomised circuit. The output image therefore contains a third dimension with four channels representing the four different outputted values which each filters produced." - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Code and Running the Program" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following code cell is used to import the necessary packages and to set parameters." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import math\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - "import tensorflow as tf\n", - "import tequila as tq\n", - "\n", - "from operator import itemgetter\n", - "from tensorflow import keras\n", - "\n", - "n_filters = 4 # Number of convolutional filters\n", - "filter_size = 3 # Size of filter = nxn (here 3x3)\n", - "pool_size = 2 # Used for the pooling layer\n", - "n_qubits = filter_size ** 2 # Number of qubits\n", - "n_layers = 1 # Number of quantum circuit layers\n", - "n_train = 1000 # Size of the training dataset\n", - "n_test = 200 # Size of the testing dataset\n", - "n_epochs = 100 # Number of optimization epochs\n", - "\n", - "SAVE_PATH = \"quanvolution/\" # Data saving folder\n", - "PREPROCESS = False # If False, skip quantum processing and load data from SAVE_PATH\n", - "tf.random.set_seed(1) # Seed for TensorFlow random number generator" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We start by creating the Dataset class. Here, we load the images and labels of handwritten digits from the MNIST dataset. We then reduce the number of images from 60,000 and 10,000 (for the training and testing sets respectively) down to the variables n_train and n_test, normalise the pixel values to within the range (-0.5,0.5) and reshape the images by adding a third dimension. Each image's shape is therefore transformed from (28, 28) to (28, 28, 1) as this is necessary for the convolutional layer." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "class Dataset:\n", - "\n", - " def __init__(self):\n", - " # Loading the full dataset of images from keras\n", - " # Shape of self.train_images is (60000, 28, 28), shape of self.train_labels is (60000,)\n", - " # For self.test_images and self.test_labels, shapes are (10000, 28, 28) and (10000,)\n", - " mnist_dataset = keras.datasets.mnist\n", - " (self.train_images, self.train_labels), (self.test_images, self.test_labels) = mnist_dataset.load_data()\n", - "\n", - " # Reduce dataset size to n_train and n_test\n", - " # First dimension of shapes are reduced to n_train and n_test\n", - " self.train_images = self.train_images[:n_train]\n", - " self.train_labels = self.train_labels[:n_train]\n", - " self.test_images = self.test_images[:n_test]\n", - " self.test_labels = self.test_labels[:n_test]\n", - "\n", - " # Normalize pixel values within -0.5 and +0.5\n", - " self.train_images = (self.train_images / 255) - 0.5\n", - " self.test_images = (self.test_images / 255) - 0.5\n", - "\n", - " # Add extra dimension for convolution channels\n", - " self.train_images = self.train_images[..., tf.newaxis]\n", - " self.test_images = self.test_images[..., tf.newaxis]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The next code cell contains the class used to generate the quantum circuit. In theory, the circuit could be either structured or random. We form a randomised circuit to match the reference paper (Henderson et al, 2020), however for simplicity, our implementation differs in some ways. We choose to use only use single qubit Rx($\\theta$), Ry($\\theta$) and Rz($\\theta$) gates and the two qubit CNOT gate compared to the choice of single qubit X($\\theta$), Y($\\theta$), Z($\\theta$), U($\\theta$), P, T, H and two qubit CNOT, SWAP, SQRTSWAP, or CU gates used in the paper. Furthermore, we chose to assign a two qubit gate to any random qubits with a certain probability (labelled ratio_imprim, set to 0.3) rather than setting a connection probabiltiy between each pair of qubits (this approach follows the Pennylane tutorial). The seed is used for reproducability and its value is set depending on which filter the circuit represents (see QuantumModel below).\n", - "\n", - "The parameters used for the rotation gates have the potential to be optimised using a cost function. For simplicity, and to mirror the paper, here we will use random parameters and we will not include these in the optimisation of the model. This means that the quantum processing only needs to happen once, prior to creating the neural net." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "class QuantumCircuit:\n", - " \n", - " def __init__(self, seed=None):\n", - " # Set random seed for reproducability\n", - " if seed: np.random.seed(seed)\n", - " \n", - " # Encode classical information into quantum circuit\n", - " # Bit flip gate is applied if the pixel strength > 0\n", - " self.circ = tq.QCircuit()\n", - " for i in range(n_qubits):\n", - " self.circ += tq.gates.X(i, power='input_{}'.format(i))\n", - "\n", - " # Add random layers to the circuit\n", - " self.circ += self.random_layers()\n", - " \n", - " def random_layers(self, ratio_imprim=0.3):\n", - " # Initialise circuit\n", - " circuit = tq.QCircuit()\n", - "\n", - " # Iterate over the number of layers, adding rotational and CNOT gates\n", - " # The number of rotational gates added per layer is equal to the number of qubits in the circuit\n", - " for i in range(n_layers):\n", - " j = 0\n", - " while (j < n_qubits):\n", - " if np.random.random() > ratio_imprim:\n", - " # Applies a random rotation gate to a random qubit with probability (1 - ratio_imprim)\n", - " rnd_qubit = np.random.randint(n_qubits)\n", - " circuit += np.random.choice(\n", - " [tq.gates.Rx(angle='l_{},th_{}'.format(i,j), target=rnd_qubit),\n", - " tq.gates.Ry(angle='l_{},th_{}'.format(i,j), target=rnd_qubit),\n", - " tq.gates.Rz(angle='l_{},th_{}'.format(i,j), target=rnd_qubit)])\n", - " j += 1\n", - " else:\n", - " # Applies the CNOT gate to 2 random qubits with probability ratio_imprim\n", - " if n_qubits > 1:\n", - " rnd_qubits = np.random.choice(range(n_qubits), 2, replace=False)\n", - " circuit += tq.gates.CNOT(target=rnd_qubits[0], control=rnd_qubits[1])\n", - " return circuit" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As an example to show the circuit used in this program, an instance of a circuit is drawn below. This will differ between calls if you remove the seed variable due to the random nature of forming the circuit." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "circuit = QuantumCircuit(seed=2)\n", - "tq.draw(circuit.circ, backend='qiskit')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We next show the QuantumModel class, used to generate the neural network for the images which undergo pre-processing through the quantum convolutional layer. If PREPROCESSING is set to True, each image from the dataset undergoes processing through a number of quantum circuits, determined by n_filters. The embedding used, the structure of the circuit and the method of extracting the output are described in the background of this tutorial. \n", - "\n", - "We use tensorflow to construct the neural net. The implementation we use contains two conventional convolutional layers, each followed by max pooling, and then one fully connected with 1024 nodes before the softmax output layer. We use a Relu activation function for the convolutional and fully connected layers. See the background section of this tutorial for some context on this choice of neural net." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "class QuantumModel:\n", - "\n", - " def __init__(self, dataset, parameters):\n", - " # Initialize dataset and parameters\n", - " self.ds = dataset\n", - " self.params = parameters\n", - " \n", - " # The images are run through the quantum convolutional layer\n", - " self.convolutional_layer()\n", - "\n", - " # The model is initialized\n", - " self.model = keras.models.Sequential([\n", - " keras.layers.Conv2D(n_filters, filter_size, activation='relu'),\n", - " keras.layers.MaxPooling2D(pool_size=pool_size),\n", - " keras.layers.Conv2D(n_filters, filter_size, activation='relu'),\n", - " keras.layers.MaxPooling2D(pool_size=pool_size),\n", - " keras.layers.Flatten(),\n", - " keras.layers.Dense(1024, activation=\"relu\"),\n", - " keras.layers.Dense(10, activation=\"softmax\")\n", - " ])\n", - "\n", - " # Compile model using the Adam optimiser\n", - " self.model.compile(\n", - " optimizer=keras.optimizers.Adam(learning_rate=0.00001),\n", - " loss=\"sparse_categorical_crossentropy\",\n", - " metrics=[\"accuracy\"]\n", - " )\n", - " \n", - " def convolutional_layer(self):\n", - " if PREPROCESS == True:\n", - " # Initate arrays to store processed images\n", - " self.q_train_images = [np.zeros((28-2, 28-2, n_filters)) for _ in range(len(self.ds.train_images))]\n", - " self.q_test_images = [np.zeros((28-2, 28-2, n_filters)) for _ in range(len(self.ds.test_images))]\n", - " \n", - " # Loop over the number of filters, applying a different randomised quantum circuit for each\n", - " for i in range(n_filters):\n", - " print('Filter {}/{}\\n'.format(i+1, n_filters))\n", - " \n", - " # Construct circuit\n", - " # We set the seed to be i+1 so that the circuits are reproducable but the design differs between filters\n", - " # We use i+1 not i to avoid setting the seed as 0 which sometimes produces random behaviour\n", - " circuit = QuantumCircuit(seed=i+1)\n", - " \n", - " # Apply the quantum processing to the train_images, analogous to a convolutional layer\n", - " print(\"Quantum pre-processing of train images:\")\n", - " for j, img in enumerate(self.ds.train_images):\n", - " print(\"{}/{} \".format(j+1, n_train), end=\"\\r\")\n", - " self.q_train_images[j][...,i] = (self.filter_(img, circuit, self.params[i]))\n", - " print('\\n')\n", - "\n", - " # Similarly for the test_images\n", - " print(\"Quantum pre-processing of test images:\")\n", - " for j, img in enumerate(self.ds.test_images):\n", - " print(\"{}/{} \".format(j+1, n_test), end=\"\\r\")\n", - " self.q_test_images[j][...,i] = (self.filter_(img, circuit, self.params[i]))\n", - " print('\\n')\n", - "\n", - " # Transform images to numpy array\n", - " self.q_train_images = np.asarray(self.q_train_images)\n", - " self.q_test_images = np.asarray(self.q_test_images)\n", - " \n", - " # Save pre-processed images\n", - " np.save(SAVE_PATH + \"q_train_images.npy\", self.q_train_images)\n", - " np.save(SAVE_PATH + \"q_test_images.npy\", self.q_test_images)\n", - " \n", - " # Load pre-processed images\n", - " self.q_train_images = np.load(SAVE_PATH + \"q_train_images.npy\")\n", - " self.q_test_images = np.load(SAVE_PATH + \"q_test_images.npy\")\n", - "\n", - " def filter_(self, image, circuit, variables):\n", - " # Initialize output image\n", - " output = np.zeros((28-2, 28-2))\n", - "\n", - " # Loop over the image co-ordinates (i,j) using a 3x3 square filter\n", - " for i in range(28-2):\n", - " for j in range(28-2):\n", - "\n", - " # Extract the value of each pixel in the 3x3 filter grid\n", - " image_pixels = [\n", - " image[i,j,0],\n", - " image[i,j+1,0],\n", - " image[i,j+2,0],\n", - " image[i+1,j,0],\n", - " image[i+1,j+1,0],\n", - " image[i+1,j+2,0],\n", - " image[i+2,j,0],\n", - " image[i+2,j+1,0],\n", - " image[i+2,j+2,0]\n", - " ]\n", - "\n", - " # Construct parameters used to embed the pixel strength into the circuit\n", - " input_variables = {}\n", - " for idx, strength in enumerate(image_pixels):\n", - " # If strength > 0, the power of the bit flip gate is 1\n", - " # Therefore this qubit starts in state |1>\n", - " if strength > 0:\n", - " input_variables['input_{}'.format(idx)] = 1\n", - " # Otherwise the gate is not applied and the initial state is |0>\n", - " else:\n", - " input_variables['input_{}'.format(idx)] = 0\n", - "\n", - " # Find the statevector of the circuit and determine the state which is most likely to be measured\n", - " wavefunction = tq.simulate(circuit.circ, variables={**variables, **input_variables})\n", - " amplitudes = [(k,(abs(wavefunction(k)))) for k in range(2**n_qubits) if wavefunction(k)]\n", - " max_idx = max(amplitudes,key=itemgetter(1))[0]\n", - " \n", - " # Count the number of qubits which output '1' in this state\n", - " result = len([k for k in str(bin(max_idx))[2::] if k == '1'])\n", - " output[i,j] = result\n", - " return output\n", - "\n", - " def train(self):\n", - " # Train the model on the dataset\n", - " self.history = self.model.fit(\n", - " self.q_train_images,\n", - " self.ds.train_labels,\n", - " validation_data=(self.q_test_images, self.ds.test_labels),\n", - " batch_size=4,\n", - " epochs=n_epochs,\n", - " verbose=2\n", - " )" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We also create a ClassicalModel class to run the images through a conventional convolutional neural network. The design of the neural net used here is identical to the QuantumModel class, however the images used are directly from the dataset and therefore have not been processed through the quantum layer. We include this as a control to compare the results from the quantum model." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "class ClassicalModel:\n", - "\n", - " def __init__(self, dataset):\n", - " # Initialize dataset and parameters\n", - " self.ds = dataset\n", - "\n", - " # The model is initialized\n", - " self.model = keras.models.Sequential([\n", - " keras.layers.Conv2D(n_filters, filter_size, activation='relu'),\n", - " keras.layers.MaxPooling2D(pool_size=pool_size),\n", - " keras.layers.Conv2D(n_filters, filter_size, activation='relu'),\n", - " keras.layers.MaxPooling2D(pool_size=pool_size),\n", - " keras.layers.Flatten(),\n", - " keras.layers.Dense(1024, activation=\"relu\"),\n", - " keras.layers.Dense(10, activation=\"softmax\")\n", - " ])\n", - "\n", - " # Compile model using the Adam optimiser\n", - " self.model.compile(\n", - " optimizer=keras.optimizers.Adam(learning_rate=0.00005),\n", - " loss=\"sparse_categorical_crossentropy\",\n", - " metrics=[\"accuracy\"]\n", - " )\n", - " \n", - " def train(self):\n", - " # Train the model on the dataset\n", - " self.history = self.model.fit(\n", - " self.ds.train_images,\n", - " self.ds.train_labels,\n", - " validation_data=(self.ds.test_images, self.ds.test_labels),\n", - " batch_size=4,\n", - " epochs=n_epochs,\n", - " verbose=2\n", - " )" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We are now able to run our program! The following code does this using the quantum_model and classical_model functions. Although the implementations are similar, quantum_model additionally defines the parameters used for the rotational gates in the circuit. We have limited the value of each parameter to the range (0,2π).\n", - "\n", - "Running the program takes some time. Our results are plotted below, so if you would rather not wait, either reduce the numbers in n_train and n_test or skip ahead!" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "def quantum_model():\n", - " # Generating parameters, each maps to a random number between 0 and 2*π\n", - " # parameters is a list of dictionaries, where each dictionary represents the parameter\n", - " # mapping for one filter\n", - " parameters = []\n", - " for i in range(n_filters):\n", - " filter_params = {}\n", - " for j in range(n_layers):\n", - " for k in range(n_qubits):\n", - " filter_params[tq.Variable(name='l_{},th_{}'.format(j,k))] = np.random.uniform(high=2*np.pi)\n", - " parameters.append(filter_params)\n", - " \n", - " # Initalise the dataset\n", - " ds = Dataset()\n", - " \n", - " # Initialise and train the model\n", - " model = QuantumModel(ds, parameters=parameters)\n", - " model.train()\n", - " \n", - " # Store the loss and accuracy of the model to return\n", - " loss = model.history.history['val_loss']\n", - " accuracy = model.history.history['val_accuracy']\n", - "\n", - " return model\n", - "\n", - "def classical_model():\n", - " # Initialise the dataset\n", - " ds = Dataset()\n", - " \n", - " # Initialise and train the model\n", - " model = ClassicalModel(ds)\n", - " model.train()\n", - " \n", - " # Store the loss and accuracy of the model to return\n", - " loss = model.history.history['val_loss']\n", - " accuracy = model.history.history['val_accuracy']\n", - " \n", - " return model\n", - "\n", - "model_q = quantum_model()\n", - "model_c = classical_model()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Plotting the Results" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The graphs showing the accuracy and loss of our models are included in this text box. These were generated using the function plot, available below. As shown, the results from the quantum processing lead to a model comparable to the classical control in both accuracy and loss. After running for 100 epochs, the quantum model results in a validation set accuracy of 0.9350, compared to the fully classical model which has a validation set accuracy of 0.9150.\n", - "" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def plot(model_q, model_c):\n", - "\n", - " plt.style.use(\"seaborn\")\n", - " fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(6, 9))\n", - "\n", - " # Plotting the graph for accuracy\n", - " ax1.plot(model_q.history.history['val_accuracy'], color=\"tab:red\", label=\"Quantum\")\n", - " ax1.plot(model_c.history.history['val_accuracy'], color=\"tab:green\", label=\"Classical\")\n", - " ax1.set_ylabel(\"Accuracy\")\n", - " ax1.set_ylim([0,1])\n", - " ax1.set_xlabel(\"Epoch\")\n", - " ax1.legend()\n", - "\n", - " # Plotting the graph for loss\n", - " ax2.plot(model_q.history.history['val_loss'], color=\"tab:red\", label=\"Quantum\")\n", - " ax2.plot(model_c.history.history['val_loss'], color=\"tab:green\", label=\"Classical\")\n", - " ax2.set_ylabel(\"Loss\")\n", - " ax2.set_xlabel(\"Epoch\")\n", - " ax2.legend()\n", - " \n", - " plt.tight_layout()\n", - " plt.show()\n", - "\n", - "plot(model_q, model_c)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Evaluating the Model" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let us now compare the behaviour of the two models. We do this by running the test images through each with the optimised weights and biases and seeing the results of the classification. This process is implemented using the Classification class, shown below." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Overall, our quantum model misclassified images 34, 37, 42, 54, 67, 74, 120, 127, 143, 150, 152, 166, and 185. The classical model misclassified images 8, 16, 21, 23, 54, 60, 61, 67, 74, 93, 113, 125, 134, 160, 168, 178, and 196. This means that in total, the quantum model misclassified 13 images and the classical model misclassified 17 images. Of these, only images 54, 67, and 74 were misclassified by both." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from termcolor import colored\n", - "\n", - "class Classification:\n", - " \n", - " def __init__(self, model, test_images):\n", - " # Initialising parameters\n", - " self.model = model\n", - " self.test_images = test_images\n", - " self.test_labels = model.ds.test_labels\n", - "\n", - " def classify(self):\n", - " # Create predictions on the test set\n", - " self.predictions = np.argmax(self.model.model.predict(self.test_images), axis=-1)\n", - "\n", - " # Keep track of the indices of images which were classified correctly and incorrectly\n", - " self.correct_indices = np.nonzero(self.predictions == self.test_labels)[0]\n", - " self.incorrect_indices = np.nonzero(self.predictions != self.test_labels)[0]\n", - " \n", - " def print_(self):\n", - " # Printing the total number of correctly and incorrectly classified images\n", - " print(len(self.correct_indices),\" classified correctly\")\n", - " print(len(self.incorrect_indices),\" classified incorrectly\")\n", - " print('\\n')\n", - "\n", - " # Printing the classification of each image\n", - " for i in range(n_test):\n", - " print(\"Image {}/{}\".format(i+1, n_test))\n", - " if i in self.correct_indices:\n", - " # The image was correctly classified\n", - " print('model predicts: {} - true classification: {}'.format(\n", - " self.predictions[i], self.test_labels[i]))\n", - " else:\n", - " # The image was not classified correctly\n", - " print(colored('model predicts: {} - true classification: {}'.format(\n", - " self.predictions[i], self.test_labels[i]), 'red'))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print('Quantum Model')\n", - "q_class = Classification(model_q, model_q.q_test_images)\n", - "q_class.classify()\n", - "q_class.print_()\n", - "\n", - "print('\\n')\n", - "\n", - "print('Classical Model')\n", - "c_class = Classification(model_c, model_c.ds.test_images)\n", - "c_class.classify()\n", - "c_class.print_()" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Lastly, we can see the effect that the quantum convolutional layer actually has on the images by plotting images after they have been run through the quantum filters, and to do this we use the function visualise, shown below. Included in this text box is a plot showing four images which have been run through our filters. The top row shows images from the original dataset, and each subsequent row shows the result from each of the four filters on that original image. It can be seen that the processing preserves the global shape of the digit while introducing local distortion.\n", - "" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def visualise(model):\n", - " # Setting n_samples to be the number of images to print\n", - " n_samples = 4\n", - " \n", - " fig, axes = plt.subplots(1 + n_filters, n_samples, figsize=(10, 10))\n", - " \n", - " # Iterate over each image\n", - " for i in range(n_samples):\n", - " \n", - " # Plot the original image from the dataset\n", - " axes[0, 0].set_ylabel(\"Input\")\n", - " if i != 0:\n", - " axes[0, i].yaxis.set_visible(False)\n", - " axes[0, i].imshow(model.ds.train_images[i, :, :, 0], cmap=\"gray\")\n", - "\n", - " # Plot the images generated by each filter\n", - " for c in range(n_filters):\n", - " axes[c + 1, 0].set_ylabel(\"Output [ch. {}]\".format(c))\n", - " if i != 0:\n", - " axes[c, i].yaxis.set_visible(False)\n", - " axes[c + 1, i].imshow(model.q_train_images[i, :, :, c], cmap=\"gray\")\n", - "\n", - " plt.tight_layout()\n", - " plt.show()\n", - " \n", - "visualise(model_q)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Resources used to make this tutorial:\n", - "\n", - "1. [Pennylane: Quanvolutional Neural Networks](https://pennylane.ai/qml/demos/tutorial_quanvolution.html)\n", - "2. Henderson, M., Shakya, S., Pradhan, S. et al. Quanvolutional neural networks: powering image recognition with quantum circuits. Quantum Mach. Intell. 2, 1–9 (2020). https://doi.org/10.1007/s42484-020-00012-y\n", - "3. [Keras for Beginners: Implementing a Convolutional Neural Network. Victor Zhou](https://victorzhou.com/blog/keras-cnn-tutorial/).\n", - "4. [CNNs, Part 1: An Introduction to Convolutional Neural Networks. Victor Zhou](https://victorzhou.com/blog/intro-to-cnns-part-1/).\n", - "5. [How Convolutional Neural Networks work](https://www.youtube.com/watch?v=FmpDIaiMIeA)\n", - "6. [Neural Networks and Deep Learning, chapter 6. Michael Nielsen](http://neuralnetworksanddeeplearning.com/chap6.html)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.10" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/tutorials/ReducedDensityMatrices.ipynb b/tutorials/ReducedDensityMatrices.ipynb deleted file mode 100644 index 44c338eb..00000000 --- a/tutorials/ReducedDensityMatrices.ipynb +++ /dev/null @@ -1,480 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Reduced Density Matrices in Tequila\n", - "\n", - "This notebook serves as a tutorial to the computation and usage of the one- and two-particle reduced density matrices." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import tequila as tq\n", - "import numpy" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## The 1- and 2-RDM\n", - "\n", - "First, look at the definition of the reduced density matrices (RDM) for some state $ |\\psi\\rangle$:\n", - "\n", - "1-RDM: $ \\gamma^p_q \\equiv \\langle \\psi | a^p a_q | \\psi\\rangle$\n", - "\n", - "2-RDM $ \\gamma^{pq}_{rs} \\equiv \\langle \\psi | a^p a^q a_s a_r | \\psi\\rangle$ (we mainly use the standard physics ordering for the second-quantized operators, i.e. $p,r$ go with particle 1 and $q,s$ with particle 2)\n", - "\n", - "The operators $ a^p = a_p^\\dagger $ and $a_p$ denote the standard fermionic creation and annihilation operators.\n", - "\n", - "Since we work on a quantum computer, $|\\psi\\rangle$ is represented by some unitary transformation $U$: $|\\psi\\rangle = U |0\\rangle^{\\otimes N_q}$, using $N_q$ qubits. This corresponds to $N_q$ spin-orbitals in Jordan-Wigner encoding. Obtaining the RDMs from a quantum computer is most intuitive when using the Jordan-Wigner transformation, since the results directly correspond to the ones computed classically in second quantized form.\n", - "\n", - "It is worth mentioning that since we only consider real orbitals in chemistry applications, the implementation also expects only real-valued RDM's.\n", - "The well-known anticommutation relations yield a series of symmetry properties for the reduced density matrices, which can be taken into consideration to reduce the computational cost:\n", - "\\begin{align} \\gamma^p_q &= \\gamma^q_p \\\\ \\gamma^{pq}_{rs} &= -\\gamma^{qp}_{rs} = -\\gamma^{pq}_{sr} = \\gamma^{qp}_{sr} = \\gamma^{rs}_{pq}\\end{align}\n", - "\n", - "In chemistry applications, solving the electronic structure problem involves the electronic Hamiltonian (here in Born-Oppenheimer approximation)\n", - "$$ H_{el} = h_0 + \\sum_{pq} h^q_p a^p_q + \\frac{1}{2}\\sum_{pqrs} h^{rs}_{pq} a^{pq}_{rs}$$\n", - "with the one- and two-body integrals $h^q_p, h^{rs}_{pq}$ that turn out to be independent of spin.\n", - "\n", - "Therefore, we introduce the spin-free RDMs $\\Gamma^P_Q$ and $\\Gamma^{PQ}_{RS}$, obtained by spin-summation (we write molecular orbitals in uppercase letters $P,Q,\\ldots\\in\\{1,\\ldots,N_p\\}$ in opposite to spin-orbitals $p,q,\\ldots\\in\\{1,\\ldots,N_q\\}$):\n", - "\n", - "\\begin{align} \\Gamma^P_Q &= \\sum_{\\sigma \\in \\{\\alpha, \\beta\\}} \\gamma^{p\\sigma}_{q\\sigma} = \\langle \\psi |\\sum_{\\sigma} a^{p\\sigma} a_{q\\sigma} | \\psi\\rangle \\\\\n", - " \\Gamma^{PQ}_{RS} &= \\sum_{\\sigma,\\tau \\in \\{\\alpha, \\beta\\}} \\gamma^{p\\sigma q\\tau}_{r\\sigma s\\tau} = \\langle \\psi | \\sum_{\\sigma,\\tau} a^{p\\sigma} a^{q\\tau} a_{s\\tau} a_{r\\sigma} | \\psi \\rangle. \\end{align}\n", - " \n", - "Note, that by making use of linearity, we obtain the second equality in the two expressions above. Performing the summation before evaluating the expected value means less expected values and a considerable reduction in computational cost (only $N_p=\\frac{N_q}{2}$ molecular orbitals vs. $N_q$ spin-orbitals).\n", - "\n", - "Due to the orthogonality of the spin states, the symmetries for the spin-free 2-RDM are slightly less than for the spin-orbital RDM:\n", - "\\begin{align} \\Gamma^P_Q &= \\Gamma^Q_P\\\\\n", - " \\Gamma^{PQ}_{RS} &= \\Gamma^{QP}_{SR} = \\Gamma^{RS}_{PQ} \\end{align}" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Optimizer: \n", - "backend : qulacs\n", - "device : None\n", - "samples : None\n", - "save_history : True\n", - "noise : None\n", - "\n", - "Method : BFGS\n", - "Objective : 1 expectationvalues\n", - "gradient : 12 expectationvalues\n", - "\n", - "active variables : 3\n", - "\n", - "E=-1.64501793 angles= {a1: 0.9750975289027688, a2: 0.9195439775408228, a3: 3.49947562895891} samples= None\n", - "E=-2.71423735 angles= {a1: 0.027272521865900456, a2: 0.5712705986200453, a3: 3.520294120034508} samples= None\n", - "E=-2.83675244 angles= {a1: -0.32223270411892413, a2: -0.04569099158289358, a3: 3.5188489289335756} samples= None\n", - "E=-2.86970164 angles= {a1: -0.13709848313691403, a2: 0.02172805360757754, a3: 3.5204102536245103} samples= None\n", - "E=-2.86981377 angles= {a1: -0.13088348290012078, a2: 0.008088333832009013, a3: 3.519022680895903} samples= None\n", - "E=-2.86981636 angles= {a1: -0.13079375632116388, a2: 0.007733482556698751, a3: 3.5173894007616413} samples= None\n", - "E=-2.86982553 angles= {a1: -0.13043485000533636, a2: 0.006314077455457701, a3: 3.510856280224594} samples= None\n", - "E=-2.86984780 angles= {a1: -0.13007285288854895, a2: 0.004740925916254425, a3: 3.494264102407214} samples= None\n", - "E=-2.86988975 angles= {a1: -0.12972368573501192, a2: 0.0029648395618087795, a3: 3.4613580852617147} samples= None\n", - "E=-2.86996535 angles= {a1: -0.12942551842632163, a2: 0.0008468777208130323, a3: 3.394945842601524} samples= None\n", - "E=-2.87008241 angles= {a1: -0.12941852758214206, a2: -0.001404284566265573, a3: 3.2550600292581557} samples= None\n", - "E=-2.87014838 angles= {a1: -0.13025095945928908, a2: -0.0011199665930895575, a3: 3.0890426632635295} samples= None\n", - "E=-2.87015769 angles= {a1: -0.1309236921681526, a2: 0.0010325708853818772, a3: 3.0701586033329873} samples= None\n", - "E=-2.87016207 angles= {a1: -0.13164011434830297, a2: 0.003920028405061652, a3: 3.0733549062345684} samples= None\n", - "Optimization terminated successfully.\n", - " Current function value: -2.870162\n", - " Iterations: 12\n", - " Function evaluations: 14\n", - " Gradient evaluations: 14\n" - ] - } - ], - "source": [ - "# As an example, let's use the Helium atom in a minimal basis\n", - "mol = tq.chemistry.Molecule(geometry='He 0.0 0.0 0.0', basis_set='6-31g')\n", - "\n", - "# We want to get the 1- and 2-RDM for the (approximate) ground state of Helium\n", - "# For that, we (i) need to set up a unitary transformation U(angles)\n", - "# (ii) determine a set of angles using VQE s.th. U(angles) |0> = |psi>, where H|psi> = E_0|psi>\n", - "# (iii) compute the RDMs using compute_rdms\n", - "\n", - "# (i) Set up a circuit\n", - "# This can be done either using the make_uccsd-method (see Chemistry-tutorial) or by a hand-written circuit\n", - "# We use a hand-written circuit here\n", - "U = tq.gates.X(target=0)\n", - "U += tq.gates.X(target=1)\n", - "U += tq.gates.Ry(target=3, control=0, angle='a1')\n", - "U += tq.gates.X(target=0)\n", - "U += tq.gates.X(target=1, control=3)\n", - "U += tq.gates.Ry(target=2, control=1, angle='a2')\n", - "U += tq.gates.X(target=1)\n", - "U += tq.gates.Ry(target=2, control=1, angle='a3')\n", - "U += tq.gates.X(target=1)\n", - "U += tq.gates.X(target=2)\n", - "U += tq.gates.X(target=0, control=2)\n", - "U += tq.gates.X(target=2)\n", - "\n", - "# (ii) Run VQE\n", - "H = mol.make_hamiltonian()\n", - "O = tq.objective.objective.ExpectationValue(H=H, U=U)\n", - "result = tq.minimize(objective=O, method='bfgs')\n" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "The spin-free matrices:\n", - "1-RDM:\n", - "[[ 1.99134915 -0.00391427]\n", - " [-0.00391427 0.00865085]]\n", - "2-RDM:\n", - "[[[[ 1.99134029e+00 -4.19031562e-03]\n", - " [-4.19031562e-03 -1.31183605e-01]]\n", - "\n", - " [[-4.19031562e-03 8.85898841e-06]\n", - " [ 8.77611396e-06 2.76045591e-04]]]\n", - "\n", - "\n", - " [[[-4.19031562e-03 8.77611396e-06]\n", - " [ 8.85898841e-06 2.76045591e-04]]\n", - "\n", - " [[-1.31183605e-01 2.76045591e-04]\n", - " [ 2.76045591e-04 8.64198765e-03]]]]\n", - "\n", - "The spin-ful matrices:\n", - "1-RDM has not been computed. Return None for 1-RDM.\n", - "1-RDM is None now: None\n", - "2-RDM has been determined:\n", - "[[[[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]\n", - " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]\n", - " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]\n", - " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]]\n", - "\n", - " [[ 0.00000000e+00 9.95670147e-01 0.00000000e+00 -2.23878547e-03]\n", - " [-9.95670147e-01 0.00000000e+00 1.95153015e-03 0.00000000e+00]\n", - " [-0.00000000e+00 -1.95153015e-03 0.00000000e+00 -6.55918025e-02]\n", - " [ 2.23878547e-03 -0.00000000e+00 6.55918025e-02 0.00000000e+00]]\n", - "\n", - " [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]\n", - " [-0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]\n", - " [-0.00000000e+00 -0.00000000e+00 0.00000000e+00 0.00000000e+00]\n", - " [-0.00000000e+00 -0.00000000e+00 -0.00000000e+00 0.00000000e+00]]\n", - "\n", - " [[ 0.00000000e+00 -2.23878547e-03 0.00000000e+00 5.03395665e-06]\n", - " [ 2.23878547e-03 0.00000000e+00 -4.38805698e-06 0.00000000e+00]\n", - " [-0.00000000e+00 4.38805698e-06 0.00000000e+00 1.47484561e-04]\n", - " [-5.03395665e-06 -0.00000000e+00 -1.47484561e-04 0.00000000e+00]]]\n", - "\n", - "\n", - " [[[ 0.00000000e+00 -9.95670147e-01 -0.00000000e+00 2.23878547e-03]\n", - " [ 9.95670147e-01 0.00000000e+00 -1.95153015e-03 -0.00000000e+00]\n", - " [ 0.00000000e+00 1.95153015e-03 0.00000000e+00 6.55918025e-02]\n", - " [-2.23878547e-03 0.00000000e+00 -6.55918025e-02 0.00000000e+00]]\n", - "\n", - " [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]\n", - " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]\n", - " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]\n", - " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]]\n", - "\n", - " [[ 0.00000000e+00 1.95153015e-03 0.00000000e+00 -4.38805698e-06]\n", - " [-1.95153015e-03 0.00000000e+00 3.82503176e-06 0.00000000e+00]\n", - " [-0.00000000e+00 -3.82503176e-06 0.00000000e+00 -1.28561031e-04]\n", - " [ 4.38805698e-06 -0.00000000e+00 1.28561031e-04 0.00000000e+00]]\n", - "\n", - " [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]\n", - " [-0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]\n", - " [-0.00000000e+00 -0.00000000e+00 0.00000000e+00 0.00000000e+00]\n", - " [-0.00000000e+00 -0.00000000e+00 -0.00000000e+00 0.00000000e+00]]]\n", - "\n", - "\n", - " [[[ 0.00000000e+00 -0.00000000e+00 -0.00000000e+00 -0.00000000e+00]\n", - " [ 0.00000000e+00 0.00000000e+00 -0.00000000e+00 -0.00000000e+00]\n", - " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 -0.00000000e+00]\n", - " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]]\n", - "\n", - " [[ 0.00000000e+00 -1.95153015e-03 -0.00000000e+00 4.38805698e-06]\n", - " [ 1.95153015e-03 0.00000000e+00 -3.82503176e-06 -0.00000000e+00]\n", - " [ 0.00000000e+00 3.82503176e-06 0.00000000e+00 1.28561031e-04]\n", - " [-4.38805698e-06 0.00000000e+00 -1.28561031e-04 0.00000000e+00]]\n", - "\n", - " [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]\n", - " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]\n", - " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]\n", - " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]]\n", - "\n", - " [[ 0.00000000e+00 -6.55918025e-02 0.00000000e+00 1.47484561e-04]\n", - " [ 6.55918025e-02 0.00000000e+00 -1.28561031e-04 0.00000000e+00]\n", - " [-0.00000000e+00 1.28561031e-04 0.00000000e+00 4.32099382e-03]\n", - " [-1.47484561e-04 -0.00000000e+00 -4.32099382e-03 0.00000000e+00]]]\n", - "\n", - "\n", - " [[[ 0.00000000e+00 2.23878547e-03 -0.00000000e+00 -5.03395665e-06]\n", - " [-2.23878547e-03 0.00000000e+00 4.38805698e-06 -0.00000000e+00]\n", - " [ 0.00000000e+00 -4.38805698e-06 0.00000000e+00 -1.47484561e-04]\n", - " [ 5.03395665e-06 0.00000000e+00 1.47484561e-04 0.00000000e+00]]\n", - "\n", - " [[ 0.00000000e+00 -0.00000000e+00 -0.00000000e+00 -0.00000000e+00]\n", - " [ 0.00000000e+00 0.00000000e+00 -0.00000000e+00 -0.00000000e+00]\n", - " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 -0.00000000e+00]\n", - " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]]\n", - "\n", - " [[ 0.00000000e+00 6.55918025e-02 -0.00000000e+00 -1.47484561e-04]\n", - " [-6.55918025e-02 0.00000000e+00 1.28561031e-04 -0.00000000e+00]\n", - " [ 0.00000000e+00 -1.28561031e-04 0.00000000e+00 -4.32099382e-03]\n", - " [ 1.47484561e-04 0.00000000e+00 4.32099382e-03 0.00000000e+00]]\n", - "\n", - " [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]\n", - " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]\n", - " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]\n", - " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]]]]\n", - "1-RDM is also here now:\n", - "[[ 0.99567518 0. -0.00180405 0. ]\n", - " [ 0. 0.99567397 0. -0.00211022]\n", - " [-0.00180405 0. 0.00432482 0. ]\n", - " [ 0. -0.00211022 0. 0.00432603]]\n" - ] - } - ], - "source": [ - "# (iii) Using the optimal parameters out of VQE, we know have a circuit U_opt |0> ~ U|0> = |psi> \n", - "mol.compute_rdms(U=U, variables=result.angles, spin_free=True, get_rdm1=True, get_rdm2=True)\n", - "rdm1_spinfree, rdm2_spinfree = mol.rdm1, mol.rdm2\n", - "print('\\nThe spin-free matrices:')\n", - "print('1-RDM:\\n' + str(rdm1_spinfree))\n", - "print('2-RDM:\\n' + str(rdm2_spinfree))\n", - "\n", - "\n", - "# Let's also get the spin-orbital rdm2\n", - "# We can select to only determine one of either matrix, but if both are needed at some point, it is \n", - "# more efficient to compute both within one call of compute_rdms\n", - "print('\\nThe spin-ful matrices:')\n", - "mol.compute_rdms(U=U, variables=result.angles, spin_free=False, get_rdm1=False, get_rdm2=True)\n", - "rdm1_spin, rdm2_spin = mol.rdm1, mol.rdm2\n", - "print('1-RDM is None now: ' + str(rdm1_spin))\n", - "print('2-RDM has been determined:\\n' + str(rdm2_spin))\n", - "\n", - "# We can compute the 1-rdm still at a later point\n", - "mol.compute_rdms(U=U, variables=result.angles, spin_free=False, get_rdm1=True, get_rdm2=False)\n", - "rdm1_spin = mol.rdm1\n", - "print('1-RDM is also here now:\\n' + str(rdm1_spin))" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Consistency of spin summation:\n", - "1-RDM: True\n", - "2-RDM: True\n" - ] - } - ], - "source": [ - "# To check consistency with the spin-free rdms, we can do spin-summation afterwards \n", - "# (again, if only the spin-free version is of interest, it is cheaper to get it right from compute_rdms) \n", - "rdm1_spinsum, rdm2_spinsum = mol.rdm_spinsum(sum_rdm1=True, sum_rdm2=True)\n", - "print('\\nConsistency of spin summation:')\n", - "print('1-RDM: ' + str(numpy.allclose(rdm1_spinsum, rdm1_spinfree, atol=1e-10)))\n", - "print('2-RDM: ' + str(numpy.allclose(rdm2_spinsum, rdm2_spinfree, atol=1e-10)))" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Psi4-RDMs:\n", - "1-RDM:\n", - "[[ 1.9913455 -0.00385072]\n", - " [-0.00385072 0.0086545 ]]\n", - "2-RDM:\n", - "[[[[ 1.99133696e+00 -4.12235350e-03]\n", - " [-4.12235350e-03 -1.31213704e-01]]\n", - "\n", - " [[-4.12235350e-03 8.53386376e-06]\n", - " [ 8.53386376e-06 2.71631211e-04]]]\n", - "\n", - "\n", - " [[[-4.12235350e-03 8.53386376e-06]\n", - " [ 8.53386376e-06 2.71631211e-04]]\n", - "\n", - " [[-1.31213704e-01 2.71631211e-04]\n", - " [ 2.71631211e-04 8.64596819e-03]]]]\n", - "\n", - "FCI energy: -2.870162138900821\n", - "VQE-Energy: -2.870162072561385\n" - ] - } - ], - "source": [ - "# We can also compute the RDMs using the psi4-interface.\n", - "# Then, psi4 is called to perform a CI-calculation, while collecting the 1- and 2-RDM\n", - "# Let's use full CI here, but other CI flavors work as well\n", - "mol.compute_rdms(psi4_method='fci')\n", - "rdm1_psi4, rdm2_psi4 = mol.rdm1, mol.rdm2\n", - "print('\\nPsi4-RDMs:')\n", - "print('1-RDM:\\n' + str(rdm1_psi4))\n", - "print('2-RDM:\\n' + str(rdm2_psi4))\n", - "\n", - "# Comparing the results to the VQE-matrices, we observe a close resemblance,\n", - "# also suggested by the obtained energies\n", - "fci_energy = mol.logs['fci'].variables['FCI TOTAL ENERGY']\n", - "vqe_energy = result.energy\n", - "print('\\nFCI energy: ' + str(fci_energy))\n", - "print('VQE-Energy: ' + str(vqe_energy))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": { - "name": "#%% md\n" - } - }, - "source": [ - "## Consistency checks\n", - "\n", - "At this point, we can make a few consistency checks.\n", - "\n", - "We can validate the trace condition for the 1- and 2-RDM:\n", - "\n", - "\\begin{align}\\mathrm{tr}(\\mathbf{\\Gamma}_m)&=N!/(N-m)!\\\\ \\mathrm{tr} (\\mathbf{\\Gamma}_1) &= \\sum_P \\Gamma^P_P = N \\\\\n", - " \\mathrm{tr} (\\mathbf{\\Gamma}_2) &= \\sum_{PQ} \\Gamma^{PQ}_{PQ} = N(N-1), \\end{align}\n", - "\n", - "$N$ describes the number of particles involved, i.e. in our case using a minimal basis this corresponds to $N_p$ above. For the Helium atom in Born-Oppenheimer approximation, $N_p=2$.\n", - "In the literature, one can also find the $m$-particle reduced density matrices normalized by a factor $1/m!$, which in that case would be inherited by the trace conditions.\n", - "\n", - "Also, the (in our case, as we use the wavefunction from VQE, ground-state) energy can be computed by\n", - "\n", - "\\begin{equation} E = \\langle H_{el} \\rangle = h_0 + \\sum_{PQ} h^Q_P \\Gamma^P_Q + \\frac{1}{2}\\sum_{PQRS} h^{RS}_{PQ} \\Gamma^{PQ}_{RS}, \\end{equation}\n", - "\n", - "where $h_0$ denotes the nuclear repulsion energy, which is 0 for Helium anyways.\n", - "\n", - "Note, that the expressions above also hold true for the spin-RDMs, given that the one- and two-body integrals are available in spin-orbital basis.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1-RDM: N_true = 2, N_spin = 2.0000000000000004, N_spinfree = 2.0000000000000004.\n", - "2-RDM: N*(N-1)_true = 2, spin = 2.0000000000000004, spinfree = 2.000000000000001.\n", - "h0 is zero: 0.0\n", - "\n", - "VQE-Energy is: -2.870162072561385\n", - "RDM-energy matches: -2.870162072561384\n" - ] - } - ], - "source": [ - "# Computation of consistency checks\n", - "#todo: normalization of rdm2 *= 1/2\n", - "# Trace\n", - "tr1_spin = numpy.einsum('pp', rdm1_spin, optimize='greedy')\n", - "tr1_spinfree = numpy.einsum('pp', rdm1_spinfree, optimize='greedy')\n", - "\n", - "tr2_spin = numpy.einsum('pqpq', rdm2_spin, optimize='greedy')\n", - "tr2_spinfree = numpy.einsum('pqpq', rdm2_spinfree, optimize='greedy')\n", - "\n", - "print(\"1-RDM: N_true = 2, N_spin = \" + str(tr1_spin) + \", N_spinfree = \" + str(tr1_spinfree)+\".\")\n", - "print(\"2-RDM: N*(N-1)_true = 2, spin = \" + str(tr2_spin) + \", spinfree = \" + str(tr2_spinfree)+\".\")\n", - "\n", - "# Energy\n", - "# Get molecular integrals\n", - "h0 = mol.molecule.nuclear_repulsion\n", - "print(\"h0 is zero: \" + str(h0))\n", - "h1 = mol.molecule.one_body_integrals\n", - "h2 = mol.molecule.two_body_integrals\n", - "# Reorder two-body-integrals according to physics convention\n", - "h2 = tq.chemistry.qc_base.NBodyTensor(elems=h2, ordering='openfermion')\n", - "h2.reorder(to='phys')\n", - "h2 = h2.elems\n", - "# Compute energy\n", - "rdm_energy = numpy.einsum('qp, pq', h1, rdm1_spinfree, optimize='greedy') + 1/2*numpy.einsum('rspq, pqrs', h2, rdm2_spinfree, optimize='greedy')\n", - "print('\\nVQE-Energy is: ' + str(vqe_energy))\n", - "print('RDM-energy matches: ' + str(rdm_energy))\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": { - "name": "#%% md\n" - } - }, - "source": [ - "## References \n", - "... for the definition of the reduced density matrices, spin-free formulation, symmetries:\n", - "1. Kutzelnigg, W., Shamasundar, K. R. & Mukherjee, D. Spinfree formulation of reduced density matrices, density cumulants and generalised normal ordering. Mol. Phys. 108, 433–451 (2010).\n", - "2. Helgaker, T., Jørgensen, P. & Olsen, J. Molecular Electronic-Structure Theory (John Wiley & Sons, Ltd, 2000). \n", - "\n", - "## Possible applications\n", - "So far, the content of this notebook is comparably trivial, and misses some interesting applications. An interesting possilibity on how to make use of the RDM's obtained by a quantum computer is given by a technique that has been named quantum subspace expansion, which e.g. can be used to approximate excited states [3], decode quantum errors [4] or improve the accuracy of results [5]. \n", - "References herefore:\n", - "3. McClean, J. R., Kimchi-Schwartz, M. E., Carter, J. & De Jong, W. A. Hybrid quantum-classical hierarchy for mitigation of decoherence and determination of excited states. Phys. Rev. A 95, 1–10 (2017).\n", - "4. McClean, J. R., Jiang, Z., Rubin, N. C., Babbush, R. & Neven, H. Decoding quantum errors with subspace expansions. Nat. Commun. 11, 1–9 (2020).\n", - "5. Takeshita, T. et al. Increasing the Representation Accuracy of Quantum Simulations of Chemistry without Extra Quantum Resources. Phys. Rev. X 10, 11004 (2020).\n", - "\n", - "Everybody is invited to enrich this notebook by implementing one of the techniques mentioned, or some other application of the 1- and 2-RDM!\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "tequila-chemistry", - "language": "python", - "name": "tequila-chemistry" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.7" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/tutorials/SingleQubitClassifier_tutorial.ipynb b/tutorials/SingleQubitClassifier_tutorial.ipynb deleted file mode 100644 index 74dfe003..00000000 --- a/tutorials/SingleQubitClassifier_tutorial.ipynb +++ /dev/null @@ -1,682 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Single-qubit classifier with data re-uploading tutorial\n", - "\n", - "This tutorial shows:\n", - "- How to construct a fidelity cost function for an optimization problem\n", - "- How to construct a quantum classifier with one qubit\n", - "\n", - "Based on [Data re-uploading for a universal quantum classifier](https://quantum-journal.org/papers/q-2020-02-06-226/), A. Pérez-Salinas, A. Cervera-Lierta, E. Gil-Fuster, and J. I. Latorre, *Quantum **4**, 226 (2020)*." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import tequila as tq\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "from numpy import random\n", - "import time" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Introduction\n", - "\n", - "Single-qubit operations are just rotations on the Bloch sphere. A collection of single-qubit rotations can be reduced to a single one by combining their angles: you can always move from one point to another on the Bloch sphere with a single operation. \n", - "\n", - "Because of this property, a single-qubit classifier with simple parameterized rotations can not treat complex data. Even if it succeeds to classify one data point, it will probably misclassify the others since rotational angles have been only adapted to one particular point. To circumvent this limitation one can introduce the data points into these angles, so each rotation will be data point-dependent. This methodology is called data re-uploading and it can be shown that a single-qubit classifier can be universal using this technique.\n", - "\n", - "The strategy to train this single-qubit classifier is the following. Given a problem with 𝑛n classes, we choose 𝑛n vectors on the Bloch sphere. Then, we train the classifier by constructing a cost function that adds penalties if the final state of the classifier is far from the target state that corresponds to its class.\n", - "\n", - "The single-qubit classifier circuit is divided into layers. Each layer comprises single-qubit rotations that encode a data training point and parameters to be optimized. $$ L\\left(\\vec{x};\\vec{\\theta}_{i}\\right) = U\\left(\\vec{x}\\right)U\\left(\\vec{\\theta}_{i}\\right) $$\n", - "By considering more layers, the final state of the classifier will have a richer structure in terms of the data point $\\vec{x}$.\n", - "\n", - "$$ \\mathcal{U}_{class}\\left(\\vec{x};\\vec{\\theta}_{1},\\vec{\\theta}_{2},...,\\vec{\\theta}_{l}\\right) = L\\left(\\vec{x};\\vec{\\theta}_{1}\\right)L\\left(\\vec{x};\\vec{\\theta}_{2}\\right)\\cdots L\\left(\\vec{x};\\vec{\\theta}_{l}\\right)$$\n", - "\n", - "We will run a $\\mathcal{U}_{class}$ for each training point $\\vec{x}$, but the parameters $\\vec{\\theta}$ are the same. These are the variables to be optimized classically through the cost function." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Model" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's define the model that we would like to classify. Let's start with a simple model with two classes: a circle of radius $r =\\sqrt{2/\\pi}$ centered at (0,0). Data points will be distributed in a square of length 2 centered at (0,0). The particular choice of the circle radius implies that a random classification will have a $\\sim 50$% accuracy.\n", - "\n", - "`circle` function will have two parts:\n", - "- `random = True`: generate and label random points according to their position inside or outside the circle (used for training)\n", - "- `random = False`: computes the label of a given point `x_input` (used for testing)" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "np.random.seed(42)\n", - "\n", - "def circle(samples = False, random = True, x_input = False, center=[0.0, 0.0], radius=np.sqrt(2 / np.pi)): \n", - " \"\"\"\n", - " Args:\n", - " samples (int): number of samples to generate\n", - " random = True: generates and labels sample random points\n", - " random = False: labels x_input point\n", - " x_input (array[tuple]): given point to be labeled if random = False\n", - " center (tuple): center of the circle\n", - " radius (float): radius of the circle\n", - "\n", - " Returns:\n", - " if random = True:\n", - " xvals (array[tuple]): data points coordinates \n", - " yvals (array[int]): corresponding data labels\n", - " if random = False:\n", - " y (int): label of x_input point\n", - " \"\"\"\n", - " xvals, yvals = [], []\n", - "\n", - " if random == True:\n", - " for i in range(samples):\n", - " x = 2 * (np.random.rand(2)) - 1\n", - " y = 0\n", - " if np.linalg.norm(x - center) < radius:\n", - " y = 1\n", - " xvals.append(x)\n", - " yvals.append(y) \n", - " return np.array(xvals), np.array(yvals)\n", - " \n", - " if random == False:\n", - " y = 0\n", - " if np.linalg.norm(x_input - center) < radius:\n", - " y = 1\n", - " return y" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Target states\n", - "\n", - "Next step is to fix the classes states. The classifier will be trained to return these states depending on the data point. To reduce the uncertanty, target states should be as much distanced as possible. With a single qubit, that means to choose points in the Bloch sphere as much separated as possible.\n", - "For a two-class problem, an easy choice is $|0\\rangle$ and $|1\\rangle$ states." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "# |0> : points inside the circle\n", - "# |1> : points outside the circle\n", - "def targ_wfn(y, nclass):\n", - " \"\"\"\n", - " Arg:\n", - " - y (int): class label\n", - " - nclass: number of classes\n", - " Returns:\n", - " - wfn: wavefunction of the target state\n", - " \"\"\"\n", - " if nclass == 2:\n", - " if y==0:\n", - " wfn = tq.QubitWaveFunction.from_array(np.asarray([1,0]))\n", - " if y==1:\n", - " wfn = tq.QubitWaveFunction.from_array(np.asarray([0,1]))\n", - " else:\n", - " raise Exception(\"nclass = {} is not considered\".format(nclass))\n", - " return wfn" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Single-qubit classifier circuit\n", - "\n", - "The single-qubit classifier has a layer structure, i.e. we have to decide how to design one layer and then how many layers we would like to consider. \n", - "We will consider the following structure: each layer is a collection of rotational gates which angles are a linear function of a data point with the free parameters to be optimized. In particular,\n", - "$$L\\left(\\vec{x};\\vec{\\theta}_{i}\\right) = R_{z}\\left(x^{2}+\\theta_{i}^{2}\\right) R_{y}\\left(x^{1}+\\theta_{i}^{1}\\right).$$\n", - "Then, each layer adds 2 parameters to be optimized. The data points $(x^1,x^2)$ are re-uploaded in each layer." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "# single-qubit quantum classifier circuit\n", - "def qcircuit(xval, param):\n", - " \"\"\"\n", - " Arg:\n", - " - xval (array[tuple]): data point\n", - " - param (dict): parameters dictionary\n", - " Returns:\n", - " - qc: quantum circuit\n", - " \"\"\"\n", - " layers = int((len(param))/2) # 2 parameters/layer\n", - " # initialize the circuit \n", - " qc = tq.gates.Rz(0.0,0)\n", - " for p in range(0,2*layers-1):\n", - " # add layers to the circuit\n", - " qc += tq.gates.Ry(xval[0] + param[p],0) + tq.gates.Rz(xval[1] + param[p+1],0) \n", - " return qc" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Cost function\n", - "\n", - "The cost function for this quantum classifier model will be constructed from the fidelity of the classifier final state respect to the target state of its corresponding class. It will penalize that the output state is far from its label state.\n", - "\n", - "First, we define the fidelity between two states as an objective (see State Preparation Tutorial). Then, we construct the simplest cost function of this kind: average of squared infidelities for all training points $M$: $$ \\chi^2 = \\sum_{i=1}^{M}\\left(1-|\\langle\\psi_{target}|\\psi_{circuit}\\rangle|^2\\right)^2$$ " - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "# Fidelity objective\n", - "def fid(wfn_targ, qc):\n", - " \"\"\"\n", - " Arg:\n", - " - wfn_targ: target wavefunction\n", - " - qc : quantum circuit \n", - " Returns:\n", - " - O: objective\n", - " \"\"\" \n", - " rho_targ = tq.paulis.Projector(wfn=wfn_targ)\n", - " O = tq.Objective.ExpectationValue(U=qc, H=rho_targ)\n", - " # fidelity = tq.simulate(O)\n", - " return O \n", - "\n", - "# cost function: sum of all infidelities for each data point respect the label state\n", - "def cost(x, y, param, nclass):\n", - " \"\"\"\n", - " Arg:\n", - " - x (array[tuple]): training points\n", - " - y (array[int]): labels of training points\n", - " - param (dict): parameters dictionary\n", - " - nclass (int): number of classes\n", - " Returns:\n", - " - loss/ len(x): loss objective\n", - " \"\"\" \n", - " loss = 0.0\n", - " # M = len(y): number of training points\n", - " for i in range(len(y)):\n", - " \n", - " # state generated by the classifier\n", - " qc = qcircuit(x[i], param)\n", - " # fidelity objective respect to the label state\n", - " f = fid(targ_wfn(y[i],nclass), qc)\n", - " \n", - " loss = loss + (1 - f)**2\n", - " \n", - " return loss / len(x)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Training\n", - "\n", - "We have now all the ingredients to train a single-qubit classifier with data re-uploading. \n", - "If a gradient based optimization is chosen for this type of optimization problems, numerical gradients are adviced since analytical ones become quite expensive." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Optimizer: \n", - "backend : qulacs\n", - "samples : None\n", - "save_history : True\n", - "noise : None\n", - "\n", - "Objective : 400 expectationvalues\n", - "Gradient : 2400 expectationvalues\n", - "gradient instr : {'method': '2-point', 'stepsize': 0.0001}\n", - "active variables : 6\n", - "Iteration: 1 , Energy: +0.23346574, angles: {th_3: 4.946478475226956, th_1: -1.984857687022879, th_5: 6.094228093092652, th_0: -1.7808298315353657, th_2: 2.0305330159430013, th_4: 8.89720462977007}\n", - "Iteration: 2 , Energy: +0.24568509, angles: {th_3: 5.177458750101836, th_1: -1.5046410048962369, th_5: 6.094228093092652, th_0: -1.9668793788050198, th_2: 0.25366461000251084, th_4: 9.429982384992186}\n", - "Iteration: 3 , Energy: +0.34273167, angles: {th_3: 2.610709683911139, th_1: -4.11965271230925, th_5: 6.094228093092652, th_0: -3.990162105280362, th_2: -0.837018339540754, th_4: 12.077363592549728}\n", - "Iteration: 4 , Energy: +0.41100568, angles: {th_3: 4.081797701231221, th_1: -4.1998105692556384, th_5: 6.094228092741568, th_0: -2.9373123644616017, th_2: -1.5325493513295756, th_4: 13.399512918875173}\n", - "Iteration: 5 , Energy: +0.31916175, angles: {th_3: 2.391303024200917, th_1: -6.472994601839014, th_5: 6.094228092566027, th_0: -1.469593533147448, th_2: -2.518924236681155, th_4: 16.237487146769446}\n", - "Iteration: 6 , Energy: +0.18903087, angles: {th_3: 0.6054755106135814, th_1: -4.350076845031609, th_5: 6.094228092566027, th_0: -1.1529563858416918, th_2: -0.7674481295413216, th_4: 18.32308007272708}\n", - "Iteration: 7 , Energy: +0.24706587, angles: {th_3: 1.4170489917460554, th_1: -4.558366452437925, th_5: 6.094228092653798, th_0: -2.1858732633280455, th_2: -0.9235025623782028, th_4: 18.780993200577786}\n", - "Iteration: 8 , Energy: +0.18957480, angles: {th_3: 1.9605822789058145, th_1: -5.527640916329952, th_5: 6.094228092917111, th_0: -0.6687996002617134, th_2: -0.6889772782590158, th_4: 18.081389154242707}\n", - "Iteration: 9 , Energy: +0.28645830, angles: {th_3: 1.5788772007046856, th_1: -5.638779777627052, th_5: 6.094228092917111, th_0: -1.4139949979544377, th_2: -1.1512637374432393, th_4: 18.302153905481166}\n", - "Iteration: 10 , Energy: +0.27527401, angles: {th_3: 1.9429922146972913, th_1: -3.3228180477941693, th_5: 6.094228092917111, th_0: -0.24408389064543945, th_2: -0.4065263357136326, th_4: 18.028189277072833}\n", - "Iteration: 11 , Energy: +0.35620661, angles: {th_3: 1.0124985821386665, th_1: -2.7198954044125903, th_5: 6.094228092917111, th_0: -1.1758665832184727, th_2: 0.5522929556759827, th_4: 18.22237564643069}\n", - "Iteration: 12 , Energy: +0.44487047, angles: {th_3: 1.1112520918477444, th_1: -3.9067179067828812, th_5: 6.094228092566027, th_0: -0.18357759524889428, th_2: 0.03411429510428532, th_4: 16.46264976481032}\n", - "Iteration: 13 , Energy: +0.42685449, angles: {th_3: 1.2325104045554103, th_1: -4.072692525957542, th_5: 6.094228092566027, th_0: 0.10939902088916315, th_2: -0.055096351638694016, th_4: 16.59816347483484}\n", - "Iteration: 14 , Energy: +0.34285833, angles: {th_3: 1.4761533353437757, th_1: -4.352859605727501, th_5: 6.094228092390486, th_0: 0.5966751190598111, th_2: -0.15525908773195382, th_4: 15.946300817175157}\n", - "Iteration: 15 , Energy: +0.24247172, angles: {th_3: 1.6173198552966495, th_1: -4.1330938378716136, th_5: 6.094228092390486, th_0: 1.65366489806398, th_2: -0.6388307499464642, th_4: 16.87896707644589}\n", - "Iteration: 16 , Energy: +0.39483818, angles: {th_3: 2.8481206217076585, th_1: -4.487703249247993, th_5: 6.094228092390486, th_0: 1.8400279979008418, th_2: -0.9650933280230857, th_4: 15.585817651249961}\n", - "Iteration: 17 , Energy: +0.27508621, angles: {th_3: 2.2162219128518137, th_1: -5.889468130975258, th_5: 6.094228092214944, th_0: 2.937610605260691, th_2: 0.43306029369383003, th_4: 15.90076008635952}\n", - "Iteration: 18 , Energy: +0.48031298, angles: {th_3: 2.684871117752545, th_1: -6.800326063824976, th_5: 6.094228092214944, th_0: 1.7001186344333665, th_2: -0.34452812545836253, th_4: 15.313179237809887}\n", - "Iteration: 19 , Energy: +0.21267641, angles: {th_3: 2.286365476919264, th_1: -6.659406894086995, th_5: 6.094228092214944, th_0: 2.0929719729582534, th_2: 0.3059640782082854, th_4: 16.222552166459543}\n", - "Iteration: 20 , Energy: +0.32503084, angles: {th_3: 3.2241173588294663, th_1: -5.657084658027705, th_5: 6.094228092214944, th_0: 2.6679421963461443, th_2: 1.6407345543803808, th_4: 15.467050145055921}\n", - "Iteration: 21 , Energy: +0.27935990, angles: {th_3: 4.221413997884369, th_1: -6.374904874373444, th_5: 6.094228092214944, th_0: 2.612994029050794, th_2: 0.6782232406793727, th_4: 14.86419372549831}\n", - "Iteration: 22 , Energy: +0.19863393, angles: {th_3: 3.47027118879744, th_1: -6.338229376646779, th_5: 6.094228092214944, th_0: 1.9971066773120791, th_2: 1.194983782417867, th_4: 15.27353515841565}\n", - "Iteration: 23 , Energy: +0.26671554, angles: {th_3: 3.662205090196048, th_1: -5.707411470049467, th_5: 6.094228092039403, th_0: 2.8099838552259264, th_2: 1.389251309702725, th_4: 14.850343188441416}\n", - "Iteration: 24 , Energy: +0.21274836, angles: {th_3: 3.0898423342680106, th_1: -6.5519832630022545, th_5: 6.094228092214944, th_0: 2.152020370382946, th_2: 0.9887132300617262, th_4: 15.296486874185222}\n", - "Iteration: 25 , Energy: +0.36602784, angles: {th_3: 2.6891695311404993, th_1: -5.936112863610033, th_5: 6.094228092127174, th_0: 2.980234658898297, th_2: 1.5815527807912622, th_4: 15.560262926035247}\n", - "Iteration: 26 , Energy: +0.24158921, angles: {th_3: 3.409715353455571, th_1: -6.361890418817886, th_5: 6.094228092127174, th_0: 3.022455564057973, th_2: 0.6262280088869862, th_4: 14.50904115792866}\n", - "Iteration: 27 , Energy: +0.18608619, angles: {th_3: 3.0834232299395294, th_1: -6.296330472820181, th_5: 6.094228092039403, th_0: 2.7872761259614878, th_2: 1.023418502075567, th_4: 14.952048996853069}\n", - "Iteration: 28 , Energy: +0.17754118, angles: {th_3: 3.0371505017716784, th_1: -6.492048609689606, th_5: 6.094228092039403, th_0: 2.2877832968744105, th_2: 1.2395874129421671, th_4: 15.086758626511878}\n", - "Iteration: 29 , Energy: +0.18608412, angles: {th_3: 3.074299424409819, th_1: -6.204269435559897, th_5: 6.094228091863862, th_0: 2.75714679055503, th_2: 1.3003205205787245, th_4: 14.780658253368301}\n", - "Iteration: 30 , Energy: +0.21493439, angles: {th_3: 3.1577509559180865, th_1: -6.639392298741426, th_5: 6.094228092039403, th_0: 1.9995711417799913, th_2: 1.1828672166361436, th_4: 14.663838792706517}\n", - "Iteration: 31 , Energy: +0.34254717, angles: {th_3: 3.2213886056114784, th_1: -5.7084740834087855, th_5: 6.094228092127174, th_0: 2.709958474367021, th_2: 2.166789939531257, th_4: 14.281913449927501}\n", - "Iteration: 32 , Energy: +0.16377244, angles: {th_3: 2.8757783340131784, th_1: -6.742959592116579, th_5: 6.094228092127174, th_0: 2.326440389557296, th_2: 1.528269897793077, th_4: 14.203612756148074}\n", - "Iteration: 33 , Energy: +0.20947398, angles: {th_3: 3.239703089715265, th_1: -6.349045734168509, th_5: 6.094228092127174, th_0: 2.4778918825144505, th_2: 2.137200149949036, th_4: 14.531946217524446}\n", - "Iteration: 34 , Energy: +0.22543889, angles: {th_3: 3.4614157573555455, th_1: -7.034369045003935, th_5: 6.094228092214944, th_0: 2.067083095824484, th_2: 1.2204399760451303, th_4: 13.693325353763923}\n", - "Iteration: 35 , Energy: +0.21571020, angles: {th_3: 3.790969245517053, th_1: -6.904596024140315, th_5: 6.094228092127174, th_0: 1.9319416376325338, th_2: 1.2330038975521695, th_4: 14.0769633595208}\n", - "Iteration: 36 , Energy: +0.19462980, angles: {th_3: 3.5106090007235586, th_1: -6.648830769599903, th_5: 6.094228092127174, th_0: 1.9596364079983677, th_2: 1.2136058321458942, th_4: 13.967210009026068}\n", - "Iteration: 37 , Energy: +0.15196217, angles: {th_3: 3.2645398521838014, th_1: -6.523197874516416, th_5: 6.094228092302715, th_0: 1.8983517410764497, th_2: 1.4826854004867693, th_4: 14.406907729572346}\n", - "Iteration: 38 , Energy: +0.20612016, angles: {th_3: 3.281643959582436, th_1: -6.042624303725983, th_5: 6.094228092390486, th_0: 2.286633100883763, th_2: 1.8936310652527946, th_4: 14.07461250620441}\n", - "Iteration: 39 , Energy: +0.25849102, angles: {th_3: 2.5626097961751575, th_1: -6.9244844223056825, th_5: 6.094228092390486, th_0: 1.5694612639252516, th_2: 1.7455295850302581, th_4: 14.472298554297666}\n", - "Iteration: 40 , Energy: +0.27171714, angles: {th_3: 2.8985899398239416, th_1: -7.066848416023331, th_5: 6.094228092214944, th_0: 2.3009155169940034, th_2: 2.3215461628340415, th_4: 14.900547121215178}\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Iteration: 41 , Energy: +0.27351703, angles: {th_3: 3.452908352358718, th_1: -7.398473506404077, th_5: 6.094228092214944, th_0: 1.627776254006628, th_2: 1.2608637559952656, th_4: 13.63493103602002}\n", - "Iteration: 42 , Energy: +0.35737091, angles: {th_3: 4.553558656948698, th_1: -6.7042127977622155, th_5: 6.094228092214944, th_0: 1.9244567911280526, th_2: 0.93460323863955, th_4: 13.063472313300254}\n", - "Iteration: 43 , Energy: +0.19349412, angles: {th_3: 3.953903564269512, th_1: -7.557485544117341, th_5: 6.094228092214944, th_0: 1.7651270844891558, th_2: 0.317637019548183, th_4: 12.833143489443227}\n", - "Iteration: 44 , Energy: +0.21530995, angles: {th_3: 3.9445072673771846, th_1: -7.205325878212042, th_5: 6.094228092127174, th_0: 1.9594346163123462, th_2: 0.8501455701129129, th_4: 12.787207775036142}\n", - "Iteration: 45 , Energy: +0.23432223, angles: {th_3: 4.280702847342054, th_1: -7.675339150546164, th_5: 6.094228092039403, th_0: 1.3500085973620568, th_2: 0.20468086875281521, th_4: 13.236707001036063}\n", - "Iteration: 46 , Energy: +0.23823995, angles: {th_3: 4.8338919668493325, th_1: -7.331869097571729, th_5: 6.094228092039403, th_0: 1.8287811669617056, th_2: 0.9429047365363817, th_4: 13.055170236788197}\n", - "Iteration: 47 , Energy: +0.20822536, angles: {th_3: 4.361708990353019, th_1: -8.023482407478324, th_5: 6.094228092039403, th_0: 1.056929365040268, th_2: 0.670253701185874, th_4: 13.130322104089348}\n", - "Iteration: 48 , Energy: +0.17055145, angles: {th_3: 5.051602517433779, th_1: -7.644620013052963, th_5: 6.094228092039403, th_0: 1.4916697513362105, th_2: 1.2658391589207776, th_4: 13.287063353898331}\n", - "Iteration: 49 , Energy: +0.15644585, angles: {th_3: 4.660880524964364, th_1: -8.057935510196726, th_5: 6.094228092039403, th_0: 0.7918361884318273, th_2: 0.9910421920307322, th_4: 13.235637450252272}\n", - "Iteration: 50 , Energy: +0.13931492, angles: {th_3: 5.0580688907062665, th_1: -7.793996928902407, th_5: 6.094228092127174, th_0: 1.1983232138942936, th_2: 1.4670942050958797, th_4: 13.267797137211707}\n", - "Iteration: 51 , Energy: +0.12903456, angles: {th_3: 4.771479868741357, th_1: -7.9837185505510515, th_5: 6.094228092127174, th_0: 0.8625056570080385, th_2: 1.204383512257321, th_4: 13.108813339257527}\n", - "Iteration: 52 , Energy: +0.12559798, angles: {th_3: 4.98125217252257, th_1: -7.807906895549483, th_5: 6.094228092127174, th_0: 1.044764957452592, th_2: 1.362678135309873, th_4: 13.366421071661764}\n", - "Iteration: 53 , Energy: +0.12495464, angles: {th_3: 4.69305193692976, th_1: -7.861371942139247, th_5: 6.094228092214944, th_0: 0.9353211401631215, th_2: 1.2011872852405892, th_4: 13.129517704225472}\n", - "Iteration: 54 , Energy: +0.12340179, angles: {th_3: 4.936094038195731, th_1: -7.770850280623866, th_5: 6.0942280921710585, th_0: 1.0572198979387908, th_2: 1.2787183920417509, th_4: 13.408832231694015}\n", - "Iteration: 55 , Energy: +0.12309626, angles: {th_3: 4.683816597587706, th_1: -7.82951011313291, th_5: 6.094228092214944, th_0: 0.9561738333037721, th_2: 1.1879094933231817, th_4: 13.158107395215522}\n", - "Iteration: 56 , Energy: +0.12170781, angles: {th_3: 4.911808363113215, th_1: -7.76453066199796, th_5: 6.094228091951631, th_0: 1.0701108249610845, th_2: 1.262136289420533, th_4: 13.394553828807046}\n", - "Iteration: 57 , Energy: +0.12157504, angles: {th_3: 4.696660236574852, th_1: -7.83244546622441, th_5: 6.094228091732204, th_0: 0.964355407776066, th_2: 1.183684683973458, th_4: 13.18061557545445}\n", - "Iteration: 58 , Energy: +0.12080088, angles: {th_3: 4.902803144589126, th_1: -7.766831620116396, th_5: 6.09422809177609, th_0: 1.0744435895509528, th_2: 1.2656604774365974, th_4: 13.376758206826539}\n", - "Iteration: 59 , Energy: +0.12080264, angles: {th_3: 4.707066955805717, th_1: -7.839303190608812, th_5: 6.094228091644434, th_0: 0.9650884251305405, th_2: 1.1821843031369421, th_4: 13.195214303141476}\n", - "Iteration: 60 , Energy: +0.12035644, angles: {th_3: 4.898573680329141, th_1: -7.768839626221817, th_5: 6.094228091600548, th_0: 1.0769612119841336, th_2: 1.2718918936785197, th_4: 13.36328752922645}\n", - "Iteration: 61 , Energy: +0.12040906, angles: {th_3: 4.7143426807904385, th_1: -7.845351608033194, th_5: 6.094228091512777, th_0: 0.9634244375762026, th_2: 1.180959987555384, th_4: 13.205526487026852}\n", - "Iteration: 62 , Energy: +0.12013492, angles: {th_3: 4.89600920730607, th_1: -7.769956886083983, th_5: 6.094228091425006, th_0: 1.0792327283469185, th_2: 1.2777287659672485, th_4: 13.352978290019507}\n", - "Iteration: 63 , Energy: +0.12019812, angles: {th_3: 4.719741196339664, th_1: -7.850480848269502, th_5: 6.094228091556663, th_0: 0.9611782674798437, th_2: 1.179668913534335, th_4: 13.213505337244515}\n", - "Iteration: 64 , Energy: +0.12002535, angles: {th_3: 4.894185875396285, th_1: -7.770566122413799, th_5: 6.094228091512777, th_0: 1.0814118385898457, th_2: 1.2828430813124987, th_4: 13.34465617664418}\n", - "Iteration: 65 , Energy: +0.12008076, angles: {th_3: 4.724055760250107, th_1: -7.85490620704768, th_5: 6.094228091512777, th_0: 0.958917666778088, th_2: 1.1784007674190615, th_4: 13.220056094544681}\n", - "Iteration: 66 , Energy: +0.11997247, angles: {th_3: 4.892723644173142, th_1: -7.7709629716373, th_5: 6.094228091556663, th_0: 1.083425368783214, th_2: 1.2872623684358218, th_4: 13.33766890541127}\n", - "Iteration: 67 , Energy: +0.12001089, angles: {th_3: 4.727715742078817, th_1: -7.858740989442286, th_5: 6.094228091425006, th_0: 0.9568739796527451, th_2: 1.177265555504233, th_4: 13.22562855288492}\n", - "Iteration: 68 , Energy: +0.11994468, angles: {th_3: 4.891416651940482, th_1: -7.771311370105099, th_5: 6.094228091337236, th_0: 1.0851948631147241, th_2: 1.2910087369094434, th_4: 13.331667987264042}\n", - "Iteration: 69 , Energy: +0.11996162, angles: {th_3: 4.730953076041807, th_1: -7.862023670826112, th_5: 6.09422809129335, th_0: 0.9551685602252362, th_2: 1.176330561046258, th_4: 13.230472264435855}\n", - "Iteration: 70 , Energy: +0.11992258, angles: {th_3: 4.890140687891554, th_1: -7.771689639427715, th_5: 6.094228091468891, th_0: 1.0866715312040136, th_2: 1.2940885114541796, th_4: 13.326453359041457}\n", - "Iteration: 71 , Energy: +0.11991667, angles: {th_3: 4.73389429179969, th_1: -7.864768417807101, th_5: 6.0942280914250055, th_0: 0.9538626554867287, th_2: 1.1756217761448176, th_4: 13.234744010449923}\n", - "Iteration: 72 , Energy: +0.11989466, angles: {th_3: 4.8888236008840344, th_1: -7.772125449617496, th_5: 6.0942280914250055, th_0: 1.0878387789628203, th_2: 1.2965181809583015, th_4: 13.321893650811377}\n", - "Iteration: 73 , Energy: +0.11986683, angles: {th_3: 4.736608973604429, th_1: -7.866995075522574, th_5: 6.0942280914250055, th_0: 0.9529711819376367, th_2: 1.1751345537200286, th_4: 13.238554649461083}\n", - "Iteration: 74 , Energy: +0.11985515, angles: {th_3: 4.887430941626703, th_1: -7.77261845733443, th_5: 6.094228091556662, th_0: 1.0887072829929545, th_2: 1.298338326318377, th_4: 13.31788819942079}\n", - "Iteration: 75 , Energy: +0.11980791, angles: {th_3: 4.739136622134703, th_1: -7.868740800161042, th_5: 6.094228091556662, th_0: 0.9524726767645145, th_2: 1.1748448667120777, th_4: 13.241989658657687}\n", - "Iteration: 76 , Energy: +0.11980241, angles: {th_3: 4.885955131823388, th_1: -7.773155207981415, th_5: 6.0942280914250055, th_0: 1.0893070082117084, th_2: 1.2996137495647841, th_4: 13.314350687174324}\n", - "Iteration: 77 , Energy: +0.11973915, angles: {th_3: 4.741501875762922, th_1: -7.870059667199072, th_5: 6.094228091556662, th_0: 0.9523208482881762, th_2: 1.1747192556781487, th_4: 13.24511794452558}\n", - "Iteration: 78 , Energy: +0.11973750, angles: {th_3: 4.8844057904983345, th_1: -7.7737185140255045, th_5: 6.094228091600548, th_0: 1.0896784689485228, th_2: 1.3004253988110606, th_4: 13.311203635002913}\n", - "Iteration: 79 , Energy: +0.11966183, angles: {th_3: 4.743722719058127, th_1: -7.871016200317344, th_5: 6.094228091600548, th_0: 0.9524564893772971, th_2: 1.174722348766722, th_4: 13.247995756820911}\n", - "Iteration: 80 , Energy: +0.11966284, angles: {th_3: 4.882801475298847, th_1: -7.774292556531517, th_5: 6.094228091732204, th_0: 1.0898651845068064, th_2: 1.3008598124852675, th_4: 13.308377632827188}\n", - "Iteration: 81 , Energy: +0.11957821, angles: {th_3: 4.745814388430758, th_1: -7.871677504420807, th_5: 6.0942280916883185, th_0: 0.9528175720208616, th_2: 1.1748215441443248, th_4: 13.250668914437625}\n", - "Iteration: 82 , Energy: +0.11958137, angles: {th_3: 4.881163451233291, th_1: -7.774864941119107, th_5: 6.0942280916883185, th_0: 1.0899084186024144, th_2: 1.3010000225933562, th_4: 13.305811897384885}\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Iteration: 83 , Energy: +0.11949074, angles: {th_3: 4.747790871215765, th_1: -7.872106862764496, th_5: 6.094228091512777, th_0: 0.953346243024107, th_2: 1.174989205748752, th_4: 13.25317462147549}\n", - "Iteration: 84 , Energy: +0.11949588, angles: {th_3: 4.879511674436276, th_1: -7.77542694381215, th_5: 6.094228091512777, th_0: 1.0898443091435657, th_2: 1.300919666280762, th_4: 13.303454565852546}\n", - "Iteration: 85 , Energy: +0.11940169, angles: {th_3: 4.749665288344107, th_1: -7.872359862561018, th_5: 6.094228091512777, th_0: 0.953992622446227, th_2: 1.1752031380212837, th_4: 13.255543190724907}\n", - "Iteration: 86 , Energy: +0.11940878, angles: {th_3: 4.877862694635358, th_1: -7.775972933772485, th_5: 6.094228091600548, th_0: 1.089702868111344, th_2: 1.3006803513536878, th_4: 13.301262280304371}\n", - "Iteration: 87 , Energy: +0.11931291, angles: {th_3: 4.751449909069185, th_1: -7.872482881481733, th_5: 6.094228091468891, th_0: 0.9547160773764097, th_2: 1.1754461172227222, th_4: 13.257799635361732}\n", - "Iteration: 88 , Energy: +0.11932194, angles: {th_3: 4.876228931321227, th_1: -7.776499588387041, th_5: 6.094228091468891, th_0: 1.089508152012567, th_2: 1.3003314453781933, th_4: 13.29919918789301}\n", - "Iteration: 89 , Energy: +0.11922583, angles: {th_3: 4.753156137983769, th_1: -7.872513225910726, th_5: 6.0942280914250055, th_0: 0.9554848835207264, th_2: 1.1757050503207387, th_4: 13.259965039065278}\n", - "Iteration: 90 , Energy: +0.11923677, angles: {th_3: 4.8746187693106355, th_1: -7.777005191986608, th_5: 6.094228091468891, th_0: 1.0892790084573687, th_2: 1.2999112763831913, th_4: 13.2972356492063}\n", - "Iteration: 91 , Energy: +0.11914147, angles: {th_3: 4.754794575817218, th_1: -7.87248016907876, th_5: 6.0942280914250055, th_0: 0.956275074286904, th_2: 1.175970091098098, th_4: 13.262057668253918}\n", - "Iteration: 92 , Energy: +0.11915424, angles: {th_3: 4.87303704355402, th_1: -7.777489105946069, th_5: 6.0942280914250055, th_0: 1.0890300050203252, th_2: 1.2994489272748093, th_4: 13.295346908453466}\n", - "Iteration: 93 , Energy: +0.11906051, angles: {th_3: 4.756375150067583, th_1: -7.872406323966117, th_5: 6.094228091293349, th_0: 0.9570690282549251, th_2: 1.1762338622509514, th_4: 13.264093843856315}\n", - "Iteration: 94 , Energy: +0.11907502, angles: {th_3: 4.871485636822082, th_1: -7.777951401614059, th_5: 6.094228091337235, th_0: 1.0887723263826419, th_2: 1.2989661028445254, th_4: 13.293511878161997}\n", - "Iteration: 95 , Energy: +0.11898339, angles: {th_3: 4.757907284619115, th_1: -7.872309011877777, th_5: 6.094228091205578, th_0: 0.9578541074513943, th_2: 1.1764908260543958, th_4: 13.266088617903543}\n", - "Iteration: 96 , Energy: +0.11899951, angles: {th_3: 4.869964041233722, th_1: -7.778392617357314, th_5: 6.094228091293349, th_0: 1.0885145485795444, th_2: 1.2984788025406138, th_4: 13.291712100323416}\n", - "Iteration: 97 , Energy: +0.11891037, angles: {th_3: 4.759400082059777, th_1: -7.872201464734745, th_5: 6.094228091337235, th_0: 0.9586214868729757, th_2: 1.1767367967149163, th_4: 13.268056305973213}\n", - "Iteration: 98 , Energy: +0.11892795, angles: {th_3: 4.868469819065048, th_1: -7.7788136009269655, th_5: 6.094228091337235, th_0: 1.088263268133242, th_2: 1.2979987019104118, th_4: 13.289930888644408}\n", - "Iteration: 99 , Energy: +0.11884157, angles: {th_3: 4.760862504007687, th_1: -7.87209380933516, th_5: 6.094228091293349, th_0: 0.9593652123465327, th_2: 1.1769685695678753, th_4: 13.270010920694222}\n" - ] - } - ], - "source": [ - "layers = 3\n", - "nclass = 2\n", - "training_set = 400\n", - "\n", - "# generate the training set and its corresponding labels\n", - "xdata, ydata = circle(training_set)\n", - "\n", - "# generate the variational parameters\n", - "param = [tq.Variable(name='th_{}'.format(i)) for i in range(0,2*layers)]\n", - "\n", - "# initialize the variational parameters\n", - "# note that due to the random initialization the result can be different from time to time\n", - "# With gradient based optimization you might get stuck\n", - "inval = {key : random.uniform(0, 2*np.pi) for key in param}\n", - "\n", - "grad = '2-point' # numerical gradient (= None: analytical gradient)\n", - "mthd = 'rmsprop' # scipy minimization method\n", - "mthd_opt = {'eps':1.e-4} # method options (that's the stepsize for the gradients)\n", - "\n", - "obj = cost(xdata, ydata, param, nclass) # objective to be optimized: cost function\n", - "\n", - "t0 = time.time()\n", - "# depending on the optimizer this will take a while\n", - "test = tq.minimize(objective=obj, initial_values=inval, method = mthd,\n", - " gradient = grad, method_options = mthd_opt, silent=False)\n", - "t1 = time.time()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Extract the results:" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "loss = 0.11884156841701687\n", - "method: rmsprop\n", - "method parameters: {'eps': 0.0001}\n", - "execution time = 35.648783659935 min\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "None\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "None\n" - ] - } - ], - "source": [ - "print(\"loss = \", test.energy)\n", - "print(\"method: \", mthd)\n", - "print(\"method parameters: \", mthd_opt)\n", - "print(\"execution time = \", (t1-t0)/60, \" min\")\n", - "\n", - "print(test.history.plot('energies', label='loss'))\n", - "print(test.history.plot('angles', label=\"\"))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Test\n", - "\n", - "Once trained, we have the optimal parameters for the classifier stored in `test.angles`. We run again the classifier with the test data set and with these parameters fixed." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "success %: 90.5 %\n", - "random success %: 49.1 %\n" - ] - } - ], - "source": [ - "test_set = 1000\n", - "\n", - "# initialize\n", - "xval_test, yval_test, yval_rand, yval_real = [], [], [], []\n", - "suc = 0 # success\n", - "suc_rand = 0 # random success\n", - "\n", - "for i in range(test_set):\n", - " \n", - " # random test point\n", - " x = 2 * (np.random.rand(2)) - 1\n", - " \n", - " # state generated by the trained classifier\n", - " qc = qcircuit(x, param)\n", - " wfn_qc = tq.simulate(qc, variables=test.angles) \n", - " \n", - " if nclass == 2:\n", - " \n", - " # compute the fidelity respect to one of the label states, the |0>\n", - " f = abs(wfn_qc.inner(targ_wfn(0,nclass)))**2\n", - "\n", - " y = 1\n", - " # if fidelity is >= 0.5, we conclude that this state belongs to |0> class\n", - " # (|1> class otherwise)\n", - " if f >= 0.5:\n", - " y = 0\n", - " \n", - " # check the real class of the data point\n", - " y_real = circle(random=False, x_input=x)\n", - " \n", - " else:\n", - " raise Exception(\"nclass = {} is not considered\".format(nclass))\n", - " \n", - " # compute success rate \n", - " if y == y_real:\n", - " suc = suc + 1\n", - " \n", - " # compute random success rate \n", - " yrand = np.random.randint(0, nclass-1)\n", - " if yrand == y_real:\n", - " suc_rand = suc_rand + 1\n", - " \n", - " xval_test.append(x)\n", - " yval_test.append(y)\n", - " yval_real.append(y_real)\n", - " \n", - "print(\"success %: \", 100*suc/test_set,\"%\")\n", - "print(\"random success %: \", 100*suc_rand/test_set,\"%\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Print results:" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_data(x, y, nclass, fig=None, ax=None):\n", - " \"\"\"\n", - " Arg:\n", - " - x (array[tuple]): data points\n", - " - y (array[int]): data labels\n", - " - nclass (int): number of classes\n", - " Returns:\n", - " - Plot\n", - " \"\"\" \n", - " if fig == None:\n", - " fig, ax = plt.subplots(1, 1, figsize=(5, 5))\n", - " \n", - " # colors and labels\n", - " col = [\"red\",\"blue\",\"green\",\"yellow\"]\n", - " lab = [0,1,2,3]\n", - " \n", - " for i in range(nclass):\n", - " ax.scatter(x[y == lab[i], 0], x[y == lab[i], 1], c=col[i], s=20, edgecolor=\"k\")\n", - " ax.set_xlabel(\"$x_1$\")\n", - " ax.set_ylabel(\"$x_2$\")" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Total execution time: 36.01548974911372 min.\n" - ] - } - ], - "source": [ - "xval_test = np.array(xval_test)\n", - "yval_test = np.array(yval_test)\n", - "yval_real = np.array(yval_real)\n", - "\n", - "fig, axes = plt.subplots(1, 2, figsize=(6, 3))\n", - "\n", - "plot_data(xval_test, yval_test, nclass, fig, axes[0])\n", - "plot_data(xval_test, yval_real, nclass, fig, axes[1])\n", - "\n", - "axes[0].set_title(\"Single-qubit class. {} layers\".format(layers))\n", - "axes[1].set_title(\"True test data\")\n", - "fig.tight_layout(pad=0.5)\n", - "plt.show()\n", - "\n", - "t2 = time.time()\n", - "print(\"Total execution time: \", (t2-t0)/60,\" min.\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Improvements and customization\n", - "\n", - "This tutorial just shows a simple classification example. It is constructed in a way that one can easily change the classification model and try more sophisticated problems comprising more classes. To do so, one should define the target states for >2 classes, i.e. include more vectors in the Bloch sphere.\n", - "\n", - "The single-qubit classifier circuit can also be modified to include higher dimensional data or to increase/reduce the number of parameters per layer.\n", - "\n", - "The cost function can also be improved. See for instance the weigthed fidelity cost function proposed in the main reference.\n", - "\n", - "Finally, the core of any variational algorithm is the minimization method. Tequila provides many methods besides the scipy ones. See the [optimizers tutorial](https://github.com/aspuru-guzik-group/tequila/blob/master/tutorials/Optimizer_Tutorial.ipynb) for more information.\n", - "Notice also that the algorithm starts with a random initialization. It is well-known that random initialization in variational circuits leads to a barren-plateaus problem when computing the gradients. This problem can be avoided by providing a good initialization guess. \n", - "\n", - "Another possibility to play with expoloiting other Tequila modules is to use Phoenics for initial exploration and a gradient based optimizer with the best Phoenics results as starting point (see Phoenics documentation)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "tqenv", - "language": "python", - "name": "tqenv" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.4" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/tutorials/StatePreparation_tutorial.ipynb b/tutorials/StatePreparation_tutorial.ipynb deleted file mode 100644 index 44951380..00000000 --- a/tutorials/StatePreparation_tutorial.ipynb +++ /dev/null @@ -1,720 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# State preparation algorithm tutorial\n", - "\n", - "This tutorial shows:\n", - "- How to define a quantum gate not included in Tequila's gate set\n", - "- How to construct a parametrized quantum circuit\n", - "- How to compute the fidelity between two states\n", - "- How to train a parametrized quantum circuit" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Import everthing you need\n", - "import tequila as tq\n", - "import numpy as np\n", - "import random\n", - "import time" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Quantum gate construction\n", - "\n", - "Sometimes, one may need to use a particular quantum gate that is not included in the basic gate set. If we know the decomposition of this gate in terms of Tequila's gates, we can define a function that runs a small quantum circuit that constructs this particular gate. \n", - " \n", - "As an example, let's define the general one-qubit unitary gate \n", - "$$ U(\\theta,\\phi,\\lambda) = \\left( \\begin{array}{cc}\n", - " e^{-\\frac{1}{2} i (\\lambda +\\phi )} \\cos \\left(\\frac{\\theta }{2}\\right) & -e^{\\frac{1}{2} i (\\lambda -\\phi )} \\sin \\left(\\frac{\\theta }{2}\\right) \\\\\n", - " e^{-\\frac{1}{2} i (\\lambda -\\phi )} \\sin \\left(\\frac{\\theta }{2}\\right) & e^{\\frac{1}{2} i (\\lambda +\\phi )} \\cos \\left(\\frac{\\theta }{2}\\right) \\end{array} \\right) = R_{z}\\left(\\phi\\right) R_{y}\\left(\\theta\\right) R_{z}\\left(\\lambda\\right) $$" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0: ───Rz(0.25π)───Ry(π)───Rz(0.5π)───\n" - ] - } - ], - "source": [ - "# q0 = target qubit\n", - "def U(th,phi,lam,q0):\n", - " ugate = tq.gates.Rz(target=q0,angle=phi) + tq.gates.Ry(target=q0,angle=th) + tq.gates.Rz(target=q0,angle=lam)\n", - " return ugate\n", - "# draw the circuit for some (th,phi,lam) for qubit \"0\"\n", - "tq.draw(U(np.pi, np.pi/4.0, np.pi/2.0, 0))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Similarly, we can construct a multi-qubit gate. For instance, the controlled-phase gate: \n", - "$$ CPh\\left(\\varphi \\right) = \\left(\n", - "\\begin{array}{cccc}\n", - " 1 & 0 & 0 & 0 \\\\\n", - " 0 & 1 & 0 & 0 \\\\\n", - " 0 & 0 & 1 & 0 \\\\\n", - " 0 & 0 & 0 & e^{i \\varphi } \\\\\n", - "\\end{array}\n", - "\\right) = e^{i\\phi/4} \\left(R_{z}\\left(\\varphi/2\\right)\\otimes\\mathbb{I}\\right)CR_{z}\\left(\\phi/2\\right)$$" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0: ───Rz(0.25π)───@───────────\n", - " │\n", - "1: ───────────────Rz(0.25π)───\n" - ] - } - ], - "source": [ - "# q0 = control qubit\n", - "# q1 = target qubit\n", - "def CPh(phi,q0,q1):\n", - " cph = tq.gates.Rz(target=q0, angle=phi/2) + tq.gates.CRz(control=q0, target=q1, angle=phi/2)\n", - " return cph\n", - "# draw the circuit for some varphi for qubits \"0\" and \"1\"\n", - "tq.draw(CPh(np.pi/2,0,1))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The gate defined is equal to $CPh(\\varphi)$ gate up to a global phase." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Compute the fidelity\n", - "\n", - "Let's compute the fidelity between two states, one constructed from a string (target state $|\\tilde{\\psi}\\rangle$) and other obtained from a given quantum circuit, $|\\psi\\rangle$." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "target state: +0.7071|00> +0.7071|11> \n" - ] - } - ], - "source": [ - "# Target state example: Bell state\n", - "wfn_targ = tq.QubitWaveFunction.from_string(string=\"1.0*|00> + 1.0*|11>\")\n", - "wfn_targ = wfn_targ.normalize() # Remember to normalize the state!!! \n", - "print(\"target state: \", wfn_targ) # Print the wavefunction" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "circuit state: +0.9641e^(-0.3614πi)|00> +0.0247e^(+0.8932πi)|10> +0.2462e^(-0.3614πi)|01> +0.0967e^(-0.1068πi)|11> \n", - "circuit diagram: \n", - "0: ───Rz(0.5π)───Ry(0.064π)───Rz(0.159π)───@───Rz(0.064π)───@─────────────────────────\n", - " │ │\n", - "1: ────────────────────────────────────────X────────────────Rz(0.064π)───Ry(0.159π)───\n" - ] - } - ], - "source": [ - "# Quantum circuit\n", - "q0 = 0\n", - "q1 = 1\n", - "qc = U(0.2, np.pi/2.0, 0.5, q0) + tq.gates.CNOT(target=q1,control=q0) + CPh(0.4,q0,q1) + tq.gates.Ry(target=q1,angle=0.5)\n", - "wfn_qc = tq.simulate(qc) # Simulate the wavefunction \n", - "print(\"circuit state: \", wfn_qc) \n", - "print(\"circuit diagram: \")\n", - "tq.draw(qc)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "There are two ways to compute the fidelity of these two states. The natural way to do it, in case we have both wavefunctions, is just by computing the inner product of these two states:\n", - "$$ F\\left(|\\psi\\rangle, |\\tilde{\\psi}\\rangle\\right) = |\\langle \\psi | \\tilde{\\psi} \\rangle|^2 $$" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "fidelity = 0.5343666886804502\n" - ] - } - ], - "source": [ - "fidelity = abs(wfn_targ.inner(wfn_qc))**2\n", - "print('fidelity = ', fidelity)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The second method consists on computing the expected value of the target state density matrix operator $\\rho = |\\tilde{\\psi}\\rangle\\langle\\tilde{\\psi}|$, i.e. \n", - "$$ F\\left(|\\psi\\rangle, |\\tilde{\\psi}\\rangle\\right) = \\langle \\psi | \\rho |\\psi\\rangle = \\langle \\psi |\\tilde{\\psi}\\rangle \\langle \\tilde{\\psi} |\\psi\\rangle = |\\langle \\psi | \\tilde{\\psi} \\rangle|^2$$\n", - "\n", - "To do so, we need to write the density operator in terms of pauli matrices:" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+0.2500+0.2500Z(0)Z(1)+0.2500X(0)X(1)-0.2500Y(0)Y(1)\n" - ] - } - ], - "source": [ - "# construct the density operator of target state\n", - "rho_targ = tq.paulis.Projector(wfn=wfn_targ)\n", - "print(rho_targ)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Then, we trait this operator as a Hamiltonian and compute the objective expectation value:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "fidelity = 0.5343666886804503\n" - ] - } - ], - "source": [ - "O = tq.Objective.ExpectationValue(U=qc, H=rho_targ)\n", - "fidelity= tq.simulate(O)\n", - "print('fidelity = ', fidelity)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Construct a parametrized quantum circuit \n", - "\n", - "Parametrized quantum circuits (PQC) are usually defined with a small gate set. Same gates are used along the circuit with different parameters, which makes more natural to define them as vectors. In the following example, we construct a parametrized quantum circuit of two qubits using the $U(\\theta,\\phi,\\lambda)$ (defined above) and a CNOT gate. Parameters are identified with the vectors $\\vec{\\theta}$, $\\vec{\\phi}$ and $\\vec{\\lambda}$. The circuit ansatz consist on applying general unitary gates on both qubits, then entangle them with the CNOT gate, and finally apply another unitary gate." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "#qubits\n", - "q0=0\n", - "q1=1\n", - "\n", - "#define variables\n", - "th = [tq.Variable(name='theta_{}'.format(i)) for i in range(0,4)]\n", - "phi = [tq.Variable(name='phi_{}'.format(i)) for i in range(0,4)]\n", - "lam = [tq.Variable(name='lam_{}'.format(i)) for i in range(0,4)]\n", - "\n", - "# PQC\n", - "pqc = U(th[0],phi[0],lam[0],q0) + U(th[1],phi[1],lam[1],q1) \n", - "pqc += tq.gates.CNOT(control = q0, target = q1)\n", - "pqc += U(th[2],phi[2],lam[2],q0) + U(th[3],phi[3],lam[3],q1)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0: ───Rz(0.318309886183791*pi*f((phi_0,))_0)───Ry(0.318309886183791*pi*f((theta_0,))_1)───Rz(0.318309886183791*pi*f((lam_0,))_2)───@───Rz(0.318309886183791*pi*f((phi_2,))_6)───Ry(0.318309886183791*pi*f((theta_2,))_7)────Rz(0.318309886183791*pi*f((lam_2,))_8)────\n", - " │\n", - "1: ───Rz(0.318309886183791*pi*f((phi_1,))_3)───Ry(0.318309886183791*pi*f((theta_1,))_4)───Rz(0.318309886183791*pi*f((lam_1,))_5)───X───Rz(0.318309886183791*pi*f((phi_3,))_9)───Ry(0.318309886183791*pi*f((theta_3,))_10)───Rz(0.318309886183791*pi*f((lam_3,))_11)───\n" - ] - } - ], - "source": [ - "# Draw the circuit \n", - "n_th = len(th)\n", - "n_phi = len(phi)\n", - "n_lam = len(lam)\n", - "\n", - "tq.draw(pqc)" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "# initialize random values for the variables\n", - "th0 ={key : random.uniform(0, np.pi) for key in th}\n", - "phi0 = {key: random.uniform(0, np.pi) for key in phi}\n", - "lam0 = {key: random.uniform(0, np.pi) for key in lam}\n", - "all_values = {**th0, **phi0, **lam0}" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{theta_0: 1.9400742456012434,\n", - " theta_1: 0.18708644852210973,\n", - " theta_2: 1.6718785378724963,\n", - " theta_3: 2.9210555160438036}" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "th0" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0: ───Rz(0.318309886183791*pi*f((phi_0,))_0)───Ry(0.318309886183791*pi*f((theta_0,))_1)───Rz(0.318309886183791*pi*f((lam_0,))_2)───@───Rz(0.318309886183791*pi*f((phi_2,))_6)───Ry(0.318309886183791*pi*f((theta_2,))_7)────Rz(0.318309886183791*pi*f((lam_2,))_8)────\n", - " │\n", - "1: ───Rz(0.318309886183791*pi*f((phi_1,))_3)───Ry(0.318309886183791*pi*f((theta_1,))_4)───Rz(0.318309886183791*pi*f((lam_1,))_5)───X───Rz(0.318309886183791*pi*f((phi_3,))_9)───Ry(0.318309886183791*pi*f((theta_3,))_10)───Rz(0.318309886183791*pi*f((lam_3,))_11)───\n" - ] - } - ], - "source": [ - "# in case you want to look at the circuit with specific values\n", - "tq.draw(pqc, variables=all_values)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can now compute the fidelity of the output state of this PQC with some two-qubit random state:" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "random state: +0.5890e^(-0.1420πi)|00> +0.4439e^(-0.2940πi)|01> +0.5727e^(-0.7747πi)|10> +0.3577e^(-0.4773πi)|11> \n" - ] - } - ], - "source": [ - "# 2-qubit random state wavefunction from array\n", - "rand_array = np.asarray([random.uniform(-1, 1)+1j*random.uniform(-1, 1) for x in range(1,5)])\n", - "wfn_rand = tq.QubitWaveFunction.from_array(rand_array)\n", - "wfn_rand = wfn_rand.normalize()\n", - "print(\"random state: \", wfn_rand)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And now we can compute the fidelity of these two states:" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "fidelity = 0.18646916747892608\n", - "fidelity = 0.18646916747892608\n" - ] - } - ], - "source": [ - "# Fidelity method 1: using inner product\n", - "wfn_pqc = tq.simulate(pqc, variables=all_values) # compute the PQC wavefunction\n", - "fid_rand = abs(wfn_rand.inner(wfn_pqc))**2\n", - "print(\"fidelity = \", fid_rand)\n", - "\n", - "# Fidelity method 2: using the the density matrix as objective\n", - "rho_rand = tq.paulis.Projector(wfn=wfn_rand) # density operator target state\n", - "fid_pqc = tq.Objective.ExpectationValue(U=pqc, H=rho_rand)\n", - "print(\"fidelity = \", tq.simulate(fid_pqc, variables = all_values))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## State preparation algorithm\n", - "\n", - "This algorithm minimizes the fidelity between a PQC and a the target state. Since the optimizer only minimizes, we will minimize the infidelity, i.e. $ 1 - F(|\\tilde{\\psi}\\rangle,|\\psi\\rangle)$.\n", - "\n", - "We can use any of the two methods to compute the infidelity, but it will be more convenient to use the second one.\n", - "\n", - "The goal of this example is to obtain a quantum circuit that generates the Bell state\n", - "$$ |\\tilde{\\psi}\\rangle = \\frac{1}{\\sqrt{2}}\\left(|00\\rangle + |11\\rangle\\right) $$" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Bell state: +0.7071|00> +0.7071|11> \n" - ] - } - ], - "source": [ - "# Bell state wavefunction from array\n", - "bell_array = np.asarray([1,0,0,1])\n", - "wfn_bell = tq.QubitWaveFunction.from_array(bell_array)\n", - "wfn_bell = wfn_targ.normalize()\n", - "print(\"Bell state: \", wfn_bell)" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Optimizer: \n", - "backend : qulacs\n", - "samples : None\n", - "save_history : True\n", - "noise : None\n", - "\n", - "Method : TNC\n", - "Objective : 1 expectationvalues\n", - "bounds : {theta_0: [0, 6.283185307179586], theta_1: [0, 6.283185307179586], theta_2: [0, 6.283185307179586], theta_3: [0, 6.283185307179586], phi_0: [0, 6.283185307179586], phi_1: [0, 6.283185307179586], phi_2: [0, 6.283185307179586], phi_3: [0, 6.283185307179586], lam_0: [0, 6.283185307179586], lam_1: [0, 6.283185307179586], lam_2: [0, 6.283185307179586], lam_3: [0, 6.283185307179586]}\n", - "gradient : 36 expectationvalues\n", - "\n", - "active variables : 12\n", - "\n", - "E=+0.97978838 angles= {theta_1: 0.18708644852210973, phi_2: 0.814058741440068, theta_2: 1.6718785378724963, phi_0: 0.2345203432452239, lam_2: 1.4159205992271224, lam_3: 0.13148303719773408, lam_1: 2.2681484065626556, lam_0: 2.3054575437873366, theta_0: 1.9400742456012434, phi_3: 1.535128381817424, theta_3: 2.9210555160438036, phi_1: 0.3289124675729237} samples= None\n", - "E=+0.97978833 angles= {theta_1: 0.18708646000189555, phi_2: 0.814058833791607, theta_2: 1.6718785383234156, phi_0: 0.23452034324522408, lam_2: 1.415920500429734, lam_3: 0.13148293840034553, lam_1: 2.2681483849790918, lam_0: 2.305457636138876, theta_0: 1.9400743288187945, phi_3: 1.5351284785470272, theta_3: 2.92105543325136, phi_1: 0.3289124675729238} samples= None\n", - "E=+0.85149465 angles= {theta_1: 0.2023641517385193, phi_2: 0.9369634159388589, theta_2: 1.6724786370702835, phi_0: 0.23452034324522408, lam_2: 1.2844375620293884, lam_3: 0.0, lam_1: 2.2394242408406675, lam_0: 2.4283622182861277, theta_0: 2.0508230875941647, phi_3: 1.6638595378398793, theta_3: 2.8108724224129618, phi_1: 0.3289124675729238} samples= None\n", - "E=+0.85149431 angles= {theta_1: 0.2023642802237453, phi_2: 0.9369636874231029, theta_2: 1.6724786704097288, phi_0: 0.23452034324522408, lam_2: 1.2844372717859731, lam_3: 0.0, lam_1: 2.2394241923699836, lam_0: 2.4283624897703713, theta_0: 2.050823147531501, phi_3: 1.6638598242833953, theta_3: 2.8108721796234564, phi_1: 0.3289124675729238} samples= None\n", - "E=+0.81863091 angles= {theta_1: 0.770960170998253, phi_2: 2.138384505960894, theta_2: 1.82001836892913, phi_0: 0.23452034324522408, lam_2: 0.0, lam_3: 0.0, lam_1: 2.0249230194821095, lam_0: 3.6297833083081628, theta_0: 2.3160686088759577, phi_3: 2.931481100380665, theta_3: 1.736436469372996, phi_1: 0.32891246757292425} samples= None\n", - "E=+0.16575584 angles= {theta_1: 0.48666216136838614, phi_2: 1.5376739609498764, theta_2: 1.7462485029997068, phi_0: 0.23452034324522408, lam_2: 0.642218781014694, lam_3: 0.0, lam_1: 2.1321736301613887, lam_0: 3.0290727632971453, theta_0: 2.183445848235061, phi_3: 2.297670319110272, theta_3: 2.273654445892979, phi_1: 0.32891246757292425} samples= None\n", - "E=+0.16575572 angles= {theta_1: 0.48666227262304407, phi_2: 1.5376739611263435, theta_2: 1.7462486073305992, phi_0: 0.23452034324522408, lam_2: 0.6422185127771218, lam_3: 0.0, lam_1: 2.132173524155168, lam_0: 3.029072763473612, theta_0: 2.1834456081792064, phi_3: 2.2976704050408365, theta_3: 2.273654352135036, phi_1: 0.32891246757292425} samples= None\n", - "E=+0.16575582 angles= {theta_1: 0.4866621494975738, phi_2: 1.5376739299684588, theta_2: 1.7462484283132789, phi_0: 0.23452034324522453, lam_2: 0.6422187020957812, lam_3: 0.0, lam_1: 2.132173575551841, lam_0: 3.0290727323157274, theta_0: 2.1834458264374574, phi_3: 2.29767031979944, theta_3: 2.2736544354244668, phi_1: 0.32891246757292425} samples= None\n", - "E=+0.16575574 angles= {theta_1: 0.48666227988751487, phi_2: 1.5376737685485447, theta_2: 1.7462481752768262, phi_0: 0.23452034324522408, lam_2: 0.6422185089202155, lam_3: 0.0, lam_1: 2.1321733759939048, lam_0: 3.0290725708958157, theta_0: 2.1834457798304143, phi_3: 2.2976701916997615, theta_3: 2.273654181670317, phi_1: 0.32891246757292425} samples= None\n", - "E=+0.08113876 angles= {theta_1: 0.5427053432896312, phi_2: 1.3917605441194907, theta_2: 1.499116903717589, phi_0: 0.2345203442100483, lam_2: 0.0, lam_3: 0.0, lam_1: 1.767930638584934, lam_0: 2.8831593468762438, theta_0: 1.8389547309123337, phi_3: 2.387441218774743, theta_3: 2.129888432702298, phi_1: 0.3289124675729247} samples= None\n", - "E=+0.08726450 angles= {theta_1: 0.5146837523290086, phi_2: 1.4647172525346837, theta_2: 1.622682703358648, phi_0: 0.23452034372763642, lam_2: 0.32110939050734677, lam_3: 0.0, lam_1: 1.9500521343731614, lam_0: 2.9561160550866945, theta_0: 2.011200289573697, phi_3: 2.342555768942508, theta_3: 2.2017714392976386, phi_1: 0.3289124675729247} samples= None\n", - "E=+0.07436449 angles= {theta_1: 0.5286945478093199, phi_2: 1.4282388983270873, theta_2: 1.5608998035381185, phi_0: 0.23452034396884214, lam_2: 0.1605546952536736, lam_3: 0.0, lam_1: 1.8589913864790477, lam_0: 2.919637700981469, theta_0: 1.9250775102430155, phi_3: 2.3649984938586255, theta_3: 2.165829935999968, phi_1: 0.3289124675729247} samples= None\n", - "E=+0.07436447 angles= {theta_1: 0.5286945539738492, phi_2: 1.4282388811537676, theta_2: 1.5608997893806995, phi_0: 0.23452034396884214, lam_2: 0.16055465306835526, lam_3: 1.3108153540386525e-07, lam_1: 1.8589913525322808, lam_0: 2.91963768380815, theta_0: 1.9250774762797043, phi_3: 2.3649984869514364, theta_3: 2.165829920201008, phi_1: 0.3289124675729247} samples= None\n", - "E=+0.07436448 angles= {theta_1: 0.5286945569985897, phi_2: 1.4282388919853437, theta_2: 1.5608998117277175, phi_0: 0.2345203439688408, lam_2: 0.1605546850756836, lam_3: 0.0, lam_1: 1.8589913740684647, lam_0: 2.9196376946397256, theta_0: 1.9250774978573206, phi_3: 2.364998484604847, theta_3: 2.1658299247020203, phi_1: 0.3289124675729247} samples= None\n", - "E=+0.07436449 angles= {theta_1: 0.5286945452911498, phi_2: 1.428238899428805, theta_2: 1.5608998006492636, phi_0: 0.23452034396883725, lam_2: 0.16055469563179736, lam_3: 0.0, lam_1: 1.858991377976206, lam_0: 2.9196377020831874, theta_0: 1.9250775002608946, phi_3: 2.36499848958337, theta_3: 2.165829937176665, phi_1: 0.3289124675729247} samples= None\n", - "E=+0.07436449 angles= {theta_1: 0.5286945451915859, phi_2: 1.428238905615189, theta_2: 1.5608998115570107, phi_0: 0.23452034396881904, lam_2: 0.16055470981843056, lam_3: 0.0, lam_1: 1.8589913754294178, lam_0: 2.9196377082695713, theta_0: 1.9250775033341594, phi_3: 2.3649984844601795, theta_3: 2.1658299404436274, phi_1: 0.3289124675729247} samples= None\n", - "E=+0.00709803 angles= {theta_1: 0.5606696392198067, phi_2: 1.3640003738170998, theta_2: 1.529935097807913, phi_0: 0.23452026377458557, lam_2: 0.0, lam_3: 0.2190515959374082, lam_1: 1.5777560538300686, lam_0: 2.855399178375335, theta_0: 1.6224789494137757, phi_3: 2.2321879608371633, theta_3: 2.0777091495701763, phi_1: 0.3289124675729256} samples= None\n", - "E=+0.00709803 angles= {theta_1: 0.5606696392039807, phi_2: 1.364000371409756, theta_2: 1.5299350986021882, phi_0: 0.23452026377458557, lam_2: 0.0, lam_3: 0.2190516011976067, lam_1: 1.577756054985087, lam_0: 2.855399175967991, theta_0: 1.6224789474072632, phi_3: 2.232187956728475, theta_3: 2.077709148018407, phi_1: 0.3289124675729256} samples= None\n", - "E=+0.00709803 angles= {theta_1: 0.5606696404457652, phi_2: 1.3640003758712678, theta_2: 1.5299351003827062, phi_0: 0.23452026377458557, lam_2: 0.0, lam_3: 0.21905159868476298, lam_1: 1.5777560471059562, lam_0: 2.855399180429503, theta_0: 1.6224789469409322, phi_3: 2.232187960753988, theta_3: 2.077709146686549, phi_1: 0.3289124675729256} samples= None\n", - "E=+0.00004723 angles= {theta_1: 0.5682047456782451, phi_2: 1.3432743639677562, theta_2: 1.557352684944983, phi_0: 0.23452026381421165, lam_2: 0.0, lam_3: 0.310121390877224, lam_1: 1.5513916250917585, lam_0: 2.8346731681628277, theta_0: 1.5787249237101468, phi_3: 2.1741055936153617, theta_3: 2.037726258960663, phi_1: 0.3289124675729256} samples= None\n", - "E=+0.00004723 angles= {theta_1: 0.5682047032403403, phi_2: 1.3432744140182464, theta_2: 1.5573526406157854, phi_0: 0.23452026381421165, lam_2: 0.0, lam_3: 0.3101213945509178, lam_1: 1.5513917157632686, lam_0: 2.834673218213318, theta_0: 1.5787247953018517, phi_3: 2.1741056465643167, theta_3: 2.037726285914776, phi_1: 0.3289124675729256} samples= None\n", - "E=+0.00004723 angles= {theta_1: 0.5682047586305501, phi_2: 1.3432743399327565, theta_2: 1.5573527054670637, phi_0: 0.23452026381421165, lam_2: 0.0, lam_3: 0.31012139399891403, lam_1: 1.551391739330553, lam_0: 2.834673144127828, theta_0: 1.5787248270916314, phi_3: 2.174105566104301, theta_3: 2.037726246757807, phi_1: 0.3289124675729256} samples= None\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "E=+0.00004723 angles= {theta_1: 0.5682047495405631, phi_2: 1.3432743674824092, theta_2: 1.5573526873581178, phi_0: 0.2345202638142112, lam_2: 0.0, lam_3: 0.3101213860430594, lam_1: 1.551391698079409, lam_0: 2.8346731716774802, theta_0: 1.5787249436490394, phi_3: 2.174105598157262, theta_3: 2.0377262555491673, phi_1: 0.3289124675729256} samples= None\n", - "E=+0.00004723 angles= {theta_1: 0.5682047276855315, phi_2: 1.3432743522593686, theta_2: 1.5573526673001021, phi_0: 0.23452026381420987, lam_2: 0.0, lam_3: 0.31012140049050085, lam_1: 1.5513916613688044, lam_0: 2.834673156454439, theta_0: 1.5787249381088497, phi_3: 2.1741055840078936, theta_3: 2.0377262793832838, phi_1: 0.3289124675729256} samples= None\n", - "E=+0.00000001 angles= {theta_1: 0.5670536193843128, phi_2: 1.344372507559821, theta_2: 1.5563466101327212, phi_0: 0.23452026373299661, lam_2: 0.0, lam_3: 0.3100936072527172, lam_1: 1.57078726889731, lam_0: 2.8357713116589265, theta_0: 1.5707849336977442, phi_3: 2.1753215680989224, theta_3: 2.038346318435992, phi_1: 0.3289124675729256} samples= None\n", - "E=+0.00000001 angles= {theta_1: 0.5670536068271934, phi_2: 1.3443725425168338, theta_2: 1.5563466667480204, phi_0: 0.23452026373299661, lam_2: 1.2136837801435263e-07, lam_3: 0.3100937286210952, lam_1: 1.5707872705321904, lam_0: 2.8357713466159393, theta_0: 1.5707849408264822, phi_3: 2.175321526205309, theta_3: 2.038346254387977, phi_1: 0.3289124675729256} samples= None\n", - "E=+0.00000001 angles= {theta_1: 0.5670536225433711, phi_2: 1.3443725161628017, theta_2: 1.5563466125885126, phi_0: 0.23452026373299617, lam_2: 0.0, lam_3: 0.3100936053340444, lam_1: 1.570787270325883, lam_0: 2.8357713202619075, theta_0: 1.5707849375850738, phi_3: 2.175321575631915, theta_3: 2.038346313459311, phi_1: 0.3289124675729256} samples= None\n", - "E=+0.00000000 angles= {theta_1: 0.5670461281848205, phi_2: 1.3444030838073346, theta_2: 1.5563897167244758, phi_0: 0.23452026373288248, lam_2: 8.839510847957754e-05, lam_3: 0.3101820023612252, lam_1: 1.5707892723719388, lam_0: 2.835801887906597, theta_0: 1.5707923609973422, phi_3: 2.175294895597056, theta_3: 2.0382963240591634, phi_1: 0.3289124675729256} samples= None\n", - "E=+0.00000000 angles= {theta_1: 0.5670461281848205, phi_2: 1.3444030838073346, theta_2: 1.5563897167244758, phi_0: 0.23452026373288248, lam_2: 8.839510847957754e-05, lam_3: 0.3101820023612252, lam_1: 1.5707892723719388, lam_0: 2.835801887906597, theta_0: 1.5707923609973422, phi_3: 2.175294895597056, theta_3: 2.0382963240591634, phi_1: 0.3289124675729256} samples= None\n", - "Infidelity = 7.946199254149633e-12\n", - "Fidelity = 0.9999999999920538\n", - "Execution time: 7.999989986419678 sec\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "None\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "None\n" - ] - } - ], - "source": [ - "rho_bell = tq.paulis.Projector(wfn=wfn_bell) # density operator\n", - "\n", - "# we take as initial values ther random values generated above\n", - "initial_values = all_values\n", - "# Infidelity = 1 - Fidelity\n", - "inf = 1.0 - tq.Objective.ExpectationValue(U=pqc, H=rho_bell)\n", - "\n", - "# we can define the bounds on the parameters\n", - "# Caution! Not all minimizers accept bounds! In this example, we use 'TNC' minimizer.\n", - "# bounds should be defined in a dictionary form, as initial_values\n", - "max_angles = 2*np.pi\n", - "min_angles = 0\n", - "bnds_list = [[min_angles,max_angles]]\n", - "for i in range(0, len(all_values)):\n", - " bnds_list.append([min_angles,max_angles])\n", - "bnds = dict(zip([str(th[i]) for i in range(0,n_th)],bnds_list))\n", - "bnds = {**bnds, **dict(zip([str(phi[i]) for i in range(0,n_phi)],bnds_list))}\n", - "bnds = {**bnds, **dict(zip([str(lam[i]) for i in range(0,n_lam)],bnds_list))}\n", - "\n", - "# set \"silent = True\" to avoid printing all the minimization process\n", - "t0 = time.time()\n", - "infid = tq.optimizer_scipy.minimize(objective=inf, initial_values=initial_values, method = 'TNC', method_bounds = bnds, silent=True)\n", - "t1 = time.time()\n", - "\n", - "print(\"Infidelity = \", infid.energy)\n", - "print(\"Fidelity = \", 1.0-infid.energy)\n", - "print(\"Execution time: \", t1-t0, \" sec\" )\n", - "\n", - "print(infid.history.plot('energies', label='fidelity'))\n", - "print(infid.history.plot('angles', label=\"\"))" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# some example on how to use the convenience plotter\n", - "infid.history.plot([\"angles\", \"gradients\"], key=[\"lam_1\", \"lam_2\"], labels=[\"\", \"grad\"], title=\"Some Data\", ylim=(-1.0, 3.0), xlim=(-3, 5), loc=\"upper left\")" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "# in case you want to extract the history data\n", - "history_phi_0 = infid.history.extract_angles(\"phi_0\")\n", - "history_energies = infid.history.extract_energies()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can check that the final state solution is the Bell state up to a global phase:" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "final state solution: \n", - "+0.7071e^(+0.6603πi)|00> +0.0000i|10> -0.0000|01> +0.7071e^(+0.6603πi)|11> \n" - ] - } - ], - "source": [ - "wfn_sol = tq.simulate(pqc, variables=infid.angles)\n", - "print('final state solution: ')\n", - "print(wfn_sol)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To obtain the angles of the PQC:" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "theta_1 : 0.5670461281848205\n", - "phi_2 : 1.3444030838073346\n", - "theta_2 : 1.5563897167244758\n", - "phi_0 : 0.23452026373288248\n", - "lam_2 : 8.839510847957754e-05\n", - "lam_3 : 0.3101820023612252\n", - "lam_1 : 1.5707892723719388\n", - "lam_0 : 2.835801887906597\n", - "theta_0 : 1.5707923609973422\n", - "phi_3 : 2.175294895597056\n", - "theta_3 : 2.0382963240591634\n", - "phi_1 : 0.3289124675729256" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "infid.angles" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "tqenv", - "language": "python", - "name": "tqenv" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.4" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/tutorials/data/benzene.xyz b/tutorials/data/benzene.xyz deleted file mode 100644 index ad8e474b..00000000 --- a/tutorials/data/benzene.xyz +++ /dev/null @@ -1,14 +0,0 @@ -12 -benzene CISD/3-21G equilibrium -C 0.0000 1.4080 0.0000 -C 1.2193 0.7040 0.0000 -C 1.2193 -0.7040 0.0000 -C 0.0000 -1.4080 0.0000 -C -1.2193 -0.7040 0.0000 -C -1.2193 0.7040 0.0000 -H 0.0000 2.4980 0.0000 -H 2.1633 1.2490 0.0000 -H 2.1633 -1.2490 0.0000 -H 0.0000 -2.4980 0.0000 -H -2.1633 -1.2490 0.0000 -H -2.1633 1.2490 0.0000 diff --git a/tutorials/data/ex_solver_cartoon-1.png b/tutorials/data/ex_solver_cartoon-1.png deleted file mode 100644 index 17ff3073..00000000 Binary files a/tutorials/data/ex_solver_cartoon-1.png and /dev/null differ diff --git a/tutorials/data/h2_pnos/h2_0.5_4so/one_body_integrals.npy b/tutorials/data/h2_pnos/h2_0.5_4so/one_body_integrals.npy deleted file mode 100644 index 9a378e8d..00000000 Binary files a/tutorials/data/h2_pnos/h2_0.5_4so/one_body_integrals.npy and /dev/null differ diff --git a/tutorials/data/h2_pnos/h2_0.5_4so/two_body_integrals.npy b/tutorials/data/h2_pnos/h2_0.5_4so/two_body_integrals.npy deleted file mode 100644 index 01be7250..00000000 Binary files a/tutorials/data/h2_pnos/h2_0.5_4so/two_body_integrals.npy and /dev/null differ diff --git a/tutorials/data/h2_pnos/h2_0.6_4so/one_body_integrals.npy b/tutorials/data/h2_pnos/h2_0.6_4so/one_body_integrals.npy deleted file mode 100644 index f23082dd..00000000 Binary files a/tutorials/data/h2_pnos/h2_0.6_4so/one_body_integrals.npy and /dev/null differ diff --git a/tutorials/data/h2_pnos/h2_0.6_4so/two_body_integrals.npy b/tutorials/data/h2_pnos/h2_0.6_4so/two_body_integrals.npy deleted file mode 100644 index bac61400..00000000 Binary files a/tutorials/data/h2_pnos/h2_0.6_4so/two_body_integrals.npy and /dev/null differ diff --git a/tutorials/data/h2_pnos/h2_0.7_4so/one_body_integrals.npy b/tutorials/data/h2_pnos/h2_0.7_4so/one_body_integrals.npy deleted file mode 100644 index 87642b6d..00000000 Binary files a/tutorials/data/h2_pnos/h2_0.7_4so/one_body_integrals.npy and /dev/null differ diff --git a/tutorials/data/h2_pnos/h2_0.7_4so/two_body_integrals.npy b/tutorials/data/h2_pnos/h2_0.7_4so/two_body_integrals.npy deleted file mode 100644 index 77ba919f..00000000 Binary files a/tutorials/data/h2_pnos/h2_0.7_4so/two_body_integrals.npy and /dev/null differ diff --git a/tutorials/data/h2_pnos/h2_0.8_4so/one_body_integrals.npy b/tutorials/data/h2_pnos/h2_0.8_4so/one_body_integrals.npy deleted file mode 100644 index 19b935c3..00000000 Binary files a/tutorials/data/h2_pnos/h2_0.8_4so/one_body_integrals.npy and /dev/null differ diff --git a/tutorials/data/h2_pnos/h2_0.8_4so/two_body_integrals.npy b/tutorials/data/h2_pnos/h2_0.8_4so/two_body_integrals.npy deleted file mode 100644 index 948a2f61..00000000 Binary files a/tutorials/data/h2_pnos/h2_0.8_4so/two_body_integrals.npy and /dev/null differ diff --git a/tutorials/data/h2_pnos/h2_0.9_4so/one_body_integrals.npy b/tutorials/data/h2_pnos/h2_0.9_4so/one_body_integrals.npy deleted file mode 100644 index 514d24e1..00000000 Binary files a/tutorials/data/h2_pnos/h2_0.9_4so/one_body_integrals.npy and /dev/null differ diff --git a/tutorials/data/h2_pnos/h2_0.9_4so/two_body_integrals.npy b/tutorials/data/h2_pnos/h2_0.9_4so/two_body_integrals.npy deleted file mode 100644 index ec5bdce7..00000000 Binary files a/tutorials/data/h2_pnos/h2_0.9_4so/two_body_integrals.npy and /dev/null differ diff --git a/tutorials/data/h2_pnos/h2_1.0_4so/one_body_integrals.npy b/tutorials/data/h2_pnos/h2_1.0_4so/one_body_integrals.npy deleted file mode 100644 index f88d18e0..00000000 Binary files a/tutorials/data/h2_pnos/h2_1.0_4so/one_body_integrals.npy and /dev/null differ diff --git a/tutorials/data/h2_pnos/h2_1.0_4so/two_body_integrals.npy b/tutorials/data/h2_pnos/h2_1.0_4so/two_body_integrals.npy deleted file mode 100644 index b462dd54..00000000 Binary files a/tutorials/data/h2_pnos/h2_1.0_4so/two_body_integrals.npy and /dev/null differ diff --git a/tutorials/data/h2_pnos/h2_1.1_4so/one_body_integrals.npy b/tutorials/data/h2_pnos/h2_1.1_4so/one_body_integrals.npy deleted file mode 100644 index 8d7b356f..00000000 Binary files a/tutorials/data/h2_pnos/h2_1.1_4so/one_body_integrals.npy and /dev/null differ diff --git a/tutorials/data/h2_pnos/h2_1.1_4so/two_body_integrals.npy b/tutorials/data/h2_pnos/h2_1.1_4so/two_body_integrals.npy deleted file mode 100644 index 3420e26c..00000000 Binary files a/tutorials/data/h2_pnos/h2_1.1_4so/two_body_integrals.npy and /dev/null differ diff --git a/tutorials/data/h2_pnos/h2_1.2_4so/one_body_integrals.npy b/tutorials/data/h2_pnos/h2_1.2_4so/one_body_integrals.npy deleted file mode 100644 index 44b73fc8..00000000 Binary files a/tutorials/data/h2_pnos/h2_1.2_4so/one_body_integrals.npy and /dev/null differ diff --git a/tutorials/data/h2_pnos/h2_1.2_4so/two_body_integrals.npy b/tutorials/data/h2_pnos/h2_1.2_4so/two_body_integrals.npy deleted file mode 100644 index 335e3d18..00000000 Binary files a/tutorials/data/h2_pnos/h2_1.2_4so/two_body_integrals.npy and /dev/null differ diff --git a/tutorials/data/h2_pnos/h2_1.3_4so/one_body_integrals.npy b/tutorials/data/h2_pnos/h2_1.3_4so/one_body_integrals.npy deleted file mode 100644 index b072a983..00000000 Binary files a/tutorials/data/h2_pnos/h2_1.3_4so/one_body_integrals.npy and /dev/null differ diff --git a/tutorials/data/h2_pnos/h2_1.3_4so/two_body_integrals.npy b/tutorials/data/h2_pnos/h2_1.3_4so/two_body_integrals.npy deleted file mode 100644 index 8847f93f..00000000 Binary files a/tutorials/data/h2_pnos/h2_1.3_4so/two_body_integrals.npy and /dev/null differ diff --git a/tutorials/data/h2_pnos/h2_1.4_4so/one_body_integrals.npy b/tutorials/data/h2_pnos/h2_1.4_4so/one_body_integrals.npy deleted file mode 100644 index eacb998f..00000000 Binary files a/tutorials/data/h2_pnos/h2_1.4_4so/one_body_integrals.npy and /dev/null differ diff --git a/tutorials/data/h2_pnos/h2_1.4_4so/two_body_integrals.npy b/tutorials/data/h2_pnos/h2_1.4_4so/two_body_integrals.npy deleted file mode 100644 index 39306eec..00000000 Binary files a/tutorials/data/h2_pnos/h2_1.4_4so/two_body_integrals.npy and /dev/null differ diff --git a/tutorials/data/h2_pnos/h2_2.0_4so/one_body_integrals.npy b/tutorials/data/h2_pnos/h2_2.0_4so/one_body_integrals.npy deleted file mode 100644 index 26b347cf..00000000 Binary files a/tutorials/data/h2_pnos/h2_2.0_4so/one_body_integrals.npy and /dev/null differ diff --git a/tutorials/data/h2_pnos/h2_2.0_4so/two_body_integrals.npy b/tutorials/data/h2_pnos/h2_2.0_4so/two_body_integrals.npy deleted file mode 100644 index 42fc6a65..00000000 Binary files a/tutorials/data/h2_pnos/h2_2.0_4so/two_body_integrals.npy and /dev/null differ diff --git a/tutorials/data/h2_pnos/h2_3.0_4so/one_body_integrals.npy b/tutorials/data/h2_pnos/h2_3.0_4so/one_body_integrals.npy deleted file mode 100644 index 79f62b68..00000000 Binary files a/tutorials/data/h2_pnos/h2_3.0_4so/one_body_integrals.npy and /dev/null differ diff --git a/tutorials/data/h2_pnos/h2_3.0_4so/two_body_integrals.npy b/tutorials/data/h2_pnos/h2_3.0_4so/two_body_integrals.npy deleted file mode 100644 index ec784cb4..00000000 Binary files a/tutorials/data/h2_pnos/h2_3.0_4so/two_body_integrals.npy and /dev/null differ diff --git a/tutorials/data/h2_pnos/h2_4.0_4so/one_body_integrals.npy b/tutorials/data/h2_pnos/h2_4.0_4so/one_body_integrals.npy deleted file mode 100644 index 8a4e56a4..00000000 Binary files a/tutorials/data/h2_pnos/h2_4.0_4so/one_body_integrals.npy and /dev/null differ diff --git a/tutorials/data/h2_pnos/h2_4.0_4so/two_body_integrals.npy b/tutorials/data/h2_pnos/h2_4.0_4so/two_body_integrals.npy deleted file mode 100644 index 8dbeb706..00000000 Binary files a/tutorials/data/h2_pnos/h2_4.0_4so/two_body_integrals.npy and /dev/null differ diff --git a/tutorials/psi4_pes_scan.py b/tutorials/psi4_pes_scan.py deleted file mode 100644 index acacad0c..00000000 --- a/tutorials/psi4_pes_scan.py +++ /dev/null @@ -1,89 +0,0 @@ -""" -Non Formatted Psi4 Tutorial -Get a consistent dissociation curve -The geometries are in data/h2o_*.xyz -Psi4 Outputs will also be in data/ -""" -import psi4 -import tequila as tq -import matplotlib.pyplot as plt -import tequila.simulators.simulator_api - -import numpy - -def generate_h2o_xyz_files(start=0.75, inc=0.05, steps=30): - water_geometry = """ - 0 1 - O - H 1 {0} - H 1 {0} 2 107.6 - """ - - files = [] - Rvals = [start + inc * i for i in range(steps)] - for i, R in enumerate(Rvals): - mol = psi4.geometry(water_geometry.format(R)) - mol.set_name("R = {}".format(R)) - name = "data/h2o_{}.xyz".format(i) - files.append(name) - with open(name, "w") as f: - f.write(mol.save_string_xyz_file()) - - return files - -if __name__ == "__main__": - - # generate files/get list of all generated files - files = generate_h2o_xyz_files() - - # define parameters - threads = 4 # psi4 threads - optimizer_method = "cobyla" - active = {"A1": [2, 3], "B1": [0], "B2": [0, 1]} # active space for VQE - basis_set = "sto-3g" # basis set - transformation = "jordan-wigner" # qubit transformation - guess_wfn = None # guess_wfn to ensure convergence along the dissociation curve - options = { - 'reference': 'rhf', - 'df_scf_guess': 'False', - 'scf_type': 'direct', - 'e_convergence': '6', - 'guess': 'read', - "frozen_docc": [2, 0, 0, 0] - } # psi4 options - - ref_methods = ["hf", "mp2", "mp3", "ccsd", "fci"] # compute reference values with psi4 - - ref_energies = {m: [] for m in ref_methods} - energies = [] - - # compute stuff - for i, file in enumerate(files): - if i < 10: break - print("computing point {}".format(i)) - mol = tq.chemistry.Molecule(geometry=file, basis_set=basis_set, transformation=transformation, threads=threads, - guess_wfn=guess_wfn, options=options, active_orbitals=active) - guess_wfn = mol.ref_wfn - - for m in ref_methods: - print("computing ", m) - try: - ref_energies[m] += [mol.compute_energy(method=m, guess_wfn=mol.ref_wfn)] - except: - ref_energies[m] += [None] - - H = mol.make_hamiltonian() - Uhf = mol.prepare_reference() - - # stupid excuse for an vqe, but it tests consistency - # just evaluates the hartree fock energy - U = Uhf - hf = tq.simulate(tq.ExpectationValue(U=U, H=H)) - energies += [hf] - - plt.plot(energies, label="QHF", marker="o", linestyle="--") - for m in ref_methods: - values = ref_energies[m] - plt.plot(values, label=str(m)) - plt.legend() - plt.show()