schulze_ranker
Schulze pairwise preference ranker. It builds the direct pairwise strength graph from aggregated matchups and applies the Schulze strongest-path dynamic program to derive the final pairwise preference relation.
The library implements the ranker_protocol defined in the
ranking_protocols library. It provides predicates for learning a
ranker from pairwise preferences, using it to order candidate items, and
exporting it as a list of predicate clauses or to a file.
Datasets are represented as objects implementing the
pairwise_ranking_dataset_protocol protocol from the
ranking_protocols library. See the test_datasets directory for
examples. The current implementation requires a well-formed connected
pairwise dataset so that all ranked items remain comparable in the
aggregated matchup graph.
API documentation
Open the ../../apis/library_index.html#schulze_ranker link in a web browser.
Loading
To load this library, load the loader.lgt file:
| ?- logtalk_load(schulze_ranker(loader)).
Testing
To test this library predicates, load the tester.lgt file:
| ?- logtalk_load(schulze_ranker(tester)).
Features
Pairwise Preference Learning: Learns one deterministic score per item from aggregated pairwise outcomes.
Schulze Strongest Paths: Computes the final ranking relation using the Schulze strongest-path dynamic program over aggregated head-to-head data.
Configurable Direct Edge Semantics: Supports both winning-votes and victory-margins victory-strength modes. The
victory_strength/1option selects whether direct edges use winning votes or victory margins before strongest-path propagation.Strongest-Path Access: Exposes the labeled strongest-path relation for ordered item pairs using the
strongest_paths/2predicate.Deterministic Ranking: Orders candidate items by final Schulze relation win counts with deterministic tie-breaking.
Tie-breaking: Items tied in the final Schulze relation receive the same learned score, and ranking ties are then broken deterministically using the standard term order of the item identifiers.
Strict Dataset Validation: Rejects duplicate items, undeclared items, self-preferences, non-positive weights, and disconnected comparison graphs.
Training Diagnostics: Learned rankers include dataset summary metadata and the effective victory-strength mode.
Ranker Export: Learned rankers can be exported as self-contained terms.
Options
The following options can be passed to the learn/3 predicate:
victory_strength(winning_votes): Use the winning side’s aggregated vote total as the direct edge strength.victory_strength(margins): Use the victory margin as the direct edge strength.
The default is victory_strength(winning_votes).
Strongest paths
The strongest_paths/2 predicate returns the learned strongest-path
matrix as an ordered list of path(Item1, Item2, Strength) terms for
all ordered pairs of distinct learned items.
This predicate complements scores/2 and rank/3 without changing
their semantics. The scores/2 predicate still returns the number of
opponents that each item beats in the final Schulze relation, while
strongest_paths/2 exposes the underlying pairwise path strengths
used to derive that relation.
Diagnostics syntax
The diagnostics/2 predicate returns a list of metadata terms with
the form:
[
model(schulze_ranker),
options(Options),
strongest_paths(StrongestPaths),
dataset_summary(DatasetSummary)
]
Ranker representation
The learned ranker is represented by a compound term of the form:
schulze_ranker(Items, Scores, Diagnostics)
Where:
Items: List of ranked items.Scores: List ofItem-Scorepairs.Diagnostics: List of metadata terms, including the effectivevictory_strength/1option, the labeled strongest paths, and the dataset summary.