This document lists all diagrams entering the $t_3$ equation, as well as the index realignment to perform matrix multiplications.
Notationwise, the operation
$$ t^{ab}_{ij} \rightarrow t^{ai}_{bj} $$indicates a index transformation where we simply align the matrix representation of this tensor in a fashion corresponding to the element order above. The purpose of this operation is to align tensors so that contractions may be performed as matrix multiplications. Upper indices is mapped to a row index, while lower indices are mapped to columns.
Technically, this means to recalculate the row and column indices of the matrix elements in the COO format (flexmat class). The corresponding code to generate the two different representations of the flexmat object $t_2$ above is
$t^{ab}_{ij} $ = t2.pq_rs()
$t^{ai}_{bj} $ = t2.pr_qs()
From a theoretical point of view, this operation may be interpreted as a generalized transpose for tensors of $rank > 2$.
Diagram Label | Factor | Permutation | Index Transform | Code translation |
---|---|---|---|---|
$(t_2 t_3)_a $ | $+1$ | $\hat{P}(i/jk \vert a/bc)$ | $$ \sum_{ldme} \langle l m \vert \vert d e \rangle t^{a d}_{i l}t^{e b c}_{m j k} \rightarrow \sum_{me} \sum_{ld} t^{bjck}_{me} \langle me\vert \vert ld\rangle t^{ld}_{ai} $$ | update_as_qtru_ps(t3.qtru_sp() $*$ vhhpp.qs_pr() $*$ t2.sq_pr()) |
$(t_2 t_3)_b $ | $-\frac{1}{2}$ | $\hat{P}(i/jk)$ | $$ \sum_{ldme} \langle l m \vert \vert d e \rangle t^{d e}_{l i}t^{a b c}_{m j k} \rightarrow \sum_{m} \sum_{lde} t^{abjck}_{m} \langle m\vert \vert lde\rangle t^{lde}_{i} $$ | update_as_pqtru_s(t3.pqtru_s()$*$vhhpp.q_prs()$*$t2.rpq_s()) |
$(t_2 t_3)_c $ | $-\frac{1}{2}$ | $\hat{P}(a/bc)$ | $$ \sum_{ldme} \langle l m \vert \vert d e \rangle t^{d a}_{l m}t^{e b c}_{i j k} \rightarrow \sum_{e} \sum_{lmd} t^{ibjck}_{e} \langle e\vert \vert lmd\rangle t^{lmd}_{a} $$ | update_as_sqtru_p(t3.sqtru_p()$*$vhhpp.s_pqr()$*$t2.rsp_q()) |
$(t_2 t_3)_d $ | $-\frac{1}{2}$ | $\hat{P}(k/ij \vert a/bc)$ | $$ \sum_{ldme} \langle l m \vert \vert d e \rangle t^{a d}_{i j}t^{b e c}_{l m k} \rightarrow \sum_{lme} \sum_{d} t^{bck}_{lme} \langle lme\vert \vert d\rangle t^{d}_{aij} $$ | update_as_qru_pst(t3.pru_stq()$*$vhhpp.pqs_r()$*$t2.q_prs()) |
$(t_2 t_3)_e $ | $-\frac{1}{2}$ | $\hat{P}(i/jk \vert c/ab)$ | $$ \sum_{ldme} \langle l m \vert \vert d e \rangle t^{a b}_{i l}t^{d e c}_{j m k} \rightarrow \sum_{mde} \sum_{l} t^{jck}_{mde} \langle mde\vert \vert l\rangle t^{l}_{abi} $$ | update_as_tru_pqs(t3.sru_tpq()$*$vhhpp.qrs_p()$*$t2.s_pqr()) |
$(t_2 t_3)_f $ | $+\frac{1}{4}$ | $\hat{P}(k/ij)$ | $$ \sum_{ldme} \langle l m \vert \vert d e \rangle t^{d e}_{i j}t^{a b c}_{l m k} \rightarrow \sum_{lm} \sum_{de} t^{abck}_{lm} \langle lm\vert \vert de\rangle t^{de}_{ij} $$ | update_as_pqru_st(t3.pqru_st()$*$vhhpp.pq_rs()$*$t2.pq_rs()) |
$(t_2 t_3)_q $ | $+\frac{1}{4}$ | $\hat{P}(c/ab)$ | $$ \sum_{ldme} \langle l m \vert \vert d e \rangle t^{a b}_{l m}t^{d e c}_{i j k} \rightarrow \sum_{de} \sum_{lm} t^{ijck}_{de} \langle de\vert \vert lm\rangle t^{lm}_{ab} $$ | update_as_stru_pq(t3.stru_pq()$*$vhhpp.rs_pq()$*$t2.rs_pq()) |
These are incorrectly generated due to unconnected lines in the interaction, so they are not yet ready for implementation.
Special attention will need to be given to the antisymmetric elements in the multiplication.
Diagram Label | Factor | Permutation | Index Transform | Code translation |
---|---|---|---|---|
$(t_2 t_2)_a$ | $-1$ | $\hat{P}(k/ij \vert a/bc)$ | $$ \sum_{ld} \langle l \vert f \vert d \rangle t^{a d}_{i j}t^{b c}_{l k} \rightarrow \sum_{l} \sum_{d} t^{bck}_{l} \langle l\vert f \vert d\rangle t^{d}_{aij} = 0$$ | (canonical HF basis) $\rightarrow$ no contribution |
$(t_2 t_2)_b$ | $+1$ | $\hat{P}(i/jk \vert abc)$ | $$ \sum_{lde} \langle l b \vert \vert d e \rangle t^{a d}_{i l}t^{e c}_{j k} \rightarrow \sum_{ld} \sum_{e} (t^{ai}_{ld} \langle ld\vert \vert be\rangle)^{aib}_e t^{e}_{cjk} $$ | update_as_psq_rtu(t2.pr_sq()$*$vhppp.pr_qs()$*$t2.p_qrs()) |
$(t_2 t_2)_c$ | $-\frac{1}{2}$ | $\hat{P}(i/jk \vert c/ab)$ | $$ \sum_{ldce} \langle l c \vert \vert d e \rangle t^{a b}_{i l}t^{d e}_{j k} \rightarrow \sum_{de} \sum_{l} (t^{jk}_{de} \langle de\vert \vert lc\rangle)^{jkc}_l t^{l}_{abi} $$ | update_as_tur_pqs(t2.rs_pq()$*$vhppp.rs_pq()$*$t2.s_pqr()) |
$(t_2 t_2)_d$ | $+\frac{1}{2}$ | $\hat{P}(k/ij \vert a/bc)$ | $$ \sum_{ldmk} \langle l m \vert \vert d k \rangle t^{a d}_{i j}t^{b c}_{l m} \rightarrow \sum_{lm} \sum_{d} (t^{bc}_{lm} \langle lm\vert \vert dk\rangle)^{bck}_d t^{d}_{aij} $$ | update_as_qru_pst(t2.pq_rs()$*$vhhph.pq_rs()$*$t2.q_prs()) |
The problem of unconnected lines leaving the interaction may be solved by performing the multiplication and alignment in three steps:
The following terms are linear in the $t_3$ amplitude.
Diagram Label | Factor | Permutation | Index Transform | Code translation |
---|---|---|---|---|
$(t_3)_a$ | $+\frac{1}{2}$ | $\hat{P}(c/ab)$ | $$\sum_{de} \langle ab \vert \vert de \rangle t^{dec}_{ijk} \rightarrow \sum_{de} \langle ab \vert \vert de \rangle t^{de}_{cijk}$$ | update_as_pq_rstu(vpppp.pq_rs() $*$ t3.pq_rstu()) |
$(t_3)_b$ | $+\frac{1}{2}$ | $\hat{P}(k/ij)$ | $$\sum_{lm} \langle lm \vert \vert ij \rangle t^{abc}_{lmk} \rightarrow \sum_{lm} t^{abck}_{lm} \langle lm \vert \vert ij \rangle $$ | update_as_pqru_st(t3.pqrs_tu()$*$ vphhp.pq_rs()) |
$(t_3)_c$ | $+1$ | $\hat{P}(i/jk \vert a/bc)$ | $$\sum_{ld} \langle al \vert \vert id \rangle t^{dbc}_{ljk} \rightarrow \sum_{ld} \langle ai \vert \vert ld \rangle t^{ld}_{bcjk}$$ | update_as_ps_qrtu(vphhp.pr_qs() $*$ t3.sp_qrtu()) |
The diagram $(t_3)_a$ includes the ladder operator from $\hat{V}$, so it will have to be calulcated using some block scheme.
Diagram Label | Factor | Permutation | Index Transform | Code translation |
---|---|---|---|---|
$(t_2)_a$ | $+1$ | $\hat{P}(k/ij \vert a/bc)$ | $$\sum_{d} \langle bc \vert \vert dk \rangle t^{ad}_{ij} \rightarrow \sum_d \langle bck \vert \vert d \rangle t^d_{aij} $$ | update_as_qru_pst(vppph.pqs_r() $*$ t2.q_prs()) |
$(t_2)_b$ | $-1$ | $\hat{P}(i/jk \vert c/ab)$ | $$\sum_{l} \langle lc \vert \vert jk \rangle t^{ab}_{il} \rightarrow \sum_l t^{abi}_{l} \langle l \vert \vert cjk \rangle $$ | update_as_pqs_rtu(t2.pqr_s() $*$ vhphh.p_qrs() ) |
Finally we state the basic implementation of the t3 amplitude equation. Tables is separated by horizontal lines.
Note that permutations are not yet included.
t2t3a.update_as_qtru_ps(t3.qtru_sp()$*$vhhpp.qs_pr()$*$t2.sq_pr())
t2t3b.update_as_pqtru_s(t3.pqtru_s()$*$vhhpp.q_prs()$*$t2.rpq_s())
t2t3c.update_as_sqtru_p(t3.sqtru_p()$*$vhhpp.s_pqr()$*$t2.rsp_q())
t2t3d.update_as_qru_pst(t3.pru_stq()$*$vhhpp.pqs_r()$*$t2.q_prs())
t2t3e.update_as_tru_pqs(t3.sru_tpq()$*$vhhpp.qrs_p()$*$t2.s_pqr())
t2t3f.update_as_pqru_st(t3.pqru_st()$*$vhhpp.pq_rs()$*$t2.pq_rs())
t2t3g.update_as_stru_pq(t3.stru_pq()$*$vhhpp.rs_pq()$*$t2.rs_pq())
t2t2b.update_as_psq_rtu(t2.pr_sq()$*$vhppp.pr_qs()$*$t2.p_qrs())
t2t2c.update_as_tur_pqs(t2.rs_pq()$*$vhppp.rs_pq()$*$t2.s_pqr())
t2t2d.update_as_qru_pst(t2.pq_rs()$*$vhhph.pq_rs()$*$t2.q_prs())
t3a.update_as_pq_rstu(vpppp.pq_rs() $*$ t3.pq_rstu()) //Note that this will probably be replaced by a block implementation.
t3b.update_as_pqru_st(t3.pqrs_tu()$*$ vphhp.pq_rs())
t3c.update_as_ps_qrtu(vphhp.pr_qs() $*$ t3.sp_qrtu())
t2a.update_as_qru_pst(vppph.pqs_r() $*$ t2.q_prs())
t2b.update_as_pqs_rtu(t2.pqr_s() $*$ vhphh.p_qrs() )
Actually, the inclusion of tripes will only result in three extra terms in the doubles equation, and we may even remove the first due to the fact that we use a canonical HF basis where $f$ is diagonal.
The terms we need to include in the $t_2$ equation is then (labelling as in Shavitt and Bartlett):
Diagram Label | Factor | Permutation | Index Transform | Code translation |
---|---|---|---|---|
$D_{10b}$ | $+\frac{1}{2}$ | $\hat{P}(ab)$ | $$\sum_{mef} \langle bm \vert \vert ef \rangle t^{aef}_{ijm} \rightarrow (\sum_{mef} \langle b \vert \vert mef \rangle t^{mef}_{ija})^{ab}_{ij} $$ | update_as_q_rsp(vphpp.p_qrs() $*$ t3.uqr_stp() ) |
$D_{10c}$ | $-\frac{1}{2}$ | $\hat{P}(ij)$ | $$\sum_{mne} \langle mn \vert \vert je \rangle t^{abe}_{imn} \rightarrow (\sum_{mne} t^{abi}_{mne} \langle mne \vert \vert j \rangle)^{ab}_{ij} $$ | update_as_pqr_s(t3.pqs_tur() $*$ vhhhp.pqs_r()) |
This means we have to add in the following when computing the doubles contribution
D10b.update_as_q_rsp(vphpp.p_qrs() ∗ t3.uqr_stp())
D10c.update_as_pqr_s(t3.pqs_tur() ∗ vhhhp.pqs_r())
In [ ]: