#include "test.h" #include "itensor/indexset.h" #include "itensor/util/set_scoped.h" #include "itensor/util/print_macro.h" using namespace itensor; TEST_CASE("IndexSetTest") { auto i1 = Index("i1",1); auto i2 = Index("i2",2); auto i3 = Index("i3",3); auto i4 = Index("i4",4); auto i5 = Index("i5",5); auto i6 = Index("i6",6); auto i7 = Index("i7",7); auto i8 = Index("i8",8); auto i9 = Index("i9",9); auto i10 = Index("i10",10); auto v1 = Index("v1",2,Vtype); auto w1 = Index("w1",2,Wtype); SECTION("Constructors") { SECTION("One") { auto is = IndexSet(i4); CHECK(is.r() == 1); CHECK(area(is) == 4); CHECK(is[0] == i4); CHECK(is[0] == is.index(1)); is = IndexSet(i1); CHECK(is.r() == 1); CHECK(area(is) == 1); CHECK(is[0] == i1); CHECK(is[0] == is.index(1)); } SECTION("Two") { auto is1 = IndexSet(i4,i3); CHECK(is1.r() == 2); CHECK(area(is1) == 4*3); CHECK(is1[0] == i4); CHECK(is1[1] == i3); auto is2 = IndexSet(i3,i4); CHECK(is2.r() == 2); CHECK(area(is2) == 4*3); CHECK(is2[0] == i3); CHECK(is2[1] == i4); } SECTION("THREE") { auto is = IndexSet(i3,i1,i4); CHECK(is.r() == 3); CHECK(area(is) == 4*3); CHECK(is[0] == i3); CHECK(is[1] == i1); CHECK(is[2] == i4); } SECTION("TEN") { auto is = IndexSet(i3,i1,i4,i2,i5,i6,i7,i8,i10,i9); CHECK(is.r() == 10); CHECK(is[0] == i3); CHECK(is[1] == i1); CHECK(is[2] == i4); CHECK(is[3] == i2); CHECK(is[4] == i5); CHECK(is[5] == i6); CHECK(is[6] == i7); CHECK(is[7] == i8); CHECK(is[8] == i10); CHECK(is[9] == i9); } } SECTION("PrimeLevelMethods") { SECTION("Prime All") { SECTION("Case 1") { IndexSet is(i2,i3,prime(i2),i4); prime(is); CHECK(is[0] == prime(i2)); CHECK(is[1] == prime(i3)); CHECK(is[2] == prime(i2,2)); CHECK(is[3] == prime(i4)); } SECTION("Case 2") { IndexSet is(i2,i3,prime(i2),i4); prime(is,4); CHECK(is[0] == prime(i2,4)); CHECK(is[1] == prime(i3,4)); CHECK(is[2] == prime(i2,5)); CHECK(is[3] == prime(i4,4)); } } SECTION("Prime IndexType") { SECTION("Case 1") { IndexSet is(i2,w1,prime(i2),v1); prime(is,Link); CHECK(is[0] == prime(i2)); CHECK(is[1] == w1); CHECK(is[2] == prime(i2,2)); CHECK(is[3] == v1); } SECTION("Case 2") { IndexSet is(i2,w1,prime(i2),v1); prime(is,Wtype); CHECK(is[0] == i2); CHECK(is[1] == prime(w1)); CHECK(is[2] == prime(i2)); CHECK(is[3] == v1); } SECTION("Case 3") { IndexSet is(i2,w1,prime(i2),v1); //Use multiple IndexType arguments prime(is,Wtype,Vtype); CHECK(is[0] == i2); CHECK(is[1] == prime(w1)); CHECK(is[2] == prime(i2)); CHECK(is[3] == prime(v1)); } SECTION("Case 4") { IndexSet is(i2,w1,prime(i2),v1); //Use multiple IndexType arguments //and an increment prime(is,Wtype,Vtype,4); CHECK(is[0] == i2); CHECK(is[1] == prime(w1,4)); CHECK(is[2] == prime(i2)); CHECK(is[3] == prime(v1,4)); } } SECTION("Prime Indices") { SECTION("Case 1") { IndexSet is(i5,i2,prime(i2),i4); prime(is,i2,prime(i2)); CHECK(is[0] == i5); CHECK(is[1] == prime(i2)); CHECK(is[2] == prime(i2,2)); CHECK(is[3] == i4); } SECTION("Case 2") { IndexSet is(i5,i2,prime(i2),i4); prime(is,prime(i2),i2); CHECK(is[0] == i5); CHECK(is[1] == prime(i2)); CHECK(is[2] == prime(i2,2)); CHECK(is[3] == i4); } SECTION("Case 3 - include inc") { IndexSet is(i5,i2,prime(i2),i4); prime(is,prime(i2),i2,4); CHECK(is[0] == i5); CHECK(is[1] == prime(i2,4)); CHECK(is[2] == prime(i2,5)); CHECK(is[3] == i4); } SECTION("Check Error Condition") { IndexSet is(i5,i2,i3,i4); CHECK_THROWS_AS(prime(is,prime(i2)),ITError); } } SECTION("Prime Mix of IndexType and Index") { SECTION("Case 1 Basic") { auto is = IndexSet(i5,i2,prime(i2,2),v1,prime(w1)); prime(is,i2,Vtype); CHECK(is[0] == i5); CHECK(is[1] == prime(i2)); CHECK(is[2] == prime(i2,2)); CHECK(is[3] == prime(v1)); CHECK(is[4] == prime(w1)); } SECTION("Case 2 Increment") { auto is = IndexSet(i5,i2,prime(i2,2),v1,prime(w1)); prime(is,i2,Vtype,3); CHECK(is[0] == i5); CHECK(is[1] == prime(i2,3)); CHECK(is[2] == prime(i2,2)); CHECK(is[3] == prime(v1,3)); CHECK(is[4] == prime(w1)); } SECTION("Case 3 Other Order") { auto is = IndexSet(i5,i2,prime(i2,2),v1,prime(w1)); prime(is,Vtype,i2,3); CHECK(is[0] == i5); CHECK(is[1] == prime(i2,3)); CHECK(is[2] == prime(i2,2)); CHECK(is[3] == prime(v1,3)); CHECK(is[4] == prime(w1)); } SECTION("Check Error: No Matching Index") { auto is = IndexSet(i5,i2,prime(i2,2),v1,prime(w1)); CHECK_THROWS_AS(prime(is,Vtype,i3),ITError); } SECTION("Check Error: Invalid Prime Levels") { auto is = IndexSet(i5,i2,prime(i2,2),v1,prime(w1)); CHECK_THROWS_AS(prime(is,Vtype,i2,2),ITError); } } // // This feature was experimental and has been // removed. Use mapprime instead. // //SECTION("Prime Using IndexVals") // { // SECTION("Case 1") // { // auto is = IndexSet(i5,i2,prime(i2),i4); // prime(is,i2(1),prime(i2)(2)); // CHECK(is[0] == i5); // CHECK(is[1] == prime(i2)); // CHECK(is[2] == prime(i2,3)); // CHECK(is[3] == i4); // } // SECTION("Case 2") // { // IndexSet is(i5,i2,prime(i2),i4); // prime(is,i2(5),prime(i2)(1),i4(2)); // CHECK(is[0] == i5); // CHECK(is[1] == prime(i2,5)); // CHECK(is[2] == prime(i2,2)); // CHECK(is[3] == prime(i4,2)); // } // SECTION("Check Error Condition") // { // IndexSet is(i5,i2,i3,i4); // CHECK_THROWS_AS(prime(is,prime(i2)(3)),ITError); // } // } SECTION("Prime Except") { SECTION("Case 1") { IndexSet is(i5,i2,i3,i4); primeExcept(is,i5); CHECK(is[0] == i5); CHECK(is[1] == prime(i2)); CHECK(is[2] == prime(i3)); CHECK(is[3] == prime(i4)); } SECTION("Case 2") { IndexSet is(i5,i2,i3,i4); primeExcept(is,i2,2); CHECK(is[0] == prime(i5,2)); CHECK(is[1] == i2); CHECK(is[2] == prime(i3,2)); CHECK(is[3] == prime(i4,2)); } SECTION("Case 3") { IndexSet is(i5,i2,i3,i4); primeExcept(is,i2,i4,2); CHECK(is[0] == prime(i5,2)); CHECK(is[1] == i2); CHECK(is[2] == prime(i3,2)); CHECK(is[3] == i4); } SECTION("Case 4") { IndexSet is(i5,i2,i3,i4); primeExcept(is,i4,i2,2); CHECK(is[0] == prime(i5,2)); CHECK(is[1] == i2); CHECK(is[2] == prime(i3,2)); CHECK(is[3] == i4); } SECTION("Regression Test 1") { Index x("x",2,Xtype), z("z",2,Ztype), y("y",2,Ytype), v("v",2,Vtype); IndexSet is(prime(x,3),prime(y,1),prime(z,3),y,v); primeExcept(is,Vtype,Ytype,-2); CHECK(is[0]==prime(x,1)); CHECK(is[1]==prime(y,1)); CHECK(is[2]==prime(z,1)); CHECK(is[3]== y ); CHECK(is[4]== v ); } } SECTION("NoPrime Index") { SECTION("Case 1") { IndexSet is(i5,i2,prime(i2),prime(i4)); noprime(is,prime(i4)); CHECK(is[0] == i5); CHECK(is[1] == i2); CHECK(is[2] == prime(i2)); CHECK(is[3] == i4); } SECTION("Case 2") { IndexSet is(i5,i2,prime(i2),prime(i4,4)); noprime(is,prime(i4,4)); CHECK(is[0] == i5); CHECK(is[1] == i2); CHECK(is[2] == prime(i2)); CHECK(is[3] == i4); } } SECTION("NoPrimeType") { SECTION("Case 0") { IndexSet is(i2,v1,w1,i4); prime(is,2); noprime(is); CHECK(is[0] == i2); CHECK(is[1] == v1); CHECK(is[2] == w1); CHECK(is[3] == i4); } SECTION("Case 1") { IndexSet is(i2,v1,w1,i4); prime(is,2); noprime(is,Vtype); CHECK(is[0] == prime(i2,2)); CHECK(is[1] == v1); CHECK(is[2] == prime(w1,2)); CHECK(is[3] == prime(i4,2)); } SECTION("Case 2") { IndexSet is(i2,v1,w1,i4); prime(is,2); noprime(is,Wtype); CHECK(is[0] == prime(i2,2)); CHECK(is[1] == prime(v1,2)); CHECK(is[2] == w1); CHECK(is[3] == prime(i4,2)); } SECTION("Case 3") { IndexSet is(i2,v1,w1,i4); prime(is,2); noprime(is,Wtype,Vtype); CHECK(is[0] == prime(i2,2)); CHECK(is[1] == v1); CHECK(is[2] == w1); CHECK(is[3] == prime(i4,2)); } SECTION("Case 4") { IndexSet is(i2,v1,w1,i4); prime(is,2); noprime(is,Vtype,Wtype); CHECK(is[0] == prime(i2,2)); CHECK(is[1] == v1); CHECK(is[2] == w1); CHECK(is[3] == prime(i4,2)); } } SECTION("Map Prime") { SECTION("Case 1") { auto is = IndexSet(i1,prime(i1)); mapprime(is,i1,0,2); CHECK(is[0] == prime(i1,2)); CHECK(is[1] == prime(i1,1)); } SECTION("Case 2") { auto is = IndexSet(i1,prime(i1)); mapprime(is,i1,1,2); CHECK(is[0] == i1); CHECK(is[1] == prime(i1,2)); } SECTION("Case 3") { auto is = IndexSet(i1,prime(i1),v1); mapprime(is,Link,0,2,v1,0,4); CHECK(is[0] == prime(i1,2)); CHECK(is[1] == prime(i1,1)); CHECK(is[2] == prime(v1,4)); } } SECTION("PrimeLevel") { IndexSet is(i2,i3,prime(i2),i4); primeLevel(is,1,2,4,5); CHECK(is[0] == prime(i2,1)); CHECK(is[1] == prime(i3,2)); CHECK(is[2] == prime(i2,4)); CHECK(is[3] == prime(i4,5)); } } //PrimeLevelMethods SECTION("IndexSet Iterator") { auto s1 = Index("s1",2); auto s2 = Index("s2",3); auto s3 = Index("s3",4); auto s4 = Index("s4",5); auto i = IndexSet(s1,s2,s3,s4); auto c = i.begin(); CHECK(*c == s1); CHECK(*(c+1) == s2); CHECK(*(c+2) == s3); CHECK(*(c+3) == s4); CHECK((c+4) == i.end()); } } //IndexSetTest