function example_dirac_adjoint()

COMPILATION

    [exdir,~,~]=fileparts(which('example_dirac_adjoint.m'));
    % compile the model
    amiwrap('model_dirac_adjoint','model_dirac_adjoint_syms',exdir)
Generating model struct ...
Parsing model struct ...
Generating C code ...
headers | wrapfunctions | Compiling mex file ...
amici | Building with 'Xcode with Clang'.
MEX completed successfully.
Building with 'Xcode with Clang'.
MEX completed successfully.

SIMULATION

    % time vector
    tout = linspace(0,4,9);
    tfine = linspace(0,4,10001);
    p = [1;0.4;2;3];
    k = [];

    D.Y = [  0.00714742903826096
        -0.00204966058299775
        0.382159034587845
        0.33298932672138
        0.226111476113441
        0.147028440865854
        0.0882468698791813
        0.0375887796628869
        0.0373422340295005];

    D.Sigma_Y = 0.01*ones(size(D.Y));


    options.sensi = 1;
    options.sensi_meth = 'adjoint';
    options.maxsteps = 1e5;
    sol = simulate_model_dirac_adjoint(tout,log10(p),k,D,options);
    options.sensi = 0;
    solfine = simulate_model_dirac_adjoint(tfine,log10(p),k,[],options);
    figure
    errorbar(tout,D.Y,D.Sigma_Y)
    hold on
    plot(tfine,solfine.y)
    legend('data','simulation')
    xlabel('time t')
    ylabel('observable')
    title(['log-likelihood: ' num2str(sol.llh) ])

FD

    eps = 1e-4;
    xi = log10(p);
    grad_fd_f = NaN(4,1);
    grad_fd_b = NaN(4,1);
    for ip = 1:4;
        options.sensi = 0;
        xip = xi;
        xip(ip) = xip(ip) + eps;
        solpf = simulate_model_dirac_adjoint(tout,xip,k,D,options);
        grad_fd_f(ip,1) = (solpf.llh-sol.llh)/eps;
        xip = xi;
        xip(ip) = xip(ip) - eps;
        solpb = simulate_model_dirac_adjoint(tout,xip,k,D,options);
        grad_fd_b(ip,1) = -(solpb.llh-sol.llh)/eps;
    end

    figure
    plot(abs(grad_fd_f),abs(sol.sllh),'o')
    hold on
    plot(abs(grad_fd_b),abs(sol.sllh),'o')
    set(gca,'XScale','log')
    set(gca,'YScale','log')
    hold on
    axis square
    plot([1e2,1e4],[1e2,1e4],'k:')
    xlim([1e2,1e4])
    ylim([1e2,1e4])
    legend('forward FD','backward FD','Location','SouthEast')
    xlabel('adjoint sensitivity absolute value of gradient element')
    ylabel('computed absolute value of gradient element')
    set(gcf,'Position',[100 300 1200 500])

    drawnow
end