% L=dmin_init(nstates,ninput,trellis_transition,trellis_output,ndepth,dmin_ub)
% Initialize list L with information about states. nstates are the
% number of trellis states, ninput are the number of input bits,
% and trellis_transition, trellis_output are determined from the
% trellis description. ndepth is the distance depth, and dmin_ub is
% some finite upper bound for the minimum distance.
% The list is modelled as a matrix, where each row represents a state. 
% The columns correspondingly represent the quantities of minimum
% distance, number of minimum distance (and subsequent) paths,
% and number of bits corresponding to the number of minimum distance (and
% subsequent) paths.
%
% George Ginis, May 2001

function L=...
   dmin_init(nstates,ninput,trellis_transition,trellis_output,ndepth,dmin_ub)

  % initialize matrix keeping information about states 
  L=zeros(nstates,1+2*(ndepth+1));
  L(:,1)=dmin_ub*ones(size(L,1),1);  
  % initialize distances to the upper bound value 
    
  % assuming that the initial state is 1, iterate for all possible inputs 
  for m=1:2^ninput 
    
    % produce all possible output states and output values
    [st(m) out(m)] = trellis_fn(1,m-1,trellis_transition,trellis_output);
       
  end
  
  for m=2:2^ninput   % iterate for all possible inputs resulting in divergence 
    		       
    % compute distance between path leading to state st(m) and 0 path	  
    dp=bdistance(out(m),out(1));
    
    % compute number of differing bits between the path ending at
    % state st(m) and the "top" path
    Nbp=bdistance(m-1,0);    
    
    % set up polynomial with neighbors information 
    poly_neighb = zeros(1,ndepth+2);
    poly_neighb(1) = dp;
    poly_neighb(2) = 1;
    
    % update matrix with neighbors information for target state 
    L(st(m),1:ndepth+2) = ...
	polyadd( L(st(m),1:ndepth+2), poly_neighb(1:ndepth+2) ); 
 
    % set up polynomial with bits information 
    poly_bits = zeros(1,ndepth+2);
    poly_bits(1) = dp; 
    poly_bits(2) = Nbp;
    
    % update matrix with bits information for target state
    poly_bits_add = polyadd( ...
	[L(st(m),1) L(st(m),ndepth+3:2*ndepth+3)] , poly_bits(1:ndepth+2) );
    L(st(m),ndepth+3:2*ndepth+3) = poly_bits_add(2:ndepth+2);
 
  end
  
    




