On Oct 5, 2004, at 7:53 AM, Tony Bigbee wrote:

> Is there a recommended way to dynamically remove specific Steppable
> objects from the schedule?
> Right now, I simply check a boolean to see whether a steppable
> instance is alive or not at the beginning of the step().  For low
> numbers of steppables and time steps, this is reasonable solution, but
> for long runs and large numbers of steppables it may add undesirable
> overhead via the main model, graphs/charts, etc.   I am dynamically
> removing Steppables from a SparseGrid2D.

While leaving dead agents in the schedule until they're flushed uses up
memory, we do it the way we do because it's likely significantly faster
than manually removing them.  Ordinarily a remove() from a heap is O(lg
n), but the remove requires that you know the *key*, not the *object*
being removed.  In our schedule, many things can be scheduled for the
same time (the key).    Without some bookeeping (which adds cost
elsewhere), removing objects from heaps is O(n) -- expensive.

If you have a very large number of objects in the heap, so many that
it's causing problems memory-wise, we can figure out some way to remove
objects from the heap.  But I'd be surprised: you'd need to be looking
at millions of agents probably.

Instead, as you've said you're already doing, you should "turn off" the
Steppable so that when step() is called it it is simply ignored.  If
the Steppable is being repeated, it's easy: just call stop() on the
Stoppable returned.  Otherwise you have to roll your own.  Perhaps you
might make up a stop() method (or name it as you like) like this:

boolean stopped = false;
public void stop() { stopped = true; }
public void step(SimState state)
        if (!stopped)
                // do my stuff here

...then you just call stop() and forget about the Steppable.

Hmmmm, maybe I could make a class to do that.  Try this: