The runnable-combination count: how many version tuples satisfy the requirements the factors place on each other.
A requirement need not hold for every version of the declaring package (A 0.2.5 may pin B to 0.2.1 while
A 0.3.0 pins it to 0.3.2), so the two are counted as coupled rather than as independent factors: a version
of A only ever multiplies in the versions of B it actually admits.
Counting all couplings exactly is #CSP-hard, so they are counted over a spanning forest of the coupling graph,
preferring the couplings that always apply. That is exact whenever the graph has no cycle, which covers the common
shared-hub shape. A coupling that would close a cycle is dropped and reported as uncounted, leaving the result an
upper bound. Only the forest's couplings need their compatibility matrix, so the work stays linear in the factors.
The runnable-combination count: how many version tuples satisfy the requirements the factors place on each other. A requirement need not hold for every version of the declaring package (
A 0.2.5may pinBto0.2.1whileA 0.3.0pins it to0.3.2), so the two are counted as coupled rather than as independent factors: a version ofAonly ever multiplies in the versions ofBit actually admits.Counting all couplings exactly is #CSP-hard, so they are counted over a spanning forest of the coupling graph, preferring the couplings that always apply. That is exact whenever the graph has no cycle, which covers the common shared-hub shape. A coupling that would close a cycle is dropped and reported as uncounted, leaving the result an upper bound. Only the forest's couplings need their compatibility matrix, so the work stays linear in the factors.