1function o = vertcat(varargin) % --*-- Unitary tests --*--
2
3% Overloads vertcat method for dseries objects.
4%
5% INPUTS
6%  o o1    dseries object.
7%  o o2    dseries object.
8%  o ...
9%
10% OUTPUTS
11%  o o     dseries object.
12%
13% EXAMPLE 1
14%  If o1, o2 and o3 are dseries objects containing the same variables over different samples, the following syntax:
15%
16%    o = [o1; o2; o3] ;
17%
18%  merges the samples.
19
20% Copyright (C) 2013-2017 Dynare Team
21%
22% This file is part of Dynare.
23%
24% Dynare is free software: you can redistribute it and/or modify
25% it under the terms of the GNU General Public License as published by
26% the Free Software Foundation, either version 3 of the License, or
27% (at your option) any later version.
28%
29% Dynare is distributed in the hope that it will be useful,
30% but WITHOUT ANY WARRANTY; without even the implied warranty of
31% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
32% GNU General Public License for more details.
33%
34% You should have received a copy of the GNU General Public License
35% along with Dynare.  If not, see <http://www.gnu.org/licenses/>.
36
37if nargin==0
38    o = dseries();
39elseif nargin == 1
40    o = copy(varargin{1});
41elseif nargin>1
42    o = copy(varargin{1});
43    for i=2:nargin
44        o = vertcat_(o, varargin{i});
45    end
46end
47
48function d = vertcat_(b, c)
49d = NaN;
50if ~isequal(frequency(b), frequency(c))
51    error('dseries::vertcat: Frequencies must be common!')
52end
53if ~isequal(vobs(b), vobs(c))
54    error('dseries::vertcat: Number of variables must be common!')
55end
56reorder_variables_in_c = false;
57if ~isequal(b.name, c.name)
58    [t, idx] = ismember(b.name, c.name);
59    if all(t)
60        reorder_variables_in_c = true;
61    else
62        error('dseries::vertcat: Variables must be common!')
63    end
64end
65d = b;
66if reorder_variables_in_c
67    d.data = [b.data; c.data(:,idx)];
68else
69    d.data = [b.data; c.data];
70end
71d.dates = [b.dates; c.dates];
72
73%@test:1
74%$ % Define a data set.
75%$ A = [transpose(1:10),2*transpose(1:10)];
76%$ B = [transpose(1:10),2*transpose(1:10)];
77%$
78%$ % Define names
79%$ A_name = {'A1';'A2'};
80%$ B_name = {'A1';'A2'};
81%$
82%$ % Define expected results.
83%$ e.init = dates(1,1);
84%$ e.freq = 1;
85%$ e.name = {'A1';'A2'};
86%$ e.data = [A;B];
87%$
88%$ % Instantiate two time series objects.
89%$ ts1 = dseries(A,[],A_name,[]);
90%$ ts2 = dseries(B,[],B_name,[]);
91%$
92%$ % Call the tested method.
93%$ try
94%$   ts3 = [ts1;ts2];
95%$   t(1) = 1;
96%$ catch
97%$   t(1) = 0;
98%$ end
99%$
100%$ % Check the results.
101%$ if t(1)
102%$   t(2) = dassert(ts3.init,e.init);
103%$   t(3) = dassert(ts3.freq,e.freq);
104%$   t(4) = dassert(ts3.data,e.data);
105%$   t(5) = dassert(ts3.name,e.name);
106%$   t(6) = dassert(ts3.nobs,20);
107%$ end
108%$ T = all(t);
109%@eof:1
110
111%@test:2
112%$ % Define a data set.
113%$ A = [transpose(1:10),2*transpose(1:10)];
114%$ B = [transpose(1:10),2*transpose(1:10)];
115%$ C = [transpose(1:10),3*transpose(1:10)];
116%$
117%$ % Define names
118%$ A_name = {'A1';'A2'};
119%$ B_name = {'A1';'A2'};
120%$ C_name = {'A1';'A2'};
121%$
122%$ % Define expected results.
123%$ e.init = dates(1,1);
124%$ e.freq = 1;
125%$ e.name = {'A1';'A2'};
126%$ e.data = [A;B;C];
127%$
128%$ % Instantiate two time series objects.
129%$ ts1 = dseries(A,[],A_name,[]);
130%$ ts2 = dseries(B,[],B_name,[]);
131%$ ts3 = dseries(C,[],C_name,[]);
132%$
133%$ % Call the tested method.
134%$ try
135%$   ts4 = [ts1; ts2; ts3];
136%£   t(1) = 1;
137%$ catch
138%$   t(1) = 0;
139%$ end
140%$
141%$
142%$ % Check the results.
143%$ if t(1)
144%$   t(2) = dassert(ts4.init,e.init);
145%$   t(3) = dassert(ts4.freq,e.freq);
146%$   t(4) = dassert(ts4.data,e.data);
147%$   t(5) = dassert(ts4.name,e.name);
148%$   t(6) = dassert(ts4.nobs,30);
149%$ end
150%$ T = all(t);
151%@eof:2
152
153%@test:3
154%$ A = dseries([ones(5,1), 2*ones(5,1)],'1938Q4',{'A1', 'A2'});
155%$ B = dseries([2*ones(2,1), ones(2,1)],'1945Q3',{'A2', 'A1'});
156%$
157%$ try
158%$    C = [A; B];
159%$    t(1) = true;
160%$ catch
161%$    t(1) = false;
162%$ end
163%$
164%$ % Check the results.
165%$ if t(1)
166%$    t(2) = dassert(C.data,[ones(7,1), 2*ones(7,1)]);
167%$ end
168%$ T = all(t);
169%@eof:3
170
171%@test:4
172%$ A = dseries(ones(3, 1), '1990Q1');
173%$ B = dseries(2*ones(3, 1), '1990Q4');
174%$
175%$ try
176%$    C = [A; B];
177%$    t(1) = true;
178%$ catch
179%$    t(1) = false;
180%$ end
181%$
182%$ % Check the results.
183%$ if t(1)
184%$    t(2) = dassert(C.data, [ones(3,1); 2*ones(3,1)]);
185%$    t(3) = dassert(A.data, ones(3,1));
186%$    t(4) = dassert(B.data, 2*ones(3,1));
187%$ end
188%$ T = all(t);
189%@eof:4
190