We store various incompatibilities between vehicles and jobs (based on skills and other constraints) for constant-time lookup through Input::vehicle_ok_with_job. This used to allow early aborts for many operators during local search as compatibility is typically checked first place in cvrp::OperatorName::is_valid.
Now since #266 has been implemented, most validity checks happen after gain computations. So for a local search move with an obvious incompatibility between job and vehicle we still create the operator and call compute_gain while the following is_valid call is bound to fail.
We should ensure LS operators expect compatibility to be checked before-hand (maybe assert it for debugging), while moving all such checks to LocalSearch::run_ls_step, resulting in earlier aborts for obvious incompatibilities.
We store various incompatibilities between vehicles and jobs (based on skills and other constraints) for constant-time lookup through
Input::vehicle_ok_with_job. This used to allow early aborts for many operators during local search as compatibility is typically checked first place incvrp::OperatorName::is_valid.Now since #266 has been implemented, most validity checks happen after gain computations. So for a local search move with an obvious incompatibility between job and vehicle we still create the operator and call
compute_gainwhile the followingis_validcall is bound to fail.We should ensure LS operators expect compatibility to be checked before-hand (maybe assert it for debugging), while moving all such checks to
LocalSearch::run_ls_step, resulting in earlier aborts for obvious incompatibilities.