added option to make random seed automatically generated at simulation load
+ a single random generator instance is used instead of sharing seed between different parts of the simulator
This commit is contained in:
parent
07c50cc200
commit
8e9686e01d
|
@ -24,7 +24,7 @@
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
* $Id: GUI.java,v 1.102 2009/02/08 18:33:05 fros4943 Exp $
|
* $Id: GUI.java,v 1.103 2009/02/18 10:09:32 fros4943 Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package se.sics.cooja;
|
package se.sics.cooja;
|
||||||
|
@ -592,7 +592,7 @@ public class GUI extends Observable {
|
||||||
JMenuItem menuItem2 = new JMenuItem("same random seed");
|
JMenuItem menuItem2 = new JMenuItem("same random seed");
|
||||||
menuItem2.addActionListener(new ActionListener() {
|
menuItem2.addActionListener(new ActionListener() {
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionPerformed(ActionEvent e) {
|
||||||
reloadCurrentSimulation(false, false);
|
reloadCurrentSimulation(false, getSimulation().getRandomSeed());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
menuItem.add(menuItem2);
|
menuItem.add(menuItem2);
|
||||||
|
@ -600,7 +600,7 @@ public class GUI extends Observable {
|
||||||
menuItem2 = new JMenuItem("new random seed");
|
menuItem2 = new JMenuItem("new random seed");
|
||||||
menuItem2.addActionListener(new ActionListener() {
|
menuItem2.addActionListener(new ActionListener() {
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionPerformed(ActionEvent e) {
|
||||||
reloadCurrentSimulation(false, true);
|
reloadCurrentSimulation(false, getSimulation().getRandomSeed()+1);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
menuItem.add(menuItem2);
|
menuItem.add(menuItem2);
|
||||||
|
@ -2389,7 +2389,7 @@ public class GUI extends Observable {
|
||||||
* @param autoStart Start executing simulation when loaded
|
* @param autoStart Start executing simulation when loaded
|
||||||
* @param newSeed Change simulation seed
|
* @param newSeed Change simulation seed
|
||||||
*/
|
*/
|
||||||
public void reloadCurrentSimulation(final boolean autoStart, final boolean newSeed) {
|
public void reloadCurrentSimulation(final boolean autoStart, final long randomSeed) {
|
||||||
if (getSimulation() == null) {
|
if (getSimulation() == null) {
|
||||||
logger.fatal("No simulation to reload");
|
logger.fatal("No simulation to reload");
|
||||||
return;
|
return;
|
||||||
|
@ -2402,9 +2402,6 @@ public class GUI extends Observable {
|
||||||
/* Get current simulation configuration */
|
/* Get current simulation configuration */
|
||||||
Element root = new Element("simconf");
|
Element root = new Element("simconf");
|
||||||
Element simulationElement = new Element("simulation");
|
Element simulationElement = new Element("simulation");
|
||||||
if (newSeed) {
|
|
||||||
getSimulation().setRandomSeed(getSimulation().getRandomSeed() + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
simulationElement.addContent(getSimulation().getConfigXML());
|
simulationElement.addContent(getSimulation().getConfigXML());
|
||||||
root.addContent(simulationElement);
|
root.addContent(simulationElement);
|
||||||
|
@ -2421,6 +2418,8 @@ public class GUI extends Observable {
|
||||||
myGUI.doRemoveSimulation(false);
|
myGUI.doRemoveSimulation(false);
|
||||||
Simulation newSim = loadSimulationConfig(root, true);
|
Simulation newSim = loadSimulationConfig(root, true);
|
||||||
myGUI.setSimulation(newSim);
|
myGUI.setSimulation(newSim);
|
||||||
|
myGUI.getSimulation().setRandomSeed(randomSeed);
|
||||||
|
|
||||||
if (autoStart) {
|
if (autoStart) {
|
||||||
newSim.startSimulation();
|
newSim.startSimulation();
|
||||||
}
|
}
|
||||||
|
@ -2486,7 +2485,7 @@ public class GUI extends Observable {
|
||||||
* @param autoStart Start executing simulation when loaded
|
* @param autoStart Start executing simulation when loaded
|
||||||
*/
|
*/
|
||||||
public void reloadCurrentSimulation(boolean autoStart) {
|
public void reloadCurrentSimulation(boolean autoStart) {
|
||||||
reloadCurrentSimulation(autoStart, false);
|
reloadCurrentSimulation(autoStart, getSimulation().getRandomSeed());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
* $Id: Simulation.java,v 1.37 2009/01/08 15:42:38 fros4943 Exp $
|
* $Id: Simulation.java,v 1.38 2009/02/18 10:09:59 fros4943 Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package se.sics.cooja;
|
package se.sics.cooja;
|
||||||
|
@ -74,9 +74,11 @@ public class Simulation extends Observable implements Runnable {
|
||||||
|
|
||||||
private long randomSeed = 123456;
|
private long randomSeed = 123456;
|
||||||
|
|
||||||
|
private boolean randomSeedGenerated = false;
|
||||||
|
|
||||||
private int maxMoteStartupDelay = 1000;
|
private int maxMoteStartupDelay = 1000;
|
||||||
|
|
||||||
private Random delayMotesRandom = new Random();
|
private Random randomGenerator = new Random();
|
||||||
|
|
||||||
// Tick observable
|
// Tick observable
|
||||||
private class TickObservable extends Observable {
|
private class TickObservable extends Observable {
|
||||||
|
@ -276,7 +278,6 @@ public class Simulation extends Observable implements Runnable {
|
||||||
*/
|
*/
|
||||||
public Simulation(GUI gui) {
|
public Simulation(GUI gui) {
|
||||||
myGUI = gui;
|
myGUI = gui;
|
||||||
delayMotesRandom.setSeed(randomSeed);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -342,6 +343,26 @@ public class Simulation extends Observable implements Runnable {
|
||||||
*/
|
*/
|
||||||
public void setRandomSeed(long randomSeed) {
|
public void setRandomSeed(long randomSeed) {
|
||||||
this.randomSeed = randomSeed;
|
this.randomSeed = randomSeed;
|
||||||
|
randomGenerator.setSeed(randomSeed);
|
||||||
|
logger.info("Simulation random seed: " + randomSeed);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param generated Autogenerated random seed at simulation load
|
||||||
|
*/
|
||||||
|
public void setRandomSeedGenerated(boolean generated) {
|
||||||
|
this.randomSeedGenerated = generated;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Autogenerated random seed at simulation load
|
||||||
|
*/
|
||||||
|
public boolean getRandomSeedGenerated() {
|
||||||
|
return randomSeedGenerated;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Random getRandomGenerator() {
|
||||||
|
return randomGenerator;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -386,7 +407,11 @@ public class Simulation extends Observable implements Runnable {
|
||||||
|
|
||||||
// Random seed
|
// Random seed
|
||||||
element = new Element("randomseed");
|
element = new Element("randomseed");
|
||||||
element.setText(Long.toString(randomSeed));
|
if (randomSeedGenerated) {
|
||||||
|
element.setText("generated");
|
||||||
|
} else {
|
||||||
|
element.setText(Long.toString(getRandomSeed()));
|
||||||
|
}
|
||||||
config.add(element);
|
config.add(element);
|
||||||
|
|
||||||
// Max mote startup delay
|
// Max mote startup delay
|
||||||
|
@ -467,8 +492,12 @@ public class Simulation extends Observable implements Runnable {
|
||||||
|
|
||||||
// Random seed
|
// Random seed
|
||||||
if (element.getName().equals("randomseed")) {
|
if (element.getName().equals("randomseed")) {
|
||||||
randomSeed = Long.parseLong(element.getText());
|
if (element.getText().equals("generated")) {
|
||||||
delayMotesRandom.setSeed(randomSeed);
|
randomSeedGenerated = true;
|
||||||
|
setRandomSeed(new Random().nextLong());
|
||||||
|
} else {
|
||||||
|
setRandomSeed(Long.parseLong(element.getText()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Max mote startup delay
|
// Max mote startup delay
|
||||||
|
@ -602,7 +631,9 @@ public class Simulation extends Observable implements Runnable {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (maxMoteStartupDelay > 0 && mote.getInterfaces().getClock() != null) {
|
if (maxMoteStartupDelay > 0 && mote.getInterfaces().getClock() != null) {
|
||||||
mote.getInterfaces().getClock().setDrift(-delayMotesRandom.nextInt(maxMoteStartupDelay));
|
mote.getInterfaces().getClock().setDrift(
|
||||||
|
-randomGenerator.nextInt(maxMoteStartupDelay)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
currentRadioMedium.registerMote(mote, this);
|
currentRadioMedium.registerMote(mote, this);
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
* $Id: CreateSimDialog.java,v 1.14 2008/12/04 14:03:42 joxe Exp $
|
* $Id: CreateSimDialog.java,v 1.15 2009/02/18 10:10:47 fros4943 Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package se.sics.cooja.dialogs;
|
package se.sics.cooja.dialogs;
|
||||||
|
@ -34,8 +34,10 @@ package se.sics.cooja.dialogs;
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
import java.awt.event.*;
|
import java.awt.event.*;
|
||||||
import java.text.*;
|
import java.text.*;
|
||||||
|
import java.util.Random;
|
||||||
import java.util.Vector;
|
import java.util.Vector;
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
|
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
import se.sics.cooja.*;
|
import se.sics.cooja.*;
|
||||||
|
@ -61,6 +63,7 @@ public class CreateSimDialog extends JDialog {
|
||||||
|
|
||||||
private JFormattedTextField delayTime, simulationTime, tickTime;
|
private JFormattedTextField delayTime, simulationTime, tickTime;
|
||||||
private JFormattedTextField randomSeed, tickLists, delayedStartup;
|
private JFormattedTextField randomSeed, tickLists, delayedStartup;
|
||||||
|
private JCheckBox randomSeedGenerated;
|
||||||
|
|
||||||
private JTextField title;
|
private JTextField title;
|
||||||
private JComboBox radioMediumBox;
|
private JComboBox radioMediumBox;
|
||||||
|
@ -146,7 +149,14 @@ public class CreateSimDialog extends JDialog {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set random seed
|
// Set random seed
|
||||||
|
if (simulationToConfigure.getRandomSeedGenerated()) {
|
||||||
|
myDialog.randomSeedGenerated.setSelected(true);
|
||||||
|
myDialog.randomSeed.setEnabled(false);
|
||||||
|
myDialog.randomSeed.setText("[autogenerated]");
|
||||||
|
} else {
|
||||||
|
myDialog.randomSeed.setEnabled(true);
|
||||||
myDialog.randomSeed.setValue(new Long(simulationToConfigure.getRandomSeed()));
|
myDialog.randomSeed.setValue(new Long(simulationToConfigure.getRandomSeed()));
|
||||||
|
}
|
||||||
|
|
||||||
// Set delayed mote startup time
|
// Set delayed mote startup time
|
||||||
myDialog.delayedStartup.setValue(new Integer(simulationToConfigure.getDelayedMoteStartupTime()));
|
myDialog.delayedStartup.setValue(new Integer(simulationToConfigure.getDelayedMoteStartupTime()));
|
||||||
|
@ -375,10 +385,25 @@ public class CreateSimDialog extends JDialog {
|
||||||
numberField.setColumns(4);
|
numberField.setColumns(4);
|
||||||
randomSeed = numberField;
|
randomSeed = numberField;
|
||||||
|
|
||||||
|
randomSeedGenerated = new JCheckBox();
|
||||||
|
randomSeedGenerated.setToolTipText("Autmatically generate random seed at simulation load");
|
||||||
|
randomSeedGenerated.addActionListener(new ActionListener() {
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
if (((JCheckBox)e.getSource()).isSelected()) {
|
||||||
|
randomSeed.setEnabled(false);
|
||||||
|
randomSeed.setText("[autogenerated]");
|
||||||
|
} else {
|
||||||
|
randomSeed.setEnabled(true);
|
||||||
|
randomSeed.setValue(new Integer(123456));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
horizBox.add(label);
|
horizBox.add(label);
|
||||||
horizBox.add(Box.createHorizontalStrut(150));
|
horizBox.add(Box.createHorizontalStrut(150));
|
||||||
horizBox.add(numberField);
|
horizBox.add(numberField);
|
||||||
horizBox.setToolTipText("Main random seed. Determines mote tick order, mote startup delay etc.");
|
horizBox.add(randomSeedGenerated);
|
||||||
|
horizBox.setToolTipText("Simulation random seed. Controls the random behavior such as mote startup delays, node positions etc.");
|
||||||
|
|
||||||
advancedBox.add(horizBox);
|
advancedBox.add(horizBox);
|
||||||
advancedBox.add(Box.createVerticalStrut(5));
|
advancedBox.add(Box.createVerticalStrut(5));
|
||||||
|
@ -422,7 +447,14 @@ public class CreateSimDialog extends JDialog {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (randomSeedGenerated.isSelected()) {
|
||||||
|
mySimulation.setRandomSeedGenerated(true);
|
||||||
|
mySimulation.setRandomSeed(new Random().nextLong());
|
||||||
|
} else {
|
||||||
|
mySimulation.setRandomSeedGenerated(false);
|
||||||
mySimulation.setRandomSeed(((Number) randomSeed.getValue()).longValue());
|
mySimulation.setRandomSeed(((Number) randomSeed.getValue()).longValue());
|
||||||
|
}
|
||||||
|
|
||||||
mySimulation.setDelayedMoteStartupTime(((Number) delayedStartup.getValue()).intValue());
|
mySimulation.setDelayedMoteStartupTime(((Number) delayedStartup.getValue()).intValue());
|
||||||
|
|
||||||
dispose();
|
dispose();
|
||||||
|
|
Loading…
Reference in a new issue