QFD¶
Use Eigenproblem(A=...) with QFD(initial_state=..., time_step=..., powers=...) to estimate the smallest eigenvalue of A in a basis of time-evolved states V**p |psi>. Here psi is your reference state, V is one fixed product-formula step, by default of the nonidentity Pauli terms of A, and p runs over the integer powers you choose. The result reports the lowest projected Ritz value, the energy of the reference state, and the reference energy minus the Ritz value. The Ritz value does not certify the full-space ground energy.
from nwqlib import Eigenproblem, solve
from nwqlib.algorithms import QFD
from nwqlib.algorithms.qfd import chemistry_evolution_terms
Every object on this page imports from nwqlib.algorithms.qfd, and QFD and QFDResult also import from nwqlib.algorithms.
QFD solves the Hamiltonian pencil of Parrish and McMahon, arXiv:1909.08925v1, Sec. II.C, Eqs. (5)–(8), with the states of one fixed product-formula step in place of exact time evolution. It obtains the projected matrices H and S as FixedGCIM does, from joint states of an ancilla and the system, so the GCiM and ADAPT page documents the objects that the two methods share: PencilAcquisition, PencilSampling, ShotAllocation, ProjectedPencil and the matrix-element records that QFDResult holds.
Solve in a basis of evolved states¶
QFD ¶
Bases: Method
Quantum filter diagonalization: the lowest Ritz energy of A in the basis of integer powers of one fixed product-formula step V.
Build it with keyword arguments and pass it as method=, for example
solve(Eigenproblem(A=H), method=QFD(initial_state=psi, time_step=0.5,
powers=(0, 1, 2)), shots=1000). initial_state, time_step and
powers are required. Write A = c_I I + A0. The basis state of power
p is phi_p = V**p |psi> for one fixed step V, which applies
steps_per_time_step = r substeps of a product formula for
time_step/r, of A0 by default or of the fermionic blocks of B0
with evolution="fermionic_blocks", with order 2 (the default) or
order 1. A negative power applies the exact adjoint of V, its rotations
in reverse order with negated angles. The result is a
QFDResult whose
eigenvalue is the lowest kept Ritz value of H f = E S f, with
H_jk = <phi_j|A|phi_k> and S_jk = <phi_j|phi_k> measured for the
original A, and whose reference_energy is <psi|A|psi>. This is the
Hamiltonian pencil of Parrish and McMahon, arXiv:1909.08925v1,
Sec. II.C, Eqs. (5)-(8), with the states of one fixed step in place of
exact time evolution. The step, its order and r define the trial
space, so changing them changes the basis, and none of them is an
accuracy setting. A projected Ritz value does not certify the
full-space ground energy.
V is built once, and its emitted angles are saved with the Plan. With
the default evolution="pauli_terms" its factors are the nonidentity
Pauli terms of A0 in the Plan's label order. Each factor is the
rotation exp(-i theta P/2): order 1 applies every term for the
substep dt = time_step/r, with theta = 2 c dt for the coefficient
c, and order 2 applies every term for dt/2 and then every term again
in reverse order, with theta = c dt. The identity term contributes
only a global phase and is left out of V, and the solve adds c_I
back to the Ritz values.
With evolution="fermionic_blocks" V comes instead from an explicit
fermionic generator B = c_B I + B0 in evolution_terms, while H, S
and the energies remain those of A. B is split into complete Hermitian
blocks, one for the real and one for the imaginary part of each pair of
adjoint ladder terms, or one for a self-adjoint term. The blocks are
number, hopping, density, hopping times a spectator number, and
double-excitation terms. A block maps under Jordan-Wigner to commuting
Pauli words, so the rotations of its words give its exponential
exactly. Order 1 applies every block once, and order 2 applies every
block for half the substep and then every block again in reverse
order. Each block conserves the particle number, and V applies the
exponential of every block whole, never split or interleaved with
another, so V conserves it as well. A product formula of the Pauli
terms of A in their label order need not conserve it even when A does.
The constant c_B is left out of V and never enters an energy, so a B
without nonidentity terms gives V = I and a basis of copies of psi. The
Plan's assumptions state the upper bounds
delta_gen_0 = sum_{P != I} |a_P - b_P| on ||A0 - B0|| and
delta_gen_full = |c_I - c_B| + delta_gen_0 on ||A - B||, which do
not bound the distance of V from exp(-i tau A0), and they state
whether the basis lies in the particle-number sector of the reference.
That needs an occupation reference or a product of computational basis
states. With exact H and S, the Ritz value is then a Rayleigh-quotient
value of A on a state of that sector, and so an upper bound on the
smallest eigenvalue of A and, when A itself conserves the particle
number, which QFD does not check, on the smallest eigenvalue of A in
that sector. Spin projection and total spin are not qualified, since
evolution_terms has no spin labels.
Quantum execution only. A pair i < j prepares the joint state
(|0>|phi_i> + |1>|phi_j>)/sqrt(2) of one ancilla and the system. With
the default pair_preparation="prefix" of acquisition, the end of
smaller absolute power b (the smaller index on a tie) runs the
reference and V**b once without control, and the remaining power
difference is controlled on the ancilla, so only the difference costs
controlled steps. With "controlled" both complete preparations are
controlled. With shots=None (exact readout) every pair is reduced to
H0_ij and S_ij from its simulated state. With shots=n each pair
and each of the G qubit-wise commuting groups of terms is one setting,
off-diagonal pairs in both the X and Y ancilla bases, so a basis of M
powers has M**2 G settings and n M**2 G shots. The quadratures are
always complex, even for a real A, because the time-evolved states are
complex in general. With sampling=PencilSampling(...) in place of
shots=, the same settings are measured in a uniform pilot stage and
again in a main stage whose shots per setting the pilot pencil decides,
and only the main-stage measurements form H, S and the reference
energy. A setting stops the run when its circuit fails
max_native_two_qubit_depth, with the earlier settings' counts kept.
overlap_cutoff can be changed after the run with
result.analyze(overlap_cutoff=...), which reuses the same matrix
elements.
Attributes:
-
initial_state(StateData) –Required. The reference state psi, in a form that
StateDataaccepts, prepared with its phase once per circuit, except an off-diagonal pair underpair_preparation="controlled", which prepares it under control on both ancilla branches. An occupation or product state keeps planning compact on many qubits. -
time_step(Real) –Required, finite and positive. The time step tau of V in inverse units of the Hamiltonian's energy (with hbar = 1), for example 1/Hartree for a Hamiltonian in Hartree.
-
powers(tuple[StrictInt, ...]) –Required. Distinct integers including 0, the powers of V in basis order. Their order is the order of the rows and columns of H and S, and 0 need not come first.
-
steps_per_time_step(PositiveInt) –Default
1. The number r of product-formula substeps of V, fixed for every power. -
formula_order(Literal[1, 2]) –Default
2. Product-formula order of each substep, 1 or 2. -
evolution(Literal['pauli_terms', 'fermionic_blocks']) –Default
"pauli_terms", the product formula of the Pauli terms of A above."fermionic_blocks"builds V from the complete fermionic blocks ofevolution_terms. -
evolution_terms(OperatorData | None) –Default None. Required with
evolution="fermionic_blocks"and None otherwise: the generator B as a fermionicOperatorInputfromingest_fermionorchemistry_evolution_terms. Its coefficients are read in the energy unit of A. Mode j acts on qubit j of A, with|1>occupied, so B has as many modes as A has qubits. Each row is a scalar,a_p^dagger a_qora_p^dagger a_q^dagger a_r a_s, written with its creations left of its annihilations, and B must be exactly Hermitian: after normal ordering the coefficients of each term and of its adjoint are exact complex conjugates, and that of a self-adjoint term is real. Planning refuses other operators. Its content hash is part of the Method's. -
evolution_diagnostics(QFDEvolutionDiagnostics | None) –Default None. The
QFDEvolutionDiagnosticsthatchemistry_evolution_termsreturned withevolution_terms, saved with the Method. It requiresevolution="fermionic_blocks", and itsevolution_inputmust equal the content hash ofevolution_terms. A generator from another source needs none. -
overlap_cutoff(Real) –Default
1e-12, positive. Overlap eigenvectors with eigenvalues above it are kept for the solve. -
max_basis_size(PositiveInt) –Default
64. Largest accepted number of powers. -
max_experiments(PositiveInt) –Default
100_000. Largest number of settings: exact pair reductions, or sampled group settings. -
max_bytes(PositiveInt) –Default 10 GB (decimal,
10_000_000_000bytes). Limit on the known bytes of conversion, the pair table, the grouped count analysis and the projected solve, and on each exact pair reduction's workspace. -
max_analysis_work(PositiveInt) –Default
1_000_000_000. Limit on the work of the projected solve, of the comparisons that form qubit-wise commuting groups and of each pass of the grouped count analysis, checked at planning for one measurement per setting and again before the stored counts are decoded. -
max_classical_products(PositiveInt) –Default
100_000_000. Limit on the summed classical work of the exact pair reductions. -
input_conversion(Literal['auto', 'dense_pauli']) –Default
"auto", which keeps Pauli input as it is and converts an explicit dense matrix of dimension at most 16 to Pauli form."dense_pauli"also permits the conversion of sparse matrices and of larger dense matrices, withinmax_conversion_workandmax_bytes. -
max_conversion_work(PositiveInt) –Default
100_000_000. Limit on the counted work of operator-to-Pauli conversion. -
max_admission_steps(PositiveInt) –Default
10_000_000. Limit on the planning work of checking eachProgramthat the method builds (planning work limit), on the number of uses of V in all its circuits, checked before the circuits are described, and on the circuit instructions of the distinct evolution blocks that the Plan uses (V, its adjoint and their controlled forms), each r times the instructions of one substep, checked at planning before any block is built. Each of the three counts is compared with the limit separately. -
acquisition(PencilAcquisition) –Default
PencilAcquisition(). QFD measures grouped joint states, somatrix_measurementmust be"grouped", andpair_preparationis"prefix"or"controlled". ADAPT's"vacuum_reference"and"vacuum_restore"need a known vacuum phase, and QFD records and computes none for V, so planning raisesApplicabilityErrorfor either value whenever the Plan measures anything, that is, for every A that is not a multiple of the identity,powers=(0,)included, with exact readout and with shots alike. For a multiple of the identity the request is kept unused, with resolvedpair_preparationNone, and no circuit runs. A Plan with shots measures complex quadratures and rejectsquadratures="real"at planning. With exact readout, which measures no quadratures, the requested value has no effect and is recorded as None. The Plan records the resolved choices, with the construction of every pair, inplan.reconstruction.pencil.acquisition. -
max_native_two_qubit_depth(Count | None) –Default
None, which requests no depth limit. A nonnegative integer D requires each submitted circuit, every grouped count setting and every exact pair reduction, to have a native two-qubit depth of at most D, with D itself allowed. The depth is that of the circuit the backend prepared for execution, with the reference preparation, the uncontrolled and controlled powers of V, the measurement basis changes and the backend's qubit routing. Each circuit is checked just before its submission, and one whose depth exceeds D or is unavailable is not submitted: the run raisesnwqlib.backends.inspection.NativeDepthCapRefusal. Settings submitted earlier keep their counts and shots in the Run. The limit changes no circuit, power or term. Only IBM Runtime computes this depth, under the conditions thatFixedGCIMdescribes for the same field. Undersamplingit applies to every pilot and main circuit. -
sampling(PencilSampling | None) –Default
None, which measures every setting with theshots=of the call. APencilSamplingreplacesshots=with a pilot stage and a main stage whose shots per setting the pilot decides, as forFixedGCIM. The Result'sshot_allocationrecords that decision.nwqlib.estimate(plan)then reports the totals of the whole Plan, such as its settings and shots, as unavailable, because each setting is measured in a pilot stage and again in a main stage whose shots the pilot decides. One prepared setting, whose stage and shots are fixed, is estimated normally from its preparation record. The shot budget of a Run isPencilSampling.total_shots.
Raises:
-
ValueError–If
acquisitionrequests termwise measurement, ifevolution_termsis missing with"fermionic_blocks", set with"pauli_terms"or not fermionic, or ifevolution_diagnosticsdoes not belong toevolution_termson that route.
Examples:
For A = -Z on one qubit, psi = (|0> + |1>)/sqrt(2), a time step
of 0.5 and the powers 0 and 1, the two basis states span the qubit,
so on Aer with exact readout the lowest Ritz value is the ground
energy -1 up to rounding, which lies 1 below the reference energy
0:
>>> from nwqlib import Eigenproblem, solve
>>> from nwqlib.algorithms import QFD
>>> from nwqlib.operators import ingest_pauli
>>> from nwqlib.problems import ingest_product
>>> A = ingest_pauli((("Z", -1.0),), num_qubits=1)
>>> psi = ingest_product([[2**-0.5, 2**-0.5]])
>>> result = solve(Eigenproblem(A=A), method=QFD(initial_state=psi, time_step=0.5, powers=(0, 1)),
... seed=7)
>>> print(round(result.eigenvalue, 10), round(result.lowering, 10))
-1.0 1.0
With the fermionic generator B = 5 + n_0, where
n_0 = a_0^dagger a_0 = (I - Z)/2, V rotates the same psi about Z,
and the two basis states again span the qubit. H and S belong to
A = 3 I + X, so the lowest Ritz value is its ground energy 2 and
the reference energy is <psi|A|psi> = 4. The constant 5 of B
enters neither V nor an energy:
>>> from nwqlib.operators import ingest_fermion
>>> A = ingest_pauli((("I", 3.0), ("X", 1.0)), num_qubits=1)
>>> B = ingest_fermion([(5.0, []), (1.0, [(0, 1), (0, 0)])], num_modes=1)
>>> method = QFD(initial_state=psi, time_step=2.5, powers=(0, 1), evolution="fermionic_blocks",
... evolution_terms=B)
>>> result = solve(Eigenproblem(A=A), method=method, seed=7)
>>> print(round(result.eigenvalue, 10), round(result.reference_energy, 10))
2.0 4.0
QFDResult ¶
Bases: Result
Lowest Ritz energy from a QFD run, with the reference energy and the projected matrices.
solve returns it for a
QFD method, and load_result
reopens a saved one. eigenvalue is the lowest kept Ritz value of the
projected pencil H f = E S f of the basis V**p_j |psi>, in the unit
of the Eigenproblem. reference_energy is H[i0, i0] = <psi|A|psi>
of the reference, at the basis index i0 of the power 0, which need not
be the first index. lowering is reference_energy - eigenvalue,
negative values included. With exact, consistent H and S the Ritz value
is at most the reference energy when no overlap direction is cut, and
at least the smallest eigenvalue of A, but sampled matrices carry
neither guarantee. The value is a projected estimate in the chosen
trial space, not a certified ground energy, and a lowering is not a
recovered fraction of a correlation energy. pencil holds H, S and the
solve diagnostics: kept rank, the complete overlap spectrum and the
condition number of the kept directions. print(result) shows the
values, the basis schedule and the scope, and
result.analyze(overlap_cutoff=...) solves the same matrix elements at
another cutoff without new measurement. The fields of
Result are present too.
Attributes:
-
eigenvalue(Real | None) –Lowest kept Ritz value in the problem's energy unit, or None when data are missing or the solver rejected the pencil.
-
reference_energy(Real | None) –H[i0, i0], the energy of the reference state in the same unit, from the same pencil, or None without a pencil. For an operator that is a multiplec Iof the identity it is c, as iseigenvalue. -
lowering(Real | None) –reference_energy - eigenvalue, or None when either is None. It is not clipped at zero. -
missing(tuple[Text, ...]) –Names of planned measurements with no returned data. A nonempty tuple means no pencil was solved.
-
pairs(tuple[PairEstimate, ...]) –Exact pair measurements: pooled
H0_ijandS_ijwith their reductions and entry error bounds. Empty for sampled Plans. -
estimates(tuple[ScalarEstimate, ...]) –For a sampled Plan, the pooled weighted group means (
ScalarEstimate). -
group_moments(tuple[GroupMoment, ...]) –For a sampled Plan, the moments of every count measurement, in measurement order.
-
sampled_pair_variances(tuple[SampledPairVariance, ...]) –For a complete sampled pencil, the pooled sample-mean variances and overlap–H0 covariance of each pair.
-
pencil(ProjectedPencil | None) –The
ProjectedPencilin basis order, or None for partial data or when the operator is a multiple of the identity, which needs no H or S. UnderPencilSamplingit is formed from the main-stage measurements only, and so isreference_energy. -
analysis_cutoff(Real) –Overlap-eigenvalue cutoff used by this analysis.
-
target_identification(Text) –Fixed statement of what the value does not establish.
-
shot_allocation(ShotAllocation | None) –Under
PencilSampling, the pilot decision (ShotAllocation) as it was decided, or None before it. Thenestimates,group_moments,sampled_pair_variances,pencil,missingandcontribution_idsconcern the main stage only, and a Result from before the decision lists every setting inmissing. The pilot measurements stay in the Run's observations. None withoutPencilSampling.
QFDReconstruction ¶
Bases: Record
The fixed step V and the Pauli tables that turn the observations of a QFD Plan back into H and S.
plan.reconstruction of a QFD
Plan holds it. V applies, for each of its r substeps, the rotations
R_P(theta) = exp(-i theta P/2) of the rows step_rows of
evolution_rows with the angles step_angles, in this order. Basis
state j is V repeated powers[j] times, or its adjoint repeated
-powers[j] times, applied to the reference. With
QFD.evolution="pauli_terms" the rotations come from the Pauli table
of the target in pencil. With "fermionic_blocks" they come from the
generator B of QFD.evolution_terms, whose table is evolution, and
step_blocks marks its complete blocks. H and S always belong to the
target in pencil.
Attributes:
-
schema_version(Literal[1]) –Record layout version.
-
pencil(FixedGCIMReconstruction) –The Pauli table of the target A, basis size, groups and measurement choices shared with FixedGCIM (
FixedGCIMReconstruction). Itsacquisition.pairsrecords the construction of every off-diagonal pair. -
substep(Real) –The emitted binary64 substep
time_step/steps_per_time_stepin inverse energy units. -
step_rows(FrozenArray) –int64 array of the positions in
evolution_rowsof the factors of one substep, in execution order. Empty when the generator of V is a multiple of the identity, which makes V the identity. -
step_angles(FrozenArray) –float64 array of the emitted angle theta of each factor.
-
reference_index(Count) –Basis index of the power 0, the reference state.
-
evolution(PauliArrays | None) –None for
"pauli_terms". For"fermionic_blocks", the Pauli table of B (PauliArrays): one row for each distinct word that a factor of V uses, with the coefficient of B summed over its blocks and rounded once, and the identity row, whose coefficient is c_B. A word whose coefficients cancel keeps its row with coefficient 0. The coefficients describe B. V uses only the words andstep_angles. -
step_blocks(FrozenArray | None) –None for
"pauli_terms". For"fermionic_blocks", the int64 positions instep_rowswhere each complete block of one substep starts, strictly increasing from 0, and empty when V has no factors. A block runs to the next start or to the end of the substep.
evolution_rows ¶
evolution_rows
The nonidentity (label, coefficient) rows that step_rows index: those of pencil, or of evolution when it is set.
Evolve with a generator from chemistry integrals¶
With evolution="fermionic_blocks", QFD builds V from an explicit fermionic generator B, one complete number-conserving Hermitian block of ladder terms at a time, so every basis state from an occupation reference keeps its particle number. H, S and the energies remain those of A. chemistry_evolution_terms takes the data from build_gcim_chemistry_problem and returns B, built from its integrals, with a QFDEvolutionDiagnostics record of how B was derived. Passed to QFD as evolution_diagnostics, the record is saved with the Method. B and the Hamiltonian A of the same data can differ, and the Plan states upper bounds on their distance.
chemistry_evolution_terms ¶
chemistry_evolution_terms(data, evolution_coefficient_cutoff=0.0)
Return a Hermitian fermionic evolution generator B for QFD from the integrals of chemistry data, with its diagnostics.
Pass both results to QFD:
terms, diagnostics = chemistry_evolution_terms(data) and then
QFD(initial_state=..., time_step=..., powers=..., evolution="fermionic_blocks",
evolution_terms=terms, evolution_diagnostics=diagnostics), with the
target data.eigenproblem() and, for example,
ingest_occupation(data.reference_occupations, num_qubits=data.num_qubits)
as the reference. The helper reads the spatial one-body
array h, the two-body array v[p,q,r,s] = (ps|qr), constant_energy
E_c, the "name" and "integral_convention" entries of metadata and
reference_occupations. It runs no electronic-structure calculation,
and it changes neither data, its arrays nor data.hamiltonian, which
remains the target A. B differs from A in general, and the Plan states
upper bounds on their distance.
Raw table. Spin modes are interleaved, mode 2p + sigma for spatial
orbital p with alpha sigma = 0 and beta sigma = 1. The integrals
are expanded to spin orbitals by the same routine as
build_gcim_chemistry_problem, and every nonzero entry gives one term
of E_c + sum h_ab a_a^dagger a_b + 1/2 sum v_abcd a_a^dagger
a_b^dagger a_c a_d, the factor 1/2 applied once as one binary64
product. The terms are normal ordered with exact anticommutation signs
and equal monomials summed, removing only exact zeros. The resulting
coefficients g_T of the normal-ordered monomials T define the table
C_raw, which need not be Hermitian because binary64 integrals need not
be exactly symmetric. C_raw holds these binary64 values and is not an
exact conversion of the integrals.
Projection. For a pair of distinct adjoint monomials,
T^dagger = s_T T_bar, where s_T = +1 for every monomial of this
domain, the returned coefficients are b_T = m_T and
b_bar = s_T m_T with
m_T = RN((val(g_T) + s_T val(g_bar)) / 2),
the exact midpoint rounded once, which is the coefficient of the
Hermitian part (C_raw + C_raw^dagger)/2 in exact arithmetic. For
two values x and y, (z - x)**2 + (z - y)**2 is smallest at the
midpoint, so this is the least-squares symmetric correction of the
pair of C_raw, which says nothing about the exact integrals. For the
one-body part it gives h_B[p,p] = h[p,p] and
h_B[p,q] = h_B[q,p] = RN((h[p,q] + h[q,p])/2). A self-adjoint
monomial keeps its real coefficient and E_c is kept. B is then exactly
Hermitian, as QFD requires of evolution_terms.
Cutoff. After the projection a pair with |m_T| <= gamma is removed
on both sides, a self-adjoint monomial with |b_T| <= gamma is
removed, and E_c is never removed. gamma = 0 removes only exact
zeros. Removing a number or density term changes the identity
coefficient c_B of B and never the target's.
Parameters:
-
data(GCIMChemistryProblemData) –The chemistry data, for example from
build_gcim_chemistry_problem, with real finite integrals in Hartree. -
evolution_coefficient_cutoff(float, default:0.0) –Default
0.0. The cutoff gamma in Hartree, finite and at least 0, compared with the projected coefficients, which include the factor 1/2.
Returns:
-
terms(OperatorInput) –B as a fermionic input from
ingest_fermion, one row per kept monomial, ondata.num_qubitsmodes. -
diagnostics(QFDEvolutionDiagnostics) –The source of B, the cutoff, the counts of changed and removed pairs, upper bounds on the corrections, the one-body asymmetry of h, c_B and the spin statement of the blocks.
Raises:
-
ValueError–If the cutoff is negative, nonfinite or not a number, if an integral is nonfinite or has a nonzero imaginary part, or if the mode count or the reference occupations do not match the interleaved spin orbitals.
Examples:
For H2 in STO-3G (requires pyscf and openfermion):
>>> from nwqlib.algorithms.gcim import build_gcim_chemistry_problem
>>> from nwqlib.algorithms.qfd import chemistry_evolution_terms
>>> data = build_gcim_chemistry_problem("H 0 0 0; H 0 0 0.74", basis="sto-3g", reference_methods=())
>>> terms, diagnostics = chemistry_evolution_terms(data)
>>> print(terms.basis.dimension, diagnostics.dropped_pairs, diagnostics.evolution_coefficient_cutoff)
16 0 0.0
QFDEvolutionDiagnostics ¶
Bases: Record
How chemistry_evolution_terms derived a fermionic evolution generator B from the integrals of chemistry data.
chemistry_evolution_terms
returns it with B. Pass both to QFD, as
QFD(..., evolution="fermionic_blocks", evolution_terms=terms,
evolution_diagnostics=diagnostics), and the record is saved with the
Method, the Plan and the Result, where result.plan.method.evolution_diagnostics
reads it. QFD requires evolution_input to equal the content hash of
its evolution_terms.
The helper builds the table C_raw of the integrals, with one coefficient
g_T per normal-ordered ladder monomial T, and returns
B = sum_T b^gamma_T T after one Hermitian projection and a cutoff
gamma. C_raw is the operator of that table, formed from the binary64
integrals with the factor 1/2 of the two-body terms and the summation
of equal monomials, and may be non-Hermitian. With q the unrounded
Hermitian table, b the projected table before the cutoff and b^gamma
the returned table, summed over every monomial, the two sides of a pair
counted separately,
||B - C_raw|| <= sum_T |b^gamma_T - g_T| <= Delta_sym + Delta_round + Delta_drop,
since every nonzero normal-ordered monomial has norm at most 1, with
Delta_sym = sum_T |q_T - g_T|, Delta_round = sum_T |b_T - q_T|
and Delta_drop the sum of |b_T| over the dropped monomials.
Every bound below is computed in exact rationals from the binary64
values and rounded up once, and it is None when it overflows binary64.
These bounds compare B with the table C_raw of the integrals. They do
not bound the evolution, since C_raw need not be Hermitian, and neither
they nor the one-body correction measures the accuracy of a molecular
energy. Upper bounds on the distance between the target A and B are
stated in the Plan's assumptions. The fields below are read-only.
Attributes:
-
schema_version(Literal[1]) –Record layout version.
-
evolution_input(ContentID) –Content hash (
reference.identity) of the B that the helper returned. -
source_name(Text | None) –The
"name"entry of the chemistry data'smetadata, or None when it has none. -
integral_convention(Text | None) –The
"integral_convention"entry of thatmetadata, or None. -
one_body_shape(tuple[Count, Count]) –Shape of the spatial-orbital one-body array.
-
two_body_shape(tuple[Count, Count, Count, Count]) –Shape of the spatial-orbital two-body array.
-
transformation(Literal['signed midpoint of each pair of adjoint canonical monomials, rounded once, then removal of whole pairs at or below the cutoff']) –Fixed name of the projection and cutoff.
-
domain(Literal['real finite spatial-orbital integrals h[p,q] and v[p,q,r,s] = (ps|qr), spin modes 2p + sigma with alpha sigma = 0 and beta sigma = 1']) –Fixed statement of the inputs and mode order the helper accepts.
-
evolution_coefficient_cutoff(Nonnegative) –The cutoff gamma in Hartree, at least 0.
-
changed_pairs(Count) –Number of pairs of distinct adjoint monomials whose projected coefficients differ from those of C_raw.
-
dropped_pairs(Count) –Number of pairs of distinct adjoint monomials, and of self-adjoint monomials, that the cutoff removed.
-
symmetrization_correction(Nonnegative | None) –Upper bound on
Delta_sym. -
rounding_correction(Nonnegative | None) –Upper bound on
Delta_round. -
dropped_mass(Nonnegative | None) –Upper bound on
Delta_drop. -
raw_difference(Nonnegative | None) –Upper bound on
sum_T |b^gamma_T - g_T|, and hence on||B - C_raw||. -
max_one_body_asymmetry(Nonnegative | None) –Upper bound on
max_{p<q} |h_pq - h_qp|of the spatial one-body array h of the data. -
one_body_correction(Nonnegative | None) –Upper bound on
sum_pq |dh_pq|, withdh = h_B - hand h_B the spatial one-body coefficients of the returned B. -
one_body_correction_bound(Nonnegative | None) –Upper bound on
2 sum_pq |dh_pq|, which bounds the norm of the one-body correctionsum_pq,sigma dh_pq a_{p sigma}^dagger a_{q sigma}on the Fock space, the factor 2 for the two spin blocks. -
generator_shift(Real) –The identity coefficient c_B of the Jordan-Wigner image of B, rounded once. It is not added to any energy.
-
spin_statement(Text) –How many pairs of adjoint monomials and self-adjoint monomials of B conserve the alpha and beta electron numbers, and so Sz, under the mode order 2p + sigma, with the particle number and Sz of the reference occupations.
-
scope(Literal['the bounds compare B with the table C_raw of the integrals, which need not be Hermitian, so they do not bound the evolution, and they do not measure the accuracy of a molecular energy']) –Fixed statement of what the bounds above compare.
solve calls plan and the other hooks of a Method. Extending NWQLib describes them.