0001 function res = contract( A, X, mu )
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014 V = cell(1, A.order);
0015
0016 Y = A.apply(X);
0017 if mu > 1
0018 left = innerprod( X, Y, 'LR', mu-1 );
0019 left = reshape( left, [X.rank(mu), A.rank(mu), X.rank(mu)] );
0020 left = reshape( permute(left, [1 3 2]), [X.rank(mu)*X.rank(mu), A.rank(mu)] );
0021 tmp = reshape( full(A.U{mu}), [A.rank(mu), A.rank(mu+1), A.size_col(mu), A.size_row(mu)] );
0022 tmp = ipermute( tmp, [1 4 2 3] );
0023 res = left * reshape(tmp, [A.rank(mu), A.size_col(mu)*A.size_row(mu)*A.rank(mu+1)] );
0024
0025 else
0026 tmp = reshape( full(A.U{1}), [A.rank(1), A.rank(2), A.size_col(1), A.size_row(1)] );
0027 tmp = ipermute( tmp, [1 4 2 3] );
0028 res = tmp;
0029
0030 end
0031 if mu < X.order
0032 right = innerprod( X, Y, 'RL', mu+1 );
0033 right = reshape( right, [X.rank(mu+1), A.rank(mu+1), X.rank(mu+1)] );
0034 right = matricize( right, 2);
0035 res = reshape( res, [ X.rank(mu)*X.rank(mu)*A.size_col(mu)*A.size_row(mu), A.rank(mu+1) ]);
0036 res = res * right;
0037 end
0038
0039 res = reshape( res, [X.rank(mu), X.rank(mu), A.size_col(mu), A.size_row(mu), X.rank(mu+1), X.rank(mu+1) ] );
0040 res = permute( res, [1 3 5 2 4 6] );
0041 res = reshape( res, [X.rank(mu)*A.size_col(mu)*X.rank(mu+1), X.rank(mu)*A.size_row(mu)*X.rank(mu+1) ] );
0042
0043 end