/[escript]/branches/arrayview_from_1695_trunk/escript/src/DataArrayView.cpp
ViewVC logotype

Diff of /branches/arrayview_from_1695_trunk/escript/src/DataArrayView.cpp

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

trunk/esys2/escript/src/Data/DataArrayView.cpp revision 108 by jgs, Thu Jan 27 06:21:59 2005 UTC trunk/escript/src/DataArrayView.cpp revision 1388 by trankine, Fri Jan 11 07:45:58 2008 UTC
# Line 1  Line 1 
 // $Id$  
1    
2  /*  /* $Id$ */
  ******************************************************************************  
  *                                                                            *  
  *       COPYRIGHT  ACcESS 2004 -  All Rights Reserved                        *  
  *                                                                            *  
  * This software is the property of ACcESS. No part of this code              *  
  * may be copied in any form or by any means without the expressed written    *  
  * consent of ACcESS.  Copying, use or modification of this software          *  
  * by any unauthorised person is illegal unless that person has a software    *  
  * license agreement with ACcESS.                                             *  
  *                                                                            *  
  ******************************************************************************  
 */  
3    
4  #include "escript/Data/DataArrayView.h"  /*******************************************************
5  #include "escript/Data/DataException.h"   *
6     *           Copyright 2003-2007 by ACceSS MNRF
7     *       Copyright 2007 by University of Queensland
8     *
9     *                http://esscc.uq.edu.au
10     *        Primary Business: Queensland, Australia
11     *  Licensed under the Open Software License version 3.0
12     *     http://www.opensource.org/licenses/osl-3.0.php
13     *
14     *******************************************************/
15    
16    #include "DataArrayView.h"
17    #include "DataException.h"
18    
19  #include <sstream>  #include <sstream>
20  #include <vector>  
 #include <iostream>  
21  #include <boost/python/extract.hpp>  #include <boost/python/extract.hpp>
 #include <boost/python/object.hpp>  
