Synthia
Generic and flexible data structure generator
AllElements.java
Go to the documentation of this file.
1 package ca.uqac.lif.synthia.enumerative;
2 
3 import ca.uqac.lif.synthia.Bounded;
5 import ca.uqac.lif.synthia.Seedable;
8 
9 import java.util.ArrayList;
10 import java.util.List;
11 
12 /**
13  *
14  * @author Marc-Antoine Plourde
15  *
16  * @param <T>
17  * @ingroup API
18  */
19 public class AllElements<T> extends Playback<T> implements Bounded<T>, Seedable
20 {
21 
22  protected List<Integer> m_indexes;
23 
24  protected final boolean m_scramble;
25 
27 
28  @SuppressWarnings("unchecked")
29  private AllElements(T[] values, boolean scramble, RandomInteger index_picker
30  , List<Integer> indexes, boolean loop, int index, int start_index)
31  {
32  m_values = values;
33  m_scramble = scramble;
34  m_indexPicker = index_picker;
35  m_indexes = indexes;
36  m_loop = loop;
37  m_index = index;
38  m_startIndex = start_index;
39  }
40 
41  public AllElements(List<T> values, boolean scramble, boolean loop)
42  {
43  super(values);
44  m_scramble = scramble;
45  m_indexes = new ArrayList<Integer>();
46  m_indexPicker = new RandomInteger(0, 1);
47  setLoop(loop);
48 
49  if(scramble)
50  {
51  initializeIndexes();
53  }
54 
55  }
56 
57  private void initializeIndexes()
58  {
59  for (int i = 0; i < m_values.length; i++)
60  {
61  m_indexes.add(i);
62  }
63  }
64 
65  @Override
66  public T pick()
67  {
68  if(!m_scramble)
69  {
70  return (T) super.pick();
71  }
72  else
73  {
74  return scramblePick();
75  }
76  }
77 
78  private T scramblePick()
79  {
80  if(m_indexes.isEmpty())
81  {
82  if(!m_loop)
83  {
84  throw new NoMoreElementException();
85  }
86  else
87  {
88  initializeIndexes();
89  }
90  }
91 
92  int picked_index = m_indexPicker.pick();
93  T picked_value = (T) m_values[m_indexes.get(picked_index)];
94 
95  m_indexes.remove(picked_index);
96 
97  if(m_indexes.size()>0)
98  {
100  }
101 
102 
103  return picked_value;
104  }
105 
106  @Override
107  public void reset()
108  {
109  if(m_scramble)
110  {
111  m_indexes.clear();
112  initializeIndexes();
115  }
116  else
117  {
118  super.reset();
119  }
120  }
121 
122  @Override
123  public boolean isDone()
124  {
125  if(m_loop)
126  {
127  return false;
128  }
129  else
130  {
131  if(m_scramble)
132  {
133  return m_indexes.isEmpty();
134  }
135  else
136  {
137  return (m_index >= (m_values.length));
138  }
139  }
140  }
141 
142  @Override
143  public AllElements<T> setSeed(int seed)
144  {
145  m_indexPicker.setSeed(seed);
146  return this;
147  }
148 
149  @Override
150  public AllElements<T> duplicate(boolean with_state)
151  {
152 
154  , new ArrayList<Integer>(m_indexes), m_loop, m_index, m_startIndex);
155 
156  if(!with_state)
157  {
158  copy.reset();
159  }
160 
161  return copy;
162  }
163 }
ca.uqac.lif.synthia.enumerative.AllElements.reset
void reset()
Puts the Playback picker back into its initial state.
Definition: AllElements.java:107
ca.uqac.lif.synthia.enumerative.AllElements.duplicate
AllElements< T > duplicate(boolean with_state)
Picks a random string.
Definition: AllElements.java:150
ca.uqac.lif.synthia.enumerative.AllElements.m_indexes
List< Integer > m_indexes
Definition: AllElements.java:22
ca.uqac.lif.synthia.enumerative.AllElements.isDone
boolean isDone()
Signals if the picker enumerates all values from a set.
Definition: AllElements.java:123
ca.uqac.lif.synthia.enumerative.AllElements.setSeed
AllElements< T > setSeed(int seed)
Set the seed of the random generator.
Definition: AllElements.java:143
ca.uqac.lif.synthia.sequence.Playback.m_index
int m_index
The index of the current value.
Definition: Playback.java:71
ca.uqac.lif.synthia.enumerative.AllElements
Definition: AllElements.java:19
ca.uqac.lif.synthia.sequence.Playback.m_values
T[] m_values
The values to play back.
Definition: Playback.java:66
ca.uqac.lif.synthia.sequence.Playback.m_loop
boolean m_loop
Whether to loop through the values.
Definition: Playback.java:81
ca.uqac.lif.synthia.sequence.Playback
Picker that returns values taken from a list.
Definition: Playback.java:61
ca.uqac
ca.uqac.lif.synthia.random
Pickers that produce pseudo-random objects such as numbers.
Definition: AffineTransform.java:19
ca.uqac.lif.synthia
Definition: Bounded.java:19
ca.uqac.lif.synthia.enumerative.AllElements.m_scramble
final boolean m_scramble
Definition: AllElements.java:24
ca.uqac.lif.synthia.enumerative.AllElements.pick
T pick()
Picks the next value in the list of the Playback picker.
Definition: AllElements.java:66
ca.uqac.lif.synthia.sequence.Playback.setLoop
Playback< T > setLoop(boolean b)
Set the m_loop attribute of the playback picker.
Definition: Playback.java:196
ca.uqac.lif.synthia.random.RandomInteger.setInterval
RandomInteger setInterval(int min, int max)
Sets the interval in which integers are picked.
Definition: RandomInteger.java:84
ca.uqac.lif
ca.uqac.lif.synthia.Bounded
Interface used to signal that a picker enumerates all values from a set.
Definition: Bounded.java:26
ca.uqac.lif.synthia.random.RandomPicker.reset
void reset()
Puts the picker back into its initial state.
Definition: RandomPicker.java:68
ca.uqac.lif.synthia.sequence.Playback.m_startIndex
int m_startIndex
The start index.
Definition: Playback.java:76
ca.uqac.lif.synthia.random.RandomInteger.setSeed
RandomInteger setSeed(int seed)
Definition: RandomInteger.java:102
ca.uqac.lif.synthia.random.RandomInteger
Picks an integer uniformly in an interval.
Definition: RandomInteger.java:31
ca.uqac.lif.synthia.random.RandomInteger.pick
Integer pick()
Picks a random integer.
Definition: RandomInteger.java:118
ca
ca.uqac.lif.synthia.random.RandomInteger.duplicate
RandomInteger duplicate(boolean with_state)
Creates a copy of the RandomInteger picker.
Definition: RandomInteger.java:133
ca.uqac.lif.synthia.enumerative.AllElements.AllElements
AllElements(List< T > values, boolean scramble, boolean loop)
Definition: AllElements.java:41
ca.uqac.lif.synthia.NoMoreElementException
An exception to throw when a picker can't pick an other element.
Definition: NoMoreElementException.java:25
ca.uqac.lif.synthia.enumerative.AllElements.m_indexPicker
RandomInteger m_indexPicker
Definition: AllElements.java:26
ca.uqac.lif.synthia.Seedable
Interface implemented by objects that can be seeded.
Definition: Seedable.java:29
ca.uqac.lif.synthia.sequence
Pickers related to the generation of a sequence of values.
Definition: BehaviorTree.java:19