From ec22cf84353a6b6f2755c78efbe50c6f9544c2ef Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Adjemian=20=28Charybdis=29?=
 <stephane.adjemian@univ-lemans.fr>
Date: Mon, 17 Oct 2016 20:18:43 +0200
Subject: [PATCH] Added method firstobservedperiod.

Returns the first period without NaNs.

Closes #15

(cherry picked from commit 1fa923a3c2e990af2d289966f2b6ca5b772b8bfa)
---
 src/@dseries/firstobservedperiod.m | 62 ++++++++++++++++++++++++++++++
 src/@dseries/isnan.m               | 30 +++++++++++++++
 src/@dseries/subsref.m             |  2 +-
 3 files changed, 93 insertions(+), 1 deletion(-)
 create mode 100644 src/@dseries/firstobservedperiod.m
 create mode 100644 src/@dseries/isnan.m

diff --git a/src/@dseries/firstobservedperiod.m b/src/@dseries/firstobservedperiod.m
new file mode 100644
index 0000000..1f5b287
--- /dev/null
+++ b/src/@dseries/firstobservedperiod.m
@@ -0,0 +1,62 @@
+function d = firstobservedperiod(o) % --*-- Unitary tests --*--
+
+% Returns the first period where all the variables are observed (first period without NaNs).
+%
+% INPUTS 
+% - o [dseries]    with N variables and T periods.
+%
+% OUTPUTS 
+% - b [dates]      First period where the N variables are observed (without NaNs).
+
+% Copyright (C) 2016 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 <http://www.gnu.org/licenses/>.
+
+b = ~isnan(o);
+c = find(prod(b, 2));
+d = o.firstdate+(c(1)-1);
+
+%@test:1
+%$ try
+%$     ts = dseries([NaN, NaN; NaN, 1; 2, 2; 3, 3; 4, NaN; 5, 5]);
+%$     dd = ts.firstobservedperiod();
+%$     t(1) = true;
+%$ catch
+%$     t(1) = false;
+%$ end
+%$
+%$ if t(1)
+%$     t(2) = isequal(dd, dates('3Y'));
+%$ end
+%$
+%$ T = all(t);
+%@eof:1
+
+%@test:2
+%$ try
+%$     ts = dseries([0, 0; NaN, 1; 2, 2; 3, 3; 4, NaN; 5, 5]);
+%$     dd = ts.firstobservedperiod();
+%$     t(1) = true;
+%$ catch
+%$     t(1) = false;
+%$ end
+%$
+%$ if t(1)
+%$     t(2) = isequal(dd, dates('1Y'));
+%$ end
+%$
+%$ T = all(t);
+%@eof:2
diff --git a/src/@dseries/isnan.m b/src/@dseries/isnan.m
new file mode 100644
index 0000000..d2c79b1
--- /dev/null
+++ b/src/@dseries/isnan.m
@@ -0,0 +1,30 @@
+function b = isnan(o)
+
+% Returns an array of logicals (true/false). Element (t,i) is true iff the i-th variable at
+% period number t is not a NaN.
+%
+% INPUTS 
+% - o [dseries]    with N variables and T periods.
+%
+% OUTPUTS 
+% - b [logical]    T*N array of logicals.
+
+
+% Copyright (C) 2016 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 <http://www.gnu.org/licenses/>.
+
+b = isnan(o.data);
\ No newline at end of file
diff --git a/src/@dseries/subsref.m b/src/@dseries/subsref.m
index 8a928db..ae84061 100644
--- a/src/@dseries/subsref.m
+++ b/src/@dseries/subsref.m
@@ -90,7 +90,7 @@ switch S(1).type
       case 'freq'
         % Returns an integer characterizing the data frequency (1, 4, 12 or 52)
         B = A.dates.freq;
-      case {'lag','lead','hptrend','hpcycle','chain','detrend','exist','mean','std','center'} % Methods with less than two arguments.
+      case {'lag','lead','hptrend','hpcycle','chain','detrend','exist','mean','std','center','firstobservedperiod'} % Methods with less than two arguments.
         if length(S)>1 && isequal(S(2).type,'()')
             if isempty(S(2).subs)
                 B = feval(S(1).subs,A);
-- 
GitLab