22    
23  using namespace std;  using namespace std;
24  using namespace boost::python;  using namespace boost::python;
# Line 33  DataArrayView::DataArrayView(): Line 30  DataArrayView::DataArrayView():
30      m_offset(0),      m_offset(0),
31      m_noValues(0)      m_noValues(0)
32  {  {
33      m_data=0;    m_data=0;
34  }  }
35    
36  DataArrayView::DataArrayView(ValueType& data,  DataArrayView::DataArrayView(ValueType& data,
# Line 74  DataArrayView::DataArrayView(const DataA Line 71  DataArrayView::DataArrayView(const DataA
71  bool  bool
72  DataArrayView::isEmpty() const  DataArrayView::isEmpty() const
73  {  {
74      return (m_data==0);    return (m_data==0);
75  }  }
76    
77  void  void
78  DataArrayView::copy(const boost::python::numeric::array& value)  DataArrayView::copy(const boost::python::numeric::array& value)
79  {  {
80      DataArrayView::ShapeType tempShape;          ShapeType tempShape;    
81      for (int i=0; i<value.getrank(); i++) {      for (int i=0; i<value.getrank(); i++) {
82        tempShape.push_back(extract<int>(value.getshape()[i]));        tempShape.push_back(extract<int>(value.getshape()[i]));
83      }      }
# Line 91  DataArrayView::copy(const boost::python: Line 88  DataArrayView::copy(const boost::python:
88      if (value.getrank()==0) {      if (value.getrank()==0) {
89        (*this)()=extract<double>(value[value.getshape()]);        (*this)()=extract<double>(value[value.getshape()]);
90      } else if (value.getrank()==1) {      } else if (value.getrank()==1) {
91        for (ValueType::size_type i=0;i<tempShape[0];++i) {        for (ValueType::size_type i=0;i<tempShape[0];i++) {
92      (*this)(i)=extract<double>(value[i]);      (*this)(i)=extract<double>(value[i]);
93        }        }
94      } else if (value.getrank()==2) {      } else if (value.getrank()==2) {
95        for (ValueType::size_type i=0;i<tempShape[0];++i) {        for (ValueType::size_type i=0;i<tempShape[0];i++) {
96      for (ValueType::size_type j=0;j<tempShape[1];++j) {      for (ValueType::size_type j=0;j<tempShape[1];j++) {
97        (*this)(i,j)=extract<double>(value[i][j]);        (*this)(i,j)=extract<double>(value[i][j]);
98      }      }
99        }        }
100      } else if (value.getrank()==3) {      } else if (value.getrank()==3) {
101        for (ValueType::size_type i=0;i<tempShape[0];++i) {        for (ValueType::size_type i=0;i<tempShape[0];i++) {
102      for (ValueType::size_type j=0;j<tempShape[1];++j) {      for (ValueType::size_type j=0;j<tempShape[1];j++) {
103        for (ValueType::size_type k=0;k<tempShape[2];++k) {        for (ValueType::size_type k=0;k<tempShape[2];k++) {
104          (*this)(i,j,k)=extract<double>(value[i][j][k]);          (*this)(i,j,k)=extract<double>(value[i][j][k]);
105        }        }
106      }      }
107        }        }
108      } else if (value.getrank()==4) {      } else if (value.getrank()==4) {
109        for (ValueType::size_type i=0;i<tempShape[0];++i) {        for (ValueType::size_type i=0;i<tempShape[0];i++) {
110      for (ValueType::size_type j=0;j<tempShape[1];++j) {      for (ValueType::size_type j=0;j<tempShape[1];j++) {
111        for (ValueType::size_type k=0;k<tempShape[2];++k) {        for (ValueType::size_type k=0;k<tempShape[2];k++) {
112          for (ValueType::size_type m=0;m<tempShape[3];++m) {          for (ValueType::size_type l=0;l<tempShape[3];l++) {
113            (*this)(i,j,k,m)=extract<double>(value[i][j][k][m]);            (*this)(i,j,k,l)=extract<double>(value[i][j][k][l]);
114          }          }
115        }        }
116      }      }
# Line 124  DataArrayView::copy(const boost::python: Line 121  DataArrayView::copy(const boost::python:
121  void  void
122  DataArrayView::copy(const DataArrayView& other)  DataArrayView::copy(const DataArrayView& other)
123  {  {
124      copy(m_offset,other);    copy(m_offset,other);
125  }  }
126    
127  void  void
# Line 165  DataArrayView::copy(ValueType::size_type Line 162  DataArrayView::copy(ValueType::size_type
162      EsysAssert((!isEmpty()&&checkOffset(offset)),      EsysAssert((!isEmpty()&&checkOffset(offset)),
163             "Error - Couldn't copy due to insufficient storage.");             "Error - Couldn't copy due to insufficient storage.");
164      if (checkOffset(offset)) {      if (checkOffset(offset)) {
165        ValueType temp(noValues(),value);        vector<double> temp(noValues(),value);
166        memcpy(&(*m_data)[offset],&temp[0],sizeof(double)*noValues());        memcpy(&(*m_data)[offset],&temp[0],sizeof(double)*noValues());
167      } else {      } else {
168        throw DataException("Error - invalid offset specified.");        throw DataException("Error - invalid offset specified.");
# Line 175  DataArrayView::copy(ValueType::size_type Line 172  DataArrayView::copy(ValueType::size_type
172  int  int
173  DataArrayView::getRank() const  DataArrayView::getRank() const
174  {  {
175      return m_shape.size();    return m_shape.size();
176  }  }
177    
178  const DataArrayView::ShapeType&  const
179    DataArrayView::ShapeType&
180  DataArrayView::getShape() const  DataArrayView::getShape() const
181  {  {
182      return m_shape;    return m_shape;
183  }  }
184    
185  int  int
186  DataArrayView::noValues(const ShapeType& shape)  DataArrayView::noValues(const ShapeType& shape)
187  {  {
188      ShapeType::const_iterator i;    ShapeType::const_iterator i;
189      //    //
190      // An empty shape vector means rank 0 which contains 1 value    // An empty shape vector means rank 0 which contains 1 value
191      int noValues=1;    int noValues=1;
192      for (i=shape.begin();i!=shape.end();i++) {    for (i=shape.begin();i!=shape.end();i++) {
193        noValues*=(*i);      noValues*=(*i);
194      }    }
195      return noValues;    return noValues;
196  }  }
197    
198  int  int
199  DataArrayView::noValues(const RegionLoopRangeType& region)  DataArrayView::noValues(const RegionLoopRangeType& region)
200  {  {
201      //    //
202      // An empty region vector means rank 0 which contains 1 value    // An empty region vector means rank 0 which contains 1 value
203      int noValues=1;    int noValues=1;
204      for (int i=0; i<region.size(); i++) {    for (int i=0;i<region.size();i++) {
205        noValues*=region[i].second-region[i].first;      noValues*=region[i].second-region[i].first;
206      }    }
207      return noValues;    return noValues;
208  }  }
209    
210  int  int
211  DataArrayView::noValues() const  DataArrayView::noValues() const
212  {  {
213      return m_noValues;    return m_noValues;
214  }  }
215    
216  bool  bool
217  DataArrayView::checkShape(const DataArrayView::ShapeType& other) const  DataArrayView::checkShape(const DataArrayView::ShapeType& other) const
218  {  {
219      return (m_shape==other);    return (m_shape==other);
220  }  }
221    
222  string  string
223  DataArrayView::createShapeErrorMessage(const string& messagePrefix,  DataArrayView::createShapeErrorMessage(const string& messagePrefix,
224                                         const DataArrayView::ShapeType& other) const                                         const DataArrayView::ShapeType& other) const
225  {  {
226      stringstream temp;    stringstream temp;
227      temp << messagePrefix    temp << messagePrefix
228       << " This shape: " << shapeToString(m_shape)         << " This shape: " << shapeToString(m_shape)
229       << " Other shape: " << shapeToString(other);         << " Other shape: " << shapeToString(other);
230      return temp.str();    return temp.str();
231  }  }
232    
233  DataArrayView::ValueType::size_type  DataArrayView::ValueType::size_type
# Line 241  DataArrayView::getOffset() const Line 239  DataArrayView::getOffset() const
239  void  void
240  DataArrayView::setOffset(ValueType::size_type offset)  DataArrayView::setOffset(ValueType::size_type offset)
241  {  {
242      EsysAssert((checkOffset(offset)), "Error - Invalid offset.");    EsysAssert((checkOffset(offset)), "Error - Invalid offset.");
243      if (checkOffset(offset)) {    if (checkOffset(offset)) {
244        m_offset=offset;      m_offset=offset;
245      } else {    } else {
246        throw DataException("Error - invalid offset specified.");      throw DataException("Error - invalid offset specified.");
247      }    }
248  }  }
249    
250  void  void
251  DataArrayView::incrOffset()  DataArrayView::incrOffset()
252  {  {
253      EsysAssert((checkOffset(m_offset+noValues())), "Error - Cannot increment offset.");    EsysAssert((checkOffset(m_offset+noValues())), "Error - Cannot increment offset.");
254      if (checkOffset(m_offset+noValues())) {    if (checkOffset(m_offset+noValues())) {
255        m_offset=m_offset+noValues();      m_offset=m_offset+noValues();
256      } else {    } else {
257        throw DataException("Error - Cannot increment offset.");      throw DataException("Error - Cannot increment offset.");
258      }    }
259  }  }
260    
261  bool  bool
262  DataArrayView::checkOffset() const  DataArrayView::checkOffset() const
263  {  {
264      return checkOffset(m_offset);    return checkOffset(m_offset);
265  }  }
266    
267  bool  bool
268  DataArrayView::checkOffset(ValueType::size_type offset) const  DataArrayView::checkOffset(ValueType::size_type offset) const
269  {  {
270      return (m_data->size() >= (offset+noValues()));    return (m_data->size() >= (offset+noValues()));
271  }  }
272    
273  DataArrayView::ValueType&  DataArrayView::ValueType&
# Line 291  DataArrayView::getData(ValueType::size_t Line 289  DataArrayView::getData(ValueType::size_t
289  DataArrayView::ShapeType  DataArrayView::ShapeType
290  DataArrayView::getResultSliceShape(const RegionType& region)  DataArrayView::getResultSliceShape(const RegionType& region)
291  {  {
292      int dimSize;    int dimSize;
293      RegionType::const_iterator i;    RegionType::const_iterator i;
294      DataArrayView::ShapeType result;    ShapeType result;
295      for (i=region.begin();i!=region.end();i++) {    for (i=region.begin();i!=region.end();i++) {
296        dimSize=((i->second)-(i->first));      dimSize=((i->second)-(i->first));
297        if (dimSize!=0) {      if (dimSize!=0) {
298      result.push_back(dimSize);        result.push_back(dimSize);
       }  
299      }      }
300      return result;    }
301      return result;
302  }  }
303    
304  DataArrayView::RegionType  DataArrayView::RegionType
# Line 308  DataArrayView::getSliceRegion(const boos Line 306  DataArrayView::getSliceRegion(const boos
306  {  {
307    int slice_rank, i;    int slice_rank, i;
308    int this_rank=getRank();    int this_rank=getRank();
309    DataArrayView::RegionType out(this_rank);    RegionType out(this_rank);
310    /* allow for case where key is singular eg: [1], this implies we    /* allow for case where key is singular eg: [1], this implies we
311       want to generate a rank-1 dimension object, as opposed to eg: [1,2]       want to generate a rank-1 dimension object, as opposed to eg: [1,2]
312       which implies we want to take a rank dimensional object with one       which implies we want to take a rank dimensional object with one
# Line 371  getSliceRange(const boost::python::objec Line 369  getSliceRange(const boost::python::objec
369    }    }
370    if (s0 < 0)    if (s0 < 0)
371       throw DataException("Error - slice index out of range.");       throw DataException("Error - slice index out of range.");
372    if (s0 == s1 and s1 >= shape)    if (s0 == s1 && s1 >= shape)
373       throw DataException("Error - slice index out of range.");       throw DataException("Error - slice index out of range.");
374    if (s0 != s1 and  s1>shape)    if (s0 != s1 &&  s1>shape)
375       throw DataException("Error - slice index out of range.");       throw DataException("Error - slice index out of range.");
376    if (s0 > s1)    if (s0 > s1)
377       throw DataException("Error - lower index must less or equal upper index.");       throw DataException("Error - lower index must less or equal upper index.");
# Line 400  void Line 398  void
398  DataArrayView::copySlice(const DataArrayView& other,  DataArrayView::copySlice(const DataArrayView& other,
399                           const RegionLoopRangeType& region)                           const RegionLoopRangeType& region)
400  {  {
401      //    //
402      // version of copySlice that uses the default offsets    // version of copySlice that uses the default offsets
403      copySlice(m_offset,other,other.m_offset,region);    copySlice(m_offset,other,other.m_offset,region);
404  }  }
405    
406  void  void
# Line 438  DataArrayView::copySlice(ValueType::size Line 436  DataArrayView::copySlice(ValueType::size
436      //      //
437      // copy the values in the specified region of the other view into this view      // copy the values in the specified region of the other view into this view
438    
439        // the following loops cannot be parallelised due to the numCopy counter
440      int numCopy=0;      int numCopy=0;
441    
442      switch (region.size()) {      switch (region.size()) {
# Line 536  DataArrayView::copySliceFrom(ValueType:: Line 535  DataArrayView::copySliceFrom(ValueType::
535      // allow for case where other view is a scalar      // allow for case where other view is a scalar
536      if (other.getRank()==0) {      if (other.getRank()==0) {
537    
538            // the following loops cannot be parallelised due to the numCopy counter
539          int numCopy=0;          int numCopy=0;
540    
541          switch (region.size()) {          switch (region.size()) {
# Line 590  DataArrayView::copySliceFrom(ValueType:: Line 590  DataArrayView::copySliceFrom(ValueType::
590    
591      } else {      } else {
592    
593            // the following loops cannot be parallelised due to the numCopy counter
594          int numCopy=0;          int numCopy=0;
595    
596          switch (region.size()) {          switch (region.size()) {
# Line 646  DataArrayView::copySliceFrom(ValueType:: Line 647  DataArrayView::copySliceFrom(ValueType::
647    
648  }  }
649    
 DataArrayView::ShapeType  
 DataArrayView::determineResultShape(const DataArrayView& left,  
                                     const DataArrayView& right)  
 {  
     DataArrayView::ShapeType temp;  
     for (int i=0; i<(left.getRank()-1); i++) {  
       temp.push_back(left.getShape()[i]);  
     }  
     for (int i=1; i<right.getRank(); i++) {  
       temp.push_back(right.getShape()[i]);  
     }  
     return temp;  
 }  
   
650  string  string
651  DataArrayView::toString(const string& suffix) const  DataArrayView::toString(const string& suffix) const
652  {  {
# Line 675  DataArrayView::toString(const string& su Line 662  DataArrayView::toString(const string& su
662        break;        break;
663      case 1:      case 1:
664        for (int i=0;i<getShape()[0];i++) {        for (int i=0;i<getShape()[0];i++) {
665      temp << "(" << i << ") " << finalSuffix << (*this)(i);      temp << finalSuffix << "(" << i << ") " << (*this)(i);
666      if (i!=(getShape()[0]-1)) {      if (i!=(getShape()[0]-1)) {
667        temp << endl;        temp << endl;
668      }      }
# Line 684  DataArrayView::toString(const string& su Line 671  DataArrayView::toString(const string& su
671      case 2:      case 2:
672        for (int i=0;i<getShape()[0];i++) {        for (int i=0;i<getShape()[0];i++) {
673      for (int j=0;j<getShape()[1];j++) {      for (int j=0;j<getShape()[1];j++) {
674        temp << "(" << i << "," << j << ") " << finalSuffix << (*this)(i,j);        temp << finalSuffix << "(" << i << "," << j << ") " << (*this)(i,j);
675        if (!(i==(getShape()[0]-1) && j==(getShape()[1]-1))) {        if (!(i==(getShape()[0]-1) && j==(getShape()[1]-1))) {
676          temp << endl;          temp << endl;
677        }        }
# Line 695  DataArrayView::toString(const string& su Line 682  DataArrayView::toString(const string& su
682        for (int i=0;i<getShape()[0];i++) {        for (int i=0;i<getShape()[0];i++) {
683      for (int j=0;j<getShape()[1];j++) {      for (int j=0;j<getShape()[1];j++) {
684        for (int k=0;k<getShape()[2];k++) {        for (int k=0;k<getShape()[2];k++) {
685          temp << "(" << i << "," << j << "," << k << ") " << finalSuffix << (*this)(i,j,k);          temp << finalSuffix << "(" << i << "," << j << "," << k << ") " << (*this)(i,j,k);
686          if (!(i==(getShape()[0]-1) && j==(getShape()[1]-1) && k==(getShape()[2]-1))) {          if (!(i==(getShape()[0]-1) && j==(getShape()[1]-1) && k==(getShape()[2]-1))) {
687            temp << endl;            temp << endl;
688          }          }
# Line 708  DataArrayView::toString(const string& su Line 695  DataArrayView::toString(const string& su
695      for (int j=0;j<getShape()[1];j++) {      for (int j=0;j<getShape()[1];j++) {
696        for (int k=0;k<getShape()[2];k++) {        for (int k=0;k<getShape()[2];k++) {
697          for (int l=0;l<getShape()[3];l++) {          for (int l=0;l<getShape()[3];l++) {
698            temp << "(" << i << "," << j << "," << k << "," << l << ") " << finalSuffix << (*this)(i,j,k,l);            temp << finalSuffix << "(" << i << "," << j << "," << k << "," << l << ") " << (*this)(i,j,k,l);
699            if (!(i==(getShape()[0]-1) && j==(getShape()[1]-1) && k==(getShape()[2]-1) && l==(getShape()[3]-1))) {            if (!(i==(getShape()[0]-1) && j==(getShape()[1]-1) && k==(getShape()[2]-1) && l==(getShape()[3]-1))) {
700              temp << endl;              temp << endl;
701            }            }
# Line 745  DataArrayView::matMult(const DataArrayVi Line 732  DataArrayView::matMult(const DataArrayVi
732                         const DataArrayView& right,                         const DataArrayView& right,
733                         DataArrayView& result)                         DataArrayView& result)
734  {  {
735    
736      if (left.getRank()==0 || right.getRank()==0) {      if (left.getRank()==0 || right.getRank()==0) {
737        stringstream temp;        stringstream temp;
738        temp << "Error - (matMult) Invalid for rank 0 objects.";        temp << "Error - (matMult) Invalid for rank 0 objects.";
739        throw DataException(temp.str());        throw DataException(temp.str());
740      }      }
741    
742      if (left.getShape()[left.getRank()-1]!=right.getShape()[0]) {      if (left.getShape()[left.getRank()-1] != right.getShape()[0]) {
743        stringstream temp;        stringstream temp;
744        temp << "Error - (matMult) Dimension: " << left.getRank()        temp << "Error - (matMult) Dimension: " << left.getRank()
745         << ", size: " << left.getShape()[left.getRank()-1]         << ", size: " << left.getShape()[left.getRank()-1]
# Line 759  DataArrayView::matMult(const DataArrayVi Line 747  DataArrayView::matMult(const DataArrayVi
747         << " of RHS don't match.";         << " of RHS don't match.";
748        throw DataException(temp.str());        throw DataException(temp.str());
749      }      }
750      int outputRank=left.getRank()+right.getRank()-2;  
751            int outputRank = left.getRank()+right.getRank()-2;
752    
753      if (outputRank < 0) {      if (outputRank < 0) {
754        stringstream temp;        stringstream temp;
755        temp << "Error - (matMult) Left and right operands cannot be multiplied "        temp << "Error - (matMult) LHS and RHS cannot be multiplied "
756         << "as they have incompatable rank.";         << "as they have incompatable rank.";
757        throw DataException(temp.str());        throw DataException(temp.str());
758      }      }
# Line 776  DataArrayView::matMult(const DataArrayVi Line 765  DataArrayView::matMult(const DataArrayVi
765        throw DataException(temp.str());        throw DataException(temp.str());
766      }      }
767    
768      for (int i=0; i<(left.getRank()-1); ++i) {      for (int i=0; i<(left.getRank()-1); i++) {
769        if (left.getShape()[i]!=result.getShape()[i]) {        if (left.getShape()[i] != result.getShape()[i]) {
770      stringstream temp;      stringstream temp;
771      temp << "Error - (matMult) Dimension: " << i      temp << "Error - (matMult) Dimension: " << i
772           << " of LHS and output array don't match.";           << " of LHS and result array don't match.";
773      throw DataException(temp.str());      throw DataException(temp.str());
774        }        }
775      }      }
776    
777      for (int i=1; i<right.getRank(); ++i) {      for (int i=1; i<right.getRank(); i++) {
778        if (right.getShape()[i] != result.getShape()[i+left.getRank()-2]) {        if (right.getShape()[i] != result.getShape()[i+left.getRank()-2]) {
779      stringstream temp;      stringstream temp;
780      temp << "Error - (matMult) Dimension: " << i      temp << "Error - (matMult) Dimension: " << i
781           << ", size: " << right.getShape()[i]           << ", size: " << right.getShape()[i]
782           << " of RHS and dimension: " << i+left.getRank()-1           << " of RHS and dimension: " << i+left.getRank()-1
783           << ", size: " << result.getShape()[i+left.getRank()-1]           << ", size: " << result.getShape()[i+left.getRank()-1]
784           << " of output array don't match.";           << " of result array don't match.";
785      throw DataException(temp.str());      throw DataException(temp.str());
786        }        }
787      }      }
788    
789      switch (left.getRank()) {      switch (left.getRank()) {
790      case 1:  
       switch (right.getRank()) {  
791        case 1:        case 1:
792      result()=0;          switch (right.getRank()) {
793      for (int i=0;i<left.getShape()[0];++i) {            case 1:
794        result()+=left(i)*right(i);              result()=0;
795      }              for (int i=0;i<left.getShape()[0];i++) {
796      break;                result()+=left(i)*right(i);
797        case 2:              }
798          for (int i=0;i<result.getShape()[0];++i) {              break;
799        result(i)=0;            case 2:
800        for (int j=0;j<right.getShape()[0];++j) {              for (int i=0;i<result.getShape()[0];i++) {
801          result(i)+=left(j)*right(j,i);                result(i)=0;
802        }                for (int j=0;j<right.getShape()[0];j++) {
803      }                  result(i)+=left(j)*right(j,i);
804          break;                }
805        default:              }
806      stringstream temp;              break;
807      temp << "Error - (matMult) Invalid rank. Programming error.";            default:
808          throw DataException(temp.str());              stringstream temp; temp << "Error - (matMult) Invalid rank. Programming error.";
809                throw DataException(temp.str());
810                break;
811            }
812          break;          break;
813        }  
       break;  
     case 2:  
       switch (right.getRank()) {  
       case 1:  
     result()=0;  
     for (int i=0;i<left.getShape()[0];++i) {  
       result(i)=0;  
       for (int j=0;j<left.getShape()[1];++j) {  
         result(i)+=left(i,j)*right(i);  
       }  
     }  
     break;  
814        case 2:        case 2:
815          for (int i=0;i<result.getShape()[0];++i) {          switch (right.getRank()) {
816        for (int j=0;j<result.getShape()[1];++j) {            case 1:
817          result(i,j)=0;              result()=0;
818          for (int jR=0;jR<right.getShape()[0];++jR) {                for (int i=0;i<left.getShape()[0];i++) {
819            result(i,j)+=left(i,jR)*right(jR,j);                 result(i)=0;
820          }                 for (int j=0;j<left.getShape()[1];j++) {
821        }                   result(i)+=left(i,j)*right(i);
822      }                 }
823                }
824            break;
825              case 2:
826                for (int i=0;i<result.getShape()[0];i++) {
827                  for (int j=0;j<result.getShape()[1];j++) {
828                    result(i,j)=0;
829                    for (int jR=0;jR<right.getShape()[0];jR++) {
830                      result(i,j)+=left(i,jR)*right(jR,j);
831                    }
832                  }
833                }
834                break;
835              default:
836                stringstream temp; temp << "Error - (matMult) Invalid rank. Programming error.";
837                throw DataException(temp.str());
838                break;
839            }
840          break;          break;
841    
842        default:        default:
843      stringstream temp;          stringstream temp; temp << "Error - (matMult) Not supported for rank: " << left.getRank();
     temp << "Error - (matMult) Invalid rank. Programming error.";  
844          throw DataException(temp.str());          throw DataException(temp.str());
845          break;          break;
       }  
       break;  
     default:  
       stringstream temp;  
       temp << "Error - (matMult) Not supported for rank: " << left.getRank();  
       throw DataException(temp.str());  
       break;  
846      }      }
847    
848    }
849    
850    DataArrayView::ShapeType
851    DataArrayView::determineResultShape(const DataArrayView& left,
852                                        const DataArrayView& right)
853    {
854        ShapeType temp;
855        for (int i=0; i<(left.getRank()-1); i++) {
856          temp.push_back(left.getShape()[i]);
857        }
858        for (int i=1; i<right.getRank(); i++) {
859          temp.push_back(right.getShape()[i]);
860        }
861        return temp;
862  }  }
863    
864  bool operator==(const DataArrayView& left, const DataArrayView& right)  bool operator==(const DataArrayView& left, const DataArrayView& right)

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

  ViewVC Help
Powered by ViewVC 1.1.26