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

3 4
% Overloads the power (^) operator for dseries objects.
%
5
% 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 32 33
if isnumeric(o) && isvector(o) && isdseries(p) && length(o)==nobs(p)
    q = dseries(zeros(size(p.data)), p.firstdate);
    q.data = bsxfun(@power, o, p.data);
    for i=1:vobs(q)
        q.ops(i) = {sprintf('power(%s, %s)', matrix2string(o), p.name{i})};
34
    end
35
    return
36 37
end

38
if isnumeric(p) && isvector(p) && isdseries(o) && length(p)==nobs(o)
39 40
    q = copy(o);
    q.data = bsxfun(@power, o.data, p);
41 42 43 44 45 46 47
    for i=1:vobs(q)
        if isempty(q.ops{i})
            q.ops(i) = {sprintf('power(%s, %s)', q.name{i}, matrix2string(p))};
        else
            q.ops(i) = {sprintf('power(%s, %s)', q.name{i}, matrix2string(p))};
        end
    end
48 49 50
    return
end

51
if isdseries(o) && isnumeric(p) && isreal(p) &&  isscalar(p)
52
    q = copy(o);
53 54
    q.data = o.data.^p;
    for i=1:vobs(q)
55 56 57 58 59
        if isempty(o.ops{i})
            q.ops(i) = {sprintf('power(%s, %s)', q.name{i}, num2str(p))};
        else
            q.ops(i) = {sprintf('power(%s, %s)', o.ops{i}, num2str(p))};
        end
60 61 62 63
    end
    return
end

64 65
if isdseries(o) && isdseries(p)
    if isequal(nobs(o),nobs(p)) && isequal(vobs(o), vobs(p)) && isequal(frequency(o),frequency(p))
66
        q = copy(o);
67 68
        q.data = (o.data).^p.data;
        for i=1:vobs(q)
69 70 71 72 73 74 75 76 77 78 79 80 81
            if isempty(o.ops{i})
                if isempty(p.ops{i})
                    q.ops(i) = {sprintf('power(%s, %s)', q.name{i}, p.name{i})};
                else
                    q.ops(i) = {sprintf('power(%s, %s)', q.name{i}, p.ops{i})};
                end
            else
                if isempty(p.ops{i})
                    q.ops(i) = {sprintf('power(%s, %s)', o.ops{i}, p.name{i})};
                else
                    q.ops(i) = {sprintf('power(%s, %s)', o.ops{i}, p.ops{i})};
                end
            end
82 83
        end
    else
84
        error('dseries:WrongInputArguments', 'If both input arguments are dseries objects, they must have the same numbers of variables and observations and common frequency!')
85 86 87 88
    end
    return
end

89
error('dseries:WrongInputArguments', 'Wrong calling sequence! Please check the manual.')
90 91 92 93 94 95 96 97 98 99 100 101 102 103

%@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;
104
%$    t(1) = true;
105
%$ catch
106
%$    t(1) = false;
107 108 109 110 111 112
%$ 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);
113 114
%$    t(5) = dassert(ts3.name,{'A1';'A2'});
%$    t(6) = dassert(ts3.tex,{'A1';'A2'});
115
%$    t(7) = dassert(ts1.data, A, 1e-15);
116
%$    t(8) = dassert(ts3.ops,{'power(A1, B1)';'power(A2, B2)'});
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
%$ 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;
133
%$    t(1) = true;
134
%$ catch
135
%$    t(1) = false;
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);
142 143 144
%$    t(5) = dassert(ts3.name,{'A1';'A2'});
%$    t(6) = dassert(ts3.tex,{'A1';'A2'});
%$    t(7) = dassert(ts3.ops,{'power(A1, 2)';'power(A2, 2)'});
145 146 147 148 149 150 151 152 153 154 155
%$ 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);
156
%$    t(1) = true;
157
%$ catch
158
%$    t(1) = false;
159 160 161 162 163 164 165 166 167 168 169
%$ 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