chore(ilp): use itertools.[product|combination] instead of nested loops
feat: ILPPIGClustering with objective functions and constraints