From d9925a5161d39654931403c4bc75e5e5e4e5c6d2 Mon Sep 17 00:00:00 2001 From: mhucka Date: Thu, 23 Apr 2026 21:36:15 +0000 Subject: [PATCH 1/2] Remove left-over Python 2-isms --- dev_tools/conf/.pylintrc | 6 ++---- src/openfermion/chem/molecular_data.py | 4 ++-- .../contrib/representability/_dualbasis.py | 4 ++-- .../contrib/representability/_multitensor.py | 4 ++-- .../contrib/representability/_namedtensor.py | 2 +- .../hamiltonians/special_operators_test.py | 2 +- src/openfermion/linalg/davidson.py | 8 ++++---- .../linalg/linear_qubit_operator.py | 6 +++--- src/openfermion/ops/operators/binary_code.py | 2 +- .../ops/operators/binary_polynomial.py | 2 +- .../ops/operators/binary_polynomial_test.py | 2 +- .../ops/operators/symbolic_operator_test.py | 2 +- .../ops/representations/doci_hamiltonian.py | 2 +- .../representations/interaction_operator.py | 2 +- .../ops/representations/interaction_rdm.py | 2 +- .../ops/representations/polynomial_tensor.py | 2 +- .../representations/quadratic_hamiltonian.py | 4 ++-- .../integrals/M_250_beta_16_eta_10.h5 | Bin 610048 -> 610046 bytes .../integrals/eri_reiher.h5 | Bin 68049832 -> 68048704 bytes .../pbc/thc/factorizations/kmeans.py | 2 +- src/openfermion/resource_estimates/utils.py | 2 +- src/openfermion/testing/testing_utils.py | 4 ++-- src/openfermion/testing/testing_utils_test.py | 14 +++++++------- src/openfermion/utils/operator_utils.py | 1 - 24 files changed, 38 insertions(+), 41 deletions(-) diff --git a/dev_tools/conf/.pylintrc b/dev_tools/conf/.pylintrc index 2edf4ac51..1ae9da80b 100644 --- a/dev_tools/conf/.pylintrc +++ b/dev_tools/conf/.pylintrc @@ -19,9 +19,7 @@ [MAIN] -# Analyse import fallback blocks. This can be used to support both Python 2 and -# 3 compatible code, which means that the block might have code that exists -# only in one or another interpreter, leading to false positives when analysed. +# Analyse import fallback blocks. analyse-fallback-blocks=no # Clear in-memory caches upon conclusion of linting. Useful if running pylint @@ -1027,4 +1025,4 @@ init-import=yes # List of qualified module names which can have objects that can redefine # builtins. -redefining-builtins-modules=six.moves,past.builtins,future.builtins,builtins,io +redefining-builtins-modules=builtins,io diff --git a/src/openfermion/chem/molecular_data.py b/src/openfermion/chem/molecular_data.py index d0867592f..64dc376b6 100644 --- a/src/openfermion/chem/molecular_data.py +++ b/src/openfermion/chem/molecular_data.py @@ -396,7 +396,7 @@ def spinorb_from_spatial(one_body_integrals, two_body_integrals): return one_body_coefficients, two_body_coefficients -class MolecularData(object): +class MolecularData: """Class for storing molecule data from a fixed basis set at a fixed geometry that is obtained from classical electronic structure packages. Not every field is filled in every calculation. All data @@ -859,7 +859,7 @@ def load(self): # Load charge: self.charge = int(f["charge"][...]) # Load description: - self.description = f["description"][...].tobytes().decode('utf-8').rstrip(u'\x00') + self.description = f["description"][...].tobytes().decode('utf-8').rstrip('\x00') # Load name: self.name = f["name"][...].tobytes().decode('utf-8') # Load n_atoms: diff --git a/src/openfermion/contrib/representability/_dualbasis.py b/src/openfermion/contrib/representability/_dualbasis.py index 1375ef88d..1369388e3 100644 --- a/src/openfermion/contrib/representability/_dualbasis.py +++ b/src/openfermion/contrib/representability/_dualbasis.py @@ -2,7 +2,7 @@ import copy -class DualBasisElement(object): +class DualBasisElement: """ This object is named after the algebraic dual space or dual vector space @@ -154,7 +154,7 @@ def __add__(self, other): raise TypeError("DualBasisElement can be added to same type or DualBasis") -class DualBasis(object): +class DualBasis: def __init__(self, elements: Optional[Union[None, List[DualBasisElement]]] = None): """ A collection of DualBasisElements diff --git a/src/openfermion/contrib/representability/_multitensor.py b/src/openfermion/contrib/representability/_multitensor.py index e63b0805b..f819c8637 100644 --- a/src/openfermion/contrib/representability/_multitensor.py +++ b/src/openfermion/contrib/representability/_multitensor.py @@ -3,7 +3,7 @@ from openfermion.contrib.representability._dualbasis import DualBasisElement, DualBasis -class TMap(object): +class TMap: def __init__(self, tensors): """ provide a map of tensor name to tensors @@ -22,7 +22,7 @@ def __iter__(self): yield tt -class MultiTensor(object): +class MultiTensor: def __init__(self, tensors, dual_basis=DualBasis()): """ A collection of tensor objects with maps from name to tensor diff --git a/src/openfermion/contrib/representability/_namedtensor.py b/src/openfermion/contrib/representability/_namedtensor.py index ab4db7da3..f4fe977ab 100644 --- a/src/openfermion/contrib/representability/_namedtensor.py +++ b/src/openfermion/contrib/representability/_namedtensor.py @@ -4,7 +4,7 @@ from openfermion.contrib.representability._bijections import Bijection, index_index_basis -class Tensor(object): +class Tensor: """ Instantiation of named tensor """ diff --git a/src/openfermion/hamiltonians/special_operators_test.py b/src/openfermion/hamiltonians/special_operators_test.py index d4ebbf999..ba528fcd8 100644 --- a/src/openfermion/hamiltonians/special_operators_test.py +++ b/src/openfermion/hamiltonians/special_operators_test.py @@ -173,7 +173,7 @@ def test_init(self): # Test 'c' operator op1 = majorana_operator((2, 0)) op2 = majorana_operator('c2') - op3 = majorana_operator(u'c2') + op3 = majorana_operator('c2') correct = FermionOperator('2^') + FermionOperator('2') self.assertEqual(op1, op2) self.assertEqual(op1, op3) diff --git a/src/openfermion/linalg/davidson.py b/src/openfermion/linalg/davidson.py index 71c087637..94378c207 100644 --- a/src/openfermion/linalg/davidson.py +++ b/src/openfermion/linalg/davidson.py @@ -31,7 +31,7 @@ class DavidsonError(Exception): pass -class DavidsonOptions(object): +class DavidsonOptions: """Davidson algorithm iteration options.""" def __init__(self, max_subspace=100, max_iterations=300, eps=1e-6, real_only=False): @@ -68,7 +68,7 @@ def set_dimension(self, dimension): self.max_subspace = min(self.max_subspace, dimension + 1) -class Davidson(object): +class Davidson: """Davidson algorithm to get the n states with smallest eigenvalues.""" def __init__(self, linear_operator, linear_operator_diagonal, options=None): @@ -350,7 +350,7 @@ def __init__(self, qubit_operator, n_qubits=None, options=None): n_qubits(int): Number of qubits. options(DavidsonOptions): Iteration options. """ - super(QubitDavidson, self).__init__( + super().__init__( generate_linear_qubit_operator(qubit_operator, n_qubits, options), get_linear_qubit_operator_diagonal(qubit_operator, n_qubits), options=options, @@ -366,7 +366,7 @@ def __init__(self, sparse_matrix, options=None): sparse_matrix(scipy.sparse.spmatrix): A sparse matrix in scipy. options(DavidsonOptions): Iteration options. """ - super(SparseDavidson, self).__init__( + super().__init__( sparse_matrix, sparse_matrix.diagonal(), options=options ) diff --git a/src/openfermion/linalg/linear_qubit_operator.py b/src/openfermion/linalg/linear_qubit_operator.py index 0dfef6cd3..329f4b464 100644 --- a/src/openfermion/linalg/linear_qubit_operator.py +++ b/src/openfermion/linalg/linear_qubit_operator.py @@ -23,7 +23,7 @@ from openfermion.utils.operator_utils import count_qubits -class LinearQubitOperatorOptions(object): +class LinearQubitOperatorOptions: """Options for LinearQubitOperator.""" def __init__(self, processes=10, pool=None): @@ -94,7 +94,7 @@ def __init__(self, qubit_operator, n_qubits=None): ) n_hilbert = 2**n_qubits - super(LinearQubitOperator, self).__init__(shape=(n_hilbert, n_hilbert), dtype=complex) + super().__init__(shape=(n_hilbert, n_hilbert), dtype=complex) self.qubit_operator = qubit_operator self.n_qubits = n_qubits @@ -156,7 +156,7 @@ def __init__(self, qubit_operator, n_qubits=None, options=None): """ n_qubits = n_qubits or count_qubits(qubit_operator) n_hilbert = 2**n_qubits - super(ParallelLinearQubitOperator, self).__init__( + super().__init__( shape=(n_hilbert, n_hilbert), dtype=complex ) diff --git a/src/openfermion/ops/operators/binary_code.py b/src/openfermion/ops/operators/binary_code.py index 479607280..14eb48764 100644 --- a/src/openfermion/ops/operators/binary_code.py +++ b/src/openfermion/ops/operators/binary_code.py @@ -73,7 +73,7 @@ class BinaryCodeError(Exception): pass -class BinaryCode(object): +class BinaryCode: r"""The BinaryCode class provides a representation of an encoding-decoding pair for binary vectors of different lengths, where the decoding is allowed to be non-linear. diff --git a/src/openfermion/ops/operators/binary_polynomial.py b/src/openfermion/ops/operators/binary_polynomial.py index 672c464f8..795a7b4d9 100644 --- a/src/openfermion/ops/operators/binary_polynomial.py +++ b/src/openfermion/ops/operators/binary_polynomial.py @@ -23,7 +23,7 @@ class BinaryPolynomialError(Exception): pass -class BinaryPolynomial(object): +class BinaryPolynomial: r"""The BinaryPolynomial class provides an analytic representation of non-linear binary functions. An instance of this class describes a term of binary variables (variables of the values {0,1}, indexed diff --git a/src/openfermion/ops/operators/binary_polynomial_test.py b/src/openfermion/ops/operators/binary_polynomial_test.py index cef602bfa..62dafab5d 100644 --- a/src/openfermion/ops/operators/binary_polynomial_test.py +++ b/src/openfermion/ops/operators/binary_polynomial_test.py @@ -36,7 +36,7 @@ def test_init_string(self): self.assertEqual(operator1.terms, [(1,)]) operator1 = BinaryPolynomial('9 w1 w2 + 5') self.assertEqual(str(operator1), '[W1 W2] + [1]') - operator1 = BinaryPolynomial(u'9 w1 w2 + 5') + operator1 = BinaryPolynomial('9 w1 w2 + 5') self.assertEqual(str(operator1), '[W1 W2] + [1]') def test_none_init(self): diff --git a/src/openfermion/ops/operators/symbolic_operator_test.py b/src/openfermion/ops/operators/symbolic_operator_test.py index 0f084b3eb..5e128b858 100644 --- a/src/openfermion/ops/operators/symbolic_operator_test.py +++ b/src/openfermion/ops/operators/symbolic_operator_test.py @@ -155,7 +155,7 @@ def test_many_body_order(self): op1 = DummyOperator1('0^ 3 5^ 6') op2 = op1 + DummyOperator1('8^ 3') - op3 = op2 + DummyOperator1(u'1^ 2 3^ 4 5 ') + op3 = op2 + DummyOperator1('1^ 2 3^ 4 5 ') op4 = DummyOperator2('X0 X1 Y3') op5 = op4 - DummyOperator2('Z0') diff --git a/src/openfermion/ops/representations/doci_hamiltonian.py b/src/openfermion/ops/representations/doci_hamiltonian.py index 8d4fa329b..1587aeb6c 100644 --- a/src/openfermion/ops/representations/doci_hamiltonian.py +++ b/src/openfermion/ops/representations/doci_hamiltonian.py @@ -86,7 +86,7 @@ def __init__(self, constant, hc, hr1, hr2): hr2: The coefficients of ($h^{(r2)}_{p, q}$). This is an n_qubits x n_qubits array of floats. """ - super(DOCIHamiltonian, self).__init__(None) + super().__init__(None) self._n_qubits = hc.shape[0] self._constant = constant diff --git a/src/openfermion/ops/representations/interaction_operator.py b/src/openfermion/ops/representations/interaction_operator.py index 883b83f80..8434a32a7 100644 --- a/src/openfermion/ops/representations/interaction_operator.py +++ b/src/openfermion/ops/representations/interaction_operator.py @@ -65,7 +65,7 @@ def __init__(self, constant, one_body_tensor, two_body_tensor): n_qubits numpy array of floats. """ # Make sure nonzero elements are only for normal ordered terms. - super(InteractionOperator, self).__init__( + super().__init__( {(): constant, (1, 0): one_body_tensor, (1, 1, 0, 0): two_body_tensor} ) diff --git a/src/openfermion/ops/representations/interaction_rdm.py b/src/openfermion/ops/representations/interaction_rdm.py index d4b061c3e..2d48c1671 100644 --- a/src/openfermion/ops/representations/interaction_rdm.py +++ b/src/openfermion/ops/representations/interaction_rdm.py @@ -39,7 +39,7 @@ def __init__(self, one_body_tensor, two_body_tensor): two_body_tensor: Expectation values . """ - super(InteractionRDM, self).__init__( + super().__init__( {(1, 0): one_body_tensor, (1, 1, 0, 0): two_body_tensor} ) diff --git a/src/openfermion/ops/representations/polynomial_tensor.py b/src/openfermion/ops/representations/polynomial_tensor.py index 26484ec6d..9b3f20b47 100644 --- a/src/openfermion/ops/representations/polynomial_tensor.py +++ b/src/openfermion/ops/representations/polynomial_tensor.py @@ -92,7 +92,7 @@ def general_basis_change(general_tensor, rotation_matrix, key): return transformed_general_tensor -class PolynomialTensor(object): +class PolynomialTensor: r"""Class for storing tensor representations of operators that correspond with multilinear polynomials in the fermionic ladder operators. For instance, in a quadratic Hamiltonian (degree 2 polynomial) which diff --git a/src/openfermion/ops/representations/quadratic_hamiltonian.py b/src/openfermion/ops/representations/quadratic_hamiltonian.py index 00a72b3ff..41b6fc1f1 100644 --- a/src/openfermion/ops/representations/quadratic_hamiltonian.py +++ b/src/openfermion/ops/representations/quadratic_hamiltonian.py @@ -79,11 +79,11 @@ def __init__( # Initialize the PolynomialTensor if antisymmetric_part is None: - super(QuadraticHamiltonian, self).__init__( + super().__init__( {(): constant, (1, 0): combined_hermitian_part} ) else: - super(QuadraticHamiltonian, self).__init__( + super().__init__( { (): constant, (1, 0): combined_hermitian_part, diff --git a/src/openfermion/resource_estimates/integrals/M_250_beta_16_eta_10.h5 b/src/openfermion/resource_estimates/integrals/M_250_beta_16_eta_10.h5 index 10867c310197da8454efa4e26bddf5009f7d625c..4b4dd2675e9fd4579076d49528b3a75c00b528c6 100644 GIT binary patch delta 37 tcmZper}}TMYC{WS3sVbo3rh=Y3tJ2O7LJUU+cRHslm~5pXw4}v3;-0f4lw`# delta 41 vcmex2SG8fDYC{WS3sVbo3rh=Y3tJ2O7LJUUjHTN%UUHNN0qOhJobti|OA!wm diff --git a/src/openfermion/resource_estimates/integrals/eri_reiher.h5 b/src/openfermion/resource_estimates/integrals/eri_reiher.h5 index 1af236091aef3060084657e5948588e71b7e3c22..1682746cf7613e5a35ac2dcfa3027b27cefc2d4f 100644 GIT binary patch delta 11873 zcma)?d0frg*T-Lb?<7jMK?9Z2K#@a5iiSf(CE+SVA|bPIiI9poD1C)OLP(Li$$ z->Fd>MUWLksqrAIMt$u0=72`)G!@RljZo^`Ik<6GM?P(3;|hO;_pQb#4OA0UQ+kUR|_NfAC&ibjFY6xf^r>nBrTy4*!;}t9yuR z2kCKpMcE=fls>9C$^d1EGC~=nTJW+(Er+}D*3eSw%?s2_(h_;UWE0aSd}5kOTT?}H zp$SheG|hRy-O|nQ8yD;{L$yMgqbyLZ`GQ@Ru#>wDvihSv?-y;gb{nrTx9+2%u(P%1 zcD6S6e7V+NHgn7s@vCik{OUG|*$UlmZBe#dx0~IzWqki}yN*VR+DbcAJ6>DazBq*M z=xYB_O|i+%o^NvNAkW}cw>x}Pt?q%Yyf!j%JjHsX5|kwQL+wPF%~T^XsGhM@{FLmVDv2&R5>? zfv>x~Y{Gkd?PAo953_MLZ>@;(cIHvuU00WIEe#iZ@0+fRg`ArWa*=ctd0{RnS5!Bi z7uJ2w7j6^cCh714Q{6&yxnWE9E$Y0`!kton$kP2~6U8ojca#U;W$*cJ6W@HsvvDUy z))!BdoM(OM@g$HZ59p~d;4Q*?)|T=g?Yt_CdAXNYX(->A>6J~mSC&_$CO6ybh4%6O zrx&UhsyE7;zyI0i)oimefS`PK-ZZ!P)e6+Sqp7q3&zP4Ksj$`c5Ak+{(cIZ&4DSsC> zG}~E`zF{b87-~2wn5SI!v}P}FFyZW5L_ov%po>}fKOTQH`r zDc`kzOwLa}c>UN@mfZBn*t?qiTiMuAGR27ZV^QPyi1*=}3iy|-@jp8&zT6s*nt+;! znuMCnzucM%HLOAjQ%33sBLhh5YFHm=X`Zup$N*_wN@ms901SY7zhY#o|61{KJRE zp3S(kTD>v95xO$@>_F-h5mAGp}(S+0Uu|(0tb@fxq_#7Cd3yXXqgz` z!Y8>TKAFY?vlC+i6xTl_qE_B^X<#mqEm9ZxOT-9UerAW4bV9_1(k|ghgy%0b30r^Z zvNOgC3%fMbMpQa#6KXTJu-l?n%AKBX!KGhgl7ZUF*O+XR7`HOtHpiTA^w{QdgI_b; z9%0RUb>Hsl#uv`n9^j(5kiVT@$j{{Jd}(1OnwjCL%ww1MwRJo0>MQo|-hs+OWutbY zcJckYbL_Ku&7j@5nKs1izP+AD8s|n>E9%^Gd7WEchZLo&Ll z?fY?j>U=-y0FJ%zYfDbA6jm53ZayhQanwQ7A=F{i5!6wB^U1NNBYBxm5k6dlE{bFQgZiZeAOxpj>nE<1}OnfdlCpZWG&yIXwIh4XohxZkz&54E||{qsFs6|+q*pf2*+ zrk9r09{6#&V?Tw=|1y{PU%4H}H7{N{)|mfOeg(IO?%gY&trePTSGlIzwV>xpzlOeS zpn69|wdZwS?OERWlXB2F(9&Rio)K2@=`7zMyYbOgkv!oBPo7YjzJ<#)ZsL$HXx|(( zkGEca6HmK|$v64Lj-I^9DN zc5U^x*1Vum%@7UVM7!pp7k@pl=Ajy|464cR#g}ia!4ohpqlU+2+@s5Ryxsj#GG066 zes2ffZuxyYizlVtN7bSppz2T$`J~iGKDtVer&w_25npiT@n>hHv7nI@9MKjqrJpRG>dTQ5D6dMg|ZpK}Mp7n9O?`ra4#Otpt!@Y=&K8+Yf=-oM0i zHlDmfz2@=c&8ok-!Jaqh%KVSN;r_?pzWT&Hj=V#Y>|ghe_pf_j)S5Tb_<+7LMDqg= z(fm07FJ8IuBmQi+=p*VA>NDyKw_Eh}ii6TGqdy*N-A)m!^^M1BeII&9HS3qHe(=jy zKd-$xl4VH#XrEBngGeX=N}#X@Bdk3fp2CR2KUCfV4LrXyf>oE@n! zmi*J~2>7S9Bl)@T-Mc;cs3yJlYfljN0v!mv_mh#ctD&SyMzV=Cv06r8Vs%GyuqjwR z?MPlW0loJf$>xqwVBLxQ>?{=w>qMYnm;>qO1V0iT$U03ab-e?D)b)3BC)v(0(!h<}n*u!+ zxe?EvQe3GUfw)q4Vlo&u8GGQGgS)v0xzH4}+If(>`qDFZ4}$O{@XTFKzI(xwIJp?g z%>+5|djf4Ddx#kgU)+O0_~M=%4#kEo2imMg1$$+2obQf;N&qcCuiAGv0!+zLl<8~Ex#>}fyp*!-8>9XIJm z;JArDiO>T_nZFoxJ12h8ktLyUX!ann_59a(g`!52BEK-QEF6{>gb6d4crpyF_~aOYu>#}Jo==7oYYj*`AC8YE zm0u4hi17r@mms1DI82{M znv8+&SLcZt)_*pSAm$U$f3|>3+64YRaAlzAM*{IIf*(f{3AB}pY7+@!C4r*aB(h~K zjEs^<*FI8ev4qZ~cok{C7>;`-iz#xPkW3J(2{=wzLxTTQrqvMMWG(5YUZ3Y))JY0o zONzo%$Y+f0MFxP;{`jS)QtXu!0P(lGfZg4isug}^X*2D$qKTs^l6qp9q@mE28$LzlObn3mxBY%6JZ1jc4> zBl!+e^U7@mv0WfjV23~!f##Ljq}L*4riEEnV1>^;XCx;x#Q6ATLRKNIU zBUvopjsL$qm(1VLaF4s0OT`272;y%7#RKw5pdA>_%O}(ZT5QQD=B>fCIG>DFlQx&; z6T}{Y0s@;$_mcd%(BFNZuoCZ{`-r70Oq{LOmD>LwH)kDJOeE{L z5`p6ctm94)^x$&Y{s>J5O5X)aU(u9HrQ@3j}cy&9Ced=^$6e!WaXeKJEmey)KjW zwir*|R^TVMT*gmsxq_eEa+RF+Qn@p9U16ka8!6Q68g53j>*T%BZH;@DEEp8FWzp8Evfp8J$c zm<>KJo(jjE{NX76FJo5SJ)eN;uDd=PJAX1cH#@Ei~r?~qSk)J zb7t)~f$w3w*k37$& zr`3)W=F)ZYg#OQ|)c-l5fd8O(M}sVY(Np8#!+u7)>PfOwj3U$o8VRUVkezBwr(`P2 zSCZFM4GLaUo6wfg%FG(G>g{_CAk?KPt&u5{Q%pb$!}X=uHBBi(lS1qoEoz+k+duGwTw+eeRHG=tpndbCw5IJ-oT;w%NH;!ALps3D(p0$7# zjSa;w4!1F+hFf7qnIScAEhRrRq>%j3h%V|5&8>_n#y`0-V~S`Y(2_!~%!KOLD(iYu zN~Q@#m+T$A#4wDAx$$oBXFsY=$KBJ3$t$vV(GIm!Yr7IV$idKcNt=rJ8-F;)7pP(~3Q z1v&{hQ24RXkrv(jeQ2!}<3uH`n9c%SC}_nv(~|UtGi}*Il27f5YcSP?Ue$xGJMG?Iylwavhmrhq@H<-?}C+&@;*idh@y3jsob)kLf!8Rs>LttBT$RP$+skfKCpCc0L1X zg)z{ufz)Rc^!qtb?5}v;K@{<)z+izufgph)0z(CcQHa+aPRlGBM&2t;AU0q)mCsWJ zg%}FXC4V?Vaid^bqNxhJq`e`*6!wOUph3q~&JzaOhEPibm7_o(@q?syfsDl=^oZN9 zU1DDqLfeM?TD^G1NLrZ!Bh5zPBf(PFQFKmE_%R<}%%#YUqbMR&V6;G(z!(aV8^@yA zg0sUoim|w1?{O3nPQkGEct?D_5GaVAN^>tYj55QzN*NobQA7m(jSbVOuUxhFakJ~u zMjfPBqZw!!Ml-3|f1k-PY9Mwy=0<&@0QIYh^DbVdPhvqv#$;>%aZ5otS&%y4G zRHZ%_H=24BUDOIj+e8Tyf7~sKBIXIqr|`Jj0(xb$vIYw2meI7Lg|gI$WyKwdZcv>V zO&>k3FD1oTf_(Er`p#2Xhk>cD7ShPh4eK4V(47vBLBk##D-b8JNMJEO&ER-?Zl-Ft z;m&fUyX_!WeFVi$FHV&U4PX^hTT|A zrC~SLP#AV&Egj2L=>RNbDKubH!upp(X36`{IV%@rs`mnzkO_PTPQQ zr=`*NeIe+6nlL-(k7*Q~KW?Pv8z5*^I`!-csaMkJ-AIV^*(5f1-PBDqWCZj&vk9M5 zYW`>wh31bo(@p(huk#if(^7IAxCKpZV1~d}w6}rV=;W=+B0U!6V+MIh7Jau&6|x;>%8IvqKeyfk);px+A{+xSrKT$_UTF z#R%U`{Q^`z2i=W7O*D}#uI|P!yP7MIhu?VhZ@PXh92%c5ywt84_!0mcO7iI`OKEg% zK84Y>duT*5T%KKkACO973MgVPg_4+kG$#nAl<&j9K+?Li4_*76{Q?IB3I#ZN`a1_{ z$oqzslrksDLgz5ex6nC4YgK6irUd)RC=BZyk5Z_1JVtX3{~d8iNh!xDqDTNJB&8J7 zqlMttuY~Ft!icaEiq)_AV@jxPW5}FTLSxs0&Ce2aozi!s;}pIdouEZ2a5V1(MlaIf z7bhqTeo;y{?0^?*PKxs|tN0{^tl~1-EJE7f@f3yq9Z%Dfx9eLyOS?+3Bmcq8GV+YT zS%Gr`=LIeZTokw@a9Q9AZmN-2=>ap9VWCZ>(Wb4zqTnh$Gxz@CS&tb$^2n!3J%MqYqs<8RPUMxY*ZgI;Kwe|`B4sxOtN-@vmhy^=2N4k0%x zanHf?N0rnh5Sn=06#KC<_$J*NqU;$<`X_Hv#4Ul_6!cHtp-uYyyNnL+hgH#yn*T0I zONR=pDB>=KLxt6Jw4^E~U$@K688wE8jRxIDq1q^9GaP{dOTO~*f@>-=Eb z-e zt}2V@JC0 z-7bA!ZG_^V{yZX%QQgBXlu?OqpbzIF{7aytndT*OADrPrlIM5 zG+vou$&O`Mu~+RO+1`qcx05~xS~2(>Xw5P=!{&F^?4^g4Hx`X-xS5|5T zXScXAjLtRlTp4KQbz={X*I%)~dS1rX?hN53;EwaK)q|aLQ#OpSS@gjw0IEBAvXYOg zu7b4MQO*!O1bQ-9?dZk4yQ>NhaCxQ|`?lskN$C|E$guClxwmu9(ZGG8>Bk<+EuQ2az4}95IC)nJ=k6|2M-rkQP z`Y|YP@6Yo4!_s;FY>qkn*x=979xAVm;FS^Q?5+@cvp>5dQ{KYB8yG%%Sl#Lpz)qVe zFFfEyhY=B-q>NQqNyu0=04HG8K(@GDeUI;(wG^v8h(WCOpKO4Gs+$6rXZ^_{>>KtT z^3A}a{7<&2ld67>rSl+?qYH9}!7SRaVXc~aNTG>?(N!b{;!`FDu}j^5RW=;H2Qf8& zRW=XPMhs!wTC0*+%wG*@Kx-+scnCub#Ss+`V_h5?#zx(2A=G0y3m&05Z}F%-LHo6U zjCaG?KeJW-8@=`uYN#hw=LF*#7jA{=*CpYg2OXjK^>%8!j_4~MBL;!>gM1O|ns z6Is*OsGI_aOqZ`_ubm`C~;dsMb$pT{3<(Rl7>WClAqP1SzGR@+b#)>@J`--=tN`8I*=_)QRd?m{xm&tYJgzngs>4SKq{?CgE0dY8+FYk=$bT;Zk*O!Jr%=&vi z*)5^kxPbYqDX+}n6`7)z?UH5{u%uagS<$S0%wr`O%FTR+;y!aBfEm(Q05pOcOIC)6bvg2swvJ(QO z0w)E^(6q76yK082p^1IVDP%kztktLR?dsD4{|KDH4_2RL#g)Ix9Cnw^G0E=Ic?Ncu zF0jw5e;Yc2cg{s-zWBdE#KcQ%UfM6$f5_l6lgw4F5xwF}#=A-K=*ws{(O1}t^KjPp zD#M^6VJ5yL%)G|Jnkw(ULe{QpY=@rm`YB#LwK>`eVzsWb&PRWL$8a}x6U@r-0n94c z?9R%|TX=CRHw}I3iVEDqD{cr>;yzw+lNBFUbw;r%8bjvjOU1KpVMsLVw!j^MDuKHK z)fgtts$nEXm9}8U@{E>aC&1+%dupNz_K#q&pKAy5HTPJ%3RMJ!!ILX{Zx0!n_gPAC z!{cwBmsCBx76&{00lVY)dt1M7@BvGYP|Xic%~dwLgOm|nhi6FiLp(#GAF-*jf8PNG z@3)VbQ%(JyL0KEATI&gZm)27@snx$PRN-Z+s|GEk(5R<4HBrx)`#{y56sW3r#?}@5 zx(HF2`W$z1>I;FF0ox3Ct{){dv_=~_-w2L_F_{l*kymDeBf>f_QJto-%< zj+4>*hrmyEB%`-lp1JB;N`gm(n&c5d1gHQLP!njR1|AXWYE!?dY9d(r*hk;lfP8&p zHT?h>{IIdw{!R@u@ocOy_t#K^*#1q_dS7c8IMR-id`43>kk8Om`=0O{w=~aOs&>&* PLo`!^Y8P#_)0Y1O`dOI4 delta 14923 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 HEnEH{nhBja diff --git a/src/openfermion/resource_estimates/pbc/thc/factorizations/kmeans.py b/src/openfermion/resource_estimates/pbc/thc/factorizations/kmeans.py index 223fe278c..743ad2a91 100644 --- a/src/openfermion/resource_estimates/pbc/thc/factorizations/kmeans.py +++ b/src/openfermion/resource_estimates/pbc/thc/factorizations/kmeans.py @@ -20,7 +20,7 @@ """ -class KMeansCVT(object): +class KMeansCVT: def __init__(self, grid: npt.NDArray, max_iteration: int = 100, threshold: float = 1e-6): """Initialize k-means solver to find interpolating points for ISDF. diff --git a/src/openfermion/resource_estimates/utils.py b/src/openfermion/resource_estimates/utils.py index 3a0b84db4..5f1d191d9 100644 --- a/src/openfermion/resource_estimates/utils.py +++ b/src/openfermion/resource_estimates/utils.py @@ -137,7 +137,7 @@ def power_two(m: int) -> int: return 0 -class RunSilent(object): +class RunSilent: """Context manager to prevent function writing to stdout/stderr e.g. for noisy_function(), wrap it like so diff --git a/src/openfermion/testing/testing_utils.py b/src/openfermion/testing/testing_utils.py index f98c1588e..54a39d917 100644 --- a/src/openfermion/testing/testing_utils.py +++ b/src/openfermion/testing/testing_utils.py @@ -219,7 +219,7 @@ def random_quadratic_hamiltonian( return QuadraticHamiltonian(hermitian_mat, antisymmetric_mat, constant, chemical_potential) -class EqualsTester(object): +class EqualsTester: """Tests equality against user-provided disjoint equivalence groups.""" def __init__(self, test_case): @@ -315,7 +315,7 @@ def make_equality_pair(self, factory): self.add_equality_group(factory(), factory()) -class _ClassUnknownToSubjects(object): +class _ClassUnknownToSubjects: """Equality methods should be able to deal with the unexpected.""" def __eq__(self, other): diff --git a/src/openfermion/testing/testing_utils_test.py b/src/openfermion/testing/testing_utils_test.py index 938958dbf..737ae779e 100644 --- a/src/openfermion/testing/testing_utils_test.py +++ b/src/openfermion/testing/testing_utils_test.py @@ -103,7 +103,7 @@ def test_add_equality_group_not_disjoint(self): eq.add_equality_group(1) def test_add_equality_group_bad_hash(self): - class KeyHash(object): + class KeyHash: def __init__(self, k, h): self._k = k self._h = h @@ -124,7 +124,7 @@ def __hash__(self): eq.add_equality_group(KeyHash('c', 2), KeyHash('c', 3)) def test_add_equality_group_exception_hash(self): - class FailHash(object): + class FailHash: def __hash__(self): raise ValueError('injected failure') @@ -135,7 +135,7 @@ def __hash__(self): def test_can_fail_when_forgot_type_check(self): eq = EqualsTester(self) - class NoTypeCheckEqualImplementation(object): + class NoTypeCheckEqualImplementation: def __init__(self): self.x = 1 @@ -151,7 +151,7 @@ def __ne__(self, other): def test_fails_hash_is_default_and_inconsistent(self): eq = EqualsTester(self) - class DefaultHashImplementation(object): + class DefaultHashImplementation: __hash__ = object.__hash__ def __init__(self): @@ -171,7 +171,7 @@ def __ne__(self, other): def test_fails_when_ne_is_inconsistent(self): eq = EqualsTester(self) - class InconsistentNeImplementation(object): + class InconsistentNeImplementation: def __init__(self): self.x = 1 @@ -187,7 +187,7 @@ def __ne__(self, other): def test_fails_when_not_reflexive(self): eq = EqualsTester(self) - class NotReflexiveImplementation(object): + class NotReflexiveImplementation: def __init__(self): self.x = 1 @@ -200,7 +200,7 @@ def __eq__(self, other): def test_fails_when_not_commutative(self): eq = EqualsTester(self) - class NotCommutativeImplementation(object): + class NotCommutativeImplementation: def __init__(self, x): self.x = x diff --git a/src/openfermion/utils/operator_utils.py b/src/openfermion/utils/operator_utils.py index 10d5a67aa..8e55e35cd 100644 --- a/src/openfermion/utils/operator_utils.py +++ b/src/openfermion/utils/operator_utils.py @@ -11,7 +11,6 @@ # limitations under the License. """This module provides generic tools for classes in ops/""" -from builtins import map, zip import marshal import os From 0c6295cfeb68643cb63a54e9994253078cb52b32 Mon Sep 17 00:00:00 2001 From: mhucka Date: Thu, 23 Apr 2026 21:36:48 +0000 Subject: [PATCH 2/2] Format --- src/openfermion/linalg/davidson.py | 4 +--- src/openfermion/linalg/linear_qubit_operator.py | 4 +--- src/openfermion/ops/representations/interaction_operator.py | 4 +--- src/openfermion/ops/representations/interaction_rdm.py | 4 +--- src/openfermion/ops/representations/quadratic_hamiltonian.py | 4 +--- 5 files changed, 5 insertions(+), 15 deletions(-) diff --git a/src/openfermion/linalg/davidson.py b/src/openfermion/linalg/davidson.py index 94378c207..3918c0a51 100644 --- a/src/openfermion/linalg/davidson.py +++ b/src/openfermion/linalg/davidson.py @@ -366,9 +366,7 @@ def __init__(self, sparse_matrix, options=None): sparse_matrix(scipy.sparse.spmatrix): A sparse matrix in scipy. options(DavidsonOptions): Iteration options. """ - super().__init__( - sparse_matrix, sparse_matrix.diagonal(), options=options - ) + super().__init__(sparse_matrix, sparse_matrix.diagonal(), options=options) def generate_random_vectors(row, col, real_only=False): diff --git a/src/openfermion/linalg/linear_qubit_operator.py b/src/openfermion/linalg/linear_qubit_operator.py index 329f4b464..5a62b87bc 100644 --- a/src/openfermion/linalg/linear_qubit_operator.py +++ b/src/openfermion/linalg/linear_qubit_operator.py @@ -156,9 +156,7 @@ def __init__(self, qubit_operator, n_qubits=None, options=None): """ n_qubits = n_qubits or count_qubits(qubit_operator) n_hilbert = 2**n_qubits - super().__init__( - shape=(n_hilbert, n_hilbert), dtype=complex - ) + super().__init__(shape=(n_hilbert, n_hilbert), dtype=complex) self.qubit_operator = qubit_operator self.n_qubits = n_qubits diff --git a/src/openfermion/ops/representations/interaction_operator.py b/src/openfermion/ops/representations/interaction_operator.py index 8434a32a7..e5330e7bf 100644 --- a/src/openfermion/ops/representations/interaction_operator.py +++ b/src/openfermion/ops/representations/interaction_operator.py @@ -65,9 +65,7 @@ def __init__(self, constant, one_body_tensor, two_body_tensor): n_qubits numpy array of floats. """ # Make sure nonzero elements are only for normal ordered terms. - super().__init__( - {(): constant, (1, 0): one_body_tensor, (1, 1, 0, 0): two_body_tensor} - ) + super().__init__({(): constant, (1, 0): one_body_tensor, (1, 1, 0, 0): two_body_tensor}) @property def one_body_tensor(self): diff --git a/src/openfermion/ops/representations/interaction_rdm.py b/src/openfermion/ops/representations/interaction_rdm.py index 2d48c1671..b7446a579 100644 --- a/src/openfermion/ops/representations/interaction_rdm.py +++ b/src/openfermion/ops/representations/interaction_rdm.py @@ -39,9 +39,7 @@ def __init__(self, one_body_tensor, two_body_tensor): two_body_tensor: Expectation values . """ - super().__init__( - {(1, 0): one_body_tensor, (1, 1, 0, 0): two_body_tensor} - ) + super().__init__({(1, 0): one_body_tensor, (1, 1, 0, 0): two_body_tensor}) @property def one_body_tensor(self): diff --git a/src/openfermion/ops/representations/quadratic_hamiltonian.py b/src/openfermion/ops/representations/quadratic_hamiltonian.py index 41b6fc1f1..d481d32c3 100644 --- a/src/openfermion/ops/representations/quadratic_hamiltonian.py +++ b/src/openfermion/ops/representations/quadratic_hamiltonian.py @@ -79,9 +79,7 @@ def __init__( # Initialize the PolynomialTensor if antisymmetric_part is None: - super().__init__( - {(): constant, (1, 0): combined_hermitian_part} - ) + super().__init__({(): constant, (1, 0): combined_hermitian_part}) else: super().__init__( {