This file is indexed.

/usr/include/mlpack/methods/fastmks/fastmks.hpp is in libmlpack-dev 1.0.10-1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
/**
 * @file fastmks.hpp
 * @author Ryan Curtin
 *
 * Definition of the FastMKS class, which implements fast exact max-kernel
 * search.
 *
 * This file is part of MLPACK 1.0.10.
 *
 * MLPACK is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation, either version 3 of the License, or (at your option) any
 * later version.
 *
 * MLPACK is distributed in the hope that it will be useful, but WITHOUT ANY
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
 * A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
 * details (LICENSE.txt).
 *
 * You should have received a copy of the GNU General Public License along with
 * MLPACK.  If not, see <http://www.gnu.org/licenses/>.
 */
#ifndef __MLPACK_METHODS_FASTMKS_FASTMKS_HPP
#define __MLPACK_METHODS_FASTMKS_FASTMKS_HPP

#include <mlpack/core.hpp>
#include <mlpack/core/metrics/ip_metric.hpp>
#include "fastmks_stat.hpp"
#include <mlpack/core/tree/cover_tree.hpp>

namespace mlpack {
namespace fastmks /** Fast max-kernel search. */ {

/**
 * An implementation of fast exact max-kernel search.  Given a query dataset and
 * a reference dataset (or optionally just a reference dataset which is also
 * used as the query dataset), fast exact max-kernel search finds, for each
 * point in the query dataset, the k points in the reference set with maximum
 * kernel value K(p_q, p_r), where k is a specified parameter and K() is a
 * Mercer kernel.
 *
 * For more information, see the following paper.
 *
 * @code
 * @inproceedings{curtin2013fast,
 *   title={Fast Exact Max-Kernel Search},
 *   author={Curtin, Ryan R. and Ram, Parikshit and Gray, Alexander G.},
 *   booktitle={Proceedings of the 2013 SIAM International Conference on Data
 *       Mining (SDM 13)},
 *   year={2013}
 * }
 * @endcode
 *
 * This class allows specification of the type of kernel and also of the type of
 * tree.  FastMKS can be run on kernels that work on arbitrary objects --
 * however, this only works with cover trees and other trees that are built only
 * on points in the dataset (and not centroids of regions or anything like
 * that).
 *
 * @tparam KernelType Type of kernel to run FastMKS with.
 * @tparam TreeType Type of tree to run FastMKS with; it must have metric
 *     IPMetric<KernelType>.
 */
template<
    typename KernelType,
    typename TreeType = tree::CoverTree<metric::IPMetric<KernelType>,
        tree::FirstPointIsRoot, FastMKSStat>
>
class FastMKS
{
 public:
  /**
   * Create the FastMKS object using the reference set as the query set.
   * Optionally, specify whether or not single-tree search or naive
   * (brute-force) search should be used.
   *
   * @param referenceSet Set of data to run FastMKS on.
   * @param single Whether or not to run single-tree search.
   * @param naive Whether or not to run brute-force (naive) search.
   */
  FastMKS(const arma::mat& referenceSet,
          const bool single = false,
          const bool naive = false);

  /**
   * Create the FastMKS object using separate reference and query sets.
   * Optionally, specify whether or not single-tree search or naive
   * (brute-force) search should be used.
   *
   * @param referenceSet Reference set of data for FastMKS.
   * @param querySet Set of query points for FastMKS.
   * @param single Whether or not to run single-tree search.
   * @param naive Whether or not to run brute-force (naive) search.
   */
  FastMKS(const arma::mat& referenceSet,
          const arma::mat& querySet,
          const bool single = false,
          const bool naive = false);

  /**
   * Create the FastMKS object using the reference set as the query set, and
   * with an initialized kernel.  This is useful for when the kernel stores
   * state.  Optionally, specify whether or not single-tree search or naive
   * (brute-force) search should be used.
   *
   * @param referenceSet Reference set of data for FastMKS.
   * @param kernel Initialized kernel.
   * @param single Whether or not to run single-tree search.
   * @param naive Whether or not to run brute-force (naive) search.
   */
  FastMKS(const arma::mat& referenceSet,
          KernelType& kernel,
          const bool single = false,
          const bool naive = false);

