[mlpack-svn] r10159 - mlpack/trunk/src/contrib/nslagle/myKDE

fastlab-svn at coffeetalk-1.cc.gatech.edu fastlab-svn at coffeetalk-1.cc.gatech.edu
Sat Nov 5 17:59:21 EDT 2011


Author: nslagle
Date: 2011-11-05 17:59:21 -0400 (Sat, 05 Nov 2011)
New Revision: 10159

Modified:
   mlpack/trunk/src/contrib/nslagle/myKDE/kde_dual_tree.hpp
   mlpack/trunk/src/contrib/nslagle/myKDE/kde_dual_tree_impl.hpp
Log:
mlpack/contrib/nslagle: correct for bounds; track the success level for each bandwidth

Modified: mlpack/trunk/src/contrib/nslagle/myKDE/kde_dual_tree.hpp
===================================================================
--- mlpack/trunk/src/contrib/nslagle/myKDE/kde_dual_tree.hpp	2011-11-05 20:56:46 UTC (rev 10158)
+++ mlpack/trunk/src/contrib/nslagle/myKDE/kde_dual_tree.hpp	2011-11-05 21:59:21 UTC (rev 10159)
@@ -59,7 +59,7 @@
   size_t nextAvailableNodeIndex;
   std::vector<size_t> referenceShuffledIndices;
   std::vector<size_t> queryShuffledIndices;
-  arma::Mat<size_t> touched;
+  std::vector<size_t> bestLevelByBandwidth;
   arma::mat referenceData;
   arma::mat queryData;
   arma::mat upperBoundLevelByBandwidth;

