Commit 06bcb5e6 authored by Alvarez, Gonzalo's avatar Alvarez, Gonzalo
Browse files

MPS all considered root tensors

parent 1bc4a281
Loading
Loading
Loading
Loading
+11 −11
Original line number Diff line number Diff line
@@ -104,7 +104,7 @@ private:
		PairSizeType layer = findLayerNumber(name, id, limits);
		thisEnv += "Layer=" + ttos(layer.first) + "\n";
		thisEnv += "FirstOfLayer=" + ttos(layer.second) + "\n";
		bool isRootTensor = (tensorSrep_(ind).fullName()[0] == 'r');
		bool isRootTensor = (tensorSrep_(ind).isRootTensor());
		for (SizeType c = 0; c < connections; ++c) {
			if (vstr[c] == "") continue;
			PsimagLite::String tmp = "u" + ttos(counterForOutput++);
@@ -131,14 +131,14 @@ private:
			err("Invalid tensor\n");
		SizeType jnd = tensorSrep4.findConjugate(ind);
		bool hasConjugate = (jnd < tensorSrep4.size());
		bool isRootTensor = (tensorSrep_(ind).fullName()[0] == 'r');
		bool isRootTensor = (tensorSrep_(ind).isRootTensor());
		bool mpsMode = (tensorSrep_(ind).fullName()[0] == 'a');
		if (!hasConjugate) {
			if (isRootTensor) {
			if (isRootTensor && !mpsMode)
				err("Environ for root: INTERNAL ERROR\n");
			} else {

			std::cerr<<"EMPTY_ENVIRON="<<tensorSrep4.sRep()<<"\n";
			return TensorSrep("");
			}
		} else if (isRootTensor) {
			tensorSrep4.eraseTensor(irreducibleIdentity_,jnd,0);
			// use energySrep to compute r size
@@ -376,7 +376,7 @@ private:
	{
		SizeType ntensors = dimensionSrep_.size();
		for (SizeType i = 0; i < ntensors; ++i) {
			if (dimensionSrep_(i).fullName()[0] != 'r') continue;
			if (dimensionSrep_(i).isRootTensor()) continue;

			SizeType ins = dimensionSrep_(i).ins();
			SizeType ret = 1;
@@ -432,11 +432,11 @@ private:
	void findLimits(VectorSizeType& limits) const
	{
		SizeType arity = builder_.arity();
		if (arity == 0) return;
		SizeType sites = builder_.sites();

		if (arity != 2) {
			PsimagLite::RuntimeError("findLimits: supported only for arity=2\n");
		}
		if (arity != 2)
			err("findLimits: supported only for arity=2\n");

		limits.push_back(sites/arity);
		SizeType tmp = sites/arity;
+0 −17
Original line number Diff line number Diff line
@@ -79,7 +79,6 @@ public:
	      indToOptimize_(nameToIndexLut_(nameToOptimize + ttos(idToOptimize))),
	      layer_(0),
	      firstOfLayer_(0),
	      indexOfRootTensor_(0),
	      params_(params),
	      paramsForMera_(paramsForMera),
	      symmLocal_(symmLocal),
@@ -109,18 +108,6 @@ public:
				srep.replace(index,5,"=");
			tensorSrep_[i] = new SrepStatementType(srep);
		}

		bool flag = false;
		for (SizeType i = 0; i < tensors_.size(); ++i) {
			if (tensors_[i]->name()[0] == 'r') {
				indexOfRootTensor_ = i;
				flag = true;
				break;
			}
		}

		if (!flag)
			throw PsimagLite::RuntimeError("TensorOptimizer: Root tensor not found\n");
	}

	~TensorOptimizer()
@@ -405,9 +392,6 @@ private:

	RealType computeRyR(const MatrixType& y) const
	{
		if (indToOptimize_ != indexOfRootTensor_)
			throw PsimagLite::RuntimeError("Don't call computeRyR unless optimizing root\n");

		RealType sum = 0.0;
		const TensorType& r = *tensors_[indToOptimize_];
		assert(r.args() == 2);
@@ -446,7 +430,6 @@ private:
	SizeType ignore_;
	SizeType layer_;
	SizeType firstOfLayer_;
	SizeType indexOfRootTensor_;
	const ParametersForSolverType& params_;
	const ParametersForMeraType& paramsForMera_;
	SymmetryLocalType* symmLocal_;
+2 −2
Original line number Diff line number Diff line
@@ -108,7 +108,7 @@ public:
		assert(index < data_.size());

		bool identityIdIncreased = false;
		if (data_[index]->fullName()[0] == 'r')
		if (data_[index]->isRootTensor())
			identityIdIncreased = addIrreducibleIdentity(irrIdentity);
		if (identityIdIncreased) irrIdentity.increase();

@@ -636,7 +636,7 @@ private:
		SizeType flag1 = 0;
		SizeType loc0 = 0;
		for (SizeType i = 0; i < ntensors; ++i) {
			if (data_[i]->fullName()[0] != 'r') continue;
			if (data_[i]->isRootTensor()) continue;
			bool b = data_[i]->isConjugate();
			if (b) {
				flag0++;
+6 −0
Original line number Diff line number Diff line
@@ -373,6 +373,12 @@ public:
		return false;
	}

	bool isRootTensor() const
	{
		return (opaque_.fullName_[0] == 'r' ||
		        opaque_.fullName_[0] == 'a');
	}

	static TensorStanza* newStanza(const TensorStanza& other)
	{
		TensorStanza* intercept = new TensorStanza(other);