Skip to content

Commit

Permalink
implemented factor of 2 for Poincare complement of null-basis
Browse files Browse the repository at this point in the history
  • Loading branch information
chakravala committed Oct 9, 2019
1 parent 49134d8 commit 74b9366
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 7 deletions.
13 changes: 8 additions & 5 deletions src/algebra.jl
Expand Up @@ -179,12 +179,13 @@ export complementleft, complementright, ⋆, complementlefthodge, complementrigh

for side (:left,:right)
c,p = Symbol(:complement,side),Symbol(:parity,side)
h,pg = Symbol(c,:hodge),Symbol(p,:hodge)
h,pg,pn = Symbol(c,:hodge),Symbol(p,:hodge),Symbol(p,:null)
for (c,p) ((c,p),(h,pg))
@eval @pure function $c(b::Basis{V,G,B}) where {V,G,B}
d = getbasis(V,complement(ndims(V),B,diffvars(V),$(ch ? 0 : :(hasinf(V)+hasorigin(V)))))
mixedmode(V)<0 && throw(error("Complement for mixed tensors is undefined"))
typeof(V)<:Signature ? ($p(b) ? SBlade{V}(-value(d),d) : d) : SBlade{V}($p(b)*value(d),d)
v = $(ch ? :($pn(V,B,value(d))) : :(value(d)))
typeof(V)<:Signature ? ($p(b) ? SBlade{V}(-v,d) : isone(v) ? d : SBlade{V}(v,d)) : SBlade{V}($p(b)*v,d)
end
for B MSB
@eval $c(b::$B) = value(b)0 ? value(b)*$c(basis(b)) : g_zero(vectorspace(b))
Expand Down Expand Up @@ -773,7 +774,7 @@ function generate_products(Field=Field,VEC=:mvec,MUL=:*,ADD=:+,SUB=:-,CONJ=:conj
end
for side (:left,:right)
c,p = Symbol(:complement,side),Symbol(:parity,side)
h,pg = Symbol(c,:hodge), Symbol(p,:hodge)
h,pg,pn = Symbol(c,:hodge),Symbol(p,:hodge),Symbol(p,:null)
for (c,p) ((c,p),(h,pg))
for Chain MSC
@eval begin
Expand All @@ -786,7 +787,8 @@ function generate_products(Field=Field,VEC=:mvec,MUL=:*,ADD=:+,SUB=:-,CONJ=:conj
@inbounds val = b.v[k]
if val0
@inbounds p = $p(V,ib[k])
v = typeof(V)<:Signature ? (p ? $SUB(val) : val) : p*val
v = $(ch ? :($pn(V,ib[k],val)) : :val)
v = typeof(V)<:Signature ? (p ? $SUB(v) : v) : p*v
@inbounds setblade!(out,v,complement(N,ib[k],D,P),Dimension{N}())
end
end
Expand All @@ -805,7 +807,8 @@ function generate_products(Field=Field,VEC=:mvec,MUL=:*,ADD=:+,SUB=:-,CONJ=:conj
@inbounds for i 1:bn[g]
@inbounds val = m.v[bs[g]+i]
if val0
v = typeof(V)<:Signature ? ($p(V,ib[i]) ? $SUB(val) : val) : $p(V,ib[i])*val
v = $(ch ? :($pn(V,ib[i],val)) : :val)
v = typeof(V)<:Signature ? ($p(V,ib[i]) ? $SUB(v) : v) : $p(V,ib[i])*v
@inbounds setmulti!(out,v,complement(N,ib[i],D,P),Dimension{N}())
end
end
Expand Down
13 changes: 11 additions & 2 deletions src/parity.jl
Expand Up @@ -23,13 +23,22 @@ end
for side (:left,:right)
p = Symbol(:parity,side)
pg = Symbol(p,:hodge)
pn = Symbol(p,:null)
@eval begin
@pure $p(V::Bits,B::Bits,N::Int) = $p(0,sum(indices(B,N)),count_ones(B),N)
@pure $pg(V::Bits,B::Bits,N::Int) = $pg(count_ones(V&B),sum(indices(B,N)),count_ones(B),N)
@inline $pn(V,B,v) = v
@inline function $pn(V::Signature,B,v)
hi,ho = hasinf(V),hasorigin(V)
if (hi||ho) && (hi+ho==2 ? count_ones(B&UInt(3))==1 : isodd(B))
(hi+ho==2 ? isodd(B) : hi) ? (2v) : (v/2)
else
v
end
end
@pure function $p(V::Signature,B,G=count_ones(B))
o = hasinf(V) && (hasorigin(V) ? iszero(B&UInt(2))&(!iszero(B&UInt(1))) : isodd(B))
b = B&(UInt(1)<<(ndims(V)-diffvars(V))-1)
$p(0,sum(indices(b,ndims(V))),count_ones(b),ndims(V)-diffvars(V))o
$p(0,sum(indices(b,ndims(V))),count_ones(b),ndims(V)-diffvars(V))
end
@pure function $pg(V::Signature,B,G=count_ones(B))
o = hasorigin(V) && (hasinf(V) ? iszero(B&UInt(1))&(!iszero(B&UInt(2))) : isodd(B))
Expand Down

0 comments on commit 74b9366

Please sign in to comment.