From 64d8b4495f46eb3163909c7c6af29d19fdaa9dd4 Mon Sep 17 00:00:00 2001 From: dussong Date: Thu, 31 Oct 2024 10:55:12 +0100 Subject: [PATCH] test RPI - debug --- Project.toml | 1 + src/O3_alternative.jl | 176 ++++++++++++++++++++++++++++++++++++++++- test/test_RI_basis.jl | 66 +++++++++++++++- test/test_RPI_basis.jl | 126 +++++++++++------------------ 4 files changed, 282 insertions(+), 87 deletions(-) diff --git a/Project.toml b/Project.toml index 6eef21a..b820cb9 100644 --- a/Project.toml +++ b/Project.toml @@ -11,6 +11,7 @@ Polynomials4ML = "03c4bcba-a943-47e9-bfa1-b1661fc2974f" SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" SpheriCart = "5caf2b29-02d9-47a3-9434-5931c85ba645" StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" +StatsBase = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" [compat] StaticArrays = "1.5" diff --git a/src/O3_alternative.jl b/src/O3_alternative.jl index 37d10b0..5ade884 100644 --- a/src/O3_alternative.jl +++ b/src/O3_alternative.jl @@ -4,7 +4,7 @@ using PartialWaveFunctions using Combinatorics using LinearAlgebra -export re_basis_new +export re_basis_new, ri_basis_new, ind_corr_s1, ind_corr_s2, MatFmi, ML0 function CG(l,m,L,N) M=m[1]+m[2] @@ -50,6 +50,30 @@ function SetLl0(l,N) return set end +function SetLl(l,N,L) + set = Vector{Int64}[] + for k in abs(l[1]-l[2]):l[1]+l[2] + push!(set, [0; k]) + end + for k in 3:N-1 + setL=set + set=Vector{Int64}[] + for a in setL + for b in abs(a[k-1]-l[k]):a[k-1]+l[k] + push!(set, [a; b]) + end + end + end + setL=set + set=Vector{Int64}[] + for a in setL + if (abs.(a[N-1]-l[N]) <= L)&&(L <= (a[N-1]+l[N])) + push!(set, [a; L]) + end + end + return set +end + # Function that computes the set ML0 function ML0(l,N) setML = [[i] for i in -abs(l[1]):abs(l[1])] @@ -70,7 +94,29 @@ function ML0(l,N) return setML0 end -function re_basis_new(l) +# Function that computes the set ML (relative to equivariance L) +function ML(l,N,L) + setML = [[i] for i in -abs(l[1]):abs(l[1])] + for k in 2:N-1 + set = setML + setML = Vector{Int64}[] + for m in set + append!(setML, [m; lk] for lk in -abs(l[k]):abs(l[k]) ) + end + end + setML0=Vector{Int64}[] + for m in setML + s=sum(m) + for mn in -L-s:L-s + if abs(mn) < abs(l[N])+1 + push!(setML0, [m; mn]) + end + end + end + return setML0 +end + +function ri_basis_new(l) N=size(l,1) L=SetLl0(l,N) r=size(L,1) @@ -89,4 +135,130 @@ function re_basis_new(l) end end return U,M +end + +function re_basis_new(l,L) + N=size(l,1) + Ll=SetLl(l,N,L) + r=size(Ll,1) + if r==0 + return zeros(Float64, 0, 0) + else + setML0=ML(l,N,L) + sizeML0=length(setML0) + U=zeros(Float64, r, sizeML0) + M = Vector{Int64}[] + for (j,m) in enumerate(setML0) + push!(M,m) + for i in 1:r + U[i,j]=CG(l,m,Ll[i],N) + end + end + end + return U,M +end + + +# Function that computes the permutations that let n and l invariant +function Snl(N,n,l) + if n==n[1]*ones(N) + if l==l[1]*ones(N) + return permutations(1:N) + end + end + if N==1 + return Set([[1]]) + elseif (n[N-1],l[N-1])!=(n[N],l[N]) + S=Set() + Sn=Snl(N-1,n[1:N-1],l[1:N-1]) + for x in Sn + append!(x,[N]) + union!(S,Set([x])) + end + else + S=Set() + k=N + while (n[k-1],l[k-1])==(n[k],l[k]) && k>2 + k-=1 + end + if k==2 && (n[1],l[1])==(n[2],l[2]) + return Set(permutations(1:N)) + else + Sn=Snl(k-1,n[1:k-1],l[1:k-1]) + for x in Sn + for s in Set(permutations(k:N)) + y=copy(x) + append!(y,s) + union!(S,Set([y])) + end + end + end + end + return S +end + + +#Function that computes the set of classes using the set Ml0 and the possible permutations +function class(setML0,sigma,N,l) + setclass=Vector{Vector{Int64}}[] + pop!(setML0,zeros(Int64,N)) + while setML0!=Set() + x=pop!(setML0) + p=[x] + for s in sigma + y=x[s] + if y in setML0 + append!(p,[y]) + pop!(setML0,y) + end + end + append!(setclass,[p]) + end + setclasses=Vector{Vector{Int64}}[] + for x in setclass + for y in setclass + if x==y + if minimum(x)==minimum(-x) + if iseven(sum(l)) + append!(setclasses,[x]) + end + end + elseif minimum(x)==minimum(-y) + if y