DGtal  1.2.0
Profile.ih
1 /**
2  * This program is free software: you can redistribute it and/or modify
3  * it under the terms of the GNU Lesser General Public License as
4  * published by the Free Software Foundation, either version 3 of the
5  * License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program. If not, see <http://www.gnu.org/licenses/>.
14  *
15  **/
16 
17 /**
18  * @file Profile.ih
19  * @author Bertrand Kerautret (\c kerautre@loria.fr )
20  * LORIA (CNRS, UMR 7503), University of Nancy, France
21  * @author Jacques-Olivier Lachaud (\c jacques-olivier.lachaud@univ-savoie.fr )
22  * Laboratory of Mathematics (CNRS, UMR 5127), University of Savoie, France
23  *
24  * @date 2015/11/08
25  *
26  * Implementation of inline methods defined in Profile.h
27  *
28  * This file is part of the DGtal library.
29  */
30 
31 ///////////////////////////////////////////////////////////////////////////////
32 // IMPLEMENTATION of inline methods.
33 ///////////////////////////////////////////////////////////////////////////////
34 
35 //////////////////////////////////////////////////////////////////////////////
36 #include <cstdlib>
37 #include "DGtal/math/SimpleLinearRegression.h"
38 //////////////////////////////////////////////////////////////////////////////
39 
40 
41 
42 ///////////////////////////////////////////////////////////////////////////////
43 // Implementation of inline methods //
44 
45 template<typename TValueFunctor, typename TValue>
46 DGtal::Profile<TValueFunctor, TValue>::~Profile()
47 {
48  if ( myXsamples != 0 ) delete myXsamples;
49  if ( myStats != 0 ) delete myStats;
50 }
51 
52 template<typename TValueFunctor, typename TValue>
53 DGtal::Profile<TValueFunctor, TValue>::Profile()
54  : myXsamples( 0 ), myStats( 0 ), myProfileDef(MEAN), myStoreValInStats(false)
55 {
56 }
57 
58 
59 template<typename TValueFunctor, typename TValue>
60 DGtal::Profile<TValueFunctor, TValue>::Profile(ProfileType type)
61  : myXsamples( 0 ), myStats( 0 ), myProfileDef(type), myStoreValInStats(false)
62 {
63 }
64 
65 
66 template<typename TValueFunctor, typename TValue>
67 void
68 DGtal::Profile<TValueFunctor, TValue>::clear()
69 {
70  if ( myXsamples != 0 )
71  {
72  delete myXsamples;
73  myXsamples = 0;
74  }
75  if ( myStats != 0 )
76  {
77  delete myStats;
78  myStats = 0;
79  }
80 
81 }
82 
83 
84 template<typename TValueFunctor, typename TValue>
85 void
86 DGtal::Profile<TValueFunctor, TValue>::init(const unsigned int nb, const bool storeValsInStats )
87 {
88  clear();
89  myXsamples = new std::vector<TValue>( nb );
90  myStats = new std::vector< Statistic<TValue> >;
91  myStoreValInStats= storeValsInStats;
92  for ( unsigned int i = 0; i < nb; ++i )
93  {
94  (*myXsamples)[ i ] = (TValue) ( i + 1 );
95  myStats->push_back(Statistic<TValue>(storeValsInStats));
96  }
97 }
98 
99 
100 template<typename TValueFunctor, typename TValue>
101 void
102 DGtal::Profile<TValueFunctor, TValue>::addValue( const unsigned int indexX, const TValue value )
103 {
104  ASSERT( isValid() && ( indexX < myXsamples->size() ) );
105  (*myStats)[ indexX ].addValue( value );
106 }
107 
108 template<typename TValueFunctor, typename TValue>
109 void
110 DGtal::Profile<TValueFunctor, TValue>::addStatistic
111 ( const unsigned int indexX, const Statistic<TValue> & stat )
112 {
113  ASSERT( isValid() && ( indexX < myXsamples->size() ) );
114  (*myStats)[ indexX ] += stat;
115 }
116 
117 
118 template<typename TValueFunctor, typename TValue>
119 void
120 DGtal::Profile<TValueFunctor, TValue>::getProfile
121 ( std::vector<TValue> & x, std::vector<TValue> & y ) const
122 {
123  ASSERT( isValid() );
124  for ( unsigned int i = 0; i < myXsamples->size(); ++i)
125  {
126  x.push_back( myFunctor( (*myXsamples)[ i ] ) );
127  switch (myProfileDef){
128  case MAX:
129  y.push_back( myFunctor( (*myStats)[ i ].max() ) );
130  break;
131  case MIN:
132  y.push_back( myFunctor( (*myStats)[ i ].min() ) );
133  break;
134  case MEDIAN:
135  y.push_back (myFunctor( (*myStats)[ i ].median() ));
136  break;
137  case MEAN:
138  default:
139  y.push_back( myFunctor( (*myStats)[ i ].mean() ) );
140  break;
141 
142  }
143  }
144 }
145 
146 
147 
148 
149 
150 
151 template<typename TValueFunctor, typename TValue>
152 void
153 DGtal::Profile<TValueFunctor, TValue>::stopStatsSaving()
154 {
155  for ( unsigned int i = 0; i < myStats->size(); ++i )
156  {
157  ((*myStats).at( i )).terminate();
158  }
159 }
160 
161 template<typename TValueFunctor, typename TValue>
162 inline
163 DGtal::Profile<TValueFunctor, TValue>::Profile( const Profile & other ){
164  if(other.myStats!=0 && other.myXsamples!=0)
165  {
166  myXsamples = new std::vector<TValue>( other.myXsamples->size() );
167  myStats = new std::vector< Statistic<TValue> > ( other.myXsamples->size());
168  myProfileDef = other.myProfileDef;
169  myStoreValInStats= other.myStoreValInStats;
170  for ( unsigned int i = 0; i < other.myXsamples->size(); ++i )
171  {
172  (*myXsamples)[ i ] = (*other.myXsamples)[i];
173  (*myStats)[ i ] = (*other.myStats)[i];
174  }
175  }
176  else
177  {
178  myStats=0;
179  myXsamples=0;
180  myProfileDef = other.myProfileDef;
181  myStoreValInStats = false;
182  }
183 }
184 
185 template<typename TValueFunctor, typename TValue>
186 inline
187 DGtal::Profile<TValueFunctor, TValue> &
188 DGtal::Profile<TValueFunctor, TValue>::operator=
189 ( const DGtal::Profile<TValueFunctor, TValue> & other )
190 {
191  if ( this != &other )
192  {
193  if(other.myStats!=0 && other.myXsamples!=0)
194  {
195  myXsamples = new std::vector<TValue>( other.myXsamples->size() );
196  myStats = new std::vector< Statistic<TValue> > ( other.myXsamples->size());
197  myProfileDef = other.myProfileDef;
198  myStoreValInStats= other.myStoreValInStats;
199  for ( unsigned int i = 0; i < other.myXsamples->size(); ++i )
200  {
201  (*myXsamples)[ i ] = (*other.myXsamples)[i];
202  (*myStats)[ i ] = (*other.myStats)[i];
203  }
204  }
205  else
206  {
207  myStats=0;
208  myXsamples=0;
209  myProfileDef = other.myProfileDef;
210  myStoreValInStats=false;
211  }
212  }
213 
214  return *this;
215 }
216 
217 
218 
219 template<typename TValueFunctor, typename TValue>
220 template <typename Iterator>
221 inline
222 void
223 DGtal::Profile<TValueFunctor, TValue>::init( Iterator beginXvalues, Iterator endXvalues,
224  const bool storeValsInStats )
225 {
226  clear();
227  myStoreValInStats= storeValsInStats;
228  myXsamples = new std::vector<TValue>;
229  myStats = new std::vector< Statistic<TValue> >;
230 
231  unsigned int nb = 0;
232  for ( ; beginXvalues != endXvalues; ++ beginXvalues, ++nb )
233  {
234  myXsamples->push_back( * beginXvalues );
235  myStats->push_back(Statistic<TValue>( myStoreValInStats));
236  }
237 }
238 
239 
240 template<typename TValueFunctor, typename TValue>
241 void
242 DGtal::Profile<TValueFunctor, TValue>::selfDisplay( std::ostream& out ) const
243 {
244  out << "[Profile]";
245 }
246 
247 template<typename TValueFunctor, typename TValue>
248 bool
249 DGtal::Profile<TValueFunctor, TValue>::isValid() const
250 {
251  return myXsamples != 0;
252 }
253 
254 
255 
256 ///////////////////////////////////////////////////////////////////////////////
257 // Implementation of inline functions and external operators //
258 
259 /**
260  * Overloads 'operator<<' for displaying objects of class 'Profile'.
261  * @param out the output stream where the object is written.
262  * @param object the object of class 'Profile' to write.
263  * @return the output stream after the writing.
264  */
265 template<typename TValueFunctor, typename TValue>
266 inline
267 std::ostream&
268 DGtal::operator<< ( std::ostream & out,
269  const Profile<TValueFunctor, TValue> & object )
270 {
271  object.selfDisplay ( out );
272  return out;
273 }
274 
275 
276 template<typename TValueFunctor, typename TValue>
277 inline
278 void
279 DGtal::Profile<TValueFunctor, TValue>::setType(ProfileType type){
280  ASSERT(myProfileDef==MEAN || myProfileDef==MAX || myProfileDef==MIN || myProfileDef==MEDIAN);
281  myProfileDef = type;
282 }
283 
284 
285 // //
286 ///////////////////////////////////////////////////////////////////////////////
287 
288