[mlpack-svn] r16748 - mlpack/trunk/src/mlpack/core/optimizers/sa

fastlab-svn at coffeetalk-1.cc.gatech.edu fastlab-svn at coffeetalk-1.cc.gatech.edu
Wed Jul 2 17:15:06 EDT 2014


Author: rcurtin
Date: Wed Jul  2 17:15:05 2014
New Revision: 16748

Log:
Refactor to avoid holding variables in the class itself (reduces the size of SA a bit).  Remove an unnecessary variable too.  Minor changes, no public API changes.


Modified:
   mlpack/trunk/src/mlpack/core/optimizers/sa/sa.hpp
   mlpack/trunk/src/mlpack/core/optimizers/sa/sa_impl.hpp

Modified: mlpack/trunk/src/mlpack/core/optimizers/sa/sa.hpp
==============================================================================
--- mlpack/trunk/src/mlpack/core/optimizers/sa/sa.hpp	(original)
+++ mlpack/trunk/src/mlpack/core/optimizers/sa/sa.hpp	Wed Jul  2 17:15:05 2014
@@ -170,15 +170,13 @@
   arma::mat moveSize;
 
 
-  // following variables are initialized inside Optimize
-  arma::mat accept;
-  double energy;
-  size_t idx;
-  size_t nVars;
-  size_t sweepCounter;
+  void GenerateMove(arma::mat& iterate,
+                    arma::mat& accept,
+                    double& energy,
+                    size_t& idx,
+                    size_t& sweepCounter);
 
-  void GenerateMove(arma::mat& iterate);
-  void MoveControl(size_t nMoves);
+  void MoveControl(size_t nMoves, arma::mat& accept);
 };
 
 }; // namespace optimization

Modified: mlpack/trunk/src/mlpack/core/optimizers/sa/sa_impl.hpp
==============================================================================
--- mlpack/trunk/src/mlpack/core/optimizers/sa/sa_impl.hpp	(original)
+++ mlpack/trunk/src/mlpack/core/optimizers/sa/sa_impl.hpp	Wed Jul  2 17:15:05 2014
@@ -45,7 +45,6 @@
   maxMove.fill(maxMoveCoef);
   moveSize.set_size(rows, cols);
   moveSize.fill(initMoveCoef);
-  accept.zeros(rows, cols);
 }
 
 //! Optimize the function (minimize).
@@ -60,24 +59,25 @@
 
   size_t i;
   size_t frozenCount = 0;
-  energy = function.Evaluate(iterate);
+  double energy = function.Evaluate(iterate);
   size_t oldEnergy = energy;
   math::RandomSeed(std::time(NULL));
 
-  nVars = rows * cols;
-  idx = 0;
-  sweepCounter = 0;
+  size_t idx = 0;
+  size_t sweepCounter = 0;
+
+  arma::mat accept(rows, cols);
   accept.zeros();
 
   // Initial Moves to get rid of dependency of initial states.
   for (i = 0; i < initMoves; ++i)
-    GenerateMove(iterate);
+    GenerateMove(iterate, accept, energy, idx, sweepCounter);
 
   // Iterating and cooling.
   for (i = 0; i != maxIterations; ++i)
   {
     oldEnergy = energy;
-    GenerateMove(iterate);
+    GenerateMove(iterate, accept, energy, idx, sweepCounter);
     temperature = coolingSchedule.nextTemperature(temperature, energy);
 
     // Determine if the optimization has entered (or continues to be in) a
@@ -88,7 +88,7 @@
       frozenCount = 0;
 
     // Terminate, if possible.
-    if (frozenCount >= maxToleranceSweep * nVars)
+    if (frozenCount >= maxToleranceSweep * iterate.n_elem)
     {
       Log::Debug << "SA: minimized within tolerance " << tolerance << " for "
           << maxToleranceSweep << " sweeps after " << i << " iterations; "
@@ -115,7 +115,11 @@
     typename CoolingScheduleType
 >
 void SA<FunctionType, CoolingScheduleType>::GenerateMove(
-    arma::mat& iterate)
+    arma::mat& iterate,
+    arma::mat& accept,
+    double& energy,
+    size_t& idx,
+    size_t& sweepCounter)
 {
   double prevEnergy = energy;
   double prevValue = iterate(idx);
@@ -147,7 +151,7 @@
   }
 
   ++idx;
-  if (idx == nVars) // Finished with a sweep.
+  if (idx == iterate.n_elem) // Finished with a sweep.
   {
     idx = 0;
     ++sweepCounter;
@@ -155,7 +159,7 @@
 
   if (sweepCounter == moveCtrlSweep) // Do MoveControl().
   {
-    MoveControl(moveCtrlSweep);
+    MoveControl(moveCtrlSweep, accept);
     sweepCounter = 0;
   }
 }
@@ -179,7 +183,7 @@
     typename CoolingScheduleType
 >
 void SA<FunctionType, CoolingScheduleType>::MoveControl(
-    size_t nMoves)
+    size_t nMoves, arma::mat& accept)
 {
   arma::mat target;
   target.copy_size(accept);
@@ -190,7 +194,7 @@
 
   // To avoid the use of element-wise arma::min(), which is only available in
   // Armadillo after v3.930, we use a for loop here instead.
-  for (size_t i = 0; i < nVars; ++i)
+  for (size_t i = 0; i < accept.n_elem; ++i)
     moveSize(i) = (moveSize(i) > maxMove(i)) ? maxMove(i) : moveSize(i);
 
   accept.zeros();



More information about the mlpack-svn mailing list