## Algorithm (`ThurstoneEngine.java`)
| Step | Formula |
| Proportions | P[i][j] = F[i][j] / (F[i][j] + F[j][i]) |
| 0/1 correction | 0 → 1/(2n), 1 → 1 − 1/(2n) |
| Normally deviates | Z[i][j] = Φ⁻1(P[i][j]) (Aklam's algorithm) |
| Scale value | Sᵢ = (1/n) Σⱼ Z[i][j], then shifted so that min S = 0 |
| Fit | P′[i][j] = Φ(Sᵢ − Sⱼ), MAD and RMSE of P − P′ |
Unit tests: `app/src/test/ThurstoneEngineTest.java` (tests the engine
recovers known scale values from simulated data).
## Languages
English (default), Bulgarian, German, French, Spanish – switchable to
the application menu, regardless of the device language.
How the app works
Input. You specify from 3 to 20 objects and the number of evaluators.
Pairwise comparison. Each rater sees all n(n−1)/2 pairs. Their order and left/right position are random so that there is no order or side bias. There is a "Cancel" button, and a "hand over device" screen appears between raters.
Results. The features are sorted by their scale value and displayed as a bar chart. The F, P, Z matrices and the predicted P′ are also displayed. The model fit is expressed as mean absolute deviation and RMSE, with a short score. The report can be shared as text.
Demo. Simulates 40 estimators on known true values to see the method immediately.
The method (Case V) is implemented in ThurstoneEngine.java:
The proportions P = F / total number of comparisons for the pair are calculated.
Unanimous judgments (0 or 1) are corrected to 1/(2n) because Φ⁻¹ at these points is infinite.
Calculate Z = Φ⁻¹(P) using Acklam's algorithm.
The scale value is the average of the Z order. The lowest object gets 0.
From simulated data with true values 0 / 0.4 / 1.1 / 1.5 it recovers 0 / 0.41 / 1.11 / 1.50.