Skip to content

Commit

Permalink
release sts version 3.2.7
Browse files Browse the repository at this point in the history
Fixed a bug where the uniformity p-value was incorrectly computed due
to an integer division that should have been a double precision division.

Fixed by changing lines of the form:

```c
        expCount = sampleCount / state->tp.uniformity_bins;
```

to:

```c
        expCount = (double)sampleCount / state->tp.uniformity_bins;
```

for each of the 15 classes of test.

The impact on sts version 3.2.6 and earlier was minimal for when
sampleCount was a reasonable value.  However when testing trivially
sized data sets (where the overall statistical results were likely
compromised anyway), the integer division round off is notable.

For example on this small set with 10 bins:

```
6,   8,   6,   6,  16,   4,   3,   5,   5,   5
```

the computed expCount was `0.01791240452984323` (using improper
integer division) vs `0.029796344939787778` (using proper double
precision floating point).

Changed sts version from "3.2.6" to "3.2.7".

Many thanks to the GitHub user @tajuma for discovering this problem
and taking the time to report it via GitHub and for recommending a
solution.  We extended their solution to all 15 classes of tests.

We **HIGHLY** recommend this fix.
  • Loading branch information
lcn2 committed Apr 4, 2024
1 parent 060abcb commit 800e8d7
Show file tree
Hide file tree
Showing 16 changed files with 16 additions and 16 deletions.
2 changes: 1 addition & 1 deletion src/sts.c
Original file line number Diff line number Diff line change
Expand Up @@ -305,7 +305,7 @@


// STS version
const char *const version = "3.2.6";
const char *const version = "3.2.7";

