print "Basic Lattice Operations\n";

L:=ToricLattice(2);
assert Representative(L) in L;
S:=ScalarLattice();
L3:=L + S;
assert Dimension(L3) eq 3;
LL,emb1,emb2,proj1,proj2:=DirectSum(L,S);
assert L3 eq LL;
SS:=Summands(LL);
assert #SS eq 2 and L in SS and S in SS;
assert ImageBasis(emb1) eq [LL.1,LL.2];
assert ImageBasis(emb2) eq [LL.3];
assert ImageBasis(proj1) eq Basis(L);
assert ImageBasis(proj2) eq Basis(S);
assert Index(Image(emb1,Basis(L))) eq 1;
assert Index([2*L.1,3*L.2]) eq 6;
assert IsInImage(LL.1 + 2*LL.2,emb1);
assert Preimage(emb1,LL.1 + 2*LL.2) eq L.1 + 2*L.2;
assert AreGenerators(Basis(L)) eq true;
assert AreGenerators([3 * S.1]) eq false;
DLL:=Dual(LL);
assert IsDirectSum(DLL) eq true;
assert Summands(DLL) eq [Dual(L),Dual(S)];
assert KernelBasis(proj1) eq [LL.3];
assert KernelEmbedding(proj2) eq emb1;
assert IsIdentity(IdentityMap(L));
assert not IsIdentity(emb1);
phi:=ZeroMap(LL,L);
assert IsZero(DefiningMatrix(phi));
phi2:=Expand(emb1 * phi);
assert #ImageBasis(phi2) eq 0;
CacheClearToricLattice();

L:=ToricLattice(3);
u:=L ! [1,1/2,1/3];
assert u in L;
assert Norm(u) eq 49/36;
assert Eltseq(u) eq [Rationals() | 1,1/2,1/3];
assert not IsPrimitive(u);
assert not IsIntegral(u);
v:=L ! [6,3,2];
assert Eltseq(v) eq [Integers() | 6,3,2];
assert v gt u;
assert IsIntegral(v);
assert IsPrimitive(v);
bool,k:=AreProportional(u,v);
assert bool and k eq 6;
assert v / u eq 6;
assert PrimitiveLatticeVector(u) eq v;
assert 6 * u eq v;
assert Denominator(u + v) eq 6;
assert IsZero((-u) + u);
assert not IsZero(v);
zero:=L ! [0,0,0];
assert IsZero(zero);
assert zero eq Zero(L);
S:=[v,u,zero];
assert Universe(S) eq L;
Sort(~S);
assert S eq [zero,u,v];
assert not IsInDual(u,L);
uu:=Form(L,[1,2,0]);
assert Parent(uu) eq Dual(L);
assert IsInDual(uu,L);
assert uu * u eq 2;
assert v * uu eq 12;
M:=Matrix([u,v,zero]);
assert Determinant(M) eq 0;
assert uu * M eq Dual(L) ! [13,13/2,13/3];
f:=NonvanishingForm([u,v]);
assert not 0 in {Rationals() | f * u, f * v};
gens:=MinimalPositiveGenerators([-u,v]);
assert #gens eq 1 and u in gens;
CacheClearToricLattice();
