optimisation loop