@@ -140,6 +140,7 @@ def __init__(self, process_function: Callable[["Engine", Any], Any]):
140140 self ._process_function = process_function
141141 self .last_event_name : Optional [Events ] = None
142142 self .should_terminate = False
143+ self .skip_completed_after_termination = False
143144 self .should_terminate_single_epoch = False
144145 self .should_interrupt = False
145146 self .state = State ()
@@ -538,7 +539,7 @@ def call_interrupt():
538539 self .logger .info ("interrupt signaled. Engine will interrupt the run after current iteration is finished." )
539540 self .should_interrupt = True
540541
541- def terminate (self ) -> None :
542+ def terminate (self , skip_completed : bool = False ) -> None :
542543 """Sends terminate signal to the engine, so that it terminates completely the run. The run is
543544 terminated after the event on which ``terminate`` method was called. The following events are triggered:
544545
@@ -547,6 +548,9 @@ def terminate(self) -> None:
547548 - :attr:`~ignite.engine.events.Events.TERMINATE`
548549 - :attr:`~ignite.engine.events.Events.COMPLETED`
549550
551+ Args:
552+ skip_completed: if True, the event :attr:`~ignite.engine.events.Events.COMPLETED` is not fired after
553+ :attr:`~ignite.engine.events.Events.TERMINATE`. Default is False.
550554
551555 Examples:
552556 .. testcode::
@@ -617,9 +621,12 @@ def terminate():
617621 .. versionchanged:: 0.4.10
618622 Behaviour changed, for details see https://github.com/pytorch/ignite/issues/2669
619623
624+ .. versionchanged:: 0.5.2
625+ Added `skip_completed` flag
620626 """
621627 self .logger .info ("Terminate signaled. Engine will stop after current iteration is finished." )
622628 self .should_terminate = True
629+ self .skip_completed_after_termination = skip_completed
623630
624631 def terminate_epoch (self ) -> None :
625632 """Sends terminate signal to the engine, so that it terminates the current epoch. The run
@@ -993,13 +1000,17 @@ def _internal_run_as_gen(self) -> Generator[Any, None, State]:
9931000 time_taken = time .time () - start_time
9941001 # time is available for handlers but must be updated after fire
9951002 self .state .times [Events .COMPLETED .name ] = time_taken
996- handlers_start_time = time .time ()
997- self ._fire_event (Events .COMPLETED )
998- time_taken += time .time () - handlers_start_time
999- # update time wrt handlers
1000- self .state .times [Events .COMPLETED .name ] = time_taken
1003+
1004+ # do not fire Events.COMPLETED if we terminated the run with flag `skip_completed=True`
1005+ if not (self .should_terminate and self .skip_completed_after_termination ):
1006+ handlers_start_time = time .time ()
1007+ self ._fire_event (Events .COMPLETED )
1008+ time_taken += time .time () - handlers_start_time
1009+ # update time wrt handlers
1010+ self .state .times [Events .COMPLETED .name ] = time_taken
1011+
10011012 hours , mins , secs = _to_hours_mins_secs (time_taken )
1002- self .logger .info (f"Engine run complete . Time taken: { hours :02d} :{ mins :02d} :{ secs :06.3f} " )
1013+ self .logger .info (f"Engine run finished . Time taken: { hours :02d} :{ mins :02d} :{ secs :06.3f} " )
10031014
10041015 except BaseException as e :
10051016 self ._dataloader_iter = None
@@ -1174,13 +1185,17 @@ def _internal_run_legacy(self) -> State:
11741185 time_taken = time .time () - start_time
11751186 # time is available for handlers but must be updated after fire
11761187 self .state .times [Events .COMPLETED .name ] = time_taken
1177- handlers_start_time = time .time ()
1178- self ._fire_event (Events .COMPLETED )
1179- time_taken += time .time () - handlers_start_time
1180- # update time wrt handlers
1181- self .state .times [Events .COMPLETED .name ] = time_taken
1188+
1189+ # do not fire Events.COMPLETED if we terminated the run with flag `skip_completed=True`
1190+ if not (self .should_terminate and self .skip_completed_after_termination ):
1191+ handlers_start_time = time .time ()
1192+ self ._fire_event (Events .COMPLETED )
1193+ time_taken += time .time () - handlers_start_time
1194+ # update time wrt handlers
1195+ self .state .times [Events .COMPLETED .name ] = time_taken
1196+
11821197 hours , mins , secs = _to_hours_mins_secs (time_taken )
1183- self .logger .info (f"Engine run complete . Time taken: { hours :02d} :{ mins :02d} :{ secs :06.3f} " )
1198+ self .logger .info (f"Engine run finished . Time taken: { hours :02d} :{ mins :02d} :{ secs :06.3f} " )
11841199
11851200 except BaseException as e :
11861201 self ._dataloader_iter = None
0 commit comments