@Override
public void dynamicDeletion(Constraint c) {
for (Propagator toDelete : c.getPropagators()) {
int nsize = propagators.length - 1;
Propagator toMove = propagators[nsize];
int idtd = p2i.get(toDelete.getId());
int idtm = p2i.get(toMove.getId());
assert idtd <= idtm : "wrong id for prop to delete";
// 1. remove from propagators[] and p2i
Propagator[] _propagators = propagators;
propagators = new Propagator[nsize];
System.arraycopy(_propagators, 0, propagators, 0, nsize);
// 2. resize schedule_f[]
boolean sftm = schedule_f[idtm];
assert !schedule_f[idtd] : "try to delete a propagator which is scheduled (fine)";
boolean[] _schedule_f = schedule_f;
schedule_f = new boolean[nsize];
System.arraycopy(_schedule_f, 0, schedule_f, 0, nsize);
// 3. resize schedule_c[]
boolean sctm = schedule_c[idtm];
assert !schedule_c[idtd] : "try to delete a propagator which is scheduled (coarse)";
boolean[] _schedule_c = schedule_c;
schedule_c = new boolean[nsize];
System.arraycopy(_schedule_c, 0, schedule_c, 0, nsize);
// 4. remove event_f
IntCircularQueue icqtm = event_f[idtm];
assert !toDelete.reactToFineEvent() || event_f[idtd].isEmpty() : "try to delete a propagator which has events to propagate (fine)";
IntCircularQueue[] _event_f = event_f;
event_f = new IntCircularQueue[nsize];
System.arraycopy(_event_f, 0, event_f, 0, nsize);
// 5. remove event_f
PropagatorEventType ettm = event_c[idtm];
assert event_c[idtd] == PropagatorEventType.VOID : "try to delete a propagator which has events to propagate (coarse)";
PropagatorEventType[] _event_c = event_c;
event_c = new PropagatorEventType[nsize];
System.arraycopy(_event_c, 0, event_c, 0, nsize);
// 6. remove eventmasks
int[] emtm = eventmasks[idtm];
// assert eventmasks[idtd]. : "try to delete a propagator which has events to propagate (fine)";
int[][] _eventmasks = eventmasks;
eventmasks = new int[nsize][];
System.arraycopy(_eventmasks, 0, eventmasks, 0, nsize);
// 6. copy data
if (idtd < nsize) {
propagators[idtd] = toMove;
p2i.set(toMove.getId(), idtd);
schedule_f[idtd] = sftm;
schedule_c[idtd] = sctm;
event_f[idtd] = icqtm;
event_c[idtd] = ettm;
eventmasks[idtd] = emtm;