From b3cb7b1071decc43577fd529f1f47d27078a7b71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADtor=20Santos=20de=20Costa?= Date: Wed, 22 Oct 2008 00:40:15 +0100 Subject: [PATCH] add log/2 and exp/2 --- library/matrix.yap | 2 ++ library/matrix/matrix.c | 76 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+) diff --git a/library/matrix.yap b/library/matrix.yap index fc666ffbb..51b3b0cb5 100644 --- a/library/matrix.yap +++ b/library/matrix.yap @@ -71,6 +71,8 @@ typedef enum { matrix_agg_cols/3, matrix_to_logs/1, matrix_to_exps/1, + matrix_to_logs/2, + matrix_to_exps/2, matrix_op/4, matrix_op_to_all/4, matrix_op_to_lines/4, diff --git a/library/matrix/matrix.c b/library/matrix/matrix.c index e5942a4ed..8d5cbd207 100644 --- a/library/matrix/matrix.c +++ b/library/matrix/matrix.c @@ -1035,6 +1035,43 @@ matrix_log_all(void) return TRUE; } +static int +matrix_log_all2(void) +{ + int *mat; + + mat = (int *)YAP_BlobOfTerm(YAP_ARG1); + if (!mat) { + /* Error */ + return FALSE; + } + if (mat[MAT_TYPE] == INT_MATRIX) { + return FALSE; + } else { + YAP_Term out; + double *data = matrix_double_data(mat, mat[MAT_NDIMS]), *ndata; + int i; + int *nmat; + + if (!YAP_IsVarTerm(YAP_ARG2)) { + out = YAP_ARG2; + } else { + out = new_float_matrix(mat[MAT_NDIMS], mat+MAT_DIMS, NULL); + if (out == YAP_TermNil()) + return FALSE; + } + nmat = (int *)YAP_BlobOfTerm(out); + ndata = matrix_double_data(nmat, mat[MAT_NDIMS]); + for (i=0; i< mat[MAT_SIZE]; i++) { + ndata[i] = log(data[i]); + } + if (YAP_IsVarTerm(YAP_ARG2)) { + return YAP_Unify(YAP_ARG2, out); + } + } + return TRUE; +} + static int matrix_exp_all(void) { @@ -1058,6 +1095,43 @@ matrix_exp_all(void) return TRUE; } +static int +matrix_exp_all2(void) +{ + int *mat; + + mat = (int *)YAP_BlobOfTerm(YAP_ARG1); + if (!mat) { + /* Error */ + return FALSE; + } + if (mat[MAT_TYPE] == INT_MATRIX) { + return FALSE; + } else { + YAP_Term out; + double *data = matrix_double_data(mat, mat[MAT_NDIMS]), *ndata; + int i; + int *nmat; + + if (!YAP_IsVarTerm(YAP_ARG2)) { + out = YAP_ARG2; + } else { + out = new_float_matrix(mat[MAT_NDIMS], mat+MAT_DIMS, NULL); + if (out == YAP_TermNil()) + return FALSE; + } + nmat = (int *)YAP_BlobOfTerm(out); + ndata = matrix_double_data(nmat, mat[MAT_NDIMS]); + for (i=0; i< mat[MAT_SIZE]; i++) { + ndata[i] = exp(data[i]); + } + if (YAP_IsVarTerm(YAP_ARG2)) { + return YAP_Unify(YAP_ARG2, out); + } + } + return TRUE; +} + static int matrix_minarg(void) { @@ -2810,6 +2884,8 @@ init_matrix(void) YAP_UserCPredicate("matrix_select", matrix_select, 4); YAP_UserCPredicate("matrix_to_logs", matrix_log_all,1); YAP_UserCPredicate("matrix_to_exps", matrix_exp_all, 1); + YAP_UserCPredicate("matrix_to_logs", matrix_log_all2,2); + YAP_UserCPredicate("matrix_to_exps", matrix_exp_all2, 2); YAP_UserCPredicate("matrix_sum_out", matrix_sum_out, 3); YAP_UserCPredicate("matrix_sum_out_several", matrix_sum_out_several, 3); YAP_UserCPredicate("matrix_sum_logs_out", matrix_sum_out_logs, 3);