Reorganise the dsf API into three kinds of dsf.

This is preparing to separate out the auxiliary functionality, and
perhaps leave space for making more of it in future.

The previous name 'edsf' was too vague: the 'e' stood for 'extended',
and didn't say anything about _how_ it was extended. It's now called a
'flip dsf', since it tracks whether elements in the same class are
flipped relative to each other. More importantly, clients that are
going to use the flip tracking must say so when they allocate the dsf.

And Keen's need to track the minimal element of an equivalence class
is going to become a non-default feature, so there needs to be a new
kind of dsf that specially tracks those, and Keen will have to call it.

While I'm here, I've renamed the three dsf creation functions so that
they start with 'dsf_' like all the rest of the dsf API.
This commit is contained in:
Simon Tatham
2023-04-20 17:27:21 +01:00
parent 14e1e05510
commit c5e253a9f9
23 changed files with 131 additions and 119 deletions

View File

@ -1429,12 +1429,12 @@ static bool deduce_forcing_chain(struct solver_scratch *sc)
if (!sc->dc_scratch)
sc->dc_scratch = snewn(sc->dc, int);
if (!sc->dsf_scratch)
sc->dsf_scratch = snew_dsf(sc->pc);
sc->dsf_scratch = dsf_new_flip(sc->pc);
/*
* Start by identifying chains of placements which must all occur
* together if any of them occurs. We do this by making
* dsf_scratch an edsf binding the placements into an equivalence
* dsf_scratch a flip dsf binding the placements into an equivalence
* class for each entire forcing chain, with the two possible sets
* of dominoes for the chain listed as inverses.
*/
@ -1442,9 +1442,9 @@ static bool deduce_forcing_chain(struct solver_scratch *sc)
for (si = 0; si < sc->wh; si++) {
struct solver_square *sq = &sc->squares[si];
if (sq->nplacements == 2)
edsf_merge(sc->dsf_scratch,
sq->placements[0]->index,
sq->placements[1]->index, true);
dsf_merge_flip(sc->dsf_scratch,
sq->placements[0]->index,
sq->placements[1]->index, true);
}
/*
* Now read out the whole dsf into pc_scratch, flattening its
@ -1457,7 +1457,7 @@ static bool deduce_forcing_chain(struct solver_scratch *sc)
*/
for (pi = 0; pi < sc->pc; pi++) {
bool inv;
int c = edsf_canonify(sc->dsf_scratch, pi, &inv);
int c = dsf_canonify_flip(sc->dsf_scratch, pi, &inv);
sc->pc_scratch[pi] = c * 2 + (inv ? 1 : 0);
}