www.gusucode.com > mbcmodels 工具箱 matlab 源码程序 > mbcmodels/@xregcubic/modelproperties.m

    function p = modelproperties(m,p)
%MBCMODELPROPERTIES interface to model properties
%
% p = modelproperties(m,p);
%           Order               Polynomial Order
%           InteractionOrder    Maximum Interaction Order
%           TransformInputRange Transform Input Range

%  Copyright 2006-2007 The MathWorks, Inc.


ID = getType(m);
[p,OK] = PersistentStore(p,ID);
if ~OK
    nf = nfactors(m);

    %% Properties for Polynomials
    %
    p = addprop(p,'Order',...
        @( m ) get( m, 'order' ),@( m,v ) i_SetOrder( m, v ),...
        'vector int',{[0 Inf],nf},...
        'Polynomial order');
    p = addprop(p,'InteractionOrder',...
        @( m ) get( m, 'maxinteract' ),...
        @i_SetInteractionOrder,...
        'int',[0 Inf],...
        'Maximum order of interaction terms');
    p = addprop(p,'TransformInputRange',...
        @( m ) i_GetTransformInputRange( m ),@( m,v ) i_SetTransformInputRange( m, v ),...
        'boolean',[],...
        'Transform inputs');

    % add base linear model properties
    p = modelproperties(m.xreglinear,p);
    
    PersistentStore(p,ID);
end


%% subfunctions to do the set and get 
 %% Polynomial order set method
function m = i_SetOrder( m, v )

error( i_Assert( i_IsInteger( v ), 'Order must be integer valued.' ) );
error( i_Assert( all( v >= 0 ), 'Order must be non-negative.' ) );
error( i_Assert( numel( v ) == nfactors( m ), ...
    'Order must be a vector with exactly one element for each factor.' ) );

m = reset( m );
m = set( m, 'order', v );


%% Interaction order set method
function m = i_SetInteractionOrder( m, v )

error( i_Assert( i_IsInteger( v ), 'InteractionOrder must be integer valued.' ) );
error( i_Assert( isscalar( v ), 'InteractionOrder must be a scalar.' ) );
error( i_Assert( v >= 0, 'InteractionOrder must be non-negative.' ) );

maxallowedinteract = get( m, 'maxallowedinteract' );
error( i_Assert( v <= maxallowedinteract, sprintf( ...
    'InteractionOrder must be less than or equal to %d for this model', ...
    maxallowedinteract ) ) );

m = reset( m );
m = set( m, 'maxinteract', v );


%% Transform Input Range get and set methods
function v = i_GetTransformInputRange( m )
% If the model is not a uncode poly, then we are transforming
% the input range to [-1, 1].
v = ~isa( m, 'xreguncodedpoly' );
%%
function m = i_SetTransformInputRange( m, newValue )

m = reset( m );

oldValue = i_GetTransformInputRange( m );
if oldValue && ~newValue,
    % Set from true to false, i.e.,
    %     convert xregcubic to xreguncodedpoly
    m = xreguncodedpoly( m );
elseif ~oldValue && newValue,
    % set from false to true,
    %     convert xreguncodedpoly to xregcubic
    m = xregcubic( m );
end



%% TermStatus



%% Helper Sub-functions
function e = i_Assert( tf, msg )
%%
% ASSERT Error if |tf| is false with the error message |msg|
if tf,
    e = [];
else
    e = struct( ...
        'identifier', 'mbc:mbcmodelextensions:polynomialproperties:InvalidInput', ...
        'message', msg );
end

%% 
function tf = i_IsInteger( v )
%%
% Check that array contains integers (not necessarily interger types).
%
% See also |isinteger|.
tf = all( round( v(:) ) == v(:) );