24 #include <Eigen/Dense>
29 #ifndef DOXYGEN_SHOULD_SKIP_THIS
36 typedef std::set<CImpostorNode> ImpostorsSetType;
65 bool operator<(
const CImpostorNode& rhs)
const;
88 static void check_training_setup(CFeatures* features,
const CLabels* labels, SGMatrix<float64_t>& init_transform);
94 static SGMatrix<index_t> find_target_nn(CDenseFeatures<float64_t>* x, CMulticlassLabels* y, int32_t k);
97 static Eigen::MatrixXd sum_outer_products(CDenseFeatures<float64_t>* x,
const SGMatrix<index_t> target_nn);
100 static ImpostorsSetType find_impostors(CDenseFeatures<float64_t>* x, CMulticlassLabels* y,
const Eigen::MatrixXd& L,
const SGMatrix<index_t> target_nn,
const uint32_t iter,
const uint32_t correction);
103 static void update_gradient(CDenseFeatures<float64_t>* x, Eigen::MatrixXd& G,
const ImpostorsSetType& Nc,
const ImpostorsSetType& Np,
float64_t mu);
106 static void gradient_step(Eigen::MatrixXd& L,
const Eigen::MatrixXd& G,
float64_t stepsize,
bool diagonal);
109 static void correct_stepsize(
float64_t& stepsize,
const SGVector<float64_t> obj,
const uint32_t iter);
116 static bool check_termination(
float64_t stepsize,
const SGVector<float64_t> obj, uint32_t iter, uint32_t maxiter,
float64_t stepsize_threshold,
float64_t obj_threshold);
121 static SGMatrix<float64_t> compute_pca_transform(CDenseFeatures<float64_t>* features);
127 static Eigen::MatrixXd compute_sqdists(Eigen::MatrixXd& L,
const SGMatrix<index_t> target_nn);
133 static SGVector<float64_t> compute_impostors_sqdists(Eigen::MatrixXd& L,
const ImpostorsSetType& Nexact);
136 static ImpostorsSetType find_impostors_exact(Eigen::MatrixXd& LX,
const Eigen::MatrixXd& sqdists, CMulticlassLabels* y,
const SGMatrix<index_t> target_nn, int32_t k);
139 static ImpostorsSetType find_impostors_approx(Eigen::MatrixXd& LX,
const Eigen::MatrixXd& sqdists,
const ImpostorsSetType& Nexact,
const SGMatrix<index_t> target_nn);
142 static std::vector<index_t> get_examples_label(CMulticlassLabels* y,
float64_t yi);
145 static std::vector<index_t> get_examples_gtlabel(CMulticlassLabels* y,
float64_t yi);
152 static CEuclideanDistance* setup_distance(CDenseFeatures<float64_t>* x, std::vector<index_t>& a, std::vector<index_t>& b);