[cig-commits] r3984 - in cs/spatialdata-0.1/trunk: . libsrc/spatialdb modulesrc/spatialdb spatialdata spatialdata/spatialdb tests/pytests/spatialdb

baagaard at geodynamics.org baagaard at geodynamics.org
Fri Jul 7 15:53:02 PDT 2006


Author: baagaard
Date: 2006-07-07 15:53:02 -0700 (Fri, 07 Jul 2006)
New Revision: 3984

Modified:
   cs/spatialdata-0.1/trunk/TODO
   cs/spatialdata-0.1/trunk/libsrc/spatialdb/SpatialDB.hh
   cs/spatialdata-0.1/trunk/modulesrc/spatialdb/spatialdb.pyxe
   cs/spatialdata-0.1/trunk/spatialdata/__init__.py
   cs/spatialdata-0.1/trunk/spatialdata/spatialdb/SpatialDB.py
   cs/spatialdata-0.1/trunk/tests/pytests/spatialdb/TestSpatialDB.py
Log:
Made query() method accessible in Python. Added testing of query from Python.

Modified: cs/spatialdata-0.1/trunk/TODO
===================================================================
--- cs/spatialdata-0.1/trunk/TODO	2006-07-07 22:35:14 UTC (rev 3983)
+++ cs/spatialdata-0.1/trunk/TODO	2006-07-07 22:53:02 UTC (rev 3984)
@@ -1,12 +1,17 @@
-CONFIGURE
+GEOCOORDS
 
-  Add version number to libraries
-  Put python stuff in correct dirs (pythia-0.8/common.am)
+  Make it possible to pickle/unpickle to/from file like in C++?
 
-GEOCOORDS
+  Clean up number of coordinates issues. Use numbers instead of is2D flag?
 
 SPATIALDB
 
+  Testing
+    Test C and Fortran wrappers (use in combination with C++ to get
+    around passing array of strings)
+
+    Test generator code.
+
   Get units by parsing header with Python
 
   Cleanup SimpleDB::DataStruct, SimpleDBTypes

Modified: cs/spatialdata-0.1/trunk/libsrc/spatialdb/SpatialDB.hh
===================================================================
--- cs/spatialdata-0.1/trunk/libsrc/spatialdb/SpatialDB.hh	2006-07-07 22:35:14 UTC (rev 3983)
+++ cs/spatialdata-0.1/trunk/libsrc/spatialdb/SpatialDB.hh	2006-07-07 22:53:02 UTC (rev 3984)
@@ -52,6 +52,12 @@
    */
   void label(const char* label);
   
+  /** Get label of spatial database.
+   *
+   * @returns Label for database
+   */
+  const char* label(void) const;
+
   /// Open the database and prepare for querying.
   virtual void open(void) = 0;
 
@@ -70,6 +76,8 @@
 
   /** Query the database.
    *
+   * @note pVals should be preallocated to accommodate numVals values.
+   *
    * @pre Must call open() before query()
    *
    * @param pVals Pointer to computed values (output from query)
@@ -88,15 +96,6 @@
 		    const double z,
 		    const spatialdata::geocoords::CoordSys* pCSQuery) = 0;
 
-protected :
-  // PROTECTED METHODS //////////////////////////////////////////////////
-
-  /** Get label of spatial database.
-   *
-   * @returns Label of spatial database
-   */
-  const char* label(void) const;
-  
  private :
   // PRIVATE METHODS ////////////////////////////////////////////////////
   

Modified: cs/spatialdata-0.1/trunk/modulesrc/spatialdb/spatialdb.pyxe
===================================================================
--- cs/spatialdata-0.1/trunk/modulesrc/spatialdb/spatialdb.pyxe	2006-07-07 22:35:14 UTC (rev 3983)
+++ cs/spatialdata-0.1/trunk/modulesrc/spatialdb/spatialdb.pyxe	2006-07-07 22:53:02 UTC (rev 3984)
@@ -15,6 +15,8 @@
 #include "spatialdata/spatialdb/SimpleDB.hh"
 #include "spatialdata/spatialdb/SimpleIO.hh"
 #include "spatialdata/spatialdb/SimpleIOAscii.hh"
