예제 #1
0
void display_matrix(uint8_t column, uint8_t data) {
    LATA = 0x00;
    matrix_column(column);
    LATA = data;
}
예제 #2
0
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;
}