|
| 1 | +# script for Fig.1, Fig.2, Fig.4, Fig.6 |
| 2 | + |
| 3 | +using MultiscaleGraphSignalTransforms, LightGraphs, Plots, LaTeXStrings, MultivariateStats |
| 4 | +pyplot(dpi = 200) |
| 5 | + |
| 6 | +Nx, Ny = 7, 3 |
| 7 | +G = LightGraphs.grid([Nx, Ny]); N = nv(G); |
| 8 | +L = Matrix(laplacian_matrix(G)) |
| 9 | +Q = incidence_matrix(G; oriented = true) |
| 10 | +𝛌, 𝚽 = eigen(L); 𝚽 = 𝚽 .* sign.(𝚽[1, :])'; |
| 11 | + |
| 12 | +#################### Fig. 1(a) eigenvectors by nondecreasing eigenvalue ordering |
| 13 | +plot(layout = Plots.grid(3, 7)) |
| 14 | +for i in 1:N |
| 15 | + heatmap!(reshape(𝚽[:, i],(Nx, Ny))', c = :viridis, cbar = false, |
| 16 | + clims = (-0.4,0.4), frame = :none, ratio = 1, |
| 17 | + title = latexstring("\\phi_{", i-1, "}"), titlefont = 12, |
| 18 | + subplot = i) |
| 19 | +end |
| 20 | +plt = current() |
| 21 | +# savefig(plt, joinpath(@__DIR__, "../paperfigs/grid7x3_evsp_title.png")) |
| 22 | + |
| 23 | +#################### Fig. 1(b) eigenvectors by natural frequency ordering |
| 24 | +# find correct 2D index |
| 25 | +grid2eig_ind = [1,2,3,6,8,12,15,4,5,7,9,13,16,18,10,11,14,17,19,20,21]; |
| 26 | +eig2grid_ind = sortperm(grid2eig_ind); |
| 27 | +eig2dct = Array{Int64,3}(undef, Nx, Ny, 2); |
| 28 | +for i = 1:Nx; for j = 1:Ny; eig2dct[i,j,1] = i-1; eig2dct[i,j,2] = j-1; end; end |
| 29 | +eig2dct = reshape(eig2dct, (N, 2)); eig2dct = eig2dct[eig2grid_ind, :]; |
| 30 | + |
| 31 | +plot(layout = Plots.grid(3, 7)) |
| 32 | +for i in 1:N |
| 33 | + k = grid2eig_ind[i] |
| 34 | + heatmap!(reshape(𝚽[:,k],(Nx,Ny))', c = :viridis, cbar = false, |
| 35 | + clims = (-0.4,0.4), frame = :none, ratio = 1, |
| 36 | + title = latexstring("\\varphi_{", string(eig2dct[k,1]), |
| 37 | + ",", string(eig2dct[k,2]), "}"), titlefont = 12, subplot = i) |
| 38 | +end |
| 39 | +plt = current() |
| 40 | +# savefig(plt, joinpath(@__DIR__, "../paperfigs/grid7x3_dct_title2.png")) |
| 41 | + |
| 42 | +# DAG pseudo-metric |
| 43 | +distDAG = eigDAG_Distance(𝚽, Q, N) |
| 44 | + |
| 45 | +# MDS embedding into R² |
| 46 | +D = distDAG |
| 47 | +E = transform(fit(MDS, D, maxoutdim=2, distances=true)) |
| 48 | + |
| 49 | +# set up all heatmap plots' positions |
| 50 | +dx = 0.01; dy = dx; |
| 51 | +xej = zeros(Nx, N); yej=zeros(Ny, N); |
| 52 | +a = 5.0; b = 9.0; |
| 53 | +for k = 1:N |
| 54 | + xej[:,k] = LinRange(E[1,k] - Ny * a * dx, E[1, k] + Ny * a * dx, Nx) |
| 55 | + yej[:,k] = LinRange(E[2,k] - a * dy, E[2, k] + a * dy, Ny) |
| 56 | +end |
| 57 | + |
| 58 | +#################### Fig. 2 |
| 59 | +plot() |
| 60 | +for k=1:N |
| 61 | + heatmap!(xej[:, k], yej[:, k], reshape(𝚽[:, k], (Nx, Ny))', c = :viridis, |
| 62 | + colorbar = false, ratio = 1, annotations = (xej[4, k], |
| 63 | + yej[3, k] + b*dy, text(latexstring("\\varphi_{", |
| 64 | + string(eig2dct[k, 1]), ",", string(eig2dct[k, 2]), "}"), 10))) |
| 65 | +end |
| 66 | +plt = plot!(xlim = [-1.4, 1.3], ylim = [-1.4, 1.3], grid = false, clims = (-0.4, 0.4)) |
| 67 | +# savefig(plt, joinpath(@__DIR__, "../paperfigs/Grid7x3_DAG_MDS.png")) |
| 68 | + |
| 69 | +#################### Fig. 4 |
| 70 | +# first level partition |
| 71 | +p1x = [-0.2, 1.0, NaN]; p1y = [1.3, -1.0, NaN]; |
| 72 | +plot!(p1x, p1y, c = :red, legend = false, width = 3) |
| 73 | +# second level partition |
| 74 | +p2x = [-1.0, 0.2, NaN, 0.4, 1.2, NaN]; p2y = [-0.8, 0.45, NaN, 0.25, 0.2, NaN]; |
| 75 | +plot!(p2x, p2y, c=:orange, legend = false, width = 2) |
| 76 | +plt = current() |
| 77 | +# savefig(plt, joinpath(@__DIR__, "../paperfigs/Grid7x3_DAG_2levels_partition.png")) |
| 78 | + |
| 79 | + |
| 80 | +## Build Dual Graph |
| 81 | +Gstar_Sig = dualgraph(distDAG) |
| 82 | +GP_dual = partition_tree_fiedler(Gstar_Sig; swapRegion = false) |
| 83 | +GP_primal = pairclustering(𝚽, GP_dual) |
| 84 | + |
| 85 | +@time VM_NGWP = vm_ngwp(𝚽, GP_dual) |
| 86 | + |
| 87 | +## level 2 VM-NGWP vectors |
| 88 | +j = 3; W_VM = VM_NGWP[:, j, :]' |
| 89 | + |
| 90 | +wav_kl = [[0 0];[0 1];[0 2];[1 0];[1 1];[1 2];[1 3];[2 0];[2 1];[2 2];[3 0]; |
| 91 | + [3 1];[3 2];[3 3];[2 3];[2 4];[2 5];[2 6];[3 4];[3 5];[3 6]]; |
| 92 | +wav_kl = wav_kl[eig2grid_ind,:]; |
| 93 | + |
| 94 | +# reorder_ind = [2,3,1,5,7,4,6, 16,17,15, 9,11,8,10, 18,20,21,19, 13,14,12] |
| 95 | +reorder_ind = [1,3,2,5,7,4,6, 9,10,8,16,18,15,17, 11,13,14,12,20,21,19] |
| 96 | +W_VM = W_VM[:,reorder_ind[eig2grid_ind]]; |
| 97 | +sgn = ones(N); sgn[grid2eig_ind[[4,6,8,10,14]]] .= -1; W_VM = W_VM * Diagonal(sgn); |
| 98 | + |
| 99 | +#################### Fig. 6 |
| 100 | +plot() |
| 101 | +for k=1:N |
| 102 | + heatmap!(xej[:,k],yej[:,k],reshape(W_VM[:,k],(Nx,Ny))',c=:viridis,colorbar=false,ratio=1,annotations=(xej[4,k], yej[3,k]+b*dy, text(latexstring("\\psi_{", string(wav_kl[k,1]), ",", string(wav_kl[k,2]), "}"),10))) |
| 103 | +end |
| 104 | +plot!(aspect_ratio = 1, xlim = [-1.4, 1.3], ylim = [-1.4, 1.3], grid = false, clims=(-0.34,0.34)) |
| 105 | +# first level partition |
| 106 | +p1x = [-0.2, 1.0, NaN]; p1y = [1.3, -1.0, NaN]; plot!(p1x, p1y, c = :red, legend = false, width = 3) |
| 107 | +# second level partition |
| 108 | +p2x = [-1.0, 0.2, NaN, 0.4, 1.2, NaN]; p2y = [-0.8, 0.45, NaN, 0.25, 0.2, NaN]; plot!(p2x, p2y, c=:orange, legend = false, width = 2) |
| 109 | +plt = current() |
| 110 | +# savefig(plt, joinpath(@__DIR__, "../paperfigs/Grid7x3_DAG_VM_NGWP_lvl2_wavelets.png")) |
0 commit comments