28 #ifndef _chemistry_qc_mbptr12_pairiter_h
29 #define _chemistry_qc_mbptr12_pairiter_h
36 #include <chemistry/qc/mbptr12/moindexspace.h>
58 virtual void start(
const int first_ij =0) =0;
60 virtual void next() =0;
62 virtual operator int()
const =0;
65 int ni()
const {
return ni_; }
67 int nj()
const {
return nj_; }
69 int i()
const {
return i_; }
71 int j()
const {
return j_; }
73 int nij()
const {
return nij_; }
75 int ij()
const {
return ij_; }
90 virtual int nij_aa()
const =0;
92 virtual int nij_ab()
const =0;
95 virtual int ij_aa()
const =0;
97 virtual int ij_ab()
const =0;
99 virtual int ij_ba()
const =0;
113 void init_ij(
const int ij) {
116 throw std::runtime_error(
"SpatialMOPairIter_eq::start() -- argument ij out of range");
119 const int renorm_ij = ij%nij_;
121 i_ = (int)floor((sqrt(1.0+8.0*renorm_ij) - 1.0)/2.0);
122 const int i_off = i_*(i_+1)/2;
123 j_ = renorm_ij - i_off;
125 ij_ab_ = i_*nj_ + j_;
126 ji_ab_ = j_*ni_ + i_;
129 const int i_off = i_*(i_-1)/2;
141 if (ij_ab_ == nij_ab_-1) {
154 ij_aa_ += (i_ == j_) ? 0 : 1;
160 ij_aa_ += (i_ == j_) ? 0 : 1;
182 operator int()
const {
return (nij_ > ij_);};
190 int ij_aa()
const {
return (i_ == j_) ? -1 : ij_aa_; }
192 int ij_ab()
const {
return ij_ab_; }
194 int ij_ba()
const {
return ji_ab_; }
204 void init_ij(
const int ij) {
207 throw std::runtime_error(
"SpatialMOPairIter_neq::start() -- argument ij out of range");
210 const int renorm_ij = ij%nij_;
213 j_ = renorm_ij - i_*nj_;
255 operator int()
const {
return (nij_ > ij_);};