void display_matrix(uint8_t column, uint8_t data) { LATA = 0x00; matrix_column(column); LATA = data; }
ok_status regularized_sinkhorn_knopp(void * linalg_handle, ok_float * A_in, matrix * A_out, vector * d, vector * e, enum CBLAS_ORDER ord) { OK_CHECK_PTR(A_in); OK_CHECK_MATRIX(A_out); OK_CHECK_VECTOR(d); OK_CHECK_VECTOR(e); ok_status err = OPTKIT_SUCCESS; const ok_float kSinkhornConst = (ok_float) 1e-4; const ok_float kEps = (ok_float) 1e-2; const size_t kMaxIter = 300; ok_float norm_d, norm_e; size_t i; vector a, d_diff, e_diff; a.data = OK_NULL; d_diff.data = OK_NULL; e_diff.data = OK_NULL; if (A_out->size1 != d->size || A_out->size2 != e->size) return OK_SCAN_ERR( OPTKIT_ERROR_DIMENSION_MISMATCH ); vector_calloc(&d_diff, A_out->size1); vector_calloc(&e_diff, A_out->size2); norm_d = norm_e = 1; OK_CHECK_ERR( err, matrix_memcpy_ma(A_out, A_in, ord) ); OK_CHECK_ERR( err, matrix_abs(A_out) ); OK_CHECK_ERR( err, vector_set_all(d, kOne) ); OK_CHECK_ERR( err, vector_scale(e, kZero) ); /* optional argument ok_float pnorm? */ /* if (pnorm != 1) { matrix_pow(A, pnorm) } */ for (i = 0; i < kMaxIter && !err; ++i){ blas_gemv(linalg_handle, CblasTrans, kOne, A_out, d, kZero, e); vector_add_constant(e, kSinkhornConst / (ok_float) e->size); vector_recip(e); vector_scale(e, (ok_float) d->size); blas_gemv(linalg_handle, CblasNoTrans, kOne, A_out, e, kZero, d); vector_add_constant(d, kSinkhornConst / (ok_float) d->size); vector_recip(d); vector_scale(d, (ok_float) e->size); blas_axpy(linalg_handle, -kOne, d, &d_diff); blas_axpy(linalg_handle, -kOne, e, &e_diff); blas_nrm2(linalg_handle, &d_diff, &norm_d); blas_nrm2(linalg_handle, &e_diff, &norm_e); if ((norm_d < kEps) && (norm_e < kEps)) break; vector_memcpy_vv(&d_diff, d); vector_memcpy_vv(&e_diff, e); } /* optional argument ok_float pnorm? */ /* if (pnorm != 1) { vector_pow(d, kOne / pnorm) vector_pow(e, kOne / pnorm) } */ OK_CHECK_ERR( err, matrix_memcpy_ma(A_out, A_in, ord) ); if (!err) { for (i = 0; i < A_out->size1; ++i) { matrix_row(&a, A_out, i); vector_mul(&a, e); } for (i = 0; i < A_out->size2; ++i) { matrix_column(&a, A_out, i); vector_mul(&a, d); } } vector_free(&d_diff); vector_free(&e_diff); return err; }