Commit d2db65e1 authored by Alvarez, Gonzalo's avatar Alvarez, Gonzalo
Browse files

MPS dimensions

parent 06bcb5e6
Loading
Loading
Loading
Loading
+25 −1
Original line number Diff line number Diff line
@@ -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();
	}

@@ -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) {
+13 −9
Original line number Diff line number Diff line
@@ -64,7 +64,6 @@ public:
	      isMeraPeriodic_(false),
	      iterMera_(1),
	      iterTensor_(1),
	      indexOfRootTensor_(0),
	      nameToIndexLut_(0),
	      model_(paramsForMera_.model, paramsForMera_.hamiltonianConnection),
	      paramsForLanczos_(0)
@@ -110,6 +109,7 @@ public:

		nameToIndexLut_ = new NameToIndexLut<TensorType>(tensors_);
		bool rootTensorFound = false;
		bool mpsMode = false;
		while (true) {
			PsimagLite::String str("");
			try {
@@ -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,
@@ -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;
			}
		}
@@ -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;
@@ -265,6 +265,11 @@ private:
		}
	}

	static bool isRootTensor(PsimagLite::String name)
	{
		return (name == "a" || name == "r");
	}

	class ParallelEnergyHelper {

	public:
@@ -447,7 +452,6 @@ private:
	bool isMeraPeriodic_;
	SizeType iterMera_;
	SizeType iterTensor_;
	SizeType indexOfRootTensor_;
	VectorTensorType tensors_;
	NameToIndexLut<TensorType>* nameToIndexLut_;
	ModelType model_;
+9 −4
Original line number Diff line number Diff line
@@ -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;
			}
@@ -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;
@@ -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)
@@ -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);
@@ -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&);