[pure-lang-svn] SF.net SVN: pure-lang:[845] pure/trunk
Status: Beta
Brought to you by:
agraef
|
From: <ag...@us...> - 2008-09-23 23:57:04
|
Revision: 845
http://pure-lang.svn.sourceforge.net/pure-lang/?rev=845&view=rev
Author: agraef
Date: 2008-09-23 23:56:53 +0000 (Tue, 23 Sep 2008)
Log Message:
-----------
Add some more matrix-pointer operations for alternative base types.
Modified Paths:
--------------
pure/trunk/lib/matrices.pure
pure/trunk/runtime.cc
pure/trunk/runtime.h
Modified: pure/trunk/lib/matrices.pure
===================================================================
--- pure/trunk/lib/matrices.pure 2008-09-23 23:25:21 UTC (rev 844)
+++ pure/trunk/lib/matrices.pure 2008-09-23 23:56:53 UTC (rev 845)
@@ -421,3 +421,34 @@
= cmatrix_from_array_dup p (1,n);
imatrix_from_array_dup p::pointer n::int
= imatrix_from_array_dup p (1,n);
+
+/* Some helper routines for dealing with alternate base types. These work like
+ the routines above, but initialize the data from float, complex float,
+ short and byte arrays, respectively. */
+
+private matrix_from_float_array_dup;
+private matrix_from_complex_float_array_dup;
+private matrix_from_short_array_dup;
+private matrix_from_byte_array_dup;
+extern expr* matrix_from_float_array_dup(void* p, int n, int m);
+extern expr* matrix_from_complex_float_array_dup(void* p, int n, int m);
+extern expr* matrix_from_short_array_dup(void* p, int n, int m);
+extern expr* matrix_from_byte_array_dup(void* p, int n, int m);
+
+fmatrix_from_array_dup p::pointer (n::int,m::int)
+ = matrix_from_float_array_dup p n m;
+cfmatrix_from_array_dup p::pointer (n::int,m::int)
+ = matrix_from_complex_float_array_dup p n m;
+smatrix_from_array_dup p::pointer (n::int,m::int)
+ = matrix_from_short_array_dup p n m;
+bmatrix_from_array_dup p::pointer (n::int,m::int)
+ = matrix_from_byte_array_dup p n m;
+
+fmatrix_from_array_dup p::pointer n::int
+ = fmatrix_from_array_dup p (1,n);
+cfmatrix_from_array_dup p::pointer n::int
+ = cfmatrix_from_array_dup p (1,n);
+smatrix_from_array_dup p::pointer n::int
+ = smatrix_from_array_dup p (1,n);
+bmatrix_from_array_dup p::pointer n::int
+ = bmatrix_from_array_dup p (1,n);
Modified: pure/trunk/runtime.cc
===================================================================
--- pure/trunk/runtime.cc 2008-09-23 23:25:21 UTC (rev 844)
+++ pure/trunk/runtime.cc 2008-09-23 23:56:53 UTC (rev 845)
@@ -5191,6 +5191,152 @@
#endif
}
+extern "C"
+pure_expr *matrix_from_float_array_dup(void *p, uint32_t n1, uint32_t n2)
+{
+#ifdef HAVE_GSL
+ if (n1 == 0 || n2 == 0) // empty matrix
+ return pure_double_matrix(create_double_matrix(n1, n2));
+ if (!p)
+ p = calloc(n1*n2, sizeof(double));
+ else {
+ void *q = malloc(n1*n2*sizeof(double));
+ float *p1 = (float*)p; double *q1 = (double*)q;
+ for (size_t i = 0; i < n1*n2; i++) q1[i] = (double)p1[i];
+ p = q;
+ }
+ if (!p) return 0;
+ gsl_matrix_view v = gsl_matrix_view_array((double*)p, n1, n2);
+ // take a copy of the view matrix
+ gsl_matrix *m = (gsl_matrix*)malloc(sizeof(gsl_matrix));
+ gsl_block *b = (gsl_block*)malloc(sizeof(gsl_block));
+ assert(m && b && v.matrix.data);
+ *m = v.matrix;
+ b->size = n1*n2;
+ b->data = m->data;
+ m->block = b;
+ pure_expr *x = new_expr();
+ x->tag = EXPR::DMATRIX;
+ x->data.mat.p = m;
+ x->data.mat.refc = new uint32_t;
+ *x->data.mat.refc = 1;
+ MEMDEBUG_NEW(x)
+ return x;
+#else
+ return 0;
+#endif
+}
+
+extern "C"
+pure_expr *matrix_from_complex_float_array_dup(void *p, uint32_t n1, uint32_t n2)
+{
+#ifdef HAVE_GSL
+ if (n1 == 0 || n2 == 0) // empty matrix
+ return pure_complex_matrix(create_complex_matrix(n1, n2));
+ if (!p)
+ p = calloc(2*n1*n2, sizeof(double));
+ else {
+ void *q = malloc(2*n1*n2*sizeof(double));
+ float *p1 = (float*)p; double *q1 = (double*)q;
+ for (size_t i = 0; i < 2*n1*n2; i++) q1[i] = (double)p1[i];
+ p = q;
+ }
+ if (!p) return 0;
+ gsl_matrix_complex_view v =
+ gsl_matrix_complex_view_array((double*)p, n1, n2);
+ // take a copy of the view matrix
+ gsl_matrix_complex *m =
+ (gsl_matrix_complex*)malloc(sizeof(gsl_matrix_complex));
+ gsl_block_complex *b = (gsl_block_complex*)malloc(sizeof(gsl_block_complex));
+ assert(m && b && v.matrix.data);
+ *m = v.matrix;
+ b->size = n1*n2;
+ b->data = m->data;
+ m->block = b;
+ pure_expr *x = new_expr();
+ x->tag = EXPR::CMATRIX;
+ x->data.mat.p = m;
+ x->data.mat.refc = new uint32_t;
+ *x->data.mat.refc = 1;
+ MEMDEBUG_NEW(x)
+ return x;
+#else
+ return 0;
+#endif
+}
+
+extern "C"
+pure_expr *matrix_from_short_array_dup(void *p, uint32_t n1, uint32_t n2)
+{
+#ifdef HAVE_GSL
+ if (n1 == 0 || n2 == 0) // empty matrix
+ return pure_int_matrix(create_int_matrix(n1, n2));
+ if (!p)
+ p = calloc(n1*n2, sizeof(int));
+ else {
+ void *q = malloc(n1*n2*sizeof(int));
+ short *p1 = (short*)p; int *q1 = (int*)q;
+ for (size_t i = 0; i < n1*n2; i++) q1[i] = (int)p1[i];
+ p = q;
+ }
+ if (!p) return 0;
+ gsl_matrix_int_view v = gsl_matrix_int_view_array((int*)p, n1, n2);
+ // take a copy of the view matrix
+ gsl_matrix_int *m = (gsl_matrix_int*)malloc(sizeof(gsl_matrix_int));
+ gsl_block_int *b = (gsl_block_int*)malloc(sizeof(gsl_block_int));
+ assert(m && b && v.matrix.data);
+ *m = v.matrix;
+ b->size = n1*n2;
+ b->data = m->data;
+ m->block = b;
+ pure_expr *x = new_expr();
+ x->tag = EXPR::IMATRIX;
+ x->data.mat.p = m;
+ x->data.mat.refc = new uint32_t;
+ *x->data.mat.refc = 1;
+ MEMDEBUG_NEW(x)
+ return x;
+#else
+ return 0;
+#endif
+}
+
+extern "C"
+pure_expr *matrix_from_byte_array_dup(void *p, uint32_t n1, uint32_t n2)
+{
+#ifdef HAVE_GSL
+ if (n1 == 0 || n2 == 0) // empty matrix
+ return pure_int_matrix(create_int_matrix(n1, n2));
+ if (!p)
+ p = calloc(n1*n2, sizeof(int));
+ else {
+ void *q = malloc(n1*n2*sizeof(int));
+ int8_t *p1 = (int8_t*)p; int *q1 = (int*)q;
+ for (size_t i = 0; i < n1*n2; i++) q1[i] = (int)p1[i];
+ p = q;
+ }
+ if (!p) return 0;
+ gsl_matrix_int_view v = gsl_matrix_int_view_array((int*)p, n1, n2);
+ // take a copy of the view matrix
+ gsl_matrix_int *m = (gsl_matrix_int*)malloc(sizeof(gsl_matrix_int));
+ gsl_block_int *b = (gsl_block_int*)malloc(sizeof(gsl_block_int));
+ assert(m && b && v.matrix.data);
+ *m = v.matrix;
+ b->size = n1*n2;
+ b->data = m->data;
+ m->block = b;
+ pure_expr *x = new_expr();
+ x->tag = EXPR::IMATRIX;
+ x->data.mat.p = m;
+ x->data.mat.refc = new uint32_t;
+ *x->data.mat.refc = 1;
+ MEMDEBUG_NEW(x)
+ return x;
+#else
+ return 0;
+#endif
+}
+
static uint32_t mpz_hash(const mpz_t z)
{
uint32_t h = 0;
Modified: pure/trunk/runtime.h
===================================================================
--- pure/trunk/runtime.h 2008-09-23 23:25:21 UTC (rev 844)
+++ pure/trunk/runtime.h 2008-09-23 23:56:53 UTC (rev 845)
@@ -746,6 +746,7 @@
/* The following routines work like the above, but copy the data to newly
allocated memory, so the original data can be freed after the call.
+ Additional routines are provided for various alternate data sizes.
Moreover, the source pointer p may also be NULL in which case the new
matrix is filled with zeros instead. */
@@ -753,6 +754,11 @@
pure_expr *matrix_from_complex_array_dup(void *p, uint32_t n, uint32_t m);
pure_expr *matrix_from_int_array_dup(void *p, uint32_t n, uint32_t m);
+pure_expr *matrix_from_float_array_dup(void *p, uint32_t n, uint32_t m);
+pure_expr *matrix_from_complex_float_array_dup(void *p, uint32_t n, uint32_t m);
+pure_expr *matrix_from_short_array_dup(void *p, uint32_t n, uint32_t m);
+pure_expr *matrix_from_byte_array_dup(void *p, uint32_t n, uint32_t m);
+
/* Compute a 32 bit hash code of a Pure expression. This makes it possible to
use arbitary Pure values as keys in a hash table. */
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|