Modified: mlpack/trunk/src/contrib/nslagle/myKDE/kde_dual_tree_impl.hpp
===================================================================
--- mlpack/trunk/src/contrib/nslagle/myKDE/kde_dual_tree_impl.hpp	2011-11-05 20:56:46 UTC (rev 10158)
+++ mlpack/trunk/src/contrib/nslagle/myKDE/kde_dual_tree_impl.hpp	2011-11-05 21:59:21 UTC (rev 10159)
@@ -59,8 +59,10 @@
 std::vector<double> KdeDualTree<TKernel, TTree>::Calculate()
 {
   /* calculate the bandwidths */
+  std::cout << "epsilon=" << epsilon << std::endl;
   bandwidths.clear();
   inverseBandwidths.clear();
+  bestLevelByBandwidth.clear();
 
   if (bandwidthCount > 1)
   {
@@ -69,12 +71,14 @@
     {
       bandwidths.push_back(lowBandwidth + bandwidthDelta * bIndex);
       inverseBandwidths.push_back(1.0 / bandwidths.back());
+      bestLevelByBandwidth.push_back(-1);
     }
   }
   else
   {
     bandwidths.push_back(lowBandwidth);
     inverseBandwidths.push_back(1.0 / lowBandwidth);
+    bestLevelByBandwidth.push_back(-1);
   }
 
   /* resize the critical matrices */
@@ -126,9 +130,11 @@
 
   for (size_t bIndex = 0; bIndex < bandwidthCount; ++bIndex)
   {
-    double currentLogLikelihood = (upperBoundLevelByBandwidth(finalLevel,bIndex) +
-                                   lowerBoundLevelByBandwidth(finalLevel,bIndex)) / 2.0;
-    std::cout << bandwidths[bIndex] << "," << inverseBandwidths[bIndex] << "," << currentLogLikelihood << std::endl;
+    double currentLogLikelihood = (upperBoundLevelByBandwidth(
+                                     bestLevelByBandwidth[bIndex],bIndex) +
+                                   lowerBoundLevelByBandwidth(
+                                     bestLevelByBandwidth[bIndex],bIndex)) / 2.0;
+    std::cout << bandwidths[bIndex] << "," << inverseBandwidths[bIndex] << "," << currentLogLikelihood << "; RANGE " << lowerBoundLevelByBandwidth(bestLevelByBandwidth[bIndex],bIndex) << ", " << upperBoundLevelByBandwidth(bestLevelByBandwidth[bIndex],bIndex) << std::endl;
     if (currentLogLikelihood > maxLogLikelihood)
     {
       maxLogLikelihood = currentLogLikelihood;
@@ -198,22 +204,20 @@
          bIndex <= queueCurrent.bUpperIndex;
          ++bIndex)
     {
-      if (abs(lowerBoundLevelByBandwidth(v,bIndex)) > DBL_EPSILON)
+      double constraint = abs((upperBoundLevelByBandwidth(v,bIndex) -
+                           lowerBoundLevelByBandwidth(v,bIndex)) /
+                           lowerBoundLevelByBandwidth(v,bIndex));
+      if (constraint >= epsilon)
       {
-        double constraint = abs((upperBoundLevelByBandwidth(v,bIndex) -
-                             lowerBoundLevelByBandwidth(v,bIndex)) /
-                             lowerBoundLevelByBandwidth(v,bIndex));
-        if (constraint > epsilon)
-        {
-          epsilonCondition = false;
-          break;
-        }
+        epsilonCondition = false;
+        break;
       }
       else
       {
-        /* we haven't set this lower bound */
-        epsilonCondition = false;
-        break;
+        if (bestLevelByBandwidth[bIndex] == (size_t)-1)
+        {
+          bestLevelByBandwidth[bIndex] = v;
+        }
       }
     }
     /* return */
@@ -301,23 +305,25 @@
         /* the continue forces us to undo the previous node */
         continue;
       }
-      else
-      {
-        /* winnow according to the delta conditions */
-        std::vector<bool>::iterator bIt = deltaCondition.begin();
-        while (*bIt && bIt != deltaCondition.end())
-        {
-          ++bIt;
-          ++bLower;
-        }
-        bIt = deltaCondition.end();
-        --bIt;
-        while (*bIt && bIt != deltaCondition.begin())
-        {
-          --bIt;
-          --bUpper;
-        }
-      }
+//      else
+//      {
+//        /* winnow according to the delta conditions */
+//        std::vector<bool>::iterator bIt = deltaCondition.begin();
+//        while (*bIt && bIt != deltaCondition.end())
+//        {
+//          ++bIt;
+//          //bestLevelByBandwidth[bLower] = v;
+//          ++bLower;
+//        }
+//        bIt = deltaCondition.end();
+//        --bIt;
+//        while (*bIt && bIt != deltaCondition.begin())
+//        {
+//          --bIt;
+//          //bestLevelByBandwidth[bUpper] = v;
+//          --bUpper;
+//        }
+//      }
     }
     else /* the priority exceeds the maximum available; back the node out */
     {
@@ -433,60 +439,42 @@
                                          size_t* bUpper)
 {
   size_t bIndex = *bLower;
-  double constraint = delta;
+  double constraint = epsilon;
   bool enteredTheLoop = false;
   /* bring the lower up */
-  if (abs(lowerBoundLevelByBandwidth(level,bIndex)) > DBL_EPSILON)
+  constraint = abs((upperBoundLevelByBandwidth(level,bIndex) -
+                lowerBoundLevelByBandwidth(level,bIndex)) /
+                lowerBoundLevelByBandwidth(level,bIndex));
+  while (constraint < epsilon && bIndex <= *bUpper)
   {
+    enteredTheLoop = true;
+    bestLevelByBandwidth[bIndex] = level;
+    ++bIndex;
     constraint = abs((upperBoundLevelByBandwidth(level,bIndex) -
                   lowerBoundLevelByBandwidth(level,bIndex)) /
                   lowerBoundLevelByBandwidth(level,bIndex));
   }
-  while (constraint < delta && bIndex <= *bUpper)
-  {
-    enteredTheLoop = true;
-    ++bIndex;
-    if (lowerBoundLevelByBandwidth(level,bIndex) > DBL_EPSILON)
-    {
-      constraint = (upperBoundLevelByBandwidth(level,bIndex) -
-                    lowerBoundLevelByBandwidth(level,bIndex)) /
-                    lowerBoundLevelByBandwidth(level,bIndex);
-    }
-    else
-    {
-      break;
-    }
-  }
   if (enteredTheLoop)
   {
     *bLower = bIndex - 1;
   }
 
   bIndex = *bUpper;
-  constraint = delta;
+  constraint = epsilon;
   enteredTheLoop = false;
   /* bring the lower up */
-  if (abs(lowerBoundLevelByBandwidth(level,bIndex)) > DBL_EPSILON)
+  constraint = abs((upperBoundLevelByBandwidth(level,bIndex) -
+                lowerBoundLevelByBandwidth(level,bIndex)) /
+                lowerBoundLevelByBandwidth(level,bIndex));
+  while (constraint < epsilon && bIndex >= *bLower)
   {
+    enteredTheLoop = true;
+    bestLevelByBandwidth[bIndex] = level;
+    --bIndex;
     constraint = abs((upperBoundLevelByBandwidth(level,bIndex) -
                   lowerBoundLevelByBandwidth(level,bIndex)) /
                   lowerBoundLevelByBandwidth(level,bIndex));
   }
-  while (constraint < delta && bIndex >= *bLower)
-  {
-    enteredTheLoop = true;
-    --bIndex;
-    if (lowerBoundLevelByBandwidth(level,bIndex) > DBL_EPSILON)
-    {
-      constraint = (upperBoundLevelByBandwidth(level,bIndex) -
-                    lowerBoundLevelByBandwidth(level,bIndex)) /
-                    lowerBoundLevelByBandwidth(level,bIndex);
-    }
-    else
-    {
-      break;
-    }
-  }
   if (enteredTheLoop)
   {
     *bUpper = bIndex + 1;
@@ -529,7 +517,7 @@
     }
     for (size_t bIndex = lowerBIndex; bIndex <= upperBIndex; ++bIndex)
     {
-      upperBoundQPointByBandwidth(q, bIndex) -= sizeOfTNode;
+      upperBoundQPointByBandwidth(q, bIndex) -= inverseBandwidths[bIndex] * sizeOfTNode;
     }
   }
   for (size_t bIndex = lowerBIndex; bIndex <= upperBIndex; ++bIndex)




More information about the mlpack-svn mailing list