%BAYESC Bayes classifier based on given density estimates
%
%		W = BAYESC(WA,WB, ... ,P,LABLIST)
%   D = X*W
%
% INPUT
%   WA, WB, ... Trained mappings for supplying class density estimates
%   P           Vector with class prior probabilities 
%               Default: equal priors
%   LABLIST    	List of class names (labels)
%   X           Testset
%
% OUTPUT
%    W          Bayes classifier.
%    D          Classification matrix
%
% DESCRIPTION
% The trained mappings WA,WB, ... should supply proper densities estimates
% D for a dataset X by D = X*WA, etcetera. E.g. they should be trained by
% commands like GAUSSM(A), PARZENM(A), KNNM(A). Consequently, they should
% have a size of K x 1 (assuming that X and A are K-dimensional). Also
% sizes of K x N are supported, assuming a combined density estimate for N
% classes simultaneously. BAYESC weighs the class densitites by the class
% priors in P and names the classes by LABLIST. If LABLIST is not supplied,
% the labels stored in the mappings are used.
%
% REFERENCES
% 1. R.O. Duda, P.E. Hart, and D.G. Stork, Pattern classification, 2nd edition, 
% John Wiley and Sons, New York, 2001.
% 2. A. Webb, Statistical Pattern Recognition, John Wiley && Sons, New York, 2002.
%
% SEE ALSO (<a href="http://37steps.com/prtools">PRTools Guide</a>)
% DATASETS, MAPPINGS, GAUSSM, PARZENM, KNNM

% Copyright: R.P.W. Duin, duin@ph.tn.tudelft.nl
% Faculty of Applied Sciences, Delft University of Technology
% P.O. Box 5046, 2600 GA Delft, The Netherlands

function w = bayesc(varargin)

	
	n = nargin;
	p = [];
	lablist = [];
	
	if (nargin > 1)
		if nargin > 2 && (~ismapping(varargin{end-1}))
			p = varargin{end-1};
			lablist = varargin{end};
			n = n-2;
		elseif (~ismapping(varargin{end}))
			p = varargin{end};
			n = n-1;
		end
	end
	
	if (nargin < 1 || isempty(varargin{1}))
							% Definition
		w = prmapping(mfilename,'combiner',{p,lablist});
		w = setname(w,'Bayes Classifier');
	
	elseif ismapping(varargin{1})
							% Construction of the trained Bayes Classifier						
		w = [];
		k = size(varargin{1},1);
        wsize = 0;
		for j=1:n
			v =  varargin{j};
			if ~ismapping(v) || getout_conv(v) ~= 0
				error('Density estimating mapping expected and not found')
			end
			if size(v,1) ~= k
				error('Mappings / density estimators should be defined for the same dimensionality')
			end
			w = [w v];
            wsize = wsize + size(v,2);
        end
        w = setsize(w,[k,wsize]);

		c = size(w,2);
		if isempty(p), p = ones(1,c)/c; end
		if length(p) ~= c
			error('Vector with prior probabilities has wrong length')
		end

		if isempty(lablist)
			lablist = getlabels(w);
		end
		if size(lablist,1) ~= c
			error('Label list has wrong size')
		end
		w = w*affine(p(:)');
		w = setlabels(w,lablist);
		w = setname(w,'Bayes Classifier');
		
	else
		
		error('Wrong input')
		
	end
		

