From 19273db23b7a0b472a40cf1e2484bde6a4e5d22f Mon Sep 17 00:00:00 2001 From: PabloAndresCQ Date: Mon, 25 Sep 2023 15:32:32 +0100 Subject: [PATCH 01/16] Created new general.py file for logger and cutensornet handle. Updated copyright comment. --- pytket/extensions/cutensornet/__init__.py | 5 +++ pytket/extensions/cutensornet/mps/__init__.py | 6 +-- pytket/extensions/cutensornet/mps/mps.py | 41 +++---------------- pytket/extensions/cutensornet/mps/mps_gate.py | 6 +-- pytket/extensions/cutensornet/mps/mps_mpo.py | 8 ++-- .../extensions/cutensornet/mps/simulation.py | 16 +++++++- .../cutensornet/tensor_network_convert.py | 29 +------------ 7 files changed, 36 insertions(+), 75 deletions(-) diff --git a/pytket/extensions/cutensornet/__init__.py b/pytket/extensions/cutensornet/__init__.py index f716ff92..15e7095f 100644 --- a/pytket/extensions/cutensornet/__init__.py +++ b/pytket/extensions/cutensornet/__init__.py @@ -18,6 +18,11 @@ from .backends import CuTensorNetBackend +from .general import ( + set_logger, + CuTensorNetHandle, +) + from .tensor_network_convert import ( TensorNetwork, PauliOperatorTensorNetwork, diff --git a/pytket/extensions/cutensornet/mps/__init__.py b/pytket/extensions/cutensornet/mps/__init__.py index dd3abfc7..7eee1b05 100644 --- a/pytket/extensions/cutensornet/mps/__init__.py +++ b/pytket/extensions/cutensornet/mps/__init__.py @@ -1,11 +1,11 @@ -# Copyright 2019 Cambridge Quantum Computing +# Copyright 2019-2023 Quantinuum # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +## # http://www.apache.org/licenses/LICENSE-2.0 -# +## # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. diff --git a/pytket/extensions/cutensornet/mps/mps.py b/pytket/extensions/cutensornet/mps/mps.py index 3514815b..287ee4ac 100644 --- a/pytket/extensions/cutensornet/mps/mps.py +++ b/pytket/extensions/cutensornet/mps/mps.py @@ -1,11 +1,11 @@ -# Copyright 2019 Cambridge Quantum Computing +# Copyright 2019-2023 Quantinuum # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +## # http://www.apache.org/licenses/LICENSE-2.0 -# +## # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -25,7 +25,6 @@ warnings.warn("local settings failed to import cupy", ImportWarning) try: import cuquantum as cq # type: ignore - import cuquantum.cutensornet as cutn # type: ignore from cuquantum.cutensornet import tensor # type: ignore except ImportError: warnings.warn("local settings failed to import cutensornet", ImportWarning) @@ -33,6 +32,8 @@ from pytket.circuit import Command, Op, OpType, Qubit from pytket.pauli import Pauli, QubitPauliString +from pytket.extensions.cutensornet.general import CuTensorNetHandle + # An alias so that `intptr_t` from CuQuantum's API (which is not available in # base python) has some meaningful type name. Handle = int @@ -50,38 +51,6 @@ class DirectionMPS(Enum): RIGHT = 1 -class CuTensorNetHandle: - """Initialise the cuTensorNet library with automatic workspace memory - management. - - Note: - Always use as ``with CuTensorNetHandle() as libhandle:`` so that cuTensorNet - handles are automatically destroyed at the end of execution. - - Attributes: - handle (int): The cuTensorNet library handle created by this initialisation. - device_id (int): The ID of the device (GPU) where cuTensorNet is initialised. - If not provided, defaults to ``cp.cuda.Device()``. - """ - - def __init__(self, device_id: Optional[int] = None): - self.handle = cutn.create() - self._is_destroyed = False - - # Make sure CuPy uses the specified device - cp.cuda.Device(device_id).use() - - dev = cp.cuda.Device() - self.device_id = int(dev) - - def __enter__(self) -> CuTensorNetHandle: - return self - - def __exit__(self, exc_type: Any, exc_value: Any, exc_tb: Any) -> None: - cutn.destroy(self.handle) - self._is_destroyed = True - - class MPS: """Represents a state as a Matrix Product State. diff --git a/pytket/extensions/cutensornet/mps/mps_gate.py b/pytket/extensions/cutensornet/mps/mps_gate.py index 3c522afd..de57c194 100644 --- a/pytket/extensions/cutensornet/mps/mps_gate.py +++ b/pytket/extensions/cutensornet/mps/mps_gate.py @@ -1,11 +1,11 @@ -# Copyright 2019 Cambridge Quantum Computing +# Copyright 2019-2023 Quantinuum # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +## # http://www.apache.org/licenses/LICENSE-2.0 -# +## # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. diff --git a/pytket/extensions/cutensornet/mps/mps_mpo.py b/pytket/extensions/cutensornet/mps/mps_mpo.py index 42f82462..c0f62818 100644 --- a/pytket/extensions/cutensornet/mps/mps_mpo.py +++ b/pytket/extensions/cutensornet/mps/mps_mpo.py @@ -1,11 +1,11 @@ -# Copyright 2019 Cambridge Quantum Computing +# Copyright 2019-2023 Quantinuum # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +## # http://www.apache.org/licenses/LICENSE-2.0 -# +## # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -29,8 +29,8 @@ warnings.warn("local settings failed to import cutensornet", ImportWarning) from pytket.circuit import Op, Qubit +from pytket.extensions.cutensornet.general import CuTensorNetHandle from .mps import ( - CuTensorNetHandle, DirectionMPS, Tensor, MPS, diff --git a/pytket/extensions/cutensornet/mps/simulation.py b/pytket/extensions/cutensornet/mps/simulation.py index a9224407..83bf2c49 100644 --- a/pytket/extensions/cutensornet/mps/simulation.py +++ b/pytket/extensions/cutensornet/mps/simulation.py @@ -1,3 +1,16 @@ +# Copyright 2019-2023 Quantinuum +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +## +# http://www.apache.org/licenses/LICENSE-2.0 +## +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. from typing import Any from enum import Enum from random import choice # type: ignore @@ -10,7 +23,8 @@ from pytket.passes import DefaultMappingPass from pytket.predicates import CompilationUnit -from .mps import CuTensorNetHandle, MPS +from pytket.extensions.cutensornet.general import CuTensorNetHandle +from .mps import MPS from .mps_gate import MPSxGate from .mps_mpo import MPSxMPO diff --git a/pytket/extensions/cutensornet/tensor_network_convert.py b/pytket/extensions/cutensornet/tensor_network_convert.py index f5bb7468..0d9aad71 100644 --- a/pytket/extensions/cutensornet/tensor_network_convert.py +++ b/pytket/extensions/cutensornet/tensor_network_convert.py @@ -27,34 +27,7 @@ from pytket.pauli import QubitPauliString # type: ignore from pytket.circuit import Circuit, Qubit # type: ignore from pytket.utils import permute_rows_cols_in_unitary - - -# TODO: decide whether to use logger. -def set_logger( - logger_name: str, - level: int = logging.INFO, - fmt: str = "%(name)s - %(levelname)s - %(message)s", -) -> Logger: - """Initialises and configures a logger object. - - Args: - logger_name: Name for the logger object. - level: Logger output level. - fmt: Logger output format. - - Returns: - New configured logger object. - """ - logger = logging.getLogger(logger_name) - logger.setLevel(level) - logger.propagate = False - if not logger.handlers: - handler = logging.StreamHandler() - handler.setLevel(level) - formatter = logging.Formatter(fmt) - handler.setFormatter(formatter) - logger.addHandler(handler) - return logger +from pytket.extensions.cutensornet.general import set_logger class TensorNetwork: From 2fde81ad24f2bbd34cf903b1c1ed1f65d7958127 Mon Sep 17 00:00:00 2001 From: PabloAndresCQ Date: Mon, 25 Sep 2023 17:12:14 +0100 Subject: [PATCH 02/16] Setting logger at MPS. Also changed my mind and restored CuTensornetHandle back to mps.py --- pytket/extensions/cutensornet/__init__.py | 5 --- pytket/extensions/cutensornet/mps/mps.py | 39 ++++++++++++++++++- pytket/extensions/cutensornet/mps/mps_mpo.py | 3 +- .../extensions/cutensornet/mps/simulation.py | 4 +- 4 files changed, 42 insertions(+), 9 deletions(-) diff --git a/pytket/extensions/cutensornet/__init__.py b/pytket/extensions/cutensornet/__init__.py index 15e7095f..f716ff92 100644 --- a/pytket/extensions/cutensornet/__init__.py +++ b/pytket/extensions/cutensornet/__init__.py @@ -18,11 +18,6 @@ from .backends import CuTensorNetBackend -from .general import ( - set_logger, - CuTensorNetHandle, -) - from .tensor_network_convert import ( TensorNetwork, PauliOperatorTensorNetwork, diff --git a/pytket/extensions/cutensornet/mps/mps.py b/pytket/extensions/cutensornet/mps/mps.py index 287ee4ac..906b8fac 100644 --- a/pytket/extensions/cutensornet/mps/mps.py +++ b/pytket/extensions/cutensornet/mps/mps.py @@ -13,6 +13,7 @@ # limitations under the License. from __future__ import annotations # type: ignore import warnings +import logging from typing import Any, Optional, Union from enum import Enum @@ -25,6 +26,7 @@ warnings.warn("local settings failed to import cupy", ImportWarning) try: import cuquantum as cq # type: ignore + import cuquantum.cutensornet as cutn # type: ignore from cuquantum.cutensornet import tensor # type: ignore except ImportError: warnings.warn("local settings failed to import cutensornet", ImportWarning) @@ -32,7 +34,7 @@ from pytket.circuit import Command, Op, OpType, Qubit from pytket.pauli import Pauli, QubitPauliString -from pytket.extensions.cutensornet.general import CuTensorNetHandle +from pytket.extensions.cutensornet.general import set_logger # An alias so that `intptr_t` from CuQuantum's API (which is not available in # base python) has some meaningful type name. @@ -51,6 +53,38 @@ class DirectionMPS(Enum): RIGHT = 1 +class CuTensorNetHandle: + """Initialise the cuTensorNet library with automatic workspace memory + management. + + Note: + Always use as ``with CuTensorNetHandle() as libhandle:`` so that cuTensorNet + handles are automatically destroyed at the end of execution. + + Attributes: + handle (int): The cuTensorNet library handle created by this initialisation. + device_id (int): The ID of the device (GPU) where cuTensorNet is initialised. + If not provided, defaults to ``cp.cuda.Device()``. + """ + + def __init__(self, device_id: Optional[int] = None): + self.handle = cutn.create() + self._is_destroyed = False + + # Make sure CuPy uses the specified device + cp.cuda.Device(device_id).use() + + dev = cp.cuda.Device() + self.device_id = int(dev) + + def __enter__(self) -> CuTensorNetHandle: + return self + + def __exit__(self, exc_type: Any, exc_value: Any, exc_tb: Any) -> None: + cutn.destroy(self.handle) + self._is_destroyed = True + + class MPS: """Represents a state as a Matrix Product State. @@ -80,6 +114,7 @@ def __init__( chi: Optional[int] = None, truncation_fidelity: Optional[float] = None, float_precision: Optional[Union[np.float32, np.float64]] = None, + loglevel: int = logging.WARNING, ): """Initialise an MPS on the computational state ``|0>``. @@ -108,6 +143,7 @@ def __init__( choose from ``numpy`` types: ``np.float64`` or ``np.float32``. Complex numbers are represented using two of such ``float`` numbers. Default is ``np.float64``. + loglevel: Internal logger output level. Raises: ValueError: If less than two qubits are provided. @@ -142,6 +178,7 @@ def __init__( ) self._lib = libhandle + self._logger = set_logger("MPS", level=loglevel) ####################################### # Initialise the MPS with a |0> state # diff --git a/pytket/extensions/cutensornet/mps/mps_mpo.py b/pytket/extensions/cutensornet/mps/mps_mpo.py index c0f62818..acf9cbc7 100644 --- a/pytket/extensions/cutensornet/mps/mps_mpo.py +++ b/pytket/extensions/cutensornet/mps/mps_mpo.py @@ -29,8 +29,9 @@ warnings.warn("local settings failed to import cutensornet", ImportWarning) from pytket.circuit import Op, Qubit -from pytket.extensions.cutensornet.general import CuTensorNetHandle +from pytket.extensions.cutensornet.general import set_logger from .mps import ( + CuTensorNetHandle, DirectionMPS, Tensor, MPS, diff --git a/pytket/extensions/cutensornet/mps/simulation.py b/pytket/extensions/cutensornet/mps/simulation.py index 83bf2c49..db3d865a 100644 --- a/pytket/extensions/cutensornet/mps/simulation.py +++ b/pytket/extensions/cutensornet/mps/simulation.py @@ -23,8 +23,8 @@ from pytket.passes import DefaultMappingPass from pytket.predicates import CompilationUnit -from pytket.extensions.cutensornet.general import CuTensorNetHandle -from .mps import MPS +from pytket.extensions.cutensornet.general import set_logger +from .mps import CuTensorNetHandle, MPS from .mps_gate import MPSxGate from .mps_mpo import MPSxMPO From beded342bc7d4504089339560706247361ff1cc0 Mon Sep 17 00:00:00 2001 From: PabloAndresCQ Date: Tue, 26 Sep 2023 15:46:17 +0100 Subject: [PATCH 03/16] Added debugging and info logging messages. --- pytket/extensions/cutensornet/mps/mps.py | 51 ++++++++++++++++++- pytket/extensions/cutensornet/mps/mps_gate.py | 24 ++++++++- pytket/extensions/cutensornet/mps/mps_mpo.py | 35 +++++++++++-- .../extensions/cutensornet/mps/simulation.py | 39 ++++++++++---- 4 files changed, 134 insertions(+), 15 deletions(-) diff --git a/pytket/extensions/cutensornet/mps/mps.py b/pytket/extensions/cutensornet/mps/mps.py index 906b8fac..73479c8b 100644 --- a/pytket/extensions/cutensornet/mps/mps.py +++ b/pytket/extensions/cutensornet/mps/mps.py @@ -231,6 +231,15 @@ def is_valid(self) -> bool: ds_ok = set(self.canonical_form.keys()) == set(range(len(self))) ds_ok = ds_ok and set(self.qubit_position.values()) == set(range(len(self))) + # Debugger logging + self._logger.debug( + "Checking validity of MPS... " + f"chi_ok={chi_ok}" + f"phys_ok={phys_ok}" + f"shape_ok={shape_ok}" + f"ds_ok={ds_ok}" + ) + return chi_ok and phys_ok and shape_ok and ds_ok def apply_gate(self, gate: Command) -> MPS: @@ -264,6 +273,7 @@ def apply_gate(self, gate: Command) -> MPS: "Gates can only be applied to tensors with physical" + " bond dimension of 2." ) + self._logger.debug(f"Applying gate {gate}...") if len(positions) == 1: self._apply_1q_gate(positions[0], gate.op) @@ -284,11 +294,17 @@ def apply_gate(self, gate: Command) -> MPS: self.canonical_form[positions[0]] = None self.canonical_form[positions[1]] = None + # If requested, provide info about memory usage. + if self._logger.isEnabledFor(logging.INFO): + # If-statetement used so that we only call `get_byte_size` if needed. + self._logger.info(f"MPS size (MiB)={self.get_byte_size() / 2**20}") + self._logger.info(f"MPS fidelity={self.fidelity}") else: raise RuntimeError( "Gates must act on only 1 or 2 qubits! " + f"This is not satisfied by {gate}." ) + return self def canonicalise(self, l_pos: int, r_pos: int) -> None: @@ -304,11 +320,15 @@ def canonicalise(self, l_pos: int, r_pos: int) -> None: r_pos: The position of the rightmost tensor that is not to be canonicalised. """ + self._logger.debug(f"Start canonicalisation... l_pos={l_pos}, r_pos={r_pos}") + for pos in range(l_pos): self.canonicalise_tensor(pos, form=DirectionMPS.LEFT) for pos in reversed(range(r_pos + 1, len(self))): self.canonicalise_tensor(pos, form=DirectionMPS.RIGHT) + self._logger.debug(f"Finished canonicalisation.") + def canonicalise_tensor(self, pos: int, form: DirectionMPS) -> None: """Canonicalises a tensor from an MPS object. @@ -327,6 +347,7 @@ def canonicalise_tensor(self, pos: int, form: DirectionMPS) -> None: """ if form == self.canonical_form[pos]: # Tensor already in canonical form, nothing needs to be done + self._logger.debug(f"Position {pos} already in {form}.") return None if self._lib._is_destroyed: @@ -335,6 +356,7 @@ def canonicalise_tensor(self, pos: int, form: DirectionMPS) -> None: "See the documentation of update_libhandle and CuTensorNetHandle.", ) + self._logger.debug(f"Canonicalising {pos} to {form}.") # Glossary of bond IDs used here: # s -> shared virtual bond between T and Tnext # v -> the other virtual bond of T @@ -366,15 +388,19 @@ def canonicalise_tensor(self, pos: int, form: DirectionMPS) -> None: raise ValueError("Argument form must be a value in DirectionMPS.") # Apply QR decomposition + self._logger.debug(f"QR decompose a {T.nbytes / 2**20} MiB tensor.") + subscripts = T_bonds + "->" + Q_bonds + "," + R_bonds options = {"handle": self._lib.handle, "device_id": self._lib.device_id} Q, R = tensor.decompose( subscripts, T, method=tensor.QRMethod(), options=options ) + self._logger.debug(f"QR decomposition finished.") # Contract R into Tnext subscripts = R_bonds + "," + Tnext_bonds + "->" + result_bonds result = cq.contract(subscripts, R, Tnext) + self._logger.debug(f"Contraction with {next_pos} applied.") # Update self.tensors self.tensors[pos] = Q @@ -427,9 +453,12 @@ def vdot(self, other: MPS) -> complex: # Special case if only one tensor remains if len(self) == 1: + self._logger.debug("Applying trivial vdot on single tensor MPS.") result = cq.contract("LRp,lrp->", self.tensors[0].conj(), other.tensors[0]) else: + self._logger.debug("Applying vdot between two MPS.") + # The two MPS will be contracted from left to right, storing the # ``partial_result`` tensor. partial_result = cq.contract( @@ -451,6 +480,7 @@ def vdot(self, other: MPS) -> complex: other.tensors[-1], ) + self._logger.debug(f"Result from vdot={result}") return complex(result) def sample(self) -> dict[Qubit, int]: @@ -498,6 +528,7 @@ def measure(self, qubits: set[Qubit]) -> dict[Qubit, int]: raise ValueError(f"Qubit {q} is not a qubit in the MPS.") position_qubit_map[self.qubit_position[q]] = q positions = sorted(position_qubit_map.keys()) + self._logger.debug(f"Measuring qubits={position_qubit_map}") # Tensor for postselection to |0> zero_tensor = cp.zeros(2, dtype=self._complex_t) @@ -530,6 +561,7 @@ def measure(self, qubits: set[Qubit]) -> dict[Qubit, int]: # Throw a coin to decide measurement outcome outcome = 0 if prob > random() else 1 result[position_qubit_map[pos]] = outcome + self._logger.debug(f"Outcome of qubit at {pos} is {outcome}.") # Postselect the MPS for this outcome, renormalising at the same time postselection_tensor = cp.zeros(2, dtype=self._complex_t) @@ -573,6 +605,7 @@ def postselect(self, qubit_outcomes: dict[Qubit, int]) -> float: raise ValueError( "Cannot postselect all qubits. You may want to use get_amplitude()." ) + self._logger.debug(f"Postselecting qubits={qubit_outcomes}") # Apply a postselection for each of the qubits for qubit, outcome in qubit_outcomes.items(): @@ -592,6 +625,7 @@ def postselect(self, qubit_outcomes: dict[Qubit, int]) -> float: self.tensors[0] = self.tensors[0] / np.sqrt(prob) self.canonical_form[0] = None + self._logger.debug(f"Probability of this postselection is {prob}.") return prob def _postselect_qubit(self, qubit: Qubit, postselection_tensor: cp.ndarray) -> None: @@ -657,6 +691,7 @@ def expectation_value(self, pauli_string: QubitPauliString) -> float: if q not in self.qubit_position: raise ValueError(f"Qubit {q} is not a qubit in the MPS.") + self._logger.debug(f"Calculating expectation value of {pauli_string}.") mps_copy = self.copy() pauli_optype = {Pauli.Z: OpType.Z, Pauli.X: OpType.X, Pauli.Y: OpType.Y} @@ -679,6 +714,7 @@ def expectation_value(self, pauli_string: QubitPauliString) -> float: value = self.vdot(mps_copy) assert np.isclose(value.imag, 0.0, atol=self._atol) + self._logger.debug(f"Expectation value is {value.real}.") return value.real def get_statevector(self) -> np.ndarray: @@ -752,7 +788,9 @@ def get_amplitude(self, state: int) -> complex: ) assert result_tensor.shape == (1,) - return complex(result_tensor[0]) + result = complex(result_tensor[0]) + self._logger.debug(f"Amplitude of state {state} is {result}.") + return result def get_qubits(self) -> set[Qubit]: """Returns the set of qubits that this MPS is defined on.""" @@ -795,6 +833,13 @@ def get_physical_dimension(self, position: int) -> int: physical_dim: int = self.tensors[position].shape[2] return physical_dim + def get_byte_size(self) -> int: + """ + Returns: + The number of bytes the MPS currently occupies in GPU memory. + """ + return sum(t.nbytes for t in self.tensors) + def get_device_id(self) -> int: """ Returns: @@ -839,6 +884,10 @@ def copy(self) -> MPS: new_mps._complex_t = self._complex_t new_mps._real_t = self._real_t + self._logger.debug( + "Successfully copied an MPS " + f"of size {new_mps.get_byte_size() / 2**20} MiB." + ) return new_mps def __len__(self) -> int: diff --git a/pytket/extensions/cutensornet/mps/mps_gate.py b/pytket/extensions/cutensornet/mps/mps_gate.py index de57c194..3e590627 100644 --- a/pytket/extensions/cutensornet/mps/mps_gate.py +++ b/pytket/extensions/cutensornet/mps/mps_gate.py @@ -138,12 +138,14 @@ def _apply_2q_gate(self, positions: tuple[int, int], gate: Op) -> MPSxGate: result_bonds = "acLR" # Contract + self._logger.debug("Contracting the two-qubit gate with its site tensors...") T = cq.contract( gate_bonds + "," + left_bonds + "," + right_bonds + "->" + result_bonds, gate_tensor, self.tensors[l_pos], self.tensors[r_pos], ) + self._logger.debug(f"Intermediate tensor of size (MiB)={T.nbytes / 2**20}") # Get the template of the MPS tensors involved L = self.tensors[l_pos] @@ -161,6 +163,9 @@ def _apply_2q_gate(self, positions: tuple[int, int], gate: Op) -> MPSxGate: # uses REL_SUM2_CUTOFF. Then the code in the `else` block should # be run; i.e. use standard cuTensorNet API to do the SVD # including normalisation and contraction of S with L. + self._logger.debug( + f"Truncating to target fidelity={self.truncation_fidelity}" + ) options = {"handle": self._lib.handle, "device_id": self._lib.device_id} svd_method = tensor.SVDMethod(abs_cutoff=self._atol / 1000) @@ -179,6 +184,7 @@ def _apply_2q_gate(self, positions: tuple[int, int], gate: Op) -> MPSxGate: # singular values that remain after truncation (before normalisation). denom = float(sum(cp.square(S))) # Element-wise squaring numer = 0.0 + old_dim = new_dim new_dim = 0 # Take singular values until we surpass the target fidelity @@ -222,11 +228,18 @@ def _apply_2q_gate(self, positions: tuple[int, int], gate: Op) -> MPSxGate: # to keep track of a lower bound for the fidelity. self.fidelity *= this_fidelity + # Report to logger + self._logger.debug(f"Truncation done. Truncation fidelity={this_fidelity}") + self._logger.debug( + f"Reduced virtual bond dimension from {old_dim} to {new_dim}." + ) + elif new_dim > self.chi: # Apply SVD decomposition and truncate up to a `max_extent` (for the shared # bond) of `self.chi`. Ask cuTensorNet to contract S directly into the L # tensor and normalise the singular values so that the sum of its squares # is equal to one (i.e. the MPS is a normalised state after truncation). + self._logger.debug(f"Truncating to (or below) chosen chi={self.chi}") options = {"handle": self._lib.handle, "device_id": self._lib.device_id} svd_method = tensor.SVDMethod( @@ -252,16 +265,25 @@ def _apply_2q_gate(self, positions: tuple[int, int], gate: Op) -> MPSxGate: # # We multiply the fidelity of the current step to the overall fidelity # to keep track of a lower bound for the fidelity. - self.fidelity *= 1.0 - svd_info.discarded_weight + this_fidelity = 1.0 - svd_info.discarded_weight + self.fidelity *= this_fidelity + + # Report to logger + self._logger.debug(f"Truncation done. Truncation fidelity={this_fidelity}") + self._logger.debug( + f"Reduced virtual bond dimension from {new_dim} to {R.shape[0]}." + ) else: # No truncation is necessary. In this case, simply apply a QR decomposition # to get back to MPS form. QR is cheaper than SVD. + self._logger.debug("No truncation is necessary, applying QR decomposition.") options = {"handle": self._lib.handle, "device_id": self._lib.device_id} L, R = tensor.decompose( "acLR->asL,scR", T, method=tensor.QRMethod(), options=options ) + self._logger.debug("QR decomposition applied.") self.tensors[l_pos] = L self.tensors[r_pos] = R diff --git a/pytket/extensions/cutensornet/mps/mps_mpo.py b/pytket/extensions/cutensornet/mps/mps_mpo.py index acf9cbc7..9f4ecc8a 100644 --- a/pytket/extensions/cutensornet/mps/mps_mpo.py +++ b/pytket/extensions/cutensornet/mps/mps_mpo.py @@ -13,6 +13,7 @@ # limitations under the License. from __future__ import annotations # type: ignore import warnings +import logging from typing import Optional, Union @@ -29,7 +30,6 @@ warnings.warn("local settings failed to import cutensornet", ImportWarning) from pytket.circuit import Op, Qubit -from pytket.extensions.cutensornet.general import set_logger from .mps import ( CuTensorNetHandle, DirectionMPS, @@ -54,6 +54,7 @@ def __init__( k: Optional[int] = None, optim_delta: Optional[float] = None, float_precision: Optional[Union[np.float32, np.float64]] = None, + loglevel: int = logging.WARNING, ): """Initialise an MPS on the computational state ``|0>``. @@ -89,8 +90,16 @@ def __init__( choose from ``numpy`` types: ``np.float64`` or ``np.float32``. Complex numbers are represented using two of such ``float`` numbers. Default is ``np.float64``. + loglevel: Internal logger output level. """ - super().__init__(libhandle, qubits, chi, truncation_fidelity, float_precision) + super().__init__( + libhandle=libhandle, + qubits=qubits, + chi=chi, + truncation_fidelity=truncation_fidelity, + float_precision=float_precision, + loglevel=loglevel, + ) # Initialise the MPO data structure. This will keep a list of the gates # batched for application to the MPS; all of them will be applied at @@ -110,7 +119,12 @@ def __init__( # Initialise the MPS that we will use as first approximation of the # variational algorithm. self._aux_mps = MPSxGate( - libhandle, qubits, chi, truncation_fidelity, float_precision + libhandle=libhandle, + qubits=qubits, + chi=chi, + truncation_fidelity=truncation_fidelity, + float_precision=float_precision, + loglevel=loglevel, ) if k is None: @@ -345,6 +359,8 @@ def _flush(self) -> None: The method applies variational optimisation of the MPS until it converges. Based on https://arxiv.org/abs/2207.05612. """ + self._logger.info("Applying variational optimisation.") + self._logger.info(f"Fidelity before optimisation={self._aux_mps.fidelity}") l_cached_tensors: list[Tensor] = [] r_cached_tensors: list[Tensor] = [] @@ -356,6 +372,7 @@ def update_sweep_cache(pos: int, direction: DirectionMPS) -> None: Update the cache accordingly. Applies canonicalisation on the vMPS tensor before contracting. """ + self._logger.debug("Updating the sweep cache...") # Canonicalise the tensor at ``pos`` if direction == DirectionMPS.LEFT: @@ -425,6 +442,8 @@ def update_sweep_cache(pos: int, direction: DirectionMPS) -> None: elif direction == DirectionMPS.RIGHT: l_cached_tensors.append(T) + self._logger.debug("Completed update of the sweep cache.") + def update_variational_tensor( pos: int, left_tensor: Optional[Tensor], right_tensor: Optional[Tensor] ) -> float: @@ -434,6 +453,8 @@ def update_variational_tensor( Contract these with the MPS-MPO column at ``pos``. Return the current fidelity of this sweep. """ + self._logger.debug(f"Optimising tensor at position={pos}") + interleaved_rep = [ # The tensor of the MPS self.tensors[pos], @@ -483,6 +504,7 @@ def update_variational_tensor( # Normalise F and update the variational MPS self._aux_mps.tensors[pos] = F / np.sqrt(optim_fidelity) + self._logger.debug(f"Tensor optimised. Current fidelity={optim_fidelity}") return optim_fidelity ################################## @@ -500,6 +522,7 @@ def update_variational_tensor( # Repeat sweeps until the fidelity converges sweep_direction = DirectionMPS.RIGHT while not np.isclose(prev_fidelity, sweep_fidelity, atol=self.optim_delta): + self._logger.info(f"Doing another optimisation sweep...") prev_fidelity = sweep_fidelity if sweep_direction == DirectionMPS.RIGHT: @@ -540,6 +563,10 @@ def update_variational_tensor( sweep_direction = DirectionMPS.RIGHT + self._logger.info( + f"Optimisation sweep completed. Current fidelity={self.fidelity}" + ) + # Clear out the MPO self._mpo = [list() for _ in range(len(self))] self._bond_ids = [list() for _ in range(len(self))] @@ -552,6 +579,8 @@ def update_variational_tensor( self.fidelity *= sweep_fidelity self._aux_mps.fidelity = self.fidelity + self._logger.info(f"Final fidelity after optimisation={self.fidelity}") + def _new_bond_id(self) -> int: self._mpo_bond_counter += 1 return self._mpo_bond_counter diff --git a/pytket/extensions/cutensornet/mps/simulation.py b/pytket/extensions/cutensornet/mps/simulation.py index db3d865a..6ac137d0 100644 --- a/pytket/extensions/cutensornet/mps/simulation.py +++ b/pytket/extensions/cutensornet/mps/simulation.py @@ -13,6 +13,8 @@ # limitations under the License. from typing import Any from enum import Enum +import logging + from random import choice # type: ignore from collections import defaultdict # type: ignore import numpy as np # type: ignore @@ -44,7 +46,7 @@ def simulate( libhandle: CuTensorNetHandle, circuit: Circuit, algorithm: ContractionAlg, - **kwargs: Any + **kwargs: Any, ) -> MPS: """Simulate the given circuit and return the ``MPS`` representing the final state. @@ -76,34 +78,50 @@ def simulate( chi = kwargs.get("chi", None) truncation_fidelity = kwargs.get("truncation_fidelity", None) float_precision = kwargs.get("float_precision", None) + loglevel = kwargs.get("loglevel", logging.WARNING) + logger = set_logger("Simulation", level=loglevel) if algorithm == ContractionAlg.MPSxGate: mps = MPSxGate( # type: ignore - libhandle, circuit.qubits, chi, truncation_fidelity, float_precision + libhandle=libhandle, + qubits=circuit.qubits, + chi=chi, + truncation_fidelity=truncation_fidelity, + float_precision=float_precision, + loglevel=loglevel, ) elif algorithm == ContractionAlg.MPSxMPO: k = kwargs.get("k", None) optim_delta = kwargs.get("optim_delta", None) mps = MPSxMPO( # type: ignore - libhandle, - circuit.qubits, - chi, - truncation_fidelity, - k, - optim_delta, - float_precision, + libhandle=libhandle, + qubits=circuit.qubits, + chi=chi, + truncation_fidelity=truncation_fidelity, + k=k, + optim_delta=optim_delta, + float_precision=float_precision, + loglevel=loglevel, ) # Sort the gates so there isn't much overhead from canonicalising back and forth. + logger.info( + "Ordering the gates in the circuit to reduce canonicalisation overhead." + ) sorted_gates = _get_sorted_gates(circuit) + logger.info("Running simulation...") # Apply the gates - for g in sorted_gates: + for i, g in enumerate(sorted_gates): mps.apply_gate(g) + logger.info(f"Progress... {(100*i) // len(sorted_gates)}%") # Apply the circuit's phase to the leftmost tensor (any would work) mps.tensors[0] = mps.tensors[0] * np.exp(1j * np.pi * circuit.phase) + logger.info("Simulation completed.") + logger.info(f"Final MPS size={mps.get_byte_size() / 2**20} MiB") + logger.info(f"Final MPS fidelity={mps.fidelity}") return mps @@ -157,6 +175,7 @@ def _get_sorted_gates(circuit: Circuit) -> list[Command]: Returns: The same gates, ordered in a beneficial way. """ + all_gates = circuit.get_commands() sorted_gates = [] # Keep track of the qubit at the center of the canonical form; start arbitrarily From fd362e15b1669077bc8f89a50d6c951aab7c40f3 Mon Sep 17 00:00:00 2001 From: PabloAndresCQ Date: Tue, 26 Sep 2023 15:47:36 +0100 Subject: [PATCH 04/16] Forgot to add the general.py file --- pytket/extensions/cutensornet/general.py | 42 ++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 pytket/extensions/cutensornet/general.py diff --git a/pytket/extensions/cutensornet/general.py b/pytket/extensions/cutensornet/general.py new file mode 100644 index 00000000..6e2b2207 --- /dev/null +++ b/pytket/extensions/cutensornet/general.py @@ -0,0 +1,42 @@ +# Copyright 2019-2023 Quantinuum +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +## +# http://www.apache.org/licenses/LICENSE-2.0 +## +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import logging +from logging import Logger + + +def set_logger( + logger_name: str, + level: int = logging.WARNING, + fmt: str = "[%(asctime)s] %(name)s (%(levelname)-8s) - %(message)s", +) -> Logger: + """Initialises and configures a logger object. + + Args: + logger_name: Name for the logger object. + level: Logger output level. + fmt: Logger output format. + + Returns: + New configured logger object. + """ + logger = logging.getLogger(logger_name) + logger.setLevel(level) + logger.propagate = False + if not logger.handlers: + handler = logging.StreamHandler() + handler.setLevel(level) + formatter = logging.Formatter(fmt, datefmt="%H:%M:%S") + handler.setFormatter(formatter) + logger.addHandler(handler) + return logger From 6ebe2d02b4f253f3d6ea6e6dfd4547adfdd75a10 Mon Sep 17 00:00:00 2001 From: Pablo Andres-Martinez Date: Tue, 26 Sep 2023 09:16:48 -0700 Subject: [PATCH 05/16] Improved messages --- pytket/extensions/cutensornet/general.py | 2 +- pytket/extensions/cutensornet/mps/mps.py | 13 ++++--------- pytket/extensions/cutensornet/mps/mps_gate.py | 8 ++++++++ pytket/extensions/cutensornet/mps/mps_mpo.py | 3 +-- 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/pytket/extensions/cutensornet/general.py b/pytket/extensions/cutensornet/general.py index 6e2b2207..efa80aa8 100644 --- a/pytket/extensions/cutensornet/general.py +++ b/pytket/extensions/cutensornet/general.py @@ -18,7 +18,7 @@ def set_logger( logger_name: str, level: int = logging.WARNING, - fmt: str = "[%(asctime)s] %(name)s (%(levelname)-8s) - %(message)s", + fmt: str = "[%(asctime)s] %(name)s (%(levelname)s) - %(message)s", ) -> Logger: """Initialises and configures a logger object. diff --git a/pytket/extensions/cutensornet/mps/mps.py b/pytket/extensions/cutensornet/mps/mps.py index 73479c8b..004dad78 100644 --- a/pytket/extensions/cutensornet/mps/mps.py +++ b/pytket/extensions/cutensornet/mps/mps.py @@ -234,9 +234,9 @@ def is_valid(self) -> bool: # Debugger logging self._logger.debug( "Checking validity of MPS... " - f"chi_ok={chi_ok}" - f"phys_ok={phys_ok}" - f"shape_ok={shape_ok}" + f"chi_ok={chi_ok}, " + f"phys_ok={phys_ok}, " + f"shape_ok={shape_ok}, " f"ds_ok={ds_ok}" ) @@ -273,7 +273,7 @@ def apply_gate(self, gate: Command) -> MPS: "Gates can only be applied to tensors with physical" + " bond dimension of 2." ) - self._logger.debug(f"Applying gate {gate}...") + self._logger.debug(f"Applying gate {gate}") if len(positions) == 1: self._apply_1q_gate(positions[0], gate.op) @@ -294,11 +294,6 @@ def apply_gate(self, gate: Command) -> MPS: self.canonical_form[positions[0]] = None self.canonical_form[positions[1]] = None - # If requested, provide info about memory usage. - if self._logger.isEnabledFor(logging.INFO): - # If-statetement used so that we only call `get_byte_size` if needed. - self._logger.info(f"MPS size (MiB)={self.get_byte_size() / 2**20}") - self._logger.info(f"MPS fidelity={self.fidelity}") else: raise RuntimeError( "Gates must act on only 1 or 2 qubits! " diff --git a/pytket/extensions/cutensornet/mps/mps_gate.py b/pytket/extensions/cutensornet/mps/mps_gate.py index 3e590627..9b29d1e7 100644 --- a/pytket/extensions/cutensornet/mps/mps_gate.py +++ b/pytket/extensions/cutensornet/mps/mps_gate.py @@ -13,6 +13,7 @@ # limitations under the License. from __future__ import annotations # type: ignore import warnings +import logging import numpy as np # type: ignore @@ -287,4 +288,11 @@ def _apply_2q_gate(self, positions: tuple[int, int], gate: Op) -> MPSxGate: self.tensors[l_pos] = L self.tensors[r_pos] = R + + # If requested, provide info about memory usage. + if self._logger.isEnabledFor(logging.INFO): + # If-statetement used so that we only call `get_byte_size` if needed. + self._logger.info(f"MPS size (MiB)={self.get_byte_size() / 2**20}") + self._logger.info(f"MPS fidelity={self.fidelity}") + return self diff --git a/pytket/extensions/cutensornet/mps/mps_mpo.py b/pytket/extensions/cutensornet/mps/mps_mpo.py index 9f4ecc8a..4020e7b7 100644 --- a/pytket/extensions/cutensornet/mps/mps_mpo.py +++ b/pytket/extensions/cutensornet/mps/mps_mpo.py @@ -504,7 +504,6 @@ def update_variational_tensor( # Normalise F and update the variational MPS self._aux_mps.tensors[pos] = F / np.sqrt(optim_fidelity) - self._logger.debug(f"Tensor optimised. Current fidelity={optim_fidelity}") return optim_fidelity ################################## @@ -564,7 +563,7 @@ def update_variational_tensor( sweep_direction = DirectionMPS.RIGHT self._logger.info( - f"Optimisation sweep completed. Current fidelity={self.fidelity}" + f"Optimisation sweep completed. Current fidelity={self.fidelity*sweep_fidelity}" ) # Clear out the MPO From b348f14a94be0403b71f1324f47c08cf1c48cad8 Mon Sep 17 00:00:00 2001 From: Pablo Andres-Martinez Date: Tue, 26 Sep 2023 09:24:46 -0700 Subject: [PATCH 06/16] Fixed a bug on simulate I just found. --- pytket/extensions/cutensornet/mps/simulation.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pytket/extensions/cutensornet/mps/simulation.py b/pytket/extensions/cutensornet/mps/simulation.py index 6ac137d0..c79d94c0 100644 --- a/pytket/extensions/cutensornet/mps/simulation.py +++ b/pytket/extensions/cutensornet/mps/simulation.py @@ -116,6 +116,9 @@ def simulate( mps.apply_gate(g) logger.info(f"Progress... {(100*i) // len(sorted_gates)}%") + # Apply the batched operations that are left (if any) + mps._flush() + # Apply the circuit's phase to the leftmost tensor (any would work) mps.tensors[0] = mps.tensors[0] * np.exp(1j * np.pi * circuit.phase) From cc92c0416b60b48f4ee3050419a2c69d71c5da5c Mon Sep 17 00:00:00 2001 From: Pablo Andres-Martinez Date: Tue, 26 Sep 2023 09:41:45 -0700 Subject: [PATCH 07/16] Fixed linting and failing test --- pytket/extensions/cutensornet/mps/mps_mpo.py | 3 ++- tests/test_mps.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/pytket/extensions/cutensornet/mps/mps_mpo.py b/pytket/extensions/cutensornet/mps/mps_mpo.py index 4020e7b7..e7f6be44 100644 --- a/pytket/extensions/cutensornet/mps/mps_mpo.py +++ b/pytket/extensions/cutensornet/mps/mps_mpo.py @@ -563,7 +563,8 @@ def update_variational_tensor( sweep_direction = DirectionMPS.RIGHT self._logger.info( - f"Optimisation sweep completed. Current fidelity={self.fidelity*sweep_fidelity}" + "Optimisation sweep completed. " + f"Current fidelity={self.fidelity*sweep_fidelity}" ) # Clear out the MPO diff --git a/tests/test_mps.py b/tests/test_mps.py index c8f8f440..9e920fa4 100644 --- a/tests/test_mps.py +++ b/tests/test_mps.py @@ -333,7 +333,7 @@ def test_circ_approx_explicit(circuit: Circuit) -> None: # Check for MPSxMPO mps_mpo = simulate(libhandle, circuit, ContractionAlg.MPSxMPO, chi=8) - assert np.isclose(mps_mpo.fidelity, 0.06, atol=1e-2) + assert np.isclose(mps_mpo.fidelity, 0.04, atol=1e-2) assert mps_mpo.is_valid() assert np.isclose(mps_mpo.vdot(mps_mpo), 1.0, atol=mps_mpo._atol) From f8b41d68372ec0788c0fba94640001855a608119 Mon Sep 17 00:00:00 2001 From: PabloAndresCQ Date: Wed, 27 Sep 2023 14:03:42 +0100 Subject: [PATCH 08/16] Updated Jupyter notebook with example of logger. --- examples/mps_tutorial.ipynb | 1199 ++++++++++++++++++++++++++++++++++- 1 file changed, 1180 insertions(+), 19 deletions(-) diff --git a/examples/mps_tutorial.ipynb b/examples/mps_tutorial.ipynb index 984adfe4..f1a2a555 100644 --- a/examples/mps_tutorial.ipynb +++ b/examples/mps_tutorial.ipynb @@ -97,7 +97,7 @@ "\n", "\n", "\n", - " <div id="circuit-display-vue-container-f6589290-2356-4b8d-a825-fc39b4059b95" class="pytket-circuit-display-container">\n", + " <div id="circuit-display-vue-container-e13d14af-9a4e-4029-8388-8fb18c773bf6" class="pytket-circuit-display-container">\n", " <div style="display: none">\n", " <div id="circuit-json-to-display">{"bits": [], "commands": [{"args": [["q", [0]], ["q", [1]]], "op": {"type": "CZ"}}, {"args": [["q", [2]]], "op": {"type": "H"}}, {"args": [["q", [3]], ["q", [4]]], "op": {"type": "CX"}}, {"args": [["q", [0]]], "op": {"params": ["0.2"], "type": "Ry"}}, {"args": [["q", [2]], ["q", [1]]], "op": {"params": ["0.3", "0.5", "0.7"], "type": "TK2"}}, {"args": [["q", [4]], ["q", [3]]], "op": {"params": ["0.1"], "type": "ZZPhase"}}], "created_qubits": [], "discarded_qubits": [], "implicit_permutation": [[["q", [0]], ["q", [0]]], [["q", [1]], ["q", [1]]], [["q", [2]], ["q", [2]]], [["q", [3]], ["q", [3]]], [["q", [4]], ["q", [4]]]], "phase": "0.0", "qubits": [["q", [0]], ["q", [1]], ["q", [2]], ["q", [3]], ["q", [4]]]}</div>\n", " </div>\n", @@ -107,7 +107,7 @@ " ></circuit-display-container>\n", " </div>\n", " <script type="application/javascript">\n", - " const circuitRendererUid = "f6589290-2356-4b8d-a825-fc39b4059b95";\n", + " const circuitRendererUid = "e13d14af-9a4e-4029-8388-8fb18c773bf6";\n", " const displayOptions = JSON.parse('{}');\n", "\n", " // Script to initialise the circuit renderer app\n", @@ -285,7 +285,7 @@ "outputs": [ { "data": { - "image/png": "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TEFBgbp166ZFixZVOk9CQoKysrJcw6pVq+qwQgAA4Mmq9a6lmjJw4EANHDjwovP4+PgoMjKyjioCAABW4vFtZJKTkxUeHq4OHTpo/PjxOn78+EXndzqdysvLcxsAAED95NFBJiEhQcuXL9fGjRv1wgsvKCUlRQMHDlRxcXGlyyQmJsput7uG2NjYOqwYAADUJZthGIbZRUiSzWbT2rVrNXTo0Ern+de//qW2bdvqiy++UL9+/Sqcx+l0yul0uj7n5eUpNjZWDodDwcHBNV02AACoBXl5ebLb7Zf8/fboKzIXatOmjZo1a6aDBw9WOo+Pj4+Cg4PdBgAAUD9ZKsgcPXpUx48fV1RUlNmlAAAAD2DqU0v5+fluV1fS09O1c+dOhYaGKjQ0VHPmzNHw4cMVGRmpQ4cO6cknn1S7du00YMAAE6sGAACewtQgs337dt12222uz1OnTpUkjR49WosXL9auXbv01ltv6dSpU4qOjlb//v01d+5c+fj4mFUyAADwIB7T2Le2VLWxEAAA8Bz1srEvAADA+QgyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAskwNMl999ZUGDx6s6Oho2Ww2ffDBB27TDcPQM888o6ioKPn5+Sk+Pl4HDhwwp1gAAOBxTA0yBQUF6tatmxYtWlTh9BdffFELFy7U66+/ri1btiggIEADBgxQYWFhHVcKAAA8UWMzv3zgwIEaOHBghdMMw9D8+fM1c+ZMDRkyRJK0fPlyRURE6IMPPtB9991Xl6UCAAAP5LFtZNLT05Wdna34+HjXOLvdrl69eik1NbXS5ZxOp/Ly8twGAABQP3lskMnOzpYkRUREuI2PiIhwTatIYmKi7Ha7a4iNja3VOgEAgHk8NshU14wZM+RwOFxDZmam2SUBAIBa4rFBJjIyUpKUk5PjNj4nJ8c1rSI+Pj4KDg52GwAAQP3ksUGmdevWioyM1MaNG13j8vLytGXLFsXFxZlYGQAA8BSmPrWUn5+v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", + "image/png": "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GzdOJ06c0EMPPaTMzEx16dJFK1assGaMGQAA4JccpqyhBmuIrKwsuVwuud1uhYeHW10OAEBSbm6uUlJS1LRp07P+CAQ129mOg8p8f1s+zgwAAMC5IMwAAABbI8wAAFBDDB8+XH/84x+tLuO8I8wAAFAJw4cPl8PhKPFKTEy0ujS9+OKLWrhwodVlSCoa9PaDDz44L5/l179mAgCgVLluKe+Y5GpUcpr7sOQMrdYn3icmJmrBggVebVYO2FpQUCCHwyGXq/r67M84MwMAsJdct7ToT9LCfpL7R+9p7h+L2hf9qWi+auJ0OhUdHe31atCggVatWqXAwEB9+eWXnnlnzJihCy+8UGlpaZKkXr16afTo0Ro9erTq16+viIgIPfHEE17Pb8rPz9e4cePUqFEjhYSEqEuXLl4D4i1cuFD169fXRx99pNatW8vpdOrgwYMlLjP16tVLDz/8sJKSktSgQQNFRUVp7ty5ysnJ0d13362wsDA1b95cn376qVf/du/erX79+ik0NFRRUVEaMmSIfv31V6/1PvLIIxo3bpwaNmyo6OhoTZ482TO9SZMmkqRbbrlFDofD8766EGYAAPaSd0zK+UXKPCAtvPH3QOP+seh95oGi6XnHzntpvXr1UlJSkoYMGSK3261vv/1WEydO1Lx587wezfPGG2/oggsu0Pr16zV79mzNnDlT8+fP90y/++679fXXX2vx4sXavn27br31ViUmJmrfvn2eeY4fP65p06Zp/vz52rVrlyIjI0ut6Y033tCFF16oDRs26OGHH9aDDz6oW2+9Vd26ddOWLVvUp08fDRkyRMePH5dU9JDKnj176oorrtCmTZu0fPly/fzzz7rttttKrDckJETr16/X9OnT9dRTTyk5OVmSPA+QXrBggdLS0kp9oHSVMjWc2+02kozb7ba6FADA/5w4ccLs3r3bnDhxwrcV/JZqzKx2xjwZXvTfg+u83/+WWrUFn2bYsGEmICDAhISEeL2eeuopY4wxeXl55sorrzS33Xabufzyy829997rtXzPnj3NZZddZgoLCz1t48ePN5dddpkxxpjvv//eOBwOc/jwYa/lrr/+ejNhwgRjjDELFiwwksy2bdtK1DZgwACvz7rmmms870+dOmVCQkLMkCFDPG1paWlGkvnmm2+MMcZMmjTJJCQkeK03NTXVSDJ79+4tdb3GGHPVVVeZ8ePHe95LMkuXLi1jKxY523FQme9v7pkBANiPK04a/vHvZ2JeTyhqb9CkqN0VV60ff+211+rVV1/1amvYsKEkKTAwUIsWLVK7du3UuHFjzZo1q8TyV199tRwOh+d9165dNWPGDBUUFGjLli0yxqhVq1Zey+Tl5Ski4vcnhAcGBqpdu3bl1nr6PAEBAYqIiFDbtm09bcUPb87IyJBU9CDolStXKjQ0tMS6fvjhB09dZ352TEyMZx3nG2EGAGBPrjjplrm/Bxmp6H01Bxmp6FmCLVq0KHP62rVrJUlHjx7V0aNHFRISUuF1FxYWKiAgQJs3b1ZAQIDXtNMDRlBQkFcgKkvdunW93jscDq+24nUUFhZ6/tu/f/9SH+p8+qWy0tZbvI7zjTADALAn94/S0vu925bef17OzJzNDz/8oDFjxmjevHl67733NHToUH3++eeqU+f321TXrVvntcy6devUsmVLBQQE6Morr1RBQYEyMjLUvXv3812+OnTooH//+99q0qSJLrjA95hQt25dFRQUVGFlZeMGYACA/Zx+s2+DJtKIFUX/PfOm4GqSl5en9PR0r9evv/6qgoICDRkyRAkJCbr77ru1YMEC7dy5UzNmzPBaPjU1VWPHjtXevXv1zjvv6KWXXtKjjz4qSWrVqpXuuusuDR06VEuWLFFKSoo2btyo559/Xp988km19kuSRo0apaNHj2rQoEHasGGD9u/frxUrVmjEiBGVCidNmjTR559/rvT0dGVmZlZjxYQZAIDduA97B5nhH0sXdyn6r1egOVxtJSxfvlwxMTFer2uuuUbPPvusDhw4oLlz50qSoqOjNX/+fD3xxBPatm2bZ/mhQ4fqxIkT6ty5s0aNGqWHH35Y99//+1mmBQsWaOjQoXrsscd0ySWX6Oabb9b69esVHx9fbX0qFhsbq6+//loFBQXq06eP2rRpo0cffVQul8vr7FJ5ZsyYoeTkZMXHx+vKK6+sxop5ajYAwALn9NTs4nFmcn4peUmp+IxNyEXS4H9X68B5vurVq5euuOKKUm8Mrm2q6qnZ3DMDALCXeq6ioFLaCMCuOGn4J9U+AjD8C2EGAGA/9Vxlh5XSHnGAGo0wAwDAeXT6YwlQNbgBGAAA2BphBgBgmRr+GxSUo6r2P2EGAHDeFY8eW/xwQ9ROxfv/zNGEK4t7ZgAA511AQIDq16/veZZPcHBwhYbmR81gjNHx48eVkZGh+vXrl3hsQ2URZgAAloiOjpYkyx5OCOvVr1/fcxycC8IMAMASDodDMTExioyM1MmTJ60uB+dZ3bp1z/mMTDHCDADAUgEBAVX2pYbaiRuAAQCArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArVkaZl599VW1a9dO4eHhCg8PV9euXfXpp596phtjNHnyZMXGxiooKEi9evXSrl27LKwYAAD4G0vDTFxcnJ577jlt2rRJmzZt0nXXXacBAwZ4Asv06dP1wgsvaM6cOdq4caOio6PVu3dvZWdnW1k2AADwIw5jjLG6iNM1bNhQf//73zVixAjFxsYqKSlJ48ePlyTl5eUpKipKzz//vEaOHFmh9WVlZcnlcsntdis8PLw6SwcAAFWkMt/ffnPPTEFBgRYvXqycnBx17dpVKSkpSk9PV0JCgmcep9Opnj17au3atWWuJy8vT1lZWV4vAABQc1keZnbs2KHQ0FA5nU498MADWrp0qVq3bq309HRJUlRUlNf8UVFRnmmlmTZtmlwul+cVHx9frfUDAABrWR5mLrnkEm3btk3r1q3Tgw8+qGHDhmn37t2e6Q6Hw2t+Y0yJttNNmDBBbrfb80pNTa222gEAgPUusLqAwMBAtWjRQpLUqVMnbdy4US+++KLnPpn09HTFxMR45s/IyChxtuZ0TqdTTqezeosGAAB+w/IzM2cyxigvL09NmzZVdHS0kpOTPdPy8/O1evVqdevWzcIKAQCAP7H0zMxf//pX9e3bV/Hx8crOztbixYu1atUqLV++XA6HQ0lJSZo6dapatmypli1baurUqQoODtadd95pZdkAAMCPWBpmfv75Zw0ZMkRpaWlyuVxq166dli9frt69e0uSxo0bpxMnTuihhx5SZmamunTpohUrVigsLMzKsgEAgB/xu3FmqhrjzAAAYD+2HGcGAADAF4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABgaz6FmdTUVP3444+e9xs2bFBSUpLmzp1bZYUBAABUhE9h5s4779TKlSslSenp6erdu7c2bNigv/71r3rqqaeqtEAAAICz8SnM7Ny5U507d5Ykvffee2rTpo3Wrl2rt99+WwsXLqzK+gAAAM7KpzBz8uRJOZ1OSdJnn32mm2++WZJ06aWXKi0treqqAwAAKIdPYebyyy/XP/7xD3355ZdKTk5WYmKiJOmnn35SRERElRYIAABwNj6Fmeeff16vvfaaevXqpUGDBql9+/aSpGXLlnkuPwEAAJwPDmOM8WXBgoICZWVlqUGDBp62AwcOKDg4WJGRkVVW4LnKysqSy+WS2+1WeHi41eUAAIAKqMz3t8/jzBhjtHnzZr322mvKzs6WJAUGBio4ONjXVQIAAFTaBb4sdPDgQSUmJurQoUPKy8tT7969FRYWpunTpys3N1f/+Mc/qrpOAACAUvl0ZubRRx9Vp06dlJmZqaCgIE/7Lbfcos8//7zKigMAACiPT2dmvvrqK3399dcKDAz0am/cuLEOHz5cJYUBAABUhE9nZgoLC1VQUFCi/ccff1RYWNg5FwUAAFBRPoWZ3r17a9asWZ73DodDx44d05NPPql+/fpVVW0AAADl8umn2T/99JOuvfZaBQQEaN++ferUqZP27dunCy+8UGvWrOGn2QAA4JxU5vvbp3tmYmNjtW3bNr3zzjvasmWLCgsLdc899+iuu+7yuiEYAACguvk8aJ5dcGYGAAD7qZYzM8uWLatwAcUPngQAAKhuFQ4zf/zjHys0n8PhKPWXTgAAANWhwmGmsLCwOusAAADwic/PZgIAAPAHPoeZzz//XDfddJOaN2+uFi1a6KabbtJnn31WlbUBAACUy6cwM2fOHCUmJiosLEyPPvqoHnnkEYWHh6tfv36aM2dOVdcIAABQJp9+mt2oUSNNmDBBo0eP9mp/+eWX9eyzz+qnn36qsgLPFT/NBgDAfirz/e3TmZmsrCwlJiaWaE9ISFBWVpYvqwQAAPCJT2Hm5ptv1tKlS0u0/+c//1H//v3PuSgAAICK8ulxBpdddpmeffZZrVq1Sl27dpUkrVu3Tl9//bUee+wxzZ492zPvI488UjWVAgAAlMKne2aaNm1asZU7HNq/f3+li6pK3DMDAID9VPuDJlNSUnwq7EzTpk3TkiVL9P/+3/9TUFCQunXrpueff16XXHKJZx5jjKZMmaK5c+cqMzNTXbp00csvv6zLL7+8SmoAAAD2ZumgeatXr9aoUaO0bt06JScn69SpU0pISFBOTo5nnunTp+uFF17QnDlztHHjRkVHR6t3797Kzs62sHIAAOAvfLrMZIzR+++/r5UrVyojI6PEow6WLFniUzG//PKLIiMjtXr1avXo0UPGGMXGxiopKUnjx4+XJOXl5SkqKkrPP/+8Ro4cWe46ucwEAID9VPtPsx999FENGTJEKSkpCg0Nlcvl8nr5yu12S5IaNmwoqehyVnp6uhISEjzzOJ1O9ezZU2vXri11HXl5ecrKyvJ6AQCAmsune2YWLVqkJUuWqF+/flVWiDFGY8eO1TXXXKM2bdpIktLT0yVJUVFRXvNGRUXp4MGDpa5n2rRpmjJlSpXVBQAA/JtPZ2ZcLpeaNWtWpYWMHj1a27dv1zvvvFNimsPh8HpvjCnRVmzChAlyu92eV2pqapXWCQAA/ItPYWby5MmaMmWKTpw4USVFPPzww1q2bJlWrlypuLg4T3t0dLSk38/QFMvIyChxtqaY0+lUeHi41wsAANRcPoWZW2+9VZmZmYqMjFTbtm3VoUMHr1dFGWM0evRoLVmyRF988UWJ8WuaNm2q6OhoJScne9ry8/O1evVqdevWzZfSAQBADePTPTPDhw/X5s2bNXjwYEVFRZV5yac8o0aN0ttvv63//Oc/CgsL85yBcblcCgoKksPhUFJSkqZOnaqWLVuqZcuWmjp1qoKDg3XnnXf69JkAAKBm8emn2SEhIfrvf/+ra6655tw+vIwQtGDBAg0fPlzS74Pmvfbaa16D5hXfJFwefpoNAID9VOb726cwc+mll+q9995Tu3btfC7yfCHMAABgP9U+zsyMGTM0btw4HThwwJfFAQAAqoxP98wMHjxYx48fV/PmzRUcHKy6det6TT969GiVFAcAAFAen8LMrFmzqrgMAAAA3/gUZoYNG1bVdQAAAPjEpzBzuhMnTujkyZNebdxoCwAAzhefbgDOycnR6NGjFRkZqdDQUDVo0MDrBQAAcL74FGbGjRunL774Qq+88oqcTqfmz5+vKVOmKDY2Vm+++WZV1wgAAFAmny4zffjhh3rzzTfVq1cvjRgxQt27d1eLFi3UuHFjvfXWW7rrrruquk4AAIBS+XRm5ujRo57nKIWHh3t+in3NNddozZo1VVcdAABAOXwKM82aNfMMmNe6dWu99957korO2NSvX7+qagMAACiXT2Hm7rvv1rfffitJmjBhgufemTFjxugvf/lLlRYIAABwNj49m+lMhw4d0qZNm9S8eXO1b9++KuqqMjybCQAA+6m2ZzOtX79en376qVfbm2++qZ49e+qBBx7Qyy+/rLy8vMpXDAAA4KNKhZnJkydr+/btnvc7duzQPffcoxtuuEETJkzQhx9+qGnTplV5kQAAAGWpVJjZtm2brr/+es/7xYsXq0uXLpo3b57GjBmj2bNne24GBgAAOB8qFWYyMzMVFRXleb969WolJiZ63l911VVKTU2tuuoAAADKUakwExUVpZSUFElSfn6+tmzZoq5du3qmZ2dnq27dulVbIQAAwFlUKswkJibq8ccf15dffqkJEyYoODhY3bt390zfvn27mjdvXuVFAgAAlKVSjzN45plnNHDgQPXs2VOhoaF64403FBgY6Jn++uuvKyEhocqLBAAAKItP48y43W6FhoYqICDAq/3o0aMKDQ31CjhWY5wZAADspzLf3z49aNLlcpXa3rBhQ19WBwAA4DOfHmcAAADgLwgzAADA1ggzAADA1ggzAADA1ggzAADA1ggzAADA1ggzAADA1ggzAADA1ggzAADA1ggzAADA1ggzAADA1ggzAADA1ggzAADA1ggzAADA1ggzAADA1ggzAADA1ggzAADA1ggzAADA1ggzAADA1ggzAADA1ggzAADA1ggz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7Fjde++9uuGGG/Tcc8/phx9+KPPzKjPvrbfeqhMnTqhZs2a67777tHTpUp06deqs/SkoKNCzzz6rdu3aKSIiQqGhoVqxYoVXvaXZvHmzVq5cqdDQUM/r0ksvlST98MMPat++va6//nq1bdtWt956q+bNm6fMzMyzrhNA1SDMADirkJAQtWjRQi1atFDnzp31z3/+Uzk5OZo3b54kad26dbrjjjvUt29fffTRR9q6dasmTpyo/Px8zzomT56sXbt26cYbb9QXX3yh1q1ba+nSpaV+XmXmjY+P1969e/Xyyy8rKChIDz30kHr06OF1v86ZZsyYoZkzZ2rcuHH64osvtG3bNvXp08er3tIUFhaqf//+nmBX/Nq3b5969OihgIAAJScn69NPP1Xr1q310ksv6ZJLLlFKSkp5mxjAOSLMAKgUh8OhOnXq6MSJE5Kkr7/+Wo0bN9bEiRPVqVMntWzZ0uusTbFWrVppzJgxWrFihQYOHKgFCxaU+RmVmTcoKEg333yzZs+erVWrVumbb77Rjh07JEmBgYEqKCjwmv/LL7/UgAEDNHjwYLVv317NmjXTvn37vOYpbbkOHTpo165datKkiSfcFb9CQkI82+YPf/iDpkyZoq1btyowMLDMIAag6hBmAJxVXl6e0tPTlZ6erj179ujhhx/WsWPH1L9/f0lSixYtdOjQIS1evFg//PCDZs+e7fUFfuLECY0ePVqrVq3SwYMH9fXXX2vjxo267LLLSnxWZeaVin4J9c9//lM7d+7U/v379a9//UtBQUFq3LixpKJxZtasWaPDhw97fnXUokULJScna+3atdqzZ49Gjhyp9PR0r/U2adJE69ev14EDB/Trr7+qsLBQo0aN0tGjRzVo0CBt2LBB+/fv14oVKzRixAgVFBRo/fr1mjp1qjZt2qRDhw5pyZIl+uWXX8qsHUAVsvqmHQD+a9iwYUaS5xUWFmauuuoq8/7773vN95e//MVERESY0NBQc/vtt5uZM2d6burNy8szd9xxh4mPjzeBgYEmNjbWjB492pw4ccIY430DcHnznmnp0qWmS5cuJjw83ISEhJirr77afPbZZ57p33zzjWnXrp1xOp2m+K+7I0eOmAEDBpjQ0FATGRlpnnjiCTN06FAzYMAAz3J79+41V199tQkKCjKSTEpKijHGmO+++87ccsstpn79+iYoKMhceumlJikpyRQWFprdu3ebPn36mIsuusg4nU7TqlUr89JLL1XBXgBQHocx/G4QAADYF5eZAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArf1/hYs84yYwXkgAAAAASUVORK5CYII=", "text/plain": [ "
" ] @@ -473,7 +473,7 @@ "\n", "\n", "\n", - " <div id="circuit-display-vue-container-827efb1f-a27d-49d8-83f1-beb6c80c4a56" class="pytket-circuit-display-container">\n", + " <div id="circuit-display-vue-container-067d69bc-bdde-4810-ac70-5b0fe1129460" class="pytket-circuit-display-container">\n", " <div style="display: none">\n", " <div id="circuit-json-to-display">{"bits": [], "commands": [{"args": [["q", [1]]], "op": {"type": "H"}}, {"args": [["q", [2]], ["q", [3]]], "op": {"params": ["0.3"], "type": "ZZPhase"}}, {"args": [["q", [4]]], "op": {"params": ["0.8"], "type": "Ry"}}, {"args": [["q", [0]], ["q", [1]]], "op": {"type": "CX"}}, {"args": [["q", [3]], ["q", [4]]], "op": {"type": "CZ"}}, {"args": [["q", [1]], ["q", [2]]], "op": {"params": ["0.7"], "type": "XXPhase"}}, {"args": [["q", [1]], ["q", [4]]], "op": {"params": ["0.1", "0.2", "0.4"], "type": "TK2"}}], "created_qubits": [], "discarded_qubits": [], "implicit_permutation": [[["q", [0]], ["q", [0]]], [["q", [1]], ["q", [1]]], [["q", [2]], ["q", [2]]], [["q", [3]], ["q", [3]]], [["q", [4]], ["q", [4]]]], "phase": "0.0", "qubits": [["q", [0]], ["q", [1]], ["q", [2]], ["q", [3]], ["q", [4]]]}</div>\n", " </div>\n", @@ -483,7 +483,7 @@ " ></circuit-display-container>\n", " </div>\n", " <script type="application/javascript">\n", - " const circuitRendererUid = "827efb1f-a27d-49d8-83f1-beb6c80c4a56";\n", + " const circuitRendererUid = "067d69bc-bdde-4810-ac70-5b0fe1129460";\n", " const displayOptions = JSON.parse('{}');\n", "\n", " // Script to initialise the circuit renderer app\n", @@ -601,7 +601,7 @@ "\n", "\n", "\n", - " <div id="circuit-display-vue-container-63c69977-1f18-4780-a1c9-c5ffc874f18e" class="pytket-circuit-display-container">\n", + " <div id="circuit-display-vue-container-87b5c904-f430-4e00-b6c6-601952b6581f" class="pytket-circuit-display-container">\n", " <div style="display: none">\n", " <div id="circuit-json-to-display">{"bits": [], "commands": [{"args": [["node", [1]]], "op": {"params": ["0.8"], "type": "Ry"}}, {"args": [["node", [3]]], "op": {"type": "H"}}, {"args": [["node", [0]], ["node", [1]]], "op": {"type": "SWAP"}}, {"args": [["node", [4]], ["node", [3]]], "op": {"type": "CX"}}, {"args": [["node", [2]], ["node", [1]]], "op": {"params": ["0.3"], "type": "ZZPhase"}}, {"args": [["node", [1]], ["node", [0]]], "op": {"type": "CZ"}}, {"args": [["node", [3]], ["node", [2]]], "op": {"params": ["0.7"], "type": "XXPhase"}}, {"args": [["node", [3]], ["node", [2]]], "op": {"type": "SWAP"}}, {"args": [["node", [2]], ["node", [1]]], "op": {"type": "SWAP"}}, {"args": [["node", [1]], ["node", [0]]], "op": {"params": ["0.1", "0.2", "0.4"], "type": "TK2"}}], "created_qubits": [], "discarded_qubits": [], "implicit_permutation": [[["node", [0]], ["node", [0]]], [["node", [1]], ["node", [1]]], [["node", [2]], ["node", [2]]], [["node", [3]], ["node", [3]]], [["node", [4]], ["node", [4]]]], "phase": "0.0", "qubits": [["node", [0]], ["node", [1]], ["node", [2]], ["node", [3]], ["node", [4]]]}</div>\n", " </div>\n", @@ -611,7 +611,7 @@ " ></circuit-display-container>\n", " </div>\n", " <script type="application/javascript">\n", - " const circuitRendererUid = "63c69977-1f18-4780-a1c9-c5ffc874f18e";\n", + " const circuitRendererUid = "87b5c904-f430-4e00-b6c6-601952b6581f";\n", " const displayOptions = JSON.parse('{}');\n", "\n", " // Script to initialise the circuit renderer app\n", @@ -774,10 +774,10 @@ "output_type": "stream", "text": [ "Time taken by approximate contraction with bound chi:\n", - "4.64 seconds\n", + "1.47 seconds\n", "\n", "Lower bound of the fidelity:\n", - "0.3834\n" + "0.3587\n" ] } ], @@ -811,10 +811,10 @@ "output_type": "stream", "text": [ "Time taken by approximate contraction with fixed truncation fidelity:\n", - "10.03 seconds\n", + "2.62 seconds\n", "\n", "Lower bound of the fidelity:\n", - "0.9367\n" + "0.9334\n" ] } ], @@ -866,8 +866,8 @@ "output_type": "stream", "text": [ "MPSxGate\n", - "\tTime taken: 4.71 seconds\n", - "\tLower bound of the fidelity: 0.3834\n" + "\tTime taken: 1.35 seconds\n", + "\tLower bound of the fidelity: 0.3589\n" ] } ], @@ -892,8 +892,8 @@ "output_type": "stream", "text": [ "MPSxMPO, default parameters\n", - "\tTime taken: 22.58 seconds\n", - "\tLower bound of the fidelity: 0.4275\n" + "\tTime taken: 12.6 seconds\n", + "\tLower bound of the fidelity: 0.3847\n" ] } ], @@ -918,8 +918,8 @@ "output_type": "stream", "text": [ "MPSxMPO, custom parameters\n", - "\tTime taken: 31.27 seconds\n", - "\tLower bound of the fidelity: 0.4603\n" + "\tTime taken: 22.52 seconds\n", + "\tLower bound of the fidelity: 0.3977\n" ] } ], @@ -940,13 +940,1174 @@ "source": [ "**Note**: `MPSxMPO` also admits truncation policy in terms of `truncation_fidelity` instead of `chi`." ] + }, + { + "cell_type": "markdown", + "id": "d1e0091f-e258-472f-aef5-bec2ad215e56", + "metadata": {}, + "source": [ + "# Using the logger" + ] + }, + { + "cell_type": "markdown", + "id": "7607b5bd-f332-4d97-963b-2a163d3fb194", + "metadata": {}, + "source": [ + "You can request a verbose log to be produced during simulation, by assigning the `loglevel` argument when calling `simulate`. Currently, two log levels are supported (other than default, which is silent): \n", + "- `logging.INFO` will print information about progress percent, memory currently occupied by the MPS and current fidelity. Additionally, some high level information of the current stage of the simulation is provided, such as when `MPSxMPO` is applying optimisation sweeps.\n", + "- `logging.DEBUG` provides all of the messages from the loglevel above plus detailed information of the current operation being carried out and the values of important variables.\n", + "\n", + "**Note**: Due to technical issues with the `logging` module and Jupyter notebooks we need to reload the `logging` module. When working with python scripts and command line, just doing `import logging` is enough." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "eb152bf3-a065-47bb-bc3e-2adb49277881", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from importlib import reload # Not needed in Python 2\n", + "import logging\n", + "reload(logging)" + ] + }, + { + "cell_type": "markdown", + "id": "fd8d8c7f-dcd2-40f9-940f-8dc8cfb31fac", + "metadata": {}, + "source": [ + "An example of the use of `logging.INFO` is provided below. " + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "318073fc-2ef4-492e-8c5a-1ba1ba0b7733", + "metadata": { + "collapsed": true, + "jupyter": { + "outputs_hidden": true + }, + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[14:01:12] Simulation (INFO) - Ordering the gates in the circuit to reduce canonicalisation overhead.\n", + "[14:01:12] Simulation (INFO) - Running simulation...\n", + "[14:01:12] Simulation (INFO) - Progress... 0%\n", + "[14:01:12] Simulation (INFO) - Progress... 0%\n", + "[14:01:12] Simulation (INFO) - Progress... 0%\n", + "[14:01:12] Simulation (INFO) - Progress... 0%\n", + "[14:01:12] Simulation (INFO) - Progress... 0%\n", + "[14:01:12] Simulation (INFO) - Progress... 0%\n", + "[14:01:12] Simulation (INFO) - Progress... 1%\n", + "[14:01:12] Simulation (INFO) - Progress... 1%\n", + "[14:01:12] Simulation (INFO) - Progress... 1%\n", + "[14:01:12] Simulation (INFO) - Progress... 1%\n", + "[14:01:12] Simulation (INFO) - Progress... 1%\n", + "[14:01:12] Simulation (INFO) - Progress... 1%\n", + "[14:01:12] Simulation (INFO) - Progress... 2%\n", + "[14:01:12] Simulation (INFO) - Progress... 2%\n", + "[14:01:12] Simulation (INFO) - Progress... 2%\n", + "[14:01:12] Simulation (INFO) - Progress... 2%\n", + "[14:01:12] Simulation (INFO) - Progress... 2%\n", + "[14:01:12] Simulation (INFO) - Progress... 2%\n", + "[14:01:12] Simulation (INFO) - Progress... 3%\n", + "[14:01:12] Simulation (INFO) - Progress... 3%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.00067138671875\n", + "[14:01:12] MPS (INFO) - MPS fidelity=1.0\n", + "[14:01:12] Simulation (INFO) - Progress... 3%\n", + "[14:01:12] Simulation (INFO) - Progress... 3%\n", + "[14:01:12] Simulation (INFO) - Progress... 3%\n", + "[14:01:12] Simulation (INFO) - Progress... 3%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.00067138671875\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9990283071344602\n", + "[14:01:12] Simulation (INFO) - Progress... 4%\n", + "[14:01:12] Simulation (INFO) - Progress... 4%\n", + "[14:01:12] Simulation (INFO) - Progress... 4%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.000762939453125\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9990283071344604\n", + "[14:01:12] Simulation (INFO) - Progress... 4%\n", + "[14:01:12] Simulation (INFO) - Progress... 4%\n", + "[14:01:12] Simulation (INFO) - Progress... 4%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.000762939453125\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9990283071344602\n", + "[14:01:12] Simulation (INFO) - Progress... 5%\n", + "[14:01:12] Simulation (INFO) - Progress... 5%\n", + "[14:01:12] Simulation (INFO) - Progress... 5%\n", + "[14:01:12] Simulation (INFO) - Progress... 5%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.000823974609375\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9990283071344602\n", + "[14:01:12] Simulation (INFO) - Progress... 5%\n", + "[14:01:12] Simulation (INFO) - Progress... 5%\n", + "[14:01:12] Simulation (INFO) - Progress... 6%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.00091552734375\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9990283071344602\n", + "[14:01:12] Simulation (INFO) - Progress... 6%\n", + "[14:01:12] Simulation (INFO) - Progress... 6%\n", + "[14:01:12] Simulation (INFO) - Progress... 6%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.00103759765625\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9990283071344602\n", + "[14:01:12] Simulation (INFO) - Progress... 6%\n", + "[14:01:12] Simulation (INFO) - Progress... 6%\n", + "[14:01:12] Simulation (INFO) - Progress... 7%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.00128173828125\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9990283071344602\n", + "[14:01:12] Simulation (INFO) - Progress... 7%\n", + "[14:01:12] Simulation (INFO) - Progress... 7%\n", + "[14:01:12] Simulation (INFO) - Progress... 7%\n", + "[14:01:12] MPS (INFO) - Applying variational optimisation.\n", + "[14:01:12] MPS (INFO) - Fidelity before optimisation=0.9990283071344602\n", + "[14:01:12] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:12] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9997023479978765\n", + "[14:01:12] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:12] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9997024059075587\n", + "[14:01:12] MPS (INFO) - Final fidelity after optimisation=0.9997024059075587\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.00128173828125\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9997024059075589\n", + "[14:01:12] Simulation (INFO) - Progress... 7%\n", + "[14:01:12] Simulation (INFO) - Progress... 7%\n", + "[14:01:12] Simulation (INFO) - Progress... 8%\n", + "[14:01:12] Simulation (INFO) - Progress... 8%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.0013427734375\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9997024059075589\n", + "[14:01:12] Simulation (INFO) - Progress... 8%\n", + "[14:01:12] Simulation (INFO) - Progress... 8%\n", + "[14:01:12] Simulation (INFO) - Progress... 8%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.00146484375\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9997024059075589\n", + "[14:01:12] Simulation (INFO) - Progress... 8%\n", + "[14:01:12] Simulation (INFO) - Progress... 9%\n", + "[14:01:12] Simulation (INFO) - Progress... 9%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.001708984375\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9997024059075589\n", + "[14:01:12] Simulation (INFO) - Progress... 9%\n", + "[14:01:12] Simulation (INFO) - Progress... 9%\n", + "[14:01:12] Simulation (INFO) - Progress... 9%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.0020751953125\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9997024059075589\n", + "[14:01:12] Simulation (INFO) - Progress... 10%\n", + "[14:01:12] Simulation (INFO) - Progress... 10%\n", + "[14:01:12] Simulation (INFO) - Progress... 10%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.0025634765625\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9997024059075589\n", + "[14:01:12] Simulation (INFO) - Progress... 10%\n", + "[14:01:12] Simulation (INFO) - Progress... 10%\n", + "[14:01:12] Simulation (INFO) - Progress... 10%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.0025634765625\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9997024059075589\n", + "[14:01:12] Simulation (INFO) - Progress... 11%\n", + "[14:01:12] Simulation (INFO) - Progress... 11%\n", + "[14:01:12] Simulation (INFO) - Progress... 11%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.0025634765625\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9997024059075589\n", + "[14:01:12] Simulation (INFO) - Progress... 11%\n", + "[14:01:12] Simulation (INFO) - Progress... 11%\n", + "[14:01:12] Simulation (INFO) - Progress... 11%\n", + "[14:01:12] Simulation (INFO) - Progress... 12%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.00262451171875\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9997024059075589\n", + "[14:01:12] Simulation (INFO) - Progress... 12%\n", + "[14:01:12] Simulation (INFO) - Progress... 12%\n", + "[14:01:12] Simulation (INFO) - Progress... 12%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.00274658203125\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9997024059075589\n", + "[14:01:12] Simulation (INFO) - Progress... 12%\n", + "[14:01:12] Simulation (INFO) - Progress... 12%\n", + "[14:01:12] Simulation (INFO) - Progress... 13%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.00299072265625\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9997024059075589\n", + "[14:01:12] Simulation (INFO) - Progress... 13%\n", + "[14:01:12] Simulation (INFO) - Progress... 13%\n", + "[14:01:12] Simulation (INFO) - Progress... 13%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.00347900390625\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9997024059075589\n", + "[14:01:12] Simulation (INFO) - Progress... 13%\n", + "[14:01:12] Simulation (INFO) - Progress... 13%\n", + "[14:01:12] Simulation (INFO) - Progress... 14%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.00396728515625\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9993396700769984\n", + "[14:01:12] Simulation (INFO) - Progress... 14%\n", + "[14:01:12] Simulation (INFO) - Progress... 14%\n", + "[14:01:12] Simulation (INFO) - Progress... 14%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.0048828125\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9984418366672726\n", + "[14:01:12] Simulation (INFO) - Progress... 14%\n", + "[14:01:12] Simulation (INFO) - Progress... 14%\n", + "[14:01:12] Simulation (INFO) - Progress... 15%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.005889892578125\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9978683217610371\n", + "[14:01:12] Simulation (INFO) - Progress... 15%\n", + "[14:01:12] Simulation (INFO) - Progress... 15%\n", + "[14:01:12] Simulation (INFO) - Progress... 15%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.005889892578125\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9978683217610371\n", + "[14:01:12] Simulation (INFO) - Progress... 15%\n", + "[14:01:12] Simulation (INFO) - Progress... 15%\n", + "[14:01:12] Simulation (INFO) - Progress... 16%\n", + "[14:01:12] MPS (INFO) - Applying variational optimisation.\n", + "[14:01:12] MPS (INFO) - Fidelity before optimisation=0.9978683217610371\n", + "[14:01:12] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:12] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.99809024854532\n", + "[14:01:12] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:12] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9981132810448355\n", + "[14:01:12] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:12] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9981209535027262\n", + "[14:01:12] MPS (INFO) - Final fidelity after optimisation=0.9981209535027262\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.005889892578125\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9981209535027262\n", + "[14:01:12] Simulation (INFO) - Progress... 16%\n", + "[14:01:12] Simulation (INFO) - Progress... 16%\n", + "[14:01:12] Simulation (INFO) - Progress... 16%\n", + "[14:01:12] Simulation (INFO) - Progress... 16%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.005950927734375\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9981209535027262\n", + "[14:01:12] Simulation (INFO) - Progress... 16%\n", + "[14:01:12] Simulation (INFO) - Progress... 17%\n", + "[14:01:12] Simulation (INFO) - Progress... 17%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.006072998046875\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9981209535027262\n", + "[14:01:12] Simulation (INFO) - Progress... 17%\n", + "[14:01:12] Simulation (INFO) - Progress... 17%\n", + "[14:01:12] Simulation (INFO) - Progress... 17%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.006317138671875\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9981209535027262\n", + "[14:01:12] Simulation (INFO) - Progress... 17%\n", + "[14:01:12] Simulation (INFO) - Progress... 18%\n", + "[14:01:12] Simulation (INFO) - Progress... 18%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.006805419921875\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9981209535027261\n", + "[14:01:12] Simulation (INFO) - Progress... 18%\n", + "[14:01:12] Simulation (INFO) - Progress... 18%\n", + "[14:01:12] Simulation (INFO) - Progress... 18%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.007049560546875\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.997423409781103\n", + "[14:01:12] Simulation (INFO) - Progress... 18%\n", + "[14:01:12] Simulation (INFO) - Progress... 19%\n", + "[14:01:12] Simulation (INFO) - Progress... 19%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.008392333984375\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.997423409781103\n", + "[14:01:12] Simulation (INFO) - Progress... 19%\n", + "[14:01:12] Simulation (INFO) - Progress... 19%\n", + "[14:01:12] Simulation (INFO) - Progress... 19%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.009765625\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9969717765474623\n", + "[14:01:12] Simulation (INFO) - Progress... 20%\n", + "[14:01:12] Simulation (INFO) - Progress... 20%\n", + "[14:01:12] Simulation (INFO) - Progress... 20%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.01123046875\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.996255622087102\n", + "[14:01:12] Simulation (INFO) - Progress... 20%\n", + "[14:01:12] Simulation (INFO) - Progress... 20%\n", + "[14:01:12] Simulation (INFO) - Progress... 20%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.01165771484375\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.996255622087102\n", + "[14:01:12] Simulation (INFO) - Progress... 21%\n", + "[14:01:12] Simulation (INFO) - Progress... 21%\n", + "[14:01:12] Simulation (INFO) - Progress... 21%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.01165771484375\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9962556220871019\n", + "[14:01:12] Simulation (INFO) - Progress... 21%\n", + "[14:01:12] Simulation (INFO) - Progress... 21%\n", + "[14:01:12] Simulation (INFO) - Progress... 21%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.01165771484375\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9962556220871019\n", + "[14:01:12] Simulation (INFO) - Progress... 22%\n", + "[14:01:12] Simulation (INFO) - Progress... 22%\n", + "[14:01:12] Simulation (INFO) - Progress... 22%\n", + "[14:01:12] Simulation (INFO) - Progress... 22%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.01171875\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9962556220871019\n", + "[14:01:12] Simulation (INFO) - Progress... 22%\n", + "[14:01:12] Simulation (INFO) - Progress... 22%\n", + "[14:01:12] Simulation (INFO) - Progress... 23%\n", + "[14:01:12] MPS (INFO) - MPS size (MiB)=0.0118408203125\n", + "[14:01:12] MPS (INFO) - MPS fidelity=0.9962556220871019\n", + "[14:01:12] Simulation (INFO) - Progress... 23%\n", + "[14:01:13] Simulation (INFO) - Progress... 23%\n", + "[14:01:13] Simulation (INFO) - Progress... 23%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.0120849609375\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9962556220871019\n", + "[14:01:13] Simulation (INFO) - Progress... 23%\n", + "[14:01:13] Simulation (INFO) - Progress... 23%\n", + "[14:01:13] Simulation (INFO) - Progress... 24%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.0125732421875\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9962556220871019\n", + "[14:01:13] Simulation (INFO) - Progress... 24%\n", + "[14:01:13] Simulation (INFO) - Progress... 24%\n", + "[14:01:13] Simulation (INFO) - Progress... 24%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.0130615234375\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9955811734143832\n", + "[14:01:13] Simulation (INFO) - Progress... 24%\n", + "[14:01:13] Simulation (INFO) - Progress... 24%\n", + "[14:01:13] Simulation (INFO) - Progress... 25%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.01373291015625\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9954580715406015\n", + "[14:01:13] Simulation (INFO) - Progress... 25%\n", + "[14:01:13] Simulation (INFO) - Progress... 25%\n", + "[14:01:13] Simulation (INFO) - Progress... 25%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.0150146484375\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9954129745430442\n", + "[14:01:13] Simulation (INFO) - Progress... 25%\n", + "[14:01:13] Simulation (INFO) - Progress... 25%\n", + "[14:01:13] Simulation (INFO) - Progress... 26%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.01708984375\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9946104246997917\n", + "[14:01:13] Simulation (INFO) - Progress... 26%\n", + "[14:01:13] Simulation (INFO) - Progress... 26%\n", + "[14:01:13] Simulation (INFO) - Progress... 26%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.0211181640625\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.993986081692407\n", + "[14:01:13] Simulation (INFO) - Progress... 26%\n", + "[14:01:13] Simulation (INFO) - Progress... 26%\n", + "[14:01:13] Simulation (INFO) - Progress... 27%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.02392578125\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9932754206084036\n", + "[14:01:13] Simulation (INFO) - Progress... 27%\n", + "[14:01:13] Simulation (INFO) - Progress... 27%\n", + "[14:01:13] Simulation (INFO) - Progress... 27%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.02392578125\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9932754206084036\n", + "[14:01:13] Simulation (INFO) - Progress... 27%\n", + "[14:01:13] Simulation (INFO) - Progress... 27%\n", + "[14:01:13] Simulation (INFO) - Progress... 28%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.02392578125\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9932754206084036\n", + "[14:01:13] Simulation (INFO) - Progress... 28%\n", + "[14:01:13] Simulation (INFO) - Progress... 28%\n", + "[14:01:13] Simulation (INFO) - Progress... 28%\n", + "[14:01:13] MPS (INFO) - Applying variational optimisation.\n", + "[14:01:13] MPS (INFO) - Fidelity before optimisation=0.9932754206084036\n", + "[14:01:13] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:13] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9948146155456611\n", + "[14:01:13] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:13] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9948360895424706\n", + "[14:01:13] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:13] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9948431533380159\n", + "[14:01:13] MPS (INFO) - Final fidelity after optimisation=0.9948431533380159\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.02392578125\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9948431533380159\n", + "[14:01:13] Simulation (INFO) - Progress... 28%\n", + "[14:01:13] Simulation (INFO) - Progress... 28%\n", + "[14:01:13] Simulation (INFO) - Progress... 29%\n", + "[14:01:13] Simulation (INFO) - Progress... 29%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.02398681640625\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9948431533380159\n", + "[14:01:13] Simulation (INFO) - Progress... 29%\n", + "[14:01:13] Simulation (INFO) - Progress... 29%\n", + "[14:01:13] Simulation (INFO) - Progress... 29%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.02410888671875\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9948431533380157\n", + "[14:01:13] Simulation (INFO) - Progress... 30%\n", + "[14:01:13] Simulation (INFO) - Progress... 30%\n", + "[14:01:13] Simulation (INFO) - Progress... 30%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.02435302734375\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9948431533380157\n", + "[14:01:13] Simulation (INFO) - Progress... 30%\n", + "[14:01:13] Simulation (INFO) - Progress... 30%\n", + "[14:01:13] Simulation (INFO) - Progress... 30%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.02484130859375\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9948431533380157\n", + "[14:01:13] Simulation (INFO) - Progress... 31%\n", + "[14:01:13] Simulation (INFO) - Progress... 31%\n", + "[14:01:13] Simulation (INFO) - Progress... 31%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.02484130859375\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9948396534426794\n", + "[14:01:13] Simulation (INFO) - Progress... 31%\n", + "[14:01:13] Simulation (INFO) - Progress... 31%\n", + "[14:01:13] Simulation (INFO) - Progress... 31%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.0257568359375\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9946407082338863\n", + "[14:01:13] Simulation (INFO) - Progress... 32%\n", + "[14:01:13] Simulation (INFO) - Progress... 32%\n", + "[14:01:13] Simulation (INFO) - Progress... 32%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.026947021484375\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9939915775333915\n", + "[14:01:13] Simulation (INFO) - Progress... 32%\n", + "[14:01:13] Simulation (INFO) - Progress... 32%\n", + "[14:01:13] Simulation (INFO) - Progress... 32%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.02850341796875\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9930726984365036\n", + "[14:01:13] Simulation (INFO) - Progress... 33%\n", + "[14:01:13] Simulation (INFO) - Progress... 33%\n", + "[14:01:13] Simulation (INFO) - Progress... 33%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.029144287109375\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9925894686689639\n", + "[14:01:13] Simulation (INFO) - Progress... 33%\n", + "[14:01:13] Simulation (INFO) - Progress... 33%\n", + "[14:01:13] Simulation (INFO) - Progress... 33%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.030609130859375\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9922594965497078\n", + "[14:01:13] Simulation (INFO) - Progress... 34%\n", + "[14:01:13] Simulation (INFO) - Progress... 34%\n", + "[14:01:13] Simulation (INFO) - Progress... 34%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.036590576171875\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9917746740161947\n", + "[14:01:13] Simulation (INFO) - Progress... 34%\n", + "[14:01:13] Simulation (INFO) - Progress... 34%\n", + "[14:01:13] Simulation (INFO) - Progress... 34%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.038421630859375\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9917746740161949\n", + "[14:01:13] Simulation (INFO) - Progress... 35%\n", + "[14:01:13] Simulation (INFO) - Progress... 35%\n", + "[14:01:13] Simulation (INFO) - Progress... 35%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.038421630859375\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9917746740161948\n", + "[14:01:13] Simulation (INFO) - Progress... 35%\n", + "[14:01:13] Simulation (INFO) - Progress... 35%\n", + "[14:01:13] Simulation (INFO) - Progress... 35%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.038421630859375\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9917746740161948\n", + "[14:01:13] Simulation (INFO) - Progress... 36%\n", + "[14:01:13] Simulation (INFO) - Progress... 36%\n", + "[14:01:13] Simulation (INFO) - Progress... 36%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.038421630859375\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9917746740161948\n", + "[14:01:13] Simulation (INFO) - Progress... 36%\n", + "[14:01:13] Simulation (INFO) - Progress... 36%\n", + "[14:01:13] Simulation (INFO) - Progress... 36%\n", + "[14:01:13] Simulation (INFO) - Progress... 37%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.038482666015625\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9917746740161948\n", + "[14:01:13] Simulation (INFO) - Progress... 37%\n", + "[14:01:13] Simulation (INFO) - Progress... 37%\n", + "[14:01:13] Simulation (INFO) - Progress... 37%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.038604736328125\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9917746740161948\n", + "[14:01:13] Simulation (INFO) - Progress... 37%\n", + "[14:01:13] Simulation (INFO) - Progress... 37%\n", + "[14:01:13] Simulation (INFO) - Progress... 38%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.038848876953125\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9917746740161948\n", + "[14:01:13] Simulation (INFO) - Progress... 38%\n", + "[14:01:13] Simulation (INFO) - Progress... 38%\n", + "[14:01:13] Simulation (INFO) - Progress... 38%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.039337158203125\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9917746740161948\n", + "[14:01:13] Simulation (INFO) - Progress... 38%\n", + "[14:01:13] Simulation (INFO) - Progress... 38%\n", + "[14:01:13] Simulation (INFO) - Progress... 39%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.040069580078125\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9914013449577964\n", + "[14:01:13] Simulation (INFO) - Progress... 39%\n", + "[14:01:13] Simulation (INFO) - Progress... 39%\n", + "[14:01:13] Simulation (INFO) - Progress... 39%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.04107666015625\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9909200464032397\n", + "[14:01:13] Simulation (INFO) - Progress... 39%\n", + "[14:01:13] Simulation (INFO) - Progress... 40%\n", + "[14:01:13] Simulation (INFO) - Progress... 40%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.04278564453125\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9909200464032397\n", + "[14:01:13] Simulation (INFO) - Progress... 40%\n", + "[14:01:13] Simulation (INFO) - Progress... 40%\n", + "[14:01:13] Simulation (INFO) - Progress... 40%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.045379638671875\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9904815074905157\n", + "[14:01:13] Simulation (INFO) - Progress... 40%\n", + "[14:01:13] Simulation (INFO) - Progress... 41%\n", + "[14:01:13] Simulation (INFO) - Progress... 41%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.049224853515625\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9895385170678038\n", + "[14:01:13] Simulation (INFO) - Progress... 41%\n", + "[14:01:13] Simulation (INFO) - Progress... 41%\n", + "[14:01:13] Simulation (INFO) - Progress... 41%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.054351806640625\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9893005128956965\n", + "[14:01:13] Simulation (INFO) - Progress... 41%\n", + "[14:01:13] Simulation (INFO) - Progress... 42%\n", + "[14:01:13] Simulation (INFO) - Progress... 42%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.059844970703125\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.98888820372519\n", + "[14:01:13] Simulation (INFO) - Progress... 42%\n", + "[14:01:13] Simulation (INFO) - Progress... 42%\n", + "[14:01:13] Simulation (INFO) - Progress... 42%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.068878173828125\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9879401995661465\n", + "[14:01:13] Simulation (INFO) - Progress... 42%\n", + "[14:01:13] Simulation (INFO) - Progress... 43%\n", + "[14:01:13] Simulation (INFO) - Progress... 43%\n", + "[14:01:13] MPS (INFO) - MPS size (MiB)=0.075836181640625\n", + "[14:01:13] MPS (INFO) - MPS fidelity=0.9870682591461779\n", + "[14:01:13] Simulation (INFO) - Progress... 43%\n", + "[14:01:13] Simulation (INFO) - Progress... 43%\n", + "[14:01:13] Simulation (INFO) - Progress... 43%\n", + "[14:01:14] MPS (INFO) - MPS size (MiB)=0.075836181640625\n", + "[14:01:14] MPS (INFO) - MPS fidelity=0.9870682591461779\n", + "[14:01:14] Simulation (INFO) - Progress... 43%\n", + "[14:01:14] Simulation (INFO) - Progress... 44%\n", + "[14:01:14] Simulation (INFO) - Progress... 44%\n", + "[14:01:14] MPS (INFO) - MPS size (MiB)=0.075836181640625\n", + "[14:01:14] MPS (INFO) - MPS fidelity=0.9870682591461779\n", + "[14:01:14] Simulation (INFO) - Progress... 44%\n", + "[14:01:14] Simulation (INFO) - Progress... 44%\n", + "[14:01:14] Simulation (INFO) - Progress... 44%\n", + "[14:01:14] MPS (INFO) - MPS size (MiB)=0.075836181640625\n", + "[14:01:14] MPS (INFO) - MPS fidelity=0.9870682591461779\n", + "[14:01:14] Simulation (INFO) - Progress... 44%\n", + "[14:01:14] Simulation (INFO) - Progress... 45%\n", + "[14:01:14] Simulation (INFO) - Progress... 45%\n", + "[14:01:14] MPS (INFO) - Applying variational optimisation.\n", + "[14:01:14] MPS (INFO) - Fidelity before optimisation=0.9870682591461779\n", + "[14:01:14] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:14] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9885243877420532\n", + "[14:01:14] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:14] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9885675777883345\n", + "[14:01:14] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:14] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9885807735732146\n", + "[14:01:14] MPS (INFO) - Final fidelity after optimisation=0.9885807735732146\n", + "[14:01:14] MPS (INFO) - MPS size (MiB)=0.075836181640625\n", + "[14:01:14] MPS (INFO) - MPS fidelity=0.9885807735732146\n", + "[14:01:14] Simulation (INFO) - Progress... 45%\n", + "[14:01:14] Simulation (INFO) - Progress... 45%\n", + "[14:01:14] Simulation (INFO) - Progress... 45%\n", + "[14:01:14] Simulation (INFO) - Progress... 45%\n", + "[14:01:14] MPS (INFO) - MPS size (MiB)=0.075897216796875\n", + "[14:01:14] MPS (INFO) - MPS fidelity=0.9885807735732146\n", + "[14:01:14] Simulation (INFO) - Progress... 46%\n", + "[14:01:14] Simulation (INFO) - Progress... 46%\n", + "[14:01:14] Simulation (INFO) - Progress... 46%\n", + "[14:01:14] Simulation (INFO) - Progress... 46%\n", + "[14:01:14] MPS (INFO) - MPS size (MiB)=0.076019287109375\n", + "[14:01:14] MPS (INFO) - MPS fidelity=0.9885807735732146\n", + "[14:01:14] Simulation (INFO) - Progress... 46%\n", + "[14:01:14] Simulation (INFO) - Progress... 46%\n", + "[14:01:14] Simulation (INFO) - Progress... 47%\n", + "[14:01:14] MPS (INFO) - MPS size (MiB)=0.076019287109375\n", + "[14:01:14] MPS (INFO) - MPS fidelity=0.9885807735732146\n", + "[14:01:14] Simulation (INFO) - Progress... 47%\n", + "[14:01:14] Simulation (INFO) - Progress... 47%\n", + "[14:01:14] Simulation (INFO) - Progress... 47%\n", + "[14:01:14] Simulation (INFO) - Progress... 47%\n", + "[14:01:14] MPS (INFO) - MPS size (MiB)=0.076263427734375\n", + "[14:01:14] MPS (INFO) - MPS fidelity=0.9885807735732146\n", + "[14:01:14] Simulation (INFO) - Progress... 47%\n", + "[14:01:14] Simulation (INFO) - Progress... 48%\n", + "[14:01:14] Simulation (INFO) - Progress... 48%\n", + "[14:01:14] MPS (INFO) - MPS size (MiB)=0.076629638671875\n", + "[14:01:14] MPS (INFO) - MPS fidelity=0.9885807735732145\n", + "[14:01:14] Simulation (INFO) - Progress... 48%\n", + "[14:01:14] Simulation (INFO) - Progress... 48%\n", + "[14:01:14] Simulation (INFO) - Progress... 48%\n", + "[14:01:14] MPS (INFO) - Applying variational optimisation.\n", + "[14:01:14] MPS (INFO) - Fidelity before optimisation=0.9885807735732145\n", + "[14:01:14] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:14] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9885807735732146\n", + "[14:01:14] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:14] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9885807735732127\n", + "[14:01:14] MPS (INFO) - Final fidelity after optimisation=0.9885807735732127\n", + "[14:01:14] MPS (INFO) - MPS size (MiB)=0.076629638671875\n", + "[14:01:14] MPS (INFO) - MPS fidelity=0.9885807735732127\n", + "[14:01:14] Simulation (INFO) - Progress... 48%\n", + "[14:01:14] Simulation (INFO) - Progress... 49%\n", + "[14:01:14] Simulation (INFO) - Progress... 49%\n", + "[14:01:14] Simulation (INFO) - Progress... 49%\n", + "[14:01:14] MPS (INFO) - MPS size (MiB)=0.077117919921875\n", + "[14:01:14] MPS (INFO) - MPS fidelity=0.9885807735732127\n", + "[14:01:14] Simulation (INFO) - Progress... 49%\n", + "[14:01:14] Simulation (INFO) - Progress... 49%\n", + "[14:01:14] Simulation (INFO) - Progress... 50%\n", + "[14:01:14] MPS (INFO) - MPS size (MiB)=0.077117919921875\n", + "[14:01:14] MPS (INFO) - MPS fidelity=0.9885437435962636\n", + "[14:01:14] Simulation (INFO) - Progress... 50%\n", + "[14:01:14] Simulation (INFO) - Progress... 50%\n", + "[14:01:14] Simulation (INFO) - Progress... 50%\n", + "[14:01:14] MPS (INFO) - MPS size (MiB)=0.077850341796875\n", + "[14:01:14] MPS (INFO) - MPS fidelity=0.9876299149488592\n", + "[14:01:14] Simulation (INFO) - Progress... 50%\n", + "[14:01:14] Simulation (INFO) - Progress... 50%\n", + "[14:01:14] Simulation (INFO) - Progress... 51%\n", + "[14:01:14] MPS (INFO) - MPS size (MiB)=0.079193115234375\n", + "[14:01:14] MPS (INFO) - MPS fidelity=0.9876299149488592\n", + "[14:01:14] Simulation (INFO) - Progress... 51%\n", + "[14:01:14] Simulation (INFO) - Progress... 51%\n", + "[14:01:14] Simulation (INFO) - Progress... 51%\n", + "[14:01:14] MPS (INFO) - MPS size (MiB)=0.080902099609375\n", + "[14:01:14] MPS (INFO) - MPS fidelity=0.9876299149488592\n", + "[14:01:14] Simulation (INFO) - Progress... 51%\n", + "[14:01:14] Simulation (INFO) - Progress... 51%\n", + "[14:01:14] Simulation (INFO) - Progress... 52%\n", + "[14:01:14] MPS (INFO) - MPS size (MiB)=0.083343505859375\n", + "[14:01:14] MPS (INFO) - MPS fidelity=0.9872256262985958\n", + "[14:01:14] Simulation (INFO) - Progress... 52%\n", + "[14:01:14] Simulation (INFO) - Progress... 52%\n", + "[14:01:14] Simulation (INFO) - Progress... 52%\n", + "[14:01:14] MPS (INFO) - MPS size (MiB)=0.08380126953125\n", + "[14:01:14] MPS (INFO) - MPS fidelity=0.9867042570373467\n", + "[14:01:14] Simulation (INFO) - Progress... 52%\n", + "[14:01:14] Simulation (INFO) - Progress... 52%\n", + "[14:01:14] Simulation (INFO) - Progress... 53%\n", + "[14:01:14] MPS (INFO) - MPS size (MiB)=0.08624267578125\n", + "[14:01:14] MPS (INFO) - MPS fidelity=0.9860074263824546\n", + "[14:01:14] Simulation (INFO) - Progress... 53%\n", + "[14:01:14] Simulation (INFO) - Progress... 53%\n", + "[14:01:14] Simulation (INFO) - Progress... 53%\n", + "[14:01:14] MPS (INFO) - MPS size (MiB)=0.08868408203125\n", + "[14:01:14] MPS (INFO) - MPS fidelity=0.9857877466399374\n", + "[14:01:14] Simulation (INFO) - Progress... 53%\n", + "[14:01:14] Simulation (INFO) - Progress... 53%\n", + "[14:01:14] Simulation (INFO) - Progress... 54%\n", + "[14:01:15] MPS (INFO) - MPS size (MiB)=0.09307861328125\n", + "[14:01:15] MPS (INFO) - MPS fidelity=0.9853289590697893\n", + "[14:01:15] Simulation (INFO) - Progress... 54%\n", + "[14:01:15] Simulation (INFO) - Progress... 54%\n", + "[14:01:15] Simulation (INFO) - Progress... 54%\n", + "[14:01:15] MPS (INFO) - MPS size (MiB)=0.09674072265625\n", + "[14:01:15] MPS (INFO) - MPS fidelity=0.9847593868171541\n", + "[14:01:15] Simulation (INFO) - Progress... 54%\n", + "[14:01:15] Simulation (INFO) - Progress... 54%\n", + "[14:01:15] Simulation (INFO) - Progress... 55%\n", + "[14:01:15] MPS (INFO) - MPS size (MiB)=0.10498046875\n", + "[14:01:15] MPS (INFO) - MPS fidelity=0.9839376637463282\n", + "[14:01:15] Simulation (INFO) - Progress... 55%\n", + "[14:01:15] Simulation (INFO) - Progress... 55%\n", + "[14:01:15] Simulation (INFO) - Progress... 55%\n", + "[14:01:15] MPS (INFO) - MPS size (MiB)=0.110107421875\n", + "[14:01:15] MPS (INFO) - MPS fidelity=0.983070631353325\n", + "[14:01:15] Simulation (INFO) - Progress... 55%\n", + "[14:01:15] Simulation (INFO) - Progress... 55%\n", + "[14:01:15] Simulation (INFO) - Progress... 56%\n", + "[14:01:15] MPS (INFO) - MPS size (MiB)=0.12353515625\n", + "[14:01:15] MPS (INFO) - MPS fidelity=0.9820965437215268\n", + "[14:01:15] Simulation (INFO) - Progress... 56%\n", + "[14:01:15] Simulation (INFO) - Progress... 56%\n", + "[14:01:15] Simulation (INFO) - Progress... 56%\n", + "[14:01:15] MPS (INFO) - MPS size (MiB)=0.13287353515625\n", + "[14:01:15] MPS (INFO) - MPS fidelity=0.9813700217282061\n", + "[14:01:15] Simulation (INFO) - Progress... 56%\n", + "[14:01:15] Simulation (INFO) - Progress... 56%\n", + "[14:01:15] Simulation (INFO) - Progress... 57%\n", + "[14:01:15] MPS (INFO) - MPS size (MiB)=0.15484619140625\n", + "[14:01:15] MPS (INFO) - MPS fidelity=0.9806263554164852\n", + "[14:01:15] Simulation (INFO) - Progress... 57%\n", + "[14:01:15] Simulation (INFO) - Progress... 57%\n", + "[14:01:15] Simulation (INFO) - Progress... 57%\n", + "[14:01:15] MPS (INFO) - MPS size (MiB)=0.16436767578125\n", + "[14:01:15] MPS (INFO) - MPS fidelity=0.9796957281177572\n", + "[14:01:15] Simulation (INFO) - Progress... 57%\n", + "[14:01:15] Simulation (INFO) - Progress... 57%\n", + "[14:01:15] Simulation (INFO) - Progress... 58%\n", + "[14:01:15] MPS (INFO) - MPS size (MiB)=0.190460205078125\n", + "[14:01:15] MPS (INFO) - MPS fidelity=0.9787753802493907\n", + "[14:01:15] Simulation (INFO) - Progress... 58%\n", + "[14:01:15] Simulation (INFO) - Progress... 58%\n", + "[14:01:15] Simulation (INFO) - Progress... 58%\n", + "[14:01:15] MPS (INFO) - MPS size (MiB)=0.204498291015625\n", + "[14:01:15] MPS (INFO) - MPS fidelity=0.9779191475648064\n", + "[14:01:15] Simulation (INFO) - Progress... 58%\n", + "[14:01:15] Simulation (INFO) - Progress... 58%\n", + "[14:01:15] Simulation (INFO) - Progress... 59%\n", + "[14:01:15] MPS (INFO) - MPS size (MiB)=0.227935791015625\n", + "[14:01:15] MPS (INFO) - MPS fidelity=0.9770858154529012\n", + "[14:01:15] Simulation (INFO) - Progress... 59%\n", + "[14:01:15] Simulation (INFO) - Progress... 59%\n", + "[14:01:15] Simulation (INFO) - Progress... 59%\n", + "[14:01:15] MPS (INFO) - MPS size (MiB)=0.250579833984375\n", + "[14:01:15] MPS (INFO) - MPS fidelity=0.9763732931498061\n", + "[14:01:15] Simulation (INFO) - Progress... 59%\n", + "[14:01:15] Simulation (INFO) - Progress... 60%\n", + "[14:01:15] Simulation (INFO) - Progress... 60%\n", + "[14:01:15] MPS (INFO) - MPS size (MiB)=0.298919677734375\n", + "[14:01:15] MPS (INFO) - MPS fidelity=0.975569858851943\n", + "[14:01:15] Simulation (INFO) - Progress... 60%\n", + "[14:01:15] Simulation (INFO) - Progress... 60%\n", + "[14:01:15] Simulation (INFO) - Progress... 60%\n", + "[14:01:15] MPS (INFO) - MPS size (MiB)=0.302093505859375\n", + "[14:01:15] MPS (INFO) - MPS fidelity=0.97482766334186\n", + "[14:01:15] Simulation (INFO) - Progress... 60%\n", + "[14:01:15] Simulation (INFO) - Progress... 61%\n", + "[14:01:15] Simulation (INFO) - Progress... 61%\n", + "[14:01:15] MPS (INFO) - MPS size (MiB)=0.334991455078125\n", + "[14:01:15] MPS (INFO) - MPS fidelity=0.9740459735892828\n", + "[14:01:15] Simulation (INFO) - Progress... 61%\n", + "[14:01:15] Simulation (INFO) - Progress... 61%\n", + "[14:01:15] Simulation (INFO) - Progress... 61%\n", + "[14:01:15] MPS (INFO) - MPS size (MiB)=0.334991455078125\n", + "[14:01:15] MPS (INFO) - MPS fidelity=0.9740459735892828\n", + "[14:01:15] Simulation (INFO) - Progress... 61%\n", + "[14:01:15] Simulation (INFO) - Progress... 62%\n", + "[14:01:15] Simulation (INFO) - Progress... 62%\n", + "[14:01:15] MPS (INFO) - MPS size (MiB)=0.339019775390625\n", + "[14:01:15] MPS (INFO) - MPS fidelity=0.9740459735892828\n", + "[14:01:15] Simulation (INFO) - Progress... 62%\n", + "[14:01:15] Simulation (INFO) - Progress... 62%\n", + "[14:01:15] Simulation (INFO) - Progress... 62%\n", + "[14:01:15] MPS (INFO) - MPS size (MiB)=0.339019775390625\n", + "[14:01:15] MPS (INFO) - MPS fidelity=0.9740459735892828\n", + "[14:01:15] Simulation (INFO) - Progress... 62%\n", + "[14:01:15] Simulation (INFO) - Progress... 63%\n", + "[14:01:15] Simulation (INFO) - Progress... 63%\n", + "[14:01:15] MPS (INFO) - MPS size (MiB)=0.339019775390625\n", + "[14:01:15] MPS (INFO) - MPS fidelity=0.9740459735892828\n", + "[14:01:15] Simulation (INFO) - Progress... 63%\n", + "[14:01:15] Simulation (INFO) - Progress... 63%\n", + "[14:01:15] Simulation (INFO) - Progress... 63%\n", + "[14:01:15] MPS (INFO) - MPS size (MiB)=0.339019775390625\n", + "[14:01:15] MPS (INFO) - MPS fidelity=0.9740459735892828\n", + "[14:01:15] Simulation (INFO) - Progress... 63%\n", + "[14:01:15] Simulation (INFO) - Progress... 64%\n", + "[14:01:15] Simulation (INFO) - Progress... 64%\n", + "[14:01:15] MPS (INFO) - MPS size (MiB)=0.339019775390625\n", + "[14:01:15] MPS (INFO) - MPS fidelity=0.9740459735892826\n", + "[14:01:15] Simulation (INFO) - Progress... 64%\n", + "[14:01:15] Simulation (INFO) - Progress... 64%\n", + "[14:01:15] Simulation (INFO) - Progress... 64%\n", + "[14:01:15] MPS (INFO) - MPS size (MiB)=0.339019775390625\n", + "[14:01:15] MPS (INFO) - MPS fidelity=0.9740459735892828\n", + "[14:01:15] Simulation (INFO) - Progress... 64%\n", + "[14:01:15] Simulation (INFO) - Progress... 65%\n", + "[14:01:15] Simulation (INFO) - Progress... 65%\n", + "[14:01:15] MPS (INFO) - MPS size (MiB)=0.339019775390625\n", + "[14:01:15] MPS (INFO) - MPS fidelity=0.9740459735892828\n", + "[14:01:15] Simulation (INFO) - Progress... 65%\n", + "[14:01:15] MPS (INFO) - MPS size (MiB)=0.339019775390625\n", + "[14:01:15] MPS (INFO) - MPS fidelity=0.9740459735892828\n", + "[14:01:15] Simulation (INFO) - Progress... 65%\n", + "[14:01:15] Simulation (INFO) - Progress... 65%\n", + "[14:01:15] Simulation (INFO) - Progress... 65%\n", + "[14:01:15] MPS (INFO) - MPS size (MiB)=0.340118408203125\n", + "[14:01:15] MPS (INFO) - MPS fidelity=0.9735596675843919\n", + "[14:01:15] Simulation (INFO) - Progress... 66%\n", + "[14:01:15] Simulation (INFO) - Progress... 66%\n", + "[14:01:15] Simulation (INFO) - Progress... 66%\n", + "[14:01:15] MPS (INFO) - Applying variational optimisation.\n", + "[14:01:15] MPS (INFO) - Fidelity before optimisation=0.9735596675843919\n", + "[14:01:15] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:15] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9843516935412071\n", + "[14:01:15] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:15] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9848064428508081\n", + "[14:01:15] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:16] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9849304313856563\n", + "[14:01:16] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:16] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9849873035247502\n", + "[14:01:16] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:16] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9850185604266666\n", + "[14:01:16] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:16] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9850377284486574\n", + "[14:01:16] MPS (INFO) - Final fidelity after optimisation=0.9850377284486574\n", + "[14:01:16] MPS (INFO) - MPS size (MiB)=0.3406982421875\n", + "[14:01:16] MPS (INFO) - MPS fidelity=0.9844304521445316\n", + "[14:01:16] Simulation (INFO) - Progress... 66%\n", + "[14:01:16] Simulation (INFO) - Progress... 66%\n", + "[14:01:16] Simulation (INFO) - Progress... 66%\n", + "[14:01:16] MPS (INFO) - MPS size (MiB)=0.341339111328125\n", + "[14:01:16] MPS (INFO) - MPS fidelity=0.9836453925132829\n", + "[14:01:16] Simulation (INFO) - Progress... 67%\n", + "[14:01:16] Simulation (INFO) - Progress... 67%\n", + "[14:01:16] Simulation (INFO) - Progress... 67%\n", + "[14:01:16] MPS (INFO) - MPS size (MiB)=0.344635009765625\n", + "[14:01:16] MPS (INFO) - MPS fidelity=0.9827521125621543\n", + "[14:01:16] Simulation (INFO) - Progress... 67%\n", + "[14:01:16] Simulation (INFO) - Progress... 67%\n", + "[14:01:16] Simulation (INFO) - Progress... 67%\n", + "[14:01:16] MPS (INFO) - MPS size (MiB)=0.352752685546875\n", + "[14:01:16] MPS (INFO) - MPS fidelity=0.9819763508005264\n", + "[14:01:16] Simulation (INFO) - Progress... 68%\n", + "[14:01:16] Simulation (INFO) - Progress... 68%\n", + "[14:01:16] Simulation (INFO) - Progress... 68%\n", + "[14:01:16] MPS (INFO) - MPS size (MiB)=0.366485595703125\n", + "[14:01:16] MPS (INFO) - MPS fidelity=0.9810077310496189\n", + "[14:01:16] Simulation (INFO) - Progress... 68%\n", + "[14:01:16] Simulation (INFO) - Progress... 68%\n", + "[14:01:16] Simulation (INFO) - Progress... 68%\n", + "[14:01:16] MPS (INFO) - MPS size (MiB)=0.394256591796875\n", + "[14:01:16] MPS (INFO) - MPS fidelity=0.9802244249339466\n", + "[14:01:16] Simulation (INFO) - Progress... 69%\n", + "[14:01:16] Simulation (INFO) - Progress... 69%\n", + "[14:01:16] Simulation (INFO) - Progress... 69%\n", + "[14:01:16] MPS (INFO) - MPS size (MiB)=0.4154052734375\n", + "[14:01:16] MPS (INFO) - MPS fidelity=0.9793217534714646\n", + "[14:01:16] Simulation (INFO) - Progress... 69%\n", + "[14:01:16] Simulation (INFO) - Progress... 69%\n", + "[14:01:16] Simulation (INFO) - Progress... 70%\n", + "[14:01:16] MPS (INFO) - MPS size (MiB)=0.4249267578125\n", + "[14:01:16] MPS (INFO) - MPS fidelity=0.9783526934928921\n", + "[14:01:16] Simulation (INFO) - Progress... 70%\n", + "[14:01:16] Simulation (INFO) - Progress... 70%\n", + "[14:01:16] Simulation (INFO) - Progress... 70%\n", + "[14:01:16] MPS (INFO) - MPS size (MiB)=0.4468994140625\n", + "[14:01:16] MPS (INFO) - MPS fidelity=0.9773801381930487\n", + "[14:01:16] Simulation (INFO) - Progress... 70%\n", + "[14:01:16] Simulation (INFO) - Progress... 70%\n", + "[14:01:16] Simulation (INFO) - Progress... 71%\n", + "[14:01:16] MPS (INFO) - MPS size (MiB)=0.49566650390625\n", + "[14:01:16] MPS (INFO) - MPS fidelity=0.9764511340458201\n", + "[14:01:16] Simulation (INFO) - Progress... 71%\n", + "[14:01:16] Simulation (INFO) - Progress... 71%\n", + "[14:01:16] Simulation (INFO) - Progress... 71%\n", + "[14:01:16] MPS (INFO) - MPS size (MiB)=0.51324462890625\n", + "[14:01:16] MPS (INFO) - MPS fidelity=0.9756161361580449\n", + "[14:01:16] Simulation (INFO) - Progress... 71%\n", + "[14:01:16] Simulation (INFO) - Progress... 71%\n", + "[14:01:16] Simulation (INFO) - Progress... 72%\n", + "[14:01:16] MPS (INFO) - MPS size (MiB)=0.51324462890625\n", + "[14:01:16] MPS (INFO) - MPS fidelity=0.9756161361580449\n", + "[14:01:16] Simulation (INFO) - Progress... 72%\n", + "[14:01:16] Simulation (INFO) - Progress... 72%\n", + "[14:01:16] Simulation (INFO) - Progress... 72%\n", + "[14:01:16] MPS (INFO) - MPS size (MiB)=0.51324462890625\n", + "[14:01:16] MPS (INFO) - MPS fidelity=0.9756161361580449\n", + "[14:01:16] Simulation (INFO) - Progress... 72%\n", + "[14:01:16] MPS (INFO) - MPS size (MiB)=0.51324462890625\n", + "[14:01:16] MPS (INFO) - MPS fidelity=0.9756161361580449\n", + "[14:01:16] Simulation (INFO) - Progress... 72%\n", + "[14:01:16] Simulation (INFO) - Progress... 73%\n", + "[14:01:16] Simulation (INFO) - Progress... 73%\n", + "[14:01:16] Simulation (INFO) - Progress... 73%\n", + "[14:01:16] MPS (INFO) - MPS size (MiB)=0.51324462890625\n", + "[14:01:16] MPS (INFO) - MPS fidelity=0.9756161361580449\n", + "[14:01:16] Simulation (INFO) - Progress... 73%\n", + "[14:01:17] Simulation (INFO) - Progress... 73%\n", + "[14:01:17] Simulation (INFO) - Progress... 73%\n", + "[14:01:17] MPS (INFO) - MPS size (MiB)=0.51324462890625\n", + "[14:01:17] MPS (INFO) - MPS fidelity=0.9756161361580449\n", + "[14:01:17] Simulation (INFO) - Progress... 74%\n", + "[14:01:17] Simulation (INFO) - Progress... 74%\n", + "[14:01:17] Simulation (INFO) - Progress... 74%\n", + "[14:01:17] Simulation (INFO) - Progress... 74%\n", + "[14:01:17] MPS (INFO) - MPS size (MiB)=0.513641357421875\n", + "[14:01:17] MPS (INFO) - MPS fidelity=0.9756161361580449\n", + "[14:01:17] Simulation (INFO) - Progress... 74%\n", + "[14:01:17] Simulation (INFO) - Progress... 74%\n", + "[14:01:17] Simulation (INFO) - Progress... 75%\n", + "[14:01:17] MPS (INFO) - MPS size (MiB)=0.513641357421875\n", + "[14:01:17] MPS (INFO) - MPS fidelity=0.9756161361580449\n", + "[14:01:17] Simulation (INFO) - Progress... 75%\n", + "[14:01:17] Simulation (INFO) - Progress... 75%\n", + "[14:01:17] Simulation (INFO) - Progress... 75%\n", + "[14:01:17] MPS (INFO) - MPS size (MiB)=0.51556396484375\n", + "[14:01:17] MPS (INFO) - MPS fidelity=0.9748529131568249\n", + "[14:01:17] Simulation (INFO) - Progress... 75%\n", + "[14:01:17] Simulation (INFO) - Progress... 75%\n", + "[14:01:17] Simulation (INFO) - Progress... 76%\n", + "[14:01:17] MPS (INFO) - MPS size (MiB)=0.51556396484375\n", + "[14:01:17] MPS (INFO) - MPS fidelity=0.9748529131568249\n", + "[14:01:17] Simulation (INFO) - Progress... 76%\n", + "[14:01:17] Simulation (INFO) - Progress... 76%\n", + "[14:01:17] Simulation (INFO) - Progress... 76%\n", + "[14:01:17] MPS (INFO) - MPS size (MiB)=0.51983642578125\n", + "[14:01:17] MPS (INFO) - MPS fidelity=0.9742120807068472\n", + "[14:01:17] Simulation (INFO) - Progress... 76%\n", + "[14:01:17] Simulation (INFO) - Progress... 76%\n", + "[14:01:17] Simulation (INFO) - Progress... 77%\n", + "[14:01:17] MPS (INFO) - Applying variational optimisation.\n", + "[14:01:17] MPS (INFO) - Fidelity before optimisation=0.9742120807068472\n", + "[14:01:17] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:17] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.975134847725609\n", + "[14:01:17] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:17] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9751851737337295\n", + "[14:01:17] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:17] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9752028508364771\n", + "[14:01:17] MPS (INFO) - Final fidelity after optimisation=0.9752028508364771\n", + "[14:01:17] MPS (INFO) - MPS size (MiB)=0.522216796875\n", + "[14:01:17] MPS (INFO) - MPS fidelity=0.9747413039963226\n", + "[14:01:17] Simulation (INFO) - Progress... 77%\n", + "[14:01:17] Simulation (INFO) - Progress... 77%\n", + "[14:01:17] Simulation (INFO) - Progress... 77%\n", + "[14:01:17] MPS (INFO) - MPS size (MiB)=0.530548095703125\n", + "[14:01:17] MPS (INFO) - MPS fidelity=0.9737709267327275\n", + "[14:01:17] Simulation (INFO) - Progress... 77%\n", + "[14:01:17] Simulation (INFO) - Progress... 77%\n", + "[14:01:17] Simulation (INFO) - Progress... 78%\n", + "[14:01:17] MPS (INFO) - MPS size (MiB)=0.542144775390625\n", + "[14:01:17] MPS (INFO) - MPS fidelity=0.9730980087583336\n", + "[14:01:17] Simulation (INFO) - Progress... 78%\n", + "[14:01:17] Simulation (INFO) - Progress... 78%\n", + "[14:01:17] Simulation (INFO) - Progress... 78%\n", + "[14:01:17] MPS (INFO) - MPS size (MiB)=0.555572509765625\n", + "[14:01:17] MPS (INFO) - MPS fidelity=0.972274693739747\n", + "[14:01:17] Simulation (INFO) - Progress... 78%\n", + "[14:01:17] Simulation (INFO) - Progress... 78%\n", + "[14:01:17] Simulation (INFO) - Progress... 79%\n", + "[14:01:17] MPS (INFO) - MPS size (MiB)=0.58514404296875\n", + "[14:01:17] MPS (INFO) - MPS fidelity=0.9714008152517145\n", + "[14:01:17] Simulation (INFO) - Progress... 79%\n", + "[14:01:17] Simulation (INFO) - Progress... 79%\n", + "[14:01:17] Simulation (INFO) - Progress... 79%\n", + "[14:01:17] MPS (INFO) - MPS size (MiB)=0.5892333984375\n", + "[14:01:17] MPS (INFO) - MPS fidelity=0.9705196501761234\n", + "[14:01:17] Simulation (INFO) - Progress... 79%\n", + "[14:01:17] Simulation (INFO) - Progress... 80%\n", + "[14:01:17] Simulation (INFO) - Progress... 80%\n", + "[14:01:17] MPS (INFO) - MPS size (MiB)=0.63214111328125\n", + "[14:01:17] MPS (INFO) - MPS fidelity=0.9697148601428947\n", + "[14:01:17] Simulation (INFO) - Progress... 80%\n", + "[14:01:17] Simulation (INFO) - Progress... 80%\n", + "[14:01:17] Simulation (INFO) - Progress... 80%\n", + "[14:01:17] MPS (INFO) - MPS size (MiB)=0.65301513671875\n", + "[14:01:17] MPS (INFO) - MPS fidelity=0.9688374595301655\n", + "[14:01:17] Simulation (INFO) - Progress... 80%\n", + "[14:01:17] Simulation (INFO) - Progress... 81%\n", + "[14:01:17] Simulation (INFO) - Progress... 81%\n", + "[14:01:17] MPS (INFO) - MPS size (MiB)=0.731292724609375\n", + "[14:01:17] MPS (INFO) - MPS fidelity=0.9679729595082353\n", + "[14:01:17] Simulation (INFO) - Progress... 81%\n", + "[14:01:17] Simulation (INFO) - Progress... 81%\n", + "[14:01:17] Simulation (INFO) - Progress... 81%\n", + "[14:01:17] MPS (INFO) - MPS size (MiB)=0.756011962890625\n", + "[14:01:17] MPS (INFO) - MPS fidelity=0.9670817720186894\n", + "[14:01:17] Simulation (INFO) - Progress... 81%\n", + "[14:01:17] Simulation (INFO) - Progress... 82%\n", + "[14:01:17] Simulation (INFO) - Progress... 82%\n", + "[14:01:17] MPS (INFO) - MPS size (MiB)=0.851715087890625\n", + "[14:01:17] MPS (INFO) - MPS fidelity=0.9662304487130915\n", + "[14:01:17] Simulation (INFO) - Progress... 82%\n", + "[14:01:17] Simulation (INFO) - Progress... 82%\n", + "[14:01:17] Simulation (INFO) - Progress... 82%\n", + "[14:01:17] MPS (INFO) - MPS size (MiB)=0.903900146484375\n", + "[14:01:17] MPS (INFO) - MPS fidelity=0.96530121346801\n", + "[14:01:17] Simulation (INFO) - Progress... 82%\n", + "[14:01:17] Simulation (INFO) - Progress... 83%\n", + "[14:01:17] Simulation (INFO) - Progress... 83%\n", + "[14:01:18] MPS (INFO) - MPS size (MiB)=1.074066162109375\n", + "[14:01:18] MPS (INFO) - MPS fidelity=0.9644645141858508\n", + "[14:01:18] Simulation (INFO) - Progress... 83%\n", + "[14:01:18] Simulation (INFO) - Progress... 83%\n", + "[14:01:18] Simulation (INFO) - Progress... 83%\n", + "[14:01:18] MPS (INFO) - MPS size (MiB)=1.13128662109375\n", + "[14:01:18] MPS (INFO) - MPS fidelity=0.963576178040663\n", + "[14:01:18] Simulation (INFO) - Progress... 83%\n", + "[14:01:18] Simulation (INFO) - Progress... 84%\n", + "[14:01:18] Simulation (INFO) - Progress... 84%\n", + "[14:01:18] MPS (INFO) - MPS size (MiB)=1.375518798828125\n", + "[14:01:18] MPS (INFO) - MPS fidelity=0.9627241232539026\n", + "[14:01:18] Simulation (INFO) - Progress... 84%\n", + "[14:01:18] Simulation (INFO) - Progress... 84%\n", + "[14:01:18] Simulation (INFO) - Progress... 84%\n", + "[14:01:18] MPS (INFO) - MPS size (MiB)=1.4351806640625\n", + "[14:01:18] MPS (INFO) - MPS fidelity=0.9617990818895198\n", + "[14:01:18] Simulation (INFO) - Progress... 84%\n", + "[14:01:18] Simulation (INFO) - Progress... 85%\n", + "[14:01:18] Simulation (INFO) - Progress... 85%\n", + "[14:01:18] MPS (INFO) - MPS size (MiB)=1.738677978515625\n", + "[14:01:18] MPS (INFO) - MPS fidelity=0.9610190784537106\n", + "[14:01:18] Simulation (INFO) - Progress... 85%\n", + "[14:01:18] MPS (INFO) - MPS size (MiB)=1.75592041015625\n", + "[14:01:18] MPS (INFO) - MPS fidelity=0.9602283439877098\n", + "[14:01:18] Simulation (INFO) - Progress... 85%\n", + "[14:01:18] MPS (INFO) - MPS size (MiB)=1.75592041015625\n", + "[14:01:18] MPS (INFO) - MPS fidelity=0.9602283439877098\n", + "[14:01:18] Simulation (INFO) - Progress... 85%\n", + "[14:01:18] Simulation (INFO) - Progress... 85%\n", + "[14:01:18] Simulation (INFO) - Progress... 86%\n", + "[14:01:18] Simulation (INFO) - Progress... 86%\n", + "[14:01:18] MPS (INFO) - MPS size (MiB)=1.75592041015625\n", + "[14:01:18] MPS (INFO) - MPS fidelity=0.9602283439877096\n", + "[14:01:18] Simulation (INFO) - Progress... 86%\n", + "[14:01:18] Simulation (INFO) - Progress... 86%\n", + "[14:01:18] Simulation (INFO) - Progress... 86%\n", + "[14:01:18] MPS (INFO) - MPS size (MiB)=1.75592041015625\n", + "[14:01:18] MPS (INFO) - MPS fidelity=0.9602283439877098\n", + "[14:01:18] Simulation (INFO) - Progress... 86%\n", + "[14:01:18] Simulation (INFO) - Progress... 87%\n", + "[14:01:18] Simulation (INFO) - Progress... 87%\n", + "[14:01:18] Simulation (INFO) - Progress... 87%\n", + "[14:01:18] MPS (INFO) - MPS size (MiB)=1.75592041015625\n", + "[14:01:18] MPS (INFO) - MPS fidelity=0.9602283439877098\n", + "[14:01:18] Simulation (INFO) - Progress... 87%\n", + "[14:01:18] Simulation (INFO) - Progress... 87%\n", + "[14:01:18] Simulation (INFO) - Progress... 87%\n", + "[14:01:18] MPS (INFO) - MPS size (MiB)=1.75592041015625\n", + "[14:01:18] MPS (INFO) - MPS fidelity=0.9602283439877098\n", + "[14:01:18] Simulation (INFO) - Progress... 88%\n", + "[14:01:18] Simulation (INFO) - Progress... 88%\n", + "[14:01:18] Simulation (INFO) - Progress... 88%\n", + "[14:01:18] MPS (INFO) - MPS size (MiB)=1.75701904296875\n", + "[14:01:18] MPS (INFO) - MPS fidelity=0.9602283439877098\n", + "[14:01:18] Simulation (INFO) - Progress... 88%\n", + "[14:01:18] Simulation (INFO) - Progress... 88%\n", + "[14:01:18] Simulation (INFO) - Progress... 88%\n", + "[14:01:18] MPS (INFO) - MPS size (MiB)=1.75701904296875\n", + "[14:01:18] MPS (INFO) - MPS fidelity=0.9602283439877098\n", + "[14:01:18] Simulation (INFO) - Progress... 89%\n", + "[14:01:18] Simulation (INFO) - Progress... 89%\n", + "[14:01:18] Simulation (INFO) - Progress... 89%\n", + "[14:01:18] MPS (INFO) - MPS size (MiB)=1.75872802734375\n", + "[14:01:18] MPS (INFO) - MPS fidelity=0.9596341716247032\n", + "[14:01:18] Simulation (INFO) - Progress... 89%\n", + "[14:01:18] Simulation (INFO) - Progress... 89%\n", + "[14:01:18] Simulation (INFO) - Progress... 90%\n", + "[14:01:18] MPS (INFO) - Applying variational optimisation.\n", + "[14:01:18] MPS (INFO) - Fidelity before optimisation=0.9596341716247032\n", + "[14:01:18] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:18] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9700420977488123\n", + "[14:01:18] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:18] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9703519467112257\n", + "[14:01:18] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:18] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9704374405302711\n", + "[14:01:18] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:19] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9704739545165699\n", + "[14:01:19] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:19] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9704925687713485\n", + "[14:01:19] MPS (INFO) - Final fidelity after optimisation=0.9704925687713485\n", + "[14:01:19] MPS (INFO) - MPS size (MiB)=1.75872802734375\n", + "[14:01:19] MPS (INFO) - MPS fidelity=0.9704925687713485\n", + "[14:01:19] Simulation (INFO) - Progress... 90%\n", + "[14:01:19] Simulation (INFO) - Progress... 90%\n", + "[14:01:19] Simulation (INFO) - Progress... 90%\n", + "[14:01:19] MPS (INFO) - MPS size (MiB)=1.765777587890625\n", + "[14:01:19] MPS (INFO) - MPS fidelity=0.9696216444258031\n", + "[14:01:19] Simulation (INFO) - Progress... 90%\n", + "[14:01:19] Simulation (INFO) - Progress... 90%\n", + "[14:01:19] Simulation (INFO) - Progress... 91%\n", + "[14:01:19] MPS (INFO) - MPS size (MiB)=1.77117919921875\n", + "[14:01:19] MPS (INFO) - MPS fidelity=0.9696216444258033\n", + "[14:01:19] Simulation (INFO) - Progress... 91%\n", + "[14:01:19] Simulation (INFO) - Progress... 91%\n", + "[14:01:19] Simulation (INFO) - Progress... 91%\n", + "[14:01:19] MPS (INFO) - MPS size (MiB)=1.79656982421875\n", + "[14:01:19] MPS (INFO) - MPS fidelity=0.9687315620521755\n", + "[14:01:19] Simulation (INFO) - Progress... 91%\n", + "[14:01:19] Simulation (INFO) - Progress... 91%\n", + "[14:01:19] Simulation (INFO) - Progress... 92%\n", + "[14:01:19] MPS (INFO) - MPS size (MiB)=1.84222412109375\n", + "[14:01:19] MPS (INFO) - MPS fidelity=0.9679596222596152\n", + "[14:01:19] Simulation (INFO) - Progress... 92%\n", + "[14:01:19] Simulation (INFO) - Progress... 92%\n", + "[14:01:19] Simulation (INFO) - Progress... 92%\n", + "[14:01:19] MPS (INFO) - MPS size (MiB)=1.870208740234375\n", + "[14:01:19] MPS (INFO) - MPS fidelity=0.9670763677407406\n", + "[14:01:19] Simulation (INFO) - Progress... 92%\n", + "[14:01:19] Simulation (INFO) - Progress... 92%\n", + "[14:01:19] Simulation (INFO) - Progress... 93%\n", + "[14:01:19] MPS (INFO) - MPS size (MiB)=1.940521240234375\n", + "[14:01:19] MPS (INFO) - MPS fidelity=0.9661194670712572\n", + "[14:01:19] Simulation (INFO) - Progress... 93%\n", + "[14:01:19] Simulation (INFO) - Progress... 93%\n", + "[14:01:19] Simulation (INFO) - Progress... 93%\n", + "[14:01:19] MPS (INFO) - MPS size (MiB)=1.999114990234375\n", + "[14:01:19] MPS (INFO) - MPS fidelity=0.9652231632846195\n", + "[14:01:19] Simulation (INFO) - Progress... 93%\n", + "[14:01:19] Simulation (INFO) - Progress... 93%\n", + "[14:01:19] Simulation (INFO) - Progress... 94%\n", + "[14:01:19] MPS (INFO) - MPS size (MiB)=2.234954833984375\n", + "[14:01:19] MPS (INFO) - MPS fidelity=0.9642981707017143\n", + "[14:01:19] Simulation (INFO) - Progress... 94%\n", + "[14:01:19] MPS (INFO) - MPS size (MiB)=2.35150146484375\n", + "[14:01:19] MPS (INFO) - MPS fidelity=0.9633776196448067\n", + "[14:01:19] Simulation (INFO) - Progress... 94%\n", + "[14:01:19] MPS (INFO) - MPS size (MiB)=2.35150146484375\n", + "[14:01:19] MPS (INFO) - MPS fidelity=0.9633776196448067\n", + "[14:01:19] Simulation (INFO) - Progress... 94%\n", + "[14:01:19] Simulation (INFO) - Progress... 94%\n", + "[14:01:19] Simulation (INFO) - Progress... 94%\n", + "[14:01:19] Simulation (INFO) - Progress... 95%\n", + "[14:01:19] MPS (INFO) - MPS size (MiB)=2.35150146484375\n", + "[14:01:19] MPS (INFO) - MPS fidelity=0.9633776196448067\n", + "[14:01:19] Simulation (INFO) - Progress... 95%\n", + "[14:01:19] Simulation (INFO) - Progress... 95%\n", + "[14:01:19] Simulation (INFO) - Progress... 95%\n", + "[14:01:19] MPS (INFO) - MPS size (MiB)=2.35150146484375\n", + "[14:01:19] MPS (INFO) - MPS fidelity=0.9633776196448067\n", + "[14:01:19] Simulation (INFO) - Progress... 95%\n", + "[14:01:19] Simulation (INFO) - Progress... 95%\n", + "[14:01:19] Simulation (INFO) - Progress... 96%\n", + "[14:01:19] Simulation (INFO) - Progress... 96%\n", + "[14:01:19] MPS (INFO) - MPS size (MiB)=2.35150146484375\n", + "[14:01:19] MPS (INFO) - MPS fidelity=0.9633776196448067\n", + "[14:01:19] Simulation (INFO) - Progress... 96%\n", + "[14:01:19] Simulation (INFO) - Progress... 96%\n", + "[14:01:19] Simulation (INFO) - Progress... 96%\n", + "[14:01:19] MPS (INFO) - MPS size (MiB)=2.35150146484375\n", + "[14:01:19] MPS (INFO) - MPS fidelity=0.9633776196448067\n", + "[14:01:19] Simulation (INFO) - Progress... 96%\n", + "[14:01:19] Simulation (INFO) - Progress... 97%\n", + "[14:01:19] Simulation (INFO) - Progress... 97%\n", + "[14:01:19] MPS (INFO) - Applying variational optimisation.\n", + "[14:01:19] MPS (INFO) - Fidelity before optimisation=0.9633776196448067\n", + "[14:01:19] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:20] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.967414171617126\n", + "[14:01:20] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:20] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.967533278009993\n", + "[14:01:20] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:20] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9675675092087742\n", + "[14:01:20] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:20] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9675846146681976\n", + "[14:01:20] MPS (INFO) - Final fidelity after optimisation=0.9675846146681976\n", + "[14:01:20] MPS (INFO) - MPS size (MiB)=2.35150146484375\n", + "[14:01:20] MPS (INFO) - MPS fidelity=0.9675846146681976\n", + "[14:01:20] Simulation (INFO) - Progress... 97%\n", + "[14:01:20] Simulation (INFO) - Progress... 97%\n", + "[14:01:20] Simulation (INFO) - Progress... 97%\n", + "[14:01:20] MPS (INFO) - MPS size (MiB)=2.35150146484375\n", + "[14:01:20] MPS (INFO) - MPS fidelity=0.9675846146681976\n", + "[14:01:20] Simulation (INFO) - Progress... 97%\n", + "[14:01:20] Simulation (INFO) - Progress... 98%\n", + "[14:01:20] Simulation (INFO) - Progress... 98%\n", + "[14:01:20] MPS (INFO) - MPS size (MiB)=2.35150146484375\n", + "[14:01:20] MPS (INFO) - MPS fidelity=0.9675846146681976\n", + "[14:01:20] Simulation (INFO) - Progress... 98%\n", + "[14:01:20] Simulation (INFO) - Progress... 98%\n", + "[14:01:20] Simulation (INFO) - Progress... 98%\n", + "[14:01:20] MPS (INFO) - MPS size (MiB)=2.34918212890625\n", + "[14:01:20] MPS (INFO) - MPS fidelity=0.9667630952362768\n", + "[14:01:20] Simulation (INFO) - Progress... 98%\n", + "[14:01:20] Simulation (INFO) - Progress... 99%\n", + "[14:01:20] Simulation (INFO) - Progress... 99%\n", + "[14:01:20] MPS (INFO) - MPS size (MiB)=2.34918212890625\n", + "[14:01:20] MPS (INFO) - MPS fidelity=0.9667630952362768\n", + "[14:01:20] Simulation (INFO) - Progress... 99%\n", + "[14:01:20] MPS (INFO) - MPS size (MiB)=2.3427734375\n", + "[14:01:20] MPS (INFO) - MPS fidelity=0.9659837340863052\n", + "[14:01:20] Simulation (INFO) - Progress... 99%\n", + "[14:01:20] MPS (INFO) - MPS size (MiB)=2.3427734375\n", + "[14:01:20] MPS (INFO) - MPS fidelity=0.9659837340863054\n", + "[14:01:20] Simulation (INFO) - Progress... 99%\n", + "[14:01:20] MPS (INFO) - Applying variational optimisation.\n", + "[14:01:20] MPS (INFO) - Fidelity before optimisation=0.9659837340863054\n", + "[14:01:20] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:20] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9659853689734507\n", + "[14:01:20] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:20] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9659862268998962\n", + "[14:01:20] MPS (INFO) - Final fidelity after optimisation=0.9659862268998962\n", + "[14:01:20] MPS (INFO) - Applying variational optimisation.\n", + "[14:01:20] MPS (INFO) - Fidelity before optimisation=0.9659862268998962\n", + "[14:01:20] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:21] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.965986226899895\n", + "[14:01:21] MPS (INFO) - Doing another optimisation sweep...\n", + "[14:01:21] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9659862268998954\n", + "[14:01:21] MPS (INFO) - Final fidelity after optimisation=0.9659862268998954\n", + "[14:01:21] Simulation (INFO) - Simulation completed.\n", + "[14:01:21] Simulation (INFO) - Final MPS size=2.3427734375 MiB\n", + "[14:01:21] Simulation (INFO) - Final MPS fidelity=0.9659862268998954\n" + ] + } + ], + "source": [ + "with CuTensorNetHandle() as libhandle:\n", + " simulate(libhandle, circuit, ContractionAlg.MPSxMPO, truncation_fidelity=0.999, loglevel=logging.INFO)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1d4a14fe-2ea2-435b-836a-acf9587faad7", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { "kernelspec": { - "display_name": "py-cuquantum-23.06.0-mypich-py3.9", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": "py-cuquantum-23.06.0-mypich-py3.9" + "name": "python3" }, "language_info": { "codemirror_mode": { From deee46e11e7190e6c2cbee624288a51609568e58 Mon Sep 17 00:00:00 2001 From: PabloAndresCQ Date: Wed, 27 Sep 2023 17:40:16 +0100 Subject: [PATCH 09/16] Now using a ConfigMPS object to provide the simulation settings. --- docs/modules/mps.rst | 3 + pytket/extensions/cutensornet/mps/__init__.py | 1 + pytket/extensions/cutensornet/mps/mps.py | 153 +++++++++++------- pytket/extensions/cutensornet/mps/mps_gate.py | 34 ++-- pytket/extensions/cutensornet/mps/mps_mpo.py | 60 ++----- .../extensions/cutensornet/mps/simulation.py | 24 +-- tests/test_mps.py | 101 +++++++----- 7 files changed, 191 insertions(+), 185 deletions(-) diff --git a/docs/modules/mps.rst b/docs/modules/mps.rst index 138c66b3..d4da1641 100644 --- a/docs/modules/mps.rst +++ b/docs/modules/mps.rst @@ -10,6 +10,9 @@ Simulation .. autoenum:: pytket.extensions.cutensornet.mps.ContractionAlg() :members: +.. autoclass:: pytket.extensions.cutensornet.mps.ConfigMPS() + .. automethod:: __init__ + .. autofunction:: pytket.extensions.cutensornet.mps.simulate diff --git a/pytket/extensions/cutensornet/mps/__init__.py b/pytket/extensions/cutensornet/mps/__init__.py index dd3abfc7..4dbf60b3 100644 --- a/pytket/extensions/cutensornet/mps/__init__.py +++ b/pytket/extensions/cutensornet/mps/__init__.py @@ -20,6 +20,7 @@ from .mps import ( CuTensorNetHandle, DirectionMPS, + ConfigMPS, Handle, Tensor, MPS, diff --git a/pytket/extensions/cutensornet/mps/mps.py b/pytket/extensions/cutensornet/mps/mps.py index 3430b5ed..f36afc62 100644 --- a/pytket/extensions/cutensornet/mps/mps.py +++ b/pytket/extensions/cutensornet/mps/mps.py @@ -82,74 +82,58 @@ def __exit__(self, exc_type: Any, exc_value: Any, exc_tb: Any) -> None: self._is_destroyed = True -class MPS: - """Represents a state as a Matrix Product State. - - Attributes: - chi (int): The maximum allowed dimension of a virtual bond. - truncation_fidelity (float): The target fidelity of SVD truncation. - tensors (list[Tensor]): A list of tensors in the MPS; ``tensors[0]`` is - the leftmost and ``tensors[len(self)-1]`` is the rightmost; ``tensors[i]`` - and ``tensors[i+1]`` are connected in the MPS via a bond. All of the - tensors are rank three, with the dimensions listed in ``.shape`` matching - the left, right and physical bonds, in that order. - canonical_form (dict[int, Optional[DirectionMPS]]): A dictionary mapping - positions to the canonical form direction of the corresponding tensor, - or ``None`` if it the tensor is not canonicalised. - qubit_position (dict[pytket.circuit.Qubit, int]): A dictionary mapping circuit - qubits to the position its tensor is at in the MPS. - fidelity (float): A lower bound of the fidelity, obtained by multiplying - the fidelities after each contraction. The fidelity of a contraction - corresponds to ``||^2`` where ``|psi>`` and ``|phi>`` are the - states before and after truncation (assuming both are normalised). - """ +class ConfigMPS: + """Configuration class for simulation using MPS.""" def __init__( self, - libhandle: CuTensorNetHandle, - qubits: list[Qubit], chi: Optional[int] = None, truncation_fidelity: Optional[float] = None, - float_precision: Optional[Union[np.float32, np.float64]] = None, + k: int = 4, + optim_delta: float = 1e-5, + float_precision: Union[np.float32, np.float64] = np.float64, # type: ignore ): - """Initialise an MPS on the computational state ``|0>``. + """Instantiate a configuration object for MPS simulation. Note: - A ``libhandle`` should be created via a ``with CuTensorNet() as libhandle:`` - statement. The device where the MPS is stored will match the one specified - by the library handle. - Providing both a custom ``chi`` and ``truncation_fidelity`` will raise an exception. Choose one or the other (or neither, for exact simulation). Args: - libhandle: The cuTensorNet library handle that will be used to carry out - tensor operations on the MPS. - qubits: The list of qubits in the circuit to be simulated. chi: The maximum value allowed for the dimension of the virtual bonds. Higher implies better approximation but more - computational resources. If not provided, ``chi`` will be set - to ``2**(len(qubits) // 2)``, which is enough for exact contraction. + computational resources. If not provided, ``chi`` will be unbounded. truncation_fidelity: Every time a two-qubit gate is applied, the virtual bond will be truncated to the minimum dimension that satisfies ``||^2 >= trucantion_fidelity``, where ``|psi>`` and ``|phi>`` are the states before and after truncation (both normalised). If not provided, it will default to its maximum value 1. + k: If using MPSxMPO, the maximum number of layers the MPO is allowed to + have before being contracted. Increasing this might increase fidelity, + but it will also increase resource requirements exponentially. + Ignored if not using MPSxMPO. Default value is 4. + optim_delta: If using MPSxMPO, stopping criteria for the optimisation when + contracting the ``k`` layers of MPO. Stops when the increase of fidelity + between iterations is smaller than ``optim_delta``. + Ignored if not using MPSxMPO. Default value is ``1e-5``. float_precision: The floating point precision used in tensor calculations; choose from ``numpy`` types: ``np.float64`` or ``np.float32``. Complex numbers are represented using two of such ``float`` numbers. Default is ``np.float64``. Raises: - ValueError: If less than two qubits are provided. ValueError: If both ``chi`` and ``truncation_fidelity`` are fixed. ValueError: If the value of ``chi`` is set below 2. ValueError: If the value of ``truncation_fidelity`` is not in [0,1]. """ - if chi is not None and truncation_fidelity is not None: + if ( + chi is not None + and truncation_fidelity is not None + and truncation_fidelity != 1.0 + ): raise ValueError("Cannot fix both chi and truncation_fidelity.") if chi is None: - chi = max(2 ** (len(qubits) // 2), 2) + chi = 2**60 # In practice, this is like having it be unbounded if truncation_fidelity is None: truncation_fidelity = 1 @@ -158,6 +142,9 @@ def __init__( if truncation_fidelity < 0 or truncation_fidelity > 1: raise ValueError("Provide a value of truncation_fidelity in [0,1].") + self.chi = chi + self.truncation_fidelity = truncation_fidelity + if float_precision is None or float_precision == np.float64: # Double precision self._real_t = np.float64 # type: ignore self._complex_t = np.complex128 # type: ignore @@ -172,14 +159,64 @@ def __init__( f"Value of float_precision must be in {allowed_precisions}." ) - self._lib = libhandle + self.k = k + self.optim_delta = 1e-5 + + def copy(self) -> ConfigMPS: + """Standard copy of the contents.""" + return ConfigMPS( + chi=self.chi, + truncation_fidelity=self.truncation_fidelity, + k=self.k, + optim_delta=self.optim_delta, + float_precision=self._real_t, # type: ignore + ) - ####################################### - # Initialise the MPS with a |0> state # - ####################################### - self.chi = chi - self.truncation_fidelity = truncation_fidelity +class MPS: + """Represents a state as a Matrix Product State. + + Attributes: + tensors (list[Tensor]): A list of tensors in the MPS; ``tensors[0]`` is + the leftmost and ``tensors[len(self)-1]`` is the rightmost; ``tensors[i]`` + and ``tensors[i+1]`` are connected in the MPS via a bond. All of the + tensors are rank three, with the dimensions listed in ``.shape`` matching + the left, right and physical bonds, in that order. + canonical_form (dict[int, Optional[DirectionMPS]]): A dictionary mapping + positions to the canonical form direction of the corresponding tensor, + or ``None`` if it the tensor is not canonicalised. + qubit_position (dict[pytket.circuit.Qubit, int]): A dictionary mapping circuit + qubits to the position its tensor is at in the MPS. + fidelity (float): A lower bound of the fidelity, obtained by multiplying + the fidelities after each contraction. The fidelity of a contraction + corresponds to ``||^2`` where ``|psi>`` and ``|phi>`` are the + states before and after truncation (assuming both are normalised). + """ + + def __init__( + self, + libhandle: CuTensorNetHandle, + qubits: list[Qubit], + config: ConfigMPS, + ): + """Initialise an MPS on the computational state ``|0>``. + + Note: + A ``libhandle`` should be created via a ``with CuTensorNet() as libhandle:`` + statement. The device where the MPS is stored will match the one specified + by the library handle. + + Args: + libhandle: The cuTensorNet library handle that will be used to carry out + tensor operations on the MPS. + qubits: The list of qubits in the circuit to be simulated. + config: The object describing the configuration for simulation. + + Raises: + ValueError: If less than two qubits are provided. + """ + self._lib = libhandle + self._cfg = config self.fidelity = 1.0 n_tensors = len(qubits) @@ -197,7 +234,7 @@ def __init__( # Append each of the tensors initialised in state |0> m_shape = (1, 1, 2) # Two virtual bonds (dim=1) and one physical for i in range(n_tensors): - m_tensor = cp.empty(m_shape, dtype=self._complex_t) + m_tensor = cp.empty(m_shape, dtype=self._cfg._complex_t) # Initialise the tensor to ket 0 m_tensor[0][0][0] = 1 m_tensor[0][0][1] = 0 @@ -216,7 +253,7 @@ def is_valid(self) -> bool: self._flush() chi_ok = all( - all(dim <= self.chi for dim in self.get_virtual_dimensions(pos)) + all(dim <= self._cfg.chi for dim in self.get_virtual_dimensions(pos)) for pos in range(len(self)) ) phys_ok = all(self.get_physical_dimension(pos) == 2 for pos in range(len(self))) @@ -494,7 +531,7 @@ def measure(self, qubits: set[Qubit]) -> dict[Qubit, int]: positions = sorted(position_qubit_map.keys()) # Tensor for postselection to |0> - zero_tensor = cp.zeros(2, dtype=self._complex_t) + zero_tensor = cp.zeros(2, dtype=self._cfg._complex_t) zero_tensor[0] = 1 # Measure and postselect each of the positions, one by one @@ -526,7 +563,7 @@ def measure(self, qubits: set[Qubit]) -> dict[Qubit, int]: result[position_qubit_map[pos]] = outcome # Postselect the MPS for this outcome, renormalising at the same time - postselection_tensor = cp.zeros(2, dtype=self._complex_t) + postselection_tensor = cp.zeros(2, dtype=self._cfg._complex_t) postselection_tensor[outcome] = 1 / np.sqrt( abs(outcome - prob) ) # Normalise @@ -571,18 +608,18 @@ def postselect(self, qubit_outcomes: dict[Qubit, int]) -> float: # Apply a postselection for each of the qubits for qubit, outcome in qubit_outcomes.items(): # Create the rank-1 postselection tensor - postselection_tensor = cp.zeros(2, dtype=self._complex_t) + postselection_tensor = cp.zeros(2, dtype=self._cfg._complex_t) postselection_tensor[outcome] = 1 # Apply postselection self._postselect_qubit(qubit, postselection_tensor) # Calculate the squared norm of the postselected state; this is its probability prob = self.vdot(self) - assert np.isclose(prob.imag, 0.0, atol=self._atol) + assert np.isclose(prob.imag, 0.0, atol=self._cfg._atol) prob = prob.real # Renormalise; it suffices to update the first tensor - if len(self) > 0 and not np.isclose(prob, 0.0, atol=self._atol): + if len(self) > 0 and not np.isclose(prob, 0.0, atol=self._cfg._atol): self.tensors[0] = self.tensors[0] / np.sqrt(prob) self.canonical_form[0] = None @@ -660,8 +697,8 @@ def expectation_value(self, pauli_string: QubitPauliString) -> float: pos = mps_copy.qubit_position[qubit] pauli_unitary = Op.create(pauli_optype[pauli]).get_unitary() pauli_tensor = cp.asarray( - pauli_unitary.astype(dtype=self._complex_t, copy=False), - dtype=self._complex_t, + pauli_unitary.astype(dtype=self._cfg._complex_t, copy=False), + dtype=self._cfg._complex_t, ) # Contract the Pauli to the MPS tensor of the corresponding qubit @@ -671,7 +708,7 @@ def expectation_value(self, pauli_string: QubitPauliString) -> float: # Obtain the inner product value = self.vdot(mps_copy) - assert np.isclose(value.imag, 0.0, atol=self._atol) + assert np.isclose(value.imag, 0.0, atol=self._cfg._atol) return value.real @@ -735,10 +772,10 @@ def get_amplitude(self, state: int) -> complex: mps_pos_bitvalue[pos] = bitvalue # Carry out the contraction, starting from a dummy tensor - result_tensor = cp.ones(1, dtype=self._complex_t) # rank-1, dimension 1 + result_tensor = cp.ones(1, dtype=self._cfg._complex_t) # rank-1, dimension 1 for pos in range(len(self)): - postselection_tensor = cp.zeros(2, dtype=self._complex_t) + postselection_tensor = cp.zeros(2, dtype=self._cfg._complex_t) postselection_tensor[mps_pos_bitvalue[pos]] = 1 # Contract postselection with qubit into the result_tensor result_tensor = cq.contract( @@ -822,16 +859,12 @@ def copy(self) -> MPS: self._flush() # Create a dummy object - new_mps = MPS(self._lib, qubits=[]) + new_mps = MPS(self._lib, qubits=[], config=self._cfg.copy()) # Copy all data - new_mps.chi = self.chi - new_mps.truncation_fidelity = self.truncation_fidelity new_mps.fidelity = self.fidelity new_mps.tensors = [t.copy() for t in self.tensors] new_mps.canonical_form = self.canonical_form.copy() new_mps.qubit_position = self.qubit_position.copy() - new_mps._complex_t = self._complex_t - new_mps._real_t = self._real_t return new_mps diff --git a/pytket/extensions/cutensornet/mps/mps_gate.py b/pytket/extensions/cutensornet/mps/mps_gate.py index 3c522afd..d51e75e2 100644 --- a/pytket/extensions/cutensornet/mps/mps_gate.py +++ b/pytket/extensions/cutensornet/mps/mps_gate.py @@ -51,8 +51,8 @@ def _apply_1q_gate(self, position: int, gate: Op) -> MPSxGate: """ # Load the gate's unitary to the GPU memory - gate_unitary = gate.get_unitary().astype(dtype=self._complex_t, copy=False) - gate_tensor = cp.asarray(gate_unitary, dtype=self._complex_t) + gate_unitary = gate.get_unitary().astype(dtype=self._cfg._complex_t, copy=False) + gate_tensor = cp.asarray(gate_unitary, dtype=self._cfg._complex_t) # Glossary of bond IDs # p -> physical bond of the MPS tensor @@ -101,7 +101,7 @@ def _apply_2q_gate(self, positions: tuple[int, int], gate: Op) -> MPSxGate: # Canonicalisation may be required if `new_dim` is larger than `chi` # or if set by `truncation_fidelity` - if new_dim > self.chi or self.truncation_fidelity < 1: + if new_dim > self._cfg.chi or self._cfg.truncation_fidelity < 1: # If truncation required, convert to canonical form before # contracting. Avoids the need to apply gauge transformations # to the larger tensor resulting from the contraction. @@ -115,8 +115,8 @@ def _apply_2q_gate(self, positions: tuple[int, int], gate: Op) -> MPSxGate: ) # Load the gate's unitary to the GPU memory - gate_unitary = gate.get_unitary().astype(dtype=self._complex_t, copy=False) - gate_tensor = cp.asarray(gate_unitary, dtype=self._complex_t) + gate_unitary = gate.get_unitary().astype(dtype=self._cfg._complex_t, copy=False) + gate_tensor = cp.asarray(gate_unitary, dtype=self._cfg._complex_t) # Reshape into a rank-4 tensor gate_tensor = cp.reshape(gate_tensor, (2, 2, 2, 2)) @@ -151,7 +151,7 @@ def _apply_2q_gate(self, positions: tuple[int, int], gate: Op) -> MPSxGate: R = self.tensors[r_pos] r_shape = list(R.shape) - if self.truncation_fidelity < 1: + if self._cfg.truncation_fidelity < 1: # Carry out SVD decomposition first with NO truncation # to figure out where to apply the dimension cutoff. # Then, apply S normalisation and contraction of S and L manually. @@ -163,7 +163,7 @@ def _apply_2q_gate(self, positions: tuple[int, int], gate: Op) -> MPSxGate: # including normalisation and contraction of S with L. options = {"handle": self._lib.handle, "device_id": self._lib.device_id} - svd_method = tensor.SVDMethod(abs_cutoff=self._atol / 1000) + svd_method = tensor.SVDMethod(abs_cutoff=self._cfg._atol / 1000) L, S, R = tensor.decompose( "acLR->asL,scR", T, method=svd_method, options=options ) @@ -182,7 +182,7 @@ def _apply_2q_gate(self, positions: tuple[int, int], gate: Op) -> MPSxGate: new_dim = 0 # Take singular values until we surpass the target fidelity - while self.truncation_fidelity > numer / denom: + while self._cfg.truncation_fidelity > numer / denom: numer += float(S[new_dim] ** 2) new_dim += 1 this_fidelity = numer / denom @@ -193,7 +193,7 @@ def _apply_2q_gate(self, positions: tuple[int, int], gate: Op) -> MPSxGate: # pylint: disable = unexpected-keyword-arg # Disable pylint for next line L = cp.ndarray( l_shape, - dtype=self._complex_t, + dtype=self._cfg._complex_t, memptr=L.data, strides=L.strides, ) @@ -201,18 +201,18 @@ def _apply_2q_gate(self, positions: tuple[int, int], gate: Op) -> MPSxGate: # pylint: disable = unexpected-keyword-arg # Disable pylint for next line R = cp.ndarray( r_shape, - dtype=self._complex_t, + dtype=self._cfg._complex_t, memptr=R.data, strides=R.strides, ) # pylint: disable = unexpected-keyword-arg # Disable pylint for next line - S = cp.ndarray(new_dim, dtype=self._real_t, memptr=S.data) + S = cp.ndarray(new_dim, dtype=self._cfg._real_t, memptr=S.data) # Normalise S *= np.sqrt(1 / this_fidelity) # Contract S into L - S = S.astype(dtype=self._complex_t, copy=False) + S = S.astype(dtype=self._cfg._complex_t, copy=False) # Use some einsum index magic: since the virtual bond "s" appears in the # list of bonds of the output, it is not summed over. # This causes S to act as the intended diagonal matrix. @@ -222,16 +222,16 @@ def _apply_2q_gate(self, positions: tuple[int, int], gate: Op) -> MPSxGate: # to keep track of a lower bound for the fidelity. self.fidelity *= this_fidelity - elif new_dim > self.chi: + elif new_dim > self._cfg.chi: # Apply SVD decomposition and truncate up to a `max_extent` (for the shared - # bond) of `self.chi`. Ask cuTensorNet to contract S directly into the L - # tensor and normalise the singular values so that the sum of its squares + # bond) of `self._cfg.chi`. Ask cuTensorNet to contract S directly into the + # L tensor and normalise the singular values so that the sum of its squares # is equal to one (i.e. the MPS is a normalised state after truncation). options = {"handle": self._lib.handle, "device_id": self._lib.device_id} svd_method = tensor.SVDMethod( - abs_cutoff=self._atol / 1000, - max_extent=self.chi, + abs_cutoff=self._cfg._atol / 1000, + max_extent=self._cfg.chi, partition="U", # Contract S directly into U (named L in our case) normalization="L2", # Sum of squares equal 1 ) diff --git a/pytket/extensions/cutensornet/mps/mps_mpo.py b/pytket/extensions/cutensornet/mps/mps_mpo.py index 42f82462..fd4b2dd6 100644 --- a/pytket/extensions/cutensornet/mps/mps_mpo.py +++ b/pytket/extensions/cutensornet/mps/mps_mpo.py @@ -32,6 +32,7 @@ from .mps import ( CuTensorNetHandle, DirectionMPS, + ConfigMPS, Tensor, MPS, ) @@ -48,11 +49,7 @@ def __init__( self, libhandle: CuTensorNetHandle, qubits: list[Qubit], - chi: Optional[int] = None, - truncation_fidelity: Optional[float] = None, - k: Optional[int] = None, - optim_delta: Optional[float] = None, - float_precision: Optional[Union[np.float32, np.float64]] = None, + config: ConfigMPS, ): """Initialise an MPS on the computational state ``|0>``. @@ -61,35 +58,13 @@ def __init__( statement. The device where the MPS is stored will match the one specified by the library handle. - Providing both a custom ``chi`` and ``truncation_fidelity`` will raise an - exception. Choose one or the other (or neither, for exact simulation). - Args: libhandle: The cuTensorNet library handle that will be used to carry out tensor operations on the MPS. qubits: The list of qubits in the circuit to be simulated. - chi: The maximum value allowed for the dimension of the virtual - bonds. Higher implies better approximation but more - computational resources. If not provided, ``chi`` will be set - to ``2**(len(qubits) // 2)``, which is enough for exact contraction. - truncation_fidelity: Every time a two-qubit gate is applied, the virtual - bond will be truncated to the minimum dimension that satisfies - ``||^2 >= trucantion_fidelity``, where ``|psi>`` and ``|phi>`` - are the states before and after truncation (both normalised). - If not provided, it will default to its maximum value 1. - k: The maximum number of layers the MPO is allowed to have before - being contracted. Increasing this might increase fidelity, but - it will also increase resource requirements exponentially. - Default value is 4. - optim_delta: Stopping criteria for the optimisation when contracting the - ``k`` layers of MPO. Stops when the increase of fidelity between - iterations is smaller than ``optim_delta``. Default value is ``1e-5``. - float_precision: The floating point precision used in tensor calculations; - choose from ``numpy`` types: ``np.float64`` or ``np.float32``. - Complex numbers are represented using two of such - ``float`` numbers. Default is ``np.float64``. + config: The object describing the configuration for simulation. """ - super().__init__(libhandle, qubits, chi, truncation_fidelity, float_precision) + super().__init__(libhandle, qubits, config) # Initialise the MPO data structure. This will keep a list of the gates # batched for application to the MPS; all of them will be applied at @@ -108,18 +83,7 @@ def __init__( # Initialise the MPS that we will use as first approximation of the # variational algorithm. - self._aux_mps = MPSxGate( - libhandle, qubits, chi, truncation_fidelity, float_precision - ) - - if k is None: - self.k = 4 - else: - self.k = k - if optim_delta is None: - self.optim_delta = 1e-5 - else: - self.optim_delta = optim_delta + self._aux_mps = MPSxGate(libhandle, qubits, config) self._mpo_bond_counter = 0 @@ -155,8 +119,8 @@ def _apply_1q_gate(self, position: int, gate: Op) -> MPSxMPO: self._aux_mps._apply_1q_gate(position, gate) # Load the gate's unitary to the GPU memory - gate_unitary = gate.get_unitary().astype(dtype=self._complex_t, copy=False) - gate_tensor = cp.asarray(gate_unitary, dtype=self._complex_t) + gate_unitary = gate.get_unitary().astype(dtype=self._cfg._complex_t, copy=False) + gate_tensor = cp.asarray(gate_unitary, dtype=self._cfg._complex_t) # Glossary of bond IDs # i -> input to the MPO tensor @@ -209,15 +173,15 @@ def _apply_2q_gate(self, positions: tuple[int, int], gate: Op) -> MPSxMPO: r_pos = max(positions) # Check whether the MPO is large enough to flush it - if any(len(self._mpo[pos]) >= self.k for pos in [l_pos, r_pos]): + if any(len(self._mpo[pos]) >= self._cfg.k for pos in [l_pos, r_pos]): self._flush() # Apply the gate to the MPS with eager approximation self._aux_mps._apply_2q_gate(positions, gate) # Load the gate's unitary to the GPU memory - gate_unitary = gate.get_unitary().astype(dtype=self._complex_t, copy=False) - gate_tensor = cp.asarray(gate_unitary, dtype=self._complex_t) + gate_unitary = gate.get_unitary().astype(dtype=self._cfg._complex_t, copy=False) + gate_tensor = cp.asarray(gate_unitary, dtype=self._cfg._complex_t) # Reshape into a rank-4 tensor gate_tensor = cp.reshape(gate_tensor, (2, 2, 2, 2)) @@ -476,7 +440,7 @@ def update_variational_tensor( # Get the fidelity optim_fidelity = complex(cq.contract("LRP,LRP->", F.conj(), F)) - assert np.isclose(optim_fidelity.imag, 0.0, atol=self._atol) + assert np.isclose(optim_fidelity.imag, 0.0, atol=self._cfg._atol) optim_fidelity = float(optim_fidelity.real) # Normalise F and update the variational MPS @@ -498,7 +462,7 @@ def update_variational_tensor( # Repeat sweeps until the fidelity converges sweep_direction = DirectionMPS.RIGHT - while not np.isclose(prev_fidelity, sweep_fidelity, atol=self.optim_delta): + while not np.isclose(prev_fidelity, sweep_fidelity, atol=self._cfg.optim_delta): prev_fidelity = sweep_fidelity if sweep_direction == DirectionMPS.RIGHT: diff --git a/pytket/extensions/cutensornet/mps/simulation.py b/pytket/extensions/cutensornet/mps/simulation.py index e138e78c..b9656c9c 100644 --- a/pytket/extensions/cutensornet/mps/simulation.py +++ b/pytket/extensions/cutensornet/mps/simulation.py @@ -10,7 +10,7 @@ from pytket.passes import DefaultMappingPass from pytket.predicates import CompilationUnit -from .mps import CuTensorNetHandle, MPS +from .mps import CuTensorNetHandle, ConfigMPS, MPS from .mps_gate import MPSxGate from .mps_mpo import MPSxMPO @@ -30,7 +30,7 @@ def simulate( libhandle: CuTensorNetHandle, circuit: Circuit, algorithm: ContractionAlg, - **kwargs: Any + config: ConfigMPS, ) -> MPS: """Simulate the given circuit and return the ``MPS`` representing the final state. @@ -51,33 +51,23 @@ def simulate( tensor operations on the MPS. circuit: The pytket circuit to be simulated. algorithm: Choose between the values of the ``ContractionAlg`` enum. - **kwargs: Any argument accepted by the initialisers of the chosen - ``algorithm`` class can be passed as a keyword argument. See the - documentation of the corresponding class for details. + config: The configuration object for simulation. Returns: An instance of ``MPS`` containing (an approximation of) the final state of the circuit. """ - chi = kwargs.get("chi", None) - truncation_fidelity = kwargs.get("truncation_fidelity", None) - float_precision = kwargs.get("float_precision", None) - if algorithm == ContractionAlg.MPSxGate: mps = MPSxGate( # type: ignore - libhandle, circuit.qubits, chi, truncation_fidelity, float_precision + libhandle, + circuit.qubits, + config, ) elif algorithm == ContractionAlg.MPSxMPO: - k = kwargs.get("k", None) - optim_delta = kwargs.get("optim_delta", None) mps = MPSxMPO( # type: ignore libhandle, circuit.qubits, - chi, - truncation_fidelity, - k, - optim_delta, - float_precision, + config, ) # Sort the gates so there isn't much overhead from canonicalising back and forth. diff --git a/tests/test_mps.py b/tests/test_mps.py index 9e920fa4..ab2c5b0d 100644 --- a/tests/test_mps.py +++ b/tests/test_mps.py @@ -10,6 +10,7 @@ from pytket.pauli import Pauli, QubitPauliString # type: ignore from pytket.extensions.cutensornet.mps import ( CuTensorNetHandle, + ConfigMPS, MPS, MPSxGate, MPSxMPO, @@ -25,8 +26,8 @@ def test_libhandle_manager() -> None: # Proper use of library handle with CuTensorNetHandle() as libhandle: - mps = MPS(libhandle, qubits=circ.qubits) - assert np.isclose(mps.vdot(mps), 1, atol=mps._atol) + mps = MPS(libhandle, circ.qubits, ConfigMPS()) + assert np.isclose(mps.vdot(mps), 1, atol=mps._cfg._atol) # Catch exception due to library handle out of scope with pytest.raises(RuntimeError): @@ -37,9 +38,9 @@ def test_init() -> None: circ = Circuit(5) with CuTensorNetHandle() as libhandle: - mps_gate = MPSxGate(libhandle, qubits=circ.qubits) + mps_gate = MPSxGate(libhandle, circ.qubits, ConfigMPS()) assert mps_gate.is_valid() - mps_mpo = MPSxMPO(libhandle, qubits=circ.qubits) + mps_mpo = MPSxMPO(libhandle, circ.qubits, ConfigMPS()) assert mps_mpo.is_valid() @@ -48,11 +49,11 @@ def test_canonicalise() -> None: circ = Circuit(5) with CuTensorNetHandle() as libhandle: - mps_gate = MPSxGate(libhandle, qubits=circ.qubits) + mps_gate = MPSxGate(libhandle, circ.qubits, ConfigMPS()) # Fill up the tensors with random entries # Leftmost tensor - T_d = cp.empty(shape=(1, 4, 2), dtype=mps_gate._complex_t) + T_d = cp.empty(shape=(1, 4, 2), dtype=mps_gate._cfg._complex_t) for i1 in range(T_d.shape[1]): for i2 in range(T_d.shape[2]): T_d[0][i1][i2] = cp.random.rand() + 1j * cp.random.rand() @@ -60,7 +61,7 @@ def test_canonicalise() -> None: # Middle tensors for pos in range(1, len(mps_gate) - 1): - T_d = cp.empty(shape=(4, 4, 2), dtype=mps_gate._complex_t) + T_d = cp.empty(shape=(4, 4, 2), dtype=mps_gate._cfg._complex_t) for i0 in range(T_d.shape[0]): for i1 in range(T_d.shape[1]): for i2 in range(T_d.shape[2]): @@ -68,7 +69,7 @@ def test_canonicalise() -> None: mps_gate.tensors[pos] = T_d # Rightmost tensor - T_d = cp.empty(shape=(4, 1, 2), dtype=mps_gate._complex_t) + T_d = cp.empty(shape=(4, 1, 2), dtype=mps_gate._cfg._complex_t) for i0 in range(T_d.shape[0]): for i2 in range(T_d.shape[2]): T_d[i0][0][i2] = cp.random.rand() + 1j * cp.random.rand() @@ -88,7 +89,7 @@ def test_canonicalise() -> None: # Check that canonicalisation did not change the vector overlap = mps_gate.vdot(mps_copy) - assert np.isclose(overlap, norm_sq, atol=mps_gate._atol) + assert np.isclose(overlap, norm_sq, atol=mps_gate._cfg._atol) # Check that the corresponding tensors are in orthogonal form for pos in range(len(mps_gate)): @@ -142,23 +143,23 @@ def test_exact_circ_sim(circuit: Circuit, algorithm: ContractionAlg) -> None: state = prep_circ.get_statevector() with CuTensorNetHandle() as libhandle: - mps = simulate(libhandle, prep_circ, algorithm) + mps = simulate(libhandle, prep_circ, algorithm, ConfigMPS()) assert mps.is_valid() # Check that there was no approximation - assert np.isclose(mps.fidelity, 1.0, atol=mps._atol) + assert np.isclose(mps.fidelity, 1.0, atol=mps._cfg._atol) # Check that overlap is 1 - assert np.isclose(mps.vdot(mps), 1.0, atol=mps._atol) + assert np.isclose(mps.vdot(mps), 1.0, atol=mps._cfg._atol) # Check that all of the amplitudes are correct for b in range(2**n_qubits): assert np.isclose( mps.get_amplitude(b), state[b], - atol=mps._atol, + atol=mps._cfg._atol, ) # Check that the statevector is correct - assert np.allclose(mps.get_statevector(), state, atol=mps._atol) + assert np.allclose(mps.get_statevector(), state, atol=mps._cfg._atol) @pytest.mark.parametrize( @@ -194,10 +195,12 @@ def test_exact_circ_sim(circuit: Circuit, algorithm: ContractionAlg) -> None: def test_approx_circ_sim_gate_fid(circuit: Circuit, algorithm: ContractionAlg) -> None: prep_circ, _ = prepare_circuit(circuit) with CuTensorNetHandle() as libhandle: - mps = simulate(libhandle, prep_circ, algorithm, truncation_fidelity=0.99) + mps = simulate( + libhandle, prep_circ, algorithm, ConfigMPS(truncation_fidelity=0.99) + ) assert mps.is_valid() # Check that overlap is 1 - assert np.isclose(mps.vdot(mps), 1.0, atol=mps._atol) + assert np.isclose(mps.vdot(mps), 1.0, atol=mps._cfg._atol) @pytest.mark.parametrize( @@ -233,10 +236,10 @@ def test_approx_circ_sim_gate_fid(circuit: Circuit, algorithm: ContractionAlg) - def test_approx_circ_sim_chi(circuit: Circuit, algorithm: ContractionAlg) -> None: prep_circ, _ = prepare_circuit(circuit) with CuTensorNetHandle() as libhandle: - mps = simulate(libhandle, prep_circ, algorithm, chi=4) + mps = simulate(libhandle, prep_circ, algorithm, ConfigMPS(chi=4)) assert mps.is_valid() # Check that overlap is 1 - assert np.isclose(mps.vdot(mps), 1.0, atol=mps._atol) + assert np.isclose(mps.vdot(mps), 1.0, atol=mps._cfg._atol) @pytest.mark.parametrize( @@ -271,30 +274,34 @@ def test_float_point_options( with CuTensorNetHandle() as libhandle: # Exact - mps = simulate(libhandle, prep_circ, algorithm, float_precision=fp_precision) + mps = simulate( + libhandle, prep_circ, algorithm, ConfigMPS(float_precision=fp_precision) + ) assert mps.is_valid() # Check that overlap is 1 - assert np.isclose(mps.vdot(mps), 1.0, atol=mps._atol) + assert np.isclose(mps.vdot(mps), 1.0, atol=mps._cfg._atol) # Approximate, bound truncation fidelity mps = simulate( libhandle, prep_circ, algorithm, - truncation_fidelity=0.99, - float_precision=fp_precision, + ConfigMPS(truncation_fidelity=0.99, float_precision=fp_precision), ) assert mps.is_valid() # Check that overlap is 1 - assert np.isclose(mps.vdot(mps), 1.0, atol=mps._atol) + assert np.isclose(mps.vdot(mps), 1.0, atol=mps._cfg._atol) # Approximate, bound chi mps = simulate( - libhandle, prep_circ, algorithm, chi=4, float_precision=fp_precision + libhandle, + prep_circ, + algorithm, + ConfigMPS(chi=4, float_precision=fp_precision), ) assert mps.is_valid() # Check that overlap is 1 - assert np.isclose(mps.vdot(mps), 1.0, atol=mps._atol) + assert np.isclose(mps.vdot(mps), 1.0, atol=mps._cfg._atol) @pytest.mark.parametrize( @@ -310,32 +317,40 @@ def test_circ_approx_explicit(circuit: Circuit) -> None: # Finite gate fidelity # Check for MPSxGate mps_gate = simulate( - libhandle, circuit, ContractionAlg.MPSxGate, truncation_fidelity=0.99 + libhandle, + circuit, + ContractionAlg.MPSxGate, + ConfigMPS(truncation_fidelity=0.99), ) assert np.isclose(mps_gate.fidelity, 0.4, atol=1e-1) assert mps_gate.is_valid() - assert np.isclose(mps_gate.vdot(mps_gate), 1.0, atol=mps_gate._atol) + assert np.isclose(mps_gate.vdot(mps_gate), 1.0, atol=mps_gate._cfg._atol) # Check for MPSxMPO mps_mpo = simulate( - libhandle, circuit, ContractionAlg.MPSxMPO, truncation_fidelity=0.99 + libhandle, + circuit, + ContractionAlg.MPSxMPO, + ConfigMPS(truncation_fidelity=0.99), ) assert np.isclose(mps_mpo.fidelity, 0.6, atol=1e-1) assert mps_mpo.is_valid() - assert np.isclose(mps_mpo.vdot(mps_mpo), 1.0, atol=mps_mpo._atol) + assert np.isclose(mps_mpo.vdot(mps_mpo), 1.0, atol=mps_mpo._cfg._atol) # Fixed virtual bond dimension # Check for MPSxGate - mps_gate = simulate(libhandle, circuit, ContractionAlg.MPSxGate, chi=8) + mps_gate = simulate( + libhandle, circuit, ContractionAlg.MPSxGate, ConfigMPS(chi=8) + ) assert np.isclose(mps_gate.fidelity, 0.03, atol=1e-2) assert mps_gate.is_valid() - assert np.isclose(mps_gate.vdot(mps_gate), 1.0, atol=mps_gate._atol) + assert np.isclose(mps_gate.vdot(mps_gate), 1.0, atol=mps_gate._cfg._atol) # Check for MPSxMPO - mps_mpo = simulate(libhandle, circuit, ContractionAlg.MPSxMPO, chi=8) + mps_mpo = simulate(libhandle, circuit, ContractionAlg.MPSxMPO, ConfigMPS(chi=8)) assert np.isclose(mps_mpo.fidelity, 0.04, atol=1e-2) assert mps_mpo.is_valid() - assert np.isclose(mps_mpo.vdot(mps_mpo), 1.0, atol=mps_mpo._atol) + assert np.isclose(mps_mpo.vdot(mps_mpo), 1.0, atol=mps_mpo._cfg._atol) @pytest.mark.parametrize( @@ -370,10 +385,10 @@ def test_postselect_2q_circ(circuit: Circuit, postselect_dict: dict) -> None: sv = sv / np.sqrt(sv_prob) # Normalise with CuTensorNetHandle() as libhandle: - mps = simulate(libhandle, circuit, ContractionAlg.MPSxGate) + mps = simulate(libhandle, circuit, ContractionAlg.MPSxGate, ConfigMPS()) prob = mps.postselect(postselect_dict) - assert np.isclose(prob, sv_prob, atol=mps._atol) - assert np.allclose(mps.get_statevector(), sv, atol=mps._atol) + assert np.isclose(prob, sv_prob, atol=mps._cfg._atol) + assert np.allclose(mps.get_statevector(), sv, atol=mps._cfg._atol) @pytest.mark.parametrize( @@ -400,10 +415,10 @@ def test_postselect_circ(circuit: Circuit, postselect_dict: dict) -> None: sv = sv / np.sqrt(sv_prob) # Normalise with CuTensorNetHandle() as libhandle: - mps = simulate(libhandle, circuit, ContractionAlg.MPSxGate) + mps = simulate(libhandle, circuit, ContractionAlg.MPSxGate, ConfigMPS()) prob = mps.postselect(postselect_dict) - assert np.isclose(prob, sv_prob, atol=mps._atol) - assert np.allclose(mps.get_statevector(), sv, atol=mps._atol) + assert np.isclose(prob, sv_prob, atol=mps._cfg._atol) + assert np.allclose(mps.get_statevector(), sv, atol=mps._cfg._atol) @pytest.mark.parametrize( @@ -445,9 +460,9 @@ def test_expectation_value(circuit: Circuit, observable: QubitPauliString) -> No # Simulate the circuit and obtain the expectation value with CuTensorNetHandle() as libhandle: - mps = simulate(libhandle, circuit, ContractionAlg.MPSxGate) + mps = simulate(libhandle, circuit, ContractionAlg.MPSxGate, ConfigMPS()) assert np.isclose( - mps.expectation_value(observable), expectation_value, atol=mps._atol + mps.expectation_value(observable), expectation_value, atol=mps._cfg._atol ) @@ -475,7 +490,7 @@ def test_sample_circ_2q(circuit: Circuit) -> None: # Compute the samples sample_dict = {0: 0, 1: 0, 2: 0, 3: 0} with CuTensorNetHandle() as libhandle: - mps = simulate(libhandle, circuit, ContractionAlg.MPSxGate) + mps = simulate(libhandle, circuit, ContractionAlg.MPSxGate, ConfigMPS()) # Take samples measuring both qubits at once for _ in range(n_samples): @@ -502,7 +517,7 @@ def test_measure_circ(circuit: Circuit) -> None: qB = circuit.qubits[-3] # Third list significant qubit with CuTensorNetHandle() as libhandle: - mps = simulate(libhandle, circuit, ContractionAlg.MPSxGate) + mps = simulate(libhandle, circuit, ContractionAlg.MPSxGate, ConfigMPS()) # Compute the probabilities of each outcome p = {(0, 0): 0.0, (0, 1): 0.0, (1, 0): 0.0, (1, 1): 0.0} From b8ee2445d82ccd6bdcda85a50946792b03bd3b5a Mon Sep 17 00:00:00 2001 From: PabloAndresCQ Date: Thu, 28 Sep 2023 11:45:31 +0100 Subject: [PATCH 10/16] Added value_of_zero parameter. --- pytket/extensions/cutensornet/mps/mps.py | 8 ++++ pytket/extensions/cutensornet/mps/mps_gate.py | 38 ++++++++++++++----- pytket/extensions/cutensornet/mps/mps_mpo.py | 1 - .../extensions/cutensornet/mps/simulation.py | 2 - 4 files changed, 37 insertions(+), 12 deletions(-) diff --git a/pytket/extensions/cutensornet/mps/mps.py b/pytket/extensions/cutensornet/mps/mps.py index 170b66f4..62ea80c4 100644 --- a/pytket/extensions/cutensornet/mps/mps.py +++ b/pytket/extensions/cutensornet/mps/mps.py @@ -95,6 +95,7 @@ def __init__( k: int = 4, optim_delta: float = 1e-5, float_precision: Union[np.float32, np.float64] = np.float64, # type: ignore + value_of_zero: float = 1e-16, loglevel: int = logging.WARNING, ): """Instantiate a configuration object for MPS simulation. @@ -124,6 +125,12 @@ def __init__( choose from ``numpy`` types: ``np.float64`` or ``np.float32``. Complex numbers are represented using two of such ``float`` numbers. Default is ``np.float64``. + value_of_zero: Any number below this value will be considered equal to zero. + Even when no ``chi`` or ``truncation_fidelity`` is provided, singular + values below this number will be truncated. + We suggest to use a value slightly below what your chosen + ``float_precision`` can reasonably achieve. For instance, ``1e-16`` for + ``np.float64`` precision (default) and ``1e-7`` for ``np.float32``. loglevel: Internal logger output level. Raises: @@ -163,6 +170,7 @@ def __init__( raise TypeError( f"Value of float_precision must be in {allowed_precisions}." ) + self.zero = value_of_zero self.k = k self.optim_delta = 1e-5 diff --git a/pytket/extensions/cutensornet/mps/mps_gate.py b/pytket/extensions/cutensornet/mps/mps_gate.py index dc5a64bf..fcc83c95 100644 --- a/pytket/extensions/cutensornet/mps/mps_gate.py +++ b/pytket/extensions/cutensornet/mps/mps_gate.py @@ -169,7 +169,7 @@ def _apply_2q_gate(self, positions: tuple[int, int], gate: Op) -> MPSxGate: ) options = {"handle": self._lib.handle, "device_id": self._lib.device_id} - svd_method = tensor.SVDMethod(abs_cutoff=self._cfg._atol / 1000) + svd_method = tensor.SVDMethod(abs_cutoff=self._cfg.zero) L, S, R = tensor.decompose( "acLR->asL,scR", T, method=svd_method, options=options ) @@ -244,7 +244,7 @@ def _apply_2q_gate(self, positions: tuple[int, int], gate: Op) -> MPSxGate: options = {"handle": self._lib.handle, "device_id": self._lib.device_id} svd_method = tensor.SVDMethod( - abs_cutoff=self._cfg._atol / 1000, + abs_cutoff=self._cfg.zero, max_extent=self._cfg.chi, partition="U", # Contract S directly into U (named L in our case) normalization="L2", # Sum of squares equal 1 @@ -276,15 +276,35 @@ def _apply_2q_gate(self, positions: tuple[int, int], gate: Op) -> MPSxGate: ) else: - # No truncation is necessary. In this case, simply apply a QR decomposition - # to get back to MPS form. QR is cheaper than SVD. - self._logger.debug("No truncation is necessary, applying QR decomposition.") - + # The user did not explicitly ask for truncation, but it is advantageous to + # remove any singular values below ``self._cfg.zero``. + self._logger.debug(f"Truncating singular values below={self._cfg.zero}.") + if self._cfg.zero > self._cfg._atol / 1000: + self._logger.warning( + "Your chosen value_of_zero is relatively large. " + "Faithfulness of final fidelity estimate is not guaranteed." + ) + + # NOTE: There is no guarantee of canonical form in this case. This is fine + # since canonicalisation is just meant to detect the optimal singular values + # to truncate, but if we find values that are essentially zero, we are safe + # to remove them. options = {"handle": self._lib.handle, "device_id": self._lib.device_id} - L, R = tensor.decompose( - "acLR->asL,scR", T, method=tensor.QRMethod(), options=options + svd_method = tensor.SVDMethod( + abs_cutoff=self._cfg.zero, + partition="U", # Contract S directly into U (named L in our case) + normalization=None, # Without canonicalisation we must not normalise + ) + L, S, R = tensor.decompose( + "acLR->asL,scR", T, method=svd_method, options=options + ) + assert S is None # Due to "partition" option in SVDMethod + + # Report to logger + self._logger.debug(f"Truncation done. Fidelity estimate unchanged.") + self._logger.debug( + f"Reduced virtual bond dimension from {new_dim} to {R.shape[0]}." ) - self._logger.debug("QR decomposition applied.") self.tensors[l_pos] = L self.tensors[r_pos] = R diff --git a/pytket/extensions/cutensornet/mps/mps_mpo.py b/pytket/extensions/cutensornet/mps/mps_mpo.py index 09f53a1a..47274262 100644 --- a/pytket/extensions/cutensornet/mps/mps_mpo.py +++ b/pytket/extensions/cutensornet/mps/mps_mpo.py @@ -13,7 +13,6 @@ # limitations under the License. from __future__ import annotations # type: ignore import warnings -import logging from typing import Optional, Union diff --git a/pytket/extensions/cutensornet/mps/simulation.py b/pytket/extensions/cutensornet/mps/simulation.py index d817f2f6..1d330013 100644 --- a/pytket/extensions/cutensornet/mps/simulation.py +++ b/pytket/extensions/cutensornet/mps/simulation.py @@ -11,9 +11,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -from typing import Any from enum import Enum -import logging from random import choice # type: ignore from collections import defaultdict # type: ignore From 14353fc2a2e6ebd88b75e88b44ab375188cd1e24 Mon Sep 17 00:00:00 2001 From: Pablo Andres-Martinez Date: Thu, 28 Sep 2023 04:18:44 -0700 Subject: [PATCH 11/16] Small changes --- examples/mpi/mpi_overlap_bcast_mps.py | 3 ++- pytket/extensions/cutensornet/mps/mps.py | 6 ++++++ pytket/extensions/cutensornet/mps/mps_gate.py | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/examples/mpi/mpi_overlap_bcast_mps.py b/examples/mpi/mpi_overlap_bcast_mps.py index 36993231..a0d662d9 100644 --- a/examples/mpi/mpi_overlap_bcast_mps.py +++ b/examples/mpi/mpi_overlap_bcast_mps.py @@ -44,6 +44,7 @@ from pytket.extensions.cutensornet.mps import ( simulate, + ConfigMPS, ContractionAlg, CuTensorNetHandle, ) @@ -108,7 +109,7 @@ this_proc_mps = [] with CuTensorNetHandle(device_id) as libhandle: # Different handle for each process for circ in this_proc_circs: - mps = simulate(libhandle, circ, ContractionAlg.MPSxGate) + mps = simulate(libhandle, circ, ContractionAlg.MPSxGate, ConfigMPS()) this_proc_mps.append(mps) if rank == root: diff --git a/pytket/extensions/cutensornet/mps/mps.py b/pytket/extensions/cutensornet/mps/mps.py index 62ea80c4..b934f8f3 100644 --- a/pytket/extensions/cutensornet/mps/mps.py +++ b/pytket/extensions/cutensornet/mps/mps.py @@ -172,6 +172,12 @@ def __init__( ) self.zero = value_of_zero + if value_of_zero > self._atol / 1000: + logging.warning( + "Your chosen value_of_zero is relatively large. " + "Faithfulness of final fidelity estimate is not guaranteed." + ) + self.k = k self.optim_delta = 1e-5 self.loglevel = loglevel diff --git a/pytket/extensions/cutensornet/mps/mps_gate.py b/pytket/extensions/cutensornet/mps/mps_gate.py index fcc83c95..c7dc496e 100644 --- a/pytket/extensions/cutensornet/mps/mps_gate.py +++ b/pytket/extensions/cutensornet/mps/mps_gate.py @@ -280,7 +280,7 @@ def _apply_2q_gate(self, positions: tuple[int, int], gate: Op) -> MPSxGate: # remove any singular values below ``self._cfg.zero``. self._logger.debug(f"Truncating singular values below={self._cfg.zero}.") if self._cfg.zero > self._cfg._atol / 1000: - self._logger.warning( + self._logger.info( # This was raised as a warning in ConfigMPS already "Your chosen value_of_zero is relatively large. " "Faithfulness of final fidelity estimate is not guaranteed." ) From 460736cb59ac11437798c3443381f0cc1df105e4 Mon Sep 17 00:00:00 2001 From: PabloAndresCQ Date: Thu, 28 Sep 2023 13:53:12 +0100 Subject: [PATCH 12/16] Fixing docs --- docs/modules/mps.rst | 7 ++++--- pytket/extensions/cutensornet/mps/mps.py | 3 ++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/modules/mps.rst b/docs/modules/mps.rst index d4da1641..d6fff984 100644 --- a/docs/modules/mps.rst +++ b/docs/modules/mps.rst @@ -7,13 +7,16 @@ Matrix Product State (MPS) Simulation ~~~~~~~~~~ +.. autofunction:: pytket.extensions.cutensornet.mps.simulate + .. autoenum:: pytket.extensions.cutensornet.mps.ContractionAlg() :members: .. autoclass:: pytket.extensions.cutensornet.mps.ConfigMPS() + .. automethod:: __init__ -.. autofunction:: pytket.extensions.cutensornet.mps.simulate +.. autoclass:: pytket.extensions.cutensornet.mps.CuTensorNetHandle Classes @@ -50,8 +53,6 @@ Classes .. automethod:: __init__ -.. autoclass:: pytket.extensions.cutensornet.mps.CuTensorNetHandle - Miscellaneous ~~~~~~~~~~~~~ diff --git a/pytket/extensions/cutensornet/mps/mps.py b/pytket/extensions/cutensornet/mps/mps.py index b934f8f3..762958cc 100644 --- a/pytket/extensions/cutensornet/mps/mps.py +++ b/pytket/extensions/cutensornet/mps/mps.py @@ -131,7 +131,8 @@ def __init__( We suggest to use a value slightly below what your chosen ``float_precision`` can reasonably achieve. For instance, ``1e-16`` for ``np.float64`` precision (default) and ``1e-7`` for ``np.float32``. - loglevel: Internal logger output level. + loglevel: Internal logger output level. Use 30 for warnings only, 20 for + verbose and 10 for debug mode. Raises: ValueError: If both ``chi`` and ``truncation_fidelity`` are fixed. From 5b620d9479d7a985a550e5a085bb3ebe866305be Mon Sep 17 00:00:00 2001 From: PabloAndresCQ Date: Fri, 29 Sep 2023 12:45:16 +0100 Subject: [PATCH 13/16] Fixed some issues when merging --- pytket/extensions/cutensornet/mps/mps_gate.py | 1 - pytket/extensions/cutensornet/mps/mps_mpo.py | 1 - 2 files changed, 2 deletions(-) diff --git a/pytket/extensions/cutensornet/mps/mps_gate.py b/pytket/extensions/cutensornet/mps/mps_gate.py index df9b9418..c7dc496e 100644 --- a/pytket/extensions/cutensornet/mps/mps_gate.py +++ b/pytket/extensions/cutensornet/mps/mps_gate.py @@ -305,7 +305,6 @@ def _apply_2q_gate(self, positions: tuple[int, int], gate: Op) -> MPSxGate: self._logger.debug( f"Reduced virtual bond dimension from {new_dim} to {R.shape[0]}." ) - self._logger.debug("QR decomposition applied.") self.tensors[l_pos] = L self.tensors[r_pos] = R diff --git a/pytket/extensions/cutensornet/mps/mps_mpo.py b/pytket/extensions/cutensornet/mps/mps_mpo.py index 09f53a1a..47274262 100644 --- a/pytket/extensions/cutensornet/mps/mps_mpo.py +++ b/pytket/extensions/cutensornet/mps/mps_mpo.py @@ -13,7 +13,6 @@ # limitations under the License. from __future__ import annotations # type: ignore import warnings -import logging from typing import Optional, Union From 0d0af5c4689338b2f463abb067605381dd227b4f Mon Sep 17 00:00:00 2001 From: Pablo Andres-Martinez Date: Tue, 3 Oct 2023 15:42:42 -0700 Subject: [PATCH 14/16] Updated Jupyter notebook --- examples/mps_tutorial.ipynb | 2243 ++++++++++++++++++----------------- 1 file changed, 1126 insertions(+), 1117 deletions(-) diff --git a/examples/mps_tutorial.ipynb b/examples/mps_tutorial.ipynb index f1a2a555..237504e7 100644 --- a/examples/mps_tutorial.ipynb +++ b/examples/mps_tutorial.ipynb @@ -15,6 +15,7 @@ "\n", "from pytket.extensions.cutensornet.mps import (\n", " CuTensorNetHandle,\n", + " ConfigMPS,\n", " ContractionAlg,\n", " simulate, \n", " prepare_circuit\n", @@ -97,7 +98,7 @@ "\n", "\n", "\n", - " <div id="circuit-display-vue-container-e13d14af-9a4e-4029-8388-8fb18c773bf6" class="pytket-circuit-display-container">\n", + " <div id="circuit-display-vue-container-6f3d27c2-9192-4cb0-a7ab-af175d1b97d3" class="pytket-circuit-display-container">\n", " <div style="display: none">\n", " <div id="circuit-json-to-display">{"bits": [], "commands": [{"args": [["q", [0]], ["q", [1]]], "op": {"type": "CZ"}}, {"args": [["q", [2]]], "op": {"type": "H"}}, {"args": [["q", [3]], ["q", [4]]], "op": {"type": "CX"}}, {"args": [["q", [0]]], "op": {"params": ["0.2"], "type": "Ry"}}, {"args": [["q", [2]], ["q", [1]]], "op": {"params": ["0.3", "0.5", "0.7"], "type": "TK2"}}, {"args": [["q", [4]], ["q", [3]]], "op": {"params": ["0.1"], "type": "ZZPhase"}}], "created_qubits": [], "discarded_qubits": [], "implicit_permutation": [[["q", [0]], ["q", [0]]], [["q", [1]], ["q", [1]]], [["q", [2]], ["q", [2]]], [["q", [3]], ["q", [3]]], [["q", [4]], ["q", [4]]]], "phase": "0.0", "qubits": [["q", [0]], ["q", [1]], ["q", [2]], ["q", [3]], ["q", [4]]]}</div>\n", " </div>\n", @@ -107,7 +108,7 @@ " ></circuit-display-container>\n", " </div>\n", " <script type="application/javascript">\n", - " const circuitRendererUid = "e13d14af-9a4e-4029-8388-8fb18c773bf6";\n", + " const circuitRendererUid = "6f3d27c2-9192-4cb0-a7ab-af175d1b97d3";\n", " const displayOptions = JSON.parse('{}');\n", "\n", " // Script to initialise the circuit renderer app\n", @@ -168,7 +169,7 @@ "id": "a9ede80b-32d0-4d43-b910-099dcc2a8a95", "metadata": {}, "source": [ - "For **exact** simulation, simply call the `simulate` function on the circuit and choose a contraction algorithm. To learn more about the contraction algorithms we provide see the *Contraction algorithms* section of this notebook.\n", + "For **exact** simulation, simply call the `simulate` function on the circuit and choose a contraction algorithm. To learn more about the contraction algorithms we provide see the *Contraction algorithms* section of this notebook. You will also need to provide a configuration, the default one is provided by `ConfigMPS()`. Custom settings of `ConfigMPS` are discussed in the *Approximate simulation* section.\n", "\n", "**NOTE**: whenever you wish to generate an `MPS` object or execute calculations on it you must do so within a `with CuTensorNetHandle() as libhandle:` block; this will initialise the cuTensorNetwork library for you, and destroy its handles at the end of the `with` block. You will need to pass the `libhandle` to the `MPS` object via the method that generates it (in the snippet below, `simulate`), or if already initialised, pass it via the `update_libhandle` method.\n", "\n", @@ -183,7 +184,7 @@ "outputs": [], "source": [ "with CuTensorNetHandle() as libhandle:\n", - " my_mps = simulate(libhandle, my_circ, ContractionAlg.MPSxGate)" + " my_mps = simulate(libhandle, my_circ, ContractionAlg.MPSxGate, ConfigMPS())" ] }, { @@ -216,7 +217,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "(0.039688840897737394+0.05462700305610265j)\n" + "(0.03968884089773739+0.05462700305610267j)\n" ] } ], @@ -285,7 +286,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjMAAAGwCAYAAABcnuQpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA7uklEQVR4nO3deXQUVf7+8aeJpMnaQDQbieyoyKKAIIwsLoSAIiNzXFA2cUEFNeAMyCAjuIAyB0FEHYERdFDRrwMObgxRWVRkB1l/iBIgYmIUYicEkkByf39k0tIkIUmTUF3J+3VOH+1bS39uVUE/VFXfchhjjAAAAGyqjtUFAAAAnAvCDAAAsDXCDAAAsDXCDAAAsDXCDAAAsDXCDAAAsDXCDAAAsLULrC6guhUWFuqnn35SWFiYHA6H1eUAAIAKMMYoOztbsbGxqlPn7OdeanyY+emnnxQfH291GQAAwAepqamKi4s76zw1PsyEhYVJKtoY4eHhFlcDAAAqIisrS/Hx8Z7v8bOp8WGm+NJSeHg4YQYAAJupyC0i3AAMAABsjTADAABsjTADAABsrcbfMwMA8G8FBQU6efKk1WXgPKtbt64CAgKqZF2EGQCAJYwxSk9P12+//WZ1KbBI/fr1FR0dfc7jwBFmAACWKA4ykZGRCg4OZmDTWsQYo+PHjysjI0OSFBMTc07rI8wAAM67goICT5CJiIiwuhxYICgoSJKUkZGhyMjIc7rkxA3AAIDzrvgemeDgYIsrgZWK9/+53jNFmAEAWIZLS7VbVe1/wkxl5bol9+HSp7kPF02HfbA/AcD2uGemMnLd0qI/STm/qGDoR9pwNFgZ2bmKDKunzg2PK+DNm6SQi6TB/5bquayuFuVhfwJAjUCYqYy8Y1LOL1LmAaW9eL3G5j6hNEUoRkf0f/WeUZx+/n0+vvz8H/sTQBU7cOCAmjZtqq1bt+qKK66wupxag8tMleFqpFVdF+hgYaTi9LMWBz6tDo7vtDjwacXpZx0sjNSqrgskVyOrK0VFsD8B2ysoNPrmhyP6z7bD+uaHIyooNNX2WQ6H46yv4cOHV9tn4+w4M1MJBYVGEz7PlPInaXHg02pcJ0NLnJMlSQcLIzUof5LM55n6qpNRQB1uavN37E/A3pbvTNOUD3crzZ3raYtx1dOT/Vsrsc25jVtSmrS0NM//v/vuu/rb3/6mvXv3etqCgoKUmZlZ5Z9bEQUFBXI4HKpTp3aeo6idvfbRhpSjSnPnKk0RGnPyIa9pY04+pJ8UoTR3rjakHLWoQlQG+xOwr+U70/Tgoi1eQUaS0t25enDRFi3fmVbGkr6Ljo72vFwulxwOR4m2Yvv379e1116r4OBgtW/fXt98843XutauXasePXooKChI8fHxeuSRR5STk+OZnpmZqaFDh6pBgwYKDg5W3759tW/fPs/0hQsXqn79+vroo4/UunVrOZ1Offnll6pbt67S09O9Puuxxx5Tjx49qnx7+BPCTCVkZBf9oYnREc2s+4rXtJl1X1GMjnjNB//G/gTsqaDQaMqHu1XaBaXitikf7q7WS07lmThxov785z9r27ZtatWqlQYNGqRTp05Jknbs2KE+ffpo4MCB2r59u95991199dVXGj16tGf54cOHa9OmTVq2bJm++eYbGWPUr18/r/FYjh8/rmnTpmn+/PnatWuXOnXqpGbNmulf//qXZ55Tp05p0aJFuvvuu89f5y1AmKmEyLB6itERzyWJg4WRGpg3WQcLI9W4ToYWBz6tGB1RZFg9q0tFBbA/AXsqPqtaFiNZflb1z3/+s2688Ua1atVKU6ZM0cGDB/X9999Lkv7+97/rzjvvVFJSklq2bKlu3bpp9uzZevPNN5Wbm6t9+/Zp2bJlmj9/vrp376727dvrrbfe0uHDh/XBBx94PuPkyZN65ZVX1K1bN11yySUKCQnRPffcowULFnjm+fjjj3X8+HHddttt53sTnFeEmUroHHFC/1fvGc8X3x35k7TFtNId+ZM8X4D/V+8ZdY44YXWpqAD2J2BPFT1bauVZ1Xbt2nn+v/i5Q8XPIdq8ebMWLlyo0NBQz6tPnz4qLCxUSkqK9uzZowsuuEBdunTxrCMiIkKXXHKJ9uzZ42kLDAz0+hyp6IzO999/r3Xr1kmSXn/9dd12220KCQmptr76A78JM9OmTZPD4VBSUpKnzRijyZMnKzY2VkFBQerVq5d27dplWY0B9cIU2jDac3NomoqeJ5KmCA363xdgaMNoBdQLs6xGVBz7E7Cnip4ttfKsat26dT3/XzzKbWFhoee/I0eO1LZt2zyvb7/9Vvv27VPz5s1lTOmXx4wxXiPmBgUFlRhBNzIyUv3799eCBQuUkZGhTz75RCNGjKjq7vkdv/g108aNGzV37twSCXP69Ol64YUXtHDhQrVq1UrPPPOMevfurb179yoszIIvmHou1b//Q23dvl/m86PSaac5jauR9l//nq5t14wxSeyC/QnYUuemDRXjqqd0d26p9804JEW76qlz04bnu7QK6dChg3bt2qUWLVqUOr1169Y6deqU1q9fr27dukmSjhw5ou+++06XXXZZueu/9957dccddyguLk7NmzfXH/7whyqt3x9ZHmaOHTumu+66S/PmzdMzzzzjaTfGaNasWZo4caIGDhwoSXrjjTcUFRWlt99+WyNHjrSm4HouXdv5Sn3VyWhDytHfR4xt2pCf79oR+xOwnYA6Dj3Zv7UeXLRFDskr0BT/qX2yf2u//TM8fvx4XX311Ro1apTuu+8+hYSEaM+ePUpOTtZLL72kli1basCAAbrvvvv02muvKSwsTI8//rgaNWqkAQMGlLv+Pn36yOVy6ZlnntFTTz11HnpkPcsvM40aNUo33nijbrjhBq/2lJQUpaenKyEhwdPmdDrVs2dPrV27tsz15eXlKSsry+tVHQLqONS1eYQGXNFIXZtH+O0fGlQM+xOwl8Q2MXp1cAdFu7wvJUW76unVwR2qZZyZqtKuXTutXr1a+/btU/fu3XXllVdq0qRJnntrJGnBggXq2LGjbrrpJnXt2lXGGH3yySdel6/KUqdOHQ0fPlwFBQUaOnRodXbFb1h6Zmbx4sXasmWLNm7cWGJa8e/ko6KivNqjoqJ08ODBMtc5bdo0TZkypWoLBQD4ncQ2MerdOtqSs6rDhw8vdcTfJk2alLjnpX79+iXarrrqKq1YsaLM9Tdo0EBvvvlmpT+/WFpamvr16+cVkGoyy8JMamqqHn30Ua1YsUL16pV9k9aZNzedeQPUmSZMmKCxY8d63mdlZSk+Pv7cCwYA+J3is6oo4na7tXHjRr311lv6z3/+Y3U5541lYWbz5s3KyMhQx44dPW0FBQVas2aN5syZ4xkiOj093StZZmRklDhbczqn0ymn01l9hQMA4KcGDBigDRs2aOTIkerdu7fV5Zw3loWZ66+/Xjt27PBqu/vuu3XppZdq/PjxatasmaKjo5WcnKwrr7xSkpSfn6/Vq1fr+eeft6JkAAD82qpVq6wuwRKWhZmwsDC1adPGqy0kJEQRERGe9qSkJE2dOlUtW7ZUy5YtNXXqVAUHB+vOO++0omQAAOCHLP9p9tmMGzdOJ06c0EMPPaTMzEx16dJFK1assGaMGQAA4JccpqyhBmuIrKwsuVwuud1uhYeHW10OAEBSbm6uUlJS1LRp07P+CAQ129mOg8p8f1s+zgwAAMC5IMwAAABbI8wAAFBDDB8+XH/84x+tLuO8I8wAAFAJw4cPl8PhKPFKTEy0ujS9+OKLWrhwodVlSCoa9PaDDz44L5/l179mAgCgVLluKe+Y5GpUcpr7sOQMrdYn3icmJmrBggVebVYO2FpQUCCHwyGXq/r67M84MwMAsJdct7ToT9LCfpL7R+9p7h+L2hf9qWi+auJ0OhUdHe31atCggVatWqXAwEB9+eWXnnlnzJihCy+8UGlpaZKkXr16afTo0Ro9erTq16+viIgIPfHEE17Pb8rPz9e4cePUqFEjhYSEqEuXLl4D4i1cuFD169fXRx99pNatW8vpdOrgwYMlLjP16tVLDz/8sJKSktSgQQNFRUVp7ty5ysnJ0d13362wsDA1b95cn376qVf/du/erX79+ik0NFRRUVEaMmSIfv31V6/1PvLIIxo3bpwaNmyo6OhoTZ482TO9SZMmkqRbbrlFDofD8766EGYAAPaSd0zK+UXKPCAtvPH3QOP+seh95oGi6XnHzntpvXr1UlJSkoYMGSK3261vv/1WEydO1Lx587wezfPGG2/oggsu0Pr16zV79mzNnDlT8+fP90y/++679fXXX2vx4sXavn27br31ViUmJmrfvn2eeY4fP65p06Zp/vz52rVrlyIjI0ut6Y033tCFF16oDRs26OGHH9aDDz6oW2+9Vd26ddOWLVvUp08fDRkyRMePH5dU9JDKnj176oorrtCmTZu0fPly/fzzz7rttttKrDckJETr16/X9OnT9dRTTyk5OVmSPA+QXrBggdLS0kp9oHSVMjWc2+02kozb7ba6FADA/5w4ccLs3r3bnDhxwrcV/JZqzKx2xjwZXvTfg+u83/+WWrUFn2bYsGEmICDAhISEeL2eeuopY4wxeXl55sorrzS33Xabufzyy829997rtXzPnj3NZZddZgoLCz1t48ePN5dddpkxxpjvv//eOBwOc/jwYa/lrr/+ejNhwgRjjDELFiwwksy2bdtK1DZgwACvz7rmmms870+dOmVCQkLMkCFDPG1paWlGkvnmm2+MMcZMmjTJJCQkeK03NTXVSDJ79+4tdb3GGHPVVVeZ8ePHe95LMkuXLi1jKxY523FQme9v7pkBANiPK04a/vHvZ2JeTyhqb9CkqN0VV60ff+211+rVV1/1amvYsKEkKTAwUIsWLVK7du3UuHFjzZo1q8TyV199tRwOh+d9165dNWPGDBUUFGjLli0yxqhVq1Zey+Tl5Ski4vcnhAcGBqpdu3bl1nr6PAEBAYqIiFDbtm09bcUPb87IyJBU9CDolStXKjQ0tMS6fvjhB09dZ352TEyMZx3nG2EGAGBPrjjplrm/Bxmp6H01Bxmp6FmCLVq0KHP62rVrJUlHjx7V0aNHFRISUuF1FxYWKiAgQJs3b1ZAQIDXtNMDRlBQkFcgKkvdunW93jscDq+24nUUFhZ6/tu/f/9SH+p8+qWy0tZbvI7zjTADALAn94/S0vu925bef17OzJzNDz/8oDFjxmjevHl67733NHToUH3++eeqU+f321TXrVvntcy6devUsmVLBQQE6Morr1RBQYEyMjLUvXv3812+OnTooH//+99q0qSJLrjA95hQt25dFRQUVGFlZeMGYACA/Zx+s2+DJtKIFUX/PfOm4GqSl5en9PR0r9evv/6qgoICDRkyRAkJCbr77ru1YMEC7dy5UzNmzPBaPjU1VWPHjtXevXv1zjvv6KWXXtKjjz4qSWrVqpXuuusuDR06VEuWLFFKSoo2btyo559/Xp988km19kuSRo0apaNHj2rQoEHasGGD9u/frxUrVmjEiBGVCidNmjTR559/rvT0dGVmZlZjxYQZAIDduA97B5nhH0sXdyn6r1egOVxtJSxfvlwxMTFer2uuuUbPPvusDhw4oLlz50qSoqOjNX/+fD3xxBPatm2bZ/mhQ4fqxIkT6ty5s0aNGqWHH35Y99//+1mmBQsWaOjQoXrsscd0ySWX6Oabb9b69esVHx9fbX0qFhsbq6+//loFBQXq06eP2rRpo0cffVQul8vr7FJ5ZsyYoeTkZMXHx+vKK6+sxop5ajYAwALn9NTs4nFmcn4peUmp+IxNyEXS4H9X68B5vurVq5euuOKKUm8Mrm2q6qnZ3DMDALCXeq6ioFLaCMCuOGn4J9U+AjD8C2EGAGA/9Vxlh5XSHnGAGo0wAwDAeXT6YwlQNbgBGAAA2BphBgBgmRr+GxSUo6r2P2EGAHDeFY8eW/xwQ9ROxfv/zNGEK4t7ZgAA511AQIDq16/veZZPcHBwhYbmR81gjNHx48eVkZGh+vXrl3hsQ2URZgAAloiOjpYkyx5OCOvVr1/fcxycC8IMAMASDodDMTExioyM1MmTJ60uB+dZ3bp1z/mMTDHCDADAUgEBAVX2pYbaiRuAAQCArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArVkaZl599VW1a9dO4eHhCg8PV9euXfXpp596phtjNHnyZMXGxiooKEi9evXSrl27LKwYAAD4G0vDTFxcnJ577jlt2rRJmzZt0nXXXacBAwZ4Asv06dP1wgsvaM6cOdq4caOio6PVu3dvZWdnW1k2AADwIw5jjLG6iNM1bNhQf//73zVixAjFxsYqKSlJ48ePlyTl5eUpKipKzz//vEaOHFmh9WVlZcnlcsntdis8PLw6SwcAAFWkMt/ffnPPTEFBgRYvXqycnBx17dpVKSkpSk9PV0JCgmcep9Opnj17au3atWWuJy8vT1lZWV4vAABQc1keZnbs2KHQ0FA5nU498MADWrp0qVq3bq309HRJUlRUlNf8UVFRnmmlmTZtmlwul+cVHx9frfUDAABrWR5mLrnkEm3btk3r1q3Tgw8+qGHDhmn37t2e6Q6Hw2t+Y0yJttNNmDBBbrfb80pNTa222gEAgPUusLqAwMBAtWjRQpLUqVMnbdy4US+++KLnPpn09HTFxMR45s/IyChxtuZ0TqdTTqezeosGAAB+w/IzM2cyxigvL09NmzZVdHS0kpOTPdPy8/O1evVqdevWzcIKAQCAP7H0zMxf//pX9e3bV/Hx8crOztbixYu1atUqLV++XA6HQ0lJSZo6dapatmypli1baurUqQoODtadd95pZdkAAMCPWBpmfv75Zw0ZMkRpaWlyuVxq166dli9frt69e0uSxo0bpxMnTuihhx5SZmamunTpohUrVigsLMzKsgEAgB/xu3FmqhrjzAAAYD+2HGcGAADAF4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABga4QZAABgaz6FmdTUVP3444+e9xs2bFBSUpLmzp1bZYUBAABUhE9h5s4779TKlSslSenp6erdu7c2bNigv/71r3rqqaeqtEAAAICz8SnM7Ny5U507d5Ykvffee2rTpo3Wrl2rt99+WwsXLqzK+gAAAM7KpzBz8uRJOZ1OSdJnn32mm2++WZJ06aWXKi0treqqAwAAKIdPYebyyy/XP/7xD3355ZdKTk5WYmKiJOmnn35SRERElRYIAABwNj6Fmeeff16vvfaaevXqpUGDBql9+/aSpGXLlnkuPwEAAJwPDmOM8WXBgoICZWVlqUGDBp62AwcOKDg4WJGRkVVW4LnKysqSy+WS2+1WeHi41eUAAIAKqMz3t8/jzBhjtHnzZr322mvKzs6WJAUGBio4ONjXVQIAAFTaBb4sdPDgQSUmJurQoUPKy8tT7969FRYWpunTpys3N1f/+Mc/qrpOAACAUvl0ZubRRx9Vp06dlJmZqaCgIE/7Lbfcos8//7zKigMAACiPT2dmvvrqK3399dcKDAz0am/cuLEOHz5cJYUBAABUhE9nZgoLC1VQUFCi/ccff1RYWNg5FwUAAFBRPoWZ3r17a9asWZ73DodDx44d05NPPql+/fpVVW0AAADl8umn2T/99JOuvfZaBQQEaN++ferUqZP27dunCy+8UGvWrOGn2QAA4JxU5vvbp3tmYmNjtW3bNr3zzjvasmWLCgsLdc899+iuu+7yuiEYAACguvk8aJ5dcGYGAAD7qZYzM8uWLatwAcUPngQAAKhuFQ4zf/zjHys0n8PhKPWXTgAAANWhwmGmsLCwOusAAADwic/PZgIAAPAHPoeZzz//XDfddJOaN2+uFi1a6KabbtJnn31WlbUBAACUy6cwM2fOHCUmJiosLEyPPvqoHnnkEYWHh6tfv36aM2dOVdcIAABQJp9+mt2oUSNNmDBBo0eP9mp/+eWX9eyzz+qnn36qsgLPFT/NBgDAfirz/e3TmZmsrCwlJiaWaE9ISFBWVpYvqwQAAPCJT2Hm5ptv1tKlS0u0/+c//1H//v3PuSgAAICK8ulxBpdddpmeffZZrVq1Sl27dpUkrVu3Tl9//bUee+wxzZ492zPvI488UjWVAgAAlMKne2aaNm1asZU7HNq/f3+li6pK3DMDAID9VPuDJlNSUnwq7EzTpk3TkiVL9P/+3/9TUFCQunXrpueff16XXHKJZx5jjKZMmaK5c+cqMzNTXbp00csvv6zLL7+8SmoAAAD2ZumgeatXr9aoUaO0bt06JScn69SpU0pISFBOTo5nnunTp+uFF17QnDlztHHjRkVHR6t3797Kzs62sHIAAOAvfLrMZIzR+++/r5UrVyojI6PEow6WLFniUzG//PKLIiMjtXr1avXo0UPGGMXGxiopKUnjx4+XJOXl5SkqKkrPP/+8Ro4cWe46ucwEAID9VPtPsx999FENGTJEKSkpCg0Nlcvl8nr5yu12S5IaNmwoqehyVnp6uhISEjzzOJ1O9ezZU2vXri11HXl5ecrKyvJ6AQCAmsune2YWLVqkJUuWqF+/flVWiDFGY8eO1TXXXKM2bdpIktLT0yVJUVFRXvNGRUXp4MGDpa5n2rRpmjJlSpXVBQAA/JtPZ2ZcLpeaNWtWpYWMHj1a27dv1zvvvFNimsPh8HpvjCnRVmzChAlyu92eV2pqapXWCQAA/ItPYWby5MmaMmWKTpw4USVFPPzww1q2bJlWrlypuLg4T3t0dLSk38/QFMvIyChxtqaY0+lUeHi41wsAANRcPoWZW2+9VZmZmYqMjFTbtm3VoUMHr1dFGWM0evRoLVmyRF988UWJ8WuaNm2q6OhoJScne9ry8/O1evVqdevWzZfSAQBADePTPTPDhw/X5s2bNXjwYEVFRZV5yac8o0aN0ttvv63//Oc/CgsL85yBcblcCgoKksPhUFJSkqZOnaqWLVuqZcuWmjp1qoKDg3XnnXf69JkAAKBm8emn2SEhIfrvf/+ra6655tw+vIwQtGDBAg0fPlzS74Pmvfbaa16D5hXfJFwefpoNAID9VOb726cwc+mll+q9995Tu3btfC7yfCHMAABgP9U+zsyMGTM0btw4HThwwJfFAQAAqoxP98wMHjxYx48fV/PmzRUcHKy6det6TT969GiVFAcAAFAen8LMrFmzqrgMAAAA3/gUZoYNG1bVdQAAAPjEpzBzuhMnTujkyZNebdxoCwAAzhefbgDOycnR6NGjFRkZqdDQUDVo0MDrBQAAcL74FGbGjRunL774Qq+88oqcTqfmz5+vKVOmKDY2Vm+++WZV1wgAAFAmny4zffjhh3rzzTfVq1cvjRgxQt27d1eLFi3UuHFjvfXWW7rrrruquk4AAIBS+XRm5ujRo57nKIWHh3t+in3NNddozZo1VVcdAABAOXwKM82aNfMMmNe6dWu99957korO2NSvX7+qagMAACiXT2Hm7rvv1rfffitJmjBhgufemTFjxugvf/lLlRYIAABwNj49m+lMhw4d0qZNm9S8eXO1b9++KuqqMjybCQAA+6m2ZzOtX79en376qVfbm2++qZ49e+qBBx7Qyy+/rLy8vMpXDAAA4KNKhZnJkydr+/btnvc7duzQPffcoxtuuEETJkzQhx9+qGnTplV5kQAAAGWpVJjZtm2brr/+es/7xYsXq0uXLpo3b57GjBmj2bNne24GBgAAOB8qFWYyMzMVFRXleb969WolJiZ63l911VVKTU2tuuoAAADKUakwExUVpZSUFElSfn6+tmzZoq5du3qmZ2dnq27dulVbIQAAwFlUKswkJibq8ccf15dffqkJEyYoODhY3bt390zfvn27mjdvXuVFAgAAlKVSjzN45plnNHDgQPXs2VOhoaF64403FBgY6Jn++uuvKyEhocqLBAAAKItP48y43W6FhoYqICDAq/3o0aMKDQ31CjhWY5wZAADspzLf3z49aNLlcpXa3rBhQ19WBwAA4DOfHmcAAADgLwgzAADA1ggzAADA1ggzAADA1ggzAADA1ggzAADA1ggzAADA1ggzAADA1ggzAADA1ggzAADA1ggzAADA1ggzAADA1ggzAADA1ggzAADA1ggzAADA1ggzAADA1ggzAADA1ggzAADA1ggzAADA1ggzAADA1ggzAADA1ggz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7Fjde++9uuGGG/Tcc8/phx9+KPPzKjPvrbfeqhMnTqhZs2a67777tHTpUp06deqs/SkoKNCzzz6rdu3aKSIiQqGhoVqxYoVXvaXZvHmzVq5cqdDQUM/r0ksvlST98MMPat++va6//nq1bdtWt956q+bNm6fMzMyzrhNA1SDMADirkJAQtWjRQi1atFDnzp31z3/+Uzk5OZo3b54kad26dbrjjjvUt29fffTRR9q6dasmTpyo/Px8zzomT56sXbt26cYbb9QXX3yh1q1ba+nSpaV+XmXmjY+P1969e/Xyyy8rKChIDz30kHr06OF1v86ZZsyYoZkzZ2rcuHH64osvtG3bNvXp08er3tIUFhaqf//+nmBX/Nq3b5969OihgIAAJScn69NPP1Xr1q310ksv6ZJLLlFKSkp5mxjAOSLMAKgUh8OhOnXq6MSJE5Kkr7/+Wo0bN9bEiRPVqVMntWzZ0uusTbFWrVppzJgxWrFihQYOHKgFCxaU+RmVmTcoKEg333yzZs+erVWrVumbb77Rjh07JEmBgYEqKCjwmv/LL7/UgAEDNHjwYLVv317NmjXTvn37vOYpbbkOHTpo165datKkiSfcFb9CQkI82+YPf/iDpkyZoq1btyowMLDMIAag6hBmAJxVXl6e0tPTlZ6erj179ujhhx/WsWPH1L9/f0lSixYtdOjQIS1evFg//PCDZs+e7fUFfuLECY0ePVqrVq3SwYMH9fXXX2vjxo267LLLSnxWZeaVin4J9c9//lM7d+7U/v379a9//UtBQUFq3LixpKJxZtasWaPDhw97fnXUokULJScna+3atdqzZ49Gjhyp9PR0r/U2adJE69ev14EDB/Trr7+qsLBQo0aN0tGjRzVo0CBt2LBB+/fv14oVKzRixAgVFBRo/fr1mjp1qjZt2qRDhw5pyZIl+uWXX8qsHUAVsvqmHQD+a9iwYUaS5xUWFmauuuoq8/7773vN95e//MVERESY0NBQc/vtt5uZM2d6burNy8szd9xxh4mPjzeBgYEmNjbWjB492pw4ccIY430DcHnznmnp0qWmS5cuJjw83ISEhJirr77afPbZZ57p33zzjWnXrp1xOp2m+K+7I0eOmAEDBpjQ0FATGRlpnnjiCTN06FAzYMAAz3J79+41V199tQkKCjKSTEpKijHGmO+++87ccsstpn79+iYoKMhceumlJikpyRQWFprdu3ebPn36mIsuusg4nU7TqlUr89JLL1XBXgBQHocx/G4QAADYF5eZAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArRFmAACArf1/hYs84yYwXkgAAAAASUVORK5CYII=", + "image/png": "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wYIFuuOOO1RcXKzjx4+7nZU5cuSIIiMjK5yfv7+//P39a7tsAADgBUw/I3O+0tJSFRUVqWfPnvL19dX69etdw/bs2aPMzEzFx8ebWCEAAPAWpp6RmT17tgYNGqRWrVrpxIkTeuutt5SSkqJPP/1Udrtd99xzj2bOnKlmzZopJCRE999/v+Lj4yt9xxIAAKjfTA0yubm5Gjt2rLKzs2W329WtWzd9+umnuummmyRJ8+fPV6NGjTRixAgVFRVp4MCBeuWVV8wsGQAAeBGve45MTeM5MgAAWI/lniMDAABQVQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWR4FmaysLB08eND1fdOmTZo+fboWL15cY4UBAABcjEdB5q677tKGDRskSTk5Obrpppu0adMmPfzww3riiSdqtEAAAICKeBRkduzYoV69ekmS/vnPf6pLly765ptv9OabbyopKakm6wMAAKiQR0Hm9OnT8vf3lyR9/vnn+v3vfy9J6tixo7Kzs2uuOgAAgAvwKMhcfvnleu211/TVV19p3bp1SkxMlCQdPnxY4eHhNVogAABARTwKMs8++6wWLVqkfv36aeTIkerevbsk6aOPPnJdcgIAAKhtNsMwDE8mLCkpUV5ensLCwlxt+/fvV9OmTdWyZcsaK7C68vLyZLfb5XA4FBISYnY5AACgEir7++3xc2QMw1B6eroWLVqkEydOSJL8/PzUtGlTT2cJAABQJY09mejAgQNKTExUZmamioqKdNNNNyk4OFjPPvusioqK9Nprr9V0nQAAAGV4dEZm2rRpuuqqq3Ts2DEFBAS42ocNG6b169fXWHEAAAAX4tEZma+++krffPON/Pz83Nrj4uJ06NChGikMAADgYjw6I1NaWqqSkpIy7QcPHlRwcHC1iwIAAKgMj4LMgAED9OKLL7q+22w25efna86cORo8eHBN1QYAAHBBHt1+ffDgQQ0cOFCGYWjv3r266qqrtHfvXjVv3lxffvklt18DAIBqqezvt8fPkfntt9+0cuVKbd++Xfn5+erRo4dGjRrl1vnXGxBkAACwnsr+fnvU2VeSGjdurNGjR3s6OQAAQLVVOsh89NFHlZ7pmZdIAgAA1KZKB5lbb721UuPZbLZy72gCAACoaZUOMqWlpbVZBwAAQJV5/K4lAAAAs3kcZNavX69bbrlFl156qS699FLdcsst+vzzz2uyNgAAgAvyKMi88sorSkxMVHBwsKZNm6Zp06YpJCREgwcP1ssvv1zTNQIAAJTLo+fIxMTEaNasWZo6dapb+8svv6y//vWvXvW+JZ4jAwCA9VT299ujMzLHjx9XYmJimfYBAwbI4XB4MksAAIAq8yjI/P73v1dycnKZ9g8//FC33HJLtYsCAACoDI+e7Nu5c2c9/fTTSklJUXx8vCTp22+/1ddff60HH3xQCxcudI37wAMP1EylAAAA5/Goj0ybNm0qN3ObTf/973+rXFRNoo8MAADWU6vvWsrIyPC4MAAAgJrCA/EAAIBleXRGxjAMvffee9qwYYNyc3PLvL5g1apVNVIcAADAhXgUZKZPn65FixbphhtuUEREhGw2W03XBQAAcFEeBZn//d//1apVqzR48OBqLXzevHlatWqVfvzxRwUEBOh3v/udnn32WXXo0ME1TmFhoR588EGtXLlSRUVFGjhwoF555RVFRERUa9kAAMD6POojY7fb1bZt22ovPDU1VVOmTNG3336rdevW6fTp0xowYIAKCgpc48yYMUOrV6/Wu+++q9TUVB0+fFjDhw+v9rIBAID1eXT79RtvvKG1a9fq9ddfV0BAQI0V8/PPP6tly5ZKTU1V37595XA41KJFC7311lv6wx/+IEn68ccf1alTJ6WlpalPnz4XnSe3XwMAYD21evv17bffrrffflstW7ZUXFycfH193YZv3brVk9m6Xm/QrFkzSVJ6erpOnz6thIQE1zgdO3ZUq1atKgwyRUVFKioqcn3Py8vzqBYAAOD9PAoy48aNU3p6ukaPHl1jnX1LS0s1ffp0XXPNNerSpYskKScnR35+fgoNDXUbNyIiQjk5OeXOZ968eZo7d2616wEAAN7PoyCzZs0affrpp7r22mtrrJApU6Zox44d+ve//12t+cye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lRr3fC+88ILRvn17o7i4uNzhrVu3NubPn3/R+dx8883Ggw8+6Pp+/fXXG9OmTXMb58knnzQGDBjg1paVlWVIMvbs2WOkp6cbkoz9+/dXqnYANYMzMgAu6IYbbtC2bdu0bds2bdq0SQMHDtSgQYN04MAB1zjvvPOOrrnmGkVGRiooKEiPPPKIMjMzXcNnzpypP/7xj0pISNAzzzyjffv2Vbi8qox722236dSpU2rbtq0mTpyo5ORk/fbbbxdcn5KSEj355JPq2rWrmjVrpqCgIH366adu9Zbn+++/14YNGxQUFOT6dOzYUZK0b98+de/eXf3791fXrl112223acmSJTp27NgF5wmg+ggyAC4oMDBQ7dq1U7t27XT11Vdr6dKlKigo0JIlSyRJaWlpGjVqlAYPHqyPP/5Y3333nR5++GEVFxe75vH4449r586duvnmm/XFF1+oc+fOSk5OLnd5VRk3NjZWe/bs0SuvvKKAgADdd9996tu3r1v/nPM9//zzWrBggR566CFt2LBB27Zt08CBA93qLU9+fr6GDBniCnVnPnv37lXfvn3l4+OjdevW6ZNPPlHnzp310ksvqUOHDsrIyLjYJgZQDQQZAFVis9nUqFEjnTp1SpL0zTffqHXr1nr44Yd11VVX6bLLLnM7W3NG+/btNWPGDH322WcaPny4li1bVuEyqjJuQECAhgwZooULFyolJUVpaWn64YcfJEl+fn4qKSlxG//rr7/W0KFDNXr0aHXv3l1t27Ytc/t3edP16NFDO3fuVFxcnCvYnfkEBga6ts0111yjuXPn6rvvvpOfn1+FIQxAzSDIALigoqIi5eTkKCcnR7t379b999/vOjshSZdddpkyMzO1cuVK7du3TwsXLnT78T516pSmTp2qlJQUHThwQF9//bU2b96sTp06lVlWVcaVnHc8/eMf/9COHTv03//+VytWrFBAQIBat24tyfkcmS+//FKHDh1y3V102WWXad26dfrmm2+0e/du/b//9/905MgRt/nGxcVp48aN2r9/v3755ReVlpZqypQpOnr0qEaOHKnNmzdr3759+vTTTzVhwgSVlJRo48aN+utf/6otW7YoMzNTq1at0s8//1xh7QBqiNmddAB4r3HjxhmSXJ/g4GDj6quvNt577z238f785z8b4eHhRlBQkHHHHXcY8+fPd3XgLSoqMu68804jNjbW8PPzM6Kjo42pU6cap06dMgzDvbPvxcY9X3JystG7d28jJCTECAwMNPr06WN8/vnnruFpaWlGt27dDH9/f+PMP3e//vqrMXToUCMoKMho2bKl8cgjjxhjx441hg4d6ppuz549Rp8+fYyAgABDkpGRkWEYhmH85z//MYYNG2aEhoYaAQEBRseOHY3p06cbpaWlxq5du4yBAwcaLVq0MPz9/Y327dsbL730Ug3sBQAXYjMM7g0EAADWxKUlAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWf8frP1e4F+3sjkAAAAASUVORK5CYII=", "text/plain": [ "
" ] @@ -394,7 +395,7 @@ "\n", "# Simulate them\n", "with CuTensorNetHandle() as libhandle:\n", - " other_mps = simulate(libhandle, other_circ, ContractionAlg.MPSxGate)" + " other_mps = simulate(libhandle, other_circ, ContractionAlg.MPSxGate, ConfigMPS())" ] }, { @@ -473,7 +474,7 @@ "\n", "\n", "\n", - " <div id="circuit-display-vue-container-067d69bc-bdde-4810-ac70-5b0fe1129460" class="pytket-circuit-display-container">\n", + " <div id="circuit-display-vue-container-04ed427a-5ec8-4e3d-9fbf-e11d67078a06" class="pytket-circuit-display-container">\n", " <div style="display: none">\n", " <div id="circuit-json-to-display">{"bits": [], "commands": [{"args": [["q", [1]]], "op": {"type": "H"}}, {"args": [["q", [2]], ["q", [3]]], "op": {"params": ["0.3"], "type": "ZZPhase"}}, {"args": [["q", [4]]], "op": {"params": ["0.8"], "type": "Ry"}}, {"args": [["q", [0]], ["q", [1]]], "op": {"type": "CX"}}, {"args": [["q", [3]], ["q", [4]]], "op": {"type": "CZ"}}, {"args": [["q", [1]], ["q", [2]]], "op": {"params": ["0.7"], "type": "XXPhase"}}, {"args": [["q", [1]], ["q", [4]]], "op": {"params": ["0.1", "0.2", "0.4"], "type": "TK2"}}], "created_qubits": [], "discarded_qubits": [], "implicit_permutation": [[["q", [0]], ["q", [0]]], [["q", [1]], ["q", [1]]], [["q", [2]], ["q", [2]]], [["q", [3]], ["q", [3]]], [["q", [4]], ["q", [4]]]], "phase": "0.0", "qubits": [["q", [0]], ["q", [1]], ["q", [2]], ["q", [3]], ["q", [4]]]}</div>\n", " </div>\n", @@ -483,7 +484,7 @@ " ></circuit-display-container>\n", " </div>\n", " <script type="application/javascript">\n", - " const circuitRendererUid = "067d69bc-bdde-4810-ac70-5b0fe1129460";\n", + " const circuitRendererUid = "04ed427a-5ec8-4e3d-9fbf-e11d67078a06";\n", " const displayOptions = JSON.parse('{}');\n", "\n", " // Script to initialise the circuit renderer app\n", @@ -557,7 +558,7 @@ "source": [ "with CuTensorNetHandle() as libhandle:\n", " try:\n", - " simulate(libhandle, bad_circ, ContractionAlg.MPSxGate)\n", + " simulate(libhandle, bad_circ, ContractionAlg.MPSxGate, ConfigMPS())\n", " except RuntimeError as e:\n", " print(e)" ] @@ -601,7 +602,7 @@ "\n", "\n", "\n", - " <div id="circuit-display-vue-container-87b5c904-f430-4e00-b6c6-601952b6581f" class="pytket-circuit-display-container">\n", + " <div id="circuit-display-vue-container-08a5a05d-8989-43a0-a5a9-8c83ea08f5a6" class="pytket-circuit-display-container">\n", " <div style="display: none">\n", " <div id="circuit-json-to-display">{"bits": [], "commands": [{"args": [["node", [1]]], "op": {"params": ["0.8"], "type": "Ry"}}, {"args": [["node", [3]]], "op": {"type": "H"}}, {"args": [["node", [0]], ["node", [1]]], "op": {"type": "SWAP"}}, {"args": [["node", [4]], ["node", [3]]], "op": {"type": "CX"}}, {"args": [["node", [2]], ["node", [1]]], "op": {"params": ["0.3"], "type": "ZZPhase"}}, {"args": [["node", [1]], ["node", [0]]], "op": {"type": "CZ"}}, {"args": [["node", [3]], ["node", [2]]], "op": {"params": ["0.7"], "type": "XXPhase"}}, {"args": [["node", [3]], ["node", [2]]], "op": {"type": "SWAP"}}, {"args": [["node", [2]], ["node", [1]]], "op": {"type": "SWAP"}}, {"args": [["node", [1]], ["node", [0]]], "op": {"params": ["0.1", "0.2", "0.4"], "type": "TK2"}}], "created_qubits": [], "discarded_qubits": [], "implicit_permutation": [[["node", [0]], ["node", [0]]], [["node", [1]], ["node", [1]]], [["node", [2]], ["node", [2]]], [["node", [3]], ["node", [3]]], [["node", [4]], ["node", [4]]]], "phase": "0.0", "qubits": [["node", [0]], ["node", [1]], ["node", [2]], ["node", [3]], ["node", [4]]]}</div>\n", " </div>\n", @@ -611,7 +612,7 @@ " ></circuit-display-container>\n", " </div>\n", " <script type="application/javascript">\n", - " const circuitRendererUid = "87b5c904-f430-4e00-b6c6-601952b6581f";\n", + " const circuitRendererUid = "08a5a05d-8989-43a0-a5a9-8c83ea08f5a6";\n", " const displayOptions = JSON.parse('{}');\n", "\n", " // Script to initialise the circuit renderer app\n", @@ -694,7 +695,7 @@ ], "source": [ "with CuTensorNetHandle() as libhandle:\n", - " prep_mps = simulate(libhandle, prep_circ, ContractionAlg.MPSxGate)\n", + " prep_mps = simulate(libhandle, prep_circ, ContractionAlg.MPSxGate, ConfigMPS())\n", " print(\"Did simulation succeed?\")\n", " print(prep_mps.is_valid())" ] @@ -711,7 +712,7 @@ "* Bound the maximum value of the virtual bond dimension `chi`. If a bond dimension would increase past that point, we *truncate* (i.e. discard) the degrees of freedom that contribute the least to the state description. We can keep track of a lower bound of the error that this truncation causes.\n", "* Provide a value for acceptable two-qubit gate fidelity `truncation_fidelity`. After each two-qubit gate we truncate the dimension of virtual bonds as much as we can while guaranteeing the target gate fidelity. The more fidelity you require, the longer it will take to simulate. **Note**: this is *not* the final fidelity of the output state, but the fidelity per gate.\n", "\n", - "To showcase approximate simulation, let's define a circuit where exact MPS contraction starts struggling." + "Values for `chi` and `truncation_fidelity` can be set via `ConfigMPS`. To showcase approximate simulation, let's define a circuit where exact MPS contraction starts struggling." ] }, { @@ -774,17 +775,18 @@ "output_type": "stream", "text": [ "Time taken by approximate contraction with bound chi:\n", - "1.47 seconds\n", + "1.89 seconds\n", "\n", "Lower bound of the fidelity:\n", - "0.3587\n" + "0.3742\n" ] } ], "source": [ "start = time()\n", "with CuTensorNetHandle() as libhandle:\n", - " bound_chi_mps = simulate(libhandle, circuit, ContractionAlg.MPSxGate, chi=16)\n", + " config = ConfigMPS(chi=16)\n", + " bound_chi_mps = simulate(libhandle, circuit, ContractionAlg.MPSxGate, config)\n", "end = time()\n", "print(\"Time taken by approximate contraction with bound chi:\")\n", "print(f\"{round(end-start,2)} seconds\")\n", @@ -811,17 +813,18 @@ "output_type": "stream", "text": [ "Time taken by approximate contraction with fixed truncation fidelity:\n", - "2.62 seconds\n", + "2.89 seconds\n", "\n", "Lower bound of the fidelity:\n", - "0.9334\n" + "0.9298\n" ] } ], "source": [ "start = time()\n", "with CuTensorNetHandle() as libhandle:\n", - " fixed_fidelity_mps = simulate(libhandle, circuit, ContractionAlg.MPSxGate, truncation_fidelity=0.999)\n", + " config = ConfigMPS(truncation_fidelity=0.999)\n", + " fixed_fidelity_mps = simulate(libhandle, circuit, ContractionAlg.MPSxGate, config)\n", "end = time()\n", "print(\"Time taken by approximate contraction with fixed truncation fidelity:\")\n", "print(f\"{round(end-start,2)} seconds\")\n", @@ -852,7 +855,7 @@ "* **k**: The maximum number of layers the MPO is allowed to have before being contracted. Increasing this might increase fidelity, but it will also increase resource requirements exponentially. Default value is `4`.\n", "* **optim_delta**: Stopping criteria for the optimisation when contracting the `k` layers of MPO. Stops when the increase of fidelity between iterations is smaller than `optim_delta`. Default value is `1e-5`.\n", "\n", - "Below we compare `MPSxGate` versus `MPSxMPO` with default parameters and `MPSxMPO` with more resource-hungry parameters. The circuit used is the same as in the previous section." + "Both `k` and `optim_delta` can be set via `ConfigMPS`. Below we compare `MPSxGate` versus `MPSxMPO` with default parameters and `MPSxMPO` with more resource-hungry parameters. The circuit used is the same as in the previous section." ] }, { @@ -866,15 +869,16 @@ "output_type": "stream", "text": [ "MPSxGate\n", - "\tTime taken: 1.35 seconds\n", - "\tLower bound of the fidelity: 0.3589\n" + "\tTime taken: 1.89 seconds\n", + "\tLower bound of the fidelity: 0.3712\n" ] } ], "source": [ "start = time()\n", "with CuTensorNetHandle() as libhandle:\n", - " fixed_fidelity_mps = simulate(libhandle, circuit, ContractionAlg.MPSxGate, chi=16)\n", + " config = ConfigMPS(chi=16)\n", + " fixed_fidelity_mps = simulate(libhandle, circuit, ContractionAlg.MPSxGate, config)\n", "end = time()\n", "print(\"MPSxGate\")\n", "print(f\"\\tTime taken: {round(end-start,2)} seconds\")\n", @@ -892,15 +896,16 @@ "output_type": "stream", "text": [ "MPSxMPO, default parameters\n", - "\tTime taken: 12.6 seconds\n", - "\tLower bound of the fidelity: 0.3847\n" + "\tTime taken: 27.17 seconds\n", + "\tLower bound of the fidelity: 0.3956\n" ] } ], "source": [ "start = time()\n", "with CuTensorNetHandle() as libhandle:\n", - " fixed_fidelity_mps = simulate(libhandle, circuit, ContractionAlg.MPSxMPO, chi=16)\n", + " config = ConfigMPS(chi=16)\n", + " fixed_fidelity_mps = simulate(libhandle, circuit, ContractionAlg.MPSxMPO, config)\n", "end = time()\n", "print(\"MPSxMPO, default parameters\")\n", "print(f\"\\tTime taken: {round(end-start,2)} seconds\")\n", @@ -918,15 +923,16 @@ "output_type": "stream", "text": [ "MPSxMPO, custom parameters\n", - "\tTime taken: 22.52 seconds\n", - "\tLower bound of the fidelity: 0.3977\n" + "\tTime taken: 26.99 seconds\n", + "\tLower bound of the fidelity: 0.4209\n" ] } ], "source": [ "start = time()\n", "with CuTensorNetHandle() as libhandle:\n", - " fixed_fidelity_mps = simulate(libhandle, circuit, ContractionAlg.MPSxMPO, k=8, optim_delta=1e-15, chi=16)\n", + " config = ConfigMPS(k=8, optim_delta=1e-15, chi=16)\n", + " fixed_fidelity_mps = simulate(libhandle, circuit, ContractionAlg.MPSxMPO, config)\n", "end = time()\n", "print(\"MPSxMPO, custom parameters\")\n", "print(f\"\\tTime taken: {round(end-start,2)} seconds\")\n", @@ -954,7 +960,7 @@ "id": "7607b5bd-f332-4d97-963b-2a163d3fb194", "metadata": {}, "source": [ - "You can request a verbose log to be produced during simulation, by assigning the `loglevel` argument when calling `simulate`. Currently, two log levels are supported (other than default, which is silent): \n", + "You can request a verbose log to be produced during simulation, by assigning the `loglevel` argument when creating a `ConfigMPS` instance. Currently, two log levels are supported (other than default, which is silent): \n", "- `logging.INFO` will print information about progress percent, memory currently occupied by the MPS and current fidelity. Additionally, some high level information of the current stage of the simulation is provided, such as when `MPSxMPO` is applying optimisation sweeps.\n", "- `logging.DEBUG` provides all of the messages from the loglevel above plus detailed information of the current operation being carried out and the values of important variables.\n", "\n", @@ -970,7 +976,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 21, @@ -997,10 +1003,6 @@ "execution_count": 22, "id": "318073fc-2ef4-492e-8c5a-1ba1ba0b7733", "metadata": { - "collapsed": true, - "jupyter": { - "outputs_hidden": true - }, "tags": [] }, "outputs": [ @@ -1008,1090 +1010,1097 @@ "name": "stderr", "output_type": "stream", "text": [ - "[14:01:12] Simulation (INFO) - Ordering the gates in the circuit to reduce canonicalisation overhead.\n", - "[14:01:12] Simulation (INFO) - Running simulation...\n", - "[14:01:12] Simulation (INFO) - Progress... 0%\n", - "[14:01:12] Simulation (INFO) - Progress... 0%\n", - "[14:01:12] Simulation (INFO) - Progress... 0%\n", - "[14:01:12] Simulation (INFO) - Progress... 0%\n", - "[14:01:12] Simulation (INFO) - Progress... 0%\n", - "[14:01:12] Simulation (INFO) - Progress... 0%\n", - "[14:01:12] Simulation (INFO) - Progress... 1%\n", - "[14:01:12] Simulation (INFO) - Progress... 1%\n", - "[14:01:12] Simulation (INFO) - Progress... 1%\n", - "[14:01:12] Simulation (INFO) - Progress... 1%\n", - "[14:01:12] Simulation (INFO) - Progress... 1%\n", - "[14:01:12] Simulation (INFO) - Progress... 1%\n", - "[14:01:12] Simulation (INFO) - Progress... 2%\n", - "[14:01:12] Simulation (INFO) - Progress... 2%\n", - "[14:01:12] Simulation (INFO) - Progress... 2%\n", - "[14:01:12] Simulation (INFO) - Progress... 2%\n", - "[14:01:12] Simulation (INFO) - Progress... 2%\n", - "[14:01:12] Simulation (INFO) - Progress... 2%\n", - "[14:01:12] Simulation (INFO) - Progress... 3%\n", - "[14:01:12] Simulation (INFO) - Progress... 3%\n", - "[14:01:12] MPS (INFO) - MPS size (MiB)=0.00067138671875\n", - "[14:01:12] MPS (INFO) - MPS fidelity=1.0\n", - "[14:01:12] Simulation (INFO) - Progress... 3%\n", - "[14:01:12] Simulation (INFO) - Progress... 3%\n", - "[14:01:12] Simulation (INFO) - Progress... 3%\n", - "[14:01:12] Simulation (INFO) - Progress... 3%\n", - "[14:01:12] MPS (INFO) - MPS size (MiB)=0.00067138671875\n", - "[14:01:12] MPS (INFO) - MPS fidelity=0.9990283071344602\n", - "[14:01:12] Simulation (INFO) - Progress... 4%\n", - "[14:01:12] Simulation (INFO) - Progress... 4%\n", - "[14:01:12] Simulation (INFO) - Progress... 4%\n", - "[14:01:12] MPS (INFO) - MPS size (MiB)=0.000762939453125\n", - "[14:01:12] MPS (INFO) - MPS fidelity=0.9990283071344604\n", - "[14:01:12] Simulation (INFO) - Progress... 4%\n", - "[14:01:12] Simulation (INFO) - Progress... 4%\n", - "[14:01:12] Simulation (INFO) - Progress... 4%\n", - "[14:01:12] MPS (INFO) - MPS size (MiB)=0.000762939453125\n", - "[14:01:12] MPS (INFO) - MPS fidelity=0.9990283071344602\n", - "[14:01:12] Simulation (INFO) - Progress... 5%\n", - "[14:01:12] Simulation (INFO) - Progress... 5%\n", - "[14:01:12] Simulation (INFO) - Progress... 5%\n", - "[14:01:12] Simulation (INFO) - Progress... 5%\n", - "[14:01:12] MPS (INFO) - MPS size (MiB)=0.000823974609375\n", - "[14:01:12] MPS (INFO) - MPS fidelity=0.9990283071344602\n", - "[14:01:12] Simulation (INFO) - Progress... 5%\n", - "[14:01:12] Simulation (INFO) - Progress... 5%\n", - "[14:01:12] Simulation (INFO) - Progress... 6%\n", - "[14:01:12] MPS (INFO) - MPS size (MiB)=0.00091552734375\n", - "[14:01:12] MPS (INFO) - MPS fidelity=0.9990283071344602\n", - "[14:01:12] Simulation (INFO) - Progress... 6%\n", - "[14:01:12] Simulation (INFO) - Progress... 6%\n", - "[14:01:12] Simulation (INFO) - Progress... 6%\n", - "[14:01:12] MPS (INFO) - MPS size (MiB)=0.00103759765625\n", - "[14:01:12] MPS (INFO) - MPS fidelity=0.9990283071344602\n", - "[14:01:12] Simulation (INFO) - Progress... 6%\n", - "[14:01:12] Simulation (INFO) - Progress... 6%\n", - "[14:01:12] Simulation (INFO) - Progress... 7%\n", - "[14:01:12] MPS (INFO) - MPS size (MiB)=0.00128173828125\n", - "[14:01:12] MPS (INFO) - MPS fidelity=0.9990283071344602\n", - "[14:01:12] Simulation (INFO) - Progress... 7%\n", - "[14:01:12] Simulation (INFO) - Progress... 7%\n", - "[14:01:12] Simulation (INFO) - Progress... 7%\n", - "[14:01:12] MPS (INFO) - Applying variational optimisation.\n", - "[14:01:12] MPS (INFO) - Fidelity before optimisation=0.9990283071344602\n", - "[14:01:12] MPS (INFO) - Doing another optimisation sweep...\n", - "[14:01:12] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9997023479978765\n", - "[14:01:12] MPS (INFO) - Doing another optimisation sweep...\n", - "[14:01:12] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9997024059075587\n", - "[14:01:12] MPS (INFO) - Final fidelity after optimisation=0.9997024059075587\n", - "[14:01:12] MPS (INFO) - MPS size (MiB)=0.00128173828125\n", - "[14:01:12] MPS (INFO) - MPS fidelity=0.9997024059075589\n", - "[14:01:12] Simulation (INFO) - Progress... 7%\n", - "[14:01:12] Simulation (INFO) - Progress... 7%\n", - "[14:01:12] Simulation (INFO) - Progress... 8%\n", - "[14:01:12] Simulation (INFO) - Progress... 8%\n", - "[14:01:12] MPS (INFO) - MPS size (MiB)=0.0013427734375\n", - "[14:01:12] MPS (INFO) - MPS fidelity=0.9997024059075589\n", - "[14:01:12] Simulation (INFO) - Progress... 8%\n", - "[14:01:12] Simulation (INFO) - Progress... 8%\n", - "[14:01:12] Simulation (INFO) - Progress... 8%\n", - "[14:01:12] MPS (INFO) - MPS size (MiB)=0.00146484375\n", - "[14:01:12] MPS (INFO) - MPS fidelity=0.9997024059075589\n", - "[14:01:12] Simulation (INFO) - Progress... 8%\n", - "[14:01:12] Simulation (INFO) - Progress... 9%\n", - "[14:01:12] Simulation (INFO) - Progress... 9%\n", - "[14:01:12] MPS (INFO) - MPS size (MiB)=0.001708984375\n", - "[14:01:12] MPS (INFO) - MPS fidelity=0.9997024059075589\n", - "[14:01:12] Simulation (INFO) - Progress... 9%\n", - "[14:01:12] Simulation (INFO) - Progress... 9%\n", - "[14:01:12] Simulation (INFO) - Progress... 9%\n", - "[14:01:12] MPS (INFO) - MPS size (MiB)=0.0020751953125\n", - "[14:01:12] MPS (INFO) - MPS fidelity=0.9997024059075589\n", - "[14:01:12] Simulation (INFO) - Progress... 10%\n", - "[14:01:12] Simulation (INFO) - Progress... 10%\n", - "[14:01:12] Simulation (INFO) - Progress... 10%\n", - "[14:01:12] MPS (INFO) - MPS size (MiB)=0.0025634765625\n", - "[14:01:12] MPS (INFO) - MPS fidelity=0.9997024059075589\n", - "[14:01:12] Simulation (INFO) - Progress... 10%\n", - "[14:01:12] Simulation (INFO) - Progress... 10%\n", - "[14:01:12] Simulation (INFO) - Progress... 10%\n", - "[14:01:12] MPS (INFO) - MPS size (MiB)=0.0025634765625\n", - "[14:01:12] MPS (INFO) - MPS fidelity=0.9997024059075589\n", - "[14:01:12] Simulation (INFO) - Progress... 11%\n", - "[14:01:12] Simulation (INFO) - Progress... 11%\n", - "[14:01:12] Simulation (INFO) - Progress... 11%\n", - "[14:01:12] MPS (INFO) - MPS size (MiB)=0.0025634765625\n", - "[14:01:12] MPS (INFO) - MPS fidelity=0.9997024059075589\n", - "[14:01:12] Simulation (INFO) - Progress... 11%\n", - "[14:01:12] Simulation (INFO) - Progress... 11%\n", - "[14:01:12] Simulation (INFO) - Progress... 11%\n", - "[14:01:12] Simulation (INFO) - Progress... 12%\n", - "[14:01:12] MPS (INFO) - MPS size (MiB)=0.00262451171875\n", - "[14:01:12] MPS (INFO) - MPS fidelity=0.9997024059075589\n", - "[14:01:12] Simulation (INFO) - Progress... 12%\n", - "[14:01:12] Simulation (INFO) - Progress... 12%\n", - "[14:01:12] Simulation (INFO) - Progress... 12%\n", - "[14:01:12] MPS (INFO) - MPS size (MiB)=0.00274658203125\n", - "[14:01:12] MPS (INFO) - MPS fidelity=0.9997024059075589\n", - "[14:01:12] Simulation (INFO) - Progress... 12%\n", - "[14:01:12] Simulation (INFO) - Progress... 12%\n", - "[14:01:12] Simulation (INFO) - Progress... 13%\n", - "[14:01:12] MPS (INFO) - MPS size (MiB)=0.00299072265625\n", - "[14:01:12] MPS (INFO) - MPS fidelity=0.9997024059075589\n", - "[14:01:12] Simulation (INFO) - Progress... 13%\n", - "[14:01:12] Simulation (INFO) - Progress... 13%\n", - "[14:01:12] Simulation (INFO) - Progress... 13%\n", - "[14:01:12] MPS (INFO) - MPS size (MiB)=0.00347900390625\n", - "[14:01:12] MPS (INFO) - MPS fidelity=0.9997024059075589\n", - "[14:01:12] Simulation (INFO) - Progress... 13%\n", - "[14:01:12] Simulation (INFO) - Progress... 13%\n", - "[14:01:12] Simulation (INFO) - Progress... 14%\n", - "[14:01:12] MPS (INFO) - MPS size (MiB)=0.00396728515625\n", - "[14:01:12] MPS (INFO) - MPS fidelity=0.9993396700769984\n", - "[14:01:12] Simulation (INFO) - Progress... 14%\n", - "[14:01:12] Simulation (INFO) - Progress... 14%\n", - "[14:01:12] Simulation (INFO) - Progress... 14%\n", - "[14:01:12] MPS (INFO) - MPS size (MiB)=0.0048828125\n", - "[14:01:12] MPS (INFO) - MPS fidelity=0.9984418366672726\n", - "[14:01:12] Simulation (INFO) - Progress... 14%\n", - "[14:01:12] Simulation (INFO) - Progress... 14%\n", - "[14:01:12] Simulation (INFO) - Progress... 15%\n", - "[14:01:12] MPS (INFO) - MPS size (MiB)=0.005889892578125\n", - "[14:01:12] MPS (INFO) - MPS fidelity=0.9978683217610371\n", - "[14:01:12] Simulation (INFO) - Progress... 15%\n", - "[14:01:12] Simulation (INFO) - Progress... 15%\n", - "[14:01:12] Simulation (INFO) - Progress... 15%\n", - "[14:01:12] MPS (INFO) - MPS size (MiB)=0.005889892578125\n", - "[14:01:12] MPS (INFO) - MPS fidelity=0.9978683217610371\n", - "[14:01:12] Simulation (INFO) - Progress... 15%\n", - "[14:01:12] Simulation (INFO) - Progress... 15%\n", - "[14:01:12] Simulation (INFO) - Progress... 16%\n", - "[14:01:12] MPS (INFO) - Applying variational optimisation.\n", - "[14:01:12] MPS (INFO) - Fidelity before optimisation=0.9978683217610371\n", - "[14:01:12] MPS (INFO) - Doing another optimisation sweep...\n", - "[14:01:12] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.99809024854532\n", - "[14:01:12] MPS (INFO) - Doing another optimisation sweep...\n", - "[14:01:12] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9981132810448355\n", - "[14:01:12] MPS (INFO) - Doing another optimisation sweep...\n", - "[14:01:12] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9981209535027262\n", - "[14:01:12] MPS (INFO) - Final fidelity after optimisation=0.9981209535027262\n", - "[14:01:12] MPS (INFO) - MPS size (MiB)=0.005889892578125\n", - "[14:01:12] MPS (INFO) - MPS fidelity=0.9981209535027262\n", - "[14:01:12] Simulation (INFO) - Progress... 16%\n", - "[14:01:12] Simulation (INFO) - Progress... 16%\n", - "[14:01:12] Simulation (INFO) - Progress... 16%\n", - "[14:01:12] Simulation (INFO) - Progress... 16%\n", - "[14:01:12] MPS (INFO) - MPS size (MiB)=0.005950927734375\n", - "[14:01:12] MPS (INFO) - MPS fidelity=0.9981209535027262\n", - "[14:01:12] Simulation (INFO) - Progress... 16%\n", - "[14:01:12] Simulation (INFO) - Progress... 17%\n", - "[14:01:12] Simulation (INFO) - Progress... 17%\n", - "[14:01:12] MPS (INFO) - MPS size (MiB)=0.006072998046875\n", - "[14:01:12] MPS (INFO) - MPS fidelity=0.9981209535027262\n", - "[14:01:12] Simulation (INFO) - Progress... 17%\n", - "[14:01:12] Simulation (INFO) - Progress... 17%\n", - "[14:01:12] Simulation (INFO) - Progress... 17%\n", - "[14:01:12] MPS (INFO) - MPS size (MiB)=0.006317138671875\n", - "[14:01:12] MPS (INFO) - MPS fidelity=0.9981209535027262\n", - "[14:01:12] Simulation (INFO) - Progress... 17%\n", - "[14:01:12] Simulation (INFO) - Progress... 18%\n", - "[14:01:12] Simulation (INFO) - Progress... 18%\n", - "[14:01:12] MPS (INFO) - MPS size (MiB)=0.006805419921875\n", - "[14:01:12] MPS (INFO) - MPS fidelity=0.9981209535027261\n", - "[14:01:12] Simulation (INFO) - Progress... 18%\n", - "[14:01:12] Simulation (INFO) - Progress... 18%\n", - "[14:01:12] Simulation (INFO) - Progress... 18%\n", - "[14:01:12] MPS (INFO) - MPS size (MiB)=0.007049560546875\n", - "[14:01:12] MPS (INFO) - MPS fidelity=0.997423409781103\n", - "[14:01:12] Simulation (INFO) - Progress... 18%\n", - "[14:01:12] Simulation (INFO) - Progress... 19%\n", - "[14:01:12] Simulation (INFO) - Progress... 19%\n", - "[14:01:12] MPS (INFO) - MPS size (MiB)=0.008392333984375\n", - "[14:01:12] MPS (INFO) - MPS fidelity=0.997423409781103\n", - "[14:01:12] Simulation (INFO) - Progress... 19%\n", - "[14:01:12] Simulation (INFO) - Progress... 19%\n", - "[14:01:12] Simulation (INFO) - Progress... 19%\n", - "[14:01:12] MPS (INFO) - MPS size (MiB)=0.009765625\n", - "[14:01:12] MPS (INFO) - MPS fidelity=0.9969717765474623\n", - "[14:01:12] Simulation (INFO) - Progress... 20%\n", - "[14:01:12] Simulation (INFO) - Progress... 20%\n", - "[14:01:12] Simulation (INFO) - Progress... 20%\n", - "[14:01:12] MPS (INFO) - MPS size (MiB)=0.01123046875\n", - "[14:01:12] MPS (INFO) - MPS fidelity=0.996255622087102\n", - "[14:01:12] Simulation (INFO) - Progress... 20%\n", - "[14:01:12] Simulation (INFO) - Progress... 20%\n", - "[14:01:12] Simulation (INFO) - Progress... 20%\n", - "[14:01:12] MPS (INFO) - MPS size (MiB)=0.01165771484375\n", - "[14:01:12] MPS (INFO) - MPS fidelity=0.996255622087102\n", - "[14:01:12] Simulation (INFO) - Progress... 21%\n", - "[14:01:12] Simulation (INFO) - Progress... 21%\n", - "[14:01:12] Simulation (INFO) - Progress... 21%\n", - "[14:01:12] MPS (INFO) - MPS size (MiB)=0.01165771484375\n", - "[14:01:12] MPS (INFO) - MPS fidelity=0.9962556220871019\n", - "[14:01:12] Simulation (INFO) - Progress... 21%\n", - "[14:01:12] Simulation (INFO) - Progress... 21%\n", - "[14:01:12] Simulation (INFO) - Progress... 21%\n", - "[14:01:12] MPS (INFO) - MPS size (MiB)=0.01165771484375\n", - "[14:01:12] MPS (INFO) - MPS fidelity=0.9962556220871019\n", - "[14:01:12] Simulation (INFO) - Progress... 22%\n", - "[14:01:12] Simulation (INFO) - Progress... 22%\n", - "[14:01:12] Simulation (INFO) - Progress... 22%\n", - "[14:01:12] Simulation (INFO) - Progress... 22%\n", - "[14:01:12] MPS (INFO) - MPS size (MiB)=0.01171875\n", - "[14:01:12] MPS (INFO) - MPS fidelity=0.9962556220871019\n", - "[14:01:12] Simulation (INFO) - Progress... 22%\n", - "[14:01:12] Simulation (INFO) - Progress... 22%\n", - "[14:01:12] Simulation (INFO) - Progress... 23%\n", - "[14:01:12] MPS (INFO) - MPS size (MiB)=0.0118408203125\n", - "[14:01:12] MPS (INFO) - MPS fidelity=0.9962556220871019\n", - "[14:01:12] Simulation (INFO) - Progress... 23%\n", - "[14:01:13] Simulation (INFO) - Progress... 23%\n", - "[14:01:13] Simulation (INFO) - Progress... 23%\n", - "[14:01:13] MPS (INFO) - MPS size (MiB)=0.0120849609375\n", - "[14:01:13] MPS (INFO) - MPS fidelity=0.9962556220871019\n", - "[14:01:13] Simulation (INFO) - Progress... 23%\n", - "[14:01:13] Simulation (INFO) - Progress... 23%\n", - "[14:01:13] Simulation (INFO) - Progress... 24%\n", - "[14:01:13] MPS (INFO) - MPS size (MiB)=0.0125732421875\n", - "[14:01:13] MPS (INFO) - MPS fidelity=0.9962556220871019\n", - "[14:01:13] Simulation (INFO) - Progress... 24%\n", - "[14:01:13] Simulation (INFO) - Progress... 24%\n", - "[14:01:13] Simulation (INFO) - Progress... 24%\n", - "[14:01:13] MPS (INFO) - MPS size (MiB)=0.0130615234375\n", - "[14:01:13] MPS (INFO) - MPS fidelity=0.9955811734143832\n", - "[14:01:13] Simulation (INFO) - Progress... 24%\n", - "[14:01:13] Simulation (INFO) - Progress... 24%\n", - "[14:01:13] Simulation (INFO) - Progress... 25%\n", - "[14:01:13] MPS (INFO) - MPS size (MiB)=0.01373291015625\n", - "[14:01:13] MPS (INFO) - MPS fidelity=0.9954580715406015\n", - "[14:01:13] Simulation (INFO) - Progress... 25%\n", - "[14:01:13] Simulation (INFO) - Progress... 25%\n", - "[14:01:13] Simulation (INFO) - Progress... 25%\n", - "[14:01:13] MPS (INFO) - MPS size (MiB)=0.0150146484375\n", - "[14:01:13] MPS (INFO) - MPS fidelity=0.9954129745430442\n", - "[14:01:13] Simulation (INFO) - Progress... 25%\n", - "[14:01:13] Simulation (INFO) - Progress... 25%\n", - "[14:01:13] Simulation (INFO) - Progress... 26%\n", - "[14:01:13] MPS (INFO) - MPS size (MiB)=0.01708984375\n", - "[14:01:13] MPS (INFO) - MPS fidelity=0.9946104246997917\n", - "[14:01:13] Simulation (INFO) - Progress... 26%\n", - "[14:01:13] Simulation (INFO) - Progress... 26%\n", - "[14:01:13] Simulation (INFO) - Progress... 26%\n", - "[14:01:13] MPS (INFO) - MPS size (MiB)=0.0211181640625\n", - "[14:01:13] MPS (INFO) - MPS fidelity=0.993986081692407\n", - "[14:01:13] Simulation (INFO) - Progress... 26%\n", - "[14:01:13] Simulation (INFO) - Progress... 26%\n", - "[14:01:13] Simulation (INFO) - Progress... 27%\n", - "[14:01:13] MPS (INFO) - MPS size (MiB)=0.02392578125\n", - "[14:01:13] MPS (INFO) - MPS fidelity=0.9932754206084036\n", - "[14:01:13] Simulation (INFO) - Progress... 27%\n", - "[14:01:13] Simulation (INFO) - Progress... 27%\n", - "[14:01:13] Simulation (INFO) - Progress... 27%\n", - "[14:01:13] MPS (INFO) - MPS size (MiB)=0.02392578125\n", - "[14:01:13] MPS (INFO) - MPS fidelity=0.9932754206084036\n", - "[14:01:13] Simulation (INFO) - Progress... 27%\n", - "[14:01:13] Simulation (INFO) - Progress... 27%\n", - "[14:01:13] Simulation (INFO) - Progress... 28%\n", - "[14:01:13] MPS (INFO) - MPS size (MiB)=0.02392578125\n", - "[14:01:13] MPS (INFO) - MPS fidelity=0.9932754206084036\n", - "[14:01:13] Simulation (INFO) - Progress... 28%\n", - "[14:01:13] Simulation (INFO) - Progress... 28%\n", - "[14:01:13] Simulation (INFO) - Progress... 28%\n", - "[14:01:13] MPS (INFO) - Applying variational optimisation.\n", - "[14:01:13] MPS (INFO) - Fidelity before optimisation=0.9932754206084036\n", - "[14:01:13] MPS (INFO) - Doing another optimisation sweep...\n", - "[14:01:13] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9948146155456611\n", - "[14:01:13] MPS (INFO) - Doing another optimisation sweep...\n", - "[14:01:13] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9948360895424706\n", - "[14:01:13] MPS (INFO) - Doing another optimisation sweep...\n", - "[14:01:13] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9948431533380159\n", - "[14:01:13] MPS (INFO) - Final fidelity after optimisation=0.9948431533380159\n", - "[14:01:13] MPS (INFO) - MPS size (MiB)=0.02392578125\n", - "[14:01:13] MPS (INFO) - MPS fidelity=0.9948431533380159\n", - "[14:01:13] Simulation (INFO) - Progress... 28%\n", - "[14:01:13] Simulation (INFO) - Progress... 28%\n", - "[14:01:13] Simulation (INFO) - Progress... 29%\n", - "[14:01:13] Simulation (INFO) - Progress... 29%\n", - "[14:01:13] MPS (INFO) - MPS size (MiB)=0.02398681640625\n", - "[14:01:13] MPS (INFO) - MPS fidelity=0.9948431533380159\n", - "[14:01:13] Simulation (INFO) - Progress... 29%\n", - "[14:01:13] Simulation (INFO) - Progress... 29%\n", - "[14:01:13] Simulation (INFO) - Progress... 29%\n", - "[14:01:13] MPS (INFO) - MPS size (MiB)=0.02410888671875\n", - "[14:01:13] MPS (INFO) - MPS fidelity=0.9948431533380157\n", - "[14:01:13] Simulation (INFO) - Progress... 30%\n", - "[14:01:13] Simulation (INFO) - Progress... 30%\n", - "[14:01:13] Simulation (INFO) - Progress... 30%\n", - "[14:01:13] MPS (INFO) - MPS size (MiB)=0.02435302734375\n", - "[14:01:13] MPS (INFO) - MPS fidelity=0.9948431533380157\n", - "[14:01:13] Simulation (INFO) - Progress... 30%\n", - "[14:01:13] Simulation (INFO) - Progress... 30%\n", - "[14:01:13] Simulation (INFO) - Progress... 30%\n", - "[14:01:13] MPS (INFO) - MPS size (MiB)=0.02484130859375\n", - "[14:01:13] MPS (INFO) - MPS fidelity=0.9948431533380157\n", - "[14:01:13] Simulation (INFO) - Progress... 31%\n", - "[14:01:13] Simulation (INFO) - Progress... 31%\n", - "[14:01:13] Simulation (INFO) - Progress... 31%\n", - "[14:01:13] MPS (INFO) - MPS size (MiB)=0.02484130859375\n", - "[14:01:13] MPS (INFO) - MPS fidelity=0.9948396534426794\n", - "[14:01:13] Simulation (INFO) - Progress... 31%\n", - "[14:01:13] Simulation (INFO) - Progress... 31%\n", - "[14:01:13] Simulation (INFO) - Progress... 31%\n", - "[14:01:13] MPS (INFO) - MPS size (MiB)=0.0257568359375\n", - "[14:01:13] MPS (INFO) - MPS fidelity=0.9946407082338863\n", - "[14:01:13] Simulation (INFO) - Progress... 32%\n", - "[14:01:13] Simulation (INFO) - Progress... 32%\n", - "[14:01:13] Simulation (INFO) - Progress... 32%\n", - "[14:01:13] MPS (INFO) - MPS size (MiB)=0.026947021484375\n", - "[14:01:13] MPS (INFO) - MPS fidelity=0.9939915775333915\n", - "[14:01:13] Simulation (INFO) - Progress... 32%\n", - "[14:01:13] Simulation (INFO) - Progress... 32%\n", - "[14:01:13] Simulation (INFO) - Progress... 32%\n", - "[14:01:13] MPS (INFO) - MPS size (MiB)=0.02850341796875\n", - "[14:01:13] MPS (INFO) - MPS fidelity=0.9930726984365036\n", - "[14:01:13] Simulation (INFO) - Progress... 33%\n", - "[14:01:13] Simulation (INFO) - Progress... 33%\n", - "[14:01:13] Simulation (INFO) - Progress... 33%\n", - "[14:01:13] MPS (INFO) - MPS size (MiB)=0.029144287109375\n", - "[14:01:13] MPS (INFO) - MPS fidelity=0.9925894686689639\n", - "[14:01:13] Simulation (INFO) - Progress... 33%\n", - "[14:01:13] Simulation (INFO) - Progress... 33%\n", - "[14:01:13] Simulation (INFO) - Progress... 33%\n", - "[14:01:13] MPS (INFO) - MPS size (MiB)=0.030609130859375\n", - "[14:01:13] MPS (INFO) - MPS fidelity=0.9922594965497078\n", - "[14:01:13] Simulation (INFO) - Progress... 34%\n", - "[14:01:13] Simulation (INFO) - Progress... 34%\n", - "[14:01:13] Simulation (INFO) - Progress... 34%\n", - "[14:01:13] MPS (INFO) - MPS size (MiB)=0.036590576171875\n", - "[14:01:13] MPS (INFO) - MPS fidelity=0.9917746740161947\n", - "[14:01:13] Simulation (INFO) - Progress... 34%\n", - "[14:01:13] Simulation (INFO) - Progress... 34%\n", - "[14:01:13] Simulation (INFO) - Progress... 34%\n", - "[14:01:13] MPS (INFO) - MPS size (MiB)=0.038421630859375\n", - "[14:01:13] MPS (INFO) - MPS fidelity=0.9917746740161949\n", - "[14:01:13] Simulation (INFO) - Progress... 35%\n", - "[14:01:13] Simulation (INFO) - Progress... 35%\n", - "[14:01:13] Simulation (INFO) - Progress... 35%\n", - "[14:01:13] MPS (INFO) - MPS size (MiB)=0.038421630859375\n", - "[14:01:13] MPS (INFO) - MPS fidelity=0.9917746740161948\n", - "[14:01:13] Simulation (INFO) - Progress... 35%\n", - "[14:01:13] Simulation (INFO) - Progress... 35%\n", - "[14:01:13] Simulation (INFO) - Progress... 35%\n", - "[14:01:13] MPS (INFO) - MPS size (MiB)=0.038421630859375\n", - "[14:01:13] MPS (INFO) - MPS fidelity=0.9917746740161948\n", - "[14:01:13] Simulation (INFO) - Progress... 36%\n", - "[14:01:13] Simulation (INFO) - Progress... 36%\n", - "[14:01:13] Simulation (INFO) - Progress... 36%\n", - "[14:01:13] MPS (INFO) - MPS size (MiB)=0.038421630859375\n", - "[14:01:13] MPS (INFO) - MPS fidelity=0.9917746740161948\n", - "[14:01:13] Simulation (INFO) - Progress... 36%\n", - "[14:01:13] Simulation (INFO) - Progress... 36%\n", - "[14:01:13] Simulation (INFO) - Progress... 36%\n", - "[14:01:13] Simulation (INFO) - Progress... 37%\n", - "[14:01:13] MPS (INFO) - MPS size (MiB)=0.038482666015625\n", - "[14:01:13] MPS (INFO) - MPS fidelity=0.9917746740161948\n", - "[14:01:13] Simulation (INFO) - Progress... 37%\n", - "[14:01:13] Simulation (INFO) - Progress... 37%\n", - "[14:01:13] Simulation (INFO) - Progress... 37%\n", - "[14:01:13] MPS (INFO) - MPS size (MiB)=0.038604736328125\n", - "[14:01:13] MPS (INFO) - MPS fidelity=0.9917746740161948\n", - "[14:01:13] Simulation (INFO) - Progress... 37%\n", - "[14:01:13] Simulation (INFO) - Progress... 37%\n", - "[14:01:13] Simulation (INFO) - Progress... 38%\n", - "[14:01:13] MPS (INFO) - MPS size (MiB)=0.038848876953125\n", - "[14:01:13] MPS (INFO) - MPS fidelity=0.9917746740161948\n", - "[14:01:13] Simulation (INFO) - Progress... 38%\n", - "[14:01:13] Simulation (INFO) - Progress... 38%\n", - "[14:01:13] Simulation (INFO) - Progress... 38%\n", - "[14:01:13] MPS (INFO) - MPS size (MiB)=0.039337158203125\n", - "[14:01:13] MPS (INFO) - MPS fidelity=0.9917746740161948\n", - "[14:01:13] Simulation (INFO) - Progress... 38%\n", - "[14:01:13] Simulation (INFO) - Progress... 38%\n", - "[14:01:13] Simulation (INFO) - Progress... 39%\n", - "[14:01:13] MPS (INFO) - MPS size (MiB)=0.040069580078125\n", - "[14:01:13] MPS (INFO) - MPS fidelity=0.9914013449577964\n", - "[14:01:13] Simulation (INFO) - Progress... 39%\n", - "[14:01:13] Simulation (INFO) - Progress... 39%\n", - "[14:01:13] Simulation (INFO) - Progress... 39%\n", - "[14:01:13] MPS (INFO) - MPS size (MiB)=0.04107666015625\n", - "[14:01:13] MPS (INFO) - MPS fidelity=0.9909200464032397\n", - "[14:01:13] Simulation (INFO) - Progress... 39%\n", - "[14:01:13] Simulation (INFO) - Progress... 40%\n", - "[14:01:13] Simulation (INFO) - Progress... 40%\n", - "[14:01:13] MPS (INFO) - MPS size (MiB)=0.04278564453125\n", - "[14:01:13] MPS (INFO) - MPS fidelity=0.9909200464032397\n", - "[14:01:13] Simulation (INFO) - Progress... 40%\n", - "[14:01:13] Simulation (INFO) - Progress... 40%\n", - "[14:01:13] Simulation (INFO) - Progress... 40%\n", - "[14:01:13] MPS (INFO) - MPS size (MiB)=0.045379638671875\n", - "[14:01:13] MPS (INFO) - MPS fidelity=0.9904815074905157\n", - "[14:01:13] Simulation (INFO) - Progress... 40%\n", - "[14:01:13] Simulation (INFO) - Progress... 41%\n", - "[14:01:13] Simulation (INFO) - Progress... 41%\n", - "[14:01:13] MPS (INFO) - MPS size (MiB)=0.049224853515625\n", - "[14:01:13] MPS (INFO) - MPS fidelity=0.9895385170678038\n", - "[14:01:13] Simulation (INFO) - Progress... 41%\n", - "[14:01:13] Simulation (INFO) - Progress... 41%\n", - "[14:01:13] Simulation (INFO) - Progress... 41%\n", - "[14:01:13] MPS (INFO) - MPS size (MiB)=0.054351806640625\n", - "[14:01:13] MPS (INFO) - MPS fidelity=0.9893005128956965\n", - "[14:01:13] Simulation (INFO) - Progress... 41%\n", - "[14:01:13] Simulation (INFO) - Progress... 42%\n", - "[14:01:13] Simulation (INFO) - Progress... 42%\n", - "[14:01:13] MPS (INFO) - MPS size (MiB)=0.059844970703125\n", - "[14:01:13] MPS (INFO) - MPS fidelity=0.98888820372519\n", - "[14:01:13] Simulation (INFO) - Progress... 42%\n", - "[14:01:13] Simulation (INFO) - Progress... 42%\n", - "[14:01:13] Simulation (INFO) - Progress... 42%\n", - "[14:01:13] MPS (INFO) - MPS size (MiB)=0.068878173828125\n", - "[14:01:13] MPS (INFO) - MPS fidelity=0.9879401995661465\n", - "[14:01:13] Simulation (INFO) - Progress... 42%\n", - "[14:01:13] Simulation (INFO) - Progress... 43%\n", - "[14:01:13] Simulation (INFO) - Progress... 43%\n", - "[14:01:13] MPS (INFO) - MPS size (MiB)=0.075836181640625\n", - "[14:01:13] MPS (INFO) - MPS fidelity=0.9870682591461779\n", - "[14:01:13] Simulation (INFO) - Progress... 43%\n", - "[14:01:13] Simulation (INFO) - Progress... 43%\n", - "[14:01:13] Simulation (INFO) - Progress... 43%\n", - "[14:01:14] MPS (INFO) - MPS size (MiB)=0.075836181640625\n", - "[14:01:14] MPS (INFO) - MPS fidelity=0.9870682591461779\n", - "[14:01:14] Simulation (INFO) - Progress... 43%\n", - "[14:01:14] Simulation (INFO) - Progress... 44%\n", - "[14:01:14] Simulation (INFO) - Progress... 44%\n", - "[14:01:14] MPS (INFO) - MPS size (MiB)=0.075836181640625\n", - "[14:01:14] MPS (INFO) - MPS fidelity=0.9870682591461779\n", - "[14:01:14] Simulation (INFO) - Progress... 44%\n", - "[14:01:14] Simulation (INFO) - Progress... 44%\n", - "[14:01:14] Simulation (INFO) - Progress... 44%\n", - "[14:01:14] MPS (INFO) - MPS size (MiB)=0.075836181640625\n", - "[14:01:14] MPS (INFO) - MPS fidelity=0.9870682591461779\n", - "[14:01:14] Simulation (INFO) - Progress... 44%\n", - "[14:01:14] Simulation (INFO) - Progress... 45%\n", - "[14:01:14] Simulation (INFO) - Progress... 45%\n", - "[14:01:14] MPS (INFO) - Applying variational optimisation.\n", - "[14:01:14] MPS (INFO) - Fidelity before optimisation=0.9870682591461779\n", - "[14:01:14] MPS (INFO) - Doing another optimisation sweep...\n", - "[14:01:14] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9885243877420532\n", - "[14:01:14] MPS (INFO) - Doing another optimisation sweep...\n", - "[14:01:14] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9885675777883345\n", - "[14:01:14] MPS (INFO) - Doing another optimisation sweep...\n", - "[14:01:14] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9885807735732146\n", - "[14:01:14] MPS (INFO) - Final fidelity after optimisation=0.9885807735732146\n", - "[14:01:14] MPS (INFO) - MPS size (MiB)=0.075836181640625\n", - "[14:01:14] MPS (INFO) - MPS fidelity=0.9885807735732146\n", - "[14:01:14] Simulation (INFO) - Progress... 45%\n", - "[14:01:14] Simulation (INFO) - Progress... 45%\n", - "[14:01:14] Simulation (INFO) - Progress... 45%\n", - "[14:01:14] Simulation (INFO) - Progress... 45%\n", - "[14:01:14] MPS (INFO) - MPS size (MiB)=0.075897216796875\n", - "[14:01:14] MPS (INFO) - MPS fidelity=0.9885807735732146\n", - "[14:01:14] Simulation (INFO) - Progress... 46%\n", - "[14:01:14] Simulation (INFO) - Progress... 46%\n", - "[14:01:14] Simulation (INFO) - Progress... 46%\n", - "[14:01:14] Simulation (INFO) - Progress... 46%\n", - "[14:01:14] MPS (INFO) - MPS size (MiB)=0.076019287109375\n", - "[14:01:14] MPS (INFO) - MPS fidelity=0.9885807735732146\n", - "[14:01:14] Simulation (INFO) - Progress... 46%\n", - "[14:01:14] Simulation (INFO) - Progress... 46%\n", - "[14:01:14] Simulation (INFO) - Progress... 47%\n", - "[14:01:14] MPS (INFO) - MPS size (MiB)=0.076019287109375\n", - "[14:01:14] MPS (INFO) - MPS fidelity=0.9885807735732146\n", - "[14:01:14] Simulation (INFO) - Progress... 47%\n", - "[14:01:14] Simulation (INFO) - Progress... 47%\n", - "[14:01:14] Simulation (INFO) - Progress... 47%\n", - "[14:01:14] Simulation (INFO) - Progress... 47%\n", - "[14:01:14] MPS (INFO) - MPS size (MiB)=0.076263427734375\n", - "[14:01:14] MPS (INFO) - MPS fidelity=0.9885807735732146\n", - "[14:01:14] Simulation (INFO) - Progress... 47%\n", - "[14:01:14] Simulation (INFO) - Progress... 48%\n", - "[14:01:14] Simulation (INFO) - Progress... 48%\n", - "[14:01:14] MPS (INFO) - MPS size (MiB)=0.076629638671875\n", - "[14:01:14] MPS (INFO) - MPS fidelity=0.9885807735732145\n", - "[14:01:14] Simulation (INFO) - Progress... 48%\n", - "[14:01:14] Simulation (INFO) - Progress... 48%\n", - "[14:01:14] Simulation (INFO) - Progress... 48%\n", - "[14:01:14] MPS (INFO) - Applying variational optimisation.\n", - "[14:01:14] MPS (INFO) - Fidelity before optimisation=0.9885807735732145\n", - "[14:01:14] MPS (INFO) - Doing another optimisation sweep...\n", - "[14:01:14] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9885807735732146\n", - "[14:01:14] MPS (INFO) - Doing another optimisation sweep...\n", - "[14:01:14] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9885807735732127\n", - "[14:01:14] MPS (INFO) - Final fidelity after optimisation=0.9885807735732127\n", - "[14:01:14] MPS (INFO) - MPS size (MiB)=0.076629638671875\n", - "[14:01:14] MPS (INFO) - MPS fidelity=0.9885807735732127\n", - "[14:01:14] Simulation (INFO) - Progress... 48%\n", - "[14:01:14] Simulation (INFO) - Progress... 49%\n", - "[14:01:14] Simulation (INFO) - Progress... 49%\n", - "[14:01:14] Simulation (INFO) - Progress... 49%\n", - "[14:01:14] MPS (INFO) - MPS size (MiB)=0.077117919921875\n", - "[14:01:14] MPS (INFO) - MPS fidelity=0.9885807735732127\n", - "[14:01:14] Simulation (INFO) - Progress... 49%\n", - "[14:01:14] Simulation (INFO) - Progress... 49%\n", - "[14:01:14] Simulation (INFO) - Progress... 50%\n", - "[14:01:14] MPS (INFO) - MPS size (MiB)=0.077117919921875\n", - "[14:01:14] MPS (INFO) - MPS fidelity=0.9885437435962636\n", - "[14:01:14] Simulation (INFO) - Progress... 50%\n", - "[14:01:14] Simulation (INFO) - Progress... 50%\n", - "[14:01:14] Simulation (INFO) - Progress... 50%\n", - "[14:01:14] MPS (INFO) - MPS size (MiB)=0.077850341796875\n", - "[14:01:14] MPS (INFO) - MPS fidelity=0.9876299149488592\n", - "[14:01:14] Simulation (INFO) - Progress... 50%\n", - "[14:01:14] Simulation (INFO) - Progress... 50%\n", - "[14:01:14] Simulation (INFO) - Progress... 51%\n", - "[14:01:14] MPS (INFO) - MPS size (MiB)=0.079193115234375\n", - "[14:01:14] MPS (INFO) - MPS fidelity=0.9876299149488592\n", - "[14:01:14] Simulation (INFO) - Progress... 51%\n", - "[14:01:14] Simulation (INFO) - Progress... 51%\n", - "[14:01:14] Simulation (INFO) - Progress... 51%\n", - "[14:01:14] MPS (INFO) - MPS size (MiB)=0.080902099609375\n", - "[14:01:14] MPS (INFO) - MPS fidelity=0.9876299149488592\n", - "[14:01:14] Simulation (INFO) - Progress... 51%\n", - "[14:01:14] Simulation (INFO) - Progress... 51%\n", - "[14:01:14] Simulation (INFO) - Progress... 52%\n", - "[14:01:14] MPS (INFO) - MPS size (MiB)=0.083343505859375\n", - "[14:01:14] MPS (INFO) - MPS fidelity=0.9872256262985958\n", - "[14:01:14] Simulation (INFO) - Progress... 52%\n", - "[14:01:14] Simulation (INFO) - Progress... 52%\n", - "[14:01:14] Simulation (INFO) - Progress... 52%\n", - "[14:01:14] MPS (INFO) - MPS size (MiB)=0.08380126953125\n", - "[14:01:14] MPS (INFO) - MPS fidelity=0.9867042570373467\n", - "[14:01:14] Simulation (INFO) - Progress... 52%\n", - "[14:01:14] Simulation (INFO) - Progress... 52%\n", - "[14:01:14] Simulation (INFO) - Progress... 53%\n", - "[14:01:14] MPS (INFO) - MPS size (MiB)=0.08624267578125\n", - "[14:01:14] MPS (INFO) - MPS fidelity=0.9860074263824546\n", - "[14:01:14] Simulation (INFO) - Progress... 53%\n", - "[14:01:14] Simulation (INFO) - Progress... 53%\n", - "[14:01:14] Simulation (INFO) - Progress... 53%\n", - "[14:01:14] MPS (INFO) - MPS size (MiB)=0.08868408203125\n", - "[14:01:14] MPS (INFO) - MPS fidelity=0.9857877466399374\n", - "[14:01:14] Simulation (INFO) - Progress... 53%\n", - "[14:01:14] Simulation (INFO) - Progress... 53%\n", - "[14:01:14] Simulation (INFO) - Progress... 54%\n", - "[14:01:15] MPS (INFO) - MPS size (MiB)=0.09307861328125\n", - "[14:01:15] MPS (INFO) - MPS fidelity=0.9853289590697893\n", - "[14:01:15] Simulation (INFO) - Progress... 54%\n", - "[14:01:15] Simulation (INFO) - Progress... 54%\n", - "[14:01:15] Simulation (INFO) - Progress... 54%\n", - "[14:01:15] MPS (INFO) - MPS size (MiB)=0.09674072265625\n", - "[14:01:15] MPS (INFO) - MPS fidelity=0.9847593868171541\n", - "[14:01:15] Simulation (INFO) - Progress... 54%\n", - "[14:01:15] Simulation (INFO) - Progress... 54%\n", - "[14:01:15] Simulation (INFO) - Progress... 55%\n", - "[14:01:15] MPS (INFO) - MPS size (MiB)=0.10498046875\n", - "[14:01:15] MPS (INFO) - MPS fidelity=0.9839376637463282\n", - "[14:01:15] Simulation (INFO) - Progress... 55%\n", - "[14:01:15] Simulation (INFO) - Progress... 55%\n", - "[14:01:15] Simulation (INFO) - Progress... 55%\n", - "[14:01:15] MPS (INFO) - MPS size (MiB)=0.110107421875\n", - "[14:01:15] MPS (INFO) - MPS fidelity=0.983070631353325\n", - "[14:01:15] Simulation (INFO) - Progress... 55%\n", - "[14:01:15] Simulation (INFO) - Progress... 55%\n", - "[14:01:15] Simulation (INFO) - Progress... 56%\n", - "[14:01:15] MPS (INFO) - MPS size (MiB)=0.12353515625\n", - "[14:01:15] MPS (INFO) - MPS fidelity=0.9820965437215268\n", - "[14:01:15] Simulation (INFO) - Progress... 56%\n", - "[14:01:15] Simulation (INFO) - Progress... 56%\n", - "[14:01:15] Simulation (INFO) - Progress... 56%\n", - "[14:01:15] MPS (INFO) - MPS size (MiB)=0.13287353515625\n", - "[14:01:15] MPS (INFO) - MPS fidelity=0.9813700217282061\n", - "[14:01:15] Simulation (INFO) - Progress... 56%\n", - "[14:01:15] Simulation (INFO) - Progress... 56%\n", - "[14:01:15] Simulation (INFO) - Progress... 57%\n", - "[14:01:15] MPS (INFO) - MPS size (MiB)=0.15484619140625\n", - "[14:01:15] MPS (INFO) - MPS fidelity=0.9806263554164852\n", - "[14:01:15] Simulation (INFO) - Progress... 57%\n", - "[14:01:15] Simulation (INFO) - Progress... 57%\n", - "[14:01:15] Simulation (INFO) - Progress... 57%\n", - "[14:01:15] MPS (INFO) - MPS size (MiB)=0.16436767578125\n", - "[14:01:15] MPS (INFO) - MPS fidelity=0.9796957281177572\n", - "[14:01:15] Simulation (INFO) - Progress... 57%\n", - "[14:01:15] Simulation (INFO) - Progress... 57%\n", - "[14:01:15] Simulation (INFO) - Progress... 58%\n", - "[14:01:15] MPS (INFO) - MPS size (MiB)=0.190460205078125\n", - "[14:01:15] MPS (INFO) - MPS fidelity=0.9787753802493907\n", - "[14:01:15] Simulation (INFO) - Progress... 58%\n", - "[14:01:15] Simulation (INFO) - Progress... 58%\n", - "[14:01:15] Simulation (INFO) - Progress... 58%\n", - "[14:01:15] MPS (INFO) - MPS size (MiB)=0.204498291015625\n", - "[14:01:15] MPS (INFO) - MPS fidelity=0.9779191475648064\n", - "[14:01:15] Simulation (INFO) - Progress... 58%\n", - "[14:01:15] Simulation (INFO) - Progress... 58%\n", - "[14:01:15] Simulation (INFO) - Progress... 59%\n", - "[14:01:15] MPS (INFO) - MPS size (MiB)=0.227935791015625\n", - "[14:01:15] MPS (INFO) - MPS fidelity=0.9770858154529012\n", - "[14:01:15] Simulation (INFO) - Progress... 59%\n", - "[14:01:15] Simulation (INFO) - Progress... 59%\n", - "[14:01:15] Simulation (INFO) - Progress... 59%\n", - "[14:01:15] MPS (INFO) - MPS size (MiB)=0.250579833984375\n", - "[14:01:15] MPS (INFO) - MPS fidelity=0.9763732931498061\n", - "[14:01:15] Simulation (INFO) - Progress... 59%\n", - "[14:01:15] Simulation (INFO) - Progress... 60%\n", - "[14:01:15] Simulation (INFO) - Progress... 60%\n", - "[14:01:15] MPS (INFO) - MPS size (MiB)=0.298919677734375\n", - "[14:01:15] MPS (INFO) - MPS fidelity=0.975569858851943\n", - "[14:01:15] Simulation (INFO) - Progress... 60%\n", - "[14:01:15] Simulation (INFO) - Progress... 60%\n", - "[14:01:15] Simulation (INFO) - Progress... 60%\n", - "[14:01:15] MPS (INFO) - MPS size (MiB)=0.302093505859375\n", - "[14:01:15] MPS (INFO) - MPS fidelity=0.97482766334186\n", - "[14:01:15] Simulation (INFO) - Progress... 60%\n", - "[14:01:15] Simulation (INFO) - Progress... 61%\n", - "[14:01:15] Simulation (INFO) - Progress... 61%\n", - "[14:01:15] MPS (INFO) - MPS size (MiB)=0.334991455078125\n", - "[14:01:15] MPS (INFO) - MPS fidelity=0.9740459735892828\n", - "[14:01:15] Simulation (INFO) - Progress... 61%\n", - "[14:01:15] Simulation (INFO) - Progress... 61%\n", - "[14:01:15] Simulation (INFO) - Progress... 61%\n", - "[14:01:15] MPS (INFO) - MPS size (MiB)=0.334991455078125\n", - "[14:01:15] MPS (INFO) - MPS fidelity=0.9740459735892828\n", - "[14:01:15] Simulation (INFO) - Progress... 61%\n", - "[14:01:15] Simulation (INFO) - Progress... 62%\n", - "[14:01:15] Simulation (INFO) - Progress... 62%\n", - "[14:01:15] MPS (INFO) - MPS size (MiB)=0.339019775390625\n", - "[14:01:15] MPS (INFO) - MPS fidelity=0.9740459735892828\n", - "[14:01:15] Simulation (INFO) - Progress... 62%\n", - "[14:01:15] Simulation (INFO) - Progress... 62%\n", - "[14:01:15] Simulation (INFO) - Progress... 62%\n", - "[14:01:15] MPS (INFO) - MPS size (MiB)=0.339019775390625\n", - "[14:01:15] MPS (INFO) - MPS fidelity=0.9740459735892828\n", - "[14:01:15] Simulation (INFO) - Progress... 62%\n", - "[14:01:15] Simulation (INFO) - Progress... 63%\n", - "[14:01:15] Simulation (INFO) - Progress... 63%\n", - "[14:01:15] MPS (INFO) - MPS size (MiB)=0.339019775390625\n", - "[14:01:15] MPS (INFO) - MPS fidelity=0.9740459735892828\n", - "[14:01:15] Simulation (INFO) - Progress... 63%\n", - "[14:01:15] Simulation (INFO) - Progress... 63%\n", - "[14:01:15] Simulation (INFO) - Progress... 63%\n", - "[14:01:15] MPS (INFO) - MPS size (MiB)=0.339019775390625\n", - "[14:01:15] MPS (INFO) - MPS fidelity=0.9740459735892828\n", - "[14:01:15] Simulation (INFO) - Progress... 63%\n", - "[14:01:15] Simulation (INFO) - Progress... 64%\n", - "[14:01:15] Simulation (INFO) - Progress... 64%\n", - "[14:01:15] MPS (INFO) - MPS size (MiB)=0.339019775390625\n", - "[14:01:15] MPS (INFO) - MPS fidelity=0.9740459735892826\n", - "[14:01:15] Simulation (INFO) - Progress... 64%\n", - "[14:01:15] Simulation (INFO) - Progress... 64%\n", - "[14:01:15] Simulation (INFO) - Progress... 64%\n", - "[14:01:15] MPS (INFO) - MPS size (MiB)=0.339019775390625\n", - "[14:01:15] MPS (INFO) - MPS fidelity=0.9740459735892828\n", - "[14:01:15] Simulation (INFO) - Progress... 64%\n", - "[14:01:15] Simulation (INFO) - Progress... 65%\n", - "[14:01:15] Simulation (INFO) - Progress... 65%\n", - "[14:01:15] MPS (INFO) - MPS size (MiB)=0.339019775390625\n", - "[14:01:15] MPS (INFO) - MPS fidelity=0.9740459735892828\n", - "[14:01:15] Simulation (INFO) - Progress... 65%\n", - "[14:01:15] MPS (INFO) - MPS size (MiB)=0.339019775390625\n", - "[14:01:15] MPS (INFO) - MPS fidelity=0.9740459735892828\n", - "[14:01:15] Simulation (INFO) - Progress... 65%\n", - "[14:01:15] Simulation (INFO) - Progress... 65%\n", - "[14:01:15] Simulation (INFO) - Progress... 65%\n", - "[14:01:15] MPS (INFO) - MPS size (MiB)=0.340118408203125\n", - "[14:01:15] MPS (INFO) - MPS fidelity=0.9735596675843919\n", - "[14:01:15] Simulation (INFO) - Progress... 66%\n", - "[14:01:15] Simulation (INFO) - Progress... 66%\n", - "[14:01:15] Simulation (INFO) - Progress... 66%\n", - "[14:01:15] MPS (INFO) - Applying variational optimisation.\n", - "[14:01:15] MPS (INFO) - Fidelity before optimisation=0.9735596675843919\n", - "[14:01:15] MPS (INFO) - Doing another optimisation sweep...\n", - "[14:01:15] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9843516935412071\n", - "[14:01:15] MPS (INFO) - Doing another optimisation sweep...\n", - "[14:01:15] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9848064428508081\n", - "[14:01:15] MPS (INFO) - Doing another optimisation sweep...\n", - "[14:01:16] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9849304313856563\n", - "[14:01:16] MPS (INFO) - Doing another optimisation sweep...\n", - "[14:01:16] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9849873035247502\n", - "[14:01:16] MPS (INFO) - Doing another optimisation sweep...\n", - "[14:01:16] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9850185604266666\n", - "[14:01:16] MPS (INFO) - Doing another optimisation sweep...\n", - "[14:01:16] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9850377284486574\n", - "[14:01:16] MPS (INFO) - Final fidelity after optimisation=0.9850377284486574\n", - "[14:01:16] MPS (INFO) - MPS size (MiB)=0.3406982421875\n", - "[14:01:16] MPS (INFO) - MPS fidelity=0.9844304521445316\n", - "[14:01:16] Simulation (INFO) - Progress... 66%\n", - "[14:01:16] Simulation (INFO) - Progress... 66%\n", - "[14:01:16] Simulation (INFO) - Progress... 66%\n", - "[14:01:16] MPS (INFO) - MPS size (MiB)=0.341339111328125\n", - "[14:01:16] MPS (INFO) - MPS fidelity=0.9836453925132829\n", - "[14:01:16] Simulation (INFO) - Progress... 67%\n", - "[14:01:16] Simulation (INFO) - Progress... 67%\n", - "[14:01:16] Simulation (INFO) - Progress... 67%\n", - "[14:01:16] MPS (INFO) - MPS size (MiB)=0.344635009765625\n", - "[14:01:16] MPS (INFO) - MPS fidelity=0.9827521125621543\n", - "[14:01:16] Simulation (INFO) - Progress... 67%\n", - "[14:01:16] Simulation (INFO) - Progress... 67%\n", - "[14:01:16] Simulation (INFO) - Progress... 67%\n", - "[14:01:16] MPS (INFO) - MPS size (MiB)=0.352752685546875\n", - "[14:01:16] MPS (INFO) - MPS fidelity=0.9819763508005264\n", - "[14:01:16] Simulation (INFO) - Progress... 68%\n", - "[14:01:16] Simulation (INFO) - Progress... 68%\n", - "[14:01:16] Simulation (INFO) - Progress... 68%\n", - "[14:01:16] MPS (INFO) - MPS size (MiB)=0.366485595703125\n", - "[14:01:16] MPS (INFO) - MPS fidelity=0.9810077310496189\n", - "[14:01:16] Simulation (INFO) - Progress... 68%\n", - "[14:01:16] Simulation (INFO) - Progress... 68%\n", - "[14:01:16] Simulation (INFO) - Progress... 68%\n", - "[14:01:16] MPS (INFO) - MPS size (MiB)=0.394256591796875\n", - "[14:01:16] MPS (INFO) - MPS fidelity=0.9802244249339466\n", - "[14:01:16] Simulation (INFO) - Progress... 69%\n", - "[14:01:16] Simulation (INFO) - Progress... 69%\n", - "[14:01:16] Simulation (INFO) - Progress... 69%\n", - "[14:01:16] MPS (INFO) - MPS size (MiB)=0.4154052734375\n", - "[14:01:16] MPS (INFO) - MPS fidelity=0.9793217534714646\n", - "[14:01:16] Simulation (INFO) - Progress... 69%\n", - "[14:01:16] Simulation (INFO) - Progress... 69%\n", - "[14:01:16] Simulation (INFO) - Progress... 70%\n", - "[14:01:16] MPS (INFO) - MPS size (MiB)=0.4249267578125\n", - "[14:01:16] MPS (INFO) - MPS fidelity=0.9783526934928921\n", - "[14:01:16] Simulation (INFO) - Progress... 70%\n", - "[14:01:16] Simulation (INFO) - Progress... 70%\n", - "[14:01:16] Simulation (INFO) - Progress... 70%\n", - "[14:01:16] MPS (INFO) - MPS size (MiB)=0.4468994140625\n", - "[14:01:16] MPS (INFO) - MPS fidelity=0.9773801381930487\n", - "[14:01:16] Simulation (INFO) - Progress... 70%\n", - "[14:01:16] Simulation (INFO) - Progress... 70%\n", - "[14:01:16] Simulation (INFO) - Progress... 71%\n", - "[14:01:16] MPS (INFO) - MPS size (MiB)=0.49566650390625\n", - "[14:01:16] MPS (INFO) - MPS fidelity=0.9764511340458201\n", - "[14:01:16] Simulation (INFO) - Progress... 71%\n", - "[14:01:16] Simulation (INFO) - Progress... 71%\n", - "[14:01:16] Simulation (INFO) - Progress... 71%\n", - "[14:01:16] MPS (INFO) - MPS size (MiB)=0.51324462890625\n", - "[14:01:16] MPS (INFO) - MPS fidelity=0.9756161361580449\n", - "[14:01:16] Simulation (INFO) - Progress... 71%\n", - "[14:01:16] Simulation (INFO) - Progress... 71%\n", - "[14:01:16] Simulation (INFO) - Progress... 72%\n", - "[14:01:16] MPS (INFO) - MPS size (MiB)=0.51324462890625\n", - "[14:01:16] MPS (INFO) - MPS fidelity=0.9756161361580449\n", - "[14:01:16] Simulation (INFO) - Progress... 72%\n", - "[14:01:16] Simulation (INFO) - Progress... 72%\n", - "[14:01:16] Simulation (INFO) - Progress... 72%\n", - "[14:01:16] MPS (INFO) - MPS size (MiB)=0.51324462890625\n", - "[14:01:16] MPS (INFO) - MPS fidelity=0.9756161361580449\n", - "[14:01:16] Simulation (INFO) - Progress... 72%\n", - "[14:01:16] MPS (INFO) - MPS size (MiB)=0.51324462890625\n", - "[14:01:16] MPS (INFO) - MPS fidelity=0.9756161361580449\n", - "[14:01:16] Simulation (INFO) - Progress... 72%\n", - "[14:01:16] Simulation (INFO) - Progress... 73%\n", - "[14:01:16] Simulation (INFO) - Progress... 73%\n", - "[14:01:16] Simulation (INFO) - Progress... 73%\n", - "[14:01:16] MPS (INFO) - MPS size (MiB)=0.51324462890625\n", - "[14:01:16] MPS (INFO) - MPS fidelity=0.9756161361580449\n", - "[14:01:16] Simulation (INFO) - Progress... 73%\n", - "[14:01:17] Simulation (INFO) - Progress... 73%\n", - "[14:01:17] Simulation (INFO) - Progress... 73%\n", - "[14:01:17] MPS (INFO) - MPS size (MiB)=0.51324462890625\n", - "[14:01:17] MPS (INFO) - MPS fidelity=0.9756161361580449\n", - "[14:01:17] Simulation (INFO) - Progress... 74%\n", - "[14:01:17] Simulation (INFO) - Progress... 74%\n", - "[14:01:17] Simulation (INFO) - Progress... 74%\n", - "[14:01:17] Simulation (INFO) - Progress... 74%\n", - "[14:01:17] MPS (INFO) - MPS size (MiB)=0.513641357421875\n", - "[14:01:17] MPS (INFO) - MPS fidelity=0.9756161361580449\n", - "[14:01:17] Simulation (INFO) - Progress... 74%\n", - "[14:01:17] Simulation (INFO) - Progress... 74%\n", - "[14:01:17] Simulation (INFO) - Progress... 75%\n", - "[14:01:17] MPS (INFO) - MPS size (MiB)=0.513641357421875\n", - "[14:01:17] MPS (INFO) - MPS fidelity=0.9756161361580449\n", - "[14:01:17] Simulation (INFO) - Progress... 75%\n", - "[14:01:17] Simulation (INFO) - Progress... 75%\n", - "[14:01:17] Simulation (INFO) - Progress... 75%\n", - "[14:01:17] MPS (INFO) - MPS size (MiB)=0.51556396484375\n", - "[14:01:17] MPS (INFO) - MPS fidelity=0.9748529131568249\n", - "[14:01:17] Simulation (INFO) - Progress... 75%\n", - "[14:01:17] Simulation (INFO) - Progress... 75%\n", - "[14:01:17] Simulation (INFO) - Progress... 76%\n", - "[14:01:17] MPS (INFO) - MPS size (MiB)=0.51556396484375\n", - "[14:01:17] MPS (INFO) - MPS fidelity=0.9748529131568249\n", - "[14:01:17] Simulation (INFO) - Progress... 76%\n", - "[14:01:17] Simulation (INFO) - Progress... 76%\n", - "[14:01:17] Simulation (INFO) - Progress... 76%\n", - "[14:01:17] MPS (INFO) - MPS size (MiB)=0.51983642578125\n", - "[14:01:17] MPS (INFO) - MPS fidelity=0.9742120807068472\n", - "[14:01:17] Simulation (INFO) - Progress... 76%\n", - "[14:01:17] Simulation (INFO) - Progress... 76%\n", - "[14:01:17] Simulation (INFO) - Progress... 77%\n", - "[14:01:17] MPS (INFO) - Applying variational optimisation.\n", - "[14:01:17] MPS (INFO) - Fidelity before optimisation=0.9742120807068472\n", - "[14:01:17] MPS (INFO) - Doing another optimisation sweep...\n", - "[14:01:17] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.975134847725609\n", - "[14:01:17] MPS (INFO) - Doing another optimisation sweep...\n", - "[14:01:17] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9751851737337295\n", - "[14:01:17] MPS (INFO) - Doing another optimisation sweep...\n", - "[14:01:17] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9752028508364771\n", - "[14:01:17] MPS (INFO) - Final fidelity after optimisation=0.9752028508364771\n", - "[14:01:17] MPS (INFO) - MPS size (MiB)=0.522216796875\n", - "[14:01:17] MPS (INFO) - MPS fidelity=0.9747413039963226\n", - "[14:01:17] Simulation (INFO) - Progress... 77%\n", - "[14:01:17] Simulation (INFO) - Progress... 77%\n", - "[14:01:17] Simulation (INFO) - Progress... 77%\n", - "[14:01:17] MPS (INFO) - MPS size (MiB)=0.530548095703125\n", - "[14:01:17] MPS (INFO) - MPS fidelity=0.9737709267327275\n", - "[14:01:17] Simulation (INFO) - Progress... 77%\n", - "[14:01:17] Simulation (INFO) - Progress... 77%\n", - "[14:01:17] Simulation (INFO) - Progress... 78%\n", - "[14:01:17] MPS (INFO) - MPS size (MiB)=0.542144775390625\n", - "[14:01:17] MPS (INFO) - MPS fidelity=0.9730980087583336\n", - "[14:01:17] Simulation (INFO) - Progress... 78%\n", - "[14:01:17] Simulation (INFO) - Progress... 78%\n", - "[14:01:17] Simulation (INFO) - Progress... 78%\n", - "[14:01:17] MPS (INFO) - MPS size (MiB)=0.555572509765625\n", - "[14:01:17] MPS (INFO) - MPS fidelity=0.972274693739747\n", - "[14:01:17] Simulation (INFO) - Progress... 78%\n", - "[14:01:17] Simulation (INFO) - Progress... 78%\n", - "[14:01:17] Simulation (INFO) - Progress... 79%\n", - "[14:01:17] MPS (INFO) - MPS size (MiB)=0.58514404296875\n", - "[14:01:17] MPS (INFO) - MPS fidelity=0.9714008152517145\n", - "[14:01:17] Simulation (INFO) - Progress... 79%\n", - "[14:01:17] Simulation (INFO) - Progress... 79%\n", - "[14:01:17] Simulation (INFO) - Progress... 79%\n", - "[14:01:17] MPS (INFO) - MPS size (MiB)=0.5892333984375\n", - "[14:01:17] MPS (INFO) - MPS fidelity=0.9705196501761234\n", - "[14:01:17] Simulation (INFO) - Progress... 79%\n", - "[14:01:17] Simulation (INFO) - Progress... 80%\n", - "[14:01:17] Simulation (INFO) - Progress... 80%\n", - "[14:01:17] MPS (INFO) - MPS size (MiB)=0.63214111328125\n", - "[14:01:17] MPS (INFO) - MPS fidelity=0.9697148601428947\n", - "[14:01:17] Simulation (INFO) - Progress... 80%\n", - "[14:01:17] Simulation (INFO) - Progress... 80%\n", - "[14:01:17] Simulation (INFO) - Progress... 80%\n", - "[14:01:17] MPS (INFO) - MPS size (MiB)=0.65301513671875\n", - "[14:01:17] MPS (INFO) - MPS fidelity=0.9688374595301655\n", - "[14:01:17] Simulation (INFO) - Progress... 80%\n", - "[14:01:17] Simulation (INFO) - Progress... 81%\n", - "[14:01:17] Simulation (INFO) - Progress... 81%\n", - "[14:01:17] MPS (INFO) - MPS size (MiB)=0.731292724609375\n", - "[14:01:17] MPS (INFO) - MPS fidelity=0.9679729595082353\n", - "[14:01:17] Simulation (INFO) - Progress... 81%\n", - "[14:01:17] Simulation (INFO) - Progress... 81%\n", - "[14:01:17] Simulation (INFO) - Progress... 81%\n", - "[14:01:17] MPS (INFO) - MPS size (MiB)=0.756011962890625\n", - "[14:01:17] MPS (INFO) - MPS fidelity=0.9670817720186894\n", - "[14:01:17] Simulation (INFO) - Progress... 81%\n", - "[14:01:17] Simulation (INFO) - Progress... 82%\n", - "[14:01:17] Simulation (INFO) - Progress... 82%\n", - "[14:01:17] MPS (INFO) - MPS size (MiB)=0.851715087890625\n", - "[14:01:17] MPS (INFO) - MPS fidelity=0.9662304487130915\n", - "[14:01:17] Simulation (INFO) - Progress... 82%\n", - "[14:01:17] Simulation (INFO) - Progress... 82%\n", - "[14:01:17] Simulation (INFO) - Progress... 82%\n", - "[14:01:17] MPS (INFO) - MPS size (MiB)=0.903900146484375\n", - "[14:01:17] MPS (INFO) - MPS fidelity=0.96530121346801\n", - "[14:01:17] Simulation (INFO) - Progress... 82%\n", - "[14:01:17] Simulation (INFO) - Progress... 83%\n", - "[14:01:17] Simulation (INFO) - Progress... 83%\n", - "[14:01:18] MPS (INFO) - MPS size (MiB)=1.074066162109375\n", - "[14:01:18] MPS (INFO) - MPS fidelity=0.9644645141858508\n", - "[14:01:18] Simulation (INFO) - Progress... 83%\n", - "[14:01:18] Simulation (INFO) - Progress... 83%\n", - "[14:01:18] Simulation (INFO) - Progress... 83%\n", - "[14:01:18] MPS (INFO) - MPS size (MiB)=1.13128662109375\n", - "[14:01:18] MPS (INFO) - MPS fidelity=0.963576178040663\n", - "[14:01:18] Simulation (INFO) - Progress... 83%\n", - "[14:01:18] Simulation (INFO) - Progress... 84%\n", - "[14:01:18] Simulation (INFO) - Progress... 84%\n", - "[14:01:18] MPS (INFO) - MPS size (MiB)=1.375518798828125\n", - "[14:01:18] MPS (INFO) - MPS fidelity=0.9627241232539026\n", - "[14:01:18] Simulation (INFO) - Progress... 84%\n", - "[14:01:18] Simulation (INFO) - Progress... 84%\n", - "[14:01:18] Simulation (INFO) - Progress... 84%\n", - "[14:01:18] MPS (INFO) - MPS size (MiB)=1.4351806640625\n", - "[14:01:18] MPS (INFO) - MPS fidelity=0.9617990818895198\n", - "[14:01:18] Simulation (INFO) - Progress... 84%\n", - "[14:01:18] Simulation (INFO) - Progress... 85%\n", - "[14:01:18] Simulation (INFO) - Progress... 85%\n", - "[14:01:18] MPS (INFO) - MPS size (MiB)=1.738677978515625\n", - "[14:01:18] MPS (INFO) - MPS fidelity=0.9610190784537106\n", - "[14:01:18] Simulation (INFO) - Progress... 85%\n", - "[14:01:18] MPS (INFO) - MPS size (MiB)=1.75592041015625\n", - "[14:01:18] MPS (INFO) - MPS fidelity=0.9602283439877098\n", - "[14:01:18] Simulation (INFO) - Progress... 85%\n", - "[14:01:18] MPS (INFO) - MPS size (MiB)=1.75592041015625\n", - "[14:01:18] MPS (INFO) - MPS fidelity=0.9602283439877098\n", - "[14:01:18] Simulation (INFO) - Progress... 85%\n", - "[14:01:18] Simulation (INFO) - Progress... 85%\n", - "[14:01:18] Simulation (INFO) - Progress... 86%\n", - "[14:01:18] Simulation (INFO) - Progress... 86%\n", - "[14:01:18] MPS (INFO) - MPS size (MiB)=1.75592041015625\n", - "[14:01:18] MPS (INFO) - MPS fidelity=0.9602283439877096\n", - "[14:01:18] Simulation (INFO) - Progress... 86%\n", - "[14:01:18] Simulation (INFO) - Progress... 86%\n", - "[14:01:18] Simulation (INFO) - Progress... 86%\n", - "[14:01:18] MPS (INFO) - MPS size (MiB)=1.75592041015625\n", - "[14:01:18] MPS (INFO) - MPS fidelity=0.9602283439877098\n", - "[14:01:18] Simulation (INFO) - Progress... 86%\n", - "[14:01:18] Simulation (INFO) - Progress... 87%\n", - "[14:01:18] Simulation (INFO) - Progress... 87%\n", - "[14:01:18] Simulation (INFO) - Progress... 87%\n", - "[14:01:18] MPS (INFO) - MPS size (MiB)=1.75592041015625\n", - "[14:01:18] MPS (INFO) - MPS fidelity=0.9602283439877098\n", - "[14:01:18] Simulation (INFO) - Progress... 87%\n", - "[14:01:18] Simulation (INFO) - Progress... 87%\n", - "[14:01:18] Simulation (INFO) - Progress... 87%\n", - "[14:01:18] MPS (INFO) - MPS size (MiB)=1.75592041015625\n", - "[14:01:18] MPS (INFO) - MPS fidelity=0.9602283439877098\n", - "[14:01:18] Simulation (INFO) - Progress... 88%\n", - "[14:01:18] Simulation (INFO) - Progress... 88%\n", - "[14:01:18] Simulation (INFO) - Progress... 88%\n", - "[14:01:18] MPS (INFO) - MPS size (MiB)=1.75701904296875\n", - "[14:01:18] MPS (INFO) - MPS fidelity=0.9602283439877098\n", - "[14:01:18] Simulation (INFO) - Progress... 88%\n", - "[14:01:18] Simulation (INFO) - Progress... 88%\n", - "[14:01:18] Simulation (INFO) - Progress... 88%\n", - "[14:01:18] MPS (INFO) - MPS size (MiB)=1.75701904296875\n", - "[14:01:18] MPS (INFO) - MPS fidelity=0.9602283439877098\n", - "[14:01:18] Simulation (INFO) - Progress... 89%\n", - "[14:01:18] Simulation (INFO) - Progress... 89%\n", - "[14:01:18] Simulation (INFO) - Progress... 89%\n", - "[14:01:18] MPS (INFO) - MPS size (MiB)=1.75872802734375\n", - "[14:01:18] MPS (INFO) - MPS fidelity=0.9596341716247032\n", - "[14:01:18] Simulation (INFO) - Progress... 89%\n", - "[14:01:18] Simulation (INFO) - Progress... 89%\n", - "[14:01:18] Simulation (INFO) - Progress... 90%\n", - "[14:01:18] MPS (INFO) - Applying variational optimisation.\n", - "[14:01:18] MPS (INFO) - Fidelity before optimisation=0.9596341716247032\n", - "[14:01:18] MPS (INFO) - Doing another optimisation sweep...\n", - "[14:01:18] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9700420977488123\n", - "[14:01:18] MPS (INFO) - Doing another optimisation sweep...\n", - "[14:01:18] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9703519467112257\n", - "[14:01:18] MPS (INFO) - Doing another optimisation sweep...\n", - "[14:01:18] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9704374405302711\n", - "[14:01:18] MPS (INFO) - Doing another optimisation sweep...\n", - "[14:01:19] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9704739545165699\n", - "[14:01:19] MPS (INFO) - Doing another optimisation sweep...\n", - "[14:01:19] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9704925687713485\n", - "[14:01:19] MPS (INFO) - Final fidelity after optimisation=0.9704925687713485\n", - "[14:01:19] MPS (INFO) - MPS size (MiB)=1.75872802734375\n", - "[14:01:19] MPS (INFO) - MPS fidelity=0.9704925687713485\n", - "[14:01:19] Simulation (INFO) - Progress... 90%\n", - "[14:01:19] Simulation (INFO) - Progress... 90%\n", - "[14:01:19] Simulation (INFO) - Progress... 90%\n", - "[14:01:19] MPS (INFO) - MPS size (MiB)=1.765777587890625\n", - "[14:01:19] MPS (INFO) - MPS fidelity=0.9696216444258031\n", - "[14:01:19] Simulation (INFO) - Progress... 90%\n", - "[14:01:19] Simulation (INFO) - Progress... 90%\n", - "[14:01:19] Simulation (INFO) - Progress... 91%\n", - "[14:01:19] MPS (INFO) - MPS size (MiB)=1.77117919921875\n", - "[14:01:19] MPS (INFO) - MPS fidelity=0.9696216444258033\n", - "[14:01:19] Simulation (INFO) - Progress... 91%\n", - "[14:01:19] Simulation (INFO) - Progress... 91%\n", - "[14:01:19] Simulation (INFO) - Progress... 91%\n", - "[14:01:19] MPS (INFO) - MPS size (MiB)=1.79656982421875\n", - "[14:01:19] MPS (INFO) - MPS fidelity=0.9687315620521755\n", - "[14:01:19] Simulation (INFO) - Progress... 91%\n", - "[14:01:19] Simulation (INFO) - Progress... 91%\n", - "[14:01:19] Simulation (INFO) - Progress... 92%\n", - "[14:01:19] MPS (INFO) - MPS size (MiB)=1.84222412109375\n", - "[14:01:19] MPS (INFO) - MPS fidelity=0.9679596222596152\n", - "[14:01:19] Simulation (INFO) - Progress... 92%\n", - "[14:01:19] Simulation (INFO) - Progress... 92%\n", - "[14:01:19] Simulation (INFO) - Progress... 92%\n", - "[14:01:19] MPS (INFO) - MPS size (MiB)=1.870208740234375\n", - "[14:01:19] MPS (INFO) - MPS fidelity=0.9670763677407406\n", - "[14:01:19] Simulation (INFO) - Progress... 92%\n", - "[14:01:19] Simulation (INFO) - Progress... 92%\n", - "[14:01:19] Simulation (INFO) - Progress... 93%\n", - "[14:01:19] MPS (INFO) - MPS size (MiB)=1.940521240234375\n", - "[14:01:19] MPS (INFO) - MPS fidelity=0.9661194670712572\n", - "[14:01:19] Simulation (INFO) - Progress... 93%\n", - "[14:01:19] Simulation (INFO) - Progress... 93%\n", - "[14:01:19] Simulation (INFO) - Progress... 93%\n", - "[14:01:19] MPS (INFO) - MPS size (MiB)=1.999114990234375\n", - "[14:01:19] MPS (INFO) - MPS fidelity=0.9652231632846195\n", - "[14:01:19] Simulation (INFO) - Progress... 93%\n", - "[14:01:19] Simulation (INFO) - Progress... 93%\n", - "[14:01:19] Simulation (INFO) - Progress... 94%\n", - "[14:01:19] MPS (INFO) - MPS size (MiB)=2.234954833984375\n", - "[14:01:19] MPS (INFO) - MPS fidelity=0.9642981707017143\n", - "[14:01:19] Simulation (INFO) - Progress... 94%\n", - "[14:01:19] MPS (INFO) - MPS size (MiB)=2.35150146484375\n", - "[14:01:19] MPS (INFO) - MPS fidelity=0.9633776196448067\n", - "[14:01:19] Simulation (INFO) - Progress... 94%\n", - "[14:01:19] MPS (INFO) - MPS size (MiB)=2.35150146484375\n", - "[14:01:19] MPS (INFO) - MPS fidelity=0.9633776196448067\n", - "[14:01:19] Simulation (INFO) - Progress... 94%\n", - "[14:01:19] Simulation (INFO) - Progress... 94%\n", - "[14:01:19] Simulation (INFO) - Progress... 94%\n", - "[14:01:19] Simulation (INFO) - Progress... 95%\n", - "[14:01:19] MPS (INFO) - MPS size (MiB)=2.35150146484375\n", - "[14:01:19] MPS (INFO) - MPS fidelity=0.9633776196448067\n", - "[14:01:19] Simulation (INFO) - Progress... 95%\n", - "[14:01:19] Simulation (INFO) - Progress... 95%\n", - "[14:01:19] Simulation (INFO) - Progress... 95%\n", - "[14:01:19] MPS (INFO) - MPS size (MiB)=2.35150146484375\n", - "[14:01:19] MPS (INFO) - MPS fidelity=0.9633776196448067\n", - "[14:01:19] Simulation (INFO) - Progress... 95%\n", - "[14:01:19] Simulation (INFO) - Progress... 95%\n", - "[14:01:19] Simulation (INFO) - Progress... 96%\n", - "[14:01:19] Simulation (INFO) - Progress... 96%\n", - "[14:01:19] MPS (INFO) - MPS size (MiB)=2.35150146484375\n", - "[14:01:19] MPS (INFO) - MPS fidelity=0.9633776196448067\n", - "[14:01:19] Simulation (INFO) - Progress... 96%\n", - "[14:01:19] Simulation (INFO) - Progress... 96%\n", - "[14:01:19] Simulation (INFO) - Progress... 96%\n", - "[14:01:19] MPS (INFO) - MPS size (MiB)=2.35150146484375\n", - "[14:01:19] MPS (INFO) - MPS fidelity=0.9633776196448067\n", - "[14:01:19] Simulation (INFO) - Progress... 96%\n", - "[14:01:19] Simulation (INFO) - Progress... 97%\n", - "[14:01:19] Simulation (INFO) - Progress... 97%\n", - "[14:01:19] MPS (INFO) - Applying variational optimisation.\n", - "[14:01:19] MPS (INFO) - Fidelity before optimisation=0.9633776196448067\n", - "[14:01:19] MPS (INFO) - Doing another optimisation sweep...\n", - "[14:01:20] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.967414171617126\n", - "[14:01:20] MPS (INFO) - Doing another optimisation sweep...\n", - "[14:01:20] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.967533278009993\n", - "[14:01:20] MPS (INFO) - Doing another optimisation sweep...\n", - "[14:01:20] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9675675092087742\n", - "[14:01:20] MPS (INFO) - Doing another optimisation sweep...\n", - "[14:01:20] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9675846146681976\n", - "[14:01:20] MPS (INFO) - Final fidelity after optimisation=0.9675846146681976\n", - "[14:01:20] MPS (INFO) - MPS size (MiB)=2.35150146484375\n", - "[14:01:20] MPS (INFO) - MPS fidelity=0.9675846146681976\n", - "[14:01:20] Simulation (INFO) - Progress... 97%\n", - "[14:01:20] Simulation (INFO) - Progress... 97%\n", - "[14:01:20] Simulation (INFO) - Progress... 97%\n", - "[14:01:20] MPS (INFO) - MPS size (MiB)=2.35150146484375\n", - "[14:01:20] MPS (INFO) - MPS fidelity=0.9675846146681976\n", - "[14:01:20] Simulation (INFO) - Progress... 97%\n", - "[14:01:20] Simulation (INFO) - Progress... 98%\n", - "[14:01:20] Simulation (INFO) - Progress... 98%\n", - "[14:01:20] MPS (INFO) - MPS size (MiB)=2.35150146484375\n", - "[14:01:20] MPS (INFO) - MPS fidelity=0.9675846146681976\n", - "[14:01:20] Simulation (INFO) - Progress... 98%\n", - "[14:01:20] Simulation (INFO) - Progress... 98%\n", - "[14:01:20] Simulation (INFO) - Progress... 98%\n", - "[14:01:20] MPS (INFO) - MPS size (MiB)=2.34918212890625\n", - "[14:01:20] MPS (INFO) - MPS fidelity=0.9667630952362768\n", - "[14:01:20] Simulation (INFO) - Progress... 98%\n", - "[14:01:20] Simulation (INFO) - Progress... 99%\n", - "[14:01:20] Simulation (INFO) - Progress... 99%\n", - "[14:01:20] MPS (INFO) - MPS size (MiB)=2.34918212890625\n", - "[14:01:20] MPS (INFO) - MPS fidelity=0.9667630952362768\n", - "[14:01:20] Simulation (INFO) - Progress... 99%\n", - "[14:01:20] MPS (INFO) - MPS size (MiB)=2.3427734375\n", - "[14:01:20] MPS (INFO) - MPS fidelity=0.9659837340863052\n", - "[14:01:20] Simulation (INFO) - Progress... 99%\n", - "[14:01:20] MPS (INFO) - MPS size (MiB)=2.3427734375\n", - "[14:01:20] MPS (INFO) - MPS fidelity=0.9659837340863054\n", - "[14:01:20] Simulation (INFO) - Progress... 99%\n", - "[14:01:20] MPS (INFO) - Applying variational optimisation.\n", - "[14:01:20] MPS (INFO) - Fidelity before optimisation=0.9659837340863054\n", - "[14:01:20] MPS (INFO) - Doing another optimisation sweep...\n", - "[14:01:20] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9659853689734507\n", - "[14:01:20] MPS (INFO) - Doing another optimisation sweep...\n", - "[14:01:20] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9659862268998962\n", - "[14:01:20] MPS (INFO) - Final fidelity after optimisation=0.9659862268998962\n", - "[14:01:20] MPS (INFO) - Applying variational optimisation.\n", - "[14:01:20] MPS (INFO) - Fidelity before optimisation=0.9659862268998962\n", - "[14:01:20] MPS (INFO) - Doing another optimisation sweep...\n", - "[14:01:21] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.965986226899895\n", - "[14:01:21] MPS (INFO) - Doing another optimisation sweep...\n", - "[14:01:21] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9659862268998954\n", - "[14:01:21] MPS (INFO) - Final fidelity after optimisation=0.9659862268998954\n", - "[14:01:21] Simulation (INFO) - Simulation completed.\n", - "[14:01:21] Simulation (INFO) - Final MPS size=2.3427734375 MiB\n", - "[14:01:21] Simulation (INFO) - Final MPS fidelity=0.9659862268998954\n" + "[15:41:45] Simulation (INFO) - Ordering the gates in the circuit to reduce canonicalisation overhead.\n", + "[15:41:45] Simulation (INFO) - Running simulation...\n", + "[15:41:45] Simulation (INFO) - Progress... 0%\n", + "[15:41:45] Simulation (INFO) - Progress... 0%\n", + "[15:41:45] Simulation (INFO) - Progress... 0%\n", + "[15:41:45] Simulation (INFO) - Progress... 0%\n", + "[15:41:45] Simulation (INFO) - Progress... 0%\n", + "[15:41:45] Simulation (INFO) - Progress... 0%\n", + "[15:41:45] Simulation (INFO) - Progress... 1%\n", + "[15:41:45] Simulation (INFO) - Progress... 1%\n", + "[15:41:45] Simulation (INFO) - Progress... 1%\n", + "[15:41:45] Simulation (INFO) - Progress... 1%\n", + "[15:41:45] Simulation (INFO) - Progress... 1%\n", + "[15:41:45] Simulation (INFO) - Progress... 1%\n", + "[15:41:45] Simulation (INFO) - Progress... 2%\n", + "[15:41:45] Simulation (INFO) - Progress... 2%\n", + "[15:41:45] Simulation (INFO) - Progress... 2%\n", + "[15:41:45] Simulation (INFO) - Progress... 2%\n", + "[15:41:45] Simulation (INFO) - Progress... 2%\n", + "[15:41:45] Simulation (INFO) - Progress... 2%\n", + "[15:41:45] Simulation (INFO) - Progress... 3%\n", + "[15:41:45] Simulation (INFO) - Progress... 3%\n", + "[15:41:45] MPS (INFO) - MPS size (MiB)=0.00067138671875\n", + "[15:41:45] MPS (INFO) - MPS fidelity=1.0\n", + "[15:41:45] Simulation (INFO) - Progress... 3%\n", + "[15:41:45] Simulation (INFO) - Progress... 3%\n", + "[15:41:45] Simulation (INFO) - Progress... 3%\n", + "[15:41:45] Simulation (INFO) - Progress... 3%\n", + "[15:41:45] MPS (INFO) - MPS size (MiB)=0.000732421875\n", + "[15:41:45] MPS (INFO) - MPS fidelity=1.0\n", + "[15:41:45] Simulation (INFO) - Progress... 4%\n", + "[15:41:45] Simulation (INFO) - Progress... 4%\n", + "[15:41:45] Simulation (INFO) - Progress... 4%\n", + "[15:41:45] MPS (INFO) - MPS size (MiB)=0.0008544921875\n", + "[15:41:45] MPS (INFO) - MPS fidelity=1.0\n", + "[15:41:45] Simulation (INFO) - Progress... 4%\n", + "[15:41:45] Simulation (INFO) - Progress... 4%\n", + "[15:41:45] Simulation (INFO) - Progress... 4%\n", + "[15:41:45] MPS (INFO) - MPS size (MiB)=0.0008544921875\n", + "[15:41:45] MPS (INFO) - MPS fidelity=1.0\n", + "[15:41:45] Simulation (INFO) - Progress... 5%\n", + "[15:41:45] Simulation (INFO) - Progress... 5%\n", + "[15:41:45] Simulation (INFO) - Progress... 5%\n", + "[15:41:45] Simulation (INFO) - Progress... 5%\n", + "[15:41:45] MPS (INFO) - MPS size (MiB)=0.00091552734375\n", + "[15:41:45] MPS (INFO) - MPS fidelity=1.0\n", + "[15:41:45] Simulation (INFO) - Progress... 5%\n", + "[15:41:45] Simulation (INFO) - Progress... 5%\n", + "[15:41:45] Simulation (INFO) - Progress... 6%\n", + "[15:41:45] MPS (INFO) - MPS size (MiB)=0.00103759765625\n", + "[15:41:45] MPS (INFO) - MPS fidelity=1.0\n", + "[15:41:45] Simulation (INFO) - Progress... 6%\n", + "[15:41:45] Simulation (INFO) - Progress... 6%\n", + "[15:41:45] Simulation (INFO) - Progress... 6%\n", + "[15:41:45] MPS (INFO) - MPS size (MiB)=0.00128173828125\n", + "[15:41:45] MPS (INFO) - MPS fidelity=1.0000000000000002\n", + "[15:41:45] Simulation (INFO) - Progress... 6%\n", + "[15:41:45] Simulation (INFO) - Progress... 6%\n", + "[15:41:45] Simulation (INFO) - Progress... 7%\n", + "[15:41:45] MPS (INFO) - MPS size (MiB)=0.00164794921875\n", + "[15:41:45] MPS (INFO) - MPS fidelity=1.0000000000000002\n", + "[15:41:45] Simulation (INFO) - Progress... 7%\n", + "[15:41:45] Simulation (INFO) - Progress... 7%\n", + "[15:41:45] Simulation (INFO) - Progress... 7%\n", + "[15:41:45] MPS (INFO) - Applying variational optimisation.\n", + "[15:41:45] MPS (INFO) - Fidelity before optimisation=1.0000000000000002\n", + "[15:41:45] MPS (INFO) - Doing another optimisation sweep...\n", + "[15:41:45] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.999999999999996\n", + "[15:41:45] MPS (INFO) - Doing another optimisation sweep...\n", + "[15:41:46] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9999999999999964\n", + "[15:41:46] MPS (INFO) - Final fidelity after optimisation=0.9999999999999964\n", + "[15:41:46] MPS (INFO) - MPS size (MiB)=0.00164794921875\n", + "[15:41:46] MPS (INFO) - MPS fidelity=0.9999999999999964\n", + "[15:41:46] Simulation (INFO) - Progress... 7%\n", + "[15:41:46] Simulation (INFO) - Progress... 7%\n", + "[15:41:46] Simulation (INFO) - Progress... 8%\n", + "[15:41:46] Simulation (INFO) - Progress... 8%\n", + "[15:41:46] MPS (INFO) - MPS size (MiB)=0.001708984375\n", + "[15:41:46] MPS (INFO) - MPS fidelity=0.9999999999999964\n", + "[15:41:46] Simulation (INFO) - Progress... 8%\n", + "[15:41:46] Simulation (INFO) - Progress... 8%\n", + "[15:41:46] Simulation (INFO) - Progress... 8%\n", + "[15:41:46] MPS (INFO) - MPS size (MiB)=0.0018310546875\n", + "[15:41:46] MPS (INFO) - MPS fidelity=0.9999999999999964\n", + "[15:41:46] Simulation (INFO) - Progress... 8%\n", + "[15:41:46] Simulation (INFO) - Progress... 9%\n", + "[15:41:46] Simulation (INFO) - Progress... 9%\n", + "[15:41:46] MPS (INFO) - MPS size (MiB)=0.0020751953125\n", + "[15:41:46] MPS (INFO) - MPS fidelity=0.9999999999999962\n", + "[15:41:46] Simulation (INFO) - Progress... 9%\n", + "[15:41:46] Simulation (INFO) - Progress... 9%\n", + "[15:41:46] Simulation (INFO) - Progress... 9%\n", + "[15:41:46] MPS (INFO) - MPS size (MiB)=0.0025634765625\n", + "[15:41:46] MPS (INFO) - MPS fidelity=0.9999999999999962\n", + "[15:41:46] Simulation (INFO) - Progress... 10%\n", + "[15:41:46] Simulation (INFO) - Progress... 10%\n", + "[15:41:46] Simulation (INFO) - Progress... 10%\n", + "[15:41:46] MPS (INFO) - MPS size (MiB)=0.0030517578125\n", + "[15:41:46] MPS (INFO) - MPS fidelity=0.9997200110071941\n", + "[15:41:46] Simulation (INFO) - Progress... 10%\n", + "[15:41:46] Simulation (INFO) - Progress... 10%\n", + "[15:41:46] Simulation (INFO) - Progress... 10%\n", + "[15:41:46] MPS (INFO) - MPS size (MiB)=0.0030517578125\n", + "[15:41:46] MPS (INFO) - MPS fidelity=0.9997200110071941\n", + "[15:41:46] Simulation (INFO) - Progress... 11%\n", + "[15:41:46] Simulation (INFO) - Progress... 11%\n", + "[15:41:46] Simulation (INFO) - Progress... 11%\n", + "[15:41:46] MPS (INFO) - MPS size (MiB)=0.0030517578125\n", + "[15:41:46] MPS (INFO) - MPS fidelity=0.9997200110071941\n", + "[15:41:46] Simulation (INFO) - Progress... 11%\n", + "[15:41:46] Simulation (INFO) - Progress... 11%\n", + "[15:41:46] Simulation (INFO) - Progress... 11%\n", + "[15:41:46] Simulation (INFO) - Progress... 12%\n", + "[15:41:46] MPS (INFO) - MPS size (MiB)=0.00311279296875\n", + "[15:41:46] MPS (INFO) - MPS fidelity=0.9997200110071941\n", + "[15:41:46] Simulation (INFO) - Progress... 12%\n", + "[15:41:46] Simulation (INFO) - Progress... 12%\n", + "[15:41:46] Simulation (INFO) - Progress... 12%\n", + "[15:41:46] MPS (INFO) - MPS size (MiB)=0.00323486328125\n", + "[15:41:46] MPS (INFO) - MPS fidelity=0.9997200110071941\n", + "[15:41:46] Simulation (INFO) - Progress... 12%\n", + "[15:41:46] Simulation (INFO) - Progress... 12%\n", + "[15:41:46] Simulation (INFO) - Progress... 13%\n", + "[15:41:46] MPS (INFO) - MPS size (MiB)=0.00347900390625\n", + "[15:41:46] MPS (INFO) - MPS fidelity=0.9997200110071941\n", + "[15:41:46] Simulation (INFO) - Progress... 13%\n", + "[15:41:46] Simulation (INFO) - Progress... 13%\n", + "[15:41:46] Simulation (INFO) - Progress... 13%\n", + "[15:41:46] MPS (INFO) - MPS size (MiB)=0.00396728515625\n", + "[15:41:46] MPS (INFO) - MPS fidelity=0.9997200110071943\n", + "[15:41:46] Simulation (INFO) - Progress... 13%\n", + "[15:41:46] Simulation (INFO) - Progress... 13%\n", + "[15:41:46] Simulation (INFO) - Progress... 14%\n", + "[15:41:46] MPS (INFO) - MPS size (MiB)=0.00494384765625\n", + "[15:41:46] MPS (INFO) - MPS fidelity=0.9997200110071943\n", + "[15:41:46] Simulation (INFO) - Progress... 14%\n", + "[15:41:46] Simulation (INFO) - Progress... 14%\n", + "[15:41:46] Simulation (INFO) - Progress... 14%\n", + "[15:41:46] MPS (INFO) - MPS size (MiB)=0.0062255859375\n", + "[15:41:46] MPS (INFO) - MPS fidelity=0.9992820662866865\n", + "[15:41:46] Simulation (INFO) - Progress... 14%\n", + "[15:41:46] Simulation (INFO) - Progress... 14%\n", + "[15:41:46] Simulation (INFO) - Progress... 15%\n", + "[15:41:46] MPS (INFO) - MPS size (MiB)=0.006561279296875\n", + "[15:41:46] MPS (INFO) - MPS fidelity=0.9986887177546038\n", + "[15:41:46] Simulation (INFO) - Progress... 15%\n", + "[15:41:46] Simulation (INFO) - Progress... 15%\n", + "[15:41:46] Simulation (INFO) - Progress... 15%\n", + "[15:41:46] MPS (INFO) - MPS size (MiB)=0.006561279296875\n", + "[15:41:46] MPS (INFO) - MPS fidelity=0.9986887177546038\n", + "[15:41:46] Simulation (INFO) - Progress... 15%\n", + "[15:41:46] Simulation (INFO) - Progress... 15%\n", + "[15:41:46] Simulation (INFO) - Progress... 16%\n", + "[15:41:46] MPS (INFO) - Applying variational optimisation.\n", + "[15:41:46] MPS (INFO) - Fidelity before optimisation=0.9986887177546038\n", + "[15:41:46] MPS (INFO) - Doing another optimisation sweep...\n", + "[15:41:46] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9992190736072919\n", + "[15:41:46] MPS (INFO) - Doing another optimisation sweep...\n", + "[15:41:46] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9992335371417129\n", + "[15:41:46] MPS (INFO) - Final fidelity after optimisation=0.9992335371417129\n", + "[15:41:46] MPS (INFO) - MPS size (MiB)=0.006561279296875\n", + "[15:41:46] MPS (INFO) - MPS fidelity=0.9992335371417129\n", + "[15:41:46] Simulation (INFO) - Progress... 16%\n", + "[15:41:46] Simulation (INFO) - Progress... 16%\n", + "[15:41:46] Simulation (INFO) - Progress... 16%\n", + "[15:41:46] Simulation (INFO) - Progress... 16%\n", + "[15:41:46] MPS (INFO) - MPS size (MiB)=0.006622314453125\n", + "[15:41:46] MPS (INFO) - MPS fidelity=0.9992335371417131\n", + "[15:41:46] Simulation (INFO) - Progress... 16%\n", + "[15:41:46] Simulation (INFO) - Progress... 17%\n", + "[15:41:46] Simulation (INFO) - Progress... 17%\n", + "[15:41:46] MPS (INFO) - MPS size (MiB)=0.006744384765625\n", + "[15:41:46] MPS (INFO) - MPS fidelity=0.9992335371417131\n", + "[15:41:46] Simulation (INFO) - Progress... 17%\n", + "[15:41:46] Simulation (INFO) - Progress... 17%\n", + "[15:41:46] Simulation (INFO) - Progress... 17%\n", + "[15:41:46] MPS (INFO) - MPS size (MiB)=0.006988525390625\n", + "[15:41:46] MPS (INFO) - MPS fidelity=0.9992335371417131\n", + "[15:41:46] Simulation (INFO) - Progress... 17%\n", + "[15:41:46] Simulation (INFO) - Progress... 18%\n", + "[15:41:46] Simulation (INFO) - Progress... 18%\n", + "[15:41:46] MPS (INFO) - MPS size (MiB)=0.007476806640625\n", + "[15:41:46] MPS (INFO) - MPS fidelity=0.9992335371417131\n", + "[15:41:46] Simulation (INFO) - Progress... 18%\n", + "[15:41:46] Simulation (INFO) - Progress... 18%\n", + "[15:41:46] Simulation (INFO) - Progress... 18%\n", + "[15:41:46] MPS (INFO) - MPS size (MiB)=0.007476806640625\n", + "[15:41:46] MPS (INFO) - MPS fidelity=0.9982345023466558\n", + "[15:41:46] Simulation (INFO) - Progress... 18%\n", + "[15:41:46] Simulation (INFO) - Progress... 19%\n", + "[15:41:46] Simulation (INFO) - Progress... 19%\n", + "[15:41:46] MPS (INFO) - MPS size (MiB)=0.008209228515625\n", + "[15:41:46] MPS (INFO) - MPS fidelity=0.9975515249441151\n", + "[15:41:46] Simulation (INFO) - Progress... 19%\n", + "[15:41:46] Simulation (INFO) - Progress... 19%\n", + "[15:41:46] Simulation (INFO) - Progress... 19%\n", + "[15:41:46] MPS (INFO) - MPS size (MiB)=0.00860595703125\n", + "[15:41:46] MPS (INFO) - MPS fidelity=0.9967787323351995\n", + "[15:41:46] Simulation (INFO) - Progress... 20%\n", + "[15:41:46] Simulation (INFO) - Progress... 20%\n", + "[15:41:46] Simulation (INFO) - Progress... 20%\n", + "[15:41:46] MPS (INFO) - MPS size (MiB)=0.00958251953125\n", + "[15:41:46] MPS (INFO) - MPS fidelity=0.996089833981607\n", + "[15:41:46] Simulation (INFO) - Progress... 20%\n", + "[15:41:46] Simulation (INFO) - Progress... 20%\n", + "[15:41:46] Simulation (INFO) - Progress... 20%\n", + "[15:41:46] MPS (INFO) - MPS size (MiB)=0.009979248046875\n", + "[15:41:46] MPS (INFO) - MPS fidelity=0.996089833981607\n", + "[15:41:46] Simulation (INFO) - Progress... 21%\n", + "[15:41:46] Simulation (INFO) - Progress... 21%\n", + "[15:41:46] Simulation (INFO) - Progress... 21%\n", + "[15:41:46] MPS (INFO) - MPS size (MiB)=0.009979248046875\n", + "[15:41:46] MPS (INFO) - MPS fidelity=0.9960898339816068\n", + "[15:41:46] Simulation (INFO) - Progress... 21%\n", + "[15:41:46] Simulation (INFO) - Progress... 21%\n", + "[15:41:46] Simulation (INFO) - Progress... 21%\n", + "[15:41:46] MPS (INFO) - MPS size (MiB)=0.009979248046875\n", + "[15:41:46] MPS (INFO) - MPS fidelity=0.9960898339816068\n", + "[15:41:46] Simulation (INFO) - Progress... 22%\n", + "[15:41:46] Simulation (INFO) - Progress... 22%\n", + "[15:41:46] Simulation (INFO) - Progress... 22%\n", + "[15:41:46] Simulation (INFO) - Progress... 22%\n", + "[15:41:46] MPS (INFO) - MPS size (MiB)=0.009979248046875\n", + "[15:41:46] MPS (INFO) - MPS fidelity=0.9955765571586642\n", + "[15:41:46] Simulation (INFO) - Progress... 22%\n", + "[15:41:46] Simulation (INFO) - Progress... 22%\n", + "[15:41:46] Simulation (INFO) - Progress... 23%\n", + "[15:41:46] MPS (INFO) - MPS size (MiB)=0.01007080078125\n", + "[15:41:46] MPS (INFO) - MPS fidelity=0.9955765571586642\n", + "[15:41:46] Simulation (INFO) - Progress... 23%\n", + "[15:41:46] Simulation (INFO) - Progress... 23%\n", + "[15:41:46] Simulation (INFO) - Progress... 23%\n", + "[15:41:46] MPS (INFO) - MPS size (MiB)=0.01031494140625\n", + "[15:41:46] MPS (INFO) - MPS fidelity=0.9955765571586642\n", + "[15:41:46] Simulation (INFO) - Progress... 23%\n", + "[15:41:46] Simulation (INFO) - Progress... 23%\n", + "[15:41:46] Simulation (INFO) - Progress... 24%\n", + "[15:41:47] MPS (INFO) - MPS size (MiB)=0.01080322265625\n", + "[15:41:47] MPS (INFO) - MPS fidelity=0.9955765571586642\n", + "[15:41:47] Simulation (INFO) - Progress... 24%\n", + "[15:41:47] Simulation (INFO) - Progress... 24%\n", + "[15:41:47] Simulation (INFO) - Progress... 24%\n", + "[15:41:47] MPS (INFO) - MPS size (MiB)=0.01153564453125\n", + "[15:41:47] MPS (INFO) - MPS fidelity=0.9951866821980899\n", + "[15:41:47] Simulation (INFO) - Progress... 24%\n", + "[15:41:47] Simulation (INFO) - Progress... 24%\n", + "[15:41:47] Simulation (INFO) - Progress... 25%\n", + "[15:41:47] MPS (INFO) - MPS size (MiB)=0.012542724609375\n", + "[15:41:47] MPS (INFO) - MPS fidelity=0.9945684970193788\n", + "[15:41:47] Simulation (INFO) - Progress... 25%\n", + "[15:41:47] Simulation (INFO) - Progress... 25%\n", + "[15:41:47] Simulation (INFO) - Progress... 25%\n", + "[15:41:47] MPS (INFO) - MPS size (MiB)=0.013336181640625\n", + "[15:41:47] MPS (INFO) - MPS fidelity=0.9937800765622566\n", + "[15:41:47] Simulation (INFO) - Progress... 25%\n", + "[15:41:47] Simulation (INFO) - Progress... 25%\n", + "[15:41:47] Simulation (INFO) - Progress... 26%\n", + "[15:41:47] MPS (INFO) - MPS size (MiB)=0.015167236328125\n", + "[15:41:47] MPS (INFO) - MPS fidelity=0.9933657156418472\n", + "[15:41:47] Simulation (INFO) - Progress... 26%\n", + "[15:41:47] Simulation (INFO) - Progress... 26%\n", + "[15:41:47] Simulation (INFO) - Progress... 26%\n", + "[15:41:47] MPS (INFO) - MPS size (MiB)=0.016326904296875\n", + "[15:41:47] MPS (INFO) - MPS fidelity=0.9926168168757035\n", + "[15:41:47] Simulation (INFO) - Progress... 26%\n", + "[15:41:47] Simulation (INFO) - Progress... 26%\n", + "[15:41:47] Simulation (INFO) - Progress... 27%\n", + "[15:41:47] MPS (INFO) - MPS size (MiB)=0.01806640625\n", + "[15:41:47] MPS (INFO) - MPS fidelity=0.9919907474019105\n", + "[15:41:47] Simulation (INFO) - Progress... 27%\n", + "[15:41:47] Simulation (INFO) - Progress... 27%\n", + "[15:41:47] Simulation (INFO) - Progress... 27%\n", + "[15:41:47] MPS (INFO) - MPS size (MiB)=0.01806640625\n", + "[15:41:47] MPS (INFO) - MPS fidelity=0.9919907474019105\n", + "[15:41:47] Simulation (INFO) - Progress... 27%\n", + "[15:41:47] Simulation (INFO) - Progress... 27%\n", + "[15:41:47] Simulation (INFO) - Progress... 28%\n", + "[15:41:47] MPS (INFO) - MPS size (MiB)=0.01806640625\n", + "[15:41:47] MPS (INFO) - MPS fidelity=0.9919907474019105\n", + "[15:41:47] Simulation (INFO) - Progress... 28%\n", + "[15:41:47] Simulation (INFO) - Progress... 28%\n", + "[15:41:47] Simulation (INFO) - Progress... 28%\n", + "[15:41:47] MPS (INFO) - Applying variational optimisation.\n", + "[15:41:47] MPS (INFO) - Fidelity before optimisation=0.9919907474019105\n", + "[15:41:47] MPS (INFO) - Doing another optimisation sweep...\n", + "[15:41:47] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9944986651228879\n", + "[15:41:47] MPS (INFO) - Doing another optimisation sweep...\n", + "[15:41:47] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9945622863823858\n", + "[15:41:47] MPS (INFO) - Doing another optimisation sweep...\n", + "[15:41:47] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9945744642325651\n", + "[15:41:47] MPS (INFO) - Final fidelity after optimisation=0.9945744642325651\n", + "[15:41:47] MPS (INFO) - MPS size (MiB)=0.01806640625\n", + "[15:41:47] MPS (INFO) - MPS fidelity=0.9945744642325651\n", + "[15:41:47] Simulation (INFO) - Progress... 28%\n", + "[15:41:47] Simulation (INFO) - Progress... 28%\n", + "[15:41:47] Simulation (INFO) - Progress... 29%\n", + "[15:41:47] Simulation (INFO) - Progress... 29%\n", + "[15:41:47] MPS (INFO) - MPS size (MiB)=0.01812744140625\n", + "[15:41:47] MPS (INFO) - MPS fidelity=0.9945744642325651\n", + "[15:41:47] Simulation (INFO) - Progress... 29%\n", + "[15:41:47] Simulation (INFO) - Progress... 29%\n", + "[15:41:47] Simulation (INFO) - Progress... 29%\n", + "[15:41:47] MPS (INFO) - MPS size (MiB)=0.018218994140625\n", + "[15:41:47] MPS (INFO) - MPS fidelity=0.9945744642325651\n", + "[15:41:47] Simulation (INFO) - Progress... 30%\n", + "[15:41:47] Simulation (INFO) - Progress... 30%\n", + "[15:41:47] Simulation (INFO) - Progress... 30%\n", + "[15:41:47] MPS (INFO) - MPS size (MiB)=0.018341064453125\n", + "[15:41:47] MPS (INFO) - MPS fidelity=0.9945744642325651\n", + "[15:41:47] Simulation (INFO) - Progress... 30%\n", + "[15:41:47] Simulation (INFO) - Progress... 30%\n", + "[15:41:47] Simulation (INFO) - Progress... 30%\n", + "[15:41:47] MPS (INFO) - MPS size (MiB)=0.018707275390625\n", + "[15:41:47] MPS (INFO) - MPS fidelity=0.9945744642325651\n", + "[15:41:47] Simulation (INFO) - Progress... 31%\n", + "[15:41:47] Simulation (INFO) - Progress... 31%\n", + "[15:41:47] Simulation (INFO) - Progress... 31%\n", + "[15:41:47] MPS (INFO) - MPS size (MiB)=0.019439697265625\n", + "[15:41:47] MPS (INFO) - MPS fidelity=0.9939252776724739\n", + "[15:41:47] Simulation (INFO) - Progress... 31%\n", + "[15:41:47] Simulation (INFO) - Progress... 31%\n", + "[15:41:47] Simulation (INFO) - Progress... 31%\n", + "[15:41:47] MPS (INFO) - MPS size (MiB)=0.021148681640625\n", + "[15:41:47] MPS (INFO) - MPS fidelity=0.9939252776724739\n", + "[15:41:47] Simulation (INFO) - Progress... 32%\n", + "[15:41:47] Simulation (INFO) - Progress... 32%\n", + "[15:41:47] Simulation (INFO) - Progress... 32%\n", + "[15:41:47] MPS (INFO) - MPS size (MiB)=0.02252197265625\n", + "[15:41:47] MPS (INFO) - MPS fidelity=0.9936102094018504\n", + "[15:41:47] Simulation (INFO) - Progress... 32%\n", + "[15:41:47] Simulation (INFO) - Progress... 32%\n", + "[15:41:47] Simulation (INFO) - Progress... 32%\n", + "[15:41:47] MPS (INFO) - MPS size (MiB)=0.02447509765625\n", + "[15:41:47] MPS (INFO) - MPS fidelity=0.9932716193018882\n", + "[15:41:47] Simulation (INFO) - Progress... 33%\n", + "[15:41:47] Simulation (INFO) - Progress... 33%\n", + "[15:41:47] Simulation (INFO) - Progress... 33%\n", + "[15:41:47] MPS (INFO) - MPS size (MiB)=0.027679443359375\n", + "[15:41:47] MPS (INFO) - MPS fidelity=0.9926992945331796\n", + "[15:41:47] Simulation (INFO) - Progress... 33%\n", + "[15:41:47] Simulation (INFO) - Progress... 33%\n", + "[15:41:47] Simulation (INFO) - Progress... 33%\n", + "[15:41:47] MPS (INFO) - MPS size (MiB)=0.031036376953125\n", + "[15:41:47] MPS (INFO) - MPS fidelity=0.9917770056878091\n", + "[15:41:47] Simulation (INFO) - Progress... 34%\n", + "[15:41:47] Simulation (INFO) - Progress... 34%\n", + "[15:41:47] Simulation (INFO) - Progress... 34%\n", + "[15:41:47] MPS (INFO) - MPS size (MiB)=0.034332275390625\n", + "[15:41:47] MPS (INFO) - MPS fidelity=0.9910186053590768\n", + "[15:41:47] Simulation (INFO) - Progress... 34%\n", + "[15:41:47] Simulation (INFO) - Progress... 34%\n", + "[15:41:47] Simulation (INFO) - Progress... 34%\n", + "[15:41:47] MPS (INFO) - MPS size (MiB)=0.035736083984375\n", + "[15:41:47] MPS (INFO) - MPS fidelity=0.9903708169455654\n", + "[15:41:47] Simulation (INFO) - Progress... 35%\n", + "[15:41:47] Simulation (INFO) - Progress... 35%\n", + "[15:41:47] Simulation (INFO) - Progress... 35%\n", + "[15:41:47] MPS (INFO) - MPS size (MiB)=0.035736083984375\n", + "[15:41:47] MPS (INFO) - MPS fidelity=0.9903708169455654\n", + "[15:41:47] Simulation (INFO) - Progress... 35%\n", + "[15:41:47] Simulation (INFO) - Progress... 35%\n", + "[15:41:47] Simulation (INFO) - Progress... 35%\n", + "[15:41:48] MPS (INFO) - MPS size (MiB)=0.035736083984375\n", + "[15:41:48] MPS (INFO) - MPS fidelity=0.9903708169455654\n", + "[15:41:48] Simulation (INFO) - Progress... 36%\n", + "[15:41:48] Simulation (INFO) - Progress... 36%\n", + "[15:41:48] Simulation (INFO) - Progress... 36%\n", + "[15:41:48] MPS (INFO) - MPS size (MiB)=0.035736083984375\n", + "[15:41:48] MPS (INFO) - MPS fidelity=0.9903708169455652\n", + "[15:41:48] Simulation (INFO) - Progress... 36%\n", + "[15:41:48] Simulation (INFO) - Progress... 36%\n", + "[15:41:48] Simulation (INFO) - Progress... 36%\n", + "[15:41:48] Simulation (INFO) - Progress... 37%\n", + "[15:41:48] MPS (INFO) - MPS size (MiB)=0.035797119140625\n", + "[15:41:48] MPS (INFO) - MPS fidelity=0.9903708169455652\n", + "[15:41:48] Simulation (INFO) - Progress... 37%\n", + "[15:41:48] Simulation (INFO) - Progress... 37%\n", + "[15:41:48] Simulation (INFO) - Progress... 37%\n", + "[15:41:48] MPS (INFO) - MPS size (MiB)=0.035919189453125\n", + "[15:41:48] MPS (INFO) - MPS fidelity=0.9903708169455652\n", + "[15:41:48] Simulation (INFO) - Progress... 37%\n", + "[15:41:48] Simulation (INFO) - Progress... 37%\n", + "[15:41:48] Simulation (INFO) - Progress... 38%\n", + "[15:41:48] MPS (INFO) - MPS size (MiB)=0.035919189453125\n", + "[15:41:48] MPS (INFO) - MPS fidelity=0.9903532709139039\n", + "[15:41:48] Simulation (INFO) - Progress... 38%\n", + "[15:41:48] Simulation (INFO) - Progress... 38%\n", + "[15:41:48] Simulation (INFO) - Progress... 38%\n", + "[15:41:48] MPS (INFO) - MPS size (MiB)=0.036163330078125\n", + "[15:41:48] MPS (INFO) - MPS fidelity=0.9903532709139038\n", + "[15:41:48] Simulation (INFO) - Progress... 38%\n", + "[15:41:48] Simulation (INFO) - Progress... 38%\n", + "[15:41:48] Simulation (INFO) - Progress... 39%\n", + "[15:41:48] MPS (INFO) - MPS size (MiB)=0.036651611328125\n", + "[15:41:48] MPS (INFO) - MPS fidelity=0.9903532709139038\n", + "[15:41:48] Simulation (INFO) - Progress... 39%\n", + "[15:41:48] Simulation (INFO) - Progress... 39%\n", + "[15:41:48] Simulation (INFO) - Progress... 39%\n", + "[15:41:48] MPS (INFO) - MPS size (MiB)=0.03765869140625\n", + "[15:41:48] MPS (INFO) - MPS fidelity=0.9899182044513357\n", + "[15:41:48] Simulation (INFO) - Progress... 39%\n", + "[15:41:48] Simulation (INFO) - Progress... 40%\n", + "[15:41:48] Simulation (INFO) - Progress... 40%\n", + "[15:41:48] MPS (INFO) - MPS size (MiB)=0.038116455078125\n", + "[15:41:48] MPS (INFO) - MPS fidelity=0.9892830604520672\n", + "[15:41:48] Simulation (INFO) - Progress... 40%\n", + "[15:41:48] Simulation (INFO) - Progress... 40%\n", + "[15:41:48] Simulation (INFO) - Progress... 40%\n", + "[15:41:48] MPS (INFO) - MPS size (MiB)=0.040313720703125\n", + "[15:41:48] MPS (INFO) - MPS fidelity=0.9886878009898008\n", + "[15:41:48] Simulation (INFO) - Progress... 40%\n", + "[15:41:48] Simulation (INFO) - Progress... 41%\n", + "[15:41:48] Simulation (INFO) - Progress... 41%\n", + "[15:41:48] MPS (INFO) - MPS size (MiB)=0.043121337890625\n", + "[15:41:48] MPS (INFO) - MPS fidelity=0.9877332864162025\n", + "[15:41:48] Simulation (INFO) - Progress... 41%\n", + "[15:41:48] Simulation (INFO) - Progress... 41%\n", + "[15:41:48] Simulation (INFO) - Progress... 41%\n", + "[15:41:48] MPS (INFO) - MPS size (MiB)=0.047698974609375\n", + "[15:41:48] MPS (INFO) - MPS fidelity=0.9870492609117136\n", + "[15:41:48] Simulation (INFO) - Progress... 41%\n", + "[15:41:48] Simulation (INFO) - Progress... 42%\n", + "[15:41:48] Simulation (INFO) - Progress... 42%\n", + "[15:41:48] MPS (INFO) - MPS size (MiB)=0.052581787109375\n", + "[15:41:48] MPS (INFO) - MPS fidelity=0.9864155906572986\n", + "[15:41:48] Simulation (INFO) - Progress... 42%\n", + "[15:41:48] Simulation (INFO) - Progress... 42%\n", + "[15:41:48] Simulation (INFO) - Progress... 42%\n", + "[15:41:48] MPS (INFO) - MPS size (MiB)=0.060150146484375\n", + "[15:41:48] MPS (INFO) - MPS fidelity=0.985553172457638\n", + "[15:41:48] Simulation (INFO) - Progress... 42%\n", + "[15:41:48] Simulation (INFO) - Progress... 43%\n", + "[15:41:48] Simulation (INFO) - Progress... 43%\n", + "[15:41:48] MPS (INFO) - MPS size (MiB)=0.066925048828125\n", + "[15:41:48] MPS (INFO) - MPS fidelity=0.9848524485301354\n", + "[15:41:48] Simulation (INFO) - Progress... 43%\n", + "[15:41:48] Simulation (INFO) - Progress... 43%\n", + "[15:41:48] Simulation (INFO) - Progress... 43%\n", + "[15:41:48] MPS (INFO) - MPS size (MiB)=0.068695068359375\n", + "[15:41:48] MPS (INFO) - MPS fidelity=0.9848524485301354\n", + "[15:41:48] Simulation (INFO) - Progress... 43%\n", + "[15:41:48] Simulation (INFO) - Progress... 44%\n", + "[15:41:48] Simulation (INFO) - Progress... 44%\n", + "[15:41:48] MPS (INFO) - MPS size (MiB)=0.068695068359375\n", + "[15:41:48] MPS (INFO) - MPS fidelity=0.9848524485301353\n", + "[15:41:48] Simulation (INFO) - Progress... 44%\n", + "[15:41:48] Simulation (INFO) - Progress... 44%\n", + "[15:41:48] Simulation (INFO) - Progress... 44%\n", + "[15:41:48] MPS (INFO) - MPS size (MiB)=0.068695068359375\n", + "[15:41:48] MPS (INFO) - MPS fidelity=0.9848524485301353\n", + "[15:41:48] Simulation (INFO) - Progress... 44%\n", + "[15:41:48] Simulation (INFO) - Progress... 45%\n", + "[15:41:48] Simulation (INFO) - Progress... 45%\n", + "[15:41:48] MPS (INFO) - Applying variational optimisation.\n", + "[15:41:48] MPS (INFO) - Fidelity before optimisation=0.9848524485301353\n", + "[15:41:48] MPS (INFO) - Doing another optimisation sweep...\n", + "[15:41:48] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9873602516768857\n", + "[15:41:48] MPS (INFO) - Doing another optimisation sweep...\n", + "[15:41:48] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9874400577886869\n", + "[15:41:48] MPS (INFO) - Doing another optimisation sweep...\n", + "[15:41:48] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9874665951742544\n", + "[15:41:48] MPS (INFO) - Doing another optimisation sweep...\n", + "[15:41:49] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.987479443857063\n", + "[15:41:49] MPS (INFO) - Final fidelity after optimisation=0.987479443857063\n", + "[15:41:49] MPS (INFO) - MPS size (MiB)=0.068695068359375\n", + "[15:41:49] MPS (INFO) - MPS fidelity=0.987479443857063\n", + "[15:41:49] Simulation (INFO) - Progress... 45%\n", + "[15:41:49] Simulation (INFO) - Progress... 45%\n", + "[15:41:49] Simulation (INFO) - Progress... 45%\n", + "[15:41:49] Simulation (INFO) - Progress... 45%\n", + "[15:41:49] MPS (INFO) - MPS size (MiB)=0.068756103515625\n", + "[15:41:49] MPS (INFO) - MPS fidelity=0.987479443857063\n", + "[15:41:49] Simulation (INFO) - Progress... 46%\n", + "[15:41:49] Simulation (INFO) - Progress... 46%\n", + "[15:41:49] Simulation (INFO) - Progress... 46%\n", + "[15:41:49] Simulation (INFO) - Progress... 46%\n", + "[15:41:49] MPS (INFO) - MPS size (MiB)=0.068878173828125\n", + "[15:41:49] MPS (INFO) - MPS fidelity=0.987479443857063\n", + "[15:41:49] Simulation (INFO) - Progress... 46%\n", + "[15:41:49] Simulation (INFO) - Progress... 46%\n", + "[15:41:49] Simulation (INFO) - Progress... 47%\n", + "[15:41:49] MPS (INFO) - MPS size (MiB)=0.068878173828125\n", + "[15:41:49] MPS (INFO) - MPS fidelity=0.987479443857063\n", + "[15:41:49] Simulation (INFO) - Progress... 47%\n", + "[15:41:49] Simulation (INFO) - Progress... 47%\n", + "[15:41:49] Simulation (INFO) - Progress... 47%\n", + "[15:41:49] Simulation (INFO) - Progress... 47%\n", + "[15:41:49] MPS (INFO) - MPS size (MiB)=0.069122314453125\n", + "[15:41:49] MPS (INFO) - MPS fidelity=0.987479443857063\n", + "[15:41:49] Simulation (INFO) - Progress... 47%\n", + "[15:41:49] Simulation (INFO) - Progress... 48%\n", + "[15:41:49] Simulation (INFO) - Progress... 48%\n", + "[15:41:49] MPS (INFO) - MPS size (MiB)=0.069488525390625\n", + "[15:41:49] MPS (INFO) - MPS fidelity=0.987479443857063\n", + "[15:41:49] Simulation (INFO) - Progress... 48%\n", + "[15:41:49] Simulation (INFO) - Progress... 48%\n", + "[15:41:49] Simulation (INFO) - Progress... 48%\n", + "[15:41:49] MPS (INFO) - Applying variational optimisation.\n", + "[15:41:49] MPS (INFO) - Fidelity before optimisation=0.987479443857063\n", + "[15:41:49] MPS (INFO) - Doing another optimisation sweep...\n", + "[15:41:49] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9874794438570587\n", + "[15:41:49] MPS (INFO) - Doing another optimisation sweep...\n", + "[15:41:49] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9874794438570632\n", + "[15:41:49] MPS (INFO) - Final fidelity after optimisation=0.9874794438570632\n", + "[15:41:49] MPS (INFO) - MPS size (MiB)=0.069488525390625\n", + "[15:41:49] MPS (INFO) - MPS fidelity=0.9874794438570632\n", + "[15:41:49] Simulation (INFO) - Progress... 48%\n", + "[15:41:49] Simulation (INFO) - Progress... 49%\n", + "[15:41:49] Simulation (INFO) - Progress... 49%\n", + "[15:41:49] Simulation (INFO) - Progress... 49%\n", + "[15:41:49] MPS (INFO) - MPS size (MiB)=0.069854736328125\n", + "[15:41:49] MPS (INFO) - MPS fidelity=0.9874794438570632\n", + "[15:41:49] Simulation (INFO) - Progress... 49%\n", + "[15:41:49] Simulation (INFO) - Progress... 49%\n", + "[15:41:49] Simulation (INFO) - Progress... 50%\n", + "[15:41:49] MPS (INFO) - MPS size (MiB)=0.070831298828125\n", + "[15:41:49] MPS (INFO) - MPS fidelity=0.9874794438570634\n", + "[15:41:49] Simulation (INFO) - Progress... 50%\n", + "[15:41:49] Simulation (INFO) - Progress... 50%\n", + "[15:41:49] Simulation (INFO) - Progress... 50%\n", + "[15:41:49] MPS (INFO) - MPS size (MiB)=0.070831298828125\n", + "[15:41:49] MPS (INFO) - MPS fidelity=0.9874794438570634\n", + "[15:41:49] Simulation (INFO) - Progress... 50%\n", + "[15:41:49] Simulation (INFO) - Progress... 50%\n", + "[15:41:49] Simulation (INFO) - Progress... 51%\n", + "[15:41:49] MPS (INFO) - MPS size (MiB)=0.070831298828125\n", + "[15:41:49] MPS (INFO) - MPS fidelity=0.9874794438570637\n", + "[15:41:49] Simulation (INFO) - Progress... 51%\n", + "[15:41:49] Simulation (INFO) - Progress... 51%\n", + "[15:41:49] Simulation (INFO) - Progress... 51%\n", + "[15:41:49] Simulation (INFO) - Progress... 51%\n", + "[15:41:49] MPS (INFO) - MPS size (MiB)=0.071319580078125\n", + "[15:41:49] MPS (INFO) - MPS fidelity=0.9874794438570637\n", + "[15:41:49] Simulation (INFO) - Progress... 51%\n", + "[15:41:49] Simulation (INFO) - Progress... 52%\n", + "[15:41:49] Simulation (INFO) - Progress... 52%\n", + "[15:41:49] MPS (INFO) - MPS size (MiB)=0.072784423828125\n", + "[15:41:49] MPS (INFO) - MPS fidelity=0.9874794438570637\n", + "[15:41:49] Simulation (INFO) - Progress... 52%\n", + "[15:41:49] Simulation (INFO) - Progress... 52%\n", + "[15:41:49] Simulation (INFO) - Progress... 52%\n", + "[15:41:49] MPS (INFO) - MPS size (MiB)=0.072540283203125\n", + "[15:41:49] MPS (INFO) - MPS fidelity=0.9866330729559818\n", + "[15:41:49] Simulation (INFO) - Progress... 52%\n", + "[15:41:49] Simulation (INFO) - Progress... 53%\n", + "[15:41:49] Simulation (INFO) - Progress... 53%\n", + "[15:41:49] MPS (INFO) - MPS size (MiB)=0.073211669921875\n", + "[15:41:49] MPS (INFO) - MPS fidelity=0.9866330729559818\n", + "[15:41:49] Simulation (INFO) - Progress... 53%\n", + "[15:41:49] Simulation (INFO) - Progress... 53%\n", + "[15:41:49] Simulation (INFO) - Progress... 53%\n", + "[15:41:49] MPS (INFO) - MPS size (MiB)=0.073822021484375\n", + "[15:41:49] MPS (INFO) - MPS fidelity=0.9866330729559818\n", + "[15:41:49] Simulation (INFO) - Progress... 53%\n", + "[15:41:49] Simulation (INFO) - Progress... 54%\n", + "[15:41:49] Simulation (INFO) - Progress... 54%\n", + "[15:41:49] MPS (INFO) - MPS size (MiB)=0.074920654296875\n", + "[15:41:49] MPS (INFO) - MPS fidelity=0.9866330729559817\n", + "[15:41:49] Simulation (INFO) - Progress... 54%\n", + "[15:41:49] Simulation (INFO) - Progress... 54%\n", + "[15:41:49] Simulation (INFO) - Progress... 54%\n", + "[15:41:49] MPS (INFO) - MPS size (MiB)=0.074920654296875\n", + "[15:41:49] MPS (INFO) - MPS fidelity=0.985728058386732\n", + "[15:41:49] Simulation (INFO) - Progress... 54%\n", + "[15:41:49] Simulation (INFO) - Progress... 55%\n", + "[15:41:49] Simulation (INFO) - Progress... 55%\n", + "[15:41:49] MPS (INFO) - MPS size (MiB)=0.076507568359375\n", + "[15:41:49] MPS (INFO) - MPS fidelity=0.9848905743017655\n", + "[15:41:49] Simulation (INFO) - Progress... 55%\n", + "[15:41:49] Simulation (INFO) - Progress... 55%\n", + "[15:41:49] Simulation (INFO) - Progress... 55%\n", + "[15:41:49] MPS (INFO) - MPS size (MiB)=0.0782470703125\n", + "[15:41:49] MPS (INFO) - MPS fidelity=0.984200933510651\n", + "[15:41:49] Simulation (INFO) - Progress... 55%\n", + "[15:41:49] Simulation (INFO) - Progress... 56%\n", + "[15:41:49] Simulation (INFO) - Progress... 56%\n", + "[15:41:49] MPS (INFO) - MPS size (MiB)=0.08209228515625\n", + "[15:41:49] MPS (INFO) - MPS fidelity=0.9833786711539604\n", + "[15:41:49] Simulation (INFO) - Progress... 56%\n", + "[15:41:49] Simulation (INFO) - Progress... 56%\n", + "[15:41:49] Simulation (INFO) - Progress... 56%\n", + "[15:41:49] MPS (INFO) - MPS size (MiB)=0.08514404296875\n", + "[15:41:49] MPS (INFO) - MPS fidelity=0.9829054162238393\n", + "[15:41:49] Simulation (INFO) - Progress... 56%\n", + "[15:41:49] Simulation (INFO) - Progress... 57%\n", + "[15:41:49] Simulation (INFO) - Progress... 57%\n", + "[15:41:49] MPS (INFO) - MPS size (MiB)=0.093994140625\n", + "[15:41:49] MPS (INFO) - MPS fidelity=0.9823548457232609\n", + "[15:41:49] Simulation (INFO) - Progress... 57%\n", + "[15:41:49] Simulation (INFO) - Progress... 57%\n", + "[15:41:49] Simulation (INFO) - Progress... 57%\n", + "[15:41:49] MPS (INFO) - MPS size (MiB)=0.10003662109375\n", + "[15:41:49] MPS (INFO) - MPS fidelity=0.9814914262501793\n", + "[15:41:49] Simulation (INFO) - Progress... 57%\n", + "[15:41:49] Simulation (INFO) - Progress... 58%\n", + "[15:41:49] Simulation (INFO) - Progress... 58%\n", + "[15:41:49] MPS (INFO) - MPS size (MiB)=0.116302490234375\n", + "[15:41:49] MPS (INFO) - MPS fidelity=0.9806647381641405\n", + "[15:41:49] Simulation (INFO) - Progress... 58%\n", + "[15:41:49] Simulation (INFO) - Progress... 58%\n", + "[15:41:49] Simulation (INFO) - Progress... 58%\n", + "[15:41:49] MPS (INFO) - MPS size (MiB)=0.118499755859375\n", + "[15:41:49] MPS (INFO) - MPS fidelity=0.9797474281526156\n", + "[15:41:50] Simulation (INFO) - Progress... 58%\n", + "[15:41:50] Simulation (INFO) - Progress... 59%\n", + "[15:41:50] Simulation (INFO) - Progress... 59%\n", + "[15:41:50] MPS (INFO) - MPS size (MiB)=0.137542724609375\n", + "[15:41:50] MPS (INFO) - MPS fidelity=0.9792041496059278\n", + "[15:41:50] Simulation (INFO) - Progress... 59%\n", + "[15:41:50] Simulation (INFO) - Progress... 59%\n", + "[15:41:50] Simulation (INFO) - Progress... 59%\n", + "[15:41:50] MPS (INFO) - MPS size (MiB)=0.150360107421875\n", + "[15:41:50] MPS (INFO) - MPS fidelity=0.9784485799686532\n", + "[15:41:50] Simulation (INFO) - Progress... 60%\n", + "[15:41:50] Simulation (INFO) - Progress... 60%\n", + "[15:41:50] Simulation (INFO) - Progress... 60%\n", + "[15:41:50] MPS (INFO) - MPS size (MiB)=0.175567626953125\n", + "[15:41:50] MPS (INFO) - MPS fidelity=0.977661825354294\n", + "[15:41:50] Simulation (INFO) - Progress... 60%\n", + "[15:41:50] Simulation (INFO) - Progress... 60%\n", + "[15:41:50] Simulation (INFO) - Progress... 60%\n", + "[15:41:50] MPS (INFO) - MPS size (MiB)=0.192779541015625\n", + "[15:41:50] MPS (INFO) - MPS fidelity=0.9768742140627227\n", + "[15:41:50] Simulation (INFO) - Progress... 61%\n", + "[15:41:50] Simulation (INFO) - Progress... 61%\n", + "[15:41:50] Simulation (INFO) - Progress... 61%\n", + "[15:41:50] MPS (INFO) - MPS size (MiB)=0.236358642578125\n", + "[15:41:50] MPS (INFO) - MPS fidelity=0.9761008623122066\n", + "[15:41:50] Simulation (INFO) - Progress... 61%\n", + "[15:41:50] Simulation (INFO) - Progress... 61%\n", + "[15:41:50] Simulation (INFO) - Progress... 61%\n", + "[15:41:50] MPS (INFO) - MPS size (MiB)=0.24725341796875\n", + "[15:41:50] MPS (INFO) - MPS fidelity=0.9752497693902976\n", + "[15:41:50] Simulation (INFO) - Progress... 62%\n", + "[15:41:50] Simulation (INFO) - Progress... 62%\n", + "[15:41:50] Simulation (INFO) - Progress... 62%\n", + "[15:41:50] MPS (INFO) - MPS size (MiB)=0.277008056640625\n", + "[15:41:50] MPS (INFO) - MPS fidelity=0.9744546401208022\n", + "[15:41:50] Simulation (INFO) - Progress... 62%\n", + "[15:41:50] Simulation (INFO) - Progress... 62%\n", + "[15:41:50] Simulation (INFO) - Progress... 62%\n", + "[15:41:50] MPS (INFO) - MPS size (MiB)=0.277008056640625\n", + "[15:41:50] MPS (INFO) - MPS fidelity=0.9744546401208022\n", + "[15:41:50] Simulation (INFO) - Progress... 63%\n", + "[15:41:50] Simulation (INFO) - Progress... 63%\n", + "[15:41:50] Simulation (INFO) - Progress... 63%\n", + "[15:41:50] MPS (INFO) - MPS size (MiB)=0.284820556640625\n", + "[15:41:50] MPS (INFO) - MPS fidelity=0.9744546401208022\n", + "[15:41:50] Simulation (INFO) - Progress... 63%\n", + "[15:41:50] Simulation (INFO) - Progress... 63%\n", + "[15:41:50] Simulation (INFO) - Progress... 63%\n", + "[15:41:50] MPS (INFO) - MPS size (MiB)=0.284820556640625\n", + "[15:41:50] MPS (INFO) - MPS fidelity=0.9744546401208022\n", + "[15:41:50] Simulation (INFO) - Progress... 64%\n", + "[15:41:50] Simulation (INFO) - Progress... 64%\n", + "[15:41:50] Simulation (INFO) - Progress... 64%\n", + "[15:41:50] MPS (INFO) - MPS size (MiB)=0.284820556640625\n", + "[15:41:50] MPS (INFO) - MPS fidelity=0.9744546401208022\n", + "[15:41:50] Simulation (INFO) - Progress... 64%\n", + "[15:41:50] Simulation (INFO) - Progress... 64%\n", + "[15:41:50] Simulation (INFO) - Progress... 64%\n", + "[15:41:50] MPS (INFO) - MPS size (MiB)=0.284820556640625\n", + "[15:41:50] MPS (INFO) - MPS fidelity=0.9744546401208021\n", + "[15:41:50] Simulation (INFO) - Progress... 65%\n", + "[15:41:50] Simulation (INFO) - Progress... 65%\n", + "[15:41:50] Simulation (INFO) - Progress... 65%\n", + "[15:41:50] MPS (INFO) - MPS size (MiB)=0.284820556640625\n", + "[15:41:50] MPS (INFO) - MPS fidelity=0.9744546401208021\n", + "[15:41:50] Simulation (INFO) - Progress... 65%\n", + "[15:41:50] Simulation (INFO) - Progress... 65%\n", + "[15:41:50] Simulation (INFO) - Progress... 65%\n", + "[15:41:50] MPS (INFO) - MPS size (MiB)=0.284820556640625\n", + "[15:41:50] MPS (INFO) - MPS fidelity=0.9744546401208023\n", + "[15:41:50] Simulation (INFO) - Progress... 66%\n", + "[15:41:50] Simulation (INFO) - Progress... 66%\n", + "[15:41:50] Simulation (INFO) - Progress... 66%\n", + "[15:41:50] MPS (INFO) - MPS size (MiB)=0.284820556640625\n", + "[15:41:50] MPS (INFO) - MPS fidelity=0.9744546401208023\n", + "[15:41:50] Simulation (INFO) - Progress... 66%\n", + "[15:41:50] MPS (INFO) - MPS size (MiB)=0.284454345703125\n", + "[15:41:50] MPS (INFO) - MPS fidelity=0.9736774416720088\n", + "[15:41:50] Simulation (INFO) - Progress... 66%\n", + "[15:41:50] Simulation (INFO) - Progress... 66%\n", + "[15:41:50] Simulation (INFO) - Progress... 67%\n", + "[15:41:50] MPS (INFO) - Applying variational optimisation.\n", + "[15:41:50] MPS (INFO) - Fidelity before optimisation=0.9736774416720088\n", + "[15:41:50] MPS (INFO) - Doing another optimisation sweep...\n", + "[15:41:50] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9822122042244481\n", + "[15:41:50] MPS (INFO) - Doing another optimisation sweep...\n", + "[15:41:50] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9827583003913757\n", + "[15:41:50] MPS (INFO) - Doing another optimisation sweep...\n", + "[15:41:50] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9829168903407746\n", + "[15:41:50] MPS (INFO) - Doing another optimisation sweep...\n", + "[15:41:51] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.982979344248083\n", + "[15:41:51] MPS (INFO) - Doing another optimisation sweep...\n", + "[15:41:51] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9830095477136648\n", + "[15:41:51] MPS (INFO) - Doing another optimisation sweep...\n", + "[15:41:51] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9830260810282695\n", + "[15:41:51] MPS (INFO) - Final fidelity after optimisation=0.9830260810282695\n", + "[15:41:51] MPS (INFO) - MPS size (MiB)=0.284454345703125\n", + "[15:41:51] MPS (INFO) - MPS fidelity=0.9825960930899819\n", + "[15:41:51] Simulation (INFO) - Progress... 67%\n", + "[15:41:51] Simulation (INFO) - Progress... 67%\n", + "[15:41:51] Simulation (INFO) - Progress... 67%\n", + "[15:41:51] MPS (INFO) - MPS size (MiB)=0.285736083984375\n", + "[15:41:51] MPS (INFO) - MPS fidelity=0.9819799784936092\n", + "[15:41:51] Simulation (INFO) - Progress... 67%\n", + "[15:41:51] Simulation (INFO) - Progress... 67%\n", + "[15:41:51] Simulation (INFO) - Progress... 68%\n", + "[15:41:51] MPS (INFO) - MPS size (MiB)=0.288055419921875\n", + "[15:41:51] MPS (INFO) - MPS fidelity=0.9811857364040928\n", + "[15:41:51] Simulation (INFO) - Progress... 68%\n", + "[15:41:51] Simulation (INFO) - Progress... 68%\n", + "[15:41:51] Simulation (INFO) - Progress... 68%\n", + "[15:41:51] MPS (INFO) - MPS size (MiB)=0.2901611328125\n", + "[15:41:51] MPS (INFO) - MPS fidelity=0.9805589329022365\n", + "[15:41:51] Simulation (INFO) - Progress... 68%\n", + "[15:41:51] Simulation (INFO) - Progress... 68%\n", + "[15:41:51] Simulation (INFO) - Progress... 69%\n", + "[15:41:51] MPS (INFO) - MPS size (MiB)=0.29742431640625\n", + "[15:41:51] MPS (INFO) - MPS fidelity=0.979774777914149\n", + "[15:41:51] Simulation (INFO) - Progress... 69%\n", + "[15:41:51] Simulation (INFO) - Progress... 69%\n", + "[15:41:51] Simulation (INFO) - Progress... 69%\n", + "[15:41:51] MPS (INFO) - MPS size (MiB)=0.3004150390625\n", + "[15:41:51] MPS (INFO) - MPS fidelity=0.9790302714655779\n", + "[15:41:51] Simulation (INFO) - Progress... 69%\n", + "[15:41:51] Simulation (INFO) - Progress... 70%\n", + "[15:41:51] Simulation (INFO) - Progress... 70%\n", + "[15:41:51] MPS (INFO) - MPS size (MiB)=0.3072509765625\n", + "[15:41:51] MPS (INFO) - MPS fidelity=0.9781050017075105\n", + "[15:41:51] Simulation (INFO) - Progress... 70%\n", + "[15:41:51] Simulation (INFO) - Progress... 70%\n", + "[15:41:51] Simulation (INFO) - Progress... 70%\n", + "[15:41:51] MPS (INFO) - MPS size (MiB)=0.32537841796875\n", + "[15:41:51] MPS (INFO) - MPS fidelity=0.9772629361326794\n", + "[15:41:51] Simulation (INFO) - Progress... 70%\n", + "[15:41:51] Simulation (INFO) - Progress... 71%\n", + "[15:41:51] Simulation (INFO) - Progress... 71%\n", + "[15:41:51] MPS (INFO) - MPS size (MiB)=0.349822998046875\n", + "[15:41:51] MPS (INFO) - MPS fidelity=0.9763363776760228\n", + "[15:41:51] Simulation (INFO) - Progress... 71%\n", + "[15:41:51] Simulation (INFO) - Progress... 71%\n", + "[15:41:51] Simulation (INFO) - Progress... 71%\n", + "[15:41:51] MPS (INFO) - MPS size (MiB)=0.358062744140625\n", + "[15:41:51] MPS (INFO) - MPS fidelity=0.9754556940251295\n", + "[15:41:51] Simulation (INFO) - Progress... 71%\n", + "[15:41:51] Simulation (INFO) - Progress... 72%\n", + "[15:41:51] Simulation (INFO) - Progress... 72%\n", + "[15:41:51] MPS (INFO) - MPS size (MiB)=0.365570068359375\n", + "[15:41:51] MPS (INFO) - MPS fidelity=0.9745025792245486\n", + "[15:41:51] Simulation (INFO) - Progress... 72%\n", + "[15:41:51] Simulation (INFO) - Progress... 72%\n", + "[15:41:51] Simulation (INFO) - Progress... 72%\n", + "[15:41:51] MPS (INFO) - MPS size (MiB)=0.365570068359375\n", + "[15:41:51] MPS (INFO) - MPS fidelity=0.9745025792245484\n", + "[15:41:51] Simulation (INFO) - Progress... 72%\n", + "[15:41:51] Simulation (INFO) - Progress... 73%\n", + "[15:41:51] Simulation (INFO) - Progress... 73%\n", + "[15:41:51] MPS (INFO) - MPS size (MiB)=0.365570068359375\n", + "[15:41:51] MPS (INFO) - MPS fidelity=0.9745025792245484\n", + "[15:41:51] Simulation (INFO) - Progress... 73%\n", + "[15:41:51] MPS (INFO) - MPS size (MiB)=0.365570068359375\n", + "[15:41:51] MPS (INFO) - MPS fidelity=0.9745025792245482\n", + "[15:41:51] Simulation (INFO) - Progress... 73%\n", + "[15:41:51] Simulation (INFO) - Progress... 73%\n", + "[15:41:51] Simulation (INFO) - Progress... 73%\n", + "[15:41:51] MPS (INFO) - MPS size (MiB)=0.365936279296875\n", + "[15:41:51] MPS (INFO) - MPS fidelity=0.9745025792245482\n", + "[15:41:51] Simulation (INFO) - Progress... 74%\n", + "[15:41:51] Simulation (INFO) - Progress... 74%\n", + "[15:41:51] Simulation (INFO) - Progress... 74%\n", + "[15:41:51] MPS (INFO) - MPS size (MiB)=0.366973876953125\n", + "[15:41:51] MPS (INFO) - MPS fidelity=0.9739737340007235\n", + "[15:41:51] Simulation (INFO) - Progress... 74%\n", + "[15:41:51] Simulation (INFO) - Progress... 74%\n", + "[15:41:51] Simulation (INFO) - Progress... 74%\n", + "[15:41:51] MPS (INFO) - MPS size (MiB)=0.369415283203125\n", + "[15:41:51] MPS (INFO) - MPS fidelity=0.9734939221919511\n", + "[15:41:51] Simulation (INFO) - Progress... 75%\n", + "[15:41:51] Simulation (INFO) - Progress... 75%\n", + "[15:41:51] Simulation (INFO) - Progress... 75%\n", + "[15:41:51] MPS (INFO) - MPS size (MiB)=0.374176025390625\n", + "[15:41:51] MPS (INFO) - MPS fidelity=0.9728701873772134\n", + "[15:41:51] Simulation (INFO) - Progress... 75%\n", + "[15:41:51] Simulation (INFO) - Progress... 75%\n", + "[15:41:51] Simulation (INFO) - Progress... 75%\n", + "[15:41:51] MPS (INFO) - MPS size (MiB)=0.378570556640625\n", + "[15:41:51] MPS (INFO) - MPS fidelity=0.9720376362143338\n", + "[15:41:51] Simulation (INFO) - Progress... 76%\n", + "[15:41:51] Simulation (INFO) - Progress... 76%\n", + "[15:41:51] Simulation (INFO) - Progress... 76%\n", + "[15:41:51] MPS (INFO) - MPS size (MiB)=0.383453369140625\n", + "[15:41:51] MPS (INFO) - MPS fidelity=0.971167337001675\n", + "[15:41:51] Simulation (INFO) - Progress... 76%\n", + "[15:41:51] Simulation (INFO) - Progress... 76%\n", + "[15:41:51] Simulation (INFO) - Progress... 76%\n", + "[15:41:51] MPS (INFO) - MPS size (MiB)=0.39910888671875\n", + "[15:41:51] MPS (INFO) - MPS fidelity=0.9703795628080001\n", + "[15:41:51] Simulation (INFO) - Progress... 77%\n", + "[15:41:51] Simulation (INFO) - Progress... 77%\n", + "[15:41:51] Simulation (INFO) - Progress... 77%\n", + "[15:41:51] MPS (INFO) - MPS size (MiB)=0.43072509765625\n", + "[15:41:51] MPS (INFO) - MPS fidelity=0.9695212202086415\n", + "[15:41:51] Simulation (INFO) - Progress... 77%\n", + "[15:41:51] Simulation (INFO) - Progress... 77%\n", + "[15:41:51] Simulation (INFO) - Progress... 77%\n", + "[15:41:52] MPS (INFO) - MPS size (MiB)=0.490478515625\n", + "[15:41:52] MPS (INFO) - MPS fidelity=0.9686850339371813\n", + "[15:41:52] Simulation (INFO) - Progress... 78%\n", + "[15:41:52] Simulation (INFO) - Progress... 78%\n", + "[15:41:52] Simulation (INFO) - Progress... 78%\n", + "[15:41:52] MPS (INFO) - MPS size (MiB)=0.5670166015625\n", + "[15:41:52] MPS (INFO) - MPS fidelity=0.9678550687968107\n", + "[15:41:52] Simulation (INFO) - Progress... 78%\n", + "[15:41:52] Simulation (INFO) - Progress... 78%\n", + "[15:41:52] Simulation (INFO) - Progress... 78%\n", + "[15:41:52] MPS (INFO) - MPS size (MiB)=0.61614990234375\n", + "[15:41:52] MPS (INFO) - MPS fidelity=0.9669360842897095\n", + "[15:41:52] Simulation (INFO) - Progress... 79%\n", + "[15:41:52] Simulation (INFO) - Progress... 79%\n", + "[15:41:52] Simulation (INFO) - Progress... 79%\n", + "[15:41:52] MPS (INFO) - MPS size (MiB)=0.64251708984375\n", + "[15:41:52] MPS (INFO) - MPS fidelity=0.9660548082975919\n", + "[15:41:52] Simulation (INFO) - Progress... 79%\n", + "[15:41:52] MPS (INFO) - MPS size (MiB)=0.64251708984375\n", + "[15:41:52] MPS (INFO) - MPS fidelity=0.9660548082975919\n", + "[15:41:52] Simulation (INFO) - Progress... 79%\n", + "[15:41:52] Simulation (INFO) - Progress... 80%\n", + "[15:41:52] Simulation (INFO) - Progress... 80%\n", + "[15:41:52] Simulation (INFO) - Progress... 80%\n", + "[15:41:52] MPS (INFO) - MPS size (MiB)=0.64251708984375\n", + "[15:41:52] MPS (INFO) - MPS fidelity=0.9660548082975922\n", + "[15:41:52] Simulation (INFO) - Progress... 80%\n", + "[15:41:52] Simulation (INFO) - Progress... 80%\n", + "[15:41:52] Simulation (INFO) - Progress... 80%\n", + "[15:41:52] MPS (INFO) - MPS size (MiB)=0.64251708984375\n", + "[15:41:52] MPS (INFO) - MPS fidelity=0.9660548082975922\n", + "[15:41:52] Simulation (INFO) - Progress... 81%\n", + "[15:41:52] Simulation (INFO) - Progress... 81%\n", + "[15:41:52] Simulation (INFO) - Progress... 81%\n", + "[15:41:52] Simulation (INFO) - Progress... 81%\n", + "[15:41:52] MPS (INFO) - MPS size (MiB)=0.64251708984375\n", + "[15:41:52] MPS (INFO) - MPS fidelity=0.9660548082975922\n", + "[15:41:52] Simulation (INFO) - Progress... 81%\n", + "[15:41:52] Simulation (INFO) - Progress... 81%\n", + "[15:41:52] Simulation (INFO) - Progress... 82%\n", + "[15:41:52] MPS (INFO) - Applying variational optimisation.\n", + "[15:41:52] MPS (INFO) - Fidelity before optimisation=0.9660548082975922\n", + "[15:41:52] MPS (INFO) - Doing another optimisation sweep...\n", + "[15:41:52] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9714782872349863\n", + "[15:41:52] MPS (INFO) - Doing another optimisation sweep...\n", + "[15:41:52] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9716864883910468\n", + "[15:41:52] MPS (INFO) - Doing another optimisation sweep...\n", + "[15:41:52] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9717552987705841\n", + "[15:41:52] MPS (INFO) - Doing another optimisation sweep...\n", + "[15:41:53] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9717903497055657\n", + "[15:41:53] MPS (INFO) - Doing another optimisation sweep...\n", + "[15:41:53] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9718115474633439\n", + "[15:41:53] MPS (INFO) - Doing another optimisation sweep...\n", + "[15:41:53] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9718256606609913\n", + "[15:41:53] MPS (INFO) - Final fidelity after optimisation=0.9718256606609913\n", + "[15:41:53] MPS (INFO) - MPS size (MiB)=0.64251708984375\n", + "[15:41:53] MPS (INFO) - MPS fidelity=0.9718256606609913\n", + "[15:41:53] Simulation (INFO) - Progress... 82%\n", + "[15:41:53] Simulation (INFO) - Progress... 82%\n", + "[15:41:53] Simulation (INFO) - Progress... 82%\n", + "[15:41:53] MPS (INFO) - MPS size (MiB)=0.64251708984375\n", + "[15:41:53] MPS (INFO) - MPS fidelity=0.9718256606609913\n", + "[15:41:53] Simulation (INFO) - Progress... 82%\n", + "[15:41:53] Simulation (INFO) - Progress... 82%\n", + "[15:41:53] Simulation (INFO) - Progress... 83%\n", + "[15:41:53] Simulation (INFO) - Progress... 83%\n", + "[15:41:53] MPS (INFO) - MPS size (MiB)=0.645721435546875\n", + "[15:41:53] MPS (INFO) - MPS fidelity=0.971304662959029\n", + "[15:41:53] Simulation (INFO) - Progress... 83%\n", + "[15:41:53] Simulation (INFO) - Progress... 83%\n", + "[15:41:53] Simulation (INFO) - Progress... 83%\n", + "[15:41:53] MPS (INFO) - MPS size (MiB)=0.645721435546875\n", + "[15:41:53] MPS (INFO) - MPS fidelity=0.971304662959029\n", + "[15:41:53] Simulation (INFO) - Progress... 83%\n", + "[15:41:53] Simulation (INFO) - Progress... 84%\n", + "[15:41:53] Simulation (INFO) - Progress... 84%\n", + "[15:41:53] MPS (INFO) - MPS size (MiB)=0.645721435546875\n", + "[15:41:53] MPS (INFO) - MPS fidelity=0.9713046629590292\n", + "[15:41:53] Simulation (INFO) - Progress... 84%\n", + "[15:41:53] Simulation (INFO) - Progress... 84%\n", + "[15:41:53] Simulation (INFO) - Progress... 84%\n", + "[15:41:53] MPS (INFO) - MPS size (MiB)=0.645721435546875\n", + "[15:41:53] MPS (INFO) - MPS fidelity=0.9713046629590292\n", + "[15:41:53] Simulation (INFO) - Progress... 84%\n", + "[15:41:53] Simulation (INFO) - Progress... 85%\n", + "[15:41:53] Simulation (INFO) - Progress... 85%\n", + "[15:41:53] Simulation (INFO) - Progress... 85%\n", + "[15:41:53] MPS (INFO) - MPS size (MiB)=0.65234375\n", + "[15:41:53] MPS (INFO) - MPS fidelity=0.9705519636179583\n", + "[15:41:53] Simulation (INFO) - Progress... 85%\n", + "[15:41:53] Simulation (INFO) - Progress... 85%\n", + "[15:41:53] Simulation (INFO) - Progress... 85%\n", + "[15:41:53] MPS (INFO) - MPS size (MiB)=0.6531982421875\n", + "[15:41:53] MPS (INFO) - MPS fidelity=0.9705519636179583\n", + "[15:41:53] Simulation (INFO) - Progress... 86%\n", + "[15:41:53] Simulation (INFO) - Progress... 86%\n", + "[15:41:53] Simulation (INFO) - Progress... 86%\n", + "[15:41:53] MPS (INFO) - MPS size (MiB)=0.6531982421875\n", + "[15:41:53] MPS (INFO) - MPS fidelity=0.9705519636179583\n", + "[15:41:53] Simulation (INFO) - Progress... 86%\n", + "[15:41:53] Simulation (INFO) - Progress... 86%\n", + "[15:41:53] Simulation (INFO) - Progress... 86%\n", + "[15:41:53] MPS (INFO) - Applying variational optimisation.\n", + "[15:41:53] MPS (INFO) - Fidelity before optimisation=0.9705519636179583\n", + "[15:41:53] MPS (INFO) - Doing another optimisation sweep...\n", + "[15:41:53] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9710393809351289\n", + "[15:41:53] MPS (INFO) - Doing another optimisation sweep...\n", + "[15:41:54] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9710417093966089\n", + "[15:41:54] MPS (INFO) - Final fidelity after optimisation=0.9710417093966089\n", + "[15:41:54] MPS (INFO) - MPS size (MiB)=0.6531982421875\n", + "[15:41:54] MPS (INFO) - MPS fidelity=0.9710417093966089\n", + "[15:41:54] Simulation (INFO) - Progress... 87%\n", + "[15:41:54] Simulation (INFO) - Progress... 87%\n", + "[15:41:54] Simulation (INFO) - Progress... 87%\n", + "[15:41:54] MPS (INFO) - MPS size (MiB)=0.6531982421875\n", + "[15:41:54] MPS (INFO) - MPS fidelity=0.9710417093966089\n", + "[15:41:54] Simulation (INFO) - Progress... 87%\n", + "[15:41:54] Simulation (INFO) - Progress... 87%\n", + "[15:41:54] Simulation (INFO) - Progress... 87%\n", + "[15:41:54] Simulation (INFO) - Progress... 88%\n", + "[15:41:54] MPS (INFO) - MPS size (MiB)=0.663360595703125\n", + "[15:41:54] MPS (INFO) - MPS fidelity=0.9703316436673765\n", + "[15:41:54] Simulation (INFO) - Progress... 88%\n", + "[15:41:54] Simulation (INFO) - Progress... 88%\n", + "[15:41:54] Simulation (INFO) - Progress... 88%\n", + "[15:41:54] MPS (INFO) - MPS size (MiB)=0.6771240234375\n", + "[15:41:54] MPS (INFO) - MPS fidelity=0.9697826685947312\n", + "[15:41:54] Simulation (INFO) - Progress... 88%\n", + "[15:41:54] Simulation (INFO) - Progress... 88%\n", + "[15:41:54] Simulation (INFO) - Progress... 89%\n", + "[15:41:54] MPS (INFO) - MPS size (MiB)=0.6890869140625\n", + "[15:41:54] MPS (INFO) - MPS fidelity=0.9688822088585105\n", + "[15:41:54] Simulation (INFO) - Progress... 89%\n", + "[15:41:54] Simulation (INFO) - Progress... 89%\n", + "[15:41:54] Simulation (INFO) - Progress... 89%\n", + "[15:41:54] MPS (INFO) - MPS size (MiB)=0.7198486328125\n", + "[15:41:54] MPS (INFO) - MPS fidelity=0.9681016107658179\n", + "[15:41:54] Simulation (INFO) - Progress... 89%\n", + "[15:41:54] Simulation (INFO) - Progress... 90%\n", + "[15:41:54] Simulation (INFO) - Progress... 90%\n", + "[15:41:54] MPS (INFO) - MPS size (MiB)=0.732025146484375\n", + "[15:41:54] MPS (INFO) - MPS fidelity=0.967139989859211\n", + "[15:41:54] Simulation (INFO) - Progress... 90%\n", + "[15:41:54] Simulation (INFO) - Progress... 90%\n", + "[15:41:54] Simulation (INFO) - Progress... 90%\n", + "[15:41:54] MPS (INFO) - MPS size (MiB)=0.786224365234375\n", + "[15:41:54] MPS (INFO) - MPS fidelity=0.9667532538346312\n", + "[15:41:54] Simulation (INFO) - Progress... 90%\n", + "[15:41:54] Simulation (INFO) - Progress... 91%\n", + "[15:41:54] Simulation (INFO) - Progress... 91%\n", + "[15:41:54] MPS (INFO) - MPS size (MiB)=0.805267333984375\n", + "[15:41:54] MPS (INFO) - MPS fidelity=0.9657875697333652\n", + "[15:41:54] Simulation (INFO) - Progress... 91%\n", + "[15:41:54] Simulation (INFO) - Progress... 91%\n", + "[15:41:54] Simulation (INFO) - Progress... 91%\n", + "[15:41:54] MPS (INFO) - MPS size (MiB)=0.870452880859375\n", + "[15:41:54] MPS (INFO) - MPS fidelity=0.9649987228797965\n", + "[15:41:54] Simulation (INFO) - Progress... 91%\n", + "[15:41:54] Simulation (INFO) - Progress... 92%\n", + "[15:41:54] Simulation (INFO) - Progress... 92%\n", + "[15:41:54] MPS (INFO) - MPS size (MiB)=0.927581787109375\n", + "[15:41:54] MPS (INFO) - MPS fidelity=0.9641126521361515\n", + "[15:41:54] Simulation (INFO) - Progress... 92%\n", + "[15:41:54] Simulation (INFO) - Progress... 92%\n", + "[15:41:54] Simulation (INFO) - Progress... 92%\n", + "[15:41:54] MPS (INFO) - MPS size (MiB)=1.066741943359375\n", + "[15:41:54] MPS (INFO) - MPS fidelity=0.9635105846805408\n", + "[15:41:54] Simulation (INFO) - Progress... 92%\n", + "[15:41:54] Simulation (INFO) - Progress... 93%\n", + "[15:41:54] Simulation (INFO) - Progress... 93%\n", + "[15:41:54] MPS (INFO) - MPS size (MiB)=1.15728759765625\n", + "[15:41:54] MPS (INFO) - MPS fidelity=0.962589075282592\n", + "[15:41:54] Simulation (INFO) - Progress... 93%\n", + "[15:41:54] Simulation (INFO) - Progress... 93%\n", + "[15:41:54] Simulation (INFO) - Progress... 93%\n", + "[15:41:54] MPS (INFO) - MPS size (MiB)=1.43927001953125\n", + "[15:41:54] MPS (INFO) - MPS fidelity=0.9617602212979602\n", + "[15:41:54] Simulation (INFO) - Progress... 93%\n", + "[15:41:54] MPS (INFO) - MPS size (MiB)=1.54986572265625\n", + "[15:41:54] MPS (INFO) - MPS fidelity=0.9608510935810075\n", + "[15:41:54] Simulation (INFO) - Progress... 94%\n", + "[15:41:54] MPS (INFO) - MPS size (MiB)=1.54986572265625\n", + "[15:41:54] MPS (INFO) - MPS fidelity=0.9608510935810075\n", + "[15:41:54] Simulation (INFO) - Progress... 94%\n", + "[15:41:54] Simulation (INFO) - Progress... 94%\n", + "[15:41:54] Simulation (INFO) - Progress... 94%\n", + "[15:41:54] MPS (INFO) - MPS size (MiB)=1.54986572265625\n", + "[15:41:54] MPS (INFO) - MPS fidelity=0.9600320773213169\n", + "[15:41:54] Simulation (INFO) - Progress... 94%\n", + "[15:41:54] Simulation (INFO) - Progress... 94%\n", + "[15:41:54] Simulation (INFO) - Progress... 95%\n", + "[15:41:54] MPS (INFO) - Applying variational optimisation.\n", + "[15:41:54] MPS (INFO) - Fidelity before optimisation=0.9600320773213169\n", + "[15:41:54] MPS (INFO) - Doing another optimisation sweep...\n", + "[15:41:54] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9659019975820374\n", + "[15:41:54] MPS (INFO) - Doing another optimisation sweep...\n", + "[15:41:54] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9661427864728673\n", + "[15:41:54] MPS (INFO) - Doing another optimisation sweep...\n", + "[15:41:55] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9662148782989015\n", + "[15:41:55] MPS (INFO) - Doing another optimisation sweep...\n", + "[15:41:55] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9662495844052902\n", + "[15:41:55] MPS (INFO) - Doing another optimisation sweep...\n", + "[15:41:55] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9662703863336176\n", + "[15:41:55] MPS (INFO) - Doing another optimisation sweep...\n", + "[15:41:55] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9662844523829522\n", + "[15:41:55] MPS (INFO) - Final fidelity after optimisation=0.9662844523829522\n", + "[15:41:55] MPS (INFO) - MPS size (MiB)=1.55718994140625\n", + "[15:41:55] MPS (INFO) - MPS fidelity=0.9653257816354918\n", + "[15:41:55] Simulation (INFO) - Progress... 95%\n", + "[15:41:55] Simulation (INFO) - Progress... 95%\n", + "[15:41:55] Simulation (INFO) - Progress... 95%\n", + "[15:41:55] MPS (INFO) - MPS size (MiB)=1.58184814453125\n", + "[15:41:55] MPS (INFO) - MPS fidelity=0.9644004614054085\n", + "[15:41:55] Simulation (INFO) - Progress... 95%\n", + "[15:41:55] Simulation (INFO) - Progress... 95%\n", + "[15:41:55] Simulation (INFO) - Progress... 96%\n", + "[15:41:55] MPS (INFO) - MPS size (MiB)=1.660125732421875\n", + "[15:41:55] MPS (INFO) - MPS fidelity=0.9634633842376111\n", + "[15:41:55] Simulation (INFO) - Progress... 96%\n", + "[15:41:55] MPS (INFO) - MPS size (MiB)=1.660125732421875\n", + "[15:41:55] MPS (INFO) - MPS fidelity=0.9634633842376111\n", + "[15:41:55] Simulation (INFO) - Progress... 96%\n", + "[15:41:55] Simulation (INFO) - Progress... 96%\n", + "[15:41:55] Simulation (INFO) - Progress... 96%\n", + "[15:41:55] MPS (INFO) - MPS size (MiB)=1.660125732421875\n", + "[15:41:55] MPS (INFO) - MPS fidelity=0.9634633842376111\n", + "[15:41:55] Simulation (INFO) - Progress... 96%\n", + "[15:41:55] Simulation (INFO) - Progress... 97%\n", + "[15:41:55] Simulation (INFO) - Progress... 97%\n", + "[15:41:55] MPS (INFO) - MPS size (MiB)=1.662017822265625\n", + "[15:41:55] MPS (INFO) - MPS fidelity=0.9634633842376114\n", + "[15:41:55] Simulation (INFO) - Progress... 97%\n", + "[15:41:55] Simulation (INFO) - Progress... 97%\n", + "[15:41:55] Simulation (INFO) - Progress... 97%\n", + "[15:41:55] MPS (INFO) - MPS size (MiB)=1.700042724609375\n", + "[15:41:55] MPS (INFO) - MPS fidelity=0.9625939072465783\n", + "[15:41:55] Simulation (INFO) - Progress... 97%\n", + "[15:41:55] MPS (INFO) - MPS size (MiB)=1.700042724609375\n", + "[15:41:55] MPS (INFO) - MPS fidelity=0.9625939072465783\n", + "[15:41:55] Simulation (INFO) - Progress... 98%\n", + "[15:41:55] Simulation (INFO) - Progress... 98%\n", + "[15:41:55] Simulation (INFO) - Progress... 98%\n", + "[15:41:55] MPS (INFO) - MPS size (MiB)=1.700042724609375\n", + "[15:41:55] MPS (INFO) - MPS fidelity=0.9625939072465782\n", + "[15:41:55] Simulation (INFO) - Progress... 98%\n", + "[15:41:55] Simulation (INFO) - Progress... 98%\n", + "[15:41:55] Simulation (INFO) - Progress... 98%\n", + "[15:41:55] MPS (INFO) - MPS size (MiB)=1.700042724609375\n", + "[15:41:55] MPS (INFO) - MPS fidelity=0.9625939072465782\n", + "[15:41:55] Simulation (INFO) - Progress... 99%\n", + "[15:41:55] MPS (INFO) - MPS size (MiB)=1.700042724609375\n", + "[15:41:55] MPS (INFO) - MPS fidelity=0.9625939072465782\n", + "[15:41:55] Simulation (INFO) - Progress... 99%\n", + "[15:41:55] Simulation (INFO) - Progress... 99%\n", + "[15:41:55] Simulation (INFO) - Progress... 99%\n", + "[15:41:55] MPS (INFO) - MPS size (MiB)=1.700042724609375\n", + "[15:41:55] MPS (INFO) - MPS fidelity=0.9625939072465782\n", + "[15:41:55] Simulation (INFO) - Progress... 99%\n", + "[15:41:55] MPS (INFO) - Applying variational optimisation.\n", + "[15:41:55] MPS (INFO) - Fidelity before optimisation=0.9625939072465782\n", + "[15:41:56] MPS (INFO) - Doing another optimisation sweep...\n", + "[15:41:56] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9640884677171835\n", + "[15:41:56] MPS (INFO) - Doing another optimisation sweep...\n", + "[15:41:56] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9641174266253738\n", + "[15:41:56] MPS (INFO) - Doing another optimisation sweep...\n", + "[15:41:56] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9641252811032455\n", + "[15:41:56] MPS (INFO) - Final fidelity after optimisation=0.9641252811032455\n", + "[15:41:56] MPS (INFO) - Applying variational optimisation.\n", + "[15:41:56] MPS (INFO) - Fidelity before optimisation=0.9641252811032455\n", + "[15:41:56] MPS (INFO) - Doing another optimisation sweep...\n", + "[15:41:56] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.9641252811032449\n", + "[15:41:56] MPS (INFO) - Doing another optimisation sweep...\n", + "[15:41:56] MPS (INFO) - Optimisation sweep completed. Current fidelity=0.964125281103245\n", + "[15:41:56] MPS (INFO) - Final fidelity after optimisation=0.964125281103245\n", + "[15:41:56] Simulation (INFO) - Simulation completed.\n", + "[15:41:56] Simulation (INFO) - Final MPS size=1.700042724609375 MiB\n", + "[15:41:56] Simulation (INFO) - Final MPS fidelity=0.964125281103245\n" ] } ], "source": [ "with CuTensorNetHandle() as libhandle:\n", - " simulate(libhandle, circuit, ContractionAlg.MPSxMPO, truncation_fidelity=0.999, loglevel=logging.INFO)" + " config = ConfigMPS(truncation_fidelity=0.999, loglevel=logging.INFO)\n", + " simulate(libhandle, circuit, ContractionAlg.MPSxMPO, config)" ] }, { @@ -2105,9 +2114,9 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "py-cuquantum-23.06.0-mypich-py3.9", "language": "python", - "name": "python3" + "name": "py-cuquantum-23.06.0-mypich-py3.9" }, "language_info": { "codemirror_mode": { From 2517ab53fbcc7c98316a48a2295860cf45f43206 Mon Sep 17 00:00:00 2001 From: Pablo Andres-Martinez Date: Tue, 3 Oct 2023 16:00:40 -0700 Subject: [PATCH 15/16] Warning now using warnings module --- pytket/extensions/cutensornet/mps/mps.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pytket/extensions/cutensornet/mps/mps.py b/pytket/extensions/cutensornet/mps/mps.py index 762958cc..a5f40f64 100644 --- a/pytket/extensions/cutensornet/mps/mps.py +++ b/pytket/extensions/cutensornet/mps/mps.py @@ -174,9 +174,10 @@ def __init__( self.zero = value_of_zero if value_of_zero > self._atol / 1000: - logging.warning( + warnings.warn( "Your chosen value_of_zero is relatively large. " - "Faithfulness of final fidelity estimate is not guaranteed." + "Faithfulness of final fidelity estimate is not guaranteed.", + UserWarning, ) self.k = k From 53575b79a2df908652f4aa56bf136da7ea30371b Mon Sep 17 00:00:00 2001 From: PabloAndresCQ Date: Thu, 26 Oct 2023 14:33:04 +0100 Subject: [PATCH 16/16] Minor fixes --- pytket/extensions/cutensornet/mps/mps.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pytket/extensions/cutensornet/mps/mps.py b/pytket/extensions/cutensornet/mps/mps.py index a5f40f64..dec6426a 100644 --- a/pytket/extensions/cutensornet/mps/mps.py +++ b/pytket/extensions/cutensornet/mps/mps.py @@ -181,7 +181,7 @@ def __init__( ) self.k = k - self.optim_delta = 1e-5 + self.optim_delta = optim_delta self.loglevel = loglevel def copy(self) -> ConfigMPS: @@ -192,6 +192,8 @@ def copy(self) -> ConfigMPS: k=self.k, optim_delta=self.optim_delta, float_precision=self._real_t, # type: ignore + value_of_zero=self.zero, + loglevel=self.loglevel, )