Print

Print


On Jun 26, 2008, at 8:00 PM, Jim Saxe wrote:

> I'm wondering whether anybody knows a good way to use MASON for the
> rare event simulation technique known as "splitting".
>
> For those who don't know what this is, you can find references by
> doing a web search with the search terms "rare event simulation"
> and "splitting".  Briefly, however, the technique involves
> identifying certain system states reached during a simulation--let's
> call them "split points"--from which it is desirable to run multiple
> continuations of the simulation with different random choices
> controlling the events after the split point in each continuation.
> Within each continuation, zero or more further split points might be
> chosen.

The obvious thing to do would be to clone the entire simulation, then  
set some variable difference among them and continue.  A couple of  
issues arise:

1. Cloneable is problematic -- it doesn't work well if you have an  
object graph: that is, for nearly any moderate sized scenario.  For  
this reason MASON was not set up to be deep-cloned in this fashion.   
However there's another approach which WILL work, assuming you've not  
created any non-final static variables (or have handled them  
specially): serialize out the entire simulation, then unserialize  
it.  In fact you need not even create a file -- in ECJ we used  
exactly this technique and created an object, ec.util.DataPipe (steal  
it from the ECJ distro) to which you can attach an Input and an  
Output stream.

2. There's the issue of correlation in the random number generators.   
Though MersenneTwister is good, I don't get a good feeling there.   
What I would do is replace the MersenneTwisterFast instances each  
time you do a split with a brand new MersenneTwisterFast on a  
different random number seed.  Be very careful here -- you need that  
seed to be really really random in order to avoid correlations.  You  
might use another high-quality generator to create a large stream of  
ints, then grab each 624 (?) of them to populate a new MT instance's  
internal state.

3. You'll need to handle output streams if you have them.

Sean