- /*
- * Forcing chains.
- */
- if (latin_solver_forcing(solver, scratch)) {
- diff = max(diff, diff_extreme);
- goto cont;
- }
+ for (i = 0; i <= maxdiff; i++) {
+ if (usersolvers[i])
+ ret = usersolvers[i](solver, ctx);
+ else
+ ret = 0;
+ if (ret == 0 && i == diff_simple)
+ ret = latin_solver_diff_simple(solver);
+ if (ret == 0 && i == diff_set_0)
+ ret = latin_solver_diff_set(solver, scratch, 0);
+ if (ret == 0 && i == diff_set_1)
+ ret = latin_solver_diff_set(solver, scratch, 1);
+ if (ret == 0 && i == diff_forcing)
+ ret = latin_solver_forcing(solver, scratch);
+
+ if (ret < 0) {
+ diff = diff_impossible;
+ goto got_result;
+ } else if (ret > 0) {
+ diff = max(diff, i);
+ goto cont;
+ }
+ }