“…During GI optimisation, software undergoes transformations in order to improve a set of properties, either functional or non-functional [1]. The most common type of functional improvement is APR [13], [14], [25], in which a faulty program is modified until the failing test suite passes. In non-functional GI however, the goal is to improve the software's memory usage [8], [9], execution time [5]- [7], energy consumption [10]- [12], and other non-functional properties, whilst maintaining the functional properties of the software, measured with the use of the program's test suite, i.e., test cases should pass after the program transformation.…”