00001 00022 #ifndef __MLPACK_METHODS_FASTMKS_FASTMKS_STAT_HPP 00023 #define __MLPACK_METHODS_FASTMKS_FASTMKS_STAT_HPP 00024 00025 #include <mlpack/core.hpp> 00026 #include <mlpack/core/tree/tree_traits.hpp> 00027 00028 namespace mlpack { 00029 namespace fastmks { 00030 00035 class FastMKSStat 00036 { 00037 public: 00041 FastMKSStat() : 00042 bound(-DBL_MAX), 00043 selfKernel(0.0), 00044 lastKernel(0.0), 00045 lastKernelNode(NULL) 00046 { } 00047 00055 template<typename TreeType> 00056 FastMKSStat(const TreeType& node) : 00057 bound(-DBL_MAX), 00058 lastKernel(0.0), 00059 lastKernelNode(NULL) 00060 { 00061 // Do we have to calculate the centroid? 00062 if (tree::TreeTraits<TreeType>::FirstPointIsCentroid) 00063 { 00064 // If this type of tree has self-children, then maybe the evaluation is 00065 // already done. These statistics are built bottom-up, so the child stat 00066 // should already be done. 00067 if ((tree::TreeTraits<TreeType>::HasSelfChildren) && 00068 (node.NumChildren() > 0) && 00069 (node.Point(0) == node.Child(0).Point(0))) 00070 { 00071 selfKernel = node.Child(0).Stat().SelfKernel(); 00072 } 00073 else 00074 { 00075 selfKernel = sqrt(node.Metric().Kernel().Evaluate( 00076 node.Dataset().unsafe_col(node.Point(0)), 00077 node.Dataset().unsafe_col(node.Point(0)))); 00078 } 00079 } 00080 else 00081 { 00082 // Calculate the centroid. 00083 arma::vec centroid; 00084 node.Centroid(centroid); 00085 00086 selfKernel = sqrt(node.Metric().Kernel().Evaluate(centroid, centroid)); 00087 } 00088 } 00089 00091 double SelfKernel() const { return selfKernel; } 00093 double& SelfKernel() { return selfKernel; } 00094 00096 double Bound() const { return bound; } 00098 double& Bound() { return bound; } 00099 00101 double LastKernel() const { return lastKernel; } 00103 double& LastKernel() { return lastKernel; } 00104 00106 void* LastKernelNode() const { return lastKernelNode; } 00109 void*& LastKernelNode() { return lastKernelNode; } 00110 00111 private: 00113 double bound; 00114 00116 double selfKernel; 00117 00119 double lastKernel; 00120 00123 void* lastKernelNode; 00124 }; 00125 00126 }; // namespace fastmks 00127 }; // namespace mlpack 00128 00129 #endif