Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 44 additions & 2 deletions itensor/mps/autompo.h
Original file line number Diff line number Diff line change
Expand Up @@ -190,10 +190,11 @@ class AutoMPO

public:

AutoMPO() { }
AutoMPO(): concatAccumulator(nullptr)
{ }

AutoMPO(SiteSet const& sites)
: sites_(sites)
: sites_(sites), concatAccumulator(nullptr)
{ }

SiteSet const&
Expand All @@ -213,11 +214,52 @@ class AutoMPO
Accumulator
operator+=(T x) { return Accumulator(this,x); }

template <typename T>
AutoMPO&
concat(T x)
{
if (concatAccumulator==nullptr)
{
concatAccumulator = new Accumulator(this,x);
}
else { (*concatAccumulator),x; }

return *this;
}

template <typename T, typename... VarArgs>
AutoMPO&
concat(T first, VarArgs... vargs)
{
if (concatAccumulator==nullptr)
{
concatAccumulator = new Accumulator(this,first);
return concat(vargs...);
}
else
{
(*concatAccumulator),first;
return concat(vargs...);
}
}

//this calls add with the completed accumulator
void combine()
{
delete concatAccumulator;
concatAccumulator=nullptr;
}

void
add(HTerm const& t);

void
reset() { terms_.clear(); }

private:

//temporary accumulator for concat
Accumulator* concatAccumulator;
};

std::ostream&
Expand Down
72 changes: 72 additions & 0 deletions unittest/autompo_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -328,6 +328,78 @@ SECTION("Single Site Ops")
// }
}

SECTION("Concat")
{
int L = 10;
auto sites = Hubbard(L);

SECTION("Diagonal op")
{
auto ampo = AutoMPO(sites);
auto n = 4;
//ampo += "Nup",n;
ampo.concat("Nup",n).combine();
auto Op = IQMPO(ampo);
for(auto i : range1(L))
{
auto state = InitState(sites,"Emp");
state.set(i,"Up");
auto psi = IQMPS(state);
auto x = overlap(psi,Op,psi);
if(i == n) CHECK_CLOSE(x,1.);
else CHECK_CLOSE(x,0.);
}
}
SECTION("Concat MPO For Loop")
{
auto ampo = AutoMPO(sites);
ampo += 0.5,"Nup",1,"Nup",2,"Nup",3,"Nup",4;
auto correct = MPO(ampo);
auto norm = overlap(correct,correct);

auto ampoC = AutoMPO(sites);
ampoC.concat(0.5);
for(auto i : range1(4))
{
ampoC.concat("Nup",i);
}
ampoC.combine();
auto C = MPO(ampoC);
CHECK_CLOSE(overlap(correct,C),norm);

auto state = InitState(sites,"Up");
auto psi = MPS(state);

CHECK_CLOSE(overlap(psi,C,psi),overlap(psi,correct,psi));
}

SECTION("Concat IQMPO chained")
{
auto ampo = AutoMPO(sites);
ampo += 1.0,"Nup",1,"Sz",2,"Nup",3,"Sz",4;
ampo += 1.0,"Sz",1,"Nup",2,"Sz",3,"Nup",4;
auto correct = IQMPO(ampo);
auto norm = overlap(correct,correct);

auto ampoC = AutoMPO(sites);
ampoC.concat(1.0,"Nup",1)
.concat("Sz",2,"Nup",3)
.concat("Sz",4)
.combine();
ampoC.concat(1.0,"Sz",1)
.concat("Nup",2,"Sz",3)
.concat("Nup",4)
.combine();
auto C = IQMPO(ampoC);
CHECK_CLOSE(overlap(correct,C),norm);

auto state = InitState(sites,"Up");
auto psi = IQMPS(state);

CHECK_CLOSE(overlap(psi,C,psi),overlap(psi,correct,psi));
}
}

SECTION("toExpH ITensor")
{
int N = 10;
Expand Down