Loading src/Engine/MeraEnviron.h +88 −8 Original line number Diff line number Diff line Loading @@ -90,7 +90,7 @@ private: if (params_.hamiltonianConnection[c] == 0.0) continue; TensorSrep tmp = environForTensorOneSite(ind, c); vstr[c] = tmp.sRep(); argForOutput[c] = calcArgForOutput(vdsrep[c],tmp); argForOutput[c] = calcArgForOutput(vdsrep[c], tmp, ind); if (vstr[c] != "") ++terms; } Loading Loading @@ -126,13 +126,13 @@ private: tensorSrep4.eraseTensor(irreducibleIdentity_, ind, 0); bool verbose = false; if (!tensorSrep4.isValid(verbose)) throw PsimagLite::RuntimeError("Invalid tensor\n"); err("Invalid tensor\n"); SizeType jnd = tensorSrep4.findConjugate(ind); bool hasConjugate = (jnd < tensorSrep4.size()); bool isRootTensor = (tensorSrep_(ind).name() == "r"); if (!hasConjugate) { if (isRootTensor) { throw PsimagLite::RuntimeError("Environ for root: INTERNAL ERROR\n"); err("Environ for root: INTERNAL ERROR\n"); } else { std::cerr<<"EMPTY_ENVIRON="<<tensorSrep4.sRep()<<"\n"; return TensorSrep(""); Loading @@ -142,14 +142,15 @@ private: // use energySrep to compute r size // if (!tensorSrep4.isValid(verbose)) throw PsimagLite::RuntimeError("Invalid tensor\n"); err("Invalid tensor\n"); } return tensorSrep4; } PsimagLite::String calcArgForOutput(PsimagLite::String& dsrep, const TensorSrep& srep) const const TensorSrep& srep, SizeType ind) const { VectorStringType ins; VectorStringType outs; Loading @@ -157,11 +158,26 @@ private: for (SizeType i = 0; i < ntensors; ++i) calcArgForOutput(ins,outs,srep(i)); VectorSizeType inSizes; VectorSizeType outSizes; findSizeOfLegOut(inSizes, outSizes, ind); if (inSizes.size() == outs.size() && outSizes.size() == ins.size()) { VectorSizeType tmpV = inSizes; inSizes = outSizes; outSizes = tmpV; } if (inSizes.size() != ins.size() || outSizes.size() != outs.size()) { inSizes.resize(ins.size(), 1); outSizes.resize(outs.size(), 1); } PsimagLite::String ret = "("; dsrep = "("; for (SizeType i = 0; i < ins.size(); ++i) { ret += ins[i]; dsrep += "D1"; assert(i < inSizes.size()); dsrep += "D" + ttos(inSizes[i]); if (i + 1 >= ins.size()) continue; ret += ","; dsrep += ","; Loading @@ -174,7 +190,8 @@ private: for (SizeType i = 0; i < outs.size(); ++i) { ret += outs[i]; dsrep += "D1"; assert(i < outSizes.size()); dsrep += "D" + ttos(outSizes[i]); if (i + 1 >= outs.size()) continue; ret += ","; dsrep += ","; Loading @@ -184,6 +201,69 @@ private: return ret + ")"; } void findSizeOfLegOut(VectorSizeType& legInSizes, VectorSizeType& legOutSizes, SizeType ind) const { PsimagLite::String str = tensorSrep_(ind).name(); str += ttos(tensorSrep_(ind).id()) + "("; PsimagLite::String buffer(""); const SizeType l = dimensionSrep_.sRep().length(); bool flag = false; for (SizeType i = 0; i < l; ++i) { const char letter = dimensionSrep_.sRep()[i]; buffer += letter; if (letter != '(' && letter != ')') continue; if (letter == '(') { if (str == buffer) { flag = true; } buffer = ""; continue; } assert(letter == ')'); if (!flag) { buffer = ""; continue; } break; } fromArgToLegSizes(legInSizes, legOutSizes, buffer); } void fromArgToLegSizes(VectorSizeType& legInSizes, VectorSizeType& legOutSizes, PsimagLite::String arg) const { if (arg.length() < 3 || arg[arg.length() - 1] != ')') err("fromArgToLegSizes(): " + arg + "\n"); const SizeType l = arg.length(); bool flag = false; PsimagLite::String buffer(""); for (SizeType i = 0; i < l; ++i) { const char letter = arg[i]; if (letter == ',' || letter == ')') { if (flag) legOutSizes.push_back(atoi(buffer.c_str())); else legInSizes.push_back(atoi(buffer.c_str())); buffer = ""; } else if (letter == '|') { legInSizes.push_back(atoi(buffer.c_str())); buffer = ""; flag = true; } else { if (letter != 'D') buffer += letter; } } } void calcArgForOutput(VectorStringType& ins, VectorStringType& outs, const TensorStanza& stanza) const Loading src/merapp.cpp +8 −1 Original line number Diff line number Diff line Loading @@ -71,9 +71,16 @@ void main1(const Mera::MeraBuilder<ComplexOrRealType>& builder, std::cout<<"IterMera=10\n"; std::cout<<"IterTensor=100\n"; std::cout<<"MERA="<<meraString<<"\n"; Mera::DimensionSrep<Mera::SymmetryLocal>::printOnePerLine(std::cout, dsrep, "CreateTensor="); Mera::DimensionSrep<Mera::SymmetryLocal>::printOnePerLine(std::cout, environ.dimensionSrep(), "CreateTensor="); // add output u1000 to be used by unitary condition checking std::cout<<"DsrepEnvirons=u1000(D1,D1)"<<environ.dimensionSrep()<<"\n"; Mera::DimensionSrep<Mera::SymmetryLocal>::printOnePerLine(std::cout, dsrep, "CreateTensor="); std::cout<<environ.environs(); } Loading Loading
src/Engine/MeraEnviron.h +88 −8 Original line number Diff line number Diff line Loading @@ -90,7 +90,7 @@ private: if (params_.hamiltonianConnection[c] == 0.0) continue; TensorSrep tmp = environForTensorOneSite(ind, c); vstr[c] = tmp.sRep(); argForOutput[c] = calcArgForOutput(vdsrep[c],tmp); argForOutput[c] = calcArgForOutput(vdsrep[c], tmp, ind); if (vstr[c] != "") ++terms; } Loading Loading @@ -126,13 +126,13 @@ private: tensorSrep4.eraseTensor(irreducibleIdentity_, ind, 0); bool verbose = false; if (!tensorSrep4.isValid(verbose)) throw PsimagLite::RuntimeError("Invalid tensor\n"); err("Invalid tensor\n"); SizeType jnd = tensorSrep4.findConjugate(ind); bool hasConjugate = (jnd < tensorSrep4.size()); bool isRootTensor = (tensorSrep_(ind).name() == "r"); if (!hasConjugate) { if (isRootTensor) { throw PsimagLite::RuntimeError("Environ for root: INTERNAL ERROR\n"); err("Environ for root: INTERNAL ERROR\n"); } else { std::cerr<<"EMPTY_ENVIRON="<<tensorSrep4.sRep()<<"\n"; return TensorSrep(""); Loading @@ -142,14 +142,15 @@ private: // use energySrep to compute r size // if (!tensorSrep4.isValid(verbose)) throw PsimagLite::RuntimeError("Invalid tensor\n"); err("Invalid tensor\n"); } return tensorSrep4; } PsimagLite::String calcArgForOutput(PsimagLite::String& dsrep, const TensorSrep& srep) const const TensorSrep& srep, SizeType ind) const { VectorStringType ins; VectorStringType outs; Loading @@ -157,11 +158,26 @@ private: for (SizeType i = 0; i < ntensors; ++i) calcArgForOutput(ins,outs,srep(i)); VectorSizeType inSizes; VectorSizeType outSizes; findSizeOfLegOut(inSizes, outSizes, ind); if (inSizes.size() == outs.size() && outSizes.size() == ins.size()) { VectorSizeType tmpV = inSizes; inSizes = outSizes; outSizes = tmpV; } if (inSizes.size() != ins.size() || outSizes.size() != outs.size()) { inSizes.resize(ins.size(), 1); outSizes.resize(outs.size(), 1); } PsimagLite::String ret = "("; dsrep = "("; for (SizeType i = 0; i < ins.size(); ++i) { ret += ins[i]; dsrep += "D1"; assert(i < inSizes.size()); dsrep += "D" + ttos(inSizes[i]); if (i + 1 >= ins.size()) continue; ret += ","; dsrep += ","; Loading @@ -174,7 +190,8 @@ private: for (SizeType i = 0; i < outs.size(); ++i) { ret += outs[i]; dsrep += "D1"; assert(i < outSizes.size()); dsrep += "D" + ttos(outSizes[i]); if (i + 1 >= outs.size()) continue; ret += ","; dsrep += ","; Loading @@ -184,6 +201,69 @@ private: return ret + ")"; } void findSizeOfLegOut(VectorSizeType& legInSizes, VectorSizeType& legOutSizes, SizeType ind) const { PsimagLite::String str = tensorSrep_(ind).name(); str += ttos(tensorSrep_(ind).id()) + "("; PsimagLite::String buffer(""); const SizeType l = dimensionSrep_.sRep().length(); bool flag = false; for (SizeType i = 0; i < l; ++i) { const char letter = dimensionSrep_.sRep()[i]; buffer += letter; if (letter != '(' && letter != ')') continue; if (letter == '(') { if (str == buffer) { flag = true; } buffer = ""; continue; } assert(letter == ')'); if (!flag) { buffer = ""; continue; } break; } fromArgToLegSizes(legInSizes, legOutSizes, buffer); } void fromArgToLegSizes(VectorSizeType& legInSizes, VectorSizeType& legOutSizes, PsimagLite::String arg) const { if (arg.length() < 3 || arg[arg.length() - 1] != ')') err("fromArgToLegSizes(): " + arg + "\n"); const SizeType l = arg.length(); bool flag = false; PsimagLite::String buffer(""); for (SizeType i = 0; i < l; ++i) { const char letter = arg[i]; if (letter == ',' || letter == ')') { if (flag) legOutSizes.push_back(atoi(buffer.c_str())); else legInSizes.push_back(atoi(buffer.c_str())); buffer = ""; } else if (letter == '|') { legInSizes.push_back(atoi(buffer.c_str())); buffer = ""; flag = true; } else { if (letter != 'D') buffer += letter; } } } void calcArgForOutput(VectorStringType& ins, VectorStringType& outs, const TensorStanza& stanza) const Loading
src/merapp.cpp +8 −1 Original line number Diff line number Diff line Loading @@ -71,9 +71,16 @@ void main1(const Mera::MeraBuilder<ComplexOrRealType>& builder, std::cout<<"IterMera=10\n"; std::cout<<"IterTensor=100\n"; std::cout<<"MERA="<<meraString<<"\n"; Mera::DimensionSrep<Mera::SymmetryLocal>::printOnePerLine(std::cout, dsrep, "CreateTensor="); Mera::DimensionSrep<Mera::SymmetryLocal>::printOnePerLine(std::cout, environ.dimensionSrep(), "CreateTensor="); // add output u1000 to be used by unitary condition checking std::cout<<"DsrepEnvirons=u1000(D1,D1)"<<environ.dimensionSrep()<<"\n"; Mera::DimensionSrep<Mera::SymmetryLocal>::printOnePerLine(std::cout, dsrep, "CreateTensor="); std::cout<<environ.environs(); } Loading