This sounds like a good idea — almost like double buffered animation — where the 2nd buffer is updated while the 1st is being rendered: but in this case the buffers are models. I’ll look at all these options — but I understood Russ’s suggestion more easily.
> On Jul 2, 2015, at 2:41 PM, Russell Thomas <[log in to unmask]> wrote:
>
> Following the idea of "running N simulations in a row with occasional
> visualization", you could duplicate the objects that hold the agent state
> you want to visualize. Assume this is an ObjectGrid2D. You would have one
> for visualization (set up in the normal way, attached to a display window)
> and another one (or N, for each agent, if that is what you need) to hold the
> state of the simulation.
>
> Create a Steppable object to count the number of simulation steps, and then
> at the specified number of steps, this object would copy the contents of
> your simulation grid to the visualization grid. Since you are doing this
> very rarely, the extra overhead in the copy operation should not be a
> problem.
>
> Using this solution would leave all the MASON GUI components unchanged and
> functioning normally. You wouldn't need to manually close and open a display
> window. The only thing updating in the GUI would be the step timer. I'd
> guess that if you minimized the controller window, then you'd skip this
> overhead, too.
>
> Russ
>
>
> On 7/2/15, 11:25 AM, "Sean Luke" <[log in to unmask]> wrote:
>
>> The problem here is that graphical interface libraries like to be in control
>> of your main loop, but you're running an evolutionary computation system which
>> is probably going to be in control of the main loop. So a few resources and
>> ideas.
>>
>> First, note that if you've followed the rules regarding properly serializable
>> stuff, and you have no writeable shared or static variables, you can probably
>> easily copy the entire runtime state of a MASON simulation using the
>> ec/util/DataPipe.java file found in the ECJ toolkit
>> (https://github.com/eclab/ecj/blob/master/ecj/ec/util/DataPipe.java). Just
>> checkpoint into it, and then checkpoint out of it, and now you've got another
>> SimState. You could probably use this to run stuff in the background, then
>> occasionally "clone" a simulation to use in the foreground while stuff is
>> still running in the background.
>>
>> Second, if you weren't using an evolutionary computation facility, but rather
>> were just running N simulations in a row with occasional visualization, you
>> could easily hack something up to not display anything in the GUI (just
>> closing the windows) then occasionally pop up a display.
>>
>> Here's what I'd do. Let's say your model is of the class MyModel and your
>> visualization is of the class MyModelWithUI. Do your evolutionary computation
>> loop, then when you want to view a simulation representing a current solution,
>> let's say that the simulation you want to see is called mymodel. Then you
>> could say:
>>
>> // copy it so we can still do things with mm in the background
>> // (if that matters to you)
>> MyModel mm = (MyModel)(DataPipe.copy(mymodel));
>>
>> // display
>> MyModelWithUI mmwi = new MyModelWithUI(mysim);
>> Console c = new Console(mmwi);
>> c.setVisible();
>>
>> ... then continue evolving in a separate thread in the background.
>>
>> Sean
>>
>>
>> On Jul 2, 2015, at 2:03 PM, Sadat Chowdhury <[log in to unmask]> wrote:
>>
>>> Ernesto,
>>>
>>> I have considered checkpointing ‹ and that option is out. I really want a bit
>>> more control over the controller mechanism itself: I want to be able to
>>> detach and re-attach the model (and/or view) at will.
>>>
>>> Checkpointing mechanism allows me to take snapshopts of my model and view it
>>> separately. Itąs intended to allow one to view a stored snapshot of the
>>> model, in case there are accidental failures or models that have run on
>>> different platforms‹ and thatąs all good ‹ but not what Iąm looking for.
>>>
>>> -Sadat.
>>>
>>>> On Jul 2, 2015, at 12:47 PM, Ernesto Carrella <[log in to unmask]> wrote:
>>>>
>>>> I think what you are asking for is "checkpointing" which is implemented and
>>>> well described in the MASON manual (section 4.2.1 and the tutorial too)
>>>> although it requires every object to be serializable.
>>>> There might be other ways of storing java objects obviously but this is
>>>> native so it might be worth a try.
>>>>
>>>> On Thu, Jul 2, 2015 at 5:43 PM Sadat Chowdhury <[log in to unmask]> wrote:
>>>> I probably asked this before.
>>>>
>>>> My model is an evolutionary system that evolves agents towards some goal.
>>>> When I evolve each successive generation, I have to run N number of
>>>> simulations ‹ basically evaluating a population of N genotypes (N is
>>>> usually 512). By the time I get to the 100th generation, I would have run
>>>> 100N simulations.
>>>>
>>>> I want to visualize the behavior of these agents (in the View) ‹ but I want
>>>> to just observe one simulation, every N simultions. In other words, I want
>>>> to visualize simulation number 1, simulation number N+1, simulation number
>>>> 2N+1, and so onŠ (it doesnąt have to be the first one, neccessarily, it
>>>> could be just any one from that set of N simulations).
>>>>
>>>> Translated in the model-view-controller lingo: I want the controller to
>>>> stop observing the model and rendering the view at certain points while
>>>> keeping the model running as usual. The reason for this should be obvious:
>>>> the model runs much much faster without graphics rendering ‹ and I want to
>>>> observe the progress much more efficiently by peeking into the model,
>>>> periodically.
>>>>
>>>> Certain options are out: I donąt want to serialize and re-animate with a
>>>> separate łplayer˛ ‹ I want to observe real-time.
>>>>
>>>> I am more than willing to get under the hood of MASON and directly work on
>>>> the source (e.g. Controller.java) ‹ all at my own risk, of course. What
>>>> would be nice is some idea on where I can momentarily łdetach˛ the view and
>>>> łre-attach˛ it again.
|