+
+#include "spatialdata/geocoords/CoordSys.hh"
 #}header
 
 # ----------------------------------------------------------------------
@@ -49,17 +51,26 @@
     return
 
 
-  def label(self, name):
-    """Set label of spatial database."""
-    # create shim for method 'label'
-    #embed{ void SpatialDB_label(void* pObj, char* name)
-    ((spatialdata::spatialdb::SpatialDB*) pObj)->label(name);
-    #}embed
+  property label:
+    def __set__(self, name):
+      """Set label of spatial database."""
+      # create shim for method 'label'
+      #embed{ void SpatialDB_label_set(void* pObj, char* name)
+      ((spatialdata::spatialdb::SpatialDB*) pObj)->label(name);
+      #}embed
 
-    SpatialDB_label(self.thisptr, name)
-    return
+      SpatialDB_label_set(self.thisptr, name)
 
+    def __get__(self):
+      """Get label of spatial database."""
+      # create shim for method 'label'
+      #embed{ char* SpatialDB_label_get(void* pObj)
+      return (char*) ((spatialdata::spatialdb::SpatialDB*) pObj)->label();
+      #}embed
 
+      return SpatialDB_label_get(self.thisptr)
+
+      
   def open(self):
     """Open database and prepare for querying."""
     # create shim for method 'open'
@@ -108,6 +119,61 @@
     return
 
 
+  def query(self, locs, cs, nvals):
+    """Query db to get values at locations."""
+    # create shim for method 'query'
+    #embed{ void SpatialDB_query(void* pObj, double** pVals, int nvals, double x, double y, double z, void* csObj)
+    spatialdata::geocoords::CoordSys* pCS =
+      (spatialdata::geocoords::CoordSys*) csObj;
+    ((spatialdata::spatialdb::SpatialDB*) pObj)->query(pVals, nvals, x, y, z,
+                                                       pCS);
+    #}embed
+
+    if not locs.name == "spatialdata_utils_SimpleArray":
+      raise TypeError, \
+            "Argument 'locs' must be of type 'SimpleArray'."
+    if not locs.isCompatible(nd=2,
+                             simpletype="double",
+                             contiguous=True,
+                             notswapped=True):
+      raise TypeError, \
+            "Argument 'locs' must be a contiguous, 2-D array of type double."
+
+    if not cs.name == "spatialdata_geocoords_CoordSys":
+      raise TypeError, \
+            "Argument 'cs' must be extension module type 'CoordSys'."
+    if nvals < 1:
+      raise TypeError, \
+              "Argument 'nvals' must be a positive integer."
+
+    (nlocs, ncoords) = locs.shape
+    if not ncoords == 3:
+      raise ValueError, \
+            "Argument 'locs' must have 3 coordinates per location."
+    
+    cdef double* pLocs
+    pLocs = <double*> PyCObject_AsVoidPtr(locs.data)
+
+    cdef double* pVals
+    pVals = <double*> malloc(nlocs*nvals*sizeof(double))
+
+    cdef double* valbuffer
+    valbuffer = <double*> malloc(nvals*sizeof(double))
+
+    for iloc from 0 <= iloc < nlocs:
+      SpatialDB_query(self.thisptr, &valbuffer, nvals,
+                      pLocs[ncoords*iloc  ],
+                      pLocs[ncoords*iloc+1],
+                      pLocs[ncoords*iloc+2], ptrFromHandle(cs))
+      for ival from 0 <= ival < nvals:
+        pVals[nvals*iloc+ival] = valbuffer[ival]
+    free(<void*> valbuffer)
+
+    dims = [nlocs, nvals]
+    import spatialdata.utils.utils
+    return spatialdata.utils.utils.SimpleCppArray(<object> pVals, dims, "double")
+
+
   def _createHandle(self):
     """Wrap pointer to C++ object in PyCObject."""
     # create shim for destructor

