Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/global/HEPNumerics/include/G4SimplexDownhill.icc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

Diff markup

Differences between /global/HEPNumerics/include/G4SimplexDownhill.icc (Version 11.3.0) and /global/HEPNumerics/include/G4SimplexDownhill.icc (Version 11.1.3)


  1 //                                                  1 //
  2 // *******************************************      2 // ********************************************************************
  3 // * License and Disclaimer                         3 // * License and Disclaimer                                           *
  4 // *                                                4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of th      5 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
  6 // * the Geant4 Collaboration.  It is provided      6 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
  7 // * conditions of the Geant4 Software License      7 // * conditions of the Geant4 Software License,  included in the file *
  8 // * LICENSE and available at  http://cern.ch/      8 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
  9 // * include a list of copyright holders.           9 // * include a list of copyright holders.                             *
 10 // *                                               10 // *                                                                  *
 11 // * Neither the authors of this software syst     11 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing fin     12 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warran     13 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assum     14 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file      15 // * use.  Please see the license in the file  LICENSE  and URL above *
 16 // * for the full disclaimer and the limitatio     16 // * for the full disclaimer and the limitation of liability.         *
 17 // *                                               17 // *                                                                  *
 18 // * This  code  implementation is the result      18 // * This  code  implementation is the result of  the  scientific and *
 19 // * technical work of the GEANT4 collaboratio     19 // * technical work of the GEANT4 collaboration.                      *
 20 // * By using,  copying,  modifying or  distri     20 // * By using,  copying,  modifying or  distributing the software (or *
 21 // * any work based  on the software)  you  ag     21 // * any work based  on the software)  you  agree  to acknowledge its *
 22 // * use  in  resulting  scientific  publicati     22 // * use  in  resulting  scientific  publications,  and indicate your *
 23 // * acceptance of all terms of the Geant4 Sof     23 // * acceptance of all terms of the Geant4 Software license.          *
 24 // *******************************************     24 // ********************************************************************
 25 //                                                 25 //
 26 // G4SimplexDownhill inline methods implementa     26 // G4SimplexDownhill inline methods implementation
 27 //                                                 27 //
 28 // Author: Tatsumi Koi (SLAC/SCCS), 2007           28 // Author: Tatsumi Koi (SLAC/SCCS), 2007
 29 // -------------------------------------------     29 // --------------------------------------------------------------------------
 30                                                    30 
 31 #include <cfloat>                                  31 #include <cfloat>
 32 #include <iostream>                                32 #include <iostream>
 33 #include <numeric>                                 33 #include <numeric>
 34                                                    34 
 35 template <class T>                                 35 template <class T>
 36 void G4SimplexDownhill<T>::init()                  36 void G4SimplexDownhill<T>::init()
 37 {                                                  37 {
 38   alpha = 2.0;  // refrection coefficient:  0      38   alpha = 2.0;  // refrection coefficient:  0 < alpha
 39   beta  = 0.5;  // contraction coefficient:        39   beta  = 0.5;  // contraction coefficient:   0 < beta < 1
 40   gamma = 2.0;  // expantion coefficient:  1 <     40   gamma = 2.0;  // expantion coefficient:  1 < gamma
 41                                                    41 
 42   maximum_no_trial = 10000;                        42   maximum_no_trial = 10000;
 43   max_se           = FLT_MIN;                      43   max_se           = FLT_MIN;
 44   // max_ratio = FLT_EPSILON/1;                    44   // max_ratio = FLT_EPSILON/1;
 45   max_ratio = DBL_EPSILON / 1;                     45   max_ratio = DBL_EPSILON / 1;
 46   minimized = false;                               46   minimized = false;
 47 }                                                  47 }
 48                                                    48 
 49 /*                                                 49 /*
 50                                                    50 
 51 void G4SimplexDownhill<class T>::                  51 void G4SimplexDownhill<class T>::
 52 SetFunction( G4int n , G4double( *afunc )( std     52 SetFunction( G4int n , G4double( *afunc )( std::vector < G4double > ) )
 53 {                                                  53 {
 54    numberOfVariable = n;                           54    numberOfVariable = n;
 55    theFunction = afunc;                            55    theFunction = afunc;
 56    minimized = false;                              56    minimized = false;
 57 }                                                  57 }
 58                                                    58 
 59 */                                                 59 */
 60                                                    60 
 61 template <class T>                                 61 template <class T>
 62 G4double G4SimplexDownhill<T>::GetMinimum()        62 G4double G4SimplexDownhill<T>::GetMinimum()
 63 {                                                  63 {
 64   initialize();                                    64   initialize();
 65                                                    65 
 66   // First Tryal;                                  66   // First Tryal;
 67                                                    67 
 68   // G4cout << "Begin First Trials" << G4endl;     68   // G4cout << "Begin First Trials" << G4endl;
 69   doDownhill();                                    69   doDownhill();
 70   // G4cout << "End First Trials" << G4endl;       70   // G4cout << "End First Trials" << G4endl;
 71                                                    71 
 72   auto it_minh = std::min_element(currentHeigh     72   auto it_minh = std::min_element(currentHeights.cbegin(), currentHeights.cend());
 73   G4int imin = 0;                                  73   G4int imin = 0;
 74   G4int i    = 0;                                  74   G4int i    = 0;
 75   for(auto it = currentHeights.cbegin(); it !=     75   for(auto it = currentHeights.cbegin(); it != currentHeights.cend(); ++it)
 76   {                                                76   {
 77     if(it == it_minh)                              77     if(it == it_minh)
 78     {                                              78     {
 79       imin = i;                                    79       imin = i;
 80     }                                              80     }
 81     ++i;                                           81     ++i;
 82   }                                                82   }
 83   minimumPoint = currentSimplex[imin];             83   minimumPoint = currentSimplex[imin];
 84                                                    84 
 85   // Second Trial                                  85   // Second Trial
 86                                                    86 
 87   // std::vector< G4double > minimumPoint = cu     87   // std::vector< G4double > minimumPoint = currentSimplex[ 0 ];
 88   initialize();                                    88   initialize();
 89                                                    89 
 90   currentSimplex[numberOfVariable] = minimumPo     90   currentSimplex[numberOfVariable] = minimumPoint;
 91                                                    91 
 92   // G4cout << "Begin Second Trials" << G4endl     92   // G4cout << "Begin Second Trials" << G4endl;
 93   doDownhill();                                    93   doDownhill();
 94   // G4cout << "End Second Trials" << G4endl;      94   // G4cout << "End Second Trials" << G4endl;
 95                                                    95 
 96   G4double sum =                                   96   G4double sum =
 97     std::accumulate(currentHeights.begin(), cu     97     std::accumulate(currentHeights.begin(), currentHeights.end(), 0.0);
 98   G4double average = sum / (numberOfVariable +     98   G4double average = sum / (numberOfVariable + 1);
 99   G4double minimum = average;                      99   G4double minimum = average;
100                                                   100 
101   minimized = true;                               101   minimized = true;
102                                                   102 
103   return minimum;                                 103   return minimum;
104 }                                                 104 }
105                                                   105 
106 template <class T>                                106 template <class T>
107 void G4SimplexDownhill<T>::initialize()           107 void G4SimplexDownhill<T>::initialize()
108 {                                                 108 {
109   currentSimplex.resize(numberOfVariable + 1);    109   currentSimplex.resize(numberOfVariable + 1);
110   currentHeights.resize(numberOfVariable + 1);    110   currentHeights.resize(numberOfVariable + 1);
111                                                   111 
112   for(G4int i = 0; i < numberOfVariable; ++i)     112   for(G4int i = 0; i < numberOfVariable; ++i)
113   {                                               113   {
114     std::vector<G4double> avec(numberOfVariabl    114     std::vector<G4double> avec(numberOfVariable, 0.0);
115     avec[i]           = 1.0;                      115     avec[i]           = 1.0;
116     currentSimplex[i] = std::move(avec);       << 116     currentSimplex[i] = avec;
117   }                                               117   }
118                                                   118 
119   // std::vector< G4double > avec ( numberOfVa    119   // std::vector< G4double > avec ( numberOfVariable , 0.0 );
120   std::vector<G4double> avec(numberOfVariable,    120   std::vector<G4double> avec(numberOfVariable, 1);
121   currentSimplex[numberOfVariable] = std::move << 121   currentSimplex[numberOfVariable] = avec;
122 }                                                 122 }
123                                                   123 
124 template <class T>                                124 template <class T>
125 void G4SimplexDownhill<T>::calHeights()           125 void G4SimplexDownhill<T>::calHeights()
126 {                                                 126 {
127   for(G4int i = 0; i <= numberOfVariable; ++i)    127   for(G4int i = 0; i <= numberOfVariable; ++i)
128   {                                               128   {
129     currentHeights[i] = getValue(currentSimple    129     currentHeights[i] = getValue(currentSimplex[i]);
130   }                                               130   }
131 }                                                 131 }
132                                                   132 
133 template <class T>                                133 template <class T>
134 std::vector<G4double> G4SimplexDownhill<T>::ca    134 std::vector<G4double> G4SimplexDownhill<T>::calCentroid(G4int ih)
135 {                                                 135 {
136   std::vector<G4double> centroid(numberOfVaria    136   std::vector<G4double> centroid(numberOfVariable, 0.0);
137                                                   137 
138   G4int i = 0;                                    138   G4int i = 0;
139   for(const auto & it : currentSimplex)           139   for(const auto & it : currentSimplex)
140   {                                               140   {
141     if(i != ih)                                   141     if(i != ih)
142     {                                             142     {
143       for(G4int j = 0; j < numberOfVariable; +    143       for(G4int j = 0; j < numberOfVariable; ++j)
144       {                                           144       {
145         centroid[j] += it[j] / numberOfVariabl    145         centroid[j] += it[j] / numberOfVariable;
146       }                                           146       }
147     }                                             147     }
148     ++i;                                          148     ++i;
149   }                                               149   }
150                                                   150 
151   return centroid;                                151   return centroid;
152 }                                                 152 }
153                                                   153 
154 template <class T>                                154 template <class T>
155 std::vector<G4double> G4SimplexDownhill<T>::ge    155 std::vector<G4double> G4SimplexDownhill<T>::getReflectionPoint(
156   std::vector<G4double> p, std::vector<G4doubl    156   std::vector<G4double> p, std::vector<G4double> centroid)
157 {                                                 157 {
158   // G4cout << "Reflection" << G4endl;            158   // G4cout << "Reflection" << G4endl;
159                                                   159 
160   std::vector<G4double> reflectionP(numberOfVa    160   std::vector<G4double> reflectionP(numberOfVariable, 0.0);
161                                                   161 
162   for(G4int i = 0; i < numberOfVariable; ++i)     162   for(G4int i = 0; i < numberOfVariable; ++i)
163   {                                               163   {
164     reflectionP[i] = (1 + alpha) * centroid[i]    164     reflectionP[i] = (1 + alpha) * centroid[i] - alpha * p[i];
165   }                                               165   }
166                                                   166 
167   return reflectionP;                             167   return reflectionP;
168 }                                                 168 }
169                                                   169 
170 template <class T>                                170 template <class T>
171 std::vector<G4double> G4SimplexDownhill<T>::ge    171 std::vector<G4double> G4SimplexDownhill<T>::getExpansionPoint(
172   std::vector<G4double> p, std::vector<G4doubl    172   std::vector<G4double> p, std::vector<G4double> centroid)
173 {                                                 173 {
174   // G4cout << "Expantion" << G4endl;             174   // G4cout << "Expantion" << G4endl;
175                                                   175 
176   std::vector<G4double> expansionP(numberOfVar    176   std::vector<G4double> expansionP(numberOfVariable, 0.0);
177                                                   177 
178   for(G4int i = 0; i < numberOfVariable; ++i)     178   for(G4int i = 0; i < numberOfVariable; ++i)
179   {                                               179   {
180     expansionP[i] = (1 - gamma) * centroid[i]     180     expansionP[i] = (1 - gamma) * centroid[i] + gamma * p[i];
181   }                                               181   }
182                                                   182 
183   return expansionP;                              183   return expansionP;
184 }                                                 184 }
185                                                   185 
186 template <class T>                                186 template <class T>
187 std::vector<G4double> G4SimplexDownhill<T>::ge    187 std::vector<G4double> G4SimplexDownhill<T>::getContractionPoint(
188   std::vector<G4double> p, std::vector<G4doubl    188   std::vector<G4double> p, std::vector<G4double> centroid)
189 {                                                 189 {
190   std::vector<G4double> contractionP(numberOfV    190   std::vector<G4double> contractionP(numberOfVariable, 0.0);
191                                                   191 
192   for(G4int i = 0; i < numberOfVariable; ++i)     192   for(G4int i = 0; i < numberOfVariable; ++i)
193   {                                               193   {
194     contractionP[i] = (1 - beta) * centroid[i]    194     contractionP[i] = (1 - beta) * centroid[i] + beta * p[i];
195   }                                               195   }
196                                                   196 
197   return contractionP;                            197   return contractionP;
198 }                                                 198 }
199                                                   199 
200 template <class T>                                200 template <class T>
201 G4bool G4SimplexDownhill<T>::isItGoodEnough()     201 G4bool G4SimplexDownhill<T>::isItGoodEnough()
202 {                                                 202 {
                                                   >> 203   G4bool result = false;
                                                   >> 204 
203   G4double sum =                                  205   G4double sum =
204     std::accumulate(currentHeights.begin(), cu    206     std::accumulate(currentHeights.begin(), currentHeights.end(), 0.0);
205   G4double average = sum / (numberOfVariable +    207   G4double average = sum / (numberOfVariable + 1);
206                                                   208 
207   G4double delta = 0.0;                           209   G4double delta = 0.0;
208   for(G4int i = 0; i <= numberOfVariable; ++i)    210   for(G4int i = 0; i <= numberOfVariable; ++i)
209   {                                               211   {
210     delta += std::abs(currentHeights[i] - aver    212     delta += std::abs(currentHeights[i] - average);
211   }                                               213   }
212                                                   214 
213   G4bool result = false;                       << 215   if(delta / (numberOfVariable + 1) / average < max_ratio)
214   if (average > 0.0)                           << 
215   {                                               216   {
216     result = ((delta / (numberOfVariable + 1)  << 217     result = true;
217   }                                               218   }
                                                   >> 219 
218   return result;                                  220   return result;
219 }                                                 221 }
220                                                   222 
221 template <class T>                                223 template <class T>
222 void G4SimplexDownhill<T>::doDownhill()           224 void G4SimplexDownhill<T>::doDownhill()
223 {                                                 225 {
224   G4int nth_trial = 0;                            226   G4int nth_trial = 0;
225                                                   227 
226   while(nth_trial < maximum_no_trial)             228   while(nth_trial < maximum_no_trial)
227   {                                               229   {
228     calHeights();                                 230     calHeights();
229                                                   231 
230     if(isItGoodEnough())                          232     if(isItGoodEnough())
231     {                                             233     {
232       break;                                      234       break;
233     }                                             235     }
234                                                   236 
235     auto it_maxh = std::max_element(currentHei    237     auto it_maxh = std::max_element(currentHeights.cbegin(), currentHeights.cend());
236     auto it_minh = std::min_element(currentHei    238     auto it_minh = std::min_element(currentHeights.cbegin(), currentHeights.cend());
237                                                   239 
238     G4double h_H = *it_maxh;                      240     G4double h_H = *it_maxh;
239     G4double h_L = *it_minh;                      241     G4double h_L = *it_minh;
240                                                   242 
241     G4int ih      = 0;                            243     G4int ih      = 0;
242     G4int il      = 0;                            244     G4int il      = 0;
243     G4double h_H2 = 0.0;                          245     G4double h_H2 = 0.0;
244     G4int i       = 0;                            246     G4int i       = 0;
245     for(auto it = currentHeights.cbegin(); it     247     for(auto it = currentHeights.cbegin(); it != currentHeights.cend(); ++it)
246     {                                             248     {
247       if(it == it_maxh)                           249       if(it == it_maxh)
248       {                                           250       {
249         ih = i;                                   251         ih = i;
250       }                                           252       }
251       else                                        253       else
252       {                                           254       {
253         h_H2 = std::max(h_H2, *it);               255         h_H2 = std::max(h_H2, *it);
254       }                                           256       }
255                                                   257 
256       if(it == it_minh)                           258       if(it == it_minh)
257       {                                           259       {
258         il = i;                                   260         il = i;
259       }                                           261       }
260       ++i;                                        262       ++i;
261     }                                             263     }
262                                                   264 
263     std::vector<G4double> centroidPoint = calC    265     std::vector<G4double> centroidPoint = calCentroid(ih);
264                                                   266 
265     // REFLECTION                                 267     // REFLECTION
266     std::vector<G4double> reflectionPoint =       268     std::vector<G4double> reflectionPoint =
267       getReflectionPoint(currentSimplex[ih], c    269       getReflectionPoint(currentSimplex[ih], centroidPoint);
268                                                   270 
269     G4double h = getValue(reflectionPoint);       271     G4double h = getValue(reflectionPoint);
270                                                   272 
271     if(h <= h_L)                                  273     if(h <= h_L)
272     {                                             274     {
273       // EXPANSION                                275       // EXPANSION
274       std::vector<G4double> expansionPoint =      276       std::vector<G4double> expansionPoint =
275         getExpansionPoint(reflectionPoint, std << 277         getExpansionPoint(reflectionPoint, centroidPoint);
276       G4double hh = getValue(expansionPoint);     278       G4double hh = getValue(expansionPoint);
277                                                   279 
278       if(hh <= h_L)                               280       if(hh <= h_L)
279       {                                           281       {
280         // Replace                                282         // Replace
281         currentSimplex[ih] = std::move(expansi << 283         currentSimplex[ih] = expansionPoint;
282         // G4cout << "A" << G4endl;               284         // G4cout << "A" << G4endl;
283       }                                           285       }
284       else                                        286       else
285       {                                           287       {
286         // Replace                                288         // Replace
287         currentSimplex[ih] = std::move(reflect << 289         currentSimplex[ih] = reflectionPoint;
288         // G4cout << "B1" << G4endl;              290         // G4cout << "B1" << G4endl;
289       }                                           291       }
290     }                                             292     }
291     else                                          293     else
292     {                                             294     {
293       if(h <= h_H2)                               295       if(h <= h_H2)
294       {                                           296       {
295         // Replace                                297         // Replace
296         currentSimplex[ih] = std::move(reflect << 298         currentSimplex[ih] = reflectionPoint;
297         // G4cout << "B2" << G4endl;              299         // G4cout << "B2" << G4endl;
298       }                                           300       }
299       else                                        301       else
300       {                                           302       {
301         if(h <= h_H)                              303         if(h <= h_H)
302         {                                         304         {
303           // Replace                              305           // Replace
304           currentSimplex[ih] = std::move(refle << 306           currentSimplex[ih] = reflectionPoint;
305           // G4cout << "BC" << G4endl;            307           // G4cout << "BC" << G4endl;
306         }                                         308         }
307         // CONTRACTION                            309         // CONTRACTION
308         std::vector<G4double> contractionPoint    310         std::vector<G4double> contractionPoint =
309           getContractionPoint(currentSimplex[i << 311           getContractionPoint(currentSimplex[ih], centroidPoint);
310         G4double hh = getValue(contractionPoin    312         G4double hh = getValue(contractionPoint);
311         if(hh <= h_H)                             313         if(hh <= h_H)
312         {                                         314         {
313           // Replace                              315           // Replace
314           currentSimplex[ih] = std::move(contr << 316           currentSimplex[ih] = contractionPoint;
315           // G4cout << "C" << G4endl;             317           // G4cout << "C" << G4endl;
316         }                                         318         }
317         else                                      319         else
318         {                                         320         {
319           // Replace                              321           // Replace
320           for(G4int j = 0; j <= numberOfVariab    322           for(G4int j = 0; j <= numberOfVariable; ++j)
321           {                                       323           {
322             std::vector<G4double> vec(numberOf    324             std::vector<G4double> vec(numberOfVariable, 0.0);
323             for(G4int k = 0; k < numberOfVaria    325             for(G4int k = 0; k < numberOfVariable; ++k)
324             {                                     326             {
325               vec[k] = (currentSimplex[j][k] +    327               vec[k] = (currentSimplex[j][k] + currentSimplex[il][k]) / 2.0;
326             }                                     328             }
327             currentSimplex[j] = std::move(vec) << 329             currentSimplex[j] = vec;
328           }                                       330           }
329         }                                         331         }
330       }                                           332       }
331     }                                             333     }
332                                                   334 
333     ++nth_trial;                                  335     ++nth_trial;
334   }                                               336   }
335 }                                                 337 }
336                                                   338 
337 template <class T>                                339 template <class T>
338 std::vector<G4double> G4SimplexDownhill<T>::Ge    340 std::vector<G4double> G4SimplexDownhill<T>::GetMinimumPoint()
339 {                                                 341 {
340   if(!minimized)                                  342   if(!minimized)
341   {                                               343   {
342     GetMinimum();                                 344     GetMinimum();
343   }                                               345   }
344                                                   346 
345   auto it_minh = std::min_element(currentHeigh    347   auto it_minh = std::min_element(currentHeights.cbegin(), currentHeights.cend());
346                                                   348 
347   G4int imin = 0;                                 349   G4int imin = 0;
348   G4int i    = 0;                                 350   G4int i    = 0;
349   for(auto it = currentHeights.cbegin(); it !=    351   for(auto it = currentHeights.cbegin(); it != currentHeights.cend(); ++it)
350   {                                               352   {
351     if(it == it_minh)                             353     if(it == it_minh)
352     {                                             354     {
353       imin = i;                                   355       imin = i;
354     }                                             356     }
355     ++i;                                          357     ++i;
356   }                                               358   }
357   minimumPoint = currentSimplex[imin];            359   minimumPoint = currentSimplex[imin];
358                                                   360 
359   return minimumPoint;                            361   return minimumPoint;
360 }                                                 362 }
361                                                   363