56 #include <ext/hash_map>
57 #include <ext/hash_set>
59 #define STDEXT_NAMESPACE __gnu_cxx
60 #define std_hash_map STDEXT_NAMESPACE::hash_map
61 #define std_hash_set STDEXT_NAMESPACE::hash_set
69 #ifndef DOXYGEN_SHOULD_SKIP_THIS
70 struct larank_kcache_s;
71 typedef struct larank_kcache_s larank_kcache_t;
72 struct larank_kcache_s
75 larank_kcache_t *prevbuddy;
76 larank_kcache_t *nextbuddy;
100 LaRankOutput () : beta(NULL), g(NULL), kernel(NULL), l(0)
103 virtual ~LaRankOutput ()
109 void initialize (CKernel* kfunc, int64_t cache);
118 float64_t computeGradient (int32_t xi_id, int32_t yi, int32_t ythis);
126 void set_kernel_buddy (larank_kcache_t * bud);
134 inline larank_kcache_t *getKernel ()
const
139 inline int32_t get_l ()
const
163 bool isSupportVector (int32_t x_id)
const;
173 larank_kcache_t *kernel;
183 LaRankPattern (int32_t x_index, int32_t label)
184 : x_id (x_index), y (label) {}
209 ~LaRankPatterns () {}
211 void insert (
const LaRankPattern & pattern)
213 if (!isPattern (pattern.x_id))
217 std_hash_set < uint32_t >::iterator it = freeidx.begin ();
218 patterns[*it] = pattern;
219 x_id2rank[pattern.x_id] = *it;
224 patterns.push_back (pattern);
225 x_id2rank[pattern.x_id] = patterns.size () - 1;
230 int32_t rank = getPatternRank (pattern.x_id);
231 patterns[rank] = pattern;
235 void remove (uint32_t i)
237 x_id2rank[patterns[i].x_id] = 0;
238 patterns[i].clear ();
244 return patterns.size () == freeidx.size ();
247 uint32_t size ()
const
249 return patterns.size () - freeidx.size ();
252 LaRankPattern & sample ()
258 if (patterns[r].exists ())
264 uint32_t getPatternRank (int32_t x_id)
266 return x_id2rank[x_id];
269 bool isPattern (int32_t x_id)
271 return x_id2rank[x_id] != 0;
274 LaRankPattern & getPattern (int32_t x_id)
276 uint32_t rank = x_id2rank[x_id];
277 return patterns[rank];
280 uint32_t maxcount ()
const
282 return patterns.size ();
285 LaRankPattern & operator [] (uint32_t i)
290 const LaRankPattern & operator [] (uint32_t i)
const
296 std_hash_set < uint32_t >freeidx;
297 std::vector < LaRankPattern > patterns;
298 std_hash_map < int32_t, uint32_t >x_id2rank;
302 #endif // DOXYGEN_SHOULD_SKIP_THIS
329 virtual int32_t
add (int32_t x_id, int32_t yi);
335 virtual int32_t
predict (int32_t x_id);
367 inline virtual const char*
get_name()
const {
return "LaRank"; }
395 typedef std_hash_map < int32_t, LaRankOutput > outputhash_t;
398 outputhash_t outputs;
400 LaRankOutput *getOutput (int32_t index);
403 LaRankPatterns patterns;
406 int32_t nb_seen_examples;
422 struct outputgradient_t
424 outputgradient_t (int32_t result_output,
float64_t result_gradient)
425 : output (result_output), gradient (result_gradient) {}
427 : output (0), gradient (0) {}
432 bool operator < (
const outputgradient_t & og)
const
434 return gradient > og.gradient;
446 struct process_return_t
448 process_return_t (
float64_t dual, int32_t yprediction)
449 : dual_increase (dual), ypred (yprediction) {}
450 process_return_t () {}
456 process_return_t process (
const LaRankPattern & pattern, process_type ptype);