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

FanPT (Perturbation Theory for Parameterized Projected Schrodinger Equation) #62

Open
PaulWAyers opened this issue May 7, 2024 · 4 comments
Assignees

Comments

@PaulWAyers
Copy link
Member

PaulWAyers commented May 7, 2024

We are implementing FanPT. The basic idea is in the recent paper.

Recall that the FanCI equations are

$$ \braket{\mathbf{m}|\hat{H}|\Psi(\mathbf{c})} = E \braket{\mathbf{m}|\Psi(\mathbf{c})} \qquad \qquad \forall \mathbf{m} \in \mathcal{P} $$

where $\mathcal{P}$ is the projection space (user-specified), $\mathbf{c}$ are the wavefunction parameters, and the nonlinear FanCI equations are usually overdetermined and solved in a least-squares sense. The set of determinants $\mathbf{n} \in \mathcal{S}$ is defined as the space of determinants that are linked to determinants in $\mathcal{P}$ by the Hamiltonian, typically just single- and double-replacements of the occupied orbitals.

We write the Hamiltonian as a zeroth-order part (for which the FANCI equations have been solved) and a first-order part,

$$ \hat{H}(\lambda) = \hat{H}(\lambda_0) + (\lambda - \lambda_0) \hat{H}'(\lambda_0) + \tfrac{1}{2} (\lambda - \lambda_0)^2 \hat{H}''(\lambda_0) +\cdots $$

Going through some math, we get the equation

$$ \sum_{\mathbf{n} \in \mathcal{S}} f_\mathbf{n}(\lambda_0,\mathbf{c}) E'(\lambda_0) + \sum_{\mathbf{n} \in \mathcal{S}} \left(\braket{\mathbf{m}|\hat{H}(\lambda_0)|\mathbf{n}} - E(\lambda_0) \delta_{\mathbf{m} \mathbf{n}}\right) \frac{d f_{\mathbf{n}}(\mathbf{c})}{d \mathbf{c}(\lambda_0)} \cdot \mathbf{c}'(\lambda_0) = \sum_{\mathbf{n} \in \mathcal{S}} \braket{\mathbf{m}|\hat{H}'(\lambda_0) |\mathbf{n}} f_\mathbf{n}(\lambda_0,\mathbf{c}) $$

The key ingredients are the Hamiltonian matrix elements. The right hand side is easy to evaluate in terms of transition-2DMs, which appear on the right-hand-side,

$$
\text{RHS} = \text{Tr}[\hat{H}'(\lambda_{0}){pqrs} \Gamma{pqrs}(\lambda_{0})]
$$

My tendency would be to implement this as some functions that build the linear equations to solve, and then solve them. I realize that the (old) implementation is somewhat more general, but we may also want to focus on a specific one or two flavors if it makes the code a lot simpler/faster. Ramon, what do you think the best flavors are? (It will depend on how much computational complexity and code complexity we add by writing a general treatment.)

@carlosevmoura carlosevmoura self-assigned this Jun 11, 2024
@carlosevmoura
Copy link
Collaborator

Initial implementation of FanPT in PyCI #70

This initial implementation is based on the original FanPT code written by Ramon's Group to the pilot code Fanpy. Here is a brief description of the code:

pyci/fanci/fanpt_wrapper.py

Contains the FanPT solver (solve_fanpt) function and additional functions.

pyci/fanpt/base_fanpt_container.py

Defines general FanPT class (FANPTContainer). It is used by derived classes FANPTContainerEParam and FANPTContainerEFree.

pyci/fanpt/fanpt_cont_e_param.py

Define a FANPTContainerEParam class, which contains the data and methods required for a FanPT calculation using energy as a parameter.

pyci/fanpt/fanpt_cont_e_free.py

Define a FANPTContainerEFree class containing the data and methods required for an energy-free FanPT calculation. It is derived from FANPTContainerEParam.

pyci/fanpt/fanpt_constant_terms.py

Define the FANPTConstantTerms class, which contains the constant terms of the FanPY system of equations and methods.

pyci/fanpt/fanpt_updater.py

Contains the FANPTUpdater class, which is used by the FanPT solver to update FanCI parameters and energy.

pyci/test/test_fanpt.py

Includes two tests for FanPT solver, using Energy Free and Energy as Parameter flavors.


There's room for improvement in code design and file organization, especially in matching the PyCI interface for seamless integration.
Let me know if you have suggestions, and I will work on them.

@PaulWAyers
Copy link
Member Author

@msricher and @marco-2023 can you look at this and see what the next step should be? I have a feeling some of the data classes may be better off as named tuples.

@msricher
Copy link
Collaborator

msricher commented Jul 3, 2024

I've looked at it and I think this is fine the way it is. The next step might be making sure that pCCD+S can now be reliably solved, so that I can do a better test of the stochastic optimization?

@PaulWAyers
Copy link
Member Author

Ok, sounds good. Thanks for looking at it @msricher .

I agree with your next step.

@carlosevmoura , we'll do a formal code review on it (I haven't seen the pull request but I'm way behind). That will usually lead to some changes. But then we will have a functional version. I anticipate a refactor at some point of a lot of FanCI stuff, but I am too overwhelmed to think about that for now.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

When branches are created from issues, their pull requests are automatically linked.

3 participants