Commit 075d8c5b authored by Alvarez, Gonzalo's avatar Alvarez, Gonzalo
Browse files

Tensor.h has names now

parent 37ff7746
Loading
Loading
Loading
Loading
+68 −9
Original line number Diff line number Diff line
@@ -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 {

@@ -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);
	}

@@ -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;
@@ -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) {
@@ -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)
@@ -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();
@@ -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);
	}

@@ -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];
@@ -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];
@@ -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_;
@@ -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
+12 −14
Original line number Diff line number Diff line
@@ -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
+1 −3
Original line number Diff line number Diff line
@@ -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()()
+10 −25
Original line number Diff line number Diff line
@@ -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;

@@ -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);
		}
@@ -116,8 +105,6 @@ public:

			TensorEvalSlow tEval(*(veqs[j]),
			                     data_,
			                     tensorNameIds_,
			                     nameIdsTensor_,
			                     symmLocal_,
			                     false);

@@ -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);
@@ -659,8 +646,6 @@ private:

	SrepStatementType srepStatement_;
	VectorTensorType data_;
	VectorPairStringSizeType tensorNameIds_;
	mutable MapPairStringSizeType nameIdsTensor_;
	SymmetryLocalType* symmLocal_;
	bool modify_;
	SizeType indexOfOutputTensor_;
+2 −2
Original line number Diff line number Diff line
@@ -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();
	}

@@ -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