diff --git a/Makefile b/Makefile index 15b3afaf..47ba8736 100644 --- a/Makefile +++ b/Makefile @@ -76,6 +76,10 @@ all: pyci/_pyci.so.$(PYCI_VERSION) pyci/_pyci.so.$(VERSION_MAJOR) pyci/_pyci.so test: @set -e; $(PYTHON) -m pytest -sv ./pyci +.PHONY: test-bigmem +test-bigmem: + @set -e; $(PYTHON) -m pytest -sv ./pyci --bigmem + .PHONY: clean clean: rm -rf pyci/src/*.o pyci/_pyci.so* diff --git a/pyci/__init__.py b/pyci/__init__.py index 015691b0..0edfe19f 100644 --- a/pyci/__init__.py +++ b/pyci/__init__.py @@ -57,6 +57,8 @@ "make_senzero_integrals", "reduce_senzero_integrals", "spinize_rdms", + "spinize_rdms_1234", + "spin_free_rdms", "odometer_one_spin", "odometer_two_spin", "add_excitations", diff --git a/pyci/include/pyci.h b/pyci/include/pyci.h index 49159d03..abfdcef1 100644 --- a/pyci/include/pyci.h +++ b/pyci/include/pyci.h @@ -221,7 +221,7 @@ void clearbit_det(const long, ulong *); void compute_rdms(const DOCIWfn &, const double *, double *, double *); -void compute_rdms_1234(const DOCIWfn &, const double *, double *, double *, double *, double *); +void compute_rdms_1234(const DOCIWfn &, const double *, double *, double *, double *, double *, double *, double *, double *); void compute_rdms(const FullCIWfn &, const double *, double *, double *); diff --git a/pyci/src/rdm.cpp b/pyci/src/rdm.cpp index 357a9881..8d22d725 100644 --- a/pyci/src/rdm.cpp +++ b/pyci/src/rdm.cpp @@ -65,7 +65,7 @@ void compute_rdms(const DOCIWfn &wfn, const double *coeffs, double *d0, double * } -void compute_rdms_1234(const DOCIWfn &wfn, const double *coeffs, double *d0, double *d2, double *d3, double *d4) { +void compute_rdms_1234(const DOCIWfn &wfn, const double *coeffs, double *d0, double *d2, double *d3, double *d4, double *d5, double *d6, double *d7) { // prepare working vectors AlignedVector v_det(wfn.nword); AlignedVector v_occs(wfn.nocc_up); @@ -84,8 +84,15 @@ void compute_rdms_1234(const DOCIWfn &wfn, const double *coeffs, double *d0, dou d3[j]=0; d4[j++]=0; } + i = wfn.nbasis * wfn.nbasis * wfn.nbasis * wfn.nbasis; + j = 0; + while (j < i) { + d5[j]=0; + d6[j]=0; + d7[j++]=0; + } // iterate over determinants - for (long idet = 0, jdet, mdet, k, l, m, n; idet < wfn.ndet; ++idet) { + for (long idet = 0, jdet, mdet, pdet, k, l, m, n, p, q; idet < wfn.ndet; ++idet) { double val1, val2; // fill working vectors wfn.copy_det(idet, det); @@ -107,9 +114,86 @@ void compute_rdms_1234(const DOCIWfn &wfn, const double *coeffs, double *d0, dou d3[(wfn.nbasis * wfn.nbasis) * l + wfn.nbasis * k + n] += val1; d3[(wfn.nbasis * wfn.nbasis) * l + wfn.nbasis * n + k] += val1; d3[(wfn.nbasis * wfn.nbasis) * n + wfn.nbasis * k + l] += val1; - d3[(wfn.nbasis * wfn.nbasis) * n + wfn.nbasis * l + k] += val1; + d3[(wfn.nbasis * wfn.nbasis) * n + wfn.nbasis * l + k] += val1; + for (p= m + 1; p < wfn.nocc_up; ++p){ + q= occs[p]; + d5[(wfn.nbasis * wfn.nbasis * wfn.nbasis ) * k + (wfn.nbasis * wfn.nbasis) * l + (wfn.nbasis) * n + q] += val1; + d5[(wfn.nbasis * wfn.nbasis * wfn.nbasis ) * k + (wfn.nbasis * wfn.nbasis) * l + (wfn.nbasis) * q + n] += val1; + d5[(wfn.nbasis * wfn.nbasis * wfn.nbasis ) * k + (wfn.nbasis * wfn.nbasis) * n + (wfn.nbasis) * l + q] += val1; + d5[(wfn.nbasis * wfn.nbasis * wfn.nbasis ) * k + (wfn.nbasis * wfn.nbasis) * n + (wfn.nbasis) * q + l] += val1; + d5[(wfn.nbasis * wfn.nbasis * wfn.nbasis ) * k + (wfn.nbasis * wfn.nbasis) * q + (wfn.nbasis) * l + n] += val1; + d5[(wfn.nbasis * wfn.nbasis * wfn.nbasis ) * k + (wfn.nbasis * wfn.nbasis) * q + (wfn.nbasis) * n + l] += val1; + + d5[(wfn.nbasis * wfn.nbasis * wfn.nbasis ) * l + (wfn.nbasis * wfn.nbasis) * k + (wfn.nbasis) * n + q] += val1; + d5[(wfn.nbasis * wfn.nbasis * wfn.nbasis ) * l + (wfn.nbasis * wfn.nbasis) * k + (wfn.nbasis) * q + n] += val1; + d5[(wfn.nbasis * wfn.nbasis * wfn.nbasis ) * l + (wfn.nbasis * wfn.nbasis) * n + (wfn.nbasis) * k + q] += val1; + d5[(wfn.nbasis * wfn.nbasis * wfn.nbasis ) * l + (wfn.nbasis * wfn.nbasis) * n + (wfn.nbasis) * q + k] += val1; + d5[(wfn.nbasis * wfn.nbasis * wfn.nbasis ) * l + (wfn.nbasis * wfn.nbasis) * q + (wfn.nbasis) * k + n] += val1; + d5[(wfn.nbasis * wfn.nbasis * wfn.nbasis ) * l + (wfn.nbasis * wfn.nbasis) * q + (wfn.nbasis) * n + k] += val1; + + d5[(wfn.nbasis * wfn.nbasis * wfn.nbasis ) * n + (wfn.nbasis * wfn.nbasis) * l + (wfn.nbasis) * k + q] += val1; + d5[(wfn.nbasis * wfn.nbasis * wfn.nbasis ) * n + (wfn.nbasis * wfn.nbasis) * l + (wfn.nbasis) * q + k] += val1; + d5[(wfn.nbasis * wfn.nbasis * wfn.nbasis ) * n + (wfn.nbasis * wfn.nbasis) * k + (wfn.nbasis) * l + q] += val1; + d5[(wfn.nbasis * wfn.nbasis * wfn.nbasis ) * n + (wfn.nbasis * wfn.nbasis) * k + (wfn.nbasis) * q + l] += val1; + d5[(wfn.nbasis * wfn.nbasis * wfn.nbasis ) * n + (wfn.nbasis * wfn.nbasis) * q + (wfn.nbasis) * l + k] += val1; + d5[(wfn.nbasis * wfn.nbasis * wfn.nbasis ) * n + (wfn.nbasis * wfn.nbasis) * q + (wfn.nbasis) * k + l] += val1; + + d5[(wfn.nbasis * wfn.nbasis * wfn.nbasis ) * q + (wfn.nbasis * wfn.nbasis) * l + (wfn.nbasis) * n + k] += val1; + d5[(wfn.nbasis * wfn.nbasis * wfn.nbasis ) * q + (wfn.nbasis * wfn.nbasis) * l + (wfn.nbasis) * k + n] += val1; + d5[(wfn.nbasis * wfn.nbasis * wfn.nbasis ) * q + (wfn.nbasis * wfn.nbasis) * n + (wfn.nbasis) * l + k] += val1; + d5[(wfn.nbasis * wfn.nbasis * wfn.nbasis ) * q + (wfn.nbasis * wfn.nbasis) * n + (wfn.nbasis) * k + l] += val1; + d5[(wfn.nbasis * wfn.nbasis * wfn.nbasis ) * q + (wfn.nbasis * wfn.nbasis) * k + (wfn.nbasis) * l + n] += val1; + d5[(wfn.nbasis * wfn.nbasis * wfn.nbasis ) * q + (wfn.nbasis * wfn.nbasis) * k + (wfn.nbasis) * n + l] += val1; + + } + //pair excitation elements 4rdm n >k,l + for (p= 0; p < wfn.nvir_up; ++p){ + q = virs[p]; + excite_det(n, q, det); + pdet = wfn.index_det(det); + excite_det(q, n, det); + // check if excited determinant is in wfn + if (pdet > idet) { + val2 = coeffs[pdet] * coeffs[idet]; + d6[(wfn.nbasis * wfn.nbasis * wfn.nbasis ) * k + (wfn.nbasis * wfn.nbasis) * l + (wfn.nbasis) * n + q] += val2; + d6[(wfn.nbasis * wfn.nbasis * wfn.nbasis ) * k + (wfn.nbasis * wfn.nbasis) * l + (wfn.nbasis) * q + n] += val2; + d6[(wfn.nbasis * wfn.nbasis * wfn.nbasis ) * l + (wfn.nbasis * wfn.nbasis) * k + (wfn.nbasis) * n + q] += val2; + d6[(wfn.nbasis * wfn.nbasis * wfn.nbasis ) * l + (wfn.nbasis * wfn.nbasis) * k + (wfn.nbasis) * q + n] += val2; + } + } + //pair excitation elements 4rdm l >k,n + for (p= 0; p < wfn.nvir_up; ++p){ + q = virs[p]; + excite_det(l, q, det); + pdet = wfn.index_det(det); + excite_det(q, l, det); + // check if excited determinant is in wfn + if (pdet > idet) { + val2 = coeffs[pdet] * coeffs[idet]; + d6[(wfn.nbasis * wfn.nbasis * wfn.nbasis ) * k + (wfn.nbasis * wfn.nbasis) * n + (wfn.nbasis) * l + q] += val2; + d6[(wfn.nbasis * wfn.nbasis * wfn.nbasis ) * k + (wfn.nbasis * wfn.nbasis) * n + (wfn.nbasis) * q + l] += val2; + d6[(wfn.nbasis * wfn.nbasis * wfn.nbasis ) * n + (wfn.nbasis * wfn.nbasis) * k + (wfn.nbasis) * l + q] += val2; + d6[(wfn.nbasis * wfn.nbasis * wfn.nbasis ) * n + (wfn.nbasis * wfn.nbasis) * k + (wfn.nbasis) * q + l] += val2; + } + } + //pair excitation elements 4rdm k >n,l + for (p= 0; p < wfn.nvir_up; ++p){ + q = virs[p]; + excite_det(k, q, det); + pdet = wfn.index_det(det); + excite_det(q, k, det); + // check if excited determinant is in wfn + if (pdet > idet) { + val2 = coeffs[pdet] * coeffs[idet]; + d6[(wfn.nbasis * wfn.nbasis * wfn.nbasis ) * n + (wfn.nbasis * wfn.nbasis) * l + (wfn.nbasis) * k + q] += val2; + d6[(wfn.nbasis * wfn.nbasis * wfn.nbasis ) * n + (wfn.nbasis * wfn.nbasis) * l + (wfn.nbasis) * q + k] += val2; + d6[(wfn.nbasis * wfn.nbasis * wfn.nbasis ) * l + (wfn.nbasis * wfn.nbasis) * n + (wfn.nbasis) * k + q] += val2; + d6[(wfn.nbasis * wfn.nbasis * wfn.nbasis ) * l + (wfn.nbasis * wfn.nbasis) * n + (wfn.nbasis) * q + k] += val2; + } + } + } - // pair excitation elements 3rdm j>i + // pair excitation elements 3rdm l>k for (m = 0; m < wfn.nvir_up; ++m) { n = virs[m]; excite_det(l, n, det); @@ -121,7 +205,7 @@ void compute_rdms_1234(const DOCIWfn &wfn, const double *coeffs, double *d0, dou d4[(wfn.nbasis * wfn.nbasis) * k + wfn.nbasis * l + n] += val2; d4[(wfn.nbasis * wfn.nbasis) * k + wfn.nbasis * n + l] += val2; } - } //pair excitation elements 3rdm i > j + } //pair excitation elements 3rdm k > l for (m = 0; m < wfn.nvir_up; ++m) { n = virs[m]; excite_det(k, n, det); @@ -134,6 +218,35 @@ void compute_rdms_1234(const DOCIWfn &wfn, const double *coeffs, double *d0, dou d4[(wfn.nbasis * wfn.nbasis) * l + wfn.nbasis * n + k] += val2; } } + //double-pair excitation elements 4rdm + for (m = 0; m < wfn.nvir_up; ++m) { + n = virs[m]; + for (p= m + 1; p < wfn.nvir_up; ++p){ + q = virs[p]; + + excite_det(l, q, det); + pdet = wfn.index_det(det); + excite_det(q, l, det); + + excite_det(k, n, det); + mdet = wfn.index_det(det); + excite_det(n, k, det); + // check if excited determinants are the same and if it is in wfn + if ((mdet==pdet) && (mdet> idet)) { + val2 = coeffs[mdet] * coeffs[idet]; + d7[(wfn.nbasis * wfn.nbasis * wfn.nbasis ) * k + (wfn.nbasis * wfn.nbasis) * l + (wfn.nbasis) * n + q] += val2; + d7[(wfn.nbasis * wfn.nbasis * wfn.nbasis ) * k + (wfn.nbasis * wfn.nbasis) * l + (wfn.nbasis) * q + n] += val2; + d7[(wfn.nbasis * wfn.nbasis * wfn.nbasis ) * l + (wfn.nbasis * wfn.nbasis) * k + (wfn.nbasis) * q + n] += val2; + d7[(wfn.nbasis * wfn.nbasis * wfn.nbasis ) * l + (wfn.nbasis * wfn.nbasis) * k + (wfn.nbasis) * n + q] += val2; + d7[(wfn.nbasis * wfn.nbasis * wfn.nbasis ) * n + (wfn.nbasis * wfn.nbasis) * q + (wfn.nbasis) * k + l] += val2; + d7[(wfn.nbasis * wfn.nbasis * wfn.nbasis ) * n + (wfn.nbasis * wfn.nbasis) * q + (wfn.nbasis) * l + k] += val2; + d7[(wfn.nbasis * wfn.nbasis * wfn.nbasis ) * q + (wfn.nbasis * wfn.nbasis) * n + (wfn.nbasis) * l + k] += val2; + d7[(wfn.nbasis * wfn.nbasis * wfn.nbasis ) * q + (wfn.nbasis * wfn.nbasis) * n + (wfn.nbasis) * k + l] += val2; + + + } + } + } } // pair excitation elements @@ -909,12 +1022,18 @@ pybind11::tuple py_compute_rdms_1234_doci(const DOCIWfn &wfn, const Array d2({wfn.nbasis, wfn.nbasis}); Array d3({wfn.nbasis, wfn.nbasis, wfn.nbasis}); Array d4({wfn.nbasis, wfn.nbasis, wfn.nbasis}); + Array d5({wfn.nbasis, wfn.nbasis, wfn.nbasis, wfn.nbasis}); + Array d6({wfn.nbasis, wfn.nbasis, wfn.nbasis, wfn.nbasis}); + Array d7({wfn.nbasis, wfn.nbasis, wfn.nbasis, wfn.nbasis}); compute_rdms_1234(wfn, reinterpret_cast(coeffs.request().ptr), reinterpret_cast(d0.request().ptr), reinterpret_cast(d2.request().ptr), reinterpret_cast(d3.request().ptr), - reinterpret_cast(d4.request().ptr)); - return pybind11::make_tuple(d0, d2, d3, d4); + reinterpret_cast(d4.request().ptr), + reinterpret_cast(d5.request().ptr), + reinterpret_cast(d6.request().ptr), + reinterpret_cast(d7.request().ptr)); + return pybind11::make_tuple(d0, d2, d3, d4, d5, d6, d7); } pybind11::tuple py_compute_rdms_fullci(const FullCIWfn &wfn, const Array coeffs) { diff --git a/pyci/test/conftest.py b/pyci/test/conftest.py new file mode 100644 index 00000000..94f0ea77 --- /dev/null +++ b/pyci/test/conftest.py @@ -0,0 +1,22 @@ +import pytest + +def pytest_addoption(parser): + parser.addoption( + "--bigmem", + action="store_true", + default=False, + help="run tests that require a large amount of memory" + ) + +def pytest_configure(config): + config.addinivalue_line( + "markers", + "bigmem: mark test as requiring a large amount of memory" + ) + +def pytest_collection_modifyitems(config, items): + if not config.getoption("--bigmem"): + skip_bigmem = pytest.mark.skip(reason="need --bigmem option to run") + for item in items: + if "bigmem" in item.keywords: + item.add_marker(skip_bigmem) diff --git a/pyci/test/data/BH3.fcidump b/pyci/test/data/BH3.fcidump new file mode 100644 index 00000000..1e7f8497 --- /dev/null +++ b/pyci/test/data/BH3.fcidump @@ -0,0 +1,792 @@ + &FCI NORB= 8,NELEC= 8,MS2=0, + ORBSYM=1,1,1,1,1,1,1,1, + ISYM=1, + &END + 2.885872439643773 1 1 1 1 + -0.2505946034815988 1 1 2 1 + 0.6008649932608625 1 1 2 2 + 1.309499383927992e-15 1 1 3 1 + 0.5431012966104436 1 1 3 3 + -8.568915825469745e-08 1 1 4 1 + -1.222658309318891e-08 1 1 4 2 + 0.5431012364660358 1 1 4 4 + 0.7419370001826255 1 1 5 5 + -0.2768877053433903 1 1 6 1 + 0.215588408158452 1 1 6 2 + -1.302083441068191e-14 1 1 6 3 + 9.617531265895818e-07 1 1 6 4 + 0.617524002672765 1 1 6 6 + 1.19296259140086e-06 1 1 7 1 + -1.000159650862975e-06 1 1 7 2 + -2.667762904681736e-09 1 1 7 3 + 0.2035931511500463 1 1 7 4 + 2.236463252612564e-07 1 1 7 6 + 0.6817863344015808 1 1 7 7 + 0.2035931153060802 1 1 8 3 + 2.667762535185636e-09 1 1 8 4 + 0.6817863310616114 1 1 8 8 + -0.250594603481599 2 1 1 1 + 0.03398782149673659 2 1 2 1 + -0.00855399593326114 2 1 2 2 + -0.003656740753385496 2 1 3 3 + 8.364174153545954e-09 2 1 4 1 + -7.243120201815174e-09 2 1 4 2 + -0.003656743745705427 2 1 4 4 + -0.009802997405129389 2 1 5 5 + 0.038516802249326 2 1 6 1 + -0.009473380575598978 2 1 6 2 + -2.757017801806593e-08 2 1 6 4 + -0.01147166657986735 2 1 6 6 + -1.720166129072196e-07 2 1 7 1 + 3.978265411585039e-08 2 1 7 2 + 7.158059052176508e-11 2 1 7 3 + -0.005462748413268905 2 1 7 4 + 2.752050902053368e-09 2 1 7 6 + -0.009830874230348587 2 1 7 7 + -0.005462751575636361 2 1 8 3 + -7.158063662746246e-11 2 1 8 4 + -0.009830874235882046 2 1 8 8 + 0.6008649932608625 2 2 1 1 + -0.008553995933261128 2 2 2 1 + 0.4427455761842879 2 2 2 2 + 1.804112415015879e-15 2 2 3 2 + 0.437845512029406 2 2 3 3 + -1.486499987099661e-08 2 2 4 1 + -1.158696648212443e-07 2 2 4 2 + 1.706967900361178e-15 2 2 4 3 + 0.4378453869829156 2 2 4 4 + 0.462869579503667 2 2 5 5 + -0.008738497054256215 2 2 6 1 + 0.04243264270473726 2 2 6 2 + -3.615163723935666e-15 2 2 6 3 + 2.596254400147324e-07 2 2 6 4 + 0.4383641013013591 2 2 6 6 + 1.910571664293309e-08 2 2 7 1 + -1.977798448522805e-07 2 2 7 2 + -6.157832403708152e-10 2 2 7 3 + 0.04699415003091144 2 2 7 4 + -2.788649450247149e-08 2 2 7 6 + 0.4572792141443756 2 2 7 7 + 0.04699404069097696 2 2 8 3 + 6.157817727947545e-10 2 2 8 4 + 0.4572792609884542 2 2 8 8 + 1.316982920016984e-15 3 1 1 1 + 0.007474594718429727 3 1 3 1 + 0.01284990780508374 3 1 3 2 + 1.767792344800623e-10 3 1 3 3 + -0.004084305245176309 3 1 4 3 + -1.767792935690807e-10 3 1 4 4 + 0.003312072277051121 3 1 6 3 + -1.405993377279202e-15 3 1 6 6 + -1.717309493699424e-10 3 1 7 1 + -1.016305506548396e-10 3 1 7 2 + 0.003229158387026622 3 1 7 3 + 9.745363039768626e-11 3 1 7 4 + -1.705423846847659e-10 3 1 7 6 + 1.479452422115807e-11 3 1 7 7 + 0.01310582949056686 3 1 8 1 + 0.007756039235437579 3 1 8 2 + -9.745373215006015e-11 3 1 8 3 + 0.003229176787461637 3 1 8 4 + 0.01301513143892001 3 1 8 6 + 0.0008662621072355487 3 1 8 7 + -1.479295245326862e-11 3 1 8 8 + 1.772887392448297e-15 3 2 2 2 + 0.01284990780508375 3 2 3 1 + 0.1207362065036845 3 2 3 2 + 2.748137405139683e-09 3 2 3 3 + 1.240327285323417e-15 3 2 4 2 + -0.06349295720993479 3 2 4 3 + -2.748138201377759e-09 3 2 4 4 + -1.079811153686938e-15 3 2 6 1 + -0.04324768872890671 3 2 6 3 + 6.234596172660645e-15 3 2 6 4 + -1.211530875622202e-14 3 2 6 6 + -2.558507095963038e-10 3 2 7 1 + 3.592113065331581e-11 3 2 7 2 + 0.05101028878336435 3 2 7 3 + 1.539441038186928e-09 3 2 7 4 + -1.423037243597491e-09 3 2 7 6 + -4.819256001209471e-10 3 2 7 7 + 0.01952552068678413 3 2 8 1 + -0.002741426122683355 3 2 8 2 + -1.539441553399801e-09 3 2 8 3 + 0.05101010986804831 3 2 8 4 + 0.1086003493569573 3 2 8 6 + -0.02822402839137306 3 2 8 7 + 4.819386209553578e-10 3 2 8 8 + 0.5431012966104434 3 3 1 1 + -0.003656740753385428 3 3 2 1 + 0.4378455120294059 3 3 2 2 + 1.767792368653071e-10 3 3 3 1 + 2.748137412078577e-09 3 3 3 2 + 0.4905124605158808 3 3 3 3 + -0.004084312178270882 3 3 4 1 + -0.06349299035576955 3 3 4 2 + 2.581268532253489e-15 3 3 4 3 + 0.3919009833903837 3 3 4 4 + 0.4331511739849809 3 3 5 5 + -0.003506514741495167 3 3 6 1 + 0.02135559165735068 3 3 6 2 + -1.760851783827455e-09 3 3 6 3 + 0.04068296375539224 3 3 6 4 + 0.4371061237241277 3 3 6 6 + -0.005355703428214626 3 3 7 1 + 0.02441947500448238 3 3 7 2 + -7.977632443534333e-11 3 3 7 3 + 0.05338880260968507 3 3 7 4 + -0.05779185160978591 3 3 7 6 + 0.4222954975769656 3 3 7 7 + 1.616306782425275e-10 3 3 8 1 + -7.369626714437416e-10 3 3 8 2 + 0.006088711866650699 3 3 8 3 + 6.99576091500731e-10 3 3 8 4 + 1.744101030265455e-09 3 3 8 6 + -8.608482260363814e-10 3 3 8 7 + 0.4879910039492059 3 3 8 8 + -8.568915822053068e-08 4 1 1 1 + 8.364174145619843e-09 4 1 2 1 + -1.486499987002083e-08 4 1 2 2 + -0.004084312178270883 4 1 3 3 + 0.007474593229381657 4 1 4 1 + 0.01284990256982012 4 1 4 2 + -1.767793984114308e-10 4 1 4 3 + 0.004084315786589669 4 1 4 4 + -3.066141465615617e-09 4 1 5 5 + 6.760068835703874e-08 4 1 6 1 + 2.948831143964646e-08 4 1 6 2 + 0.00331204426952211 4 1 6 4 + 1.054808934262356e-07 4 1 6 6 + 0.01310582880284192 4 1 7 1 + 0.007756042874426749 4 1 7 2 + 9.745362134459812e-11 4 1 7 3 + -0.003229183403604272 4 1 7 4 + 0.01301512327652033 4 1 7 6 + -0.0008664318258174901 4 1 7 7 + 1.717309623905329e-10 4 1 8 1 + 1.016305008899598e-10 4 1 8 2 + 0.003229172732206766 4 1 8 3 + 9.745373458951503e-11 4 1 8 4 + 1.70542523462644e-10 4 1 8 6 + 1.479230724455577e-11 4 1 8 7 + 0.0008663145891723227 4 1 8 8 + -1.2226583084456e-08 4 2 1 1 + -7.243120211085103e-09 4 2 2 1 + -1.158696648056318e-07 4 2 2 2 + 1.23338839141951e-15 4 2 3 2 + -0.06349299035576955 4 2 3 3 + 0.01284990256982012 4 2 4 1 + 0.1207361175960395 4 2 4 2 + -2.748138702712843e-09 4 2 4 3 + 0.06349303900167501 4 2 4 4 + -8.873810804221893e-09 4 2 5 5 + 8.045403540333563e-08 4 2 6 1 + 1.187179611387978e-08 4 2 6 2 + 6.22071838485283e-15 4 2 6 3 + -0.04324810464226073 4 2 6 4 + 9.09208603662448e-07 4 2 6 6 + 0.01952551763965547 4 2 7 1 + -0.002741360116389463 4 2 7 2 + 1.539441020839694e-09 4 2 7 3 + -0.0510098946503148 4 2 7 4 + 0.1086005561822059 4 2 7 6 + 0.02822260016304924 4 2 7 7 + 2.558507589817127e-10 4 2 8 1 + -3.592206913871632e-11 4 2 8 2 + 0.05101010391011399 4 2 8 3 + 1.53944137819273e-09 4 2 8 4 + 1.423033670067131e-09 4 2 8 6 + -4.819442067649504e-10 4 2 8 7 + -0.02822355941824937 4 2 8 8 + 1.741662369880714e-15 4 3 2 2 + -0.004084305245176307 4 3 3 1 + -0.06349295720993479 4 3 3 2 + 2.581268532253489e-15 4 3 3 3 + -1.767793981945903e-10 4 3 4 1 + -2.74813870097812e-09 4 3 4 2 + 0.04930565142213954 4 3 4 3 + -3.285566263500073e-15 4 3 4 4 + 2.865763182313685e-15 4 3 6 2 + 0.04068259840035819 4 3 6 3 + 1.760853350282754e-09 4 3 6 4 + -1.447106323659852e-14 4 3 6 6 + -1.616311378900386e-10 4 3 7 1 + 7.36962011381459e-10 4 3 7 2 + -0.02365026807610607 4 3 7 3 + 3.098907285295494e-10 4 3 7 4 + -1.744111077783828e-09 4 3 7 6 + -8.60826233212153e-10 4 3 7 7 + -0.005355707506969795 4 3 8 1 + 0.02441960034267945 4 3 8 2 + -3.098978122728635e-10 4 3 8 3 + -0.0236500898525238 4 3 8 4 + -0.05779157924601717 4 3 8 6 + 0.03284823396007458 4 3 8 7 + 8.60841689598324e-10 4 3 8 8 + 0.5431012364660363 4 4 1 1 + -0.003656743745705401 4 4 2 1 + 0.4378453869829155 4 4 2 2 + -1.767792954122244e-10 4 4 3 1 + -2.748138203112482e-09 4 4 3 2 + 0.3919009833903836 4 4 3 3 + 0.004084315786589666 4 4 4 1 + 0.06349303900167499 4 4 4 2 + -3.289035710452026e-15 4 4 4 3 + 0.4905125105642152 4 4 4 4 + 0.4331511381239505 4 4 5 5 + -0.003506468718845008 4 4 6 1 + 0.0213554019405418 4 4 6 2 + 1.760848376830548e-09 4 4 6 3 + -0.04068271101952095 4 4 6 4 + 0.4371070897334383 4 4 6 6 + 0.005355742672269706 4 4 7 1 + -0.02441968094848624 4 4 7 2 + -6.995831275391495e-10 4 4 7 3 + 0.006088856220968246 4 4 7 4 + 0.05779204731270476 4 4 7 6 + 0.4879905021119901 4 4 7 7 + -1.616307065402042e-10 4 4 8 1 + 7.369626887909764e-10 4 4 8 2 + 0.0533889733668623 4 4 8 3 + 7.978407171038704e-11 4 4 8 4 + -1.744101182921121e-09 4 4 8 6 + 8.608482676697449e-10 4 4 8 7 + 0.4222949589965561 4 4 8 8 + 0.0219119901739971 5 1 5 1 + 0.02131300339593315 5 1 5 2 + 7.874760661694818e-09 5 1 5 4 + 0.02372430365489375 5 1 6 5 + -1.031805793045432e-07 5 1 7 5 + 0.02131300339593315 5 2 5 1 + 0.06928141719097859 5 2 5 2 + 1.750534678237464e-08 5 2 5 4 + 0.06566544782371983 5 2 6 5 + -2.914748359582331e-07 5 2 7 5 + 0.01761911615296837 5 3 5 3 + -1.313185671314443e-15 5 3 6 5 + -2.131530134688586e-10 5 3 7 5 + 0.01626699652681543 5 3 8 5 + 7.874760661908271e-09 5 4 5 1 + 1.750534678367568e-08 5 4 5 2 + 0.01761911298668863 5 4 5 4 + 9.462668368754451e-08 5 4 6 5 + 0.01626699768542145 5 4 7 5 + 2.131530039278795e-10 5 4 8 5 + 0.7419370001826256 5 5 1 1 + -0.009802997405129309 5 5 2 1 + 0.462869579503667 5 5 2 2 + 0.4331511739849808 5 5 3 3 + -3.066141466049298e-09 5 5 4 1 + -8.873810790344105e-09 5 5 4 2 + 0.4331511381239505 5 5 4 4 + 0.5867727439789319 5 5 5 5 + -0.00769846202532828 5 5 6 1 + 0.1078172952836542 5 5 6 2 + -6.418476861114186e-15 5 5 6 3 + 4.725037755590883e-07 5 5 6 4 + 0.4593833232162888 5 5 6 6 + 3.200026491527582e-08 5 5 7 1 + -4.948224276990487e-07 5 5 7 2 + -1.280041624779349e-09 5 5 7 3 + 0.09768773464986232 5 5 7 4 + 4.825789111373435e-08 5 5 7 6 + 0.4767268486444175 5 5 7 7 + 0.09768770749957068 5 5 8 3 + 1.280041357631934e-09 5 5 8 4 + 0.4767268554894359 5 5 8 8 + -0.2768877053433904 6 1 1 1 + 0.03851680224932599 6 1 2 1 + -0.008738497054256255 6 1 2 2 + -1.077561434179031e-15 6 1 3 2 + -0.003506514741495283 6 1 3 3 + 6.760068836909583e-08 6 1 4 1 + 8.045403540805191e-08 6 1 4 2 + -0.003506468718845072 6 1 4 4 + -0.007698462025328377 6 1 5 5 + 0.04378701810372509 6 1 6 1 + -0.009467007597906356 6 1 6 2 + 5.171934667509833e-10 6 1 6 4 + -0.0114633647476185 6 1 6 6 + -9.277087864673952e-08 6 1 7 1 + 9.723397860187017e-08 6 1 7 2 + 6.606969900108291e-11 6 1 7 3 + -0.005042172571767005 6 1 7 4 + 9.76088503226529e-08 6 1 7 6 + -0.0092707583932563 6 1 7 7 + -0.005042127587287211 6 1 8 3 + -6.606894995290699e-11 6 1 8 4 + -0.009270737731959777 6 1 8 8 + 0.2155884081584521 6 2 1 1 + -0.009473380575599027 6 2 2 1 + 0.04243264270473728 6 2 2 2 + 0.02135559165735062 6 2 3 3 + 2.948831144555875e-08 6 2 4 1 + 1.187179617969086e-08 6 2 4 2 + 2.867714746224159e-15 6 2 4 3 + 0.02135540194054172 6 2 4 4 + 0.107817295283654 6 2 5 5 + -0.009467007597906437 6 2 6 1 + 0.07041436123979071 6 2 6 2 + -6.609296443471635e-15 6 2 6 3 + 4.937225539236589e-07 6 2 6 4 + 0.02737358772151331 6 2 6 6 + 9.466183875933706e-08 6 2 7 1 + -1.331937086040957e-07 6 2 7 2 + -8.859655630660823e-10 6 2 7 3 + 0.06761338784822354 6 2 7 4 + 5.494331898996119e-08 6 2 7 6 + 0.0456614797777442 6 2 7 7 + 0.06761332704570971 6 2 8 3 + 8.859645031500385e-10 6 2 8 4 + 0.04566171962209002 6 2 8 8 + -1.303678869975992e-14 6 3 1 1 + -3.582203977892107e-15 6 3 2 2 + 0.003312072277051121 6 3 3 1 + -0.04324768872890664 6 3 3 2 + -1.760851745663539e-09 6 3 3 3 + 6.229392002232714e-15 6 3 4 2 + 0.04068259840035818 6 3 4 3 + 1.760848404586124e-09 6 3 4 4 + -6.401129626354418e-15 6 3 5 5 + -6.614500613899565e-15 6 3 6 2 + 0.05945074643173516 6 3 6 3 + -7.86697096355482e-15 6 3 6 4 + 3.524958103184872e-15 6 3 6 6 + -7.890660753918574e-11 6 3 7 1 + -5.98576393312511e-10 6 3 7 2 + -0.0303887399288535 6 3 7 3 + -9.171078662120746e-10 6 3 7 4 + 6.068656167868003e-10 6 3 7 6 + 6.350154724971135e-10 6 3 7 7 + 0.006021893801855345 6 3 8 1 + 0.04568092179366449 6 3 8 2 + 9.170985706963286e-10 6 3 8 3 + -0.03038848524635313 6 3 8 4 + -0.04631270420366784 6 3 8 6 + 0.03718878854055605 6 3 8 7 + -6.350279330158415e-10 6 3 8 8 + 9.617531264119935e-07 6 4 1 1 + -2.757017796814519e-08 6 4 2 1 + 2.596254400364165e-07 6 4 2 2 + 6.251943407420413e-15 6 4 3 2 + 0.0406829637553922 6 4 3 3 + 0.003312044269522111 6 4 4 1 + -0.04324810464226065 6 4 4 2 + 1.76085334854803e-09 6 4 4 3 + -0.04068271101952096 6 4 4 4 + 4.725037754081673e-07 6 4 5 5 + 5.1719352872669e-10 6 4 6 1 + 4.937225538646783e-07 6 4 6 2 + -7.870440410506774e-15 6 4 6 3 + 0.05945127324281606 6 4 6 4 + -2.621023723614613e-07 6 4 6 6 + 0.006021847395453992 6 4 7 1 + 0.04568097848955616 6 4 7 2 + -9.171078375891373e-10 6 4 7 3 + 0.03038888763910752 6 4 7 4 + -0.04631348354443215 6 4 7 6 + -0.03718802732760431 6 4 7 7 + 7.890738588792537e-11 6 4 8 1 + 5.985753715603837e-10 6 4 8 2 + -0.03038845537065924 6 4 8 3 + -9.170987398318675e-10 6 4 8 4 + -6.068525751357079e-10 6 4 8 6 + 6.350255789960846e-10 6 4 8 7 + 0.0371889465448763 6 4 8 8 + 0.02372430365489375 6 5 5 1 + 0.06566544782371983 6 5 5 2 + -1.313185671314443e-15 6 5 5 3 + 9.462668367106464e-08 6 5 5 4 + 0.06815328103583752 6 5 6 5 + -2.095076133412643e-07 6 5 7 5 + 0.6175240026727643 6 6 1 1 + -0.01147166657986728 6 6 2 1 + 0.4383641013013591 6 6 2 2 + -1.409462824231156e-15 6 6 3 1 + -1.217081990745328e-14 6 6 3 2 + 0.4371061237241274 6 6 3 3 + 1.054808934400049e-07 6 6 4 1 + 9.092086036208147e-07 6 6 4 2 + -1.446065489574266e-14 6 6 4 3 + 0.4371070897334379 6 6 4 4 + 0.4593833232162882 6 6 5 5 + -0.01146336474761833 6 6 6 1 + 0.02737358772151318 6 6 6 2 + 3.469446951953614e-15 6 6 6 3 + -2.621023723059501e-07 6 6 6 4 + 0.4546127474568775 6 6 6 6 + 2.227663392147142e-07 6 6 7 1 + -2.028762585044863e-07 6 6 7 2 + -3.602338011221562e-10 6 6 7 3 + 0.02749175900235704 6 6 7 4 + 9.66773658100939e-07 6 6 7 6 + 0.4638456709722711 6 6 7 7 + 0.02749263793977486 6 6 8 3 + 3.602487440301783e-10 6 6 8 4 + 0.4638451680072685 6 6 8 8 + 1.192962591339892e-06 7 1 1 1 + -1.720166128932012e-07 7 1 2 1 + 1.910571664613149e-08 7 1 2 2 + -1.717309490074123e-10 7 1 3 1 + -2.558507080242106e-10 7 1 3 2 + -0.005355703428214625 7 1 3 3 + 0.01310582880284192 7 1 4 1 + 0.01952551763965548 7 1 4 2 + -1.616311377274082e-10 7 1 4 3 + 0.005355742672269696 7 1 4 4 + 3.200026491345979e-08 7 1 5 5 + -9.277087862487125e-08 7 1 6 1 + 9.466183876870185e-08 7 1 6 2 + -7.890660401552868e-11 7 1 6 3 + 0.006021847395453975 7 1 6 4 + 2.227663391908075e-07 7 1 6 6 + 0.02321654759268586 7 1 7 1 + 0.01302582858072183 7 1 7 2 + 9.153751498111595e-11 7 1 7 3 + -0.005360674893443947 7 1 7 4 + 0.02067405857556876 7 1 7 6 + -0.00245320141617261 7 1 7 7 + 0.005360702844778411 7 1 8 3 + 9.153790149919044e-11 7 1 8 4 + 9.744444183848455e-12 7 1 8 7 + 0.002453104881959082 7 1 8 8 + -1.000159650865197e-06 7 2 1 1 + 3.978265412190159e-08 7 2 2 1 + -1.9777984485575e-07 7 2 2 2 + -1.01630551129178e-10 7 2 3 1 + 3.592113585748624e-11 7 2 3 2 + 0.02441947500448233 7 2 3 3 + 0.007756042874426756 7 2 4 1 + -0.002741360116389451 7 2 4 2 + 7.369620169108901e-10 7 2 4 3 + -0.02441968094848628 7 2 4 4 + -4.948224276192514e-07 7 2 5 5 + 9.723397860410634e-08 7 2 6 1 + -1.331937085676665e-07 7 2 6 2 + -5.985763846388936e-10 7 2 6 3 + 0.04568097848955621 7 2 6 4 + -2.028762583275445e-07 7 2 6 6 + 0.01302582858072182 7 2 7 1 + 0.04857800912948742 7 2 7 2 + -1.608860648871779e-10 7 2 7 3 + 0.009421791830493851 7 2 7 4 + -0.008641746821782516 7 2 7 6 + -0.0309852504152207 7 2 7 7 + -0.009422587341917516 7 2 8 3 + -1.608964025380522e-10 7 2 8 4 + 1.230834644275203e-10 7 2 8 7 + 0.03098490469971343 7 2 8 8 + -2.667762917037406e-09 7 3 1 1 + 7.158058472128345e-11 7 3 2 1 + -6.157832455749856e-10 7 3 2 2 + 0.003229158387026626 7 3 3 1 + 0.05101028878336431 7 3 3 2 + -7.977634525202504e-11 7 3 3 3 + 9.745362131749306e-11 7 3 4 1 + 1.539441018237608e-09 7 3 4 2 + -0.02365026807610605 7 3 4 3 + -6.995831362127669e-10 7 3 4 4 + -1.280041628248796e-09 7 3 5 5 + 6.606969504374498e-11 7 3 6 1 + -8.859655578619119e-10 7 3 6 2 + -0.0303887399288535 7 3 6 3 + -9.171078393238608e-10 7 3 6 4 + -3.602337941832623e-10 7 3 6 6 + 9.153751698688997e-11 7 3 7 1 + -1.608860631524545e-10 7 3 7 2 + 0.03591647364088903 7 3 7 3 + -9.039614499647963e-10 7 3 7 4 + 9.016174473686078e-10 7 3 7 6 + -5.669179067163688e-10 7 3 7 7 + 0.005360652155751565 7 3 8 1 + -0.009422498362905051 7 3 8 2 + -9.039729537835273e-10 7 3 8 3 + 0.03201691937278552 7 3 8 4 + 0.05280141431308802 7 3 8 6 + -0.01109587659462343 7 3 8 7 + -8.576824528372384e-10 7 3 8 8 + 0.2035931511500463 7 4 1 1 + -0.005462748413268849 7 4 2 1 + 0.04699415003091144 7 4 2 2 + 9.745362760586566e-11 7 4 3 1 + 1.539441031248034e-09 7 4 3 2 + 0.05338880260968509 7 4 3 3 + -0.003229183403604285 7 4 4 1 + -0.05100989465031477 7 4 4 2 + 3.09890732866358e-10 7 4 4 3 + 0.006088856220968234 7 4 4 4 + 0.09768773464986232 7 4 5 5 + -0.005042172571766922 7 4 6 1 + 0.0676133878482237 7 4 6 2 + -9.171078974370972e-10 7 4 6 3 + 0.03038888763910764 7 4 6 4 + 0.02749175900235752 7 4 6 6 + -0.005360674893443919 7 4 7 1 + 0.009421791830493798 7 4 7 2 + -9.039614560363285e-10 7 4 7 3 + 0.1049033234115907 7 4 7 4 + -0.05280100202768551 7 4 7 6 + 0.04326476331602425 7 4 7 7 + 9.15372272474119e-11 7 4 8 1 + -1.608952016757259e-10 7 4 8 2 + 0.0369706911419247 7 4 8 3 + 9.039729444593886e-10 7 4 8 4 + 9.016227842453817e-10 7 4 8 6 + -1.453951989187352e-10 7 4 8 7 + 0.06545500534034067 7 4 8 8 + -1.031805793044856e-07 7 5 5 1 + -2.914748359624615e-07 7 5 5 2 + -2.131530130351778e-10 7 5 5 3 + 0.01626699768542144 7 5 5 4 + -2.095076133551421e-07 7 5 6 5 + 0.02014400134859773 7 5 7 5 + 2.236463254652406e-07 7 6 1 1 + 2.752050836133876e-09 7 6 2 1 + -2.788649442787838e-08 7 6 2 2 + -1.705423843052951e-10 7 6 3 1 + -1.423037221046086e-09 7 6 3 2 + -0.05779185160978585 7 6 3 3 + 0.01301512327652036 7 6 4 1 + 0.1086005561822058 7 6 4 2 + -1.744111098600509e-09 7 6 4 3 + 0.05779204731270483 7 6 4 4 + 4.825789130802338e-08 7 6 5 5 + 9.760885020612827e-08 7 6 6 1 + 5.494331907496264e-08 7 6 6 2 + 6.068656514812698e-10 7 6 6 3 + -0.04631348354443205 7 6 6 4 + 9.667736581217556e-07 7 6 6 6 + 0.02067405857556874 7 6 7 1 + -0.008641746821782573 7 6 7 2 + 9.016174460675652e-10 7 6 7 3 + -0.05280100202768544 7 6 7 4 + 0.1111424447868589 7 6 7 6 + 0.02938938011646844 7 6 7 7 + 0.05280143252065627 7 6 8 3 + 9.016230366476474e-10 7 6 8 4 + -1.167472819807447e-10 7 6 8 7 + -0.02939011930180432 7 6 8 8 + 0.6817863344015809 7 7 1 1 + -0.009830874230348431 7 7 2 1 + 0.4572792141443754 7 7 2 2 + 1.479452476325915e-11 7 7 3 1 + -4.819256660404392e-10 7 7 3 2 + 0.4222954975769655 7 7 3 3 + -0.0008664318258175432 7 7 4 1 + 0.02822260016304919 7 7 4 2 + -8.608262019871304e-10 7 7 4 3 + 0.4879905021119904 7 7 4 4 + 0.4767268486444175 7 7 5 5 + -0.00927075839325596 7 7 6 1 + 0.0456614797777443 7 7 6 2 + 6.350153944345571e-10 7 7 6 3 + -0.03718802732760419 7 7 6 4 + 0.4638456709722718 7 7 6 6 + -0.002453201416172579 7 7 7 1 + -0.03098525041522102 7 7 7 2 + -5.669179049816453e-10 7 7 7 3 + 0.04326476331602423 7 7 7 4 + 0.02938938011646805 7 7 7 6 + 0.5275422035780376 7 7 7 7 + 9.744417837735664e-12 7 7 8 1 + 1.230836439714e-10 7 7 8 2 + 0.06545467220500588 7 7 8 3 + 8.576771619306367e-10 7 7 8 4 + -1.167472715724038e-10 7 7 8 6 + 1.720845688168993e-15 7 7 8 7 + 0.458572239014637 7 7 8 8 + 0.01310582949056686 8 1 3 1 + 0.01952552068678412 8 1 3 2 + 1.616306801940914e-10 8 1 3 3 + 1.717309618009979e-10 8 1 4 1 + 2.558507594153936e-10 8 1 4 2 + -0.005355707506969792 8 1 4 3 + -1.616307101180714e-10 8 1 4 4 + 0.006021893801855357 8 1 6 3 + 7.890738371952102e-11 8 1 6 4 + 0.005360652155751562 8 1 7 3 + 9.153721801814091e-11 8 1 7 4 + 9.744413175666322e-12 8 1 7 7 + 0.02321654569212701 8 1 8 1 + 0.013025821544563 8 1 8 2 + -9.153766980518618e-11 8 1 8 3 + 0.005360684693389956 8 1 8 4 + 0.02067407664130907 8 1 8 6 + 0.002452977658369744 8 1 8 7 + -9.744385853771576e-12 8 1 8 8 + 0.007756039235437579 8 2 3 1 + -0.002741426122683398 8 2 3 2 + -7.369626280756547e-10 8 2 3 3 + 1.016305021774499e-10 8 2 4 1 + -3.592206306718415e-11 8 2 4 2 + 0.02441960034267945 8 2 4 3 + 7.369626870562529e-10 8 2 4 4 + 0.04568092179366441 8 2 6 3 + 5.985753646214897e-10 8 2 6 4 + -0.009422498362905082 8 2 7 3 + -1.608952368038763e-10 8 2 7 4 + 1.230835650414819e-10 8 2 7 7 + 0.01302582154456299 8 2 8 1 + 0.04857802213371804 8 2 8 2 + 1.608927609197952e-10 8 2 8 3 + -0.009422286290220173 8 2 8 4 + -0.008641527567750294 8 2 8 6 + 0.03098516675257009 8 2 8 7 + -1.230835156018628e-10 8 2 8 8 + 0.2035931153060804 8 3 1 1 + -0.005462751575636357 8 3 2 1 + 0.04699404069097707 8 3 2 2 + -9.745373426425438e-11 8 3 3 1 + -1.539441546460907e-09 8 3 3 2 + 0.006088711866650776 8 3 3 3 + 0.00322917273220676 8 3 4 1 + 0.05101010391011397 8 3 4 2 + -3.0989781053814e-10 8 3 4 3 + 0.05338897336686225 8 3 4 4 + 0.09768770749957068 8 3 5 5 + -0.005042127587287223 8 3 6 1 + 0.06761332704570974 8 3 6 2 + 9.170985602879878e-10 8 3 6 3 + -0.03038845537065917 8 3 6 4 + 0.02749263793977465 8 3 6 6 + 0.005360702844778414 8 3 7 1 + -0.009422587341917497 8 3 7 2 + -9.039729555182507e-10 8 3 7 3 + 0.03697069114192472 8 3 7 4 + 0.05280143252065619 8 3 7 6 + 0.06545467220500592 8 3 7 7 + -9.153767164832988e-11 8 3 8 1 + 1.608927643892422e-10 8 3 8 2 + 0.104903578308026 8 3 8 3 + 9.039692119849896e-10 8 3 8 4 + -9.016203686429414e-10 8 3 8 6 + 1.453925764505204e-10 8 3 8 7 + 0.04326414358754157 8 3 8 8 + 2.667762551340248e-09 8 4 1 1 + -7.158063519089458e-11 8 4 2 1 + 6.157817710600311e-10 8 4 2 2 + 0.003229176787461637 8 4 3 1 + 0.05101010986804835 8 4 3 2 + 6.995760672146023e-10 8 4 3 3 + 9.745373315294716e-11 8 4 4 1 + 1.539441367784389e-09 8 4 4 2 + -0.02365008985252379 8 4 4 3 + 7.978405436315228e-11 8 4 4 4 + 1.280041364570828e-09 8 4 5 5 + -6.606894501978711e-11 8 4 6 1 + 8.859644944764211e-10 8 4 6 2 + -0.03038848524635305 8 4 6 3 + -9.170987354950588e-10 8 4 6 4 + 3.602487370912844e-10 8 4 6 6 + 9.153790255628756e-11 8 4 7 1 + -1.608963916960304e-10 8 4 7 2 + 0.03201691937278552 8 4 7 3 + 9.03972958120336e-10 8 4 7 4 + 9.016230158309657e-10 8 4 7 6 + 8.576771584611897e-10 8 4 7 7 + 0.005360684693389958 8 4 8 1 + -0.00942228629022018 8 4 8 2 + 9.039691946377548e-10 8 4 8 3 + 0.0359162089936258 8 4 8 4 + 0.05280121865932673 8 4 8 6 + -0.01109570617949226 8 4 8 7 + 5.669076527659023e-10 8 4 8 8 + 0.01626699652681544 8 5 5 3 + 2.131530028436773e-10 8 5 5 4 + 0.02014399892747861 8 5 8 5 + 0.01301513143892001 8 6 3 1 + 0.1086003493569572 8 6 3 2 + 1.744100974754303e-09 8 6 3 3 + 1.705425212400295e-10 8 6 4 1 + 1.423033650985173e-09 8 6 4 2 + -0.0577915792460171 8 6 4 3 + -1.744101269657294e-09 8 6 4 4 + -0.0463127042036676 8 6 6 3 + -6.068525716662609e-10 8 6 6 4 + 0.05280141431308791 8 6 7 3 + 9.016227677655086e-10 8 6 7 4 + -1.167473097363203e-10 8 6 7 7 + 0.02067407664130909 8 6 8 1 + -0.008641527567750367 8 6 8 2 + -9.016203998679639e-10 8 6 8 3 + 0.05280121865932673 8 6 8 4 + 0.1111419303234869 8 6 8 6 + -0.02939040005971782 8 6 8 7 + 1.167475283114783e-10 8 6 8 8 + 0.0008662621072355428 8 7 3 1 + -0.02822402839137308 8 7 3 2 + -8.608481531779955e-10 8 7 3 3 + 1.479230686508501e-11 8 7 4 1 + -4.819442154385678e-10 8 7 4 2 + 0.03284823396007455 8 7 4 3 + 8.608483179767257e-10 8 7 4 4 + 0.0371887885405559 8 7 6 3 + 6.350255755266376e-10 8 7 6 4 + 9.744440484008542e-12 8 7 7 1 + 1.230834314677742e-10 8 7 7 2 + -0.0110958765946234 8 7 7 3 + -1.453952505267586e-10 8 7 7 4 + -1.167472958585325e-10 8 7 7 6 + 1.637578961322106e-15 8 7 7 7 + 0.002452977658369743 8 7 8 1 + 0.0309851667525701 8 7 8 2 + 1.453925504296683e-10 8 7 8 3 + -0.01109570617949223 8 7 8 4 + -0.02939040005971776 8 7 8 6 + 0.03448561564567595 8 7 8 7 + 0.6817863310616118 8 8 1 1 + -0.009830874235881838 8 8 2 1 + 0.4572792609884544 8 8 2 2 + -1.479294009336385e-11 8 8 3 1 + 4.819385446275248e-10 8 8 3 2 + 0.4879910039492058 8 8 3 3 + 0.0008663145891722971 8 8 4 1 + -0.02822355941824931 8 8 4 2 + 8.608416618427484e-10 8 8 4 3 + 0.4222949589965561 8 8 4 4 + 0.4767268554894357 8 8 5 5 + -0.009270737731959367 8 8 6 1 + 0.04566171962208991 8 8 6 2 + -6.350280162825683e-10 8 8 6 3 + 0.03718894654487634 8 8 6 4 + 0.4638451680072678 8 8 6 6 + 0.002453104881959138 8 8 7 1 + 0.03098490469971332 8 8 7 2 + -8.576824320205567e-10 8 8 7 3 + 0.0654550053403407 8 8 7 4 + -0.02939011930180446 8 8 7 6 + 0.4585722390146374 8 8 7 7 + -9.744381191702234e-12 8 8 8 1 + -1.230834600907116e-10 8 8 8 2 + 0.04326414358754144 8 8 8 3 + 5.669076874603718e-10 8 8 8 4 + 1.167478613783857e-10 8 8 8 6 + 0.527542716694187 8 8 8 8 + -13.62793241091999 1 1 0 0 + 0.2994753725920457 2 1 0 0 + -3.782931500173552 2 2 0 0 + -1.709858220092652e-15 3 1 0 0 + -1.916088753094173e-15 3 2 0 0 + -3.518338126800653 3 3 0 0 + 1.115009226783957e-07 4 1 0 0 + 1.331870558166061e-07 4 2 0 0 + -3.235216772913752e-15 4 3 0 0 + -3.518337884987929 4 4 0 0 + -1.681074324005105e-15 5 3 0 0 + -1.184087114040172e-15 5 4 0 0 + -3.775764802942057 5 5 0 0 + 0.3055414023917791 6 1 0 0 + -0.6070104123205058 6 2 0 0 + 4.054285236373309e-14 6 3 0 0 + -2.981380796077343e-06 6 4 0 0 + -2.949612932884464 6 6 0 0 + -1.294896601724191e-06 7 1 0 0 + 2.832108898122002e-06 7 2 0 0 + 8.220115672262759e-09 7 3 0 0 + -0.6273268730928548 7 4 0 0 + -8.611798488695355e-07 7 6 0 0 + -3.143334178358397 7 7 0 0 + -0.6273266669849521 8 3 0 0 + -8.22011393910896e-09 8 4 0 0 + -3.143334139381771 8 8 0 0 + 7.37851836955179 0 0 0 0 diff --git a/pyci/test/data/h8_fcidump.fcidump b/pyci/test/data/h8_fcidump.fcidump new file mode 100644 index 00000000..12fa4053 --- /dev/null +++ b/pyci/test/data/h8_fcidump.fcidump @@ -0,0 +1,693 @@ + &FCI NORB= 8,NELEC= 8,MS2=0, + ORBSYM=1,1,1,1,1,1,1,1, + ISYM=1, + &END + 0.3777373646626236 1 1 1 1 + 0.3032911140190673 1 1 2 2 + -0.07273594613890115 1 1 3 1 + 1.162264728904461e-15 1 1 3 2 + 0.2932688073085586 1 1 3 3 + 0.07754570140898318 1 1 4 2 + -1.124100812432971e-15 1 1 4 3 + 0.3174944778613163 1 1 4 4 + 0.003890875696227873 1 1 5 1 + -0.07434801414710537 1 1 5 3 + 0.3215704683220267 1 1 5 5 + 0.005201431595257785 1 1 6 2 + -0.07689487200458164 1 1 6 4 + 0.3061794232828999 1 1 6 6 + 0.002667173893774385 1 1 7 1 + 0.006624963123186868 1 1 7 3 + 0.08093912016067416 1 1 7 5 + 1.092875789865388e-15 1 1 7 6 + 0.3225353131684576 1 1 7 7 + 0.003259294716182586 1 1 8 2 + 0.002977681073939263 1 1 8 4 + -0.07700497350018676 1 1 8 6 + 1.508342062361834e-15 1 1 8 7 + 0.4044233451490636 1 1 8 8 + 0.1276875770155474 2 1 2 1 + 0.08047088090018464 2 1 3 2 + 0.05080555679265045 2 1 4 1 + -0.0921944635936279 2 1 4 3 + -0.05174454563523459 2 1 5 2 + -0.07448342145223696 2 1 5 4 + 0.002974896189897208 2 1 6 1 + 0.04371406632977299 2 1 6 3 + -0.09523614900298887 2 1 6 5 + -0.001235730136786957 2 1 7 2 + -0.05325811427142381 2 1 7 4 + 0.08599567951036789 2 1 7 6 + -0.0009243703453183493 2 1 8 1 + 0.004038644591538278 2 1 8 3 + 0.05106990181782984 2 1 8 5 + 1.080732725533551e-15 2 1 8 6 + 0.1354069734259121 2 1 8 7 + 0.3032911140190673 2 2 1 1 + 0.326040755661211 2 2 2 2 + 0.01947938035318023 2 2 3 1 + 0.2956896514862595 2 2 3 3 + 0.01134293155171051 2 2 4 2 + 0.2991617116459523 2 2 4 4 + -0.03722920183189456 2 2 5 1 + -0.01499664100213257 2 2 5 3 + 0.3025634122723684 2 2 5 5 + 0.03916537208826076 2 2 6 2 + -0.01612583428340721 2 2 6 4 + 0.306420649889851 2 2 6 6 + -6.782133604622039e-05 2 2 7 1 + 0.04017828471921903 2 2 7 3 + 0.01149396611230397 2 2 7 5 + 0.3396208110312242 2 2 7 7 + 0.0008416569953567281 2 2 8 2 + -0.03685664206883331 2 2 8 4 + 0.01634767847087008 2 2 8 6 + 0.3254369198479697 2 2 8 8 + -0.07273594613890116 3 1 1 1 + 0.01947938035318019 3 1 2 2 + 0.08762298463099905 3 1 3 1 + 0.001495257363865569 3 1 3 3 + -0.06429327380847667 3 1 4 2 + -0.01974064649916499 3 1 4 4 + -0.03759559984264665 3 1 5 1 + 0.05641280519095481 3 1 5 3 + -0.02009129080536805 3 1 5 5 + 0.03207328285390884 3 1 6 2 + 0.05819894935423993 3 1 6 4 + -0.001179868529573061 3 1 6 6 + -0.001280307351915255 3 1 7 1 + 0.0313758884827281 3 1 7 3 + -0.06730161194607866 3 1 7 5 + 0.01359428193967588 3 1 7 7 + -0.001243153876571393 3 1 8 2 + -0.03661973803322326 3 1 8 4 + 0.08911325905835694 3 1 8 6 + -0.0783191515379387 3 1 8 8 + 1.1518563880486e-15 3 2 1 1 + 0.0804708809001846 3 2 2 1 + 0.1135446628389791 3 2 3 2 + -0.02757311637693935 3 2 4 1 + -0.08929893682906852 3 2 4 3 + -0.006812370871680025 3 2 5 2 + -0.07281976301298612 3 2 5 4 + 0.02815328004280931 3 2 6 1 + -0.001447038893572885 3 2 6 3 + -0.09124642274875733 3 2 6 5 + 0.02715635318070105 3 2 7 2 + -0.006703918647588987 3 2 7 4 + 0.1119817871285603 3 2 7 6 + -0.0008170031280246193 3 2 8 1 + 0.02762561424019737 3 2 8 3 + -0.02374471086779989 3 2 8 5 + 0.08726034486763701 3 2 8 7 + 0.2932688073085586 3 3 1 1 + 0.2956896514862595 3 3 2 2 + 0.001495257363865576 3 3 3 1 + 0.3133875468127063 3 3 3 3 + -0.01645000004907656 3 3 4 2 + 0.2952893195540534 3 3 4 4 + 0.01602874165277816 3 3 5 1 + -0.007493133009665573 3 3 5 3 + 0.2978215703472982 3 3 5 5 + 0.005877584447796687 3 3 6 2 + -0.00928015585280758 3 3 6 4 + 0.3164120557995788 3 3 6 6 + 0.02225045911343843 3 3 7 1 + 0.007694112671248757 3 3 7 3 + -0.009117377335470269 3 3 7 5 + 0.3117681406263421 3 3 7 7 + 0.02225691657236466 3 3 8 2 + 0.01095141422836556 3 3 8 4 + 0.0002348385631720656 3 3 8 6 + 0.3150948068163652 3 3 8 8 + 0.05080555679265046 4 1 2 1 + -0.02757311637693937 4 1 3 2 + 0.07705004332188665 4 1 4 1 + -0.009747907913098347 4 1 4 3 + -0.04235254330408224 4 1 5 2 + -0.005833794842860932 4 1 5 4 + -0.0265635301134305 4 1 6 1 + 0.04369999672526756 4 1 6 3 + -0.01022576867489183 4 1 6 5 + -0.02815349490513309 4 1 7 2 + -0.04483395810359535 4 1 7 4 + -0.02039063733171277 4 1 7 6 + 0.001509262734822648 4 1 8 1 + -0.02449451241825074 4 1 8 3 + 0.07399502880957334 4 1 8 5 + 0.05298564742257036 4 1 8 7 + 0.0775457014089832 4 2 1 1 + 0.0113429315517105 4 2 2 2 + -0.06429327380847667 4 2 3 1 + -0.01645000004907661 4 2 3 3 + 0.08537885995708341 4 2 4 2 + 0.02525578093189796 4 2 4 4 + -0.01479660967840978 4 2 5 1 + -0.05687660463088976 4 2 5 3 + 0.02537610127150836 4 2 5 5 + -0.0009315177863644959 4 2 6 2 + -0.05896902700886359 4 2 6 4 + -0.006416037653337613 4 2 6 6 + -0.02171832991096397 4 2 7 1 + -0.0001638812047695722 4 2 7 3 + 0.08160103075104096 4 2 7 5 + 0.01543335960972698 4 2 7 7 + -0.02033870323993325 4 2 8 2 + -0.01063933230960605 4 2 8 4 + -0.06758823107280383 4 2 8 6 + 0.08460192196458861 4 2 8 8 + -1.10848830114918e-15 4 3 1 1 + -0.09219446359362791 4 3 2 1 + -0.08929893682906853 4 3 3 2 + -0.009747907913098344 4 3 4 1 + 0.1101897201035431 4 3 4 3 + -0.006109368832648883 4 3 5 2 + 0.07431689295851231 4 3 5 4 + 0.01525071222447963 4 3 6 1 + -0.001618104299622222 4 3 6 3 + 0.1048594042007572 4 3 6 5 + -0.0003468495106461363 4 3 7 2 + 0.001026024965555438 4 3 7 4 + -0.09267196830923465 4 3 7 6 + -0.01717027213147523 4 3 8 1 + 0.01019001929831586 4 3 8 3 + -0.01004638133302189 4 3 8 5 + -0.1000964484193152 4 3 8 7 + 0.3174944778613164 4 4 1 1 + 0.2991617116459523 4 4 2 2 + -0.01974064649916499 4 4 3 1 + 0.2952893195540534 4 4 3 3 + 0.02525578093189797 4 4 4 2 + 0.3179904404909178 4 4 4 4 + -0.00342071723224583 4 4 5 1 + -0.008209307452447606 4 4 5 3 + 0.3125777187872322 4 4 5 5 + -0.009341990098456605 4 4 6 2 + -0.0173079839566213 4 4 6 4 + 0.3052011389833167 4 4 6 6 + -0.014180875769342 4 4 7 1 + -0.001850314249025781 4 4 7 3 + 0.02734547557532422 4 4 7 5 + 0.3174976234512071 4 4 7 7 + -0.009457542300655177 4 4 8 2 + -0.004336723521982595 4 4 8 4 + -0.02197555943861437 4 4 8 6 + 0.3433586005772224 4 4 8 8 + 0.003890875696227897 5 1 1 1 + -0.03722920183189456 5 1 2 2 + -0.03759559984264667 5 1 3 1 + 0.01602874165277817 5 1 3 3 + -0.01479660967840976 5 1 4 2 + -0.003420717232245804 5 1 4 4 + 0.06346941754343619 5 1 5 1 + -0.006577662747035979 5 1 5 3 + -0.003355454742328909 5 1 5 5 + -0.03974363641353696 5 1 6 2 + -0.006768225411280009 5 1 6 4 + 0.008862424851493033 5 1 6 6 + 0.02548256684462248 5 1 7 1 + -0.03978724388375501 5 1 7 3 + -0.007270638697225986 5 1 7 5 + -0.03563392161125239 5 1 7 7 + 0.02416738720835741 5 1 8 2 + 0.05886294599317772 5 1 8 4 + -0.03727852146450039 5 1 8 6 + 0.003679217178800187 5 1 8 8 + -0.05174454563523456 5 2 2 1 + -0.006812370871680021 5 2 3 2 + -0.04235254330408224 5 2 4 1 + -0.006109368832648877 5 2 4 3 + 0.06564389965049423 5 2 5 2 + 0.01137534324671695 5 2 5 4 + -0.0240045857016372 5 2 6 1 + -0.04739092862906956 5 2 6 3 + 0.002749781975534181 5 2 6 5 + -0.002028519600017274 5 2 7 2 + 0.06089999743332094 5 2 7 4 + -0.009908013357936061 5 2 7 6 + 0.02040743071452167 5 2 8 1 + -0.02040781827369249 5 2 8 3 + -0.0435592930602546 5 2 8 5 + -0.05512869153668251 5 2 8 7 + -0.07434801414710533 5 3 1 1 + -0.01499664100213259 5 3 2 2 + 0.05641280519095481 5 3 3 1 + -0.007493133009665557 5 3 3 3 + -0.05687660463088978 5 3 4 2 + -0.008209307452447589 5 3 4 4 + -0.00657766274703596 5 3 5 1 + 0.0746403044485264 5 3 5 3 + -0.01726294532091014 5 3 5 5 + -0.01954585390981655 5 3 6 2 + 0.06958061953123607 5 3 6 4 + -0.01248441023853922 5 3 6 6 + -0.02080477455627485 5 3 7 1 + -0.01459654267303495 5 3 7 3 + -0.05918163930159978 5 3 7 5 + -0.01921086940015644 5 3 7 7 + -0.01748174286329561 5 3 8 2 + -0.006622443443183709 5 3 8 4 + 0.06017917852102828 5 3 8 6 + -0.08183764070437513 5 3 8 8 + -0.07448342145223692 5 4 2 1 + -0.07281976301298612 5 4 3 2 + -0.005833794842860925 5 4 4 1 + 0.07431689295851228 5 4 4 3 + 0.01137534324671694 5 4 5 2 + 0.08958046828038319 5 4 5 4 + -0.004636472114670305 5 4 6 1 + 0.02456843934266519 5 4 6 3 + 0.07545171817296827 5 4 6 5 + 0.02769176452187111 5 4 7 2 + 0.0127919313556912 5 4 7 4 + -0.07628235659444113 5 4 7 6 + 0.03212799979008063 5 4 8 1 + -0.005172568108815253 5 4 8 3 + -0.0064113689056661 5 4 8 5 + -0.08151389358805225 5 4 8 7 + 0.3215704683220267 5 5 1 1 + 0.3025634122723685 5 5 2 2 + -0.02009129080536806 5 5 3 1 + 0.2978215703472982 5 5 3 3 + 0.02537610127150836 5 5 4 2 + 0.3125777187872322 5 5 4 4 + -0.003355454742328911 5 5 5 1 + -0.01726294532091014 5 5 5 3 + 0.3237373774704471 5 5 5 5 + -0.001186833164321194 5 5 6 2 + -0.01360043020986031 5 5 6 4 + 0.3108215700111734 5 5 6 6 + -0.007520912278380249 5 5 7 1 + -0.005053199516740306 5 5 7 3 + 0.02863480593192595 5 5 7 5 + 0.323276671727155 5 5 7 7 + -0.01079286021170061 5 5 8 2 + -0.00461606280604886 5 5 8 4 + -0.02275893004965866 5 5 8 6 + 0.3500450832315031 5 5 8 8 + 0.002974896189897195 6 1 2 1 + 0.02815328004280932 6 1 3 2 + -0.02656353011343051 6 1 4 1 + 0.01525071222447963 6 1 4 3 + -0.02400458570163719 6 1 5 2 + -0.004636472114670302 6 1 5 4 + 0.04463298128952019 6 1 6 1 + 0.005930958796015234 6 1 6 3 + 0.008146410968716041 6 1 6 5 + 0.02566314771696102 6 1 7 2 + -0.01791700395908279 6 1 7 4 + 0.02601625722529591 6 1 7 6 + -0.02056642869824812 6 1 8 1 + 0.0402888385460678 6 1 8 3 + -0.02436559391300808 6 1 8 5 + 0.003469277151610719 6 1 8 7 + 0.005201431595257773 6 2 1 1 + 0.03916537208826075 6 2 2 2 + 0.03207328285390885 6 2 3 1 + 0.005877584447796695 6 2 3 3 + -0.0009315177863644937 6 2 4 2 + -0.009341990098456618 6 2 4 4 + -0.03974363641353697 6 2 5 1 + -0.01954585390981655 6 2 5 3 + -0.001186833164321197 6 2 5 5 + 0.05596599568604857 6 2 6 2 + -0.0130362957639665 6 2 6 4 + 0.009336606686913726 6 2 6 6 + 0.01431677855412424 6 2 7 1 + 0.05104053017495509 6 2 7 3 + -0.003118464587035023 6 2 7 5 + 0.03934281828745755 6 2 7 7 + 0.01143017699894073 6 2 8 2 + -0.03917468004632275 6 2 8 4 + 0.03218861630840229 6 2 8 6 + 0.00611103884846266 6 2 8 8 + 0.04371406632977299 6 3 2 1 + -0.001447038893572893 6 3 3 2 + 0.04369999672526755 6 3 4 1 + -0.001618104299622213 6 3 4 3 + -0.04739092862906957 6 3 5 2 + 0.02456843934266519 6 3 5 4 + 0.005930958796015239 6 3 6 1 + 0.07291943353770959 6 3 6 3 + -0.004622117111788653 6 3 6 5 + 0.02991985935470044 6 3 7 2 + -0.04764258991312954 6 3 7 4 + 0.001285349342260274 6 3 7 6 + 0.02634548660908666 6 3 8 1 + 0.006277833576495176 6 3 8 3 + 0.04483037906287135 6 3 8 5 + 0.04739596083267579 6 3 8 7 + -0.07689487200458164 6 4 1 1 + -0.0161258342834072 6 4 2 2 + 0.05819894935423991 6 4 3 1 + -0.009280155852807562 6 4 3 3 + -0.05896902700886358 6 4 4 2 + -0.01730798395662128 6 4 4 4 + -0.00676822541128 6 4 5 1 + 0.06958061953123612 6 4 5 3 + -0.01360043020986034 6 4 5 5 + -0.01303629576396653 6 4 6 2 + 0.07501133002160298 6 4 6 4 + -0.01342245159364497 6 4 6 6 + -0.01563248944207074 6 4 7 1 + -0.0172566140905961 6 4 7 3 + -0.06066217226667293 6 4 7 5 + -0.02067441091830608 6 4 7 7 + -0.01879952149581443 6 4 8 2 + -0.0073055874870635 6 4 8 4 + 0.06247468668706985 6 4 8 6 + -0.08637299036698511 6 4 8 8 + -0.09523614900298885 6 5 2 1 + -0.09124642274875733 6 5 3 2 + -0.01022576867489184 6 5 4 1 + 0.1048594042007572 6 5 4 3 + 0.002749781975534134 6 5 5 2 + 0.07545171817296824 6 5 5 4 + 0.008146410968716079 6 5 6 1 + -0.00462211711178865 6 5 6 3 + 0.1124712191579555 6 5 6 5 + -0.002274487330007723 6 5 7 2 + -0.0003854783523560522 6 5 7 4 + -0.09646650314049544 6 5 7 6 + -0.01526826028562705 6 5 8 1 + 0.01102499622384149 6 5 8 3 + -0.01143749975685842 6 5 8 5 + -0.1051865533809677 6 5 8 7 + 0.3061794232829 6 6 1 1 + 0.3064206498898509 6 6 2 2 + -0.001179868529573073 6 6 3 1 + 0.3164120557995789 6 6 3 3 + -0.006416037653337696 6 6 4 2 + 0.3052011389833168 6 6 4 4 + 0.00886242485149309 6 6 5 1 + -0.0124844102385392 6 6 5 3 + 0.3108215700111735 6 6 5 5 + 0.0093366066869137 6 6 6 2 + -0.01342245159364495 6 6 6 4 + 0.3338087051113193 6 6 6 6 + 0.01977460638263587 6 6 7 1 + 0.009718866650592222 6 6 7 3 + -0.008787788360034961 6 6 7 5 + 0.3282107914843099 6 6 7 7 + 0.02085303413180931 6 6 8 2 + 0.01164204420754553 6 6 8 4 + -0.002379384803869523 6 6 8 6 + 0.335690099450537 6 6 8 8 + 0.002667173893774382 7 1 1 1 + -6.782133604623438e-05 7 1 2 2 + -0.001280307351915266 7 1 3 1 + 0.02225045911343843 7 1 3 3 + -0.02171832991096397 7 1 4 2 + -0.01418087576934201 7 1 4 4 + 0.02548256684462248 7 1 5 1 + -0.02080477455627485 7 1 5 3 + -0.007520912278380222 7 1 5 5 + 0.01431677855412423 7 1 6 2 + -0.01563248944207071 7 1 6 4 + 0.0197746063826358 7 1 6 6 + 0.0409239860621842 7 1 7 1 + 0.0101070686126435 7 1 7 3 + -0.01824841797727699 7 1 7 5 + 0.0002355174059414543 7 1 7 7 + 0.03779349016366373 7 1 8 2 + 0.0234645736305239 7 1 8 4 + -0.001540566308341938 7 1 8 6 + 0.002904688977815371 7 1 8 8 + -0.001235730136786954 7 2 2 1 + 0.02715635318070107 7 2 3 2 + -0.02815349490513309 7 2 4 1 + -0.0003468495106461408 7 2 4 3 + -0.002028519600017268 7 2 5 2 + 0.0276917645218711 7 2 5 4 + 0.02566314771696102 7 2 6 1 + 0.02991985935470042 7 2 6 3 + -0.002274487330007721 7 2 6 5 + 0.05606898352040245 7 2 7 2 + -0.000135382152286501 7 2 7 4 + 0.0255415495499703 7 2 7 6 + 0.02992563328161791 7 2 8 1 + 0.02502186010987519 7 2 8 3 + -0.02724464634598884 7 2 8 5 + -0.0009966599751359394 7 2 8 7 + 0.006624963123186882 7 3 1 1 + 0.04017828471921902 7 3 2 2 + 0.03137588848272813 7 3 3 1 + 0.007694112671248724 7 3 3 3 + -0.0001638812047695488 7 3 4 2 + -0.001850314249025826 7 3 4 4 + -0.03978724388375507 7 3 5 1 + -0.01459654267303498 7 3 5 3 + -0.005053199516740271 7 3 5 5 + 0.05104053017495513 7 3 6 2 + -0.01725661409059608 7 3 6 4 + 0.009718866650592279 7 3 6 6 + 0.0101070686126435 7 3 7 1 + 0.05448857635844626 7 3 7 3 + -0.002686385524509631 7 3 7 5 + 0.04182962695420471 7 3 7 7 + 0.01285006675836148 7 3 8 2 + -0.03999648957680422 7 3 8 4 + 0.03282441095023209 7 3 8 6 + 0.008238205877387689 7 3 8 8 + -0.0532581142714238 7 4 2 1 + -0.006703918647588967 7 4 3 2 + -0.04483395810359535 7 4 4 1 + 0.001026024965555399 7 4 4 3 + 0.06089999743332099 7 4 5 2 + 0.0127919313556912 7 4 5 4 + -0.01791700395908282 7 4 6 1 + -0.04764258991312954 7 4 6 3 + -0.0003854783523560244 7 4 6 5 + -0.000135382152286488 7 4 7 2 + 0.06585042792261667 7 4 7 4 + -0.01029616770992134 7 4 7 6 + 0.01900636401629375 7 4 8 1 + -0.02147949065554438 7 4 8 3 + -0.04623491641720332 7 4 8 5 + -0.05938831669463143 7 4 8 7 + 0.08093912016067414 7 5 1 1 + 0.01149396611230396 7 5 2 2 + -0.06730161194607864 7 5 3 1 + -0.009117377335470354 7 5 3 3 + 0.08160103075104104 7 5 4 2 + 0.02734547557532418 7 5 4 4 + -0.007270638697226052 7 5 5 1 + -0.05918163930159982 7 5 5 3 + 0.0286348059319259 7 5 5 5 + -0.003118464587034993 7 5 6 2 + -0.060662172266673 7 5 6 4 + -0.008787788360034961 7 5 6 6 + -0.01824841797727705 7 5 7 1 + -0.002686385524509628 7 5 7 3 + 0.08895545915902364 7 5 7 5 + 0.01631919356377493 7 5 7 7 + -0.01914767405216444 7 5 8 2 + -0.01062442634036531 7 5 8 4 + -0.07325083845639155 7 5 8 6 + 0.09206005894086289 7 5 8 8 + 1.077263278581597e-15 7 6 1 1 + 0.08599567951036785 7 6 2 1 + 0.1119817871285604 7 6 3 2 + -0.02039063733171287 7 6 4 1 + -0.09267196830923467 7 6 4 3 + -0.009908013357936058 7 6 5 2 + -0.07628235659444119 7 6 5 4 + 0.02601625722529601 7 6 6 1 + 0.001285349342260263 7 6 6 3 + -0.09646650314049551 7 6 6 5 + 0.02554154954997035 7 6 7 2 + -0.01029616770992136 7 6 7 4 + 0.1220068376424689 7 6 7 6 + -0.001092005122187551 7 6 8 1 + 0.02793323805647863 7 6 8 3 + -0.02424489262452514 7 6 8 5 + 0.09657596132850904 7 6 8 7 + 0.3225353131684576 7 7 1 1 + 0.3396208110312242 7 7 2 2 + 0.01359428193967594 7 7 3 1 + 0.3117681406263421 7 7 3 3 + 0.01543335960972699 7 7 4 2 + 0.3174976234512073 7 7 4 4 + -0.03563392161125258 7 7 5 1 + -0.01921086940015643 7 7 5 3 + 0.3232766717271552 7 7 5 5 + 0.03934281828745767 7 7 6 2 + -0.02067441091830612 7 7 6 4 + 0.32821079148431 7 7 6 6 + 0.0002355174059413987 7 7 7 1 + 0.04182962695420487 7 7 7 3 + 0.0163191935637751 7 7 7 5 + 0.3709231007159722 7 7 7 7 + 0.0009778661905347954 7 7 8 2 + -0.03985550343665119 7 7 8 4 + 0.01735395007729829 7 7 8 6 + 0.3574611768324225 7 7 8 8 + -0.0009243703453183351 8 1 2 1 + -0.0008170031280246243 8 1 3 2 + 0.001509262734822658 8 1 4 1 + -0.01717027213147524 8 1 4 3 + 0.02040743071452169 8 1 5 2 + 0.03212799979008064 8 1 5 4 + -0.02056642869824814 8 1 6 1 + 0.02634548660908667 8 1 6 3 + -0.01526826028562702 8 1 6 5 + 0.02992563328161791 8 1 7 2 + 0.01900636401629372 8 1 7 4 + -0.001092005122187534 8 1 7 6 + 0.05306504253486071 8 1 8 1 + -0.01932303533274308 8 1 8 3 + 0.001358398288693484 8 1 8 5 + -0.001118325658904838 8 1 8 7 + 0.003259294716182596 8 2 1 1 + 0.0008416569953566728 8 2 2 2 + -0.001243153876571396 8 2 3 1 + 0.02225691657236468 8 2 3 3 + -0.02033870323993326 8 2 4 2 + -0.009457542300655196 8 2 4 4 + 0.02416738720835742 8 2 5 1 + -0.01748174286329562 8 2 5 3 + -0.01079286021170053 8 2 5 5 + 0.01143017699894074 8 2 6 2 + -0.01879952149581441 8 2 6 4 + 0.02085303413180926 8 2 6 6 + 0.03779349016366375 8 2 7 1 + 0.01285006675836149 8 2 7 3 + -0.0191476740521644 8 2 7 5 + 0.0009778661905348839 8 2 7 7 + 0.03902398668641941 8 2 8 2 + 0.02380706850120509 8 2 8 4 + -0.00149487435382537 8 2 8 6 + 0.003922231448494082 8 2 8 8 + 0.004038644591538265 8 3 2 1 + 0.02762561424019742 8 3 3 2 + -0.02449451241825078 8 3 4 1 + 0.01019001929831588 8 3 4 3 + -0.02040781827369254 8 3 5 2 + -0.005172568108815266 8 3 5 4 + 0.04028883854606786 8 3 6 1 + 0.006277833576495177 8 3 6 3 + 0.01102499622384145 8 3 6 5 + 0.02502186010987521 8 3 7 2 + -0.02147949065554438 8 3 7 4 + 0.02793323805647857 8 3 7 6 + -0.01932303533274309 8 3 8 1 + 0.04203231718208127 8 3 8 3 + -0.02491302824185763 8 3 8 5 + 0.005081915540519287 8 3 8 7 + 0.002977681073939271 8 4 1 1 + -0.03685664206883338 8 4 2 2 + -0.03661973803322331 8 4 3 1 + 0.0109514142283656 8 4 3 3 + -0.0106393323096061 8 4 4 2 + -0.004336723521982576 8 4 4 4 + 0.05886294599317782 8 4 5 1 + -0.006622443443183685 8 4 5 3 + -0.004616062806048784 8 4 5 5 + -0.03917468004632282 8 4 6 2 + -0.007305587487063475 8 4 6 4 + 0.01164204420754546 8 4 6 6 + 0.02346457363052395 8 4 7 1 + -0.03999648957680425 8 4 7 3 + -0.01062442634036533 8 4 7 5 + -0.03985550343665095 8 4 7 7 + 0.02380706850120514 8 4 8 2 + 0.06267655506312379 8 4 8 4 + -0.04025686646966539 8 4 8 6 + 0.003060458728385032 8 4 8 8 + 0.05106990181782987 8 5 2 1 + -0.02374471086780002 8 5 3 2 + 0.07399502880957348 8 5 4 1 + -0.0100463813330219 8 5 4 3 + -0.04355929306025461 8 5 5 2 + -0.006411368905666072 8 5 5 4 + -0.02436559391300818 8 5 6 1 + 0.04483037906287141 8 5 6 3 + -0.01143749975685839 8 5 6 5 + -0.02724464634598892 8 5 7 2 + -0.04623491641720331 8 5 7 4 + -0.02424489262452517 8 5 7 6 + 0.001358398288693496 8 5 8 1 + -0.02491302824185771 8 5 8 3 + 0.08076584174486622 8 5 8 5 + 0.05827244648852593 8 5 8 7 + -0.07700497350018679 8 6 1 1 + 1.07552855510562e-15 8 6 2 1 + 0.01634767847087016 8 6 2 2 + 0.08911325905835704 8 6 3 1 + 0.0002348385631721073 8 6 3 3 + -0.06758823107280384 8 6 4 2 + -0.02197555943861428 8 6 4 4 + -0.0372785214645005 8 6 5 1 + 0.0601791785210283 8 6 5 3 + -0.02275893004965875 8 6 5 5 + 0.03218861630840238 8 6 6 2 + 0.06247468668706983 8 6 6 4 + -0.002379384803869466 8 6 6 6 + -0.001540566308341948 8 6 7 1 + 0.03282441095023221 8 6 7 3 + -0.07325083845639153 8 6 7 5 + 0.01735395007729827 8 6 7 7 + -0.001494874353825382 8 6 8 2 + -0.04025686646966547 8 6 8 4 + 0.1012860645052663 8 6 8 6 + -0.08908694706088738 8 6 8 8 + 1.490561146733071e-15 8 7 1 1 + 0.1354069734259122 8 7 2 1 + 0.08726034486763698 8 7 3 2 + 0.05298564742257043 8 7 4 1 + -0.1000964484193152 8 7 4 3 + -0.05512869153668255 8 7 5 2 + -0.08151389358805228 8 7 5 4 + 0.003469277151610727 8 7 6 1 + 0.04739596083267588 8 7 6 3 + -0.1051865533809677 8 7 6 5 + -0.0009966599751359429 8 7 7 2 + -0.05938831669463146 8 7 7 4 + 0.09657596132850892 8 7 7 6 + -0.001118325658904869 8 7 8 1 + 0.005081915540519268 8 7 8 3 + 0.05827244648852607 8 7 8 5 + 0.1568976063616374 8 7 8 7 + 1.00895854171501e-15 8 7 8 8 + 0.4044233451490638 8 8 1 1 + 0.3254369198479696 8 8 2 2 + -0.07831915153793875 8 8 3 1 + 0.3150948068163651 8 8 3 3 + 0.0846019219645886 8 8 4 2 + 0.3433586005772226 8 8 4 4 + 0.003679217178800155 8 8 5 1 + -0.08183764070437517 8 8 5 3 + 0.3500450832315033 8 8 5 5 + 0.006111038848462702 8 8 6 2 + -0.08637299036698511 8 8 6 4 + 0.3356900994505371 8 8 6 6 + 0.002904688977815358 8 8 7 1 + 0.008238205877387661 8 8 7 3 + 0.09206005894086305 8 8 7 5 + 0.3574611768324223 8 8 7 7 + 0.003922231448494039 8 8 8 2 + 0.003060458728385008 8 8 8 4 + -0.08908694706088757 8 8 8 6 + 0.4571216167167121 8 8 8 8 + -2.596564468342772 1 1 0 0 + 1.865219984295888e-15 2 1 0 0 + -2.399365560916459 2 2 0 0 + 0.1424861803955349 3 1 0 0 + -2.243142834840991 3 3 0 0 + -0.1972834871598152 4 2 0 0 + -2.158809817255034 4 4 0 0 + 0.04418594869156806 5 1 0 0 + 0.2325100327505712 5 3 0 0 + -1.994893204681499 5 5 0 0 + -0.1000806345131301 6 2 0 0 + 0.1927964960051053 6 4 0 0 + -1.740632839812299 6 6 0 0 + -0.03336452176224047 7 1 0 0 + -0.07069787434416164 7 3 0 0 + -0.1996729158066857 7 5 0 0 + -1.549020898433734 7 7 0 0 + -0.0168970644849751 8 2 0 0 + 0.04155238929425725 8 4 0 0 + 0.1546320108630275 8 6 0 0 + -1.461392065158685 8 8 0 0 + 7.272406812929145 0 0 0 0 diff --git a/pyci/test/test_routines.py b/pyci/test/test_routines.py index 8b965f9c..585cecc7 100644 --- a/pyci/test/test_routines.py +++ b/pyci/test/test_routines.py @@ -132,12 +132,12 @@ def test_compute_rdms(filename, wfn_type, occs, energy): energy += 0.25 * np.einsum("ijkl,ijkl", two_mo, rdm2) npt.assert_allclose(energy, es[0], rtol=0.0, atol=1.0e-9) - +@pytest.mark.bigmem @pytest.mark.parametrize( "filename, wfn_type, occs, energy", [ - ("BH_sto-3g_eq", pyci.doci_wfn, (3, 3), -26.93841940211769), - ("h10_chain_1.4_STO-6G", pyci.doci_wfn, (5, 5), -9.84401083866329), + ("BH3", pyci.doci_wfn, (4, 4), -26.121994681435808), + ("h8_fcidump", pyci.doci_wfn, (4, 4),-4.307571602003291 ), ("h6_sto_3g", pyci.doci_wfn, (3, 3), -5.877285606582455), ], ) @@ -149,7 +149,7 @@ def test_compute_rdms_1234(filename, wfn_type, occs, energy): es, cs = op.solve(n=1, tol=1.0e-6) if not isinstance(wfn, pyci.doci_wfn): raise TypeError('Wfn must be DOCI') - d0, d2, d3, d4= pyci.compute_rdms_1234(wfn, cs[0]) + d0, d2, d3, d4, d5, d6, d7 = pyci.compute_rdms_1234(wfn, cs[0]) npt.assert_allclose(np.trace(d0), wfn.nocc_up, rtol=0, atol=1.0e-9) npt.assert_allclose(np.sum(d2), wfn.nocc_up * (wfn.nocc_up - 1), rtol=0, atol=1.0e-9) k0, k2 = pyci.reduce_senzero_integrals(ham.h, ham.v, ham.w, wfn.nocc_up) @@ -157,7 +157,7 @@ def test_compute_rdms_1234(filename, wfn_type, occs, energy): energy += np.einsum("ij,ij", k0, d0) energy += np.einsum("ij,ij", k2, d2) npt.assert_allclose(energy, es[0], rtol=0.0, atol=1.0e-9) - rdm1, rdm2, rdm3 = pyci.spinize_rdms_1234(d0, d2, d3 ,d4) + rdm1, rdm2, rdm3, rdm4 = pyci.spinize_rdms_1234(d0, d2, d3, d4, d5, d6, d7, flag='34RDM') assert np.all(np.abs(rdm1 - rdm1.T) < 1e-5) # # Test RDM2 is antisymmetric # for i in range(0, wfn.nbasis * 2): @@ -181,10 +181,12 @@ def test_compute_rdms_1234(filename, wfn_type, occs, energy): assert np.all(np.abs(rdm3[i, :, i, :, :, :]) < 1e-5) assert np.all(np.abs(rdm3[:, :, :, i, :, i]) < 1e-5) #TEST COMPLETE 3RDM AND BLOCKS TRACES - aabaab=rdm3[:ham.nbasis, :ham.nbasis, ham.nbasis:, :ham.nbasis, :ham.nbasis, ham.nbasis:] - bbabba=rdm3[ham.nbasis:, ham.nbasis:, :ham.nbasis, ham.nbasis:, ham.nbasis:, :ham.nbasis] - aaaaaa=rdm3[:ham.nbasis, :ham.nbasis, :ham.nbasis, :ham.nbasis, :ham.nbasis, :ham.nbasis] - bbbbbb=rdm3[ham.nbasis:, ham.nbasis:, ham.nbasis:, ham.nbasis:, ham.nbasis:, ham.nbasis:] + aabaab = rdm3[:ham.nbasis, :ham.nbasis, ham.nbasis:, :ham.nbasis, :ham.nbasis, ham.nbasis:] + bbabba = rdm3[ham.nbasis:, ham.nbasis:, :ham.nbasis, ham.nbasis:, ham.nbasis:, :ham.nbasis] + aaaaaa = rdm3[:ham.nbasis, :ham.nbasis, :ham.nbasis, :ham.nbasis, :ham.nbasis, :ham.nbasis] + bbbbbb = rdm3[ham.nbasis:, ham.nbasis:, ham.nbasis:, ham.nbasis:, ham.nbasis:, ham.nbasis:] + abbabb = rdm3[:ham.nbasis, ham.nbasis:, ham.nbasis:, :ham.nbasis, ham.nbasis:, ham.nbasis:] + baabaa = rdm3[ham.nbasis:, :ham.nbasis, :ham.nbasis, ham.nbasis:, :ham.nbasis, :ham.nbasis] npt.assert_allclose(np.einsum('ijkijk -> ', rdm3),(wfn.nocc_up * 2)*(wfn.nocc_up * 2 - 1) * (wfn.nocc_up * 2 - 2) ,rtol=0, atol=1.0e-9) npt.assert_allclose(np.einsum('ijkijk -> ', aaaaaa),(wfn.nocc_up) * (wfn.nocc_up - 1) * (wfn.nocc_up - 2) , rtol=0, atol=1.0e-9) npt.assert_allclose(np.einsum('ijkijk -> ', aabaab),(wfn.nocc_up) * (wfn.nocc_dn) * (wfn.nocc_up - 1) , rtol=0, atol=1.0e-9) @@ -221,6 +223,164 @@ def test_compute_rdms_1234(filename, wfn_type, occs, energy): fac=(1.0 / (wfn.nocc_dn - 1.0)) npt.assert_allclose(np.einsum('mijmkl->ijkl ', bbabba) * fac,d2_block_baba, rtol=0, atol=1.0e-9) npt.assert_allclose(np.einsum('imjkml->ijkl ', bbabba) * fac,d2_block_baba, rtol=0, atol=1.0e-9) + + # # Test RDM4 is antisymmetric + # "Testing that non Antiysmmetric parts are all zeros." + for i in range(0, wfn.nbasis * 2): + assert np.all(np.abs(rdm4[i, i, i, i, :, :, :]) < 1e-5) + assert np.all(np.abs(rdm4[:, :, :, i, i, i, i]) < 1e-5) + assert np.all(np.abs(rdm4[i, i, :, :, :, :, :, :]) < 1e-5) + assert np.all(np.abs(rdm4[:, :, :, :, :, :, i, i]) < 1e-5) + assert np.all(np.abs(rdm4[:, :, i, i, :, :, :, :]) < 1e-5) + assert np.all(np.abs(rdm4[:, :, :, :, i, i, :, :]) < 1e-5) + assert np.all(np.abs(rdm4[i, :, i, :, :, :, :, :]) < 1e-5) + assert np.all(np.abs(rdm4[:, :, :, :, :, i, :, i]) < 1e-5) + assert np.all(np.abs(rdm4[:, i, :, i, :, :, :, :]) < 1e-5) + assert np.all(np.abs(rdm4[:, :, :, :, i, :, i, :]) < 1e-5) + #TEST COMPLETE 4RDM AND BLOCKS TRACES + abbbabbb = rdm4[:ham.nbasis, ham.nbasis:, ham.nbasis:, ham.nbasis:, :ham.nbasis, ham.nbasis:, ham.nbasis:, ham.nbasis:] + baaabaaa = rdm4[ham.nbasis:, :ham.nbasis, :ham.nbasis, :ham.nbasis, ham.nbasis:, :ham.nbasis, :ham.nbasis, :ham.nbasis] + aaabaaab = rdm4[:ham.nbasis, :ham.nbasis, :ham.nbasis, ham.nbasis:, :ham.nbasis, :ham.nbasis, :ham.nbasis, ham.nbasis:] + bbbabbba = rdm4[ham.nbasis:, ham.nbasis:, ham.nbasis:, :ham.nbasis, ham.nbasis:, ham.nbasis:, ham.nbasis:, :ham.nbasis] + abababab = rdm4[:ham.nbasis, ham.nbasis:, :ham.nbasis, ham.nbasis:, :ham.nbasis, ham.nbasis:, :ham.nbasis, ham.nbasis:] + babababa = rdm4[ham.nbasis:, :ham.nbasis, ham.nbasis:, :ham.nbasis, ham.nbasis:, :ham.nbasis, ham.nbasis:, :ham.nbasis] + aaaaaaaa = rdm4[:ham.nbasis, :ham.nbasis, :ham.nbasis, :ham.nbasis, :ham.nbasis, :ham.nbasis, :ham.nbasis, :ham.nbasis] + bbbbbbbb = rdm4[ham.nbasis:, ham.nbasis:, ham.nbasis:, ham.nbasis:, ham.nbasis:, ham.nbasis:, ham.nbasis:, ham.nbasis:] + npt.assert_allclose(np.einsum('ijklijkl -> ', rdm4),(wfn.nocc_up * 2)*(wfn.nocc_up * 2 - 1) * (wfn.nocc_up * 2 - 2) * (wfn.nocc_up * 2 - 3) ,rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('ijklijkl -> ', abbbabbb),(wfn.nocc_up) * (wfn.nocc_dn) * (wfn.nocc_dn - 1) * (wfn.nocc_dn - 2) , rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('ijklijkl -> ', baaabaaa),(wfn.nocc_dn) * (wfn.nocc_up) * (wfn.nocc_up - 1) * (wfn.nocc_up - 2), rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('ijklijkl -> ', aaabaaab),(wfn.nocc_dn) * (wfn.nocc_up) * (wfn.nocc_up - 1) * (wfn.nocc_up - 2) , rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('ijklijkl -> ', bbbabbba),(wfn.nocc_up) * (wfn.nocc_dn) * (wfn.nocc_dn - 1) * (wfn.nocc_dn - 2) , rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('ijklijkl -> ', abababab),(wfn.nocc_up) * (wfn.nocc_dn) * (wfn.nocc_up - 1) * (wfn.nocc_dn - 1) , rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('ijklijkl -> ', babababa),(wfn.nocc_up) * (wfn.nocc_dn) * (wfn.nocc_up - 1) * (wfn.nocc_dn - 1) , rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('ijklijkl -> ', aaaaaaaa),(wfn.nocc_up)*(wfn.nocc_up - 1) * (wfn.nocc_up - 2) * (wfn.nocc_up - 3) , rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('ijklijkl -> ', bbbbbbbb),(wfn.nocc_dn)*(wfn.nocc_dn - 1) * (wfn.nocc_dn - 2) * (wfn.nocc_dn - 3), rtol=0, atol=1.0e-9) + + # # # BLOCK TRACES TESTS + # #ALL-ALPHA/BETA BLOCKS (only if wfn.nocc_up/wfn.nocc_up > 3 ) + # With the 3RDM + if(wfn.nocc_up > 3): + fac=1 / (wfn.nocc_up - 3) + npt.assert_allclose(np.einsum('pijkplmn ->ijklmn',aaaaaaaa)*fac, aaaaaa, rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('pijkplmn ->ijklmn',aaaaaaaa)*fac, aaaaaa, rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('ipjklpmn ->ijklmn',aaaaaaaa)*fac, aaaaaa, rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('ijpklmpn ->ijklmn',aaaaaaaa)*fac, aaaaaa, rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('ijkplmnp ->ijklmn',aaaaaaaa)*fac, aaaaaa, rtol=0, atol=1.0e-9) + fac=1 / (wfn.nocc_dn - 3) + npt.assert_allclose(np.einsum('pijkplmn ->ijklmn',bbbbbbbb)*fac, bbbbbb, rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('pijkplmn ->ijklmn',bbbbbbbb)*fac, bbbbbb, rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('ipjklpmn ->ijklmn',bbbbbbbb)*fac, bbbbbb, rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('ijpklmpn ->ijklmn',bbbbbbbb)*fac, bbbbbb, rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('ijkplmnp ->ijklmn',bbbbbbbb)*fac, bbbbbb, rtol=0, atol=1.0e-9) + #With 2RDMs + fac=1 / ((wfn.nocc_up - 3) * (wfn.nocc_up - 2)) + npt.assert_allclose(np.einsum('pqijpqkl ->ijkl',aaaaaaaa)*fac, d2_block_aaaa, rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('piqjpkql ->ijkl',aaaaaaaa)*fac, d2_block_aaaa, rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('ipqjkpql ->ijkl',aaaaaaaa)*fac, d2_block_aaaa, rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('ipjqkplq ->ijkl',aaaaaaaa)*fac, d2_block_aaaa, rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('pijqpklq ->ijkl',aaaaaaaa)*fac, d2_block_aaaa, rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('ijpqklpq ->ijkl',aaaaaaaa)*fac, d2_block_aaaa, rtol=0, atol=1.0e-9) + fac=1 / ((wfn.nocc_dn - 3) * (wfn.nocc_dn - 2)) + npt.assert_allclose(np.einsum('pqijpqkl ->ijkl',bbbbbbbb)*fac, d2_block_bbbb, rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('piqjpkql ->ijkl',bbbbbbbb)*fac, d2_block_aaaa, rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('piqjpkql ->ijkl',bbbbbbbb)*fac, d2_block_aaaa, rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('ipqjkpql ->ijkl',bbbbbbbb)*fac, d2_block_aaaa, rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('ipjqkplq ->ijkl',bbbbbbbb)*fac, d2_block_aaaa, rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('pijqpklq ->ijkl',bbbbbbbb)*fac, d2_block_aaaa, rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('ijpqklpq ->ijkl',bbbbbbbb)*fac, d2_block_aaaa, rtol=0, atol=1.0e-9) + + # #ABABABAB/BABABABA BLOCKS + #With the 3rdms + fac=1 / (wfn.nocc_dn - 1) + npt.assert_allclose(np.einsum('ipjklpmn ->ijklmn',abababab)*fac, aabaab, rtol=0, atol=1.0e-9) + fac=1 / (wfn.nocc_up -1) + npt.assert_allclose(np.einsum('ijpklmpn ->ijklmn',abababab)*fac, abbabb, rtol=0, atol=1.0e-9) + fac=1 / (wfn.nocc_up -1) + npt.assert_allclose(np.einsum('ipjklpmn ->ijklmn',babababa)*fac, bbabba, rtol=0, atol=1.0e-9) + fac=1 / (wfn.nocc_dn - 1) + npt.assert_allclose(np.einsum('ijpklmpn ->ijklmn',babababa)*fac, baabaa, rtol=0, atol=1.0e-9) + #With the 2rdms + fac=1 / ((wfn.nocc_up - 1) * (wfn.nocc_up - 1)) + npt.assert_allclose(np.einsum('pqijpqkl ->ijkl',abababab)*fac, d2_block_abab, rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('ipqjkpql ->ijkl',abababab)*fac, d2_block_abab, rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('ijpqklpq ->ijkl',abababab)*fac, d2_block_abab, rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('pqijpqkl ->ijkl',babababa)*fac, d2_block_baba, rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('ipqjkpql ->ijkl',babababa)*fac, d2_block_baba, rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('ijpqklpq ->ijkl',babababa)*fac, d2_block_baba, rtol=0, atol=1.0e-9) + fac=1 / ((wfn.nocc_up) * (wfn.nocc_up - 1)) + npt.assert_allclose(np.einsum('piqjpkql ->ijkl',abababab)*fac, d2_block_bbbb, rtol=0, atol=1.0e-9) + fac=1 / ((wfn.nocc_up - 1) * (wfn.nocc_dn - 1)) + npt.assert_allclose(np.einsum('pijqpklq ->ijkl',abababab)*fac, d2_block_baba, rtol=0, atol=1.0e-9) + fac=1 / ((wfn.nocc_dn) * (wfn.nocc_dn - 1)) + npt.assert_allclose(np.einsum('ipjqkplq ->ijkl',abababab)*fac, d2_block_aaaa, rtol=0, atol=1.0e-9) + fac=1 / ((wfn.nocc_dn) * (wfn.nocc_dn - 1)) + npt.assert_allclose(np.einsum('piqjpkql ->ijkl',babababa)*fac, d2_block_aaaa, rtol=0, atol=1.0e-9) + fac=1 / ((wfn.nocc_up - 1) * (wfn.nocc_dn - 1)) + npt.assert_allclose(np.einsum('pijqpklq ->ijkl',babababa)*fac, d2_block_abab, rtol=0, atol=1.0e-9) + fac=1 / ((wfn.nocc_up) * (wfn.nocc_up - 1)) + npt.assert_allclose(np.einsum('ipjqkplq ->ijkl',babababa)*fac, d2_block_bbbb, rtol=0, atol=1.0e-9) + + # AAABAAAB/BBBABBBA BLOCKS + #With the 3rdms + fac=1/(wfn.nocc_up-2) + npt.assert_allclose(np.einsum('pijkplmn ->ijklmn',aaabaaab)*fac, aabaab, rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('ipjklpmn ->ijklmn',aaabaaab)*fac, aabaab, rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('ijpklmpn ->ijklmn',aaabaaab)*fac, aabaab, rtol=0, atol=1.0e-9) + fac=1/(wfn.nocc_dn) + npt.assert_allclose(np.einsum('ijkplmnp ->ijklmn',aaabaaab)*fac, aaaaaa, rtol=0, atol=1.0e-9) + fac=1/(wfn.nocc_dn-2) + npt.assert_allclose(np.einsum('pijkplmn ->ijklmn',bbbabbba)*fac, bbabba, rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('ipjklpmn ->ijklmn',bbbabbba)*fac, bbabba, rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('ijpklmpn ->ijklmn',bbbabbba)*fac, bbabba, rtol=0, atol=1.0e-9) + fac=1/(wfn.nocc_up) + npt.assert_allclose(np.einsum('ijkplmnp ->ijklmn',bbbabbba)*fac, bbbbbb, rtol=0, atol=1.0e-9) + + #With the 2rdms + fac=1/((wfn.nocc_up-2)*(wfn.nocc_up-1)) + npt.assert_allclose(np.einsum('pqijpqkl ->ijkl',aaabaaab)*fac, d2_block_abab, rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('piqjpkql ->ijkl',aaabaaab)*fac, d2_block_abab, rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('ipqjkpql ->ijkl',aaabaaab)*fac, d2_block_abab, rtol=0, atol=1.0e-9) + fac=1/((wfn.nocc_dn-2)*(wfn.nocc_dn-1)) + npt.assert_allclose(np.einsum('pqijpqkl ->ijkl',bbbabbba)*fac, d2_block_baba, rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('piqjpkql ->ijkl',bbbabbba)*fac, d2_block_baba, rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('ipqjkpql ->ijkl',bbbabbba)*fac, d2_block_baba, rtol=0, atol=1.0e-9) + fac=1/((wfn.nocc_dn)*(wfn.nocc_up-2)) + npt.assert_allclose(np.einsum('ijpqklpq ->ijkl',aaabaaab)*fac, d2_block_aaaa, rtol=0, atol=1.0e-9) + fac=1/((wfn.nocc_up)*(wfn.nocc_dn-2)) + npt.assert_allclose(np.einsum('ijpqklpq ->ijkl',bbbabbba)*fac, d2_block_bbbb, rtol=0, atol=1.0e-9) + + # ABBBABBB/BAAABAAA BLOCKS + #With the 3rdms + fac=1 / (wfn.nocc_dn-2) + npt.assert_allclose(np.einsum('ipjklpmn ->ijklmn',abbbabbb)*fac, abbabb, rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('ijpklmpn ->ijklmn',abbbabbb)*fac, abbabb, rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('ijkplmnp ->ijklmn',abbbabbb)*fac, abbabb, rtol=0, atol=1.0e-9) + fac=1 / (wfn.nocc_up) + npt.assert_allclose(np.einsum('pijkplmn ->ijklmn',abbbabbb)*fac, bbbbbb, rtol=0, atol=1.0e-9) + fac=1 / (wfn.nocc_up-2) + npt.assert_allclose(np.einsum('ipjklpmn ->ijklmn',baaabaaa)*fac, baabaa, rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('ijpklmpn ->ijklmn',baaabaaa)*fac, baabaa, rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('ijkplmnp ->ijklmn',baaabaaa)*fac, baabaa, rtol=0, atol=1.0e-9) + fac=1 / (wfn.nocc_dn) + npt.assert_allclose(np.einsum('pijkplmn ->ijklmn',baaabaaa)*fac, aaaaaa, rtol=0, atol=1.0e-9) + + #With the 2rdms + fac=1 / ((wfn.nocc_dn - 2) * (wfn.nocc_up)) + npt.assert_allclose(np.einsum('pqijpqkl ->ijkl',abbbabbb)*fac, d2_block_bbbb, rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('piqjpkql ->ijkl',abbbabbb)*fac, d2_block_bbbb, rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('pijqpklq ->ijkl',abbbabbb)*fac, d2_block_bbbb, rtol=0, atol=1.0e-9) + fac=1 / ((wfn.nocc_dn - 2) * (wfn.nocc_dn - 1)) + npt.assert_allclose(np.einsum('ipqjkpql ->ijkl',abbbabbb)*fac, d2_block_abab, rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('ipjqkplq ->ijkl',abbbabbb)*fac, d2_block_abab, rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('ijpqklpq ->ijkl',abbbabbb)*fac, d2_block_abab, rtol=0, atol=1.0e-9) + fac=1 / ((wfn.nocc_up - 2) * (wfn.nocc_dn)) + npt.assert_allclose(np.einsum('pqijpqkl ->ijkl',baaabaaa)*fac, d2_block_aaaa, rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('piqjpkql ->ijkl',baaabaaa)*fac, d2_block_aaaa, rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('pijqpklq ->ijkl',baaabaaa)*fac, d2_block_aaaa, rtol=0, atol=1.0e-9) + fac=1 / ((wfn.nocc_up - 2) * (wfn.nocc_up - 1)) + npt.assert_allclose(np.einsum('ipqjkpql ->ijkl',baaabaaa)*fac, d2_block_baba, rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('ipjqkplq ->ijkl',baaabaaa)*fac, d2_block_baba, rtol=0, atol=1.0e-9) + npt.assert_allclose(np.einsum('ijpqklpq ->ijkl',baaabaaa)*fac, d2_block_baba, rtol=0, atol=1.0e-9) @pytest.mark.parametrize( diff --git a/pyci/utility.py b/pyci/utility.py index af7330e1..41c968ec 100644 --- a/pyci/utility.py +++ b/pyci/utility.py @@ -150,20 +150,28 @@ def spinize_rdms(d1, d2): return rdm1, rdm2 -def spinize_rdms_1234(d1, d2, d3, d4): +def spinize_rdms_1234(d1, d2, d3, d4, d5, d6, d7, flag='3RDM' ): r""" Convert the DOCI matrices or FullCI RDM spin-blocks to full, generalized RDMs. Parameters ---------- - .. math:: - d_0 = \left - .. math:: - d_2 = \left - .. math:: - d_3 = \left - .. math:: - d_4 = \left + d1 : numpy.ndarray + math: d_1 = \left + d2 : numpy.ndarray + math: d_2 = \left + d3 : numpy.ndarray + math: d_3 = \left + d4 : numpy.ndarray + math: d_4 = \left + d5 : numpy.ndarray + math: d_5 = \left + d6 : numpy.ndarray + math: d_6 = \left + d7 : numpy.ndarray + math: d_7 = \left + flag : ('3RDM' | '34RDM'), default='3RDM' + RDM selection Returns ------- rdm1 : numpy.ndarray @@ -172,6 +180,8 @@ def spinize_rdms_1234(d1, d2, d3, d4): Generalized two-particle RDM. rdm3 : numpy.ndarray Generalized three-particle RDM. + rdm4 : numpy.ndarray or None + Generalized four-particle RDM. """ if d1.ndim != 2: raise TypeError('wfn must be a DOCI') @@ -179,7 +189,7 @@ def spinize_rdms_1234(d1, d2, d3, d4): nspin = nbasis * 2 rdm1 = np.zeros((nspin, nspin), dtype=np.double) rdm2 = np.zeros((nspin, nspin, nspin, nspin), dtype=np.double) - rdm3 = np.zeros((nspin, nspin, nspin, nspin,nspin,nspin), dtype=np.double) + rdm4 = None aa = rdm1[:nbasis, :nbasis] bb = rdm1[nbasis:, nbasis:] aaaa = rdm2[:nbasis, :nbasis, :nbasis, :nbasis] @@ -188,10 +198,23 @@ def spinize_rdms_1234(d1, d2, d3, d4): baba = rdm2[nbasis:, :nbasis, nbasis:, :nbasis] abba = rdm2[:nbasis, nbasis:, nbasis:, :nbasis] baab = rdm2[nbasis:, :nbasis, :nbasis, nbasis:] - aaaaaa = rdm3[:nbasis,:nbasis,:nbasis,:nbasis,:nbasis,:nbasis] - bbbbbb = rdm3[nbasis:,nbasis:,nbasis:,nbasis:,nbasis:,nbasis:] - bbabba = rdm3[nbasis:,nbasis:,:nbasis,nbasis:,nbasis:,:nbasis] - aabaab = rdm3[:nbasis,:nbasis,nbasis:,:nbasis,:nbasis,nbasis:] + rdm3 = np.zeros((nspin, nspin, nspin, nspin,nspin,nspin), dtype=np.double) + aaaaaa = rdm3[:nbasis, :nbasis, :nbasis, :nbasis, :nbasis, :nbasis] + bbbbbb = rdm3[nbasis:, nbasis:, nbasis:, nbasis:, nbasis:, nbasis:] + bbabba = rdm3[nbasis:, nbasis:, :nbasis, nbasis:, nbasis:, :nbasis] + aabaab = rdm3[:nbasis, :nbasis, nbasis:, :nbasis, :nbasis, nbasis:] + abbabb = rdm3[:nbasis, nbasis:, nbasis:, :nbasis, nbasis:, nbasis:] + baabaa = rdm3[nbasis:, :nbasis, :nbasis, nbasis:, :nbasis, :nbasis] + if (flag =='34RDM') : + rdm4 = np.zeros((nspin, nspin, nspin, nspin, nspin, nspin, nspin, nspin), dtype=np.float64) + aaaaaaaa = rdm4[:nbasis, :nbasis, :nbasis, :nbasis, :nbasis, :nbasis, :nbasis, :nbasis] + bbbbbbbb = rdm4[nbasis:, nbasis:, nbasis:, nbasis:, nbasis:, nbasis:, nbasis:, nbasis:] + aaabaaab = rdm4[:nbasis, :nbasis, :nbasis, nbasis:, :nbasis, :nbasis, :nbasis, nbasis:] + bbbabbba = rdm4[nbasis:, nbasis:, nbasis:, :nbasis, nbasis:, nbasis:, nbasis:, :nbasis] + abbbabbb = rdm4[:nbasis, nbasis:, nbasis:, nbasis:, :nbasis, nbasis:, nbasis:, nbasis:] + baaabaaa = rdm4[nbasis:, :nbasis, :nbasis, :nbasis, nbasis:, :nbasis, :nbasis, :nbasis] + abababab = rdm4[:nbasis, nbasis:, :nbasis, nbasis:, :nbasis, nbasis:, :nbasis, nbasis:] + babababa = rdm4[nbasis:, :nbasis, nbasis:, :nbasis, nbasis:, :nbasis, nbasis:, :nbasis] for p in range(nbasis): aa[p, p] = d1[p, p] bb[p, p] = d1[p, p] @@ -202,31 +225,105 @@ def spinize_rdms_1234(d1, d2, d3, d4): bbbb[p, q, p, q] += d2[p, q] abab[p, q, p, q] += d2[p, q] baba[p, q, p, q] += d2[p, q] - bbabba[p, q, q, p, q, q] += 2.0 * d2[p, q] - aabaab[p, q, q, p, q, q] += 2.0 * d2[p, q] + bbabba[p, q, q, p, q, q] += d2[p, q] + aabaab[p, q, q, p, q, q] += d2[p, q] + abbabb[p, p, q, p, p, q] += d2[p, q] + baabaa[p, p, q, p, p, q] += d2[p, q] + if (flag == '34RDM') : + abababab[p, p, q, q, p, p, q, q] += d2[p, q] + babababa[q, q, p, p, q, q, p, p] += d2[p, q] for r in range(nbasis): - bbabba[p, q, q, p, r, r] += 2.0 * d4[p, q, r] - aabaab[p, q, q, p, r, r] += 2.0 * d4[p, q, r] + bbabba[p, q, q, p, r, r] += d4[p, q, r] + aabaab[p, q, q, p, r, r] += d4[p, q, r] + abbabb[q, q, p, r, r, p] += d4[p, q, r] + baabaa[q, q, p, r, r, p] += d4[p, q, r] aaaaaa[p, q, r, p, q, r] += d3[p, q, r] bbbbbb[p, q, r, p, q, r] += d3[p, q, r] bbabba[p, q, r, p, q, r] += d3[p, q, r] aabaab[p, q, r, p, q, r] += d3[p, q, r] + if (flag == '34RDM') : + abbbabbb[p, p, q, r, p, p, q, r] += 2*d3[p, q, r] + baaabaaa[p, p, q, r, p, p, q, r] += 2*d3[p, q, r] + aaabaaab[q, r, p, p, q, r, p, p] += d3[p, q, r] + bbbabbba[q, r, p, p, q, r, p, p] += d3[p, q, r] + abababab[p, p, q, r, p, p, q, r] += d3[p, q, r] + babababa[p, p, q, r, p, p, q, r] += d3[p, q, r] + abababab[q, r, p, p, q, r, p, p] += d3[p, q, r] + babababa[q, r, p, p, q, r, p, p] += d3[p, q, r] + abababab[p, p, q, q, p, p, r, r] += d4[p, q, r] + babababa[p, p, q, q, p, p, r, r] += d4[p, q, r] + abababab[q, q, p, p, r, r, p, p] += d4[p, q, r] + babababa[q, q, p, p, r, r, p, p] += d4[p, q, r] + for s in range(nbasis): + aaaaaaaa[p, q, r, s, p, q, r, s] += d5[p, q, r, s] + bbbbbbbb[p, q, r, s, p, q, r, s] += d5[p, q, r, s] + aaabaaab[p, q, r, s, p, q, r, s] += d5[p, q, r, s] + bbbabbba[p, q, r, s, p, q, r, s] += d5[p, q, r, s] + abababab[p, q, r, s, p, q, r, s] += d5[p, q, r, s] + aaabaaab[p, q, r, r, p, q, s, s] += 2*d6[p, q, r, s] + bbbabbba[p, q, r, r, p, q, s, s] += 2*d6[p, q, r, s] + abababab[p, q, r, r, p, q, s, s] += d6[p, q, r, s] + babababa[p, q, r, r, p, q, s, s] += d6[p, q, r, s] + abbbabbb[r, r, p, q, s, s, p, q] += d6[p, q, r, s] + baaabaaa[r, r, p, q, s, s, p, q] += d6[p, q, r, s] + abababab[r, r, p, q, s, s, p, q] += d6[p, q, r, s] + babababa[r, r, p, q, s, s, p, q] += d6[p, q, r, s] + abababab[p, p, q, q, r, r, s, s] += d7[p, q, r, s] rdm2 -= np.transpose(rdm2, axes=(1, 0, 2, 3)) rdm2 -= np.transpose(rdm2, axes=(0, 1, 3, 2)) rdm2 *= 0.5 - rdm3 += np.einsum('ijklmn -> ijknlm', rdm3)+\ - np.einsum('ijklmn -> ijkmnl', rdm3) + rdm3 += np.einsum('pqrstu -> pqrust', rdm3)+\ + np.einsum('pqrstu -> pqrtus', rdm3) rdm3 *= 1 - rdm3 -= np.einsum('ijklmn -> ijkmln', rdm3) - rdm3 += np.einsum('ijklmn -> kijlmn', rdm3)+\ - np.einsum('ijklmn -> jkilmn', rdm3) + rdm3 -= np.einsum('pqrstu -> pqrtsu', rdm3) + rdm3 += np.einsum('pqrstu -> rpqstu', rdm3)+\ + np.einsum('pqrstu -> qrpstu', rdm3) aaaaaa *= 1/3 bbbbbb *= 1/3 - rdm3 -= np.einsum('ijklmn -> jiklmn', rdm3) + rdm3 -= np.einsum('pqrstu -> qprstu', rdm3) rdm3 *= 0.5 - return rdm1, rdm2, rdm3 - -def spin_free_rdms(d1, d2, d3=None, d4=None): + if (flag == '34RDM') : + aaaaaaaa *= 1/12 + bbbbbbbb *= 1/12 + aaabaaab *= 1/3 + bbbabbba *= 1/3 + abbbabbb *= 1/3 + baaabaaa *= 1/3 + abababab *= 1/2 + babababa *= 1/2 + rdm4_copy=np.copy(rdm4) + rdm4 += np.einsum('pqrstuvw -> pqrstwuv', rdm4_copy) + rdm4 += np.einsum('pqrstuvw -> pqrstvwu', rdm4_copy) + rdm4 += np.einsum('pqrstuvw -> pqrsutwv', rdm4_copy) + rdm4 += np.einsum('pqrstuvw -> pqrsuvtw', rdm4_copy) + rdm4 += np.einsum('pqrstuvw -> pqrsuwvt', rdm4_copy) + rdm4 += np.einsum('pqrstuvw -> pqrsvtuw', rdm4_copy) + rdm4 += np.einsum('pqrstuvw -> pqrsvwtu', rdm4_copy) + rdm4 += np.einsum('pqrstuvw -> pqrsvuwt', rdm4_copy) + rdm4 += np.einsum('pqrstuvw -> pqrswtvu', rdm4_copy) + rdm4 += np.einsum('pqrstuvw -> pqrswutv', rdm4_copy) + rdm4 += np.einsum('pqrstuvw -> pqrswvut', rdm4_copy) + rdm4 *=1 + del rdm4_copy + rdm4 -= np.einsum('pqrstuvw -> pqrsutvw', rdm4) + rdm4_copy=np.copy(rdm4) + rdm4 += np.einsum('pqrstuvw -> psqrtuvw', rdm4_copy) + rdm4 += np.einsum('pqrstuvw -> prsqtuvw', rdm4_copy) + rdm4 += np.einsum('pqrstuvw -> qpsrtuvw', rdm4_copy) + rdm4 += np.einsum('pqrstuvw -> qrpstuvw', rdm4_copy) + rdm4 += np.einsum('pqrstuvw -> qsrptuvw', rdm4_copy) + rdm4 += np.einsum('pqrstuvw -> rpqstuvw', rdm4_copy) + rdm4 += np.einsum('pqrstuvw -> rspqtuvw', rdm4_copy) + rdm4 += np.einsum('pqrstuvw -> rqsptuvw', rdm4_copy) + rdm4 += np.einsum('pqrstuvw -> sprqtuvw', rdm4_copy) + rdm4 += np.einsum('pqrstuvw -> sqprtuvw', rdm4_copy) + rdm4 += np.einsum('pqrstuvw -> srqptuvw', rdm4_copy) + del rdm4_copy + rdm4 -= np.einsum('pqrstuvw -> qprstuvw', rdm4) + rdm4 *= 0.5 + return rdm1, rdm2, rdm3, rdm4 + +def spin_free_rdms(d1, d2, d3=None, d4=None, d5=None, d6=None, d7=None, flag= '3RDM'): r""" Wrapper of spinze_rdms function that sums over the spin degree of freedom @@ -235,15 +332,22 @@ def spin_free_rdms(d1, d2, d3=None, d4=None): Parameters ---------- d1 : numpy.ndarray - :math:`D_0` matrix or FullCI 1-RDM spin-blocks. + math: d_1 = \left d2 : numpy.ndarray - :math:`D_2` matrix or FullCI 2-RDM spin-blocks. - d3 : numpy.ndarray - :math `D_3` matrix for 3-RDM spin-blocks - d4 : numpy.ndarray - :math `D_4` matrix for 3-RDM spin-blocks - - Returns + math: d_2 = \left + d3 : numpy.ndarray, default = None + math: d_3 = \left + d4 : numpy.ndarray, default = None + math: d_4 = \left + d5 : numpy.ndarray, default = None + math: d_5 = \left + d6 : numpy.ndarray, default = None + math: d_6 = \left + d7 : numpy.ndarray, default = None + math: d_7 = \left + flag : ('3RDM' | '34RDM'), default='3RDM' + RDM selection + Returns ------- rdm1 : numpy.ndarray Spin traced one-particle RDM. @@ -251,21 +355,23 @@ def spin_free_rdms(d1, d2, d3=None, d4=None): Spin traced two-particle RDM. rdm3 : numpy.ndarray Spin traced three-particle RDM. + rdm4 : numpy.ndarray or None + Spin traced four-particle RDM. """ nbasis = d1.shape[1] - rdm1, rdm2, rdm3 = spinize_rdms_1234(d1, d2, d3, d4) - rdm1_sf = np.zeros((nbasis, nbasis), dtype=np.double) - rdm2_sf = np.zeros((nbasis, nbasis, nbasis, nbasis), dtype=np.double) - rdm3_sf = np.zeros((nbasis, nbasis, nbasis, nbasis, nbasis, nbasis), dtype=np.double) - aa = rdm1[:nbasis, :nbasis] - bb = rdm1[nbasis:, nbasis:] - aaaa = rdm2[:nbasis, :nbasis, :nbasis, :nbasis] - bbbb = rdm2[nbasis:, nbasis:, nbasis:, nbasis:] - abab = rdm2[:nbasis, nbasis:, :nbasis, nbasis:] - baba = rdm2[nbasis:, :nbasis, nbasis:, :nbasis] if d1.ndim == 2: # DOCI matrices - rdm3_sf=np.zeros((nbasis, nbasis, nbasis, nbasis,nbasis,nbasis), dtype=np.double) + rdm1_sf = np.zeros((nbasis, nbasis), dtype=np.double) + rdm2_sf = np.zeros((nbasis, nbasis, nbasis, nbasis), dtype=np.double) + rdm3_sf = np.zeros((nbasis, nbasis, nbasis, nbasis, nbasis, nbasis), dtype=np.double) + rdm4_sf = None + rdm1, rdm2, rdm3, rdm4 = spinize_rdms_1234(d1, d2, d3, d4, d5, d6, d7, flag) + aa = rdm1[:nbasis, :nbasis] + bb = rdm1[nbasis:, nbasis:] + aaaa = rdm2[:nbasis, :nbasis, :nbasis, :nbasis] + bbbb = rdm2[nbasis:, nbasis:, nbasis:, nbasis:] + abab = rdm2[:nbasis, nbasis:, :nbasis, nbasis:] + baba = rdm2[nbasis:, :nbasis, nbasis:, :nbasis] aaaaaa= rdm3[:nbasis, :nbasis, :nbasis, :nbasis, :nbasis, :nbasis] bbbbbb= rdm3[nbasis:, nbasis:, nbasis:, nbasis:, nbasis:, nbasis:] bbabba= rdm3[nbasis:, nbasis:, :nbasis, nbasis:, nbasis:, :nbasis] @@ -274,12 +380,43 @@ def spin_free_rdms(d1, d2, d3=None, d4=None): aabaab = rdm3[:nbasis, :nbasis, nbasis:, :nbasis, :nbasis, nbasis:] abaaba = rdm3[:nbasis, nbasis:, :nbasis, :nbasis, nbasis:, :nbasis] baabaa = rdm3[nbasis:, :nbasis, :nbasis, nbasis:, :nbasis, :nbasis] + if (flag == '34RDM') : + rdm4_sf=np.zeros((nbasis, nbasis, nbasis, nbasis, nbasis, nbasis, nbasis, nbasis), dtype=np.double) + aaaaaaaa = rdm4[:nbasis, :nbasis, :nbasis, :nbasis, :nbasis, :nbasis, :nbasis, :nbasis] + bbbbbbbb = rdm4[nbasis:, nbasis:, nbasis:, nbasis:, nbasis:, nbasis:, nbasis:, nbasis:] + aaabaaab = rdm4[:nbasis, :nbasis, :nbasis, nbasis:, :nbasis, :nbasis, :nbasis, nbasis:] + bbbabbba = rdm4[nbasis:, nbasis:, nbasis:, :nbasis, nbasis:, nbasis:, nbasis:, :nbasis] + abbbabbb = rdm4[:nbasis, nbasis:, nbasis:, nbasis:, :nbasis, nbasis:, nbasis:, nbasis:] + baaabaaa = rdm4[nbasis:, :nbasis, :nbasis, :nbasis, nbasis:, :nbasis, :nbasis, :nbasis] + abababab = rdm4[:nbasis, nbasis:, :nbasis, nbasis:, :nbasis, nbasis:, :nbasis, nbasis:] + babababa = rdm4[nbasis:, :nbasis, nbasis:, :nbasis, nbasis:, :nbasis, nbasis:, :nbasis] + aabaaaba = rdm4[:nbasis, :nbasis, nbasis:, :nbasis, :nbasis, :nbasis, nbasis:, :nbasis] + bbabbbab = rdm4[nbasis:, nbasis:, :nbasis, nbasis:, nbasis:, nbasis:, :nbasis, nbasis:] + aabbaabb = rdm4[:nbasis, :nbasis, nbasis:, nbasis:, :nbasis, :nbasis, nbasis:, nbasis:] + bbaabbaa = rdm4[nbasis:, nbasis:, :nbasis, :nbasis, nbasis:, nbasis:, :nbasis, :nbasis] + abaaabaa = rdm4[:nbasis, nbasis:, :nbasis, :nbasis, :nbasis, nbasis:, :nbasis, :nbasis] + babbbabb = rdm4[nbasis:, :nbasis, nbasis:, nbasis:, nbasis:, :nbasis, nbasis:, nbasis:] + abbaabba = rdm4[:nbasis, nbasis:, nbasis:, :nbasis, :nbasis, nbasis:, nbasis:, :nbasis] + baabbaab = rdm4[nbasis:, :nbasis, :nbasis, nbasis:, nbasis:, :nbasis, :nbasis, nbasis:] rdm1_sf = aa + bb rdm2_sf = aaaa + abab+ baba+ bbbb rdm3_sf = aaaaaa + bbbbbb + aabaab + abaaba + baabaa + bbabba + babbab + abbabb - return (rdm1_sf, rdm2_sf, rdm3_sf) + if (flag == '34RDM') : + rdm4_sf = aaaaaaaa + bbbbbbbb + aaabaaab + bbbabbba + abbbabbb + abbbabbb +baaabaaa \ + + abababab + babababa + aabaaaba + bbabbbab + aabbaabb + bbaabbaa + abaaabaa + babbbabb \ + + abbaabba + baabbaab + return (rdm1_sf, rdm2_sf, rdm3_sf, rdm4_sf) else: # FullCI RDM spin-blocks + rdm1_sf = np.zeros((nbasis, nbasis), dtype=np.double) + rdm2_sf = np.zeros((nbasis, nbasis, nbasis, nbasis), dtype=np.double) + rdm1, rdm2 = spinize_rdms(d1, d2) + aa = rdm1[:nbasis, :nbasis] + bb = rdm1[nbasis:, nbasis:] + aaaa = rdm2[:nbasis, :nbasis, :nbasis, :nbasis] + bbbb = rdm2[nbasis:, nbasis:, nbasis:, nbasis:] + abab = rdm2[:nbasis, nbasis:, :nbasis, nbasis:] + baba = rdm2[nbasis:, :nbasis, nbasis:, :nbasis] rdm1_sf = aa + bb rdm2_sf = aaaa + abab + baba + bbbb return (rdm1_sf, rdm2_sf)