/[escript]/branches/arrexp_2137_win/escript/src/DataTagged.cpp
ViewVC logotype

Diff of /branches/arrexp_2137_win/escript/src/DataTagged.cpp

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

revision 119 by jgs, Tue Apr 12 04:45:05 2005 UTC revision 121 by jgs, Fri May 6 04:26:16 2005 UTC
# Line 1  Line 1 
1  // $Id$  // $Id$
2    
3  /*  /*
4   ******************************************************************************   ******************************************************************************
5   *                                                                            *   *                                                                            *
# Line 24  using namespace std; Line 25  using namespace std;
25    
26  namespace escript {  namespace escript {
27    
28  DataTagged::DataTagged():  DataTagged::DataTagged()
29    DataAbstract(FunctionSpace())    : DataAbstract(FunctionSpace())
30  {  {
   //  
31    // create a scalar default value    // create a scalar default value
32    m_data.push_back(0.0);    m_data.resize(1);
33    DataArrayView temp(m_data,DataArrayView::ShapeType());    DataArrayView temp(m_data,DataArrayView::ShapeType());
34    setPointDataView(temp);    setPointDataView(temp);
35  }  }
# Line 40  DataTagged::DataTagged(const TagListType Line 40  DataTagged::DataTagged(const TagListType
40                 const FunctionSpace& what)                 const FunctionSpace& what)
41    : DataAbstract(what)    : DataAbstract(what)
42  {  {
43    //    // initialise the array of data values
44    // Initialise the array of data values    // the default value is always the first item in the values list
45    // The default value is always the first item in the values list    m_data.resize(defaultValue.noValues());
46    m_data.insert(m_data.end(), &defaultValue.getData(0), &defaultValue.getData(defaultValue.noValues()) );    for (int i=0; i<defaultValue.noValues(); i++) {
47        m_data[i]=defaultValue.getData(i);
48      }
49    
50    // create the data view    // create the data view
51    DataArrayView temp(m_data,defaultValue.getShape());    DataArrayView temp(m_data,defaultValue.getShape());
52    setPointDataView(temp);    setPointDataView(temp);
53    
54    // add remaining tags and values    // add remaining tags and values
55    addTaggedValues(tagKeys,values);    addTaggedValues(tagKeys,values);
56  }  }
# Line 54  DataTagged::DataTagged(const TagListType Line 58  DataTagged::DataTagged(const TagListType
58  DataTagged::DataTagged(const FunctionSpace& what,  DataTagged::DataTagged(const FunctionSpace& what,
59                         const DataArrayView::ShapeType &shape,                         const DataArrayView::ShapeType &shape,
60                         const int tags[],                         const int tags[],
61                         const DataArrayView::ValueType &data)                         const ValueType &data)
62    : DataAbstract(what)    : DataAbstract(what)
63  {  {
64    //    // copy the data
   // copy the data in the correct format  
65    m_data=data;    m_data=data;
66    //  
67    // create the view of the data    // create the view of the data
68    DataArrayView tempView(m_data,shape);    DataArrayView tempView(m_data,shape);
69    setPointDataView(tempView);    setPointDataView(tempView);
70    //  
71    // create the tag lookup map    // create the tag lookup map
72    for (int sampleNo=0; sampleNo<getNumSamples(); sampleNo++) {    for (int sampleNo=0; sampleNo<getNumSamples(); sampleNo++) {
73      m_offsetLookup.insert(DataMapType::value_type(sampleNo,tags[sampleNo]));      m_offsetLookup.insert(DataMapType::value_type(sampleNo,tags[sampleNo]));
# Line 84  DataTagged::DataTagged(const DataTagged& Line 87  DataTagged::DataTagged(const DataTagged&
87  DataTagged::DataTagged(const DataConstant& other)  DataTagged::DataTagged(const DataConstant& other)
88    : DataAbstract(other.getFunctionSpace())    : DataAbstract(other.getFunctionSpace())
89  {  {
90    //    // fill the default value with the constant value item from "other"
   // Fill the default value with the constant value item from other  
91    const DataArrayView& value=other.getPointDataView();    const DataArrayView& value=other.getPointDataView();
92    m_data.insert(m_data.end(), &value.getData(0), &value.getData(value.noValues()) );    m_data.resize(value.noValues());
93      for (int i=0; i<value.noValues(); i++) {
94        m_data[i]=value.getData(i);
95      }
96    
97    // create the data view    // create the data view
98    DataArrayView temp(m_data,value.getShape());    DataArrayView temp(m_data,value.getShape());
99    setPointDataView(temp);    setPointDataView(temp);
# Line 97  DataTagged::DataTagged(const DataTagged& Line 103  DataTagged::DataTagged(const DataTagged&
103                 const DataArrayView::RegionType& region)                 const DataArrayView::RegionType& region)
104    : DataAbstract(other.getFunctionSpace())    : DataAbstract(other.getFunctionSpace())
105  {  {
   //  
106    // get the shape of the slice to copy from other    // get the shape of the slice to copy from other
107    DataArrayView::ShapeType shape(DataArrayView::getResultSliceShape(region));    DataArrayView::ShapeType shape(DataArrayView::getResultSliceShape(region));
108    DataArrayView::RegionLoopRangeType region_loop_range=getSliceRegionLoopRange(region);    DataArrayView::RegionLoopRangeType region_loop_range=getSliceRegionLoopRange(region);
109    
110    // allocate enough space for all values    // allocate enough space for all values
111    m_data.resize(DataArrayView::noValues(shape)*(other.m_offsetLookup.size()+1));    m_data.resize(DataArrayView::noValues(shape)*(other.m_offsetLookup.size()+1));
112    
113    // create the data view    // create the data view
114    DataArrayView temp(m_data,shape);    DataArrayView temp(m_data,shape);
115    setPointDataView(temp);    setPointDataView(temp);
116    
117    // copy the default value    // copy the default value
118    getDefaultValue().copySlice(other.getDefaultValue(),region_loop_range);    getDefaultValue().copySlice(other.getDefaultValue(),region_loop_range);
119    //  
120    // Loop through the tag values copying these    // loop through the tag values copying these
121    DataMapType::const_iterator pos;    DataMapType::const_iterator pos;
122    DataArrayView::ValueType::size_type tagOffset=getPointDataView().noValues();    DataArrayView::ValueType::size_type tagOffset=getPointDataView().noValues();
123    for (pos=other.m_offsetLookup.begin();pos!=other.m_offsetLookup.end();++pos){    for (pos=other.m_offsetLookup.begin();pos!=other.m_offsetLookup.end();pos++){
124      getPointDataView().copySlice(tagOffset,other.getPointDataView(), pos->second,region_loop_range);      getPointDataView().copySlice(tagOffset,other.getPointDataView(),pos->second,region_loop_range);
125      m_offsetLookup.insert(DataMapType::value_type(pos->first,tagOffset));      m_offsetLookup.insert(DataMapType::value_type(pos->first,tagOffset));
126      tagOffset+=getPointDataView().noValues();      tagOffset+=getPointDataView().noValues();
127    }    }
128  }  }
129    
130  void  void
131  DataTagged::reshapeDataPoint(const DataArrayView::ShapeType& shape)  DataTagged::reshapeDataPoint(const DataArrayView::ShapeType& shape)
132  {  {
   //  
133    // can only reshape a rank zero data point    // can only reshape a rank zero data point
134    if (getPointDataView().getRank()!=0) {    if (getPointDataView().getRank()!=0) {
135      stringstream temp;      stringstream temp;
# Line 131  DataTagged::reshapeDataPoint(const DataA Line 138  DataTagged::reshapeDataPoint(const DataA
138       << getPointDataView().getRank();       << getPointDataView().getRank();
139      throw DataException(temp.str());      throw DataException(temp.str());
140    }    }
141    //  
142    // allocate enough space for all values    // allocate enough space for all values
143    DataArrayView::ValueType newData(DataArrayView::noValues(shape)*(m_offsetLookup.size()+1));    DataArrayView::ValueType newData(DataArrayView::noValues(shape)*(m_offsetLookup.size()+1));
144    DataArrayView newView(newData,shape);    DataArrayView newView(newData,shape);
145    newView.copy(0,getDefaultValue()());    newView.copy(0,getDefaultValue()());
146    //  
147    // Loop through the tag values    // loop through the tag values
148    DataMapType::iterator pos;    DataMapType::iterator pos;
149    DataArrayView::ValueType::size_type tagOffset=DataArrayView::noValues(shape);    DataArrayView::ValueType::size_type tagOffset=DataArrayView::noValues(shape);
150    for (pos=m_offsetLookup.begin();pos!=m_offsetLookup.end();++pos){    for (pos=m_offsetLookup.begin();pos!=m_offsetLookup.end();pos++){
151      newView.copy(tagOffset,m_data[pos->second]);      newView.copy(tagOffset,m_data[pos->second]);
152      pos->second=tagOffset;      pos->second=tagOffset;
153      tagOffset+=DataArrayView::noValues(shape);      tagOffset+=DataArrayView::noValues(shape);
# Line 164  DataTagged::setSlice(const DataAbstract* Line 171  DataTagged::setSlice(const DataAbstract*
171    if (tempDataTag==0) {    if (tempDataTag==0) {
172      throw DataException("Programming error - casting to DataTagged.");      throw DataException("Programming error - casting to DataTagged.");
173    }    }
174    //  
175    DataArrayView::ShapeType shape(DataArrayView::getResultSliceShape(region));    DataArrayView::ShapeType shape(DataArrayView::getResultSliceShape(region));
176    DataArrayView::RegionLoopRangeType region_loop_range=getSliceRegionLoopRange(region);    DataArrayView::RegionLoopRangeType region_loop_range=getSliceRegionLoopRange(region);
   //  
177    if (getPointDataView().getRank()!=region.size()) {    if (getPointDataView().getRank()!=region.size()) {
178      throw DataException("Error - Invalid slice region.");      throw DataException("Error - Invalid slice region.");
179    }    }
# Line 175  DataTagged::setSlice(const DataAbstract* Line 181  DataTagged::setSlice(const DataAbstract*
181      throw DataException (value->getPointDataView().createShapeErrorMessage(      throw DataException (value->getPointDataView().createShapeErrorMessage(
182                  "Error - Couldn't copy slice due to shape mismatch.",shape));                  "Error - Couldn't copy slice due to shape mismatch.",shape));
183    }    }
184    //  
185    getDefaultValue().copySliceFrom(tempDataTag->getDefaultValue(),region_loop_range);    getDefaultValue().copySliceFrom(tempDataTag->getDefaultValue(),region_loop_range);
186    //  
187    // Loop through the tag values    // loop through the tag values
188    DataMapType::const_iterator pos;    DataMapType::const_iterator pos;
189    for (pos=m_offsetLookup.begin();pos!=m_offsetLookup.end();++pos){    for (pos=m_offsetLookup.begin();pos!=m_offsetLookup.end();pos++) {
190      getDataPointByTag(pos->first).copySliceFrom(tempDataTag->getDataPointByTag(pos->first),region_loop_range);      getDataPointByTag(pos->first).copySliceFrom(tempDataTag->getDataPointByTag(pos->first),region_loop_range);
191    }    }
192  }  }
193    
194  void  void
195  DataTagged::setTaggedValue(int tagKey,  DataTagged::setTaggedValue(int tagKey,
196                             const DataArrayView& value)                             const DataArrayView& value)
197  {  {
198      if (!getPointDataView().checkShape(value.getShape())) {
199          throw DataException(getPointDataView().createShapeErrorMessage(
200                              "Error - Cannot setTaggedValue due to shape mismatch.", value.getShape()));
201      }
202    DataMapType::iterator pos(m_offsetLookup.find(tagKey));    DataMapType::iterator pos(m_offsetLookup.find(tagKey));
203    if (pos==m_offsetLookup.end()) {    if (pos==m_offsetLookup.end()) {
204      //      // tag couldn't be found so use addTaggedValue
     // tag couldn't be found so add as a new tag  
205      addTaggedValue(tagKey,value);      addTaggedValue(tagKey,value);
206    } else {    } else {
207      if (!getPointDataView().checkShape(value.getShape())) {      // copy the values into the data array at the offset determined by m_offsetLookup
208        throw DataException(getPointDataView().createShapeErrorMessage(      int offset=pos->second;
209           "Error - Cannot setTaggedValue due to shape mismatch.", value.getShape()));      for (int i=0; i<getPointDataView().noValues(); i++) {
210          m_data[offset+i]=value.getData(i);
211      }      }
     //  
     // copy the values into tagged data storage  
     copy(&value.getData(0), &value.getData(getPointDataView().noValues()), &m_data[pos->second]);  
   }  
 }  
   
 void  
 DataTagged::setTaggedValues(const TagListType& tagKeys,  
                             const ValueListType& values)  
 {  
   for (int i=0;i<tagKeys.size();++i) {  
     setTaggedValue(tagKeys[i],values[i]);  
212    }    }
213  }  }
214    
# Line 220  DataTagged::addTaggedValue(int tagKey, Line 218  DataTagged::addTaggedValue(int tagKey,
218  {  {
219    if (!getPointDataView().checkShape(value.getShape())) {    if (!getPointDataView().checkShape(value.getShape())) {
220      throw DataException(getPointDataView().createShapeErrorMessage(      throw DataException(getPointDataView().createShapeErrorMessage(
221           "Error - Cannot addTaggedValue due to shape mismatch.", value.getShape()));                          "Error - Cannot addTaggedValue due to shape mismatch.", value.getShape()));
222    }    }
223    //    DataMapType::iterator pos(m_offsetLookup.find(tagKey));
224    // save the key and the location of its data    if (pos!=m_offsetLookup.end()) {
225    m_offsetLookup.insert( DataMapType::value_type(tagKey,m_data.size()) );      // tag already exists so use setTaggedValue
226    //      setTaggedValue(tagKey,value);
227    // insert the data given in value at the end of m_data    } else {
228    m_data.insert( m_data.end(), &(value.getData(0)), &(value.getData(value.noValues())) );      // save the key and the location of its data in the lookup tab
229        m_offsetLookup.insert(DataMapType::value_type(tagKey,m_data.size()));
230        // add the data given in "value" at the end of m_data
231        // need to make a temp copy of m_data, resize m_data, then copy
232        // all the old values plus the value to be added back into m_data
233        ValueType m_data_temp(m_data);
234        int oldSize=m_data.size();
235        int newSize=m_data.size()+value.noValues();
236        m_data.resize(newSize);
237        for (int i=0;i<oldSize;i++) {
238          m_data[i]=m_data_temp[i];
239        }
240        for (int i=0;i<value.noValues();i++) {
241          m_data[oldSize+i]=value.getData(i);
242        }
243      }
244    }
245    
246    void
247    DataTagged::setTaggedValues(const TagListType& tagKeys,
248                                const ValueListType& values)
249    {
250      addTaggedValues(tagKeys,values);
251  }  }
252    
253  void  void
# Line 235  DataTagged::addTaggedValues(const TagLis Line 255  DataTagged::addTaggedValues(const TagLis
255                              const ValueListType& values)                              const ValueListType& values)
256  {  {
257    if (values.size()==0) {    if (values.size()==0) {
258      //      // copy the default value for each of the tags
     // Copy the default value for each of the tags  
259      TagListType::const_iterator iT;      TagListType::const_iterator iT;
260      for (iT=tagKeys.begin();iT!=tagKeys.end();++iT) {      for (iT=tagKeys.begin();iT!=tagKeys.end();iT++) {
       //  
261        // the point data view for DataTagged points at the default value        // the point data view for DataTagged points at the default value
262        addTaggedValue(*iT,getPointDataView());        addTaggedValue(*iT,getPointDataView());
263      }      }
264    } else if (values.size()==1 && tagKeys.size()>1) {    } else if (values.size()==1 && tagKeys.size()>1) {
     //  
265      // assume the one value will be used for all tag values      // assume the one value will be used for all tag values
     // Copy the input data  
266      TagListType::const_iterator iT;      TagListType::const_iterator iT;
267      for (iT=tagKeys.begin();iT!=tagKeys.end();++iT) {      for (iT=tagKeys.begin();iT!=tagKeys.end();iT++) {
268        addTaggedValue(*iT,values[0]);        addTaggedValue(*iT,values[0]);
269      }      }
270    } else {    } else {
# Line 258  DataTagged::addTaggedValues(const TagLis Line 274  DataTagged::addTaggedValues(const TagLis
274         << " doesn't match the number of values: " << values.size();         << " doesn't match the number of values: " << values.size();
275        throw DataException(temp.str());        throw DataException(temp.str());
276      } else {      } else {
277        for (int i=0;i<tagKeys.size();++i) {        for (int i=0;i<tagKeys.size();i++) {
278          addTaggedValue(tagKeys[i],values[i]);          addTaggedValue(tagKeys[i],values[i]);
279        }        }
280      }      }
# Line 270  DataTagged::getSampleDataByTag(int tag) Line 286  DataTagged::getSampleDataByTag(int tag)
286  {  {
287    DataMapType::iterator pos(m_offsetLookup.find(tag));    DataMapType::iterator pos(m_offsetLookup.find(tag));
288    if (pos==m_offsetLookup.end()) {    if (pos==m_offsetLookup.end()) {
     //  
289      // tag couldn't be found so return the default value      // tag couldn't be found so return the default value
290      return &(m_data[0]);      return &(m_data[0]);
291    } else {    } else {
     //  
292      // return the data-point corresponding to the given tag      // return the data-point corresponding to the given tag
293      return &(m_data[pos->second]);      return &(m_data[pos->second]);
294    }    }
# Line 287  DataTagged::toString() const Line 301  DataTagged::toString() const
301    DataMapType::const_iterator i;    DataMapType::const_iterator i;
302    temp << "Tag(Default)" << endl;    temp << "Tag(Default)" << endl;
303    temp << getDefaultValue().toString() << endl;    temp << getDefaultValue().toString() << endl;
   //  
304    // create a temporary view as the offset will be changed    // create a temporary view as the offset will be changed
305    DataArrayView tempView(getPointDataView().getData(), getPointDataView().getShape());    DataArrayView tempView(getPointDataView().getData(), getPointDataView().getShape());
306    for (i=m_offsetLookup.begin();i!=m_offsetLookup.end();++i) {    for (i=m_offsetLookup.begin();i!=m_offsetLookup.end();++i) {

Legend:
Removed from v.119  
changed lines
  Added in v.121

  ViewVC Help
Powered by ViewVC 1.1.26