Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement FermionicOp.from_polynomial_tensor #666

Closed
mrossinek opened this issue May 25, 2022 · 0 comments · Fixed by #841
Closed

Implement FermionicOp.from_polynomial_tensor #666

mrossinek opened this issue May 25, 2022 · 0 comments · Fixed by #841
Labels
type: feature request New feature or request
Milestone

Comments

@mrossinek
Copy link
Member

What should we add?

#665 proposes the addition of a PolynomialTensor class to handle coefficient storage.

This issue tracks the implementation of the method which can construct a FermionicOp from those coefficients.
Below, I summarize the proposed structure of the PolynomialTensor.data field:

Currently, coefficients that will later become a FermionicOp are stored in most cases in the ElectronicIntegrals. Those are tailored to the electronic structure problems allowing some memory reduction in scenarios of identical coefficients for spin-up and -down orbitals, rendering them not generally applicable.
Instead, I propose a structure of data as follows:

{
  "+-": [
    [1, 2],
    [3, 4]
  ],
  "++--": [
    [[
      [1, 2],
      [3, 4]
    ], [
      [5, 6],
      [7, 8]
    ]], [[
      [9, 10],
      [11, 12]
    ], [
      [13, 14],
      [15, 16]
    ]]
  ]
}

Here +- stores a one-body term where the first axis of the stored matrix will be mapped to + operators, and the second axis to -. I.e. this will result in a FermionicOp:

1.0 * "+_0 -_0" + 2.0 * "+_0 -_1" + 3.0 * "+_1 -_0" + 4.0 * "+_1 -_1"

Accordingly, ++-- indicates a two-body term, and, even more importantly, unambiguously stores the two-body terms in the setting of electronic structure problems, in the physicist notation:

$$ g_{pqrs} a^{\dagger}_p a^{\dagger}_q a_r a_s $$

For brevity, I will not expand the 16 coefficients into the operator but will only show a few examples:

  • data["++--"][0, 0, 0, 0] -> 1.0 * "+_0 +_0 -_0 -_0"
  • data["++--"][0, 1, 0, 1] -> 6.0 * "+_0 +_1 -_0 -_1"
  • data["++--"][1, 0, 0, 0] -> 9.0 * "+_1 +_0 -_0 -_0"

For the specific case of electronic structure problems, we can implement a specialized variant of the PolynomialTensor which will allow simplified construction from chemistry-notation two body integrals (using the utilities developed in #520), can implement memory-reduction methods to exploit spin symmetries, and (in the future) could also exploit further symmetry information in chemical systems (like 8-fold symmetry of AO ERIs, for example).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
type: feature request New feature or request
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant