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
+