Skip to content
Snippets Groups Projects
Commit 99d80c76 authored by Stéphane Adjemian's avatar Stéphane Adjemian
Browse files

Rewrote constructor (new syntax). Adapted initialization routine.

parent d31e6a66
Branches
No related tags found
No related merge requests found
function dd = dates(varargin) % --*-- Unitary tests --*--
classdef dates<handle
%@info:
%! @deftypefn {Function File} {@var{dd} =} dates (@var{a},@var{b},...)
%! @anchor{dates}
%! @sp 1
%! Constructor for the Dynare dates class (unordered sequence of dates).
%! @sp 2
%! @strong{Inputs}
%! @sp 1
%! @table @ @var
%! @item a
%! String, date.
%! @item b
%! @end table
%! @sp 2
%! @strong{Outputs}
%! @sp 1
%! @table @ @var
%! @item dd
%! Dynare dates object.
%! @end table
%! @sp 1
%! @strong{Properties}
%! @sp 1
%! The constructor defines the following properties:
%! @sp 1
%! @table @ @var
%! @item ndate
%! Scalar integer, the number of dates.
%! @item freq
%! Scalar integer, the frequency of the time series. @var{freq} is equal to 1 if data are on a yearly basis or if
%! frequency is unspecified. @var{freq} is equal to 4 if data are on a quaterly basis. @var{freq} is equal to
%! 12 if data are on a monthly basis. @var{freq} is equal to 52 if data are on a weekly basis.
%! @item time
%! Array of integers (nobs*2). The first column defines the years associated to each date. The second column,
%! depending on the frequency, indicates the week, month or quarter numbers. For yearly data or unspecified frequency
%! the second column is filled by ones.
%! @end table
%! @sp 2
%! @strong{This function is called by:}
%! @sp 2
%! @strong{This function calls:}
%!
%! @end deftypefn
%@eod:
% Copyright (C) 2011-2014 Dynare Team
%
% This file is part of Dynare.
% Copyright (C) 2014 Dynare Team
%
% Dynare is free software: you can redistribute it and/or modify
% This code is free software: you can redistribute it and/or modify
% it under the terms of the GNU General Public License as published by
% the Free Software Foundation, either version 3 of the License, or
% (at your option) any later version.
%
% Dynare is distributed in the hope that it will be useful,
% Dynare dates submodule is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
% GNU General Public License for more details.
......@@ -62,107 +15,109 @@ function dd = dates(varargin) % --*-- Unitary tests --*--
% You should have received a copy of the GNU General Public License
% along with Dynare. If not, see <http://www.gnu.org/licenses/>.
% Initialization.
if nargin>0 && ischar(varargin{1}) && isequal(varargin{1},'initialize')
dd = struct('ndat', 0, 'freq', NaN(0), 'time', NaN(0,2));
dd = class(dd,'dates');
assignin('base','emptydatesobject',dd);
return
end
dd = evalin('base','emptydatesobject');
if isequal(nargin, 0)
% Return an empty dates obect
return
end
if all(cellfun(@isdates, varargin))
% Concatenates dates in a dates object.
dd = horzcat(varargin{:});
return
end
if all(cellfun(@isstringdate,varargin))
% Concatenates dates in a dates object.
tmp = cellfun(@string2date,varargin);
if all([tmp.freq]-tmp(1).freq==0)
dd.freq = tmp(1).freq;
else
error('dates::dates: Wrong calling sequence of the constructor! All dates must have common frequency.')
end
dd.ndat = length(tmp);
dd.time = transpose(reshape([tmp.time],2,dd.ndat));
return
end
if isequal(nargin,1) && isfreq(varargin{1})
% Instantiate an empty dates object (only set frequency)
if ischar(varargin{1})
dd.freq = string2freq(varargin{1});
else
dd.freq = varargin{1};
end
return
end
if isequal(nargin,3) && isfreq(varargin{1})
if ischar(varargin{1})
dd.freq = string2freq(varargin{1});
else
dd.freq = varargin{1};
properties
ndat = []; % Number of dates (integer scalar)
freq = []; % Frequency (integer scalar)
time = []; % Array (ndat rows and two columns)
end
if (isnumeric(varargin{2}) && isvector(varargin{2}) && all(isint(varargin{2})))
if isnumeric(varargin{3}) && isvector(varargin{3}) && all(isint(varargin{3}))
if all(varargin{3}>=1) && all(varargin{3}<=dd.freq)
dd.time = [varargin{2}(:), varargin{3}(:)];
dd.ndat = size(dd.time,1);
else
error(sprintf('dates::dates: Wrong calling sequence of the constructor! Third input must contain integers between 1 and %i.',dd.freq))
methods
function o = dates(varargin)
if ~nargin
% Returns empty dates object.
o.ndat = 0;
o.freq = NaN(0);
o.time = NaN(0,2);
return
end
else
error('dates::dates: Wrong calling sequence of the constructor! Third input must be a vector of integers.')
end
else
error('dates::dates: Wrong calling sequence of the constructor! Second input must be a vector of integers.')
end
return
end
if isequal(nargin,2) && isfreq(varargin{1})
if ischar(varargin{1})
dd.freq = string2freq(varargin{1});
else
dd.freq = varargin{1};
end
if isequal(dd.freq, 1)
if (isnumeric(varargin{2}) && isvector(varargin{2}) && isint(varargin{2}))
dd.time = [varargin{2}, ones(length(varargin{2}),1)];
dd.ndat = size(dd.time,1);
return
else
error('dates::dates: Wrong calling sequence of the constructor! Second input must be a vector of integers.')
end
else
if isequal(size(varargin{2},2), 2)
if all(isint(varargin{2}(:,1))) && all(isint(varargin{2}(:,1)))
if all(varargin{2}(:,2)>=1) && all(varargin{2}(:,2)<=dd.freq)
dd.time = [varargin{2}(:,1), varargin{2}(:,2)];
dd.ndat = size(dd.time,1);
if all(cellfun(@isdates, varargin))
% Concatenates dates objects in a dates object.
o = horzcat(varargin{:});
return
end
if all(cellfun(@isstringdate,varargin))
% Concatenates dates in a dates object.
tmp = cellfun(@string2date,varargin);
if all([tmp.freq]-tmp(1).freq==0)
o.freq = tmp(1).freq;
else
error(sprintf('dates::dates: Wrong calling sequence of the constructor! Second column of the last input must contain integers between 1 and %i.',dd.freq))
error('dates:ArgCheck', 'All dates passed as inputs must have the same frequency!')
end
else
error('dates::dates: Wrong calling sequence! Second input argument must be an array of integers.')
o.ndat = length(tmp);
o.time = transpose(reshape([tmp.time],2,o.ndat));
return
end
else
error('dates::dates: Wrong calling sequence!')
end
end
return
end
if isequal(nargin,1) && isfreq(varargin{1})
% Instantiate an empty dates object (only set frequency)
o = dates();
if ischar(varargin{1})
o.freq = string2freq(varargin{1});
else
o.freq = varargin{1};
end
return
end
if isequal(nargin,3) && isfreq(varargin{1})
o = dates();
if ischar(varargin{1})
o.freq = string2freq(varargin{1});
else
o.freq = varargin{1};
end
if (isnumeric(varargin{2}) && isvector(varargin{2}) && all(isint(varargin{2})))
if isnumeric(varargin{3}) && isvector(varargin{3}) && all(isint(varargin{3}))
if all(varargin{3}>=1) && all(varargin{3}<=o.freq)
o.time = [varargin{2}(:), varargin{3}(:)];
o.ndat = size(o.time,1);
else
error('dates:ArgCheck','Third input must contain integers between 1 and %i.', o.freq)
end
else
error('dates:ArgCheck','Third input must be a vector of integers.')
end
else
error('dates:ArgCheck','Second input must be a vector of integers.')
end
return
end
if isequal(nargin,2) && isfreq(varargin{1})
o = dates();
if ischar(varargin{1})
o.freq = string2freq(varargin{1});
else
o.freq = varargin{1};
end
if isequal(o.freq, 1)
if (isnumeric(varargin{2}) && isvector(varargin{2}) && isint(varargin{2}))
o.time = [varargin{2}, ones(length(varargin{2}),1)];
o.ndat = size(o.time,1);
return
else
error('dates:ArgCheck','Second input must be a vector of integers.')
end
else
if isequal(size(varargin{2},2), 2)
if all(isint(varargin{2}(:,1))) && all(isint(varargin{2}(:,1)))
if all(varargin{2}(:,2)>=1) && all(varargin{2}(:,2)<=o.freq)
o.time = [varargin{2}(:,1), varargin{2}(:,2)];
o.ndat = size(o.time,1);
else
error('dates:ArgCheck','Second column of the last input must contain integers between 1 and %i.',o.freq)
end
else
error('dates:ArgCheck','Second input argument must be an array of integers.')
end
else
error('dates:ArgCheck','Wrong calling sequence!')
end
end
return
end
error('dates:ArgCheck','You should first read the manual!')
end % dates constructor.
end % methods
end % classdef
error('dates::dates: Wrong calling sequence!')
%@test:1
%$ % Define some dates
......
......@@ -6,9 +6,6 @@ addpath([dates_src_root '/utilities/is'])
addpath([dates_src_root '/utilities/op'])
addpath([dates_src_root '/utilities/convert'])
% Add empty dates object in the base workspace
dates('initialize');
% Add missing routines if dynare is not in the path
if ~exist('isint','file')
addpath([dates_src_root '/utilities/missing/isint'])
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment