| 1 | #ifndef _GNU_SOURCE
|
|---|
| 2 | #define _GNU_SOURCE
|
|---|
| 3 | #endif
|
|---|
| 4 | #include <m4ri/config.h>
|
|---|
| 5 | #include <stdlib.h>
|
|---|
| 6 | #include <m4ri/m4ri.h>
|
|---|
| 7 |
|
|---|
| 8 | int test_pluq_solve_left(rci_t m, rci_t n, int offsetA, int offsetB){
|
|---|
| 9 | mzd_t* Abase = mzd_init(2048, 2048);
|
|---|
| 10 | mzd_t* Bbase = mzd_init(2048, 2048);
|
|---|
| 11 | mzd_randomize(Abase);
|
|---|
| 12 | mzd_randomize(Bbase);
|
|---|
| 13 |
|
|---|
| 14 | mzd_t* A = mzd_init_window(Abase, 0, offsetA, m, m + offsetA);
|
|---|
| 15 | mzd_t* B = mzd_init_window(Bbase, 0, offsetB, m, n + offsetB);
|
|---|
| 16 |
|
|---|
| 17 | // copy B
|
|---|
| 18 | mzd_t* Bcopy = mzd_init(B->nrows, B->ncols);
|
|---|
| 19 | for (rci_t i = 0; i < B->nrows; ++i)
|
|---|
| 20 | for (rci_t j = 0; j < B->ncols; ++j)
|
|---|
| 21 | mzd_write_bit(Bcopy,i,j, mzd_read_bit (B,i,j));
|
|---|
| 22 |
|
|---|
| 23 | for (rci_t i = 0; i < m; ++i) {
|
|---|
| 24 | mzd_write_bit(A,i,i, 1);
|
|---|
| 25 | }
|
|---|
| 26 |
|
|---|
| 27 | mzd_t *Acopy = mzd_copy(NULL, A);
|
|---|
| 28 | rci_t r = mzd_echelonize(Acopy,1);
|
|---|
| 29 | printf("solve_left m: %4d, n: %4d, r: %4d da: %4d db: %4d ", m, n, r, offsetA, offsetB);
|
|---|
| 30 | mzd_free(Acopy);
|
|---|
| 31 | Acopy = mzd_copy(NULL, A);
|
|---|
| 32 |
|
|---|
| 33 | int consistency = mzd_solve_left(A, B, 0, 1);
|
|---|
| 34 |
|
|---|
| 35 | //copy B
|
|---|
| 36 | mzd_t *X = mzd_init(B->nrows,B->ncols);
|
|---|
| 37 | for (rci_t i = 0; i < B->nrows; ++i)
|
|---|
| 38 | for (rci_t j = 0; j < B->ncols; ++j)
|
|---|
| 39 | mzd_write_bit(X,i,j, mzd_read_bit (B,i,j));
|
|---|
| 40 |
|
|---|
| 41 | mzd_t *B1 = mzd_mul(NULL, Acopy, X, 0);
|
|---|
| 42 | mzd_t *Z = mzd_add(NULL, Bcopy, B1);
|
|---|
| 43 |
|
|---|
| 44 | int status = 0;
|
|---|
| 45 |
|
|---|
| 46 | if(consistency == 0) {
|
|---|
| 47 | status = 1 - mzd_is_zero(Z);
|
|---|
| 48 | if (status == 0) {
|
|---|
| 49 | printf("passed\n");
|
|---|
| 50 | } else {
|
|---|
| 51 | printf("FAILED\n");
|
|---|
| 52 | }
|
|---|
| 53 | } else {
|
|---|
| 54 | printf("skipped (no solution)\n");
|
|---|
| 55 | }
|
|---|
| 56 | mzd_free(Bcopy);
|
|---|
| 57 | mzd_free(B1);
|
|---|
| 58 | mzd_free(Z);
|
|---|
| 59 |
|
|---|
| 60 | mzd_free_window(A);
|
|---|
| 61 | mzd_free_window(B);
|
|---|
| 62 | mzd_free(Acopy);
|
|---|
| 63 | mzd_free(Abase);
|
|---|
| 64 | mzd_free(Bbase);
|
|---|
| 65 | mzd_free(X);
|
|---|
| 66 | return status;
|
|---|
| 67 | }
|
|---|
| 68 |
|
|---|
| 69 | int main() {
|
|---|
| 70 | int status = 0;
|
|---|
| 71 |
|
|---|
| 72 | srandom(17);
|
|---|
| 73 |
|
|---|
| 74 | for(size_t i=0; i<100; i++) {
|
|---|
| 75 | size_t m = random() & 511;
|
|---|
| 76 | size_t n = random() & 1023;
|
|---|
| 77 | m = m ? (m) : 1;
|
|---|
| 78 | n = n ? (n) : 1;
|
|---|
| 79 |
|
|---|
| 80 | status += test_pluq_solve_left( m, n, 0, 0);
|
|---|
| 81 | }
|
|---|
| 82 |
|
|---|
| 83 | if (!status) {
|
|---|
| 84 | printf("All tests passed.\n");
|
|---|
| 85 | } else {
|
|---|
| 86 | return 1;
|
|---|
| 87 | }
|
|---|
| 88 |
|
|---|
| 89 | return 0;
|
|---|
| 90 | }
|
|---|