function cae = caebbp(cae)

    %%  backprop deltas
    for i = 1 : numel(cae.o)
        %  output delta delta
        cae.odd{i} = (cae.o{i} .* (1 - cae.o{i}) .* cae.edgemask) .^ 2;
        %  delta delta c
        cae.ddc{i} = sum(cae.odd{i}(:)) / size(cae.odd{i}, 1);
    end

    for j = 1 : numel(cae.a)   %  calc activation delta deltas
        z = 0;
        for i = 1 : numel(cae.o)
             z = z + convn(cae.odd{i}, flipall(cae.ok{i}{j} .^ 2), 'full');
        end
        cae.add{j} = (cae.a{j} .* (1 - cae.a{j})) .^ 2 .* z;
    end

    %%  calc params delta deltas
    ns = size(cae.odd{1}, 1);
    for j = 1 : numel(cae.a)
        cae.ddb{j} = sum(cae.add{j}(:)) / ns;
        for i = 1 : numel(cae.o)
            cae.ddok{i}{j} = convn(flipall(cae.a{j} .^ 2), cae.odd{i}, 'valid') / ns;
            cae.ddik{i}{j} = convn(cae.add{j}, flipall(cae.i{i} .^ 2), 'valid') / ns;
        end
    end

end