clear; close all; 
%% parameters 
scaleFilter = 2.;  % scale of Gabors, length = 17 pixels
saturation = 6.; % saturation level for sigmoid transformation
epsilon = .1; % tolerance for overlap
binSize = .2;  % binsize for computing histogram of q()
%% read in negative examples 
imageName = dir('negativeImage\*.jpg');  % folder that contains negative examples as q(I)
numImage = size(imageName, 1); % number of negative examples
imageSize = zeros(numImage, 2); % size of negative examples
for i = 1 : numImage
    tmpIm = imread(['negativeImage' '\' imageName(i).name]);
    if size(tmpIm,3) == 3
        tmpIm = rgb2gray(tmpIm);
    end
    I{i} = imresize(double(tmpIm), 1, 'nearest'); 
    imageSize(i, :) = size(I{i});
end
sizex = min(imageSize(:, 1)); sizey = min(imageSize(:, 2)); 
for i = 1 : numImage
    I{i} = I{i}(1:sizex, 1:sizey); 
end   % make the sizes of the training images to be the same
%% filtering negative examples
disp(['start filtering']);
tic
[dogFilter, dogSymbol, Correlation, halfFilterSize] = Dog(scaleFilter, epsilon);  % generate Gabor filters 
allFilteredImage = ApplyFilterfftSame(I, dogFilter);  % filter training images
disp(['filtering time: ' num2str(toc) ' seconds']);
%% compute histogram of q()
numBin = floor(saturation/binSize)+1;  % binnumbers
histog = zeros(numBin, 1);  % store F  
mex Chistogram.c;   % compile C code
disp(['start histogramming']);
Chistogram(numImage, allFilteredImage, halfFilterSize, sizex, sizey, binSize, numBin, histog, saturation);
disp(['histogramming time: ' num2str(toc) ' seconds']);
%% compute stored lambda, expectation, logZ
figure; 
r = (0:(numBin-1))*binSize;
plot(r, histog); 
figure; 
numStoredPoint = 50; 
storedExpectation = zeros(numStoredPoint, 1); 
Z = zeros(numStoredPoint, 1); 
for (k=1:numStoredPoint)
   lambda = (k-1.)/10.; 
   p = exp(lambda*r).*(histog'); 
   Z(k) = sum(p*binSize); p = p/Z(k); 
   storedExpectation(k) = sum(r.*p*binSize);
end
storedlambda = (0:(numStoredPoint-1))/10.; 
storedLogZ = log(Z); 
subplot(2, 1, 1); plot(storedlambda, storedExpectation);
subplot(2, 1, 2); plot(storedlambda, storedLogZ);
save 'storedExponentialModel' numStoredPoint storedlambda storedExpectation storedLogZ ...
      saturation scaleFilter halfFilterSize dogFilter dogSymbol Correlation; 
  




