Inactive particles are still a mess. For example, most of the optimizers will bomb if there are any inactive particles in the model (which, since we can't delete particles, there will be). The model iterators should skip inactive particles (that is easy enough), but then anything written in python which calls Model.get_particles() will still run in to them.
My best idea so far: reference count particles. -When the reference count goes to 1, then they are removed from the Model (since that means nothing other than the model points to them). - Since they have no virtual functions, reference counting can be done. - This way everything is safe and the user can't blow things up by inactivating particles. - Since nothing other than the optimizers should ever really be looking through all the particles in the model, leaving the particles there until the user cleans up all references should be ok. - If you want to delete a particle, you can make sure you do so by making sure that trying to fetch it from the Model fails. We do, perhaps, need to make sure that indexes aren't recycled too quickly.