Description
Currently, the code does not call self.on_crossover(self, self.last_generation_offspring_crossover) on line 1373 when self.crossover_type is None. A callback before executing the mutation segment would be however useful for customizing the mutation type and probability on an offspring-by-offspring basis, even when no crossover is required.
I am requesting that the on_crossover provisioned method be called with a modified or unmodified offspring, regardless to crossover type value. A similar logic would also apply to on_mutation specified callback function.
IMO: In general, any specified callbacks should be exercised throughout the framework pipeline when provisioned, regardless of internal processing. The user should be able to rely on the callbacks being triggered, and then perhaps ignore them as applicable.
Please see additional information added on 10/20/2022, below.