View Javadoc

1   package org.lcsim.recon.tracking.trfutil;
2   import java.util.List;
3   import java.util.ArrayList;
4   import java.util.Iterator;
5   
6   /**
7    * Maintains a list of pointers to RandomGenerator objects.
8    * The method record is called to record the state of each
9    * and set is called to reset the state of each to previously recorded
10   * values.
11   *
12   * @author Norman A. Graf
13   * @version 1.0
14   */
15  public class RandomRegistry
16  {
17      // attributes
18      
19      // Known generators.
20      private List _gens = new ArrayList();
21      
22      // Array of states for each generator.
23      private List _states = new ArrayList();
24      
25      // methods
26      
27      /**
28       * Hide copy constructor.
29       *
30       * @param   rr
31       */
32      private RandomRegistry( RandomRegistry rr)
33      {
34      }
35      
36      // methods
37      
38      /**
39       * Constructor.
40       *
41       */
42      public RandomRegistry()
43      {
44      }
45      
46      /**
47       * Register a generator.
48       *
49       * @param   gen  RandomGenerator to register.
50       */
51      public void addGenerator(RandomGenerator gen)
52      {
53          _gens.add( gen );
54      }
55      
56      /**
57       * Record the states.
58       *
59       * @return  A unique integer labeling the state.
60       */
61      public int record()
62      {
63          
64          // Create a list of generators to record states.
65          int istate = _states.size();
66          _states.add( new ArrayList() );
67          List gens = (List) _states.get(istate);
68          
69          // Loop over generators and fill list.
70          Iterator igen;
71          for ( igen=_gens.iterator(); igen.hasNext();)
72              gens.add( new RandomGenerator( (RandomGenerator) igen.next() ) );
73          
74          return istate;
75          
76      }
77      
78      /**
79       * Return the number of registered generators.
80       *
81       * @return   integer number of registered generators.
82       */
83      public int generatorCount()
84      {
85          return _gens.size();
86      }
87      
88      /**
89       * Return the number of recorded states.
90       *
91       * @return integer number of recorded states.
92       */
93      public int stateCount()
94      {
95          return _states.size();
96      }
97      
98      /**
99       * Reset the state.
100      *
101      * @param   istate integer state to be reset.
102      * @return  Return nonzero integer for error (e.g. unknown state index).
103      */
104     public int set(int istate)
105     {
106         
107         // Check that the state exists.
108         if ( istate < 0 ) return 1;
109         if ( istate >= stateCount() ) return 2;
110         
111         // Fetch the appropriate list of generators.
112         List oldgens = (List) _states.get(istate);
113         
114         // Loop over generators and reset state.
115         // The recorded list may be shorter than the maintained list.
116         for ( int igen=0; igen<oldgens.size(); ++igen )
117             ( (RandomGenerator) _gens.get(igen)).setState( (RandomGenerator) oldgens.get(igen) );
118         
119         return 0;
120         
121     }
122     
123     /**
124      * String representation of RandomRegistry.
125      *
126      * @return String representation of RandomRegistry.
127      */
128     public String toString()
129     {
130         String className = getClass().getName();
131         int lastDot = className.lastIndexOf('.');
132         if(lastDot!=-1)className = className.substring(lastDot+1);
133         
134         StringBuffer sb = new StringBuffer(className+" with " +  _gens.size() + " random generators: \n");
135         Iterator igen;
136         for ( igen=_gens.iterator(); igen.hasNext(); )
137             sb.append(igen.next()+"\n");
138         sb.append("\n"+stateCount() + " states recorded.");
139         return sb.toString();
140     }
141 }
142 
143 
144 
145