function [zdata]=mkdatap_anticipated(nperiods,decrulea,decruleb,...
                                     cof,Jbarmat,cofstar,Jstarbarmat,Dstarbarmat,...
                                     regime,regimestart,violvecbool,...
                                     endog_,exog_,irfshock,scalefactormod,init)



nvars = length(endog_);

if nargin<16
    init=zeros(nvars,1);
end

if nargin<15
    scalefactormod=1;
end


nshocks = size(irfshock,1);
for i = 1:nshocks
    shockpos = strmatch(irfshock(i,:), exog_, 'exact');
    if ~isempty(shockpos)
        irfshockpos(i) = shockpos;
    else
        error(['Shock ', irfshock(i,:), ' is not in the model']);
    end
end


nregimes = length(regime);

Cbarmat = cof(:,1:nvars);
Bbarmat = cof(:,nvars+1:2*nvars);
Abarmat = cof(:,2*nvars+1:3*nvars);


% cofstar contains the system for the model when the constraint binds
Cstarbarmat = cofstar(:,1:nvars);
Bstarbarmat = cofstar(:,nvars+1:2*nvars);
Astarbarmat = cofstar(:,2*nvars+1:3*nvars);

% get the time-dependent decision rules

Tmax = regimestart(nregimes)-1;  % Tmax is the position of the last period
                                 % when the constraint binds

if Tmax > 0
    P = zeros(nvars,nvars,Tmax);
    D = zeros(nvars,Tmax);


    invmat = inv((Astarbarmat*decrulea+Bstarbarmat));
    P(:,:,Tmax) = -invmat*Cstarbarmat;
    D(:,Tmax) = -invmat*Dstarbarmat;


    % equivalent to pre-multiplying by the inverse above if the target
    % matrix is invertible. Otherwise it yields the minimum state solution
    %P(:,:,Tmax) = -(Astarbarmat*decrulea+Bstarbarmat)\Cstarbarmat;
    %D(:,Tmax) = -(Astarbarmat*decrulea+Bstarbarmat)\Dstarbarmat;


    for i = Tmax-1:-1:1

        if violvecbool(i)
            invmat = inv(Bstarbarmat+Astarbarmat*P(:,:,i+1));
            P(:,:,i)=-invmat*Cstarbarmat;
            D(:,i) = -invmat*(Astarbarmat*D(:,i+1)+Dstarbarmat);
        else
            invmat = inv(Bbarmat+Abarmat*P(:,:,i+1));
            P(:,:,i)=-invmat*Cbarmat;
            D(:,i) = -invmat*(Abarmat*D(:,i+1));
        end
    end

    if Tmax > 1
        if violvecbool(1)
            E = -invmat*Jstarbarmat;
        else
            E = -invmat*Jbarmat;
        end
    else
        invmat = inv(Astarbarmat*decrulea+Bstarbarmat);
        E = -invmat*Jstarbarmat;

    end


end

% generate data
% history will contain data, the state vector at each period in time will
% be stored columnwise.
history = zeros(nvars,nperiods+1);
history(:,1) = init;
errvec = zeros(length(exog_), 1);

% deal with predetermined conditions
for i = 1:nshocks
    errvec(irfshockpos(i)) = scalefactormod(i);
end

% deal with shocks
irfpos =1;
if irfpos <=Tmax
    history(:,irfpos+1) = P(:,:,irfpos)* history(:,irfpos)+...
        D(:,irfpos) + E*errvec;
else
    history(:,irfpos+1) = decrulea*history(:,irfpos)+decruleb*errvec;
end

% all other periods
for irfpos=2:nperiods+1
    if irfpos <=Tmax
        history(:,irfpos+1) = P(:,:,irfpos)* history(:,irfpos)+...
            D(:,irfpos);
    else
        history(:,irfpos+1) = decrulea*history(:,irfpos);
    end
end


history=history';
zdata = history(2:end,:);