Modified: cs/spatialdata-0.1/trunk/spatialdata/__init__.py
===================================================================
--- cs/spatialdata-0.1/trunk/spatialdata/__init__.py	2006-07-07 22:35:14 UTC (rev 3983)
+++ cs/spatialdata-0.1/trunk/spatialdata/__init__.py	2006-07-07 22:53:02 UTC (rev 3984)
@@ -10,10 +10,9 @@
 # ----------------------------------------------------------------------
 #
 
-## @file pkgs/pyre/__init__.py
+## @file spatialdata/__init__.py
 ## @brief Python top-level SpatialData module initialization
 
-# version
-__id__ = "$Id: __init__.py,v 1.1 2005/05/25 18:40:19 baagaard Exp $"
+__all__ = []
 
 # End of file

Modified: cs/spatialdata-0.1/trunk/spatialdata/spatialdb/SpatialDB.py
===================================================================
--- cs/spatialdata-0.1/trunk/spatialdata/spatialdb/SpatialDB.py	2006-07-07 22:35:14 UTC (rev 3983)
+++ cs/spatialdata-0.1/trunk/spatialdata/spatialdb/SpatialDB.py	2006-07-07 22:53:02 UTC (rev 3984)
@@ -45,7 +45,7 @@
 
   def initialize(self):
     """Initialize database."""
-    self.cppHandle.label(self.label)
+    self.cppHandle.label = self.label
     return
 
 
@@ -67,6 +67,11 @@
     return
 
 
+  def query(self, locs, cs, numvals):
+    """Perform query of db to get values at locations."""
+    return self.cppHandle.query(locs, cs.cppHandle, numvals)
+
+
   def __init__(self, name="spatialdb"):
     """Constructor."""
     Component.__init__(self, name, facility="spatialdb")

Modified: cs/spatialdata-0.1/trunk/tests/pytests/spatialdb/TestSpatialDB.py
===================================================================
--- cs/spatialdata-0.1/trunk/tests/pytests/spatialdb/TestSpatialDB.py	2006-07-07 22:35:14 UTC (rev 3983)
+++ cs/spatialdata-0.1/trunk/tests/pytests/spatialdb/TestSpatialDB.py	2006-07-07 22:53:02 UTC (rev 3984)
@@ -12,6 +12,10 @@
 
 import unittest
 
+import numpy as numeric
+import spatialdata.utils.utils as simplearray
+from spatialdata.geocoords.CSCart import CSCart
+
 class TestSpatialDB(unittest.TestCase):
 
   def setUp(self):
@@ -31,10 +35,23 @@
   def test_database(self):
     self._db.open()
     self._db.queryVals(["two", "one"])
+
+    locs = numeric.array( [[1.0, 2.0, 3.0],
+                           [5.6, 4.2, 8.6]], numeric.Float64)
+    cs = CSCart()
+    cs.toMeters = 1.0
+    
+    valsE = numeric.array( [[4.7, 6.3]]*2, numeric.Float64)
+    vals = numeric.array(self._db.query(simplearray.SimplePyArray(locs),
+                                        cs, 2))
+    self.assertEqual(2, len(vals.shape))
+    for dE, d in zip(valsE.shape, vals.shape):
+      self.assertEqual(dE, d)
+    for vE, v in zip(numeric.reshape(valsE, -1), numeric.reshape(vals, -1)):
+      self.assertAlmostEqual(vE, v, 6)
+
     self._db.close()    
     return
 
-# version
-__id__ = "$Id: TestSpatialDB.py,v 1.1 2005/05/25 18:43:08 baagaard Exp $"
 
 # End of file 



More information about the cig-commits mailing list