int test_pluq_solve_left(rci_t m, rci_t n, int offsetA, int offsetB) { mzd_t* Abase = mzd_init(2048, 2048); mzd_t* Bbase = mzd_init(2048, 2048); mzd_randomize(Abase); mzd_randomize(Bbase); mzd_t* A = mzd_init_window(Abase, 0, offsetA, m, m + offsetA); mzd_t* B = mzd_init_window(Bbase, 0, offsetB, m, n + offsetB); // copy B mzd_t* Bcopy = mzd_init(B->nrows, B->ncols); for (rci_t i = 0; i < B->nrows; ++i) for (rci_t j = 0; j < B->ncols; ++j) mzd_write_bit(Bcopy,i,j, mzd_read_bit (B,i,j)); for (rci_t i = 0; i < m; ++i) { mzd_write_bit(A,i,i, 1); } mzd_t *Acopy = mzd_copy(NULL, A); rci_t r = mzd_echelonize(Acopy,1); printf("solve_left m: %4d, n: %4d, r: %4d da: %4d db: %4d ", m, n, r, offsetA, offsetB); mzd_free(Acopy); Acopy = mzd_copy(NULL, A); int consistency = mzd_solve_left(A, B, 0, 1); //copy B mzd_t *X = mzd_init(B->nrows,B->ncols); for (rci_t i = 0; i < B->nrows; ++i) for (rci_t j = 0; j < B->ncols; ++j) mzd_write_bit(X,i,j, mzd_read_bit (B,i,j)); mzd_t *B1 = mzd_mul(NULL, Acopy, X, 0); mzd_t *Z = mzd_add(NULL, Bcopy, B1); int status = 0; if(consistency == 0) { status = 1 - mzd_is_zero(Z); if (status == 0) { printf("passed\n"); } else { printf("FAILED\n"); } } else { printf("skipped (no solution)\n"); } mzd_free(Bcopy); mzd_free(B1); mzd_free(Z); mzd_free_window(A); mzd_free_window(B); mzd_free(Acopy); mzd_free(Abase); mzd_free(Bbase); mzd_free(X); return status; }
int test_kernel_left_pluq(size_t m, size_t n) { mzd_t* A = mzd_init(m, n); mzd_randomize(A); mzd_t *Acopy = mzd_copy(NULL, A); size_t r = mzd_echelonize_m4ri(A, 0, 0); printf("kernel_left m: %4zu, n: %4zu, r: %4zu ",m, n, r); mzd_free(Acopy); Acopy = mzd_copy(NULL, A); mzd_t *X = mzd_kernel_left_pluq(A, 0); if (X == NULL) { printf("passed\n"); mzd_free(A); mzd_free(Acopy); return 0; } mzd_t *Z = mzd_mul(NULL, Acopy, X, 0); int status = 1 - mzd_is_zero(Z); if (!status) printf("passed\n"); else printf("FAILED\n"); mzd_free(A); mzd_free(Acopy); mzd_free(X); mzd_free(Z); return status; }
int _mzd_pluq_solve_left(mzd_t const *A, rci_t rank, mzp_t const *P, mzp_t const *Q, mzd_t *B, int const cutoff, int const inconsistency_check) { /** A is supposed to store L lower triangular and U upper triangular * B is modified in place * (Bi's in the comments are just modified versions of B) * PLUQ = A * 1) P B2 = B1 * 2) L B3 = B2 * 3) U B4 = B3 * 4) Q B5 = B4 */ int retval = 0; /* P B2 = B1 or B2 = P^T B1 */ mzd_apply_p_left(B, P); /* L B3 = B2 */ /* view on the upper part of L */ mzd_t const *LU = mzd_init_window_const(A, 0, 0, rank, rank); mzd_t *Y1 = mzd_init_window(B, 0, 0, rank, B->ncols); mzd_trsm_lower_left(LU, Y1, cutoff); if (inconsistency_check) { /* Check for inconsistency */ /** FASTER without this check; update with the lower part of L */ mzd_t const *H = mzd_init_window_const(A, rank, 0, A->nrows, rank); mzd_t *Y2 = mzd_init_window(B, rank, 0, A->nrows, B->ncols); if(A->nrows < B->nrows) { mzd_t *Y3 = mzd_init_window(B, A->nrows, 0, B->nrows, B->ncols); mzd_set_ui(Y3, 0); mzd_free_window(Y3); } mzd_addmul(Y2, H, Y1, cutoff); /* * test whether Y2 is the zero matrix */ if(!mzd_is_zero(Y2)) { retval = -1; } mzd_free_window((mzd_t*)H); mzd_free_window(Y2); } /* U B4 = B3 */ mzd_trsm_upper_left(LU, Y1, cutoff); mzd_free_window((mzd_t*)LU); mzd_free_window(Y1); if (!inconsistency_check) { /** Default is to set the undefined bits to zero if inconsistency * has been checked then Y2 bits are already all zeroes thus this * clearing is not needed */ for(rci_t i = rank; i < B->nrows; ++i) { for(rci_t j = 0; j < B->ncols; j += m4ri_radix) { mzd_clear_bits(B, i, j, MIN(m4ri_radix, B->ncols - j)); } } } /* Q B5 = B4 or B5 = Q^T B4 */ mzd_apply_p_left_trans(B, Q); /* P L U Q B5 = B1 */ __M4RI_DD_MZD(B); __M4RI_DD_INT(retval); return retval; }
/* * Class: m4rjni_Mzd * Method: mzd_is_zero * Signature: (J)I */ JNIEXPORT jint JNICALL Java_m4rjni_Mzd_mzd_1is_1zero(JNIEnv *env, jobject obj, jlong ptr) { mzd_t *M = (mzd_t*)ptr; if (M==NULL) return -1; return mzd_is_zero(M); }
int smallops_test_add(rci_t M, rci_t N, rci_t m, rci_t n, rci_t offset, word pattern) { int ret = 0; printf(" mzd_add: M: %4d, N: %4d, m: %4d, n: %4d, offset: %4d, pattern: 0x%" PRIx64 " ", M, N, m, n, offset, pattern); mzd_t *AA; mzd_t *A = mzd_init_test_matrix_random(M, N, m, n, offset, pattern, &AA); mzd_t *BB; mzd_t *B = mzd_init_test_matrix_random(M, N, m, n, offset, pattern, &BB); mzd_t *CC; mzd_t *C = mzd_init_test_matrix_random(M, N, m, n, offset, pattern, &CC); mzd_t *DD; mzd_t *D = mzd_init_test_matrix_random(M, N, m, n, offset, pattern, &DD); /* Creation went okay? */ ret += mzd_check_pattern(AA, m, n, offset, pattern); ret += mzd_check_pattern(BB, m, n, offset, pattern); ret += mzd_check_pattern(CC, m, n, offset, pattern); ret += mzd_check_pattern(DD, m, n, offset, pattern); /* Testing equality A+A == 0 */ mzd_add(C, A, A); if(!mzd_is_zero(C)) { ret +=1; } ret += mzd_check_pattern(AA, m, n, offset, pattern); ret += mzd_check_pattern(BB, m, n, offset, pattern); ret += mzd_check_pattern(CC, m, n, offset, pattern); /* Testing equality A+A == 0 but this time C is already zero */ mzd_add(C, B, B); if(!mzd_is_zero(C)) { ret +=1; } ret += mzd_check_pattern(AA, m, n, offset, pattern); ret += mzd_check_pattern(BB, m, n, offset, pattern); ret += mzd_check_pattern(CC, m, n, offset, pattern); /* Testing in place add. C is zero, so afterwards C == A */ mzd_add(C, C, A); if(!mzd_equal(C,A)) { ret +=1; } ret += mzd_check_pattern(AA, m, n, offset, pattern); ret += mzd_check_pattern(BB, m, n, offset, pattern); ret += mzd_check_pattern(CC, m, n, offset, pattern); /* Testing equality C (== A) + A == 0 */ mzd_add(B, C, A); if(!mzd_is_zero(B)) { ret +=1; } if(m == n) { /* Testing equality (A + B)^2 == A^2 + BA + AB + B^2 */ mzd_randomize(A); mzd_randomize(B); mzd_add(C,A,B); mzd_mul(D,C,C, 0); // (A+B)^2 mzd_mul(C,A,A, 0); mzd_addmul(C, B, A, 0); mzd_addmul(C, A, B, 0); mzd_addmul(C, B, B, 0); if(!mzd_equal(C,D)) { ret += 1; } ret += mzd_check_pattern(AA, m, n, offset, pattern); ret += mzd_check_pattern(BB, m, n, offset, pattern); ret += mzd_check_pattern(CC, m, n, offset, pattern); ret += mzd_check_pattern(DD, m, n, offset, pattern); } mzd_free_test_matrix_random(AA, A); mzd_free_test_matrix_random(BB, B); mzd_free_test_matrix_random(CC, C); mzd_free_test_matrix_random(DD, D); if(ret == 0) { printf(" ... passed\n"); } else { printf(" ... FAILED\n"); } #ifdef ABORT_ON_FAIL if (ret) abort(); #endif return ret; }