-
Notifications
You must be signed in to change notification settings - Fork 114
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Co-authored-by: Thomas Hoffmann <[email protected]> Co-authored-by: Dimitri Kartsaklis <[email protected]> Co-authored-by: Nikhil Khatri <[email protected]> Co-authored-by: Charles London <[email protected]> Co-authored-by: Richie Yeung <[email protected]>
- Loading branch information
1 parent
d911686
commit c4e361a
Showing
94 changed files
with
2,672 additions
and
8,135 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
/* override table no-wrap */ | ||
.wy-table-responsive table td, .wy-table-responsive table th { | ||
white-space: normal; | ||
} | ||
table.docutils div.line-block { | ||
margin-bottom: 0; | ||
} | ||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,142 @@ | ||
.. _sec-models: | ||
|
||
Choosing a model | ||
================ | ||
|
||
The following sections provide more information on the various models. | ||
|
||
.. _sec-numpymodel: | ||
|
||
NumpyModel | ||
---------- | ||
|
||
A :py:class:`.NumpyModel` uses the unitary and density matrix simulators in DisCoPy, which convert quantum circuits into a tensor network. The resulting tensor network is efficiently contracted using ``opt_einsum``. | ||
|
||
Circuits containing only :py:class:`Bra <discopy.quantum.gates.Bra>`, :py:class:`Ket <discopy.quantum.gates.Ket>` and unitary gates are evaluated using DisCoPy's unitary simulator, while circuits containing :py:class:`Encode <discopy.quantum.circuit.Encode>`, :py:class:`Measure <discopy.quantum.circuit.Measure>` or :py:class:`Discard <discopy.quantum.circuit.Discard>` are evaluated using DisCoPy's density matrix simulator. | ||
|
||
.. note:: | ||
|
||
Note that the unitary simulator converts a circuit with ``n`` output qubits into a tensor of shape ``(2, ) * n``, while the density matrix simulator converts a circuit with ``n`` output qubits and ``m`` output bits into a tensor of shape ``(2, ) * (2 * n + m)``. | ||
|
||
In the common use case of using a :py:data:`~lambeq.text2diagram.stairs_reader` or a :py:class:`.TreeReader` with discarding for binary classification, the process involves measuring (:py:class:`Measure <discopy.quantum.circuit.Measure>`) one of the "open" qubits, and discarding (:py:class:`Discard <discopy.quantum.circuit.Discard>`) the rest of them. | ||
|
||
One advantage that the :py:class:`.NumpyModel` has over the :py:class:`.TketModel` is that it supports the just-in-time (jit) compilation provided by the library ``jax``. This speeds up the model's diagram evaluation by an order of magnitude. The :py:class:`.NumpyModel` with ``jit`` mode enabled can be instantiated with the following command: | ||
|
||
.. code-block:: python | ||
from lambeq import NumpyModel | ||
model = NumpyModel.from_diagrams(circuits, use_jit=True) | ||
.. note:: | ||
Using the :py:class:`.NumpyModel` with ``jit`` mode enabled is not recommended for large models, as it requires a large amount of memory to store the pre-compiled functions for each circuit. | ||
|
||
To use the :py:class:`.NumpyModel` with ``jit`` mode, you need to install ``lambeq`` with the extra packages by running the following command: | ||
|
||
.. code-block:: bash | ||
pip install lambeq[extras] | ||
.. note:: | ||
|
||
To enable GPU support for ``jax``, follow the installation instructions on the `JAX GitHub repository <https://github.com/google/jax#installation>`_. | ||
|
||
:py:class:`.NumpyModel` should be used with the :py:class:`.QuantumTrainer`. | ||
|
||
.. rubric:: See also the following use cases: | ||
|
||
- :ref:`uc1` | ||
|
||
.. _sec-pytorchmodel: | ||
|
||
PytorchModel | ||
------------ | ||
|
||
:py:class:`.PytorchModel` is the right choice for classical experiments. Here, string diagrams are treated as tensor networks, where boxes represent tensors and edges define the specific tensor contractions. Tensor contractions are optimised by the python package ``opt_einsum``. | ||
|
||
To prepare the diagrams for the computation, we use a :py:class:`.TensorAnsatz` that converts a rigid diagram into a tensor diagram. Subclasses of :py:class:`.TensorAnsatz` include the :py:class:`.SpiderAnsatz` and the :py:class:`.MPSAnsatz`, which reduce the size of large tensors by spliting them into chains of many smaller boxes. To prepare a tensor diagram for a sentence, for example: | ||
|
||
.. code-block:: python | ||
from lambeq import AtomicType, BobcatParser, TensorAnsatz | ||
from discopy import Dim | ||
parser = BobcatParser() | ||
rigid_diagram = parser.sentence2diagram('This is a tensor network.') | ||
ansatz = TensorAnsatz({AtomicType.NOUN: Dim(2), AtomicType.SENTENCE: Dim(4)}) | ||
tensor_diagram = ansatz(rigid_diagram) | ||
After preparing a list of tensor diagrams, we can initialise the model through: | ||
|
||
.. code-block:: python | ||
from lambeq import PytorchModel | ||
model = PytorchModel.from_diagrams(tensor_diagrams) | ||
The :py:class:`.PytorchModel` is capable of combining tensor networks and neural network architectures. For example, it is possible to feed the output of a tensor diagram into a neural network, by subclassing and modifying the :py:meth:`~lambeq.PytorchModel.forward` method: | ||
|
||
.. code-block:: python | ||
import torch | ||
from lambeq import PytorchModel | ||
class MyCustomModel(PytorchModel): | ||
def __init__(self): | ||
super().__init__() | ||
self.net = torch.nn.Linear(2, 2) | ||
def forward(self, input): | ||
"""define a custom forward pass here""" | ||
preds = self.get_diagram_output(input) # performs tensor contraction | ||
return self.net(preds) | ||
To simplify training, the :py:class:`.PytorchModel` can be used with the :py:class:`.PytorchTrainer`. A comprehensive tutorial can be found `here <tutorials/trainer_classical.ipynb>`_. | ||
|
||
.. note:: | ||
|
||
The loss function and the accuracy metric in the tutorial are defined for two-dimensional binary labels: ``[[1,0], [0,1], ...]``. If your data has a different structure, you must implement your custom loss function and evaluation metrics. | ||
|
||
.. rubric:: See also the following use cases: | ||
|
||
- :ref:`uc4` | ||
|
||
.. _sec-tketmodel: | ||
|
||
TketModel | ||
--------- | ||
|
||
:py:class:`.TketModel` uses ``pytket`` to retrieve shot-based results from a quantum computer, then uses the shot counts to build the resulting tensor. | ||
|
||
The ``AerBackend`` can be used with :py:class:`.TketModel` to perform a noisy, architecture-aware simulation of an IBM machine. Other backends supported by ``pytket`` can also be used. To run an experiment on a real quantum computer, for example: | ||
|
||
.. code-block:: python | ||
from lambeq import TketModel | ||
from pytket.extensions.quantinuum import QuantinuumBackend | ||
machine = 'H1-1E' | ||
backend = QuantinuumBackend(device_name=machine) | ||
backend.login() | ||
backend_config = { | ||
'backend': backend, | ||
'compilation': backend.default_compilation_pass(2), | ||
'shots': 2048 | ||
} | ||
model = TketModel.from_diagrams(all_circuits, backend_config=backend_config) | ||
.. note:: | ||
|
||
Note that you need user accounts and allocated resources to run experiments on real machines. However, `IBM Quantum <https://quantum-computing.ibm.com/>`_ provides some limited resources for free. | ||
|
||
For initial experiments we recommend using a :py:class:`.NumpyModel`, as it performs noiseless simulations and is orders of magnitude faster. | ||
|
||
:py:class:`.TketModel` should be used with the :py:class:`.QuantumTrainer`. | ||
|
||
.. rubric:: See also the following use cases: | ||
|
||
- :ref:`uc2` | ||
- :ref:`uc3` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
@startuml | ||
|
||
set namespaceseparator none | ||
skinparam dpi 96 | ||
skinparam shadowing true | ||
skinparam ArrowColor Black | ||
skinparam class { | ||
backgroundColor Business | ||
borderColor Red | ||
} | ||
|
||
abstract class BaseAnsatz { | ||
ob_map: dict | ||
} | ||
class TensorAnsatz { | ||
ob_map: Mapping[Ty, Dim] | ||
functor | ||
} | ||
class CircuitAnsatz { | ||
functor | ||
ob_map: Mapping[Ty, int] | ||
} | ||
class MPSAnsatz { | ||
BOND_TYPE | ||
bond_dim: int | ||
max_order: int | ||
split_functor | ||
tensor_functor | ||
} | ||
class SpiderAnsatz { | ||
max_order: int | ||
split_functor | ||
tensor_functor | ||
} | ||
class IQPAnsatz { | ||
discard: bool | ||
functor | ||
n_layers: int | ||
n_single_qubit_params: int | ||
} | ||
class Symbol { | ||
size: int | ||
sort_key(order) | ||
} | ||
class sympy.core.symbol.Symbol #back:wheat;line:tomato {} | ||
|
||
class discopy.rigid.Ty #back:lightblue;line:black {} | ||
class discopy.rigid.Ob #back:lightblue;line:black {} | ||
class discopy.rigid.Functor #back:lightblue;line:black {} | ||
class discopy.quantum.circuit.Functor #back:lightblue;line:black {} | ||
class discopy.monoidal.Ty #back:lightblue;line:black {} | ||
|
||
discopy.rigid.Ob <|-- discopy.rigid.Ty | ||
discopy.rigid.Functor <|-- discopy.quantum.circuit.Functor | ||
|
||
BaseAnsatz <|-- TensorAnsatz | ||
BaseAnsatz <|-- CircuitAnsatz | ||
TensorAnsatz <|-- MPSAnsatz | ||
TensorAnsatz <|-- SpiderAnsatz | ||
CircuitAnsatz <|-- IQPAnsatz | ||
discopy.monoidal.Ty <|-- discopy.rigid.Ty | ||
|
||
MPSAnsatz::split_functor *-left- discopy.rigid.Functor | ||
MPSAnsatz::tensor_functor *-- discopy.rigid.Functor | ||
SpiderAnsatz::split_functor *-- discopy.rigid.Functor | ||
SpiderAnsatz::tensor_functor *-- discopy.rigid.Functor | ||
MPSAnsatz::BOND_TYPE *--left discopy.rigid.Ty | ||
CircuitAnsatz::functor *-- discopy.quantum.circuit.Functor | ||
TensorAnsatz::functor *-- discopy.quantum.circuit.Functor | ||
IQPAnsatz::functor *-- discopy.quantum.circuit.Functor | ||
sympy.core.symbol.Symbol <|-- Symbol | ||
|
||
@enduml |
Oops, something went wrong.