function [b, alphas] = kernelSVM(trainImages, trainLabels, C, dis, tolerance, one)
% tic;
[m,n] = size(trainImages);
%Calculate the Gaussian kernel and change the label,sig2
%计算高斯核并更改标签sig2
kernels = zeros(m,m);
for i = 1 : m
    if trainLabels(i) == one;
        trainLabels(i) = 1;
    else
        trainLabels(i) = -1;
    end
    kernels(:,i) = Kernel(trainImages,trainImages(i,:),16.75);
end

b = 0;
change = 0;
alphas = zeros(m,1);

while (change < tolerance)
    alphaChange = 0;
    for i = 1 : m
        %计算ui和Ei
        %Calculate UI and EI
        ui = double(alphas .* trainLabels)' * kernels(:,i) + b;
        Ei = ui - double(trainLabels(i));
        if (((trainLabels(i) * Ei < -dis) && (alphas(i) < C)) || ((trainLabels(i) * Ei > dis) && (alphas(i) > 0)))
            j = unidrnd(m);
            while (j == i)
                j = unidrnd(m);
            end
            uj = double((alphas .* trainLabels)' * kernels(:,j) + b);
            Ej = uj - double(trainLabels(j));
            %记录旧的alpha值
            %Record the old alpha value
            alphaiold = alphas(i);
            alphajold = alphas(j);
            %计算上界和下界
            %Calculate upper and lower bounds
            if trainLabels(i) ~= trainLabels(j)
                L = max(0, alphas(j) - alphas(i));
                H = min(C, C + alphas(j) - alphas(i));
            else
                L = max(0, alphas(j) + alphas(i) - C);
                H = min(C, alphas(j) + alphas(i));
            end
            if L == H
%                 fprintf('L==H\n');
                continue
            end
            %计算eta来更新alpha值
            %Calculate eta to update the alpha value
            eta = 2.0 * kernels(i,j) - kernels(i,i) - kernels(j,j);
            if eta >= 0
%                 fprintf('eta>=0\n');
                continue
            end
            %更新alpha
            %Update alpha
            alphas(j) = alphas(j) - trainLabels(j) * (Ei - Ej) / eta;
            if alphas(j) > H
                alphas(j) = H;
            end
            if alphas(j) < L
                alphas(j) = L;
            end
            if abs(alphas(j) - alphajold) < 0.00001
%                 fprintf('j not moving enough\n');
                continue
            end
            alphas(i) = alphas(i) + trainLabels(j) * trainLabels(i) * (alphajold - alphas(j));
            %更新b
            %Update b
            b1 = b - Ei - trainLabels(i) * (alphas(i) - alphaiold) * kernels(i,i) - trainLabels(j) * (alphas(j) - alphajold) * kernels(i,j);
            b2 = b - Ej - trainLabels(i) * (alphas(i) - alphaiold) * kernels(i,j) - trainLabels(j) * (alphas(j) - alphajold) * kernels(j,j);
                
            if alphas(i) > 0 && alphas(i) < C
                b = b1;
            elseif alphas(j) > 0 && alphas(j) < C
                b = b2;
            else
                b = (b1 + b2) / 2.0;
            end
            alphaChange = alphaChange + 1;
        end
        if alphaChange == 0
            change = change + 1;
        else
            change = 0;
        end
    end
%      fprintf('值为%d\n',iter);
end

% omegas = ((alphas .* trainLabels)' * trainImages)';

% toc;