Loading src/Engine/Tensor.h +68 −9 Original line number Diff line number Diff line Loading @@ -21,7 +21,9 @@ along with MERA++. If not, see <http://www.gnu.org/licenses/>. #include "ProgramGlobals.h" #include "Matrix.h" #include "RandomForTests.h" #ifdef USE_EXATN #include "exatn.hpp" #endif namespace Mera { Loading @@ -35,17 +37,28 @@ public: typedef PsimagLite::Vector<SizeType>::Type VectorSizeType; typedef typename PsimagLite::Vector<ComplexOrRealType>::Type VectorComplexOrRealType; Tensor(SizeType dim0, SizeType ins) : dimensions_(1,dim0),data_(dim0,0.0),ins_(ins) {} // Tensor with only one dimension Tensor(PsimagLite::String name, SizeType dim0, SizeType ins) : name_(name), dimensions_(1, dim0), ins_(ins) { if (hasExatnBackend_) { return; } data_.resize(dim0, 0.0); } Tensor(const VectorSizeType& d, SizeType ins) : dimensions_(d),ins_(ins) Tensor(PsimagLite::String name, const VectorSizeType& d, SizeType ins) : name_(name), dimensions_(d),ins_(ins) { SizeType n = dimensions_.size(); if (n == 0) return; assert(0 < n); if (hasExatnBackend_) { return; } data_.resize(volume(), 0.0); } Loading @@ -67,6 +80,10 @@ public: for (SizeType i = ins; i < dimensions_.size(); ++i) douts *= dimensions_[i]; if (hasExatnBackend_) { return; } for (SizeType x = 0; x < dins; ++x) if (x < douts) data_[x + x*dins] = value; Loading @@ -74,6 +91,10 @@ public: void setToRandom() { if (hasExatnBackend_) { return; } SizeType n = data_.size(); ComplexOrRealType sum = 0.0; for (SizeType i = 0; i < n; ++i) { Loading @@ -91,6 +112,10 @@ public: void setToConstant(ComplexOrRealType value) { if (hasExatnBackend_) { return; } // use std:: function here instead of loop, FIXME SizeType n = data_.size(); for (SizeType i = 0; i < n; ++i) Loading @@ -101,6 +126,11 @@ public: { if (ins_ == 0) return; if (dimensions_.size() < ins_) return; if (hasExatnBackend_) { return; } if (dimensions_.size() == ins_) { SizeType rows = m.n_row(); SizeType cols = m.n_col(); Loading Loading @@ -132,6 +162,11 @@ public: SizeType v = volume(); if (v == 0) throw PsimagLite::RuntimeError("Tensor::setSizes(...): dimensions == 0\n"); if (hasExatnBackend_) { return; } data_.resize(v,0.0); } Loading Loading @@ -167,6 +202,10 @@ public: const ComplexOrRealType& operator()(const VectorSizeType& args) const { if (hasExatnBackend_) { return data_[0]; } SizeType index = pack(args); assert(index < data_.size()); return data_[index]; Loading @@ -175,6 +214,10 @@ public: // FIXME: GIVES AWAY INTERNALS!! ComplexOrRealType& operator()(const VectorSizeType& args) { if (hasExatnBackend_) { return data_[0]; } SizeType index = pack(args); assert(index < data_.size()); return data_[index]; Loading @@ -197,15 +240,29 @@ public: return index; } const VectorComplexOrRealType& data() const { return data_; } const VectorComplexOrRealType& data() const { return data_; } // FIXME: GIVES AWAY INTERNALS!! VectorComplexOrRealType& data() { return data_; } void setData(const VectorComplexOrRealType& data) { data_ = data; } PsimagLite::String name() const { return name_; } private: #ifdef USE_EXATN static const bool hasExatnBackend_ = true; static exatn::numerics::TensorOpFactory* opFactory_; #else static const bool hasExatnBackend_ = false; #endif static PsimagLite::RandomForTests<ComplexOrRealType> rng_; PsimagLite::String name_; VectorSizeType dimensions_; VectorComplexOrRealType data_; SizeType ins_; Loading @@ -214,8 +271,10 @@ private: template<typename ComplexOrRealType> PsimagLite::RandomForTests<ComplexOrRealType> Tensor<ComplexOrRealType>::rng_(1234); #ifdef USE_EXATN template<typename ComplexOrRealType> exatn::numerics::TensorOpFactory* Tensor<ComplexOrRealType>::opFactory_ = exatn::numerics::TensorOpFactory::get(); #endif } #endif // TENSOR_H src/Engine/TensorEvalBase.h +12 −14 Original line number Diff line number Diff line Loading @@ -43,20 +43,18 @@ public: virtual void printResult(std::ostream& os) const = 0; static SizeType indexOfOutputTensor(const SrepStatementType& eq, const VectorPairStringSizeType& tensorNameIds, MapPairStringSizeType& nameIdsTensor) { SizeType ret = nameIdsTensor[eq.nameIdOfOutput()]; if (tensorNameIds[ret] != eq.nameIdOfOutput()) { PsimagLite::String msg("TensorEvalBase: Could not find "); msg += "output tensor " + eq.nameIdOfOutput().first; msg += ttos(eq.nameIdOfOutput().second) + "\n"; throw PsimagLite::RuntimeError(msg); } return ret; } // static SizeType indexOfOutputTensor(const SrepStatementType& eq) // { // SizeType ret = nameIdsTensor[eq.nameIdOfOutput()]; // if (tensorNameIds[ret] != eq.nameIdOfOutput()) { // PsimagLite::String msg("TensorEvalBase: Could not find "); // msg += "output tensor " + eq.nameIdOfOutput().first; // msg += ttos(eq.nameIdOfOutput().second) + "\n"; // throw PsimagLite::RuntimeError(msg); // } // return ret; // } }; } // namespace Mera #endif // TENSOREVALBASE_H src/Engine/TensorEvalNew.h +1 −3 Original line number Diff line number Diff line Loading @@ -37,9 +37,7 @@ class TensorEvalNew : public TensorEvalBase<ComplexOrRealType> { public: TensorEvalNew(const SrepStatementType& tSrep, const VectorTensorType& vt, const VectorPairStringSizeType& tensorNameIds, MapPairStringSizeType& nameIdsTensor) const VectorTensorType& vt) {} HandleType operator()() Loading src/Engine/TensorEvalSlow.h +10 −25 Original line number Diff line number Diff line Loading @@ -54,20 +54,15 @@ public: TensorEvalSlow(const SrepStatementType& tSrep, const VectorTensorType& vt, const VectorPairStringSizeType& tensorNameIds, MapPairStringSizeType& nameIdsTensor, SymmetryLocalType* symmLocal, bool modify = EVAL_BREAKUP) : srepStatement_(tSrep), data_(vt), // deep copy tensorNameIds_(tensorNameIds), // deep copy nameIdsTensor_(nameIdsTensor), // deep copy symmLocal_(symmLocal), modify_(modify) { indexOfOutputTensor_ = TensorEvalBaseType::indexOfOutputTensor(tSrep, tensorNameIds, nameIdsTensor); indexOfOutputTensor_ = idNameToIndex(tSrep.nameIdOfOutput().first, tSrep.nameIdOfOutput().second); if (!modify_) return; Loading @@ -90,17 +85,11 @@ public: } if (temporaryName[0] != 't') continue; PsimagLite::String str = temporaryName.substr(1,temporaryName.length()); SizeType temporaryId = atoi(str.c_str()); temporaryName = "t"; PairStringSizeType tmpPair = PairStringSizeType(temporaryName,temporaryId); tensorNameIds_.push_back(tmpPair); nameIdsTensor_[tmpPair] = tensorNameIds_.size() - 1; // add this temporary, call setDimensions for output tensor later TensorStanza tmpStanza(vstr[i]); VectorSizeType args(1,1); // bogus TensorType* t = new TensorType(args, tmpStanza.ins()); TensorType* t = new TensorType(temporaryName, args, tmpStanza.ins()); garbage_.push_back(t); data_.push_back(t); } Loading @@ -116,8 +105,6 @@ public: TensorEvalSlow tEval(*(veqs[j]), data_, tensorNameIds_, nameIdsTensor_, symmLocal_, false); Loading Loading @@ -612,18 +599,18 @@ private: SizeType idNameToIndex(PsimagLite::String name, SizeType id) const { typename MapPairStringSizeType::iterator it = nameIdsTensor_.find(PairStringSizeType(name,id)); if (it == nameIdsTensor_.end()) PsimagLite::String fullId = name + ttos(id); for (SizeType i = 0; i < data_.size(); ++i) if (fullId == data_[i]->name()) return i; throw PsimagLite::RuntimeError("idNameToIndex: key not found\n"); return it->second; } void setQnsForOutput(VectorVectorSizeType& q) { // remap tensor indexing into symm local indexing PairStringSizeType p = tensorNameIds_[indexOfOutputTensor_]; PsimagLite::String str = p.first + ttos(p.second); PsimagLite::String str = data_[indexOfOutputTensor_]->name(); SizeType legs = srepStatement_.lhs().legs(); VectorSizeType v(legs, 0); Loading Loading @@ -659,8 +646,6 @@ private: SrepStatementType srepStatement_; VectorTensorType data_; VectorPairStringSizeType tensorNameIds_; mutable MapPairStringSizeType nameIdsTensor_; SymmetryLocalType* symmLocal_; bool modify_; SizeType indexOfOutputTensor_; Loading src/Engine/TensorOptimizer.h +2 −2 Original line number Diff line number Diff line Loading @@ -215,7 +215,7 @@ public: { if (stack_.size() == 0) throw PsimagLite::RuntimeError("restoreTensor: stack is empty\n"); tensors_[indToOptimize_]->data() = stack_.top(); tensors_[indToOptimize_]->setData(stack_.top()); stack_.pop(); } Loading @@ -224,7 +224,7 @@ public: void copyFirstOfLayer(PsimagLite::String name, SizeType id) { SizeType ind = nameIdsTensor_[PairStringSizeType(name, id)]; tensors_[indToOptimize_]->data() = tensors_[ind]->data(); tensors_[indToOptimize_]->setData(tensors_[ind]->data()); } private: Loading Loading
src/Engine/Tensor.h +68 −9 Original line number Diff line number Diff line Loading @@ -21,7 +21,9 @@ along with MERA++. If not, see <http://www.gnu.org/licenses/>. #include "ProgramGlobals.h" #include "Matrix.h" #include "RandomForTests.h" #ifdef USE_EXATN #include "exatn.hpp" #endif namespace Mera { Loading @@ -35,17 +37,28 @@ public: typedef PsimagLite::Vector<SizeType>::Type VectorSizeType; typedef typename PsimagLite::Vector<ComplexOrRealType>::Type VectorComplexOrRealType; Tensor(SizeType dim0, SizeType ins) : dimensions_(1,dim0),data_(dim0,0.0),ins_(ins) {} // Tensor with only one dimension Tensor(PsimagLite::String name, SizeType dim0, SizeType ins) : name_(name), dimensions_(1, dim0), ins_(ins) { if (hasExatnBackend_) { return; } data_.resize(dim0, 0.0); } Tensor(const VectorSizeType& d, SizeType ins) : dimensions_(d),ins_(ins) Tensor(PsimagLite::String name, const VectorSizeType& d, SizeType ins) : name_(name), dimensions_(d),ins_(ins) { SizeType n = dimensions_.size(); if (n == 0) return; assert(0 < n); if (hasExatnBackend_) { return; } data_.resize(volume(), 0.0); } Loading @@ -67,6 +80,10 @@ public: for (SizeType i = ins; i < dimensions_.size(); ++i) douts *= dimensions_[i]; if (hasExatnBackend_) { return; } for (SizeType x = 0; x < dins; ++x) if (x < douts) data_[x + x*dins] = value; Loading @@ -74,6 +91,10 @@ public: void setToRandom() { if (hasExatnBackend_) { return; } SizeType n = data_.size(); ComplexOrRealType sum = 0.0; for (SizeType i = 0; i < n; ++i) { Loading @@ -91,6 +112,10 @@ public: void setToConstant(ComplexOrRealType value) { if (hasExatnBackend_) { return; } // use std:: function here instead of loop, FIXME SizeType n = data_.size(); for (SizeType i = 0; i < n; ++i) Loading @@ -101,6 +126,11 @@ public: { if (ins_ == 0) return; if (dimensions_.size() < ins_) return; if (hasExatnBackend_) { return; } if (dimensions_.size() == ins_) { SizeType rows = m.n_row(); SizeType cols = m.n_col(); Loading Loading @@ -132,6 +162,11 @@ public: SizeType v = volume(); if (v == 0) throw PsimagLite::RuntimeError("Tensor::setSizes(...): dimensions == 0\n"); if (hasExatnBackend_) { return; } data_.resize(v,0.0); } Loading Loading @@ -167,6 +202,10 @@ public: const ComplexOrRealType& operator()(const VectorSizeType& args) const { if (hasExatnBackend_) { return data_[0]; } SizeType index = pack(args); assert(index < data_.size()); return data_[index]; Loading @@ -175,6 +214,10 @@ public: // FIXME: GIVES AWAY INTERNALS!! ComplexOrRealType& operator()(const VectorSizeType& args) { if (hasExatnBackend_) { return data_[0]; } SizeType index = pack(args); assert(index < data_.size()); return data_[index]; Loading @@ -197,15 +240,29 @@ public: return index; } const VectorComplexOrRealType& data() const { return data_; } const VectorComplexOrRealType& data() const { return data_; } // FIXME: GIVES AWAY INTERNALS!! VectorComplexOrRealType& data() { return data_; } void setData(const VectorComplexOrRealType& data) { data_ = data; } PsimagLite::String name() const { return name_; } private: #ifdef USE_EXATN static const bool hasExatnBackend_ = true; static exatn::numerics::TensorOpFactory* opFactory_; #else static const bool hasExatnBackend_ = false; #endif static PsimagLite::RandomForTests<ComplexOrRealType> rng_; PsimagLite::String name_; VectorSizeType dimensions_; VectorComplexOrRealType data_; SizeType ins_; Loading @@ -214,8 +271,10 @@ private: template<typename ComplexOrRealType> PsimagLite::RandomForTests<ComplexOrRealType> Tensor<ComplexOrRealType>::rng_(1234); #ifdef USE_EXATN template<typename ComplexOrRealType> exatn::numerics::TensorOpFactory* Tensor<ComplexOrRealType>::opFactory_ = exatn::numerics::TensorOpFactory::get(); #endif } #endif // TENSOR_H
src/Engine/TensorEvalBase.h +12 −14 Original line number Diff line number Diff line Loading @@ -43,20 +43,18 @@ public: virtual void printResult(std::ostream& os) const = 0; static SizeType indexOfOutputTensor(const SrepStatementType& eq, const VectorPairStringSizeType& tensorNameIds, MapPairStringSizeType& nameIdsTensor) { SizeType ret = nameIdsTensor[eq.nameIdOfOutput()]; if (tensorNameIds[ret] != eq.nameIdOfOutput()) { PsimagLite::String msg("TensorEvalBase: Could not find "); msg += "output tensor " + eq.nameIdOfOutput().first; msg += ttos(eq.nameIdOfOutput().second) + "\n"; throw PsimagLite::RuntimeError(msg); } return ret; } // static SizeType indexOfOutputTensor(const SrepStatementType& eq) // { // SizeType ret = nameIdsTensor[eq.nameIdOfOutput()]; // if (tensorNameIds[ret] != eq.nameIdOfOutput()) { // PsimagLite::String msg("TensorEvalBase: Could not find "); // msg += "output tensor " + eq.nameIdOfOutput().first; // msg += ttos(eq.nameIdOfOutput().second) + "\n"; // throw PsimagLite::RuntimeError(msg); // } // return ret; // } }; } // namespace Mera #endif // TENSOREVALBASE_H
src/Engine/TensorEvalNew.h +1 −3 Original line number Diff line number Diff line Loading @@ -37,9 +37,7 @@ class TensorEvalNew : public TensorEvalBase<ComplexOrRealType> { public: TensorEvalNew(const SrepStatementType& tSrep, const VectorTensorType& vt, const VectorPairStringSizeType& tensorNameIds, MapPairStringSizeType& nameIdsTensor) const VectorTensorType& vt) {} HandleType operator()() Loading
src/Engine/TensorEvalSlow.h +10 −25 Original line number Diff line number Diff line Loading @@ -54,20 +54,15 @@ public: TensorEvalSlow(const SrepStatementType& tSrep, const VectorTensorType& vt, const VectorPairStringSizeType& tensorNameIds, MapPairStringSizeType& nameIdsTensor, SymmetryLocalType* symmLocal, bool modify = EVAL_BREAKUP) : srepStatement_(tSrep), data_(vt), // deep copy tensorNameIds_(tensorNameIds), // deep copy nameIdsTensor_(nameIdsTensor), // deep copy symmLocal_(symmLocal), modify_(modify) { indexOfOutputTensor_ = TensorEvalBaseType::indexOfOutputTensor(tSrep, tensorNameIds, nameIdsTensor); indexOfOutputTensor_ = idNameToIndex(tSrep.nameIdOfOutput().first, tSrep.nameIdOfOutput().second); if (!modify_) return; Loading @@ -90,17 +85,11 @@ public: } if (temporaryName[0] != 't') continue; PsimagLite::String str = temporaryName.substr(1,temporaryName.length()); SizeType temporaryId = atoi(str.c_str()); temporaryName = "t"; PairStringSizeType tmpPair = PairStringSizeType(temporaryName,temporaryId); tensorNameIds_.push_back(tmpPair); nameIdsTensor_[tmpPair] = tensorNameIds_.size() - 1; // add this temporary, call setDimensions for output tensor later TensorStanza tmpStanza(vstr[i]); VectorSizeType args(1,1); // bogus TensorType* t = new TensorType(args, tmpStanza.ins()); TensorType* t = new TensorType(temporaryName, args, tmpStanza.ins()); garbage_.push_back(t); data_.push_back(t); } Loading @@ -116,8 +105,6 @@ public: TensorEvalSlow tEval(*(veqs[j]), data_, tensorNameIds_, nameIdsTensor_, symmLocal_, false); Loading Loading @@ -612,18 +599,18 @@ private: SizeType idNameToIndex(PsimagLite::String name, SizeType id) const { typename MapPairStringSizeType::iterator it = nameIdsTensor_.find(PairStringSizeType(name,id)); if (it == nameIdsTensor_.end()) PsimagLite::String fullId = name + ttos(id); for (SizeType i = 0; i < data_.size(); ++i) if (fullId == data_[i]->name()) return i; throw PsimagLite::RuntimeError("idNameToIndex: key not found\n"); return it->second; } void setQnsForOutput(VectorVectorSizeType& q) { // remap tensor indexing into symm local indexing PairStringSizeType p = tensorNameIds_[indexOfOutputTensor_]; PsimagLite::String str = p.first + ttos(p.second); PsimagLite::String str = data_[indexOfOutputTensor_]->name(); SizeType legs = srepStatement_.lhs().legs(); VectorSizeType v(legs, 0); Loading Loading @@ -659,8 +646,6 @@ private: SrepStatementType srepStatement_; VectorTensorType data_; VectorPairStringSizeType tensorNameIds_; mutable MapPairStringSizeType nameIdsTensor_; SymmetryLocalType* symmLocal_; bool modify_; SizeType indexOfOutputTensor_; Loading
src/Engine/TensorOptimizer.h +2 −2 Original line number Diff line number Diff line Loading @@ -215,7 +215,7 @@ public: { if (stack_.size() == 0) throw PsimagLite::RuntimeError("restoreTensor: stack is empty\n"); tensors_[indToOptimize_]->data() = stack_.top(); tensors_[indToOptimize_]->setData(stack_.top()); stack_.pop(); } Loading @@ -224,7 +224,7 @@ public: void copyFirstOfLayer(PsimagLite::String name, SizeType id) { SizeType ind = nameIdsTensor_[PairStringSizeType(name, id)]; tensors_[indToOptimize_]->data() = tensors_[ind]->data(); tensors_[indToOptimize_]->setData(tensors_[ind]->data()); } private: Loading