// Program name
char *program = "sts";
Expand Down
2 changes: 1 addition & 1 deletion src/tests/approximateEntropy.c
Original file line number Diff line number Diff line change
Expand Up @@ -837,7 +837,7 @@ ApproximateEntropy_metric_print(struct state *state, long int sampleCount, long
* Compute uniformity p-value
*/
chi2 = 0.0;
expCount = sampleCount / state->tp.uniformity_bins;
expCount = (double)sampleCount / state->tp.uniformity_bins;
if (expCount <= 0.0) {
uniformity = 0.0; // Not enough samples for uniformity check
} else {
Expand Down
2 changes: 1 addition & 1 deletion src/tests/blockFrequency.c
Original file line number Diff line number Diff line change
Expand Up @@ -732,7 +732,7 @@ BlockFrequency_metric_print(struct state *state, long int sampleCount, long int
* Compute uniformity p-value
*/
chi2 = 0.0;
expCount = sampleCount / state->tp.uniformity_bins;
expCount = (double)sampleCount / state->tp.uniformity_bins;
if (expCount <= 0.0) {
// Not enough samples for uniformity check
uniformity = 0.0;
Expand Down
2 changes: 1 addition & 1 deletion src/tests/cusum.c
Original file line number Diff line number Diff line change
Expand Up @@ -831,7 +831,7 @@ CumulativeSums_metric_print(struct state *state, long int sampleCount, long int
* Compute uniformity p-value
*/
chi2 = 0.0;
expCount = sampleCount / state->tp.uniformity_bins;
expCount = (double)sampleCount / state->tp.uniformity_bins;
if (expCount <= 0.0) {
// Not enough samples for uniformity check
uniformity = 0.0;
Expand Down
2 changes: 1 addition & 1 deletion src/tests/discreteFourierTransform.c
Original file line number Diff line number Diff line change
Expand Up @@ -887,7 +887,7 @@ DiscreteFourierTransform_metric_print(struct state *state, long int sampleCount,
* Compute uniformity p-value
*/
chi2 = 0.0;
expCount = sampleCount / state->tp.uniformity_bins;
expCount = (double)sampleCount / state->tp.uniformity_bins;
if (expCount <= 0.0) {
// Not enough samples for uniformity check
uniformity = 0.0;
Expand Down
2 changes: 1 addition & 1 deletion src/tests/frequency.c
Original file line number Diff line number Diff line change
Expand Up @@ -670,7 +670,7 @@ Frequency_metric_print(struct state *state, long int sampleCount, long int toolo
* Compute uniformity p-value
*/
chi2 = 0.0;
expCount = sampleCount / state->tp.uniformity_bins;
expCount = (double)sampleCount / state->tp.uniformity_bins;
if (expCount <= 0.0) {
uniformity = 0.0; // Not enough samples for uniformity check
} else {
Expand Down
2 changes: 1 addition & 1 deletion src/tests/linearComplexity.c
Original file line number Diff line number Diff line change
Expand Up @@ -918,7 +918,7 @@ LinearComplexity_metric_print(struct state *state, long int sampleCount, long in
* Compute uniformity p-value
*/
chi2 = 0.0;
expCount = sampleCount / state->tp.uniformity_bins;
expCount = (double)sampleCount / state->tp.uniformity_bins;
if (expCount <= 0.0) {
// Not enough samples for uniformity check
uniformity = 0.0;
Expand Down
2 changes: 1 addition & 1 deletion src/tests/longestRunOfOnes.c
Original file line number Diff line number Diff line change
Expand Up @@ -1055,7 +1055,7 @@ LongestRunOfOnes_metric_print(struct state *state, long int sampleCount, long in
* Compute uniformity p-value
*/
chi2 = 0.0;
expCount = sampleCount / state->tp.uniformity_bins;
expCount = (double)sampleCount / state->tp.uniformity_bins;
if (expCount <= 0.0) {
// Not enough samples for uniformity check
uniformity = 0.0;
Expand Down
2 changes: 1 addition & 1 deletion src/tests/nonOverlappingTemplateMatchings.c
Original file line number Diff line number Diff line change
Expand Up @@ -1196,7 +1196,7 @@ NonOverlappingTemplateMatchings_metric_print(struct state *state, long int sampl
* Compute uniformity p-value
*/
chi2 = 0.0;
expCount = sampleCount / state->tp.uniformity_bins;
expCount = (double)sampleCount / state->tp.uniformity_bins;
if (expCount <= 0.0) {
// Not enough samples for uniformity check
uniformity = 0.0;
Expand Down
2 changes: 1 addition & 1 deletion src/tests/overlappingTemplateMatchings.c
Original file line number Diff line number Diff line change
Expand Up @@ -820,7 +820,7 @@ OverlappingTemplateMatchings_metric_print(struct state *state, long int sampleCo
* Compute uniformity p-value
*/
chi2 = 0.0;
expCount = sampleCount / state->tp.uniformity_bins;
expCount = (double)sampleCount / state->tp.uniformity_bins;
if (expCount <= 0.0) {
// Not enough samples for uniformity check
uniformity = 0.0;
Expand Down
2 changes: 1 addition & 1 deletion src/tests/randomExcursions.c
Original file line number Diff line number Diff line change
Expand Up @@ -1203,7 +1203,7 @@ RandomExcursions_metric_print(struct state *state, long int sampleCount, long in
* Compute uniformity p-value
*/
chi2 = 0.0;
expCount = sampleCount / state->tp.uniformity_bins;
expCount = (double)sampleCount / state->tp.uniformity_bins;
if (expCount <= 0.0) {
// Not enough samples for uniformity check
uniformity = 0.0;
Expand Down
2 changes: 1 addition & 1 deletion src/tests/randomExcursionsVariant.c
Original file line number Diff line number Diff line change
Expand Up @@ -986,7 +986,7 @@ RandomExcursionsVariant_metric_print(struct state *state, long int sampleCount,
* Compute uniformity p-value
*/
chi2 = 0.0;
expCount = sampleCount / state->tp.uniformity_bins;
expCount = (double)sampleCount / state->tp.uniformity_bins;
if (expCount <= 0.0) {
// Not enough samples for uniformity check
uniformity = 0.0;
Expand Down
2 changes: 1 addition & 1 deletion src/tests/rank.c
Original file line number Diff line number Diff line change
Expand Up @@ -846,7 +846,7 @@ Rank_metric_print(struct state *state, long int sampleCount, long int toolow, lo
* Compute uniformity p-value
*/
chi2 = 0.0;
expCount = sampleCount / state->tp.uniformity_bins;
expCount = (double)sampleCount / state->tp.uniformity_bins;
if (expCount <= 0.0) {
// Not enough samples for uniformity check
uniformity = 0.0;
Expand Down
2 changes: 1 addition & 1 deletion src/tests/runs.c
Original file line number Diff line number Diff line change
Expand Up @@ -807,7 +807,7 @@ Runs_metric_print(struct state *state, long int sampleCount, long int toolow, lo
* Compute uniformity p-value
*/
chi2 = 0.0;
expCount = sampleCount / state->tp.uniformity_bins;
expCount = (double)sampleCount / state->tp.uniformity_bins;
if (expCount <= 0.0) {
// Not enough samples for uniformity check
uniformity = 0.0;
Expand Down
2 changes: 1 addition & 1 deletion src/tests/serial.c
Original file line number Diff line number Diff line change
Expand Up @@ -924,7 +924,7 @@ Serial_metric_print(struct state *state, long int sampleCount, long int toolow,
* Compute uniformity p-value
*/
chi2 = 0.0;
expCount = sampleCount / state->tp.uniformity_bins;
expCount = (double)sampleCount / state->tp.uniformity_bins;
if (expCount <= 0.0) {
// Not enough samples for uniformity check
uniformity = 0.0;
Expand Down
2 changes: 1 addition & 1 deletion src/tests/universal.c
Original file line number Diff line number Diff line change
Expand Up @@ -888,7 +888,7 @@ Universal_metric_print(struct state *state, long int sampleCount, long int toolo
* Compute uniformity p-value
*/
chi2 = 0.0;
expCount = sampleCount / state->tp.uniformity_bins;
expCount = (double)sampleCount / state->tp.uniformity_bins;
if (expCount <= 0.0) {
// Not enough samples for uniformity check
uniformity = 0.0;
Expand Down

0 comments on commit 800e8d7

Please sign in to comment.