diff --git a/matlab/@dynDate/minus.m b/matlab/@dynDate/minus.m deleted file mode 100644 index 6546a2676..000000000 --- a/matlab/@dynDate/minus.m +++ /dev/null @@ -1,110 +0,0 @@ -function c = minus(a,b) % --*-- Unitary tests --*-- - -%@info: -%! @deftypefn {Function File} {@var{c} =} minus (@var{a},@var{b}) -%! @anchor{@dynDate/minus} -%! @sp 1 -%! Overloads the minus (soustraction) operator for the Dynare dates class (@ref{dynDate}). Depending on the frequency, computes the number -%! of years, quarters, months, weeks between two dates @var{a} and @var{b} (it is assumed that @var{a}>@var{B}). -%! @sp 2 -%! @strong{Inputs} -%! @sp 1 -%! @table @ @var -%! @item a -%! Dynare date object instantiated by @ref{dynDate}. -%! @item b -%! Dynare date object instantiated by @ref{dynDate}. -%! @end table -%! @sp 1 -%! @strong{Outputs} -%! @sp 1 -%! @table @ @var -%! @item c -%! Integer scalar, the number of years, quarters, months or weeks between @var{a} and @var{B}. -%! @end table -%! @sp 2 -%! @strong{This function is called by:} -%! @sp 2 -%! @strong{This function calls:} -%! @ref{@@dynDate/eq},@ref{@@dynDate/lt} -%! -%! @end deftypefn -%@eod: - -% Copyright (C) 2011-2013 Dynare Team -% -% This file is part of Dynare. -% -% Dynare 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, -% 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. -% -% You should have received a copy of the GNU General Public License -% along with Dynare. If not, see . - -if ~( isa(a,'dynDate') && isa(b,'dynDate') ) - error(['dynDate::minus: Input arguments ' inputname(1) ' and ' inputname(2) ' must be dynDate objects!']) -end - -if a.freq~=b.freq - error(['dynDate::minus: ' inputname(1) ' and ' inputname(2) ' must have common frequency!']) -end - -if a. -if isempty(B) - C = A; - return -end - -if isempty(A) - C = dynDates(); - return -end - -if ~isequal(A.freq,B.freq) - C = A; - return -end - -D = intersect(A,B); - -if isempty(D) - C = A; -else +if isa(A,'dynDates') && isa(B,'dynDates') + % Concatenate dynDates objects without removing repetitions if A and B are not disjoint sets of dates. + if ~isequal(A.freq,B.freq) + error(['dynDates::minus: Input arguments ''' inputname(1) ''' and ''' inputname(2) ''' must have common frequencies!']) + end + if isempty(A) || isempty(B) + error(['dynDates::minus: Input arguments ''' inputname(1) ''' and ''' inputname(2) ''' must not be empty!']) + end + if ~isequal(length(A),length(B)) + if length(A)==1 + A.time = repmat(A.time,B.ndat,1); + A.ndat = B.ndat; + elseif length(B)==1 + B.time = repmat(B.time,A.ndat,1); + B.ndat = A.ndat; + else + error(['dynDates::minus: Input arguments ''' inputname(1) ''' and ''' inputname(2) ''' lengths are not consistent!']) + end + end + C = zeros(length(A),1); + id = find(~(A==B)); + if isempty(id) + return + end + C(id) = A.time(id,2)-B.time(id,2) + (A.time(id,1)-B.time(id,1))*A.freq; +elseif isa(A,'dynDates') && ( (isvector(B) && isequal(length(B),A.ndat) && all(isint(B))) || isscalar(B) && isint(B) || isequal(length(A),1) && isvector(B) && all(isint(B))) C = dynDates(); C.freq = A.freq; - C.time = setdiff(A.time,D.time,'rows'); + C.time = add_periods_to_array_of_dates(A.time, A.freq, -B); C.ndat = rows(C.time); +elseif isa(B,'dynDates') && ( (isvector(A) && isequal(length(A),B.ndat) && all(isint(A))) || isscalar(A) && isint(A) ) + C = dynDates(); + C.freq = A.freq; + C.time = add_periods_to_array_of_dates(B.time, B.freq, -A); + C.ndat = rows(C.time); +else + error('dynDates::plus: I don''t understand what you want to do! Check the manual.') end %@test:1 %$ % Define some dynDates objects -%$ d1 = dynDate('1950Q1'):dynDate('1959Q4') ; -%$ d2 = dynDate('1960Q1'):dynDate('1969Q4') ; -%$ d3 = d1+d2; -%$ +%$ d1 = dynDates('1950Q1','1950Q2','1960Q1'); +%$ d2 = dynDates('1950Q3','1950Q4','1960Q1'); +%$ d3 = dynDates('2000Q1'); +%$ d4 = dynDates('2002Q2'); %$ % Call the tested routine. -%$ e1 = d1-d2; -%$ e2 = d3-d1; +%$ try +%$ e1 = d2-d1; +%$ e2 = d4-d3; +%$ t(1) = 1; +%$ catch +%$ t(1) = 0; +%$ end %$ -%$ % Check the results. -%$ t(1) = dyn_assert(e1==d1,1); -%$ t(2) = dyn_assert(e2==d2,1); +%$ if t(1) +%$ t(2) = dyn_assert(e1,[2; 2; 0]); +%$ t(3) = dyn_assert(e2,9); +%$ end %$ T = all(t); -%@eof:1 \ No newline at end of file +%@eof:1 + +%@test:2 +%$ % Define some dynDates objects +%$ d1 = dynDates('1950Y','1951Y','1953Y'); +%$ d2 = dynDates('1951Y','1952Y','1953Y'); +%$ d3 = dynDates('2000Y'); +%$ d4 = dynDates('1999Y'); +%$ % Call the tested routine. +%$ try +%$ e1 = d2-d1; +%$ e2 = d4-d3; +%$ t(1) = 1; +%$ catch +%$ t(1) = 0; +%$ end +%$ +%$ if t(1) +%$ t(2) = dyn_assert(e1,[1; 1; 0]); +%$ t(3) = dyn_assert(e2,-1); +%$ end +%$ T = all(t); +%@eof:2 + +%@test:3 +%$ % Define some dynDates objects +%$ d1 = dynDates('2000Y'); +%$ d2 = dynDates('1999Y'); +%$ % Call the tested routine. +%$ try +%$ e1 = d1-1; +%$ e2 = d2-(-1); +%$ t(1) = 1; +%$ catch +%$ t(1) = 0; +%$ end +%$ +%$ if t(1) +%$ t(2) = dyn_assert(isequal(e1,d2),1); +%$ t(3) = dyn_assert(isequal(e2,d1),1); +%$ end +%$ T = all(t); +%@eof:3 + +%@test:4 +%$ % Define some dynDates objects +%$ d1 = dynDates('2000Q1'); +%$ e1 = dynDates('1999Q4','1999Q3','1999Q2','1999Q1','1998Q4'); +%$ % Call the tested routine. +%$ try +%$ f1 = d1-transpose(1:5); +%$ t(1) = 1; +%$ catch +%$ t(1) = 0; +%$ end +%$ +%$ if t(1) +%$ t(2) = dyn_assert(isequal(e1,f1),1); +%$ end +%$ T = all(t); +%@eof:4 + +%@test:5 +%$ % Define some dynDates objects +%$ d1 = dynDates('1999Q4','1999Q3','1999Q2','1999Q1','1998Q4'); +%$ e1 = dynDates('2000Q1')*5; +%$ % Call the tested routine. +%$ try +%$ f1 = d1-(-transpose(1:5)); +%$ t(1) = 1; +%$ catch +%$ t(1) = 0; +%$ end +%$ +%$ if t(1) +%$ t(2) = dyn_assert(isequal(e1,f1),1); +%$ end +%$ T = all(t); +%@eof:5 \ No newline at end of file