Mercurial > hg > ltpda
diff m-toolbox/classes/@plist/getSetRandState.m @ 0:f0afece42f48
Import.
author | Daniele Nicolodi <nicolodi@science.unitn.it> |
---|---|
date | Wed, 23 Nov 2011 19:22:13 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/m-toolbox/classes/@plist/getSetRandState.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,219 @@ +% GETSETRANDSTATE gets or sets the random state of the MATLAB functions 'rand' and 'randn' +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DESCRIPTION: GETSETRANDSTATE gets or sets the random state of the MATLAB +% functions 'rand' and 'randn'. This function looks in the +% input plist for the key-word 'rand_state' (LTPDA toolbox +% less than 2.1) or 'rand_stream' (LTPDA toolbox greate equal +% than 2.1) to set the random state. If these key words +% doesn't exist in the plist then stores this function the +% random state in the plist. +% +% CALL: pl = getSetRandState(pl_in); +% pl = pl_in.getSetRandState(); +% pl_in.getSetRandState(); +% +% <a href="matlab:utils.helper.displayMethodInfo('plist', 'getSetRandState')">Parameters Description</a> +% +% VERSION: $Id: getSetRandState.m,v 1.10 2011/08/15 10:42:00 hewitson Exp $ +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function varargout = getSetRandState(varargin) + + %%% Check if this is a call for parameters + if utils.helper.isinfocall(varargin{:}) + varargout{1} = getInfo(varargin{3}); + return + end + + % Collect all PLISTs + plin = utils.helper.collect_objects(varargin(:), 'plist'); + + % Decide on a deep copy or a modify + plout = copy(plin, nargout); + + if numel(plout) ~= 1 + error('### This method accepts only one input plist object.'); + end + + def_struct = struct('Type', '', ... + 'NumStreams', [], ... + 'StreamIndex', [], ... + 'Substream', 1, ... + 'Seed', 0, ... + 'State', [], ... + 'RandnAlg', '', ... + 'Antithetic', false, ... + 'FullPrecision', true); + + rand_state = plout.find('rand_state'); + rand_stream = plout.find('rand_stream'); + + %%% We have different behavior for the MATLAB version 2008b and less than + %%% version 2008b because version 2008b is working with random streams. + + %%% MATLAB version 2008a and less + if verLessThan('MATLAB', '7.7') + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %%% MATLAB version 2008a and less %%% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if ~isempty(rand_state) + %%% Reset random state %%% + + %%% It might be that 'rand_state' contains the 'state' or the 'seed' + %%% of the MATLAB rand or randn methods. + try + randn('seed',rand_state); + rand('seed', rand_state); + catch + if numel(rand_state) > 2 + rand('state', rand_state) + else + randn('state', rand_state) + end + end + plout.remove('rand_state'); + plout.getSetRandState(); + + elseif ~isempty(rand_stream) + %%% Reset random state %%% + + %%% Legacy mode + if numel(rand_stream) ~= 1 + %%% Set that of 'randn' + randn('state', rand_stream(1).State) + %%% Set that of 'rand' + rand('state', rand_stream(2).State) + else + error('### I have no idea what I should do because the random state is stores as a random stream with MATLAB version 2008b or later.') + end + + else + %%% Store random state %%% + + stream = [def_struct def_struct]; + %%% Store state of 'randn' + stream(1).Type = 'randn'; + stream(1).State = randn('state'); + %%% Store state of 'rand' + stream(2).Type = 'rand'; + stream(2).State = rand('state'); + plout.append('rand_stream', stream); + end + + else + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %%% MATLAB version 2008b and later %%% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + def_stream = RandStream.getDefaultStream; + + if ~isempty(rand_state) + %%% Reset random state %%% + + %%% It might be that 'rand_state' contains the 'state' or the 'seed' + %%% of the MATLAB rand or randn methods. + try + randn('seed',rand_state); + rand('seed', rand_state); + catch + if numel(rand_state) > 2 + rand('state', rand_state) + else + randn('state', rand_state) + end + end + plout.remove('rand_state'); + plout.getSetRandState(); + + elseif ~isempty(rand_stream) + %%% Reset random state %%% + + %%% Legacy mode + if numel(rand_stream) ~= 1 + + %%% Set that of 'randn' + randn('state', rand_stream(1).State) + %%% Set that of 'rand' + rand('state', rand_stream(2).State) + else + stream = RandStream(rand_stream.Type, 'Seed', rand_stream.Seed, 'RandnAlg', rand_stream.RandnAlg); + stream.State = uint32(rand_stream.State); + stream.Substream = rand_stream.Substream; + stream.Antithetic = rand_stream.Antithetic; + stream.FullPrecision = rand_stream.FullPrecision; + RandStream.setDefaultStream(stream); + end + + else + %%% Store random state %%% + + if strcmp(def_stream.Type, 'legacy') + %%%%%%%%%% Legacy Mode %%%%%%%%%% + + stream = [def_struct def_struct]; + %%% Store state of 'randn' + stream(1).Type = 'randn'; + stream(1).State = randn('state'); + %%% Store state of 'rand' + stream(2).Type = 'rand'; + stream(2).State = rand('state'); + + else + %%%%%%%%%% Stream Mode %%%%%%%%%% + stream = def_struct; + stream.Type = def_stream.Type; + stream.NumStreams = def_stream.NumStreams; + stream.StreamIndex = def_stream.StreamIndex; + stream.Substream = def_stream.Substream; + stream.Seed = def_stream.Seed; + stream.State = double(def_stream.State); + stream.RandnAlg = def_stream.RandnAlg; + stream.Antithetic = def_stream.Antithetic; + stream.FullPrecision = def_stream.FullPrecision; + end + plout.pset('rand_stream', stream); + end + + + end + + varargout{1} = plout; +end + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% FUNCTION: getInfo +% +% DESCRIPTION: Get Info Object +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function ii = getInfo(varargin) + if nargin == 1 && strcmpi(varargin{1}, 'None') + sets = {}; + pl = []; + else + sets = {'Default'}; + pl = getDefaultPlist; + end + % Build info object + ii = minfo(mfilename, 'plist', 'ltpda', utils.const.categories.internal, '$Id: getSetRandState.m,v 1.10 2011/08/15 10:42:00 hewitson Exp $', sets, pl); + ii.setArgsmin(1); + ii.setArgsmax(1); +end + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% FUNCTION: getDefaultPlist +% +% DESCRIPTION: Get Default Plist +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function plo = getDefaultPlist() + plo = plist(); +end +