Fixed matrix rank algorithm and added tests

This commit is contained in:
Asher 2025-07-07 11:55:25 +01:00
parent bbed86f19d
commit 015c069462
8 changed files with 242 additions and 18 deletions

View File

@ -0,0 +1,17 @@
import numpy as np
import galois
def matrix_to_string(matrix):
return ''.join(''.join(str(bit) for bit in row) for row in matrix)
GF2 = galois.GF(2)
np.random.seed(12487812)
for _ in range(180):
mat = np.random.randint(0, 2, (10, 10), dtype=np.uint8)
mat_gf2 = GF2(mat)
rank = np.linalg.matrix_rank(mat_gf2) # rank over GF(2)
matrix_str = matrix_to_string(mat)
print(f'bmatrixtest("{matrix_str}", {rank});')

View File

@ -203,20 +203,197 @@ TEST_CASE("igam function"){
}
}
TEST_CASE("Matrix utilities"){
splat::matrix<3> testMatrix = {
std::bitset<3>("010"),
std::bitset<3>("110"),
std::bitset<3>("010")
auto bmatrixtest = [](std::string matrix, int expected_rank){
splat::matrix<10> testMatrix;
for(int i=0; i<10; i++){
testMatrix[i]=std::bitset<10>(matrix.substr((i*10), 10));
}
REQUIRE(splat::getRank(testMatrix) == expected_rank);
};
splat::matrix<3> testMatrix2 = {
std::bitset<3>("010"),
std::bitset<3>("101"),
std::bitset<3>("011")
};
// These tests were produced using the script in ./gen_matrix_tests.py
REQUIRE(splat::getRank(testMatrix) == 2);
REQUIRE(splat::getRank(testMatrix2) == 3);
bmatrixtest("0010111100100011011010100111101101100011101011110110111000101111111000101111111000101101011100011010", 9);
bmatrixtest("0101100001011110110010010001111001101100111000111010101111001111001101010011101000100010001001110100", 9);
bmatrixtest("0011010010111001111110101010111011111111000010001010011011011101110110011010100000000011111011010010", 9);
bmatrixtest("1100011101101010111011001001101101010101100110101000001100111111101111001000001110101011111100011101", 9);
bmatrixtest("1010001001010001110111111011101100100010000100111000011011001011010101111101000101011100001111101001", 10);
bmatrixtest("0111100101110111111101111111100001101101011100110100000100000101110110010010001001000001010100111110", 10);
bmatrixtest("1000101000000001100110110100011111100000111101110101000001001001011010010110111011010001000101011100", 10);
bmatrixtest("1110011000100010101011000100110011000011110101110110111000101101101000111010111110000011011001011000", 9);
bmatrixtest("0100001111101011010101011110111000001101111110010010000110011010101010101011000001011110111110001000", 9);
bmatrixtest("0000111000111111100010110010000101001001011001010111100000100010000001100001000111110101110100000101", 9);
bmatrixtest("0110101101000000011110010100011000010110110100001100011010110110110000001101111011011101111111111101", 10);
bmatrixtest("1101001101000100000001000010110010101101001001101000111010111100111001101111000110001100110001000111", 9);
bmatrixtest("1010101111100010101011010010001010010001100101001101101110110001011010011101011011110101000101010001", 9);
bmatrixtest("1100010111000001011101001001100111101100000010110010110111001001111011111100101110010001010000001011", 9);
bmatrixtest("1101011111001010101101101101001011000011010100001000001101000010110011100111111001110011101010100011", 10);
bmatrixtest("0010100100000100110001011101001010001011101111010000110101100000010010101001110001110110001110010101", 9);
bmatrixtest("1111010101001001101010111111100111010011000100001101111101010001100100100100011110000001100001110011", 9);
bmatrixtest("0110000000101110100010101101111001001101110111010101100100011011100001010111111110111111100111100011", 9);
bmatrixtest("1101010010010001111001000000000110010000000100000110110000010101110000001101101000100100000100101010", 9);
bmatrixtest("0101010010000111011011011001111111111011010001011010100001010111101100111111000100110010110011100010", 10);
bmatrixtest("1101101101100110010010000100000001110010010100010110001111010001100110010000000110011111110010110111", 9);
bmatrixtest("0111001000111101001011011110101001111101110000101110010110101111011010010010011001000100100111010100", 10);
bmatrixtest("0100101100100110000000010110001101000101011001110100011011011111100101100001100000111000001100000010", 9);
bmatrixtest("1100000111001111101000101000001111110010111110101010011111010010001101101110111101110000100110110101", 8);
bmatrixtest("0010010001100001111110110010101001001111100000101111010000101011010111111101010000000111001101011100", 9);
bmatrixtest("0010010001100100001000111100001011111111101100010011000001100011100010000101010000101111111011010010", 10);
bmatrixtest("1110100111110010001100001001101001010101000001100100110100011000110100010111101110001110001110110111", 10);
bmatrixtest("0000010111000110110001001010111111100000001010101100110111111101001111001101101101000001010110101010", 8);
bmatrixtest("0000110101111011011101110100011001101100110000011001111001111000010110101011110100000010100000001001", 8);
bmatrixtest("1011000101101100011000101101000010001000000100110110010000100101010101111110000001011110010110100000", 9);
bmatrixtest("1111110100001000001111011000101010011101101101000110100001100001001000101010001000001000001111000100", 9);
bmatrixtest("0111001011001110101100100110010000110011001100000101100000101011011110010101010111111000110001111100", 10);
bmatrixtest("0100100100111000011010111000111110001111010101101111010111111000110100000100101000001110011001110000", 8);
bmatrixtest("0100111101011101100101001101001110110011000100111010010111101100000010000010000111011001110000111110", 9);
bmatrixtest("1101010111011110011110101001000000101000000100110010000111110111110100101101101000101001001100110010", 10);
bmatrixtest("0110000000111010101010000000001000100000011100101000011000111010010011010001101110101110000110001111", 9);
bmatrixtest("0110000010011101011110010100011010001011011010010011111010111000000111001011010001011101001100101101", 9);
bmatrixtest("1100111101000101100101111011100011110001000010101011100100111010001000111100001011001011100001110010", 10);
bmatrixtest("1110111100100111111110110110110011001100010001001101111000100011111100001110111001001100110010000001", 10);
bmatrixtest("0101000010010001101011001111101000111000011101110001101110010010001001011101000011000010001010000101", 9);
bmatrixtest("1011001100001000000001111110111100111011111101011110011000010001000111110101101010101011000111101101", 9);
bmatrixtest("1111010000111110011000000100101001110100111001010011000001110010110101001101010001011111110110100011", 10);
bmatrixtest("0001010011001000010101111100001010100010001011001100011110001111111111100011110101010111101101110110", 9);
bmatrixtest("1001110000100110101100001011001100001010110110000010010011100110100001110101011011100000100001001001", 9);
bmatrixtest("1001000101100011101100110000111110100010110111000000011101000001001101011100111001001111111001010110", 9);
bmatrixtest("1111100110100110011000110011010010000100000101010100110010100000100010011111001100010000011110101100", 9);
bmatrixtest("0001111111101010100100001111011000011111101010110100101010100001011100100001100100101010101100100101", 8);
bmatrixtest("1001001010101001001010101111000101000000110101110010001111111011010000001011111000001111010000011001", 8);
bmatrixtest("0011101100010000110111101111111001101010000110010011011110001010111000010101101101101010100000111100", 9);
bmatrixtest("0110011110100111110001000111010010111001110100100101011110101101011111101110110100101000110111011100", 9);
bmatrixtest("1110110010000110101010010100111000000001111000111110001010100100100011001111101001011010001100111110", 8);
bmatrixtest("0101000110010000001000000000101010111110001000111110100011010001101100110000001111011101101001110100", 8);
bmatrixtest("1011010000111100110001000011111000011111110011101001001100110001110101111110001100100100111001001001", 9);
bmatrixtest("1110100110011000111101100110010101101110111000100100011010000011110110001110001110110100010100011100", 9);
bmatrixtest("0110000010111100111010001010010100100111000101001111101001000101111101110111100110111001111000001111", 10);
bmatrixtest("0011110111110010011110011011110010110001001101001110011110110101010100010000111010110001101001011001", 9);
bmatrixtest("0010101100001111101011010000000101111011000000111110101110101100011100010101101000000110010101101101", 9);
bmatrixtest("1000101110011010101000111101111100101100010000001100110100000011010111001110000110001101010100001011", 10);
bmatrixtest("0001001111100101101111001001101011111000101010011010011000011110100101011000100011101101011111100001", 9);
bmatrixtest("1011101001000011110001110001110101011100011010110110111110110010110011001100010101001110100111110100", 10);
bmatrixtest("1000100000100000010101101001111011000011001011011101000110111101101111110011110000110010001110001110", 8);
bmatrixtest("1111100000111110010101000000011100101011110011010011011001010111100000001111011100000000011100101000", 10);
bmatrixtest("0001111001001001010000101000011010011111101010000001100011001000100111000110101011111101001010101000", 8);
bmatrixtest("0101101000011100010111011100000101111000011001100101000110011100011110000110010001010110010101111111", 10);
bmatrixtest("1100111011010111001010101000101101110010100011101101000010100000100001010001010100000010011011001011", 10);
bmatrixtest("1111000010110100000011100000011001101000111010001100000101010011100001000010111001010101000010000000", 9);
bmatrixtest("0100101000101011111100000000101011100111111011101011100110010010001010011101010011100101010101111010", 9);
bmatrixtest("1000010001110101011100110101101001100110000110001011001111101000110001100000010011000011101011100000", 9);
bmatrixtest("0111101111101100101111111110110110101111011010111011101101101010010000000101000101111001010100000011", 9);
bmatrixtest("0101000000111001011101100001000001010111010010011110000110111110010110110111011100111010010000011111", 9);
bmatrixtest("1011001110101101111110100110100000001110000110111011101001101010100010010100101000010101110110010001", 10);
bmatrixtest("0100110011010101111111010010010000000010111010110100110100111111001111011010010010000110011001111110", 10);
bmatrixtest("1010010100011110100010011100100000100101011000111110001111111111010101101011100001001100011010101101", 9);
bmatrixtest("0011000110011111110110000110000000100101010000011011100100000101001110101011000001011011101010100010", 9);
bmatrixtest("0111110100110100011010101110101100011010110000011000010001010100110111001000010011111100100010100101", 9);
bmatrixtest("0101000011001001100111111101111100011101110101100000110011010100001011010100110100100011101001001000", 10);
bmatrixtest("1010011000110111101011100010101000010101010000010001001010000001000111011000110111000101001010010010", 9);
bmatrixtest("1011110101100001010100110010001000001100100100011100010110010111000000010001110001111001101111010010", 10);
bmatrixtest("0011011111100010001001111000010010111010100000110000111101010001100111111001100011100111101001100011", 9);
bmatrixtest("0101101011110110011100010011010001011010111110111101110100010011101010000100001110000010011000100001", 10);
bmatrixtest("0110100111010111011100110110010011101111000000100001100110011001110111101101010100111010110011100001", 9);
bmatrixtest("0000000011010000100111100011011010010000100001101100101010110101100011100001000010101101011110000101", 9);
bmatrixtest("0101010101001001011100000001100101000100001000011010110001001111101001000111110000110000000000101001", 8);
bmatrixtest("1110010111011000000001011111110000101110010011100111001101000000111110101011101111101110000110101110", 9);
bmatrixtest("1000111001101101011111111111000011111011011110000111000000001011111110000110101011110101010100011111", 9);
bmatrixtest("1000110110011100110001011111010000001001010001100110000011111110001001101101011011011001101110101011", 9);
bmatrixtest("1110011110000101111001001110010111100110010100110010011111011111111111101000001011110011110010100001", 9);
bmatrixtest("1101010001010101011010110001101110000011110111010101001101110110001101000001100110111000000101010100", 9);
bmatrixtest("0001111111110101111100101000000011101110000111010100110001001111101010111001000101111000001110001111", 9);
bmatrixtest("1100001001110001001001010011011010011111001100111101100111000000100100100101110010000110111000011001", 10);
bmatrixtest("0111111001000011011010100010001100111111011111001101001101000010000101101111110000111110010101111111", 9);
bmatrixtest("0001101101011110101110001101110100001101111010011110110001001010011000010011100000111100010010001110", 9);
bmatrixtest("1100001010010100000101000011001011110101000111001000010111110000000100010111011000011101101010011101", 8);
bmatrixtest("0101110111001011100111010011000101001111000110000010000101101001001110001010111000111111111010010001", 9);
bmatrixtest("0100000111100011100100011101111111101110011100111011000111010100000010111011000000001000001001101010", 10);
bmatrixtest("1101011101001001000110101110111110010001000100110001111111001101100110101011100100001000010110111111", 9);
bmatrixtest("0010001000010110110100001000101110111011110000011000101101000110101000111011100100010101011101110100", 10);
bmatrixtest("1011011011101111111011001010001010011111010110011001101110010011101101000001011111011111101110110011", 8);
bmatrixtest("1101001100001111110110100111101001010000101001111000101011000110101000100010100000011000000111111011", 7);
bmatrixtest("0001010000011100100010011101001100111101111001001000001111010101101010110100100001101110000010010000", 10);
bmatrixtest("1010001111100011000010111000110110011111100110101111001101100010100010110101111010010000110010011000", 10);
bmatrixtest("0010010100010110101110110010100111011000110000010111010000111001100001101111101010100110111010001001", 8);
bmatrixtest("0001111100000011101111101010100111001100100101010001111000100001011001010101110100000101001110100001", 9);
bmatrixtest("0100111000011011101111111000111000000100110100111001101111000001010011101000000110001110110011000000", 9);
bmatrixtest("0000110110100000101100001001110100001100000100111101010101010010101001110000000010000100100110001100", 9);
bmatrixtest("1110111010000001000001100010111001101110101111001011100011111111101101000010111011011010001110011101", 9);
bmatrixtest("0011110100110111111111111111000101011110010001001001111011011011100111110100001011001010011000100101", 9);
bmatrixtest("0111001101001100000100010010100110001111111010111001011100010010101111011100101111111010011011001010", 9);
bmatrixtest("1101000001001010001011110100010101111001100010010001100011000001101110100011010110111001100010100101", 10);
bmatrixtest("1110010111000111100011011000011010000000110001111100101001111100100110000100001110111010101000011001", 9);
bmatrixtest("0101010010111101101110010011001110000010001001110010111100001001001011001100011110111001110010000010", 9);
bmatrixtest("0110011001010101011010000111101100110100101010110101010000010001110100101110100101000111000000011000", 9);
bmatrixtest("1001111101010000100001111001100110001001000100001000111011010111111100011100000101111101001001001111", 10);
bmatrixtest("1001011101001000100011011110101110010011001011100111001111000111000001111000111011110001011001101000", 9);
bmatrixtest("0010001111000100011101101001101100000100011101000011010010111110011000001111001011010111111110100110", 9);
bmatrixtest("0100101101011101011110000011001110100101110000011111110010101110101010001011000010001010010111111110", 8);
bmatrixtest("1001001101111110101010100010000110101000110010001011000111001101110001011110111110111001110001100001", 9);
bmatrixtest("1110001111110100111010010101100011110111011010111101111000100001100100011001111001110010101011000001", 10);
bmatrixtest("1010101101011101001001101101110100111110100001010111111111101001010100010110100100111111100110001010", 9);
bmatrixtest("1001000010000001001000001011111100011000000111011101001011100001000000010011000110001010111011001011", 10);
bmatrixtest("0110011101111111101010011011110100110011110111100100001001000100100100010001100001111110011001101000", 9);
bmatrixtest("1111100100111111010010011000101000111111011000000110100111011011010110101011010101000110111100110111", 9);
bmatrixtest("1101110110001011011000110010010101110110010100111101111011000111111011110100001000010000011110111000", 9);
bmatrixtest("1100110010110000100110000011000110111100101001100010111110110110111100000001000001111001100100101011", 9);
bmatrixtest("0010100111111110010001101110111100010001001011101011010000100110111001100101100110111011010100011111", 9);
bmatrixtest("0100001010001110001100110100011011011011111110011011010111100000100000011111000111111000011000010000", 9);
bmatrixtest("0101100110111000011110110010111101111100000000100011101011000100011001010011101010110100000100000101", 9);
bmatrixtest("1101000110011011111101111100111001110101111110001110010001110011001100010001000000100100010100100010", 8);
bmatrixtest("0110111000010010111010111111110011000110000111110101001010111101000000010000010111000010110000100101", 10);
bmatrixtest("1000001001110110011001000000101001101010001100100000000100000001000001111000110001100011010000101101", 9);
bmatrixtest("1010010001000001000000100111100001010000000111100011000010001110010010000110001101001100110101111010", 10);
bmatrixtest("0110100011110011000110011000001101010111010100011100000111101100100000110010011100110000111100100011", 9);
bmatrixtest("0111110001001110110001000001000001010100000000110111111011100100111110110110001001011000011010101110", 10);
bmatrixtest("1001100111001010100001100101011110010110100100010111010010000100000011001011111110101110011100000010", 9);
bmatrixtest("0110010100100111110000101110111010001110000101111000101000100010011010001110101011000000010101100011", 10);
bmatrixtest("0100101100100001100100110010110101110001111101010000000100000010011001101001010100001111011010001111", 9);
bmatrixtest("0110000110101110000010011101000000101111011100101101110011011010110010110010010110001011111001000111", 10);
bmatrixtest("1110101000100110101010111100110011101010000100111010101110110110000111011111010111001110000110011010", 10);
bmatrixtest("0100010011111011110110010001111010100000101101110101000000001000000011011011011110111100010010011111", 10);
bmatrixtest("0110010011100111010000011010101101101110011001110110111110110101000100110010110100000110101010110100", 10);
bmatrixtest("0011011000001100000100111111001000000001010001111101111000000011100111010010110011000110110010100111", 10);
bmatrixtest("1010010010110100000101001001011101110110011111110100110001001010010101111100010011111011100101011111", 10);
bmatrixtest("0010100010000101001100001110010000100011011011001110101110000001101100010011010011100110010010001100", 9);
bmatrixtest("1110101111001100000111010100010000011100111111010101001100111000111101001101011101000111110001010000", 8);
bmatrixtest("0000010101011101001001000001011011110100000001001111000101111010011111100111110101101000100001000101", 9);
bmatrixtest("1001110011000000001100100100011100011111111001110011101111001110011101100010101100010101110000010000", 9);
bmatrixtest("0010101100101100111100000001010100011111000001011011100001010000110110111000100000000001111110011111", 10);
bmatrixtest("0001010111110010011100111000100100111100000101110101010011010010011001000111110011100111110000101001", 8);
bmatrixtest("1001011100101001000001110010010001101101001011001000011001110000001100100001101011010100011011010011", 10);
bmatrixtest("1000110111010111011011101001011000110110111001110110011110101001110100100110111010101101100001000010", 9);
bmatrixtest("0001001010001101100111100110100011001111000001100111000101011110000011010011101011100011000010111000", 8);
bmatrixtest("1101110111101011100011010000010101001101001111111011001110010110011101000010110111111111001011101001", 9);
bmatrixtest("0111011101110100110011001001000000001010100000011100010010000100001010001011001100011001110111010111", 8);
bmatrixtest("1010111001010101111101010010100011111011100110000011100111010110000101000011111000110010110000011110", 10);
bmatrixtest("1110101000011111011000101010011101100001010100111111001110101110001100100000111111001111001010101011", 10);
bmatrixtest("1111001100111010000100000000011010010000111110001000011110111110000110001000101101011110011111011101", 10);
bmatrixtest("0101011101001110110111011111000001101010100001101010101010000000001001001010010101010111000111110010", 10);
bmatrixtest("0100110011110001100101011011101101001100000001110100111001111110000011010100000000000011000110101010", 10);
bmatrixtest("0111110001110011101000100100111100011011010001010011010101100001111000111101010110011100110010111110", 9);
bmatrixtest("1111011111101010100011100110110111011011010000101111101101110111110000000111101011001100000011011000", 9);
bmatrixtest("1011000011110101111000110010010110100010001010011101111011100100101011110101011001101001110100000011", 10);
bmatrixtest("1011000000010111000010110111011100011010100111101010100111101000111101100001110001000100100010111010", 8);
bmatrixtest("0001100111000100101110110000000100111110111101001000011100110000110011100110101111011001000001010011", 9);
bmatrixtest("1110011000001100111100000101110011010000011110101010001111111101000101110111101011001010011000000011", 10);
bmatrixtest("0100111111110001111111010100100011010011000110110011100001111011011100101001010110110000111000000110", 10);
bmatrixtest("0110001110001100010001100011000001010001011111101100000100001111000011001010011111010100010001111110", 10);
bmatrixtest("1111100001101011100000100100101010011110010010001101110001011001111100111111100101100111011010010101", 9);
bmatrixtest("0111100001111110000101101111111011100011001100101111100100110100011110000101100111000110100101010111", 9);
bmatrixtest("1110001101000100000101110101010110010001110100110101010111111111111100101001010010110110010110110110", 9);
bmatrixtest("0111100111011011010000011011110001011000001001001111111100010011010111010001101011101110011010000011", 9);
bmatrixtest("1000010100110110101010000111101100001000101101101110101000001010001010110111110011111000000010110011", 9);
bmatrixtest("0011011100101100000001110111010010011110111110101101111010010101000110000111110111110100101010111111", 10);
bmatrixtest("1100011011010001110000101010111011011000100000001100100100010000011001111101001101110011110111101000", 9);
bmatrixtest("0010001110111000101011100101010011110111110001100100101100101111001001000110111110110010011110110111", 10);
bmatrixtest("0111111101101000100101100001001010011001110011101100110001010110100001100101000011001101111111001001", 9);
bmatrixtest("0000001111100101010001110111001010101101100111110111110011001011011001010100101011001010011100111001", 10);
bmatrixtest("1111011001111010100001100110010011011011000101111011001111100001110011001001001111111111011010111101", 9);
bmatrixtest("1010101110010110001000101000010101111011100001101111010100110111110101100011011101011110101110101010", 10);
bmatrixtest("1001010010001101101101101011101001011010110001110011101110100011011110011000101111111110011011111100", 8);
bmatrixtest("0011101101000001100100110110110101011111110010101000100110001110011111111110101010111001010101010111", 8);
}

View File

@ -13,7 +13,7 @@
#include "randomness_tests/frequency_block.h"
#include "randomness_tests/runs.h"
#include "randomness_tests/runs_ones.h"
#include "randomness_tests/binary_matrix.h"
#include "generators/generator.h"
@ -49,7 +49,8 @@ namespace splat {
addTest<frequency_block_test>(tests, data);
addTest<runs_test>(tests, data);
addTest<runs_ones_test>(tests, data);
addTest<binary_matrix_test>(tests, data);
return tests;
}

View File

@ -47,7 +47,7 @@ namespace splat {
// if there was no one, we move on
if(firstOnePosition==-1){
top++;
//top++;
continue;
}
@ -81,7 +81,8 @@ namespace splat {
}
template void matrix<10>::debug();
template int getRank<3>(matrix<3>&);
template int getRank<32>(matrix<32>&);
template int getRank<10>(matrix<10>&);
}

View File

@ -15,7 +15,35 @@ namespace splat {
// We will use matrices of size 32x32 as recommended
double binary_matrix_test::runTest(std::vector<std::bitset<32>> &data) {
int num_matrices = data.size() / 32;
double num_matrices = (data.size()*32) / (32*32);
// [0] -> Full Rank
// [1] -> Full rank -1
// [2] -> < full rank -1
double counts[3] = {0,0,0};
for(int matrixIndex = 0; matrixIndex < num_matrices; matrixIndex++){
splat::matrix<32> matrix;
for(int i=0; i<32; i++){
matrix[i] = data[(matrixIndex*32) + i];
}
int rank = splat::getRank(matrix);
if(rank==32){
counts[0]++;
}else if(rank==31){
counts[1]++;
}else{
counts[2]++;
}
}
double x2obs = 0;
std::cout << "debug: "<< counts[0] << ","<<counts[1]<<","<<counts[2]<<"\n";
x2obs += std::pow((counts[0]-(0.2888*num_matrices)),2)/(0.2888*num_matrices);
x2obs += std::pow((counts[1]-(0.5776*num_matrices)),2)/(0.5776*num_matrices);
x2obs += std::pow((counts[2]-(0.1336*num_matrices)),2)/(0.1336*num_matrices);
std::cout << "debug: "<<x2obs << "\n";
return igam(1, x2obs/2);
}
}

View File

@ -1,9 +1,9 @@
#pragma once
#include "../rng.h"
#include "./rngtest.h"
namespace splat {
class runs_ones_test : public RNGTEST {

BIN
splat

Binary file not shown.

Binary file not shown.