Loading src/Engine/DimensionSrep.h +25 −1 Original line number Diff line number Diff line Loading @@ -23,6 +23,10 @@ public: { dStoSymm(symmLocal_.qOne().size()); alterFrees(symmLocal_.qOne().size()); const bool mpsMode = (dsrep_(0).fullName()[0] == 'a'); if (mpsMode) alterSummedMPS(); else alterSummed(); } Loading Loading @@ -73,6 +77,26 @@ private: dsrep_.refresh(); } void alterSummedMPS() { for (SizeType i = 0; i < dsrep_.size(); ++i) { TensorStanzaType ts = dsrep_(i); if (ts.type() == TensorStanzaType::TENSOR_TYPE_ERASED) continue; const SizeType legs = ts.legs(); for (SizeType j = 0; j < legs; ++j) { TensorStanzaType::IndexTypeEnum t = ts.legType(j); if (t != TensorStanzaType::INDEX_TYPE_SUMMED) continue; dsrep_.legTypeChar(i, j) = 'D'; dsrep_.legTag(i, j) = m_; } } dsrep_.refresh(); } void alterSummed() { for (SizeType i = 0; i < dsrep_.size(); ++i) { Loading src/Engine/MeraSolver.h +13 −9 Original line number Diff line number Diff line Loading @@ -64,7 +64,6 @@ public: isMeraPeriodic_(false), iterMera_(1), iterTensor_(1), indexOfRootTensor_(0), nameToIndexLut_(0), model_(paramsForMera_.model, paramsForMera_.hamiltonianConnection), paramsForLanczos_(0) Loading Loading @@ -110,6 +109,7 @@ public: nameToIndexLut_ = new NameToIndexLut<TensorType>(tensors_); bool rootTensorFound = false; bool mpsMode = false; while (true) { PsimagLite::String str(""); try { Loading Loading @@ -149,9 +149,11 @@ public: continue; } if (name != "u" && name != "w" && name != "r") if (name != "u" && name != "w" && name != "r" && name != "a") continue; if (name == "a") mpsMode = true; SizeType id = atoi(tokens[1].c_str()); tensorOptimizer_.push_back(new TensorOptimizerType(io, name, Loading @@ -162,14 +164,12 @@ public: paramsForMera_, symmLocal_)); if (name == "r") { if (rootTensorFound) { if (name == "r" || name == "a") { if (rootTensorFound && !mpsMode) { PsimagLite::String msg("FATAL: File " + filename); throw PsimagLite::RuntimeError(msg + " more than one root found\n"); } assert(tensorOptimizer_.size() > 0); indexOfRootTensor_ = tensorOptimizer_.size() - 1; rootTensorFound = true; } } Loading Loading @@ -233,13 +233,13 @@ private: SizeType id = tensorOptimizer_[i]->nameId().second; SizeType firstOfLayer = tensorOptimizer_[i]->firstOfLayer(); if (optimizeOnlyFirstOfLayer && firstOfLayer != id && name != "r") { if (optimizeOnlyFirstOfLayer && firstOfLayer != id && !isRootTensor(name)) { tensorOptimizer_[i]->copyFirstOfLayer(name, firstOfLayer); continue; } if (!seenRoot) { if (name != "r") if (!isRootTensor(name)) continue; else seenRoot = true; Loading @@ -265,6 +265,11 @@ private: } } static bool isRootTensor(PsimagLite::String name) { return (name == "a" || name == "r"); } class ParallelEnergyHelper { public: Loading Loading @@ -447,7 +452,6 @@ private: bool isMeraPeriodic_; SizeType iterMera_; SizeType iterTensor_; SizeType indexOfRootTensor_; VectorTensorType tensors_; NameToIndexLut<TensorType>* nameToIndexLut_; ModelType model_; Loading src/Engine/TensorOptimizer.h +9 −4 Original line number Diff line number Diff line Loading @@ -142,7 +142,7 @@ public: for (SizeType iter = 0; iter < iters; ++iter) { RealType e = optimizeInternal(iter, upIter, evaluator); if (tensorToOptimize_.first == "r") { if (isRootTensor(tensorToOptimize_.first)) { std::cout<<"energy="<<e<<"\n"; break; } Loading Loading @@ -269,7 +269,7 @@ private: MatrixType m = parallelEnvironHelper.matrix(); MatrixType mSrc = m; VectorRealType s(m.n_row(),0); if (tensorToOptimize_.first == "r") { // diagonalize if (isRootTensor(tensorToOptimize_.first)) { // diagonalize std::cout<<"MATRIX_MAY_FOLLOW\n"; if (!isHermitian(m,true)) { if (m.n_row() < 512) std::cout<<m; Loading Loading @@ -359,7 +359,7 @@ private: void topTensorFoldVector(MatrixType& t, const MatrixType& eigenvector) const { assert(tensorToOptimize_.first == "r"); assert(isRootTensor(tensorToOptimize_.first)); SizeType rows = t.n_row(); SizeType cols = t.n_col(); for (SizeType i = 0; i < rows; ++i) Loading @@ -370,7 +370,7 @@ private: void lanczosDiag(MatrixType& t, VectorRealType& s, const MatrixType& src) const { SizeType n = src.n_row(); assert(tensorToOptimize_.first == "r"); assert(isRootTensor(tensorToOptimize_.first)); SizeType rows = t.n_row(); SizeType cols = t.n_col(); assert(n == rows*cols); Loading Loading @@ -418,6 +418,11 @@ private: return sum; } static bool isRootTensor(PsimagLite::String name) { return (name == "a" || name == "r"); } TensorOptimizer(const TensorOptimizer&); TensorOptimizer& operator=(const TensorOptimizer&); Loading Loading
src/Engine/DimensionSrep.h +25 −1 Original line number Diff line number Diff line Loading @@ -23,6 +23,10 @@ public: { dStoSymm(symmLocal_.qOne().size()); alterFrees(symmLocal_.qOne().size()); const bool mpsMode = (dsrep_(0).fullName()[0] == 'a'); if (mpsMode) alterSummedMPS(); else alterSummed(); } Loading Loading @@ -73,6 +77,26 @@ private: dsrep_.refresh(); } void alterSummedMPS() { for (SizeType i = 0; i < dsrep_.size(); ++i) { TensorStanzaType ts = dsrep_(i); if (ts.type() == TensorStanzaType::TENSOR_TYPE_ERASED) continue; const SizeType legs = ts.legs(); for (SizeType j = 0; j < legs; ++j) { TensorStanzaType::IndexTypeEnum t = ts.legType(j); if (t != TensorStanzaType::INDEX_TYPE_SUMMED) continue; dsrep_.legTypeChar(i, j) = 'D'; dsrep_.legTag(i, j) = m_; } } dsrep_.refresh(); } void alterSummed() { for (SizeType i = 0; i < dsrep_.size(); ++i) { Loading
src/Engine/MeraSolver.h +13 −9 Original line number Diff line number Diff line Loading @@ -64,7 +64,6 @@ public: isMeraPeriodic_(false), iterMera_(1), iterTensor_(1), indexOfRootTensor_(0), nameToIndexLut_(0), model_(paramsForMera_.model, paramsForMera_.hamiltonianConnection), paramsForLanczos_(0) Loading Loading @@ -110,6 +109,7 @@ public: nameToIndexLut_ = new NameToIndexLut<TensorType>(tensors_); bool rootTensorFound = false; bool mpsMode = false; while (true) { PsimagLite::String str(""); try { Loading Loading @@ -149,9 +149,11 @@ public: continue; } if (name != "u" && name != "w" && name != "r") if (name != "u" && name != "w" && name != "r" && name != "a") continue; if (name == "a") mpsMode = true; SizeType id = atoi(tokens[1].c_str()); tensorOptimizer_.push_back(new TensorOptimizerType(io, name, Loading @@ -162,14 +164,12 @@ public: paramsForMera_, symmLocal_)); if (name == "r") { if (rootTensorFound) { if (name == "r" || name == "a") { if (rootTensorFound && !mpsMode) { PsimagLite::String msg("FATAL: File " + filename); throw PsimagLite::RuntimeError(msg + " more than one root found\n"); } assert(tensorOptimizer_.size() > 0); indexOfRootTensor_ = tensorOptimizer_.size() - 1; rootTensorFound = true; } } Loading Loading @@ -233,13 +233,13 @@ private: SizeType id = tensorOptimizer_[i]->nameId().second; SizeType firstOfLayer = tensorOptimizer_[i]->firstOfLayer(); if (optimizeOnlyFirstOfLayer && firstOfLayer != id && name != "r") { if (optimizeOnlyFirstOfLayer && firstOfLayer != id && !isRootTensor(name)) { tensorOptimizer_[i]->copyFirstOfLayer(name, firstOfLayer); continue; } if (!seenRoot) { if (name != "r") if (!isRootTensor(name)) continue; else seenRoot = true; Loading @@ -265,6 +265,11 @@ private: } } static bool isRootTensor(PsimagLite::String name) { return (name == "a" || name == "r"); } class ParallelEnergyHelper { public: Loading Loading @@ -447,7 +452,6 @@ private: bool isMeraPeriodic_; SizeType iterMera_; SizeType iterTensor_; SizeType indexOfRootTensor_; VectorTensorType tensors_; NameToIndexLut<TensorType>* nameToIndexLut_; ModelType model_; Loading
src/Engine/TensorOptimizer.h +9 −4 Original line number Diff line number Diff line Loading @@ -142,7 +142,7 @@ public: for (SizeType iter = 0; iter < iters; ++iter) { RealType e = optimizeInternal(iter, upIter, evaluator); if (tensorToOptimize_.first == "r") { if (isRootTensor(tensorToOptimize_.first)) { std::cout<<"energy="<<e<<"\n"; break; } Loading Loading @@ -269,7 +269,7 @@ private: MatrixType m = parallelEnvironHelper.matrix(); MatrixType mSrc = m; VectorRealType s(m.n_row(),0); if (tensorToOptimize_.first == "r") { // diagonalize if (isRootTensor(tensorToOptimize_.first)) { // diagonalize std::cout<<"MATRIX_MAY_FOLLOW\n"; if (!isHermitian(m,true)) { if (m.n_row() < 512) std::cout<<m; Loading Loading @@ -359,7 +359,7 @@ private: void topTensorFoldVector(MatrixType& t, const MatrixType& eigenvector) const { assert(tensorToOptimize_.first == "r"); assert(isRootTensor(tensorToOptimize_.first)); SizeType rows = t.n_row(); SizeType cols = t.n_col(); for (SizeType i = 0; i < rows; ++i) Loading @@ -370,7 +370,7 @@ private: void lanczosDiag(MatrixType& t, VectorRealType& s, const MatrixType& src) const { SizeType n = src.n_row(); assert(tensorToOptimize_.first == "r"); assert(isRootTensor(tensorToOptimize_.first)); SizeType rows = t.n_row(); SizeType cols = t.n_col(); assert(n == rows*cols); Loading Loading @@ -418,6 +418,11 @@ private: return sum; } static bool isRootTensor(PsimagLite::String name) { return (name == "a" || name == "r"); } TensorOptimizer(const TensorOptimizer&); TensorOptimizer& operator=(const TensorOptimizer&); Loading