Phylogenetic trees

using TensorDec
normalize_markov! = function(w,A,B,C) 
    for i in 1:size(A,2) 
        l = sum(A[j,i] for j in 1:size(A,1) ) 
        A[:,i] /= l
        w[i] *= l
    end
    for i in 1:size(B,2) 
        l = sum(B[j,i] for j in 1:size(B,1) ) 
        B[:,i] /=l
        w[i] *= l
    end
    for i in 1:size(C,2) 
        l = sum(C[j,i] for j in 1:size(B,1) ) 
        C[:,i] /=l
        w[i] *= l
    end
    w, A,B,C
end
#3 (generic function with 1 method)
A = rand(4,4); B = rand(4,4); C = rand(4,4); w = rand(4);
normalize_markov!(w,A,B,C)
fill(1.,4)'*A, fill(1.,4)'*B, fill(1.,4)'*C
([1.0 1.0 0.9999999999999999 1.0], [1.0 1.0 1.0 1.0], [1.0 1.0 1.0 1.0000000000000002])
t = tensor(w,A,B,C)
4×4×4 Array{Float64, 3}:
[:, :, 1] =
 0.234063  0.285357   0.103462   0.191386
 0.218727  0.286619   0.129707   0.170557
 0.209205  0.425856   0.127264   0.16453
 0.118732  0.0596909  0.0376082  0.0904507

[:, :, 2] =
 0.279874  0.13077    0.0596221  0.199513
 0.142045  0.119766   0.065721   0.0576278
 0.198098  0.165662   0.0709902  0.113465
 0.18737   0.0653088  0.0389776  0.126248

[:, :, 3] =
 0.214867  0.189827   0.0914425  0.141229
 0.208208  0.212696   0.119492   0.119814
 0.191811  0.251241   0.104985   0.10955
 0.129442  0.0745876  0.0493614  0.0743552

[:, :, 4] =
 0.230144  0.216675  0.121418   0.06259
 0.243952  0.240236  0.147113   0.0353593
 0.252846  0.292768  0.151077   0.0547589
 0.169083  0.125945  0.0875379  0.0366872
wd, Ad, Bd, Cd = decompose(t)
normalize_markov!(wd,Ad,Bd,Cd)
([3.694482003721782, 1.96102733362676, 1.9933882246257302, 1.9764764966704675], [0.23483019338633918 0.42554942646819244 0.25252028706635804 0.2766430902822981; 0.2978234858839293 0.08605877236288709 0.41854896891106447 0.20958703618171567; 0.2802151027758203 0.20860858309999522 0.21552452070284817 0.5110844938609499; 0.18713121795391116 0.2797832180689253 0.1134062233197293 0.0026853796750362937], [0.39242341888274107 0.4824959627763829 0.3006722860410282 0.11794789204636491; 0.3363916928314428 0.05907965220726224 0.25264171551452624 0.6479935039796955; 0.23844448244243127 0.015705542950132996 0.17409120103744857 0.12498027721289932; 0.03274040584338476 0.442718842066222 0.27259479740699694 0.10907832676104036], [0.07987462385898321 0.22058914135729182 0.5641953394133821 0.5063951144686444; 0.2017199121133617 0.49158460506530877 0.03576400310373513 0.1216842653870496; 0.19497875857115374 0.1877645100352776 0.3929152368423388 0.2080062783496625; 0.5234267054565015 0.10006174354212186 0.0071254206405438406 0.1639143417946436])
w
4-element Vector{Float64}:
 1.9764764966704738
 1.9610273336266786
 3.6944820037219146
 1.993388224625744
wd
4-element Vector{Float64}:
 3.694482003721782
 1.96102733362676
 1.9933882246257302
 1.9764764966704675
A
4×4 Matrix{Float64}:
 0.276643    0.425549   0.23483   0.25252
 0.209587    0.0860588  0.297823  0.418549
 0.511084    0.208609   0.280215  0.215525
 0.00268538  0.279783   0.187131  0.113406
Ad
4×4 Matrix{Float64}:
 0.23483   0.425549   0.25252   0.276643
 0.297823  0.0860588  0.418549  0.209587
 0.280215  0.208609   0.215525  0.511084
 0.187131  0.279783   0.113406  0.00268538
using LinearAlgebra
norm(t-tensor(wd,Ad,Bd,Cd))
1.577576718862004e-14