/[escript]/trunk/escript/src/Data/DataArrayView.h
ViewVC logotype

Diff of /trunk/escript/src/Data/DataArrayView.h

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 108 by jgs, Thu Jan 27 06:21:59 2005 UTC revision 126 by jgs, Fri Jul 22 03:53:08 2005 UTC
# Line 24  Line 24 
24  #include <boost/shared_ptr.hpp>  #include <boost/shared_ptr.hpp>
25    
26  #include <iostream>  #include <iostream>
27    
28  #include <vector>  #include <vector>
29    #include "escript/Data/DataVector.h"
30    
31  namespace escript {  namespace escript {
32    
# Line 42  namespace escript { Line 44  namespace escript {
44     The view provided represents a single n-dimensional data-point     The view provided represents a single n-dimensional data-point
45     comprised of values taken from the given data array, starting at the     comprised of values taken from the given data array, starting at the
46     specified offset and extending for as many values as are necessary to     specified offset and extending for as many values as are necessary to
47     satisfy the given shape.     satisfy the given shape. The default offset can be changed, or different
48       offsets specified, in order to provide views of other data-points in
49       the underlying data array.
50  */  */
51    
52  class DataArrayView {  class DataArrayView {
# Line 52  class DataArrayView { Line 56  class DataArrayView {
56    
57   public:   public:
58    
59    /**    //
60        Some basic types which define the data values and view shapes.    // Some basic types which define the data values and view shapes.
61    */    typedef DataVector                        ValueType;
62    typedef std::vector<double>               ValueType;    //typedef std::vector<double>               ValueType;
63    typedef std::vector<int>                  ShapeType;    typedef std::vector<int>                  ShapeType;
64    typedef std::vector<std::pair<int, int> > RegionType;    typedef std::vector<std::pair<int, int> > RegionType;
65    typedef std::vector<std::pair<int, int> > RegionLoopRangeType;    typedef std::vector<std::pair<int, int> > RegionLoopRangeType;
# Line 208  class DataArrayView { Line 212  class DataArrayView {
212    */    */
213    bool    bool
214    checkOffset() const;    checkOffset() const;
215    
216    bool    bool
217    checkOffset(ValueType::size_type offset) const;    checkOffset(ValueType::size_type offset) const;
218    
# Line 230  class DataArrayView { Line 235  class DataArrayView {
235       Calculate the number of values for the given shape or region.       Calculate the number of values for the given shape or region.
236       This is purely a utility method and has no bearing on this view.       This is purely a utility method and has no bearing on this view.
237    */    */
238    static int    static
239      int
240    noValues(const ShapeType& shape);    noValues(const ShapeType& shape);
241    static int  
242      static
243      int
244    noValues(const RegionLoopRangeType& region);    noValues(const RegionLoopRangeType& region);
245    
246    /**    /**
# Line 254  class DataArrayView { Line 262  class DataArrayView {
262       \brief       \brief
263       Return the shape of this view.       Return the shape of this view.
264    */    */
265    const ShapeType&    const
266      ShapeType&
267    getShape() const;    getShape() const;
268    
269    /**    /**
270       \brief       \brief
271       Return true if the given shape is the same as this view's shape.       Return true if the given shape is the same as this view's shape.
      This is purely a utility method and has no bearing on this view.  
272    */    */
273    bool    bool
274    checkShape(const DataArrayView::ShapeType& other) const;    checkShape(const ShapeType& other) const;
275    
276    /**    /**
277       \brief       \brief
278       Create a shape error message. Normally used when there is a shape       Create a shape error message. Normally used when there is a shape
279       mismatch.       mismatch between this shape and the other shape.
      This is purely a utility method and has no bearing on this view.  
280    
281       \param messagePrefix - Input -       \param messagePrefix - Input -
282                         First part of the error message.                         First part of the error message.
# Line 278  class DataArrayView { Line 285  class DataArrayView {
285    */    */
286    std::string    std::string
287    createShapeErrorMessage(const std::string& messagePrefix,    createShapeErrorMessage(const std::string& messagePrefix,
288                            const DataArrayView::ShapeType& other) const;                            const ShapeType& other) const;
289    
290    /**    /**
291       \brief       \brief
# Line 298  class DataArrayView { Line 305  class DataArrayView {
305    
306       \param shape - Input.       \param shape - Input.
307    */    */
308    static std::string    static
309    shapeToString(const DataArrayView::ShapeType& shape);    std::string
310      shapeToString(const ShapeType& shape);
311    
312    /**    /**
313      \brief      \brief
# Line 478  class DataArrayView { Line 486  class DataArrayView {
486       \param region - Input -       \param region - Input -
487                         Slice region.                         Slice region.
488    */    */
489    static DataArrayView::ShapeType    static
490      ShapeType
491    getResultSliceShape(const RegionType& region);    getResultSliceShape(const RegionType& region);
492    
493    /**    /**
# Line 488  class DataArrayView { Line 497  class DataArrayView {
497       \param key - Input -       \param key - Input -
498                      python slice object specifying region to be returned.                      python slice object specifying region to be returned.
499    
      \description  
   
500       The slice object is a tuple of n python slice specifiers, where       The slice object is a tuple of n python slice specifiers, where
501       n <= the rank of this Data object. Each slice specifier specifies the       n <= the rank of this Data object. Each slice specifier specifies the
502       range of indexes to be sliced from the corresponding dimension. The       range of indexes to be sliced from the corresponding dimension. The
# Line 537  class DataArrayView { Line 544  class DataArrayView {
544           getSliceRegion(:1,0:2)      => < <0,1> <0,2> <0,6> >           getSliceRegion(:1,0:2)      => < <0,1> <0,2> <0,6> >
545    
546    */    */
547    DataArrayView::RegionType    RegionType
548    getSliceRegion(const boost::python::object& key) const;    getSliceRegion(const boost::python::object& key) const;
549    
550    /**    /**
# Line 733  class DataArrayView { Line 740  class DataArrayView {
740       the data point using the given operation, returning the result as a       the data point using the given operation, returning the result as a
741       scalar. Operation must be a pointer to a function.       scalar. Operation must be a pointer to a function.
742    
      Called by escript::dp_algorithm.  
   
      \param operation - Input -  
                   Operation to apply. Must be a pointer to a function.  
   */  
   template <class UnaryFunction>  
   double  
   dp_reductionOp(UnaryFunction operation) const;  
   
   /**  
      \brief  
      Perform the given data point reduction operation on the data point  
      specified by the given offset into the view. Reduces all elements of  
      the data point using the given operation, returning the result as a  
      scalar. Operation must be a pointer to a function.  
   
      Called by escript::dp_algorithm.  
   
      \param offset - Input -  
                   Apply the operation to data starting at this offset in this view.  
      \param operation - Input -  
                   Operation to apply. Must be a pointer to a function.  
   */  
   template <class UnaryFunction>  
   double  
   dp_reductionOp(ValueType::size_type offset,  
                  UnaryFunction operation) const;  
   
   /**  
      \brief  
      Perform the given reduction operation on the data point  
      specified by the default offset into the view. Reduces all elements of  
      the data point using the given operation, returning the result as a  
      scalar. Operation must be a pointer to a function.  
   
743       Called by escript::algorithm.       Called by escript::algorithm.
744    
745       \param operation - Input -       \param operation - Input -
# Line 779  class DataArrayView { Line 751  class DataArrayView {
751    
752    /**    /**
753       \brief       \brief
754       Perform the given reduction operation on the data point       Perform the given data point reduction operation on the data point
755       specified by the given offset into the view. Reduces all elements of       specified by the given offset into the view. Reduces all elements of
756       the data point using the given operation, returning the result as a       the data point using the given operation, returning the result as a
757       scalar. Operation must be a pointer to a function.       scalar. Operation must be a pointer to a function.
# Line 798  class DataArrayView { Line 770  class DataArrayView {
770    
771    /**    /**
772       \brief       \brief
773       Perform matrix multiply.       Perform a matrix multiply of the given views.
774         This is purely a utility method and has no bearing on this view.
775    
776       Description:       NB: Only multiplies together the two given views, ie: two data-points,
777       Perform matrix multiply.       would need to call this over all data-points to multiply the entire
778         Data objects involved.
779    
780       \param left - Input - The left hand side.       \param left - Input - The left hand side.
781       \param right - Input - The right hand side.       \param right - Input - The right hand side.
782       \param result - Output - The result of the operation.       \param result - Output - The result of the operation.
783    */    */
784    static void    static
785      void
786    matMult(const DataArrayView& left,    matMult(const DataArrayView& left,
787            const DataArrayView& right,            const DataArrayView& right,
788            DataArrayView& result);            DataArrayView& result);
# Line 818  class DataArrayView { Line 793  class DataArrayView {
793       of the given views.       of the given views.
794       This is purely a utility method and has no bearing on this view.       This is purely a utility method and has no bearing on this view.
795    */    */
796    static ShapeType    static
797      ShapeType
798    determineResultShape(const DataArrayView& left,    determineResultShape(const DataArrayView& left,
799                         const DataArrayView& right);                         const DataArrayView& right);
800    
# Line 833  class DataArrayView { Line 809  class DataArrayView {
809    //    //
810    // The data values for the view.    // The data values for the view.
811    // NOTE: This points to data external to the view.    // NOTE: This points to data external to the view.
812    // This is just a pointer to a simple STL vector of doubles.    // This is just a pointer to an array of ValueType.
813    ValueType* m_data;    ValueType* m_data;
814    
815    //    //
# Line 958  DataArrayView::binaryOp(ValueType::size_ Line 934  DataArrayView::binaryOp(ValueType::size_
934                          BinaryFunction operation)                          BinaryFunction operation)
935  {  {
936    EsysAssert((!isEmpty()&&checkOffset(offset)),    EsysAssert((!isEmpty()&&checkOffset(offset)),
937               "Error - Couldn't perform binaryOp due to insufficient storage.");               "Error - Couldn't perform binaryOp due to insufficient storage in left object.");
938    for (ValueType::size_type i=0;i<noValues();i++) {    for (ValueType::size_type i=0;i<noValues();i++) {
939      (*m_data)[offset+i]=operation((*m_data)[offset+i],right);      (*m_data)[offset+i]=operation((*m_data)[offset+i],right);
940    }    }
# Line 967  DataArrayView::binaryOp(ValueType::size_ Line 943  DataArrayView::binaryOp(ValueType::size_
943  template <class UnaryFunction>  template <class UnaryFunction>
944  inline  inline
945  double  double
 DataArrayView::dp_reductionOp(UnaryFunction operation) const  
 {  
   return dp_reductionOp(m_offset,operation);  
 }  
   
 template <class UnaryFunction>  
 inline  
 double  
 DataArrayView::dp_reductionOp(ValueType::size_type offset,  
                               UnaryFunction operation) const  
 {  
   EsysAssert((!isEmpty()&&checkOffset(offset)),  
                "Error - Couldn't perform dp_reductionOp due to insufficient storage.");  
   operation.resetResult();  
   for (ValueType::size_type i=0;i<noValues();i++) {  
     operation((*m_data)[offset+i]);  
   }  
   return operation.getResult();  
 }  
   
 template <class UnaryFunction>  
 inline  
 double  
946  DataArrayView::reductionOp(UnaryFunction operation) const  DataArrayView::reductionOp(UnaryFunction operation) const
947  {  {
948    return reductionOp(m_offset,operation);    return reductionOp(m_offset,operation);
# Line 1003  DataArrayView::reductionOp(ValueType::si Line 956  DataArrayView::reductionOp(ValueType::si
956  {  {
957    EsysAssert((!isEmpty()&&checkOffset(offset)),    EsysAssert((!isEmpty()&&checkOffset(offset)),
958                 "Error - Couldn't perform reductionOp due to insufficient storage.");                 "Error - Couldn't perform reductionOp due to insufficient storage.");
959      operation.resetResult();
960    for (ValueType::size_type i=0;i<noValues();i++) {    for (ValueType::size_type i=0;i<noValues();i++) {
961      operation((*m_data)[offset+i]);      operation((*m_data)[offset+i]);
962    }    }

Legend:
Removed from v.108  
changed lines
  Added in v.126

  ViewVC Help
Powered by ViewVC 1.1.26