Changeset 605


Ignore:
Timestamp:
Nov 21, 2004, 12:28:38 PM (20 years ago)
Author:
ole
Message:

Implemented matrix-matrix mult in c-extension using CSR format - all tests work again.

Location:
inundation/ga/storm_surge/pyvolution
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • inundation/ga/storm_surge/pyvolution/sparse.py

    r594 r605  
    306306
    307307
    308 """
    309 Setup for C extensions
    310 """
    311 
    312 
    313308def csr_mv(self, B):
     309    """Python version of sparse (CSR) matrix multiplication
     310    """
    314311
    315312    from Numeric import zeros, Float
     
    353350
    354351
     352
     353#Setup for C extensions
    355354import compile
    356355if compile.can_use_C_extension('sparse_ext.c'):
    357     #Replace python version with c implementations     
    358     from sparse_ext import csr_mv as csr_mv
    359 
     356    #Replace python version with c implementation
     357    from sparse_ext import csr_mv
    360358
    361359if __name__ == '__main__':
  • inundation/ga/storm_surge/pyvolution/sparse_ext.c

    r599 r605  
    1515#include "stdio.h"
    1616
     17//Matrix-vector routine
    1718int _csr_mv(int M,
    1819            double* data,
     
    2425  long i, j, ckey;
    2526
    26   //printf("test");
    2727  for (i=0; i<M; i++ )
    2828    for (ckey=row_ptr[i]; ckey<row_ptr[i+1]; ckey++) {
     
    3131    }             
    3232 
    33   //printf("end");
    3433  return 0;
    3534}           
    3635
     36//Matrix-matrix routine
     37int _csr_mm(int M,
     38            int columns,
     39            double* data,
     40            long* colind,
     41            long* row_ptr,
     42            double* x,
     43            double* y) {
     44               
     45  long i, j, ckey, c, rowind_i, rowind_j;
     46
     47  for (i=0; i<M; i++ ) {
     48    rowind_i = i*columns;
     49   
     50    for (ckey=row_ptr[i]; ckey<row_ptr[i+1]; ckey++) {
     51      j = colind[ckey];
     52      rowind_j = j*columns;
     53         
     54      for (c=0; c<columns; c++) {
     55        y[rowind_i+c] += data[ckey]*x[rowind_j+c];
     56      }             
     57    }
     58  }
     59 
     60  return 0;
     61}           
    3762
    3863                     
     
    4368 
    4469  PyObject *csr_sparse, // input sparse matrix
    45     *xin, *R;                 // output wrapped vector
     70    *xin, *R;           // output wrapped vector
    4671 
    4772  PyArrayObject
     
    5378
    5479 
    55   int dimensions[1], M, err;
     80  int dimensions[1], M, err, columns, rows;
    5681 
    5782  // Convert Python arguments to C 
     
    7398/*   printf("x.data[5] = %g\n",((double*) x->data)[5]); */
    7499
    75   
     100 
    76101
    77102
     
    80105  if (!data)
    81106    return NULL; 
    82 
    83107
    84108  colind = (PyArrayObject*)
     
    91115 
    92116  M = (row_ptr -> dimensions[0])-1;
     117   
     118  if (x -> nd == 1) {
     119    // Multiplicant is a vector
     120 
     121    //Allocate space for return vectors y (don't DECREF)
     122    dimensions[0] = M;
     123    y = (PyArrayObject *) PyArray_FromDims(1, dimensions, PyArray_DOUBLE);
     124 
     125    err = _csr_mv(M,
     126                  (double*) data -> data,
     127                  (long*)   colind -> data,
     128                  (long*)   row_ptr -> data,
     129                  (double*) x -> data,
     130                  (double*) y -> data);
    93131
     132                           
     133    if (err != 0) {
     134      PyErr_SetString(PyExc_RuntimeError, "matrix vector mult could not be calculated");
     135      return NULL;
     136    }
     137  } else if(x -> nd == 2) {
     138 
    94139
    95   //printf(" x.dim[0] = %i  x.dim[1] = %i \n", x -> dimensions[0], x -> dimensions[1]);
     140    rows = x -> dimensions[0];     //Number of rows in x       
     141    columns = x -> dimensions[1];  //Number of columns in x       
    96142   
    97   //Allocate space for return vectors y (don't DECREF)
    98   dimensions[0] = M;
    99   y = (PyArrayObject *) PyArray_FromDims(1, dimensions, PyArray_DOUBLE);
     143    //Allocate space for return matrix y (don't DECREF)
     144    dimensions[0] = M;                   //Number of rows in sparse matrix 
     145    dimensions[1] = columns;
     146    y = (PyArrayObject *) PyArray_FromDims(2, dimensions, PyArray_DOUBLE);
     147   
     148    err = _csr_mm(M, columns,
     149                  (double*) data -> data,
     150                  (long*)   colind -> data,
     151                  (long*)   row_ptr -> data,
     152                  (double*) x -> data,
     153                  (double*) y -> data);
     154   
     155  } else {
     156    PyErr_SetString(PyExc_RuntimeError,
     157                    "Allowed dimensions in sparse_ext.c restricted to 1 or 2");
     158    return NULL; 
     159  }
    100160 
    101 /*   for (i=0;i<25;i++){ */
    102 /*     printf(" data[%i]=%i\n",i,(data->data)[i]); */
    103 /*   } */
    104 
    105 /*   for (i=0;i<25;i++){ */
    106 /*     printf(" colind[%i]=%i\n",i,(colind->data)[i]); */
    107 /*   } */
    108 
    109   err = _csr_mv(M,
    110                 (double*) data -> data,
    111                 (long*)    colind -> data,
    112                 (long*)    row_ptr -> data,
    113                 (double*) x -> data,
    114                 (double*) y -> data);
    115 
    116 /*   for (i=0;i<25;i++){ */
    117 /*     printf(" data[%i]=%i\n",i,data->data[i]); */
    118 /*   } */
    119                            
    120   if (err != 0) {
    121     PyErr_SetString(PyExc_RuntimeError, "matrix vector mult could not be calculated");
    122     return NULL;
    123   }
    124161                     
    125162  //Release                 
Note: See TracChangeset for help on using the changeset viewer.