main.jl (3834B)
1 #/usr/bin/julia 2 3 using LinearAlgebra 4 using Plots 5 using Plots.Measures 6 using Distributions 7 using LaTeXStrings 8 using TSVD: tsvd 9 using TensorToolbox: tenmat, ttm, contract # todo:implement 10 11 include("arithmetic.jl") 12 include("helpers.jl") 13 include("ttmps.jl") 14 15 function main() 16 # Exercise 3a) 17 n = 10 18 d = 4 19 p_Σ = [] 20 p_R = [] 21 global R_x = []; global R_y = []; global R_s = []; global R_z = [] 22 for (p, q) ∈ ([3, 4], [5, 7]) 23 X = [che_pol(sum([t_1/1, t_2/2, t_3/3, t_4/4]), p) for t_1 ∈ t(n), t_2 ∈ t(n), t_3 ∈ t(n), t_4 ∈ t(n)]; 24 Y = [che_pol(sum([t_1/1, t_2/2, t_3/3, t_4/4]), q) for t_1 ∈ t(n), t_2 ∈ t(n), t_3 ∈ t(n), t_4 ∈ t(n)]; 25 S = X .+ Y; 26 Z = X .* Y; 27 global X_Σ = []; global Y_Σ = []; global S_Σ = []; global Z_Σ = [] 28 global r_x = []; global r_y = []; global r_s = []; global r_z = [] 29 for k ∈ 1:d-1 30 X_k = ttmps_unfold(X, k) 31 Y_k = ttmps_unfold(Y, k) 32 S_k = ttmps_unfold(S, k) 33 Z_k = ttmps_unfold(Z, k) 34 _, σ_x, _ = svd(X_k) 35 _, σ_y, _ = svd(Y_k) 36 _, σ_s, _ = svd(S_k) 37 _, σ_z, _ = svd(Z_k) 38 append!(X_Σ, [σ_x]) 39 append!(Y_Σ, [σ_y]) 40 append!(S_Σ, [σ_s]) 41 append!(Z_Σ, [σ_z]) 42 append!(r_x, rank(X_k)) 43 append!(r_y, rank(Y_k)) 44 append!(r_s, rank(S_k)) 45 append!(r_z, rank(Z_k)) 46 end 47 append!(R_x, [r_x]) 48 append!(R_y, [r_y]) 49 append!(R_s, [r_s]) 50 append!(R_z, [r_z]) 51 52 p_σ = plot(layout = 4, margin=5mm, size=(800, 800), title="p=$p, q=$q", dpi=500) 53 plot!(p_σ[1], X_Σ, markershape=:circle, ylabel=L"\Sigma_{X_k}", label=[L"X_1" L"X_2" L"X_3"]) 54 plot!(p_σ[2], Y_Σ, markershape=:circle, ylabel=L"\Sigma_{Y_k}", label=[L"Y_1" L"Y_2" L"Y_3"]) 55 plot!(p_σ[3], S_Σ, markershape=:circle, ylabel=L"\Sigma_{S_k}", label=[L"S_1" L"S_2" L"S_3"]) 56 plot!(p_σ[4], Z_Σ, markershape=:circle, ylabel=L"\Sigma_{Z_k}", label=[L"Z_1" L"Z_2" L"Z_3"]) 57 append!(p_Σ, [p_σ]) 58 p_r = plot(margin=5mm, size=(500, 350), title="p=$p, q=$q", ylabel=L"r_k", dpi=300) 59 plot!(p_r, r_x, markershape=:circle, label=L"r_X") 60 plot!(p_r, r_y, markershape=:circle, label=L"r_Y") 61 plot!(p_r, r_s, markershape=:circle, label=L"r_S", alpha=0.5) 62 plot!(p_r, r_z, markershape=:circle, label=L"r_Z") 63 append!(p_R, [p_r]) 64 end 65 savefig(p_Σ[1], "./plots/sigma_34.png") 66 savefig(p_Σ[2], "./plots/sigma_57.png") 67 savefig(p_R[1], "./plots/rank_34.png") 68 savefig(p_R[2], "./plots/rank_57.png") 69 70 71 # Exercise 3b) 72 n = 10; p = 5; q = 7 73 dims = [10 for i ∈ 1:4] 74 75 X = [che_pol(sum([t_1/1, t_2/2, t_3/3, t_4/4]), p) for t_1 ∈ t(n), t_2 ∈ t(n), t_3 ∈ t(n), t_4 ∈ t(n)]; 76 Y = [che_pol(sum([t_1/1, t_2/2, t_3/3, t_4/4]), q) for t_1 ∈ t(n), t_2 ∈ t(n), t_3 ∈ t(n), t_4 ∈ t(n)]; 77 S = X .+ Y 78 Z = X .* Y 79 80 #C_x, r_x, σ_x, ϵ_x = tt_svd_ϵ(X, 1e-12); 81 #C_y, r_y, σ_y, ϵ_y = tt_svd_ϵ(Y, 1e-12); 82 C_x, σ_x, ϵ_x = tt_svd(X, R_x[2]); 83 C_y, σ_y, ϵ_y = tt_svd(Y, R_y[2]); 84 C_s = tt_add(C_x, C_y, 1, 1); 85 C_z = tt_mult(C_x, C_y); 86 87 ##Q_s, r_s = t_mpstt_ϵ(C_s, 1e-12); 88 ##Q_z, r_z = t_mpstt_ϵ(C_z, 1e-7); 89 Q_s = t_mpstt(C_s, R_s[2]); 90 Q_z = t_mpstt(C_z, R_z[2]); 91 92 println("Exercise 3b") 93 println("|ttmps_eval(C_s) - S||_F/||S||_F = $(norm(S - ttmps_eval(C_s, dims))/norm(S))") 94 println("|ttmps_eval(C_z) - Z||_F/||Z||_F = $(norm(Z - ttmps_eval(C_z, dims))/norm(Z))") 95 println() 96 println("|ttmps_eval(Q_s) - S||_F/||S||_F = $(norm(S - ttmps_eval(Q_s, dims))/norm(S))") 97 println("|ttmps_eval(Q_z) - Z||_F/||Z||_F = $(norm(Z - ttmps_eval(Q_z, dims))/norm(Z))") 98 end 99 100 main()