  /**
   * Create the FastMKS object using separate reference and query sets, and with
   * an initialized kernel.  This is useful for when the kernel stores state.
   * Optionally, specify whether or not single-tree search or naive
   * (brute-force) search should be used.
   *
   * @param referenceSet Reference set of data for FastMKS.
   * @param querySet Set of query points for FastMKS.
   * @param kernel Initialized kernel.
   * @param single Whether or not to run single-tree search.
   * @param naive Whether or not to run brute-force (naive) search.
   */
  FastMKS(const arma::mat& referenceSet,
          const arma::mat& querySet,
          KernelType& kernel,
          const bool single = false,
          const bool naive = false);

  /**
   * Create the FastMKS object with an already-initialized tree built on the
   * reference points.  Be sure that the tree is built with the metric type
   * IPMetric<KernelType>.  For this constructor, the reference set and the
   * query set are the same points.  Optionally, whether or not to run
   * single-tree search or brute-force (naive) search can be specified.
   *
   * @param referenceSet Reference set of data for FastMKS.
   * @param referenceTree Tree built on reference data.
   * @param single Whether or not to run single-tree search.
   * @param naive Whether or not to run brute-force (naive) search.
   */
  FastMKS(const arma::mat& referenceSet,
          TreeType* referenceTree,
          const bool single = false,
          const bool naive = false);

  /**
   * Create the FastMKS object with already-initialized trees built on the
   * reference and query points.  Be sure that the trees are built with the
   * metric type IPMetric<KernelType>.  Optionally, whether or not to run
   * single-tree search or naive (brute-force) search can be specified.
   *
   * @param referenceSet Reference set of data for FastMKS.
   * @param referenceTree Tree built on reference data.
   * @param querySet Set of query points for FastMKS.
   * @param queryTree Tree built on query data.
   * @param single Whether or not to use single-tree search.
   * @param naive Whether or not to use naive (brute-force) search.
   */
  FastMKS(const arma::mat& referenceSet,
          TreeType* referenceTree,
          const arma::mat& querySet,
          TreeType* queryTree,
          const bool single = false,
          const bool naive = false);

  //! Destructor for the FastMKS object.
  ~FastMKS();

  /**
   * Search for the maximum inner products of the query set (or if no query set
   * was passed, the reference set is used).  The resulting maximum inner
   * products are stored in the products matrix and the corresponding point
   * indices are stores in the indices matrix.  The results for each point in
   * the query set are stored in the corresponding column of the indices and
   * products matrices; for instance, the index of the point with maximum inner
   * product to point 4 in the query set will be stored in row 0 and column 4 of
   * the indices matrix.
   *
   * @param k The number of maximum kernels to find.
   * @param indices Matrix to store resulting indices of max-kernel search in.
   * @param products Matrix to store resulting max-kernel values in.
   */
  void Search(const size_t k,
              arma::Mat<size_t>& indices,
              arma::mat& products);

  //! Get the inner-product metric induced by the given kernel.
  const metric::IPMetric<KernelType>& Metric() const { return metric; }
  //! Modify the inner-product metric induced by the given kernel.
  metric::IPMetric<KernelType>& Metric() { return metric; }

  /**
   * Returns a string representation of this object.
   */
  std::string ToString() const;

 private:
  //! The reference dataset.
  const arma::mat& referenceSet;
  //! The query dataset.
  const arma::mat& querySet;

  //! The tree built on the reference dataset.
  TreeType* referenceTree;
  //! The tree built on the query dataset.  This is NULL if there is no query
  //! set.
  TreeType* queryTree;

  //! If true, this object created the trees and is responsible for them.
  bool treeOwner;

  //! If true, single-tree search is used.
  bool single;
  //! If true, naive (brute-force) search is used.
  bool naive;

  //! The instantiated inner-product metric induced by the given kernel.
  metric::IPMetric<KernelType> metric;

  //! Utility function.  Copied too many times from too many places.
  void InsertNeighbor(arma::Mat<size_t>& indices,
                      arma::mat& products,
                      const size_t queryIndex,
                      const size_t pos,
                      const size_t neighbor,
                      const double distance);
};

}; // namespace fastmks
}; // namespace mlpack

// Include implementation.
#include "fastmks_impl.hpp"

#endif