qlinks.operators package#
Submodules#
qlinks.operators.base module#
- class qlinks.operators.base.OperatorAction(coefficient, config)[source]#
Bases:
objectOne operator action on one computational configuration.
- coefficient:
Matrix element contributed by this action.
- config:
Resulting configuration after the operator acts. For diagonal operators, this is usually a copy of the input config.
- __init__(coefficient, config)#
- class qlinks.operators.base.LocalOperator(*args, **kwargs)[source]#
Bases:
ProtocolInterface for all configuration-space operators.
- layout: VariableLayout#
- __init__(*args, **kwargs)#
- class qlinks.operators.base.DiagonalLocalOperator(*args, **kwargs)[source]#
Bases:
LocalOperator,ProtocolConfiguration-space diagonal operator.
Returning
Nonemeans the operator gives no action on this config. Returning a complex number means the operator contributes that diagonal matrix element.
- class qlinks.operators.base.BaseLocalOperator[source]#
Bases:
objectConvenience base for configuration-space local operators.
Notes
Concrete operators should precompute geometry/layout-dependent data in
__post_init__()so thatapply()only performs cheap indexed array operations.- layout: VariableLayout#
qlinks.operators.diagonal module#
- class qlinks.operators.diagonal.ConstantDiagonalOperator(layout, coefficient, name='constant_diagonal')[source]#
Bases:
BaseLocalOperatorDiagonal operator c * I.
- layout: VariableLayout#
- __init__(layout, coefficient, name='constant_diagonal')#
- class qlinks.operators.diagonal.LocalValueDiagonalOperator(layout, variable_index, coefficient=1.0, name='local_value_diagonal')[source]#
Bases:
BaseLocalOperatorDiagonal operator proportional to one variable value.
coefficient * config[variable_index]
- layout: VariableLayout#
- __init__(layout, variable_index, coefficient=1.0, name='local_value_diagonal')#
- class qlinks.operators.diagonal.LocalSquareValueDiagonalOperator(layout, variable_index, coefficient=1.0, name='local_square_value_diagonal')[source]#
Bases:
BaseLocalOperatorDiagonal operator proportional to one squared variable value.
coefficient * config[variable_index] ** 2
For spin-1 variables m in {-1, 0, +1}, this represents coefficient * (S^z)^2 in the S^z product basis.
- layout: VariableLayout#
- __init__(layout, variable_index, coefficient=1.0, name='local_square_value_diagonal')#
- class qlinks.operators.diagonal.LocalSumDiagonalOperator(layout, variable_indices, weights=None, coefficient=1.0, name='local_sum_diagonal')[source]#
Bases:
BaseLocalOperatorDiagonal operator
coefficient * sum_i weights[i] * config[variable_indices[i]]
- layout: VariableLayout#
- __init__(layout, variable_indices, weights=None, coefficient=1.0, name='local_sum_diagonal')#
- class qlinks.operators.diagonal.PatternDiagonalOperator(layout, variable_indices, pattern, coefficient=1.0, name='pattern_diagonal')[source]#
Bases:
BaseLocalOperatorDiagonal projector-like operator.
If selected variables match pattern, return coefficient * config. Otherwise return no action.
Example
A flippability counter for a plaquette can be represented as a sum of pattern diagonal operators.
- layout: VariableLayout#
- __init__(layout, variable_indices, pattern, coefficient=1.0, name='pattern_diagonal')#
qlinks.operators.linear module#
- class qlinks.operators.linear.BasisOperator(basis, operators, combine_duplicates=True, drop_zero_atol=0.0, dtype=<class 'numpy.complex128'>)[source]#
Bases:
objectMatrix-like wrapper around configuration-space local operators.
The wrapper applies local operators directly by looping over basis states; it does not explicitly build a sparse matrix. It supports matrix-vector products and transpose/Hermitian-adjoint views.
- basis#
Basis that fixes row/column ordering.
- Type:
- operators#
Local operators to sum.
- Type:
- dtype#
Output dtype for matrix-vector products.
- Type:
type[Any] | numpy.dtype[Any] | numpy._typing._dtype_like._SupportsDType[numpy.dtype[Any]] | tuple[Any, Any] | list[Any] | numpy._typing._dtype_like._DTypeDict | str | None
Examples
>>> operator = BasisOperator(basis, operators) >>> y = operator @ vector >>> y_t = operator.T @ vector >>> y_h = operator.H @ vector
- operators: tuple[LocalOperator, ...]#
- dtype#
alias of
complex128
- property T: TransposedBasisOperator#
- property H: TransposedBasisOperator#
Hermitian adjoint view.
- expectation(vector, *, conjugate=True)[source]#
Compute <v|O|v> by default.
If conjugate=False, compute v.T @ O @ v.
- __init__(basis, operators, combine_duplicates=True, drop_zero_atol=0.0, dtype=<class 'numpy.complex128'>)#
- class qlinks.operators.linear.TransposedBasisOperator(parent, conjugate=False)[source]#
Bases:
objectTranspose or adjoint view of BasisOperator.
- parent: BasisOperator#
- property T: BasisOperator | TransposedBasisOperator#
- property H: BasisOperator#
- __init__(parent, conjugate=False)#
qlinks.operators.plaquette module#
- class qlinks.operators.plaquette.PlaquettePatternTransition(initial, final, coefficient=1.0)[source]#
Bases:
objectOne allowed plaquette pattern transition.
- initial:
Values on plaquette links before the operator acts.
- final:
Values on plaquette links after the operator acts.
- coefficient:
Matrix element for this transition.
- __init__(initial, final, coefficient=1.0)#
- class qlinks.operators.plaquette.PlaquettePatternOperator(layout, lattice, plaquette_id, transitions, name='plaquette_pattern')[source]#
Bases:
BaseLocalOperatorGeneral plaquette transition operator.
It reads the plaquette’s link variables in the lattice plaquette order. If the current values match one of the allowed transition patterns, it returns the corresponding new configuration.
This is suitable for QDM plaquette flips, constrained ring exchanges, and other local loop moves.
- layout: VariableLayout#
- lattice: LatticeGraph#
- transitions: tuple[PlaquettePatternTransition, ...]#
- classmethod qdm_flip(layout, lattice, plaquette_id, coefficient=1.0, reverse_coefficient=None)[source]#
Standard binary dimer plaquette flip:
1010 <-> 0101
The order is the plaquette link order supplied by the lattice.
- classmethod alternating_binary_flip(layout, lattice, plaquette_id, coefficient=1.0, reverse_coefficient=None)[source]#
- __init__(layout, lattice, plaquette_id, transitions, name='plaquette_pattern')#
- qlinks.operators.plaquette.qdm_flippability_projectors(layout, lattice, plaquette_id, coefficient=1.0)[source]#
Return diagonal projectors onto the two flippable QDM plaquette patterns:
1010 and 0101
The potential term V * P_p^2 in a QDM-like model can be represented using these diagonal projectors.
- qlinks.operators.plaquette.alternating_binary_patterns(length)[source]#
Return the two binary alternating patterns on an even plaquette.
- qlinks.operators.plaquette.alternating_flux_patterns(length)[source]#
Return the two
{-1, +1}alternating flux patterns.
- qlinks.operators.plaquette.alternating_binary_flippability_projectors(layout, lattice, plaquette_id, coefficient=1.0)[source]#
Return binary flippability projectors for one plaquette.
- Parameters:
layout (VariableLayout) – Variable layout.
lattice (LatticeGraph) – Lattice containing the plaquette.
plaquette_id (int) – Plaquette id.
coefficient (complex) – Diagonal coefficient for each projector.
- Returns:
Pair of diagonal projectors onto the two alternating binary patterns.
- Return type:
- qlinks.operators.plaquette.alternating_flux_flippability_projectors(layout, lattice, plaquette_id, coefficient=1.0)[source]#
Return flux flippability projectors for one plaquette.
- Parameters:
layout (VariableLayout) – Variable layout.
lattice (LatticeGraph) – Lattice containing the plaquette.
plaquette_id (int) – Plaquette id.
coefficient (complex) – Diagonal coefficient for each projector.
- Returns:
Pair of diagonal projectors onto the two alternating flux patterns.
- Return type:
qlinks.operators.pxp module#
- class qlinks.operators.pxp.PXPSpinFlipOperator(layout, lattice, site_id, coefficient=1.0, occupied_value=1, name='pxp_spin_flip')[source]#
Bases:
BaseLocalOperatorConstrained spin flip for PXP/Rydberg-blockade models.
The spin at site_id is flipped only if all neighboring sites are not occupied.
- With binary variables:
0 <-> 1
- and usually:
occupied_value = 1
- layout: VariableLayout#
- lattice: LatticeGraph#
- __init__(layout, lattice, site_id, coefficient=1.0, occupied_value=1, name='pxp_spin_flip')#
qlinks.operators.spin_one module#
- qlinks.operators.spin_one.spin_one_raise_amplitude(m)[source]#
Spin-1 S^+ amplitude.
for S=1 and m in {-1, 0, 1}.
- qlinks.operators.spin_one.spin_one_lower_amplitude(m)[source]#
Spin-1 S^- amplitude.
for S=1 and m in {-1, 0, 1}.
- class qlinks.operators.spin_one.SpinOneXYBondOperator(layout, lattice, link_id, coefficient=1.0, name='spin_one_xy_bond')[source]#
Bases:
BaseLocalOperatorSpin-1 XY bond operator on sites i,j.
- H_ij = J_xy * (S^x_i S^x_j + S^y_i S^y_j)
= J_xy/2 * (S^+_i S^-_j + S^-_i S^+_j)
The computational basis is the S^z product basis with values:
m_i in {-1, 0, +1}
- layout: VariableLayout#
- lattice: ChainLattice#
- __init__(layout, lattice, link_id, coefficient=1.0, name='spin_one_xy_bond')#
- class qlinks.operators.spin_one.UpdateSpinOneXYBondOperator(layout, lattice, link_id, coefficient=1.0, name='update_spin_one_xy_bond')[source]#
Bases:
BaseLocalUpdateOperatorUpdate-action version of
SpinOneXYBondOperator.The operator returns only local two-site updates instead of allocating full output configurations. It is intended for
OptimizedSparseHamiltonianBuilder.- layout: VariableLayout#
- lattice: ChainLattice#
- __init__(layout, lattice, link_id, coefficient=1.0, name='update_spin_one_xy_bond')#
- class qlinks.operators.spin_one.SpinOneXYPairOperator(layout, site_i, site_j, coefficient=1.0, name='spin_one_xy_pair')[source]#
Bases:
BaseLocalOperatorHermitian spin-1 XY exchange on an arbitrary ordered site pair.
The operator uses the same matrix-element convention as
SpinOneXYBondOperatorfor real couplings,0.5 * (t S_i^+ S_j^- + t^* S_i^- S_j^+).Consequently an allowed
|0,0> -> |+,- >transition has matrix elementt. Complextgives a Hermitian Peierls-phase exchange.- layout: VariableLayout#
- __init__(layout, site_i, site_j, coefficient=1.0, name='spin_one_xy_pair')#
- class qlinks.operators.spin_one.UpdateSpinOneXYPairOperator(layout, site_i, site_j, coefficient=1.0, name='update_spin_one_xy_pair')[source]#
Bases:
BaseLocalUpdateOperatorUpdate-action version of
SpinOneXYPairOperator.- layout: VariableLayout#
- __init__(layout, site_i, site_j, coefficient=1.0, name='update_spin_one_xy_pair')#
qlinks.operators.toric_code module#
- class qlinks.operators.toric_code.ToricCodeStarFlipOperator(layout, lattice, site_id, coefficient=-1.0, name='toric_code_star_flip')[source]#
Bases:
BaseLocalOperatorToric-code star operator A_v in the Z basis.
It flips all links incident on site v.
- layout: VariableLayout#
- lattice: SquareLattice#
- __init__(layout, lattice, site_id, coefficient=-1.0, name='toric_code_star_flip')#
- class qlinks.operators.toric_code.ToricCodePlaquetteFluxOperator(layout, lattice, plaquette_id, coefficient=-1.0, name='toric_code_plaquette_flux')[source]#
Bases:
BaseLocalOperatorToric-code plaquette operator B_p in the Z basis.
It is diagonal:
- layout: VariableLayout#
- lattice: SquareLattice#
- __init__(layout, lattice, plaquette_id, coefficient=-1.0, name='toric_code_plaquette_flux')#
qlinks.operators.transitions module#
- class qlinks.operators.transitions.SetVariablesOperator(layout, variable_indices, initial_values, final_values, coefficient=1.0, name='set_variables')[source]#
Bases:
BaseLocalOperatorGeneral local transition operator.
If
config[variable_indices] == initial_values
then produce a new config with
new_config[variable_indices] = final_values
Otherwise return no action.
- layout: VariableLayout#
- __init__(layout, variable_indices, initial_values, final_values, coefficient=1.0, name='set_variables')#
- class qlinks.operators.transitions.BinaryFlipOperator(layout, variable_index, coefficient=1.0, name='binary_flip')[source]#
Bases:
BaseLocalOperatorFlip one binary variable 0 <-> 1.
- layout: VariableLayout#
- __init__(layout, variable_index, coefficient=1.0, name='binary_flip')#
- class qlinks.operators.transitions.NegationFlipOperator(layout, variable_index, coefficient=1.0, name='negation_flip')[source]#
Bases:
BaseLocalOperatorFlip one sign variable v -> -v.
Useful for internal integer representation of spin-1/2 flux variables with values {-1, +1}.
- layout: VariableLayout#
- __init__(layout, variable_index, coefficient=1.0, name='negation_flip')#
- class qlinks.operators.transitions.MultiNegationFlipOperator(layout, variable_indices, coefficient=1.0, name='multi_negation_flip')[source]#
Bases:
BaseLocalOperatorSimultaneously apply v -> -v to several variables.
Useful as a simple QLM-like plaquette flip when the link variables are represented as {-1, +1}.
- layout: VariableLayout#
- __init__(layout, variable_indices, coefficient=1.0, name='multi_negation_flip')#
qlinks.operators.updates module#
- class qlinks.operators.updates.LocalUpdateAction(coefficient, variable_indices, new_values)[source]#
Bases:
objectCompact operator action.
Instead of storing the full output configuration, store only
variable_indices new_values
The optimized sparse builder will reuse a scratch array:
scratch[:] = config scratch[variable_indices] = new_values
- __init__(coefficient, variable_indices, new_values)#
- class qlinks.operators.updates.LocalUpdateOperator(*args, **kwargs)[source]#
Bases:
ProtocolOptimized local-operator protocol.
This protocol does not return a full new configuration. It returns only local updates.
- layout: VariableLayout#
- __init__(*args, **kwargs)#
- class qlinks.operators.updates.SingleLocalUpdateOperator(*args, **kwargs)[source]#
Bases:
LocalUpdateOperator,ProtocolLocal update operator with at most one action per input config.
- class qlinks.operators.updates.BaseLocalUpdateOperator[source]#
Bases:
objectConvenience base for update-style local operators.
Subclasses provide a layout and implement update methods that return local variable indices and replacement values instead of full configurations.
- layout: VariableLayout#
- class qlinks.operators.updates.UpdateOperatorSum(terms, name='update_operator_sum')[source]#
Bases:
objectSum of update-level local operators.
- terms: tuple[LocalUpdateOperator, ...]#
- __init__(terms, name='update_operator_sum')#
- class qlinks.operators.updates.UpdateSetVariablesOperator(layout, variable_indices, initial_values, final_values, coefficient=1.0, name='update_set_variables')[source]#
Bases:
BaseLocalUpdateOperatorOptimized version of SetVariablesOperator.
If config[variable_indices] == initial_values, return a local update setting those variables to final_values.
- layout: VariableLayout#
- __init__(layout, variable_indices, initial_values, final_values, coefficient=1.0, name='update_set_variables')#
- class qlinks.operators.updates.UpdateBinaryFlipOperator(layout, variable_index, coefficient=1.0, name='update_binary_flip')[source]#
Bases:
BaseLocalUpdateOperatorOptimized binary flip 0 <-> 1.
- layout: VariableLayout#
- __init__(layout, variable_index, coefficient=1.0, name='update_binary_flip')#
- class qlinks.operators.updates.UpdateNegationFlipOperator(layout, variable_index, coefficient=1.0, name='update_negation_flip')[source]#
Bases:
BaseLocalUpdateOperatorOptimized sign flip v -> -v.
- layout: VariableLayout#
- __init__(layout, variable_index, coefficient=1.0, name='update_negation_flip')#
- class qlinks.operators.updates.UpdateMultiNegationFlipOperator(layout, variable_indices, coefficient=1.0, name='update_multi_negation_flip')[source]#
Bases:
BaseLocalUpdateOperatorOptimized simultaneous sign flip on several variables.
- layout: VariableLayout#
- __init__(layout, variable_indices, coefficient=1.0, name='update_multi_negation_flip')#
- class qlinks.operators.updates.UpdatePlaquettePatternTransition(initial, final, coefficient=1.0)[source]#
Bases:
objectOne local plaquette pattern transition for update operators.
- initial#
Source local pattern.
- Type:
numpy.ndarray[tuple[Any, …], numpy.dtype[numpy.int64]]
- final#
Target local pattern.
- Type:
numpy.ndarray[tuple[Any, …], numpy.dtype[numpy.int64]]
- __init__(initial, final, coefficient=1.0)#
- class qlinks.operators.updates.UpdatePlaquettePatternOperator(layout, lattice, plaquette_id, transitions, name='update_plaquette_pattern')[source]#
Bases:
BaseLocalUpdateOperatorOptimized plaquette-pattern transition operator.
This is the update-action version of PlaquettePatternOperator.
- layout: VariableLayout#
- lattice: LatticeGraph#
- transitions: tuple[UpdatePlaquettePatternTransition, ...]#
- classmethod qdm_flip(layout, lattice, plaquette_id, coefficient=1.0, reverse_coefficient=None)[source]#
- __init__(layout, lattice, plaquette_id, transitions, name='update_plaquette_pattern')#
- class qlinks.operators.updates.UpdatePXPSpinFlipOperator(layout, lattice, site_id, coefficient=1.0, occupied_value=1, name='update_pxp_spin_flip')[source]#
Bases:
BaseLocalUpdateOperatorOptimized PXP constrained spin flip.
Flip site_id only if all neighbors are not occupied.
- layout: VariableLayout#
- lattice: LatticeGraph#
- __init__(layout, lattice, site_id, coefficient=1.0, occupied_value=1, name='update_pxp_spin_flip')#
Module contents#
- class qlinks.operators.BaseLocalOperator[source]#
Bases:
objectConvenience base for configuration-space local operators.
Notes
Concrete operators should precompute geometry/layout-dependent data in
__post_init__()so thatapply()only performs cheap indexed array operations.- layout: VariableLayout#
- class qlinks.operators.BaseLocalUpdateOperator[source]#
Bases:
objectConvenience base for update-style local operators.
Subclasses provide a layout and implement update methods that return local variable indices and replacement values instead of full configurations.
- layout: VariableLayout#
- class qlinks.operators.BasisOperator(basis, operators, combine_duplicates=True, drop_zero_atol=0.0, dtype=<class 'numpy.complex128'>)[source]#
Bases:
objectMatrix-like wrapper around configuration-space local operators.
The wrapper applies local operators directly by looping over basis states; it does not explicitly build a sparse matrix. It supports matrix-vector products and transpose/Hermitian-adjoint views.
- basis#
Basis that fixes row/column ordering.
- Type:
- operators#
Local operators to sum.
- Type:
- dtype#
Output dtype for matrix-vector products.
- Type:
type[Any] | numpy.dtype[Any] | numpy._typing._dtype_like._SupportsDType[numpy.dtype[Any]] | tuple[Any, Any] | list[Any] | numpy._typing._dtype_like._DTypeDict | str | None
Examples
>>> operator = BasisOperator(basis, operators) >>> y = operator @ vector >>> y_t = operator.T @ vector >>> y_h = operator.H @ vector
- operators: tuple[LocalOperator, ...]#
- dtype#
alias of
complex128
- property T: TransposedBasisOperator#
- property H: TransposedBasisOperator#
Hermitian adjoint view.
- expectation(vector, *, conjugate=True)[source]#
Compute <v|O|v> by default.
If conjugate=False, compute v.T @ O @ v.
- __init__(basis, operators, combine_duplicates=True, drop_zero_atol=0.0, dtype=<class 'numpy.complex128'>)#
- class qlinks.operators.BinaryFlipOperator(layout, variable_index, coefficient=1.0, name='binary_flip')[source]#
Bases:
BaseLocalOperatorFlip one binary variable 0 <-> 1.
- layout: VariableLayout#
- __init__(layout, variable_index, coefficient=1.0, name='binary_flip')#
- class qlinks.operators.ConstantDiagonalOperator(layout, coefficient, name='constant_diagonal')[source]#
Bases:
BaseLocalOperatorDiagonal operator c * I.
- layout: VariableLayout#
- __init__(layout, coefficient, name='constant_diagonal')#
- class qlinks.operators.DiagonalLocalOperator(*args, **kwargs)[source]#
Bases:
LocalOperator,ProtocolConfiguration-space diagonal operator.
Returning
Nonemeans the operator gives no action on this config. Returning a complex number means the operator contributes that diagonal matrix element.
- class qlinks.operators.DiskDiagonalHopOperator(layout, lattice, source_site, target_site, coefficient=1.0, occupied_value=1, empty_value=0, enforce_nearest_neighbor_blockade=True, name='disk_diagonal_hop')[source]#
Bases:
BaseLocalOperatorMove one hard-core disk along a diagonal bond.
- layout: VariableLayout#
- lattice: SquareLattice#
- __init__(layout, lattice, source_site, target_site, coefficient=1.0, occupied_value=1, empty_value=0, enforce_nearest_neighbor_blockade=True, name='disk_diagonal_hop')#
- class qlinks.operators.DiskDiagonalHopProjector(layout, source_site, target_site, coefficient=1.0, occupied_value=1, empty_value=0, name='disk_diagonal_hop_projector')[source]#
Bases:
BaseLocalOperatorDiagonal projector onto a mobile disk on one directed diagonal bond.
- layout: VariableLayout#
- __init__(layout, source_site, target_site, coefficient=1.0, occupied_value=1, empty_value=0, name='disk_diagonal_hop_projector')#
- class qlinks.operators.LocalOperator(*args, **kwargs)[source]#
Bases:
ProtocolInterface for all configuration-space operators.
- layout: VariableLayout#
- __init__(*args, **kwargs)#
- class qlinks.operators.LocalSquareValueDiagonalOperator(layout, variable_index, coefficient=1.0, name='local_square_value_diagonal')[source]#
Bases:
BaseLocalOperatorDiagonal operator proportional to one squared variable value.
coefficient * config[variable_index] ** 2
For spin-1 variables m in {-1, 0, +1}, this represents coefficient * (S^z)^2 in the S^z product basis.
- layout: VariableLayout#
- __init__(layout, variable_index, coefficient=1.0, name='local_square_value_diagonal')#
- class qlinks.operators.LocalSumDiagonalOperator(layout, variable_indices, weights=None, coefficient=1.0, name='local_sum_diagonal')[source]#
Bases:
BaseLocalOperatorDiagonal operator
coefficient * sum_i weights[i] * config[variable_indices[i]]
- layout: VariableLayout#
- __init__(layout, variable_indices, weights=None, coefficient=1.0, name='local_sum_diagonal')#
- class qlinks.operators.LocalUpdateAction(coefficient, variable_indices, new_values)[source]#
Bases:
objectCompact operator action.
Instead of storing the full output configuration, store only
variable_indices new_values
The optimized sparse builder will reuse a scratch array:
scratch[:] = config scratch[variable_indices] = new_values
- __init__(coefficient, variable_indices, new_values)#
- class qlinks.operators.LocalUpdateOperator(*args, **kwargs)[source]#
Bases:
ProtocolOptimized local-operator protocol.
This protocol does not return a full new configuration. It returns only local updates.
- layout: VariableLayout#
- __init__(*args, **kwargs)#
- class qlinks.operators.LocalValueDiagonalOperator(layout, variable_index, coefficient=1.0, name='local_value_diagonal')[source]#
Bases:
BaseLocalOperatorDiagonal operator proportional to one variable value.
coefficient * config[variable_index]
- layout: VariableLayout#
- __init__(layout, variable_index, coefficient=1.0, name='local_value_diagonal')#
- class qlinks.operators.MultiNegationFlipOperator(layout, variable_indices, coefficient=1.0, name='multi_negation_flip')[source]#
Bases:
BaseLocalOperatorSimultaneously apply v -> -v to several variables.
Useful as a simple QLM-like plaquette flip when the link variables are represented as {-1, +1}.
- layout: VariableLayout#
- __init__(layout, variable_indices, coefficient=1.0, name='multi_negation_flip')#
- class qlinks.operators.NegationFlipOperator(layout, variable_index, coefficient=1.0, name='negation_flip')[source]#
Bases:
BaseLocalOperatorFlip one sign variable v -> -v.
Useful for internal integer representation of spin-1/2 flux variables with values {-1, +1}.
- layout: VariableLayout#
- __init__(layout, variable_index, coefficient=1.0, name='negation_flip')#
- class qlinks.operators.OperatorAction(coefficient, config)[source]#
Bases:
objectOne operator action on one computational configuration.
- coefficient:
Matrix element contributed by this action.
- config:
Resulting configuration after the operator acts. For diagonal operators, this is usually a copy of the input config.
- __init__(coefficient, config)#
- class qlinks.operators.OperatorSum(terms, name='operator_sum')[source]#
Bases:
objectFormal sum of local operators.
This is still only an action-level object. Sparse matrix construction is handled by the next layer.
- terms: tuple[LocalOperator, ...]#
- __init__(terms, name='operator_sum')#
- class qlinks.operators.PXPSpinFlipOperator(layout, lattice, site_id, coefficient=1.0, occupied_value=1, name='pxp_spin_flip')[source]#
Bases:
BaseLocalOperatorConstrained spin flip for PXP/Rydberg-blockade models.
The spin at site_id is flipped only if all neighboring sites are not occupied.
- With binary variables:
0 <-> 1
- and usually:
occupied_value = 1
- layout: VariableLayout#
- lattice: LatticeGraph#
- __init__(layout, lattice, site_id, coefficient=1.0, occupied_value=1, name='pxp_spin_flip')#
- class qlinks.operators.PatternDiagonalOperator(layout, variable_indices, pattern, coefficient=1.0, name='pattern_diagonal')[source]#
Bases:
BaseLocalOperatorDiagonal projector-like operator.
If selected variables match pattern, return coefficient * config. Otherwise return no action.
Example
A flippability counter for a plaquette can be represented as a sum of pattern diagonal operators.
- layout: VariableLayout#
- __init__(layout, variable_indices, pattern, coefficient=1.0, name='pattern_diagonal')#
- class qlinks.operators.PlaquettePatternOperator(layout, lattice, plaquette_id, transitions, name='plaquette_pattern')[source]#
Bases:
BaseLocalOperatorGeneral plaquette transition operator.
It reads the plaquette’s link variables in the lattice plaquette order. If the current values match one of the allowed transition patterns, it returns the corresponding new configuration.
This is suitable for QDM plaquette flips, constrained ring exchanges, and other local loop moves.
- layout: VariableLayout#
- lattice: LatticeGraph#
- transitions: tuple[PlaquettePatternTransition, ...]#
- classmethod qdm_flip(layout, lattice, plaquette_id, coefficient=1.0, reverse_coefficient=None)[source]#
Standard binary dimer plaquette flip:
1010 <-> 0101
The order is the plaquette link order supplied by the lattice.
- classmethod alternating_binary_flip(layout, lattice, plaquette_id, coefficient=1.0, reverse_coefficient=None)[source]#
- __init__(layout, lattice, plaquette_id, transitions, name='plaquette_pattern')#
- class qlinks.operators.PlaquettePatternTransition(initial, final, coefficient=1.0)[source]#
Bases:
objectOne allowed plaquette pattern transition.
- initial:
Values on plaquette links before the operator acts.
- final:
Values on plaquette links after the operator acts.
- coefficient:
Matrix element for this transition.
- __init__(initial, final, coefficient=1.0)#
- class qlinks.operators.SetVariablesOperator(layout, variable_indices, initial_values, final_values, coefficient=1.0, name='set_variables')[source]#
Bases:
BaseLocalOperatorGeneral local transition operator.
If
config[variable_indices] == initial_values
then produce a new config with
new_config[variable_indices] = final_values
Otherwise return no action.
- layout: VariableLayout#
- __init__(layout, variable_indices, initial_values, final_values, coefficient=1.0, name='set_variables')#
- class qlinks.operators.SingleLocalUpdateOperator(*args, **kwargs)[source]#
Bases:
LocalUpdateOperator,ProtocolLocal update operator with at most one action per input config.
- class qlinks.operators.SpinOneXYBondOperator(layout, lattice, link_id, coefficient=1.0, name='spin_one_xy_bond')[source]#
Bases:
BaseLocalOperatorSpin-1 XY bond operator on sites i,j.
- H_ij = J_xy * (S^x_i S^x_j + S^y_i S^y_j)
= J_xy/2 * (S^+_i S^-_j + S^-_i S^+_j)
The computational basis is the S^z product basis with values:
m_i in {-1, 0, +1}
- layout: VariableLayout#
- lattice: ChainLattice#
- __init__(layout, lattice, link_id, coefficient=1.0, name='spin_one_xy_bond')#
- class qlinks.operators.SpinOneXYPairOperator(layout, site_i, site_j, coefficient=1.0, name='spin_one_xy_pair')[source]#
Bases:
BaseLocalOperatorHermitian spin-1 XY exchange on an arbitrary ordered site pair.
The operator uses the same matrix-element convention as
SpinOneXYBondOperatorfor real couplings,0.5 * (t S_i^+ S_j^- + t^* S_i^- S_j^+).Consequently an allowed
|0,0> -> |+,- >transition has matrix elementt. Complextgives a Hermitian Peierls-phase exchange.- layout: VariableLayout#
- __init__(layout, site_i, site_j, coefficient=1.0, name='spin_one_xy_pair')#
- class qlinks.operators.ToricCodePlaquetteFluxOperator(layout, lattice, plaquette_id, coefficient=-1.0, name='toric_code_plaquette_flux')[source]#
Bases:
BaseLocalOperatorToric-code plaquette operator B_p in the Z basis.
It is diagonal:
- layout: VariableLayout#
- lattice: SquareLattice#
- __init__(layout, lattice, plaquette_id, coefficient=-1.0, name='toric_code_plaquette_flux')#
- class qlinks.operators.ToricCodeStarFlipOperator(layout, lattice, site_id, coefficient=-1.0, name='toric_code_star_flip')[source]#
Bases:
BaseLocalOperatorToric-code star operator A_v in the Z basis.
It flips all links incident on site v.
- layout: VariableLayout#
- lattice: SquareLattice#
- __init__(layout, lattice, site_id, coefficient=-1.0, name='toric_code_star_flip')#
- class qlinks.operators.TransposedBasisOperator(parent, conjugate=False)[source]#
Bases:
objectTranspose or adjoint view of BasisOperator.
- parent: BasisOperator#
- property T: BasisOperator | TransposedBasisOperator#
- property H: BasisOperator#
- __init__(parent, conjugate=False)#
- class qlinks.operators.UpdateBinaryFlipOperator(layout, variable_index, coefficient=1.0, name='update_binary_flip')[source]#
Bases:
BaseLocalUpdateOperatorOptimized binary flip 0 <-> 1.
- layout: VariableLayout#
- __init__(layout, variable_index, coefficient=1.0, name='update_binary_flip')#
- class qlinks.operators.UpdateMultiNegationFlipOperator(layout, variable_indices, coefficient=1.0, name='update_multi_negation_flip')[source]#
Bases:
BaseLocalUpdateOperatorOptimized simultaneous sign flip on several variables.
- layout: VariableLayout#
- __init__(layout, variable_indices, coefficient=1.0, name='update_multi_negation_flip')#
- class qlinks.operators.UpdateNegationFlipOperator(layout, variable_index, coefficient=1.0, name='update_negation_flip')[source]#
Bases:
BaseLocalUpdateOperatorOptimized sign flip v -> -v.
- layout: VariableLayout#
- __init__(layout, variable_index, coefficient=1.0, name='update_negation_flip')#
- class qlinks.operators.UpdateOperatorSum(terms, name='update_operator_sum')[source]#
Bases:
objectSum of update-level local operators.
- terms: tuple[LocalUpdateOperator, ...]#
- __init__(terms, name='update_operator_sum')#
- class qlinks.operators.UpdatePXPSpinFlipOperator(layout, lattice, site_id, coefficient=1.0, occupied_value=1, name='update_pxp_spin_flip')[source]#
Bases:
BaseLocalUpdateOperatorOptimized PXP constrained spin flip.
Flip site_id only if all neighbors are not occupied.
- layout: VariableLayout#
- lattice: LatticeGraph#
- __init__(layout, lattice, site_id, coefficient=1.0, occupied_value=1, name='update_pxp_spin_flip')#
- class qlinks.operators.UpdatePlaquettePatternOperator(layout, lattice, plaquette_id, transitions, name='update_plaquette_pattern')[source]#
Bases:
BaseLocalUpdateOperatorOptimized plaquette-pattern transition operator.
This is the update-action version of PlaquettePatternOperator.
- layout: VariableLayout#
- lattice: LatticeGraph#
- transitions: tuple[UpdatePlaquettePatternTransition, ...]#
- classmethod qdm_flip(layout, lattice, plaquette_id, coefficient=1.0, reverse_coefficient=None)[source]#
- __init__(layout, lattice, plaquette_id, transitions, name='update_plaquette_pattern')#
- class qlinks.operators.UpdatePlaquettePatternTransition(initial, final, coefficient=1.0)[source]#
Bases:
objectOne local plaquette pattern transition for update operators.
- initial#
Source local pattern.
- Type:
numpy.ndarray[tuple[Any, …], numpy.dtype[numpy.int64]]
- final#
Target local pattern.
- Type:
numpy.ndarray[tuple[Any, …], numpy.dtype[numpy.int64]]
- __init__(initial, final, coefficient=1.0)#
- class qlinks.operators.UpdateSetVariablesOperator(layout, variable_indices, initial_values, final_values, coefficient=1.0, name='update_set_variables')[source]#
Bases:
BaseLocalUpdateOperatorOptimized version of SetVariablesOperator.
If config[variable_indices] == initial_values, return a local update setting those variables to final_values.
- layout: VariableLayout#
- __init__(layout, variable_indices, initial_values, final_values, coefficient=1.0, name='update_set_variables')#
- class qlinks.operators.UpdateSpinOneXYBondOperator(layout, lattice, link_id, coefficient=1.0, name='update_spin_one_xy_bond')[source]#
Bases:
BaseLocalUpdateOperatorUpdate-action version of
SpinOneXYBondOperator.The operator returns only local two-site updates instead of allocating full output configurations. It is intended for
OptimizedSparseHamiltonianBuilder.- layout: VariableLayout#
- lattice: ChainLattice#
- __init__(layout, lattice, link_id, coefficient=1.0, name='update_spin_one_xy_bond')#
- class qlinks.operators.UpdateSpinOneXYPairOperator(layout, site_i, site_j, coefficient=1.0, name='update_spin_one_xy_pair')[source]#
Bases:
BaseLocalUpdateOperatorUpdate-action version of
SpinOneXYPairOperator.- layout: VariableLayout#
- __init__(layout, site_i, site_j, coefficient=1.0, name='update_spin_one_xy_pair')#
- qlinks.operators.alternating_binary_flippability_projectors(layout, lattice, plaquette_id, coefficient=1.0)[source]#
Return binary flippability projectors for one plaquette.
- Parameters:
layout (VariableLayout) – Variable layout.
lattice (LatticeGraph) – Lattice containing the plaquette.
plaquette_id (int) – Plaquette id.
coefficient (complex) – Diagonal coefficient for each projector.
- Returns:
Pair of diagonal projectors onto the two alternating binary patterns.
- Return type:
- qlinks.operators.alternating_binary_patterns(length)[source]#
Return the two binary alternating patterns on an even plaquette.
- qlinks.operators.alternating_flux_flippability_projectors(layout, lattice, plaquette_id, coefficient=1.0)[source]#
Return flux flippability projectors for one plaquette.
- Parameters:
layout (VariableLayout) – Variable layout.
lattice (LatticeGraph) – Lattice containing the plaquette.
plaquette_id (int) – Plaquette id.
coefficient (complex) – Diagonal coefficient for each projector.
- Returns:
Pair of diagonal projectors onto the two alternating flux patterns.
- Return type:
- qlinks.operators.alternating_flux_patterns(length)[source]#
Return the two
{-1, +1}alternating flux patterns.
- qlinks.operators.combine_duplicate_actions(actions, *, atol=0.0)[source]#
Combine actions that produce the same output configuration.
This is useful before sparse assembly when two terms lead to the same row/column matrix element.
- qlinks.operators.qdm_flippability_projectors(layout, lattice, plaquette_id, coefficient=1.0)[source]#
Return diagonal projectors onto the two flippable QDM plaquette patterns:
1010 and 0101
The potential term V * P_p^2 in a QDM-like model can be represented using these diagonal projectors.