function [O,U] = average_models(M, T)
% [O,U] = average_models(M,T)
%   Take 25 element model array M from train_chord_models and
%   average them, suitably rotated, across all root notes for both
%   major and minor.
%   Improves .^.25 chroma on beatles test set fro 75.5% to 76.1%
%   T is initial transition matrix, U is smoothed version.
% 2013-05-08 Dan Ellis [email protected]

% Initialize output; copy N model
O = M;
U = T;

nchrm = 12;
nmodel = 25;

for bank = 1:2;
  
  % Form averages
  cmean = 0 * M(1).mean;
  ccov = 0 * M(1).sigma;
  ctran = 0 * T(2:end, 1);
  
  for i = 1:nchrm
    model = nchrm*(bank - 1) + i + 1; % +1 to skip M(1) = N
    cmean = cmean + chromrot2(M(model).mean, i-1);
    ccov  = ccov  + chromrot2(chromrot2(M(model).sigma, i-1)', i-1)';
    % Transitions
    ctran = ctran + chromrot2(T(2:end,model), i-1);
  end
  
  % averages
  cmean = cmean/nchrm;
  ccov = ccov/nchrm;
  ctran = ctran/nchrm;
  
  % Write back
  for i = 1:nchrm
    model = nchrm*(bank - 1) + i + 1;
    O(model).mean  = chromrot2(cmean, -(i-1));
    O(model).sigma = chromrot2(chromrot2(ccov, -(i-1))', -(i-1))';
    U(2:end,model) = chromrot2(ctran, -(i-1));
  end
  
  % Transitions
  
end