43 #include <shogun/lib/external/libqp.h> 47 using namespace internal;
55 static const float64_t* get_Q_col(uint32_t i);
56 static void print_state(libqp_state_T state);
82 opt_max_iterations=10000;
89 return &m_Q[m_Q.num_rows*i];
94 SG_SDEBUG(
"libqp state: primal=%f\n", state.QP);
100 float64_t sum_m_mmds=std::accumulate(m_mmds.data(), m_mmds.data()+m_mmds.size(), 0);
102 if (std::any_of(m_mmds.data(), m_mmds.data()+m_mmds.size(), [](
float64_t& value) {
return value > 0; }))
104 SG_SDEBUG(
"At least one MMD entry is positive, performing optimisation\n")
106 std::vector<float64_t> Q_diag(num_kernels);
107 std::vector<float64_t> f(num_kernels, 0);
108 std::vector<float64_t> lb(num_kernels, 0);
112 std::fill(weights.data(), weights.data()+weights.size(), 1.0/sum_m_mmds);
114 for (
index_t i=0; i<num_kernels; ++i)
117 SG_SDEBUG(
"starting libqp optimization\n");
131 SG_SDEBUG(
"libqp returns: nIts=%d, exit_flag: %d\n", qp_exitflag.nIter, qp_exitflag.exitflag);
136 for (
index_t i=0; i<weights.vlen; ++i)
138 if (weights[i]<opt_low_cut)
140 SG_SDEBUG(
"lowcut: weight[%i]=%f<%f setting to zero\n", i, weights[i], opt_low_cut);
143 sum_weights+=weights[i];
147 std::for_each(weights.data(), weights.data()+weights.size(), [&sum_weights](
float64_t& weight)
154 SG_SWARNING(
"All mmd estimates are negative. This is techically possible," 155 "although extremely rare. Consider using different kernels. " 156 "This combination will lead to a bad two-sample test. Since any" 157 "combination is bad, will now just return equally distributed " 162 std::fill(weights.data(), weights.data()+weights.size(), 1.0/num_kernels);
170 self=std::unique_ptr<Self>(
new Self(mmds, Q));
173 OptimizationSolver::~OptimizationSolver()
180 return self->solve();
SGVector< float64_t > m_mmds
static const float64_t INFTY
infinity
static void print_state(libqp_state_T state)
static const float64_t * get_Q_col(uint32_t i)
static SGMatrix< float64_t > m_Q
all of classes and functions are contained in the shogun namespace
index_t opt_max_iterations
SGVector< float64_t > solve() const
Self(SGVector< float64_t > mmds, SGMatrix< float64_t > Q)