% Discrete memoryless channel (DMC) capacity computation.
%
% For more details see:
%
% Geometric Programming Duals of Channel Capacity and Rate Distortion
% by M. Chiang and S. Boyd,
% IEEE Transactions on Information Theory, 2004.
%
% Computes exact capacity of a discrete memoryless channel (DMC)
% via the dual problem, which is a GP. GGPLAB does not return
% dual variables, so we can't retrieve the optimal input distribution.
% The Lagrange dual of the channel capacity problem is GP:
%
% minimize sum(z)
% s.t. prod(z_j^{P_ij}) >= exp(-entr(P^(i))), for i = 1,...,N
%
% where variable is z, and P^(i) is the ith row of the channel matrix P.
%
% Almir Mutapcic 01/18/2005
% transition probability matrix for a discrete memoryless channel
P = [0.3 0.2 0.5; 0.5 0.3 0.2; 0.2 0.5 0.3];
% number of input (N) and output (M) symbols
[N,M] = size(P);
% GP variables
gpvar z(M)
% objective is the channel capacity
obj = sum(z);
% constraints
constr = gpconstraint;
for k = 1:N
constr(k) = exp( -entropy(P(k,:)) ) <= prod( z.^(P(k,:)') );
end
% find the channel capacity
[capacity sol status] = gpsolve(obj,constr);
disp(' ')
disp(['Channel capacity (via dual) is ' num2str(capacity) '.'])