ffsim 0.0.83__tar.gz → 0.0.84__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {ffsim-0.0.83 → ffsim-0.0.84}/.gitignore +3 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/PKG-INFO +1 -1
- {ffsim-0.0.83 → ffsim-0.0.84}/pyproject.toml +1 -1
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/__init__.py +2 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/contract/__init__.py +2 -1
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/contract/two_body.py +111 -1
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/hamiltonians/__init__.py +2 -0
- ffsim-0.0.84/python/ffsim/hamiltonians/molecular_hamiltonian.py +984 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/linalg/util.py +159 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/molecular_data.py +4 -1
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/qiskit/lucj_pass_manager.py +17 -15
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/random/__init__.py +2 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/random/random.py +59 -18
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/states/rdm.py +7 -16
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/testing/testing.py +46 -45
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/variational/orbital_optimization.py +9 -16
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/contract/two_body_test.py +80 -0
- ffsim-0.0.84/tests/python/hamiltonians/molecular_hamiltonian_test.py +549 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/linalg/double_factorized_decomposition_test.py +3 -1
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/linalg/givens_test.py +2 -3
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/linalg/util_test.py +194 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/operators/coupled_cluster_test.py +21 -9
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/operators/fermion_operator_test.py +119 -36
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/qiskit/lucj_pass_manager_test.py +31 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/random_test.py +35 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/states/rdm_test.py +14 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/states/states_test.py +3 -2
- ffsim-0.0.84/uv.lock +3467 -0
- ffsim-0.0.83/python/ffsim/hamiltonians/molecular_hamiltonian.py +0 -382
- ffsim-0.0.83/tests/python/hamiltonians/molecular_hamiltonian_test.py +0 -360
- ffsim-0.0.83/uv.lock +0 -2999
- {ffsim-0.0.83 → ffsim-0.0.84}/.cargo/config.toml +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/.dockerignore +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/.github/workflows/build-and-release.yml +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/.github/workflows/check.yml +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/.github/workflows/docker.yml +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/.github/workflows/docs-dev.yml +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/.github/workflows/docs-release.yml +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/.github/workflows/test-latest-versions.yml +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/.github/workflows/test-minimum-versions.yml +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/.pre-commit-config.yaml +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/CONTRIBUTING.md +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/Cargo.lock +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/Cargo.toml +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/Dockerfile +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/LICENSE +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/README.md +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/compose.yaml +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/docs/_static/logo-dark.svg +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/docs/_static/logo.svg +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/docs/_templates/autosummary/class.rst +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/docs/conf.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/docs/explanations/diag-coulomb-hamiltonian.ipynb +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/docs/explanations/double-factorized.ipynb +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/docs/explanations/fermion-operator.ipynb +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/docs/explanations/hamiltonians.ipynb +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/docs/explanations/index.md +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/docs/explanations/lucj.ipynb +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/docs/explanations/orbital-rotation.ipynb +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/docs/explanations/protocols.ipynb +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/docs/explanations/qubit-gate-decompositions.ipynb +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/docs/explanations/state-vectors-and-gates.ipynb +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/docs/explanations/variational-ansatzes.ipynb +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/docs/generate_api_docs.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/docs/how-to-guides/compress-orbital-rotation.ipynb +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/docs/how-to-guides/compute-expectation-values.ipynb +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/docs/how-to-guides/entanglement-forging.ipynb +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/docs/how-to-guides/index.md +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/docs/how-to-guides/qiskit-circuits-sim.ipynb +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/docs/how-to-guides/qiskit-lucj.ipynb +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/docs/how-to-guides/qiskit-merge-orbital-rotations.ipynb +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/docs/how-to-guides/qiskit-trotter.ipynb +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/docs/how-to-guides/sample-from-state-vectors.ipynb +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/docs/how-to-guides/sample-slater.ipynb +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/docs/how-to-guides/simulate-trotter-hubbard.ipynb +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/docs/how-to-guides/simulate-trotter-mol-ham.ipynb +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/docs/how-to-guides/simulate-vqe.ipynb +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/docs/index.md +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/docs/install.md +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/docs/tutorials/double-factorized-trotter.ipynb +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/docs/tutorials/index.md +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/_cistring.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/_lib.pyi +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/_slow/__init__.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/_slow/contract/__init__.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/_slow/contract/diag_coulomb.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/_slow/contract/num_op_sum.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/_slow/fermion_operator.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/_slow/gates/__init__.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/_slow/gates/diag_coulomb.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/_slow/gates/num_op_sum.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/_slow/gates/orbital_rotation.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/contract/diag_coulomb.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/contract/num_op_sum.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/contract/one_body.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/gates/__init__.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/gates/basic_gates.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/gates/diag_coulomb.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/gates/num_op_sum.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/gates/orbital_rotation.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/gates/quad_ham.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/hamiltonians/diagonal_coulomb_hamiltonian.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/hamiltonians/double_factorized_hamiltonian.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/hamiltonians/single_factorized_hamiltonian.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/init_cache.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/linalg/__init__.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/linalg/double_factorized_decomposition.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/linalg/givens.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/linalg/linalg.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/linalg/predicates.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/operators/__init__.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/operators/common_operators.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/operators/coupled_cluster.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/operators/fermi_hubbard.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/operators/fermion_action.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/operators/fermion_operator.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/optimize/__init__.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/optimize/_util.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/optimize/linear_method.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/protocols/__init__.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/protocols/apply_unitary_protocol.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/protocols/approximate_equality_protocol.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/protocols/diagonal_protocol.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/protocols/fermion_operator_protocol.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/protocols/linear_operator_protocol.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/protocols/trace_protocol.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/py.typed +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/qiskit/__init__.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/qiskit/gates/__init__.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/qiskit/gates/diag_coulomb.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/qiskit/gates/diag_coulomb_trotter_split_op.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/qiskit/gates/double_factorized_trotter.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/qiskit/gates/givens_ansatz.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/qiskit/gates/num_num_ansatz.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/qiskit/gates/num_op_sum.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/qiskit/gates/orbital_rotation.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/qiskit/gates/slater_determinant.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/qiskit/gates/ucj.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/qiskit/jordan_wigner.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/qiskit/sampler.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/qiskit/sim.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/qiskit/transpiler_passes/__init__.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/qiskit/transpiler_passes/drop_negligible.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/qiskit/transpiler_passes/merge_orbital_rotations.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/qiskit/transpiler_stages.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/qiskit/util.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/states/__init__.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/states/bitstring.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/states/dimensions.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/states/product_state_sum.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/states/sample_slater.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/states/slater.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/states/spin.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/states/states.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/states/wick.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/testing/__init__.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/trotter/__init__.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/trotter/_util.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/trotter/diagonal_coulomb_split_op.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/trotter/double_factorized.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/trotter/qdrift.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/variational/__init__.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/variational/givens.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/variational/hopgate.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/variational/multireference.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/variational/num_num.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/variational/uccsd.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/variational/ucj_angles_spin_balanced.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/variational/ucj_spin_balanced.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/variational/ucj_spin_unbalanced.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/variational/ucj_spinless.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/python/ffsim/variational/util.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/src/contract/diag_coulomb.rs +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/src/contract/fermion_operator.rs +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/src/contract/mod.rs +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/src/contract/num_op_sum.rs +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/src/fermion_operator.rs +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/src/gates/diag_coulomb.rs +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/src/gates/mod.rs +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/src/gates/num_op_sum.rs +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/src/gates/orbital_rotation.rs +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/src/gates/phase_shift.rs +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/src/jordan_wigner.rs +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/src/lib.rs +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/src/linalg/givens.rs +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/src/linalg/mod.rs +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/__init__.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/_slow/__init__.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/_slow/contract/__init__.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/_slow/contract/diag_coulomb_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/_slow/contract/num_op_sum_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/_slow/gates/__init__.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/_slow/gates/diag_coulomb_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/_slow/gates/num_op_sum_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/_slow/gates/orbital_rotation_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/contract/__init__.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/contract/diag_coulomb_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/contract/num_op_sum_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/gates/__init__.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/gates/basic_gates_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/gates/diag_coulomb_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/gates/num_op_sum_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/gates/orbital_rotation_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/gates/quad_ham_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/hamiltonians/__init__.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/hamiltonians/diagonal_coulomb_hamiltonian_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/hamiltonians/double_factorized_hamiltonian_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/hamiltonians/single_factorized_hamiltonian_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/linalg/__init__.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/linalg/linalg_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/molecular_data_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/operators/__init__.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/operators/common_operators_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/operators/fermi_hubbard_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/operators/fermion_action_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/optimize/__init__.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/optimize/linear_method_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/protocols/__init__.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/protocols/trace_protocol_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/qiskit/__init__.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/qiskit/gates/__init__.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/qiskit/gates/diag_coulomb_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/qiskit/gates/diag_coulomb_trotter_split_op_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/qiskit/gates/double_factorized_trotter_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/qiskit/gates/givens_ansatz_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/qiskit/gates/num_num_ansatz_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/qiskit/gates/num_op_sum_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/qiskit/gates/orbital_rotation_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/qiskit/gates/slater_determinant_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/qiskit/gates/ucj_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/qiskit/jordan_wigner_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/qiskit/sampler_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/qiskit/sim_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/qiskit/transpiler_passes/__init__.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/qiskit/transpiler_passes/drop_negligible_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/qiskit/transpiler_passes/merge_orbital_rotations_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/qiskit/util_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/states/__init__.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/states/bitstring_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/states/sample_slater_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/states/slater_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/states/wick_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/test_data/orbital_rotation-0.npy +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/test_no_warnings.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/testing_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/trotter/__init__.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/trotter/diag_coulomb_split_op_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/trotter/double_factorized_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/trotter/qdrift_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/variational/__init__.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/variational/givens_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/variational/hopgate_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/variational/multireference_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/variational/num_num_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/variational/orbital_optimization_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/variational/uccsd_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/variational/ucj_angles_spin_balanced_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/variational/ucj_spin_balanced_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/variational/ucj_spin_unbalanced_test.py +0 -0
- {ffsim-0.0.83 → ffsim-0.0.84}/tests/python/variational/ucj_spinless_test.py +0 -0
|
@@ -31,6 +31,7 @@ from ffsim.hamiltonians import (
|
|
|
31
31
|
DoubleFactorizedHamiltonian,
|
|
32
32
|
MolecularHamiltonian,
|
|
33
33
|
MolecularHamiltonianSpinless,
|
|
34
|
+
MolecularHamiltonianUnrestricted,
|
|
34
35
|
SingleFactorizedHamiltonian,
|
|
35
36
|
)
|
|
36
37
|
from ffsim.init_cache import init_cache
|
|
@@ -133,6 +134,7 @@ __all__ = [
|
|
|
133
134
|
"MolecularData",
|
|
134
135
|
"MolecularHamiltonian",
|
|
135
136
|
"MolecularHamiltonianSpinless",
|
|
137
|
+
"MolecularHamiltonianUnrestricted",
|
|
136
138
|
"NumNumAnsatzOpSpinBalanced",
|
|
137
139
|
"ProductStateSum",
|
|
138
140
|
"ReducedDensityMatrix",
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
from ffsim.contract.diag_coulomb import contract_diag_coulomb, diag_coulomb_linop
|
|
14
14
|
from ffsim.contract.num_op_sum import contract_num_op_sum, num_op_sum_linop
|
|
15
15
|
from ffsim.contract.one_body import contract_one_body, one_body_linop
|
|
16
|
-
from ffsim.contract.two_body import two_body_linop
|
|
16
|
+
from ffsim.contract.two_body import two_body_linop, two_body_linop_unrestricted
|
|
17
17
|
|
|
18
18
|
__all__ = [
|
|
19
19
|
"contract_diag_coulomb",
|
|
@@ -23,4 +23,5 @@ __all__ = [
|
|
|
23
23
|
"num_op_sum_linop",
|
|
24
24
|
"one_body_linop",
|
|
25
25
|
"two_body_linop",
|
|
26
|
+
"two_body_linop_unrestricted",
|
|
26
27
|
]
|
|
@@ -25,6 +25,12 @@ from pyscf.fci.direct_spin1 import (
|
|
|
25
25
|
from pyscf.fci.direct_spin1 import (
|
|
26
26
|
contract_2e as contract_2e_spin1,
|
|
27
27
|
)
|
|
28
|
+
from pyscf.fci.direct_uhf import (
|
|
29
|
+
absorb_h1e as absorb_h1e_uhf,
|
|
30
|
+
)
|
|
31
|
+
from pyscf.fci.direct_uhf import (
|
|
32
|
+
contract_2e as contract_2e_uhf,
|
|
33
|
+
)
|
|
28
34
|
from scipy.sparse.linalg import LinearOperator
|
|
29
35
|
|
|
30
36
|
from ffsim import states
|
|
@@ -139,7 +145,6 @@ def _two_body_linop_complex(
|
|
|
139
145
|
|
|
140
146
|
def rmatvec(vec: np.ndarray):
|
|
141
147
|
result = contract_2e_nosym(
|
|
142
|
-
# TODO come up with a way to test this transpose
|
|
143
148
|
two_body_tensor.transpose(1, 0, 3, 2).conj(),
|
|
144
149
|
vec,
|
|
145
150
|
norb,
|
|
@@ -154,3 +159,108 @@ def _two_body_linop_complex(
|
|
|
154
159
|
return LinearOperator(
|
|
155
160
|
shape=(dim_, dim_), matvec=matvec, rmatvec=rmatvec, dtype=complex
|
|
156
161
|
)
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
def two_body_linop_unrestricted(
|
|
165
|
+
two_body_tensors: np.ndarray,
|
|
166
|
+
norb: int,
|
|
167
|
+
nelec: tuple[int, int],
|
|
168
|
+
one_body_tensors: np.ndarray | None = None,
|
|
169
|
+
constant: float = 0,
|
|
170
|
+
) -> LinearOperator:
|
|
171
|
+
r"""Convert spin-unrestricted two-body tensors to a linear operator.
|
|
172
|
+
|
|
173
|
+
The operator has the form
|
|
174
|
+
|
|
175
|
+
.. math::
|
|
176
|
+
|
|
177
|
+
\frac12 \sum_{pqrs} h^{\alpha\alpha}_{pqrs}
|
|
178
|
+
a^\dagger_{p\alpha} a^\dagger_{r\alpha} a_{s\alpha} a_{q\alpha}
|
|
179
|
+
+ \sum_{pqrs} h^{\alpha\beta}_{pqrs}
|
|
180
|
+
a^\dagger_{p\alpha} a^\dagger_{r\beta} a_{s\beta} a_{q\alpha}
|
|
181
|
+
+ \frac12 \sum_{pqrs} h^{\beta\beta}_{pqrs}
|
|
182
|
+
a^\dagger_{p\beta} a^\dagger_{r\beta} a_{s\beta} a_{q\beta}
|
|
183
|
+
|
|
184
|
+
where :math:`h^{\alpha\alpha}`, :math:`h^{\alpha\beta}`, and
|
|
185
|
+
:math:`h^{\beta\beta}` are tensors of coefficients in chemist ordering, whose spin
|
|
186
|
+
labels refer to the two *pairs* of indices: in :math:`h^{\alpha\beta}_{pqrs}`, the
|
|
187
|
+
indices :math:`pq` belong to spin alpha and the indices :math:`rs` belong to spin
|
|
188
|
+
beta. The alpha-beta term appears with coefficient 1 rather than :math:`\frac12`
|
|
189
|
+
because the beta-alpha term, whose tensor is
|
|
190
|
+
:math:`h^{\beta\alpha}_{pqrs} = h^{\alpha\beta}_{rspq}`, contributes the other half.
|
|
191
|
+
Consequently, the alpha-beta tensor need not be symmetric under exchanging its two
|
|
192
|
+
index pairs. See :class:`~ffsim.MolecularHamiltonianUnrestricted`.
|
|
193
|
+
|
|
194
|
+
Each tensor is assumed to be symmetric within each of its index pairs, that is,
|
|
195
|
+
:math:`h_{pqrs} = h_{qprs} = h_{pqsr}`.
|
|
196
|
+
|
|
197
|
+
Args:
|
|
198
|
+
two_body_tensors: The two-body tensors
|
|
199
|
+
:math:`(h^{\alpha\alpha}, h^{\alpha\beta}, h^{\beta\beta})`, as a single
|
|
200
|
+
Numpy array of shape ``(3, norb, norb, norb, norb)``.
|
|
201
|
+
norb: The number of spatial orbitals.
|
|
202
|
+
nelec: The number of alpha and beta electrons.
|
|
203
|
+
one_body_tensors: Optional one-body tensors
|
|
204
|
+
:math:`(h^{\alpha}, h^{\beta})`, as a single Numpy array of shape
|
|
205
|
+
``(2, norb, norb)``, to absorb into the two-body operator.
|
|
206
|
+
constant: Optional constant to add to the operator.
|
|
207
|
+
|
|
208
|
+
Returns:
|
|
209
|
+
A LinearOperator that implements the action of the two-body tensors.
|
|
210
|
+
|
|
211
|
+
Raises:
|
|
212
|
+
NotImplementedError: The tensors have a complex data type. PySCF does not
|
|
213
|
+
provide a spin-unrestricted FCI contraction for complex integrals.
|
|
214
|
+
"""
|
|
215
|
+
if np.iscomplexobj(two_body_tensors) or (
|
|
216
|
+
one_body_tensors is not None and np.iscomplexobj(one_body_tensors)
|
|
217
|
+
):
|
|
218
|
+
raise NotImplementedError(
|
|
219
|
+
"The unrestricted two-body linear operator is not implemented for complex "
|
|
220
|
+
"tensors."
|
|
221
|
+
)
|
|
222
|
+
if one_body_tensors is None:
|
|
223
|
+
one_body_tensors = np.zeros((2, norb, norb))
|
|
224
|
+
|
|
225
|
+
n_alpha, n_beta = nelec
|
|
226
|
+
linkstr_index_a = gen_linkstr_index_trilidx(range(norb), n_alpha)
|
|
227
|
+
linkstr_index_b = gen_linkstr_index_trilidx(range(norb), n_beta)
|
|
228
|
+
link_index = (linkstr_index_a, linkstr_index_b)
|
|
229
|
+
absorbed_tensors = absorb_h1e_uhf(
|
|
230
|
+
tuple(np.ascontiguousarray(mat) for mat in one_body_tensors),
|
|
231
|
+
tuple(np.ascontiguousarray(tensor) for tensor in two_body_tensors),
|
|
232
|
+
norb,
|
|
233
|
+
nelec,
|
|
234
|
+
0.5,
|
|
235
|
+
)
|
|
236
|
+
|
|
237
|
+
def matvec(vec: np.ndarray):
|
|
238
|
+
# Unlike direct_spin1.contract_2e, direct_uhf.contract_2e does not handle
|
|
239
|
+
# complex vectors, so the real and imaginary parts are contracted separately.
|
|
240
|
+
if np.iscomplexobj(vec):
|
|
241
|
+
result = contract_2e_uhf(
|
|
242
|
+
absorbed_tensors,
|
|
243
|
+
np.ascontiguousarray(vec.real),
|
|
244
|
+
norb,
|
|
245
|
+
nelec,
|
|
246
|
+
link_index=link_index,
|
|
247
|
+
).astype(complex)
|
|
248
|
+
result.imag = contract_2e_uhf(
|
|
249
|
+
absorbed_tensors,
|
|
250
|
+
np.ascontiguousarray(vec.imag),
|
|
251
|
+
norb,
|
|
252
|
+
nelec,
|
|
253
|
+
link_index=link_index,
|
|
254
|
+
)
|
|
255
|
+
else:
|
|
256
|
+
result = contract_2e_uhf(
|
|
257
|
+
absorbed_tensors, vec, norb, nelec, link_index=link_index
|
|
258
|
+
)
|
|
259
|
+
if constant:
|
|
260
|
+
result += constant * vec
|
|
261
|
+
return result
|
|
262
|
+
|
|
263
|
+
dim_ = states.dim(norb, nelec)
|
|
264
|
+
return LinearOperator(
|
|
265
|
+
shape=(dim_, dim_), matvec=matvec, rmatvec=matvec, dtype=complex
|
|
266
|
+
)
|
|
@@ -18,6 +18,7 @@ from ffsim.hamiltonians.double_factorized_hamiltonian import DoubleFactorizedHam
|
|
|
18
18
|
from ffsim.hamiltonians.molecular_hamiltonian import (
|
|
19
19
|
MolecularHamiltonian,
|
|
20
20
|
MolecularHamiltonianSpinless,
|
|
21
|
+
MolecularHamiltonianUnrestricted,
|
|
21
22
|
)
|
|
22
23
|
from ffsim.hamiltonians.single_factorized_hamiltonian import SingleFactorizedHamiltonian
|
|
23
24
|
|
|
@@ -26,5 +27,6 @@ __all__ = [
|
|
|
26
27
|
"DoubleFactorizedHamiltonian",
|
|
27
28
|
"MolecularHamiltonian",
|
|
28
29
|
"MolecularHamiltonianSpinless",
|
|
30
|
+
"MolecularHamiltonianUnrestricted",
|
|
29
31
|
"SingleFactorizedHamiltonian",
|
|
30
32
|
]
|