mpower.m 4.16 KB
Newer Older
1
function q = mpower(o, p) % --*-- Unitary tests --*--
2

3 4 5
% Overloads the power (^) operator for dseries objects.
%
% INPUTS 
6 7
% - o [dseries]           T observations and N variables.
% - p [dseries,double]    scalar, vector or dseries object.
8 9
%
% OUTPUTS 
10
% - q [dseries]           T observations and N variables.
11

12
% Copyright (C) 2013-2017 Dynare Team
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
%
% 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/>.

29 30 31
if isnumeric(o) && isvector(o) && length(o)>1
    if ~isdseries(p)
        error('dseries:WrongInputArguments', 'Second input argument must be a dseries object!')
32
    end
33 34
    q = copy(p);
    q.data = bsxfun(@power, p.data, o);
35 36 37
    return;
end

38 39 40
if isnumeric(p) && isvector(p) && length(p)>1
    if ~isdseries(o)
        error('dseries:WrongInputArguments', 'First input argument must be a dseries object!')
41
    end
42 43
    q = copy(o);
    q.data = bsxfun(@power, o.data, p);
44 45 46
    return
end

47 48 49 50 51 52 53 54 55
if isdseries(o) && isnumeric(p) && isreal(p) &&  isscalar(p)
    q = dseries();
    q.dates = o.dates;
    q.data = o.data.^p;
    q.name = cell(vobs(q),1);
    q.tex = cell(vobs(q),1);
    for i=1:vobs(q)
        q.name(i) = {['power(' o.name{i} ';' num2str(p) ')']};
        q.tex(i) = {[o.tex{i} '^' num2str(p) ]};
56 57 58 59
    end
    return
end

60 61 62 63 64 65 66 67 68 69
if isdseries(o) && isdseries(p)
    if isequal(nobs(o),nobs(p)) && isequal(vobs(o), vobs(p)) && isequal(frequency(o),frequency(p))
        q = dseries();
        q.data = (o.data).^p.data;
        q.dates = o.dates;
        q.name = cell(vobs(q),1);
        q.tex = cell(vobs(q),1);
        for i=1:vobs(q)
            q.name(i) = {['power(' o.name{i} ';' p.name{i} ')']};
            q.tex(i) = {[o.tex{i} '^{' p.tex{i} '}']};
70 71
        end
    else
72
        error('dseries:WrongInputArguments', 'If both input arguments are dseries objects, they must have the same numbers of variables and observations and common frequency!')
73 74 75 76
    end
    return
end

77
error('dseries:WrongInputArguments', 'Wrong calling sequence! Please check the manual.')
78 79 80 81 82 83 84 85 86 87 88 89 90 91

%@test:1
%$ % Define a datasets.
%$ A = rand(10,2); B = randn(10,2);
%$
%$ % Define names
%$ A_name = {'A1';'A2'}; B_name = {'B1';'B2'};
%$
%$
%$ % Instantiate a time series object.
%$ try
%$    ts1 = dseries(A,[],A_name,[]);
%$    ts2 = dseries(B,[],B_name,[]);
%$    ts3 = ts1^ts2;
92
%$    t(1) = true;
93
%$ catch
94
%$    t(1) = false;
95 96 97 98 99 100 101 102
%$ end
%$
%$ if t(1)
%$    t(2) = dassert(ts3.vobs,2);
%$    t(3) = dassert(ts3.nobs,10);
%$    t(4) = dassert(ts3.data,A.^B,1e-15);
%$    t(5) = dassert(ts3.name,{'power(A1;B1)';'power(A2;B2)'});
%$    t(6) = dassert(ts3.tex,{'A1^{B1}';'A2^{B2}'});
103
%$    t(7) = dassert(ts1.data, A, 1e-15);
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
%$ end
%$ T = all(t);
%@eof:1

%@test:2
%$ % Define a datasets.
%$ A = rand(10,2);
%$
%$ % Define names
%$ A_name = {'A1';'A2'};
%$
%$
%$ % Instantiate a time series object.
%$ try
%$    ts1 = dseries(A,[],A_name,[]);
%$    ts3 = ts1^2;
120
%$    t(1) = true;
121
%$ catch
122
%$    t(1) = false;
123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
%$ end
%$
%$ if t(1)
%$    t(2) = dassert(ts3.vobs,2);
%$    t(3) = dassert(ts3.nobs,10);
%$    t(4) = dassert(ts3.data,A.^2,1e-15);
%$    t(5) = dassert(ts3.name,{'power(A1;2)';'power(A2;2)'});
%$    t(6) = dassert(ts3.tex,{'A1^2';'A2^2'});
%$ end
%$ T = all(t);
%@eof:2

%@test:3
%$ % Define a dseries object
%$ ts1=dseries([1 1;2 2;3 3], '1999y', {'MyVar1','MyVar2'});
%$
%$ % Use the power
%$ try
%$    ts2 = ts1^transpose(1:3);
142
%$    t(1) = true;
143
%$ catch
144
%$    t(1) = false;
145 146 147 148 149 150 151 152 153 154 155
%$ end
%$
%$ if t(1)
%$    t(2) = dassert(ts2.vobs,2);
%$    t(3) = dassert(ts2.nobs,3);
%$    t(4) = dassert(ts2.data,bsxfun(@power,ts1.data,transpose(1:3)),1e-15);
%$    t(5) = dassert(ts2.name,{'MyVar1';'MyVar2'});
%$    t(6) = dassert(ts2.tex,{'MyVar1';'MyVar2'});
%$ end
%$ T = all(t);
%@eof:3