58 #define STDEXT_NAMESPACE __gnu_cxx
59 #define std_hash_map std::map
60 #define std_hash_set std::set
68 #ifndef DOXYGEN_SHOULD_SKIP_THIS
69 struct larank_kcache_s;
70 typedef struct larank_kcache_s larank_kcache_t;
71 struct larank_kcache_s
74 larank_kcache_t *prevbuddy;
75 larank_kcache_t *nextbuddy;
99 LaRankOutput () : beta(NULL), g(NULL), kernel(NULL), l(0)
102 virtual ~LaRankOutput ()
108 void initialize (CKernel* kfunc, int64_t cache);
117 float64_t computeGradient (int32_t xi_id, int32_t yi, int32_t ythis);
125 void set_kernel_buddy (larank_kcache_t * bud);
133 inline larank_kcache_t *getKernel ()
const
138 inline int32_t get_l ()
const
162 bool isSupportVector (int32_t x_id)
const;
172 larank_kcache_t *kernel;
182 LaRankPattern (int32_t x_index, int32_t label)
183 : x_id (x_index), y (label) {}
208 ~LaRankPatterns () {}
210 void insert (
const LaRankPattern & pattern)
212 if (!isPattern (pattern.x_id))
216 std_hash_set < uint32_t >::iterator it = freeidx.begin ();
217 patterns[*it] = pattern;
218 x_id2rank[pattern.x_id] = *it;
223 patterns.push_back (pattern);
224 x_id2rank[pattern.x_id] = patterns.size () - 1;
229 int32_t rank = getPatternRank (pattern.x_id);
230 patterns[rank] = pattern;
234 void remove (uint32_t i)
236 x_id2rank[patterns[i].x_id] = 0;
237 patterns[i].clear ();
243 return patterns.size () == freeidx.size ();
246 uint32_t size ()
const
248 return patterns.size () - freeidx.size ();
251 LaRankPattern & sample ()
256 uint32_t r =
CMath::random(uint32_t(0), uint32_t(patterns.size ()-1));
257 if (patterns[r].exists ())
263 uint32_t getPatternRank (int32_t x_id)
265 return x_id2rank[x_id];
268 bool isPattern (int32_t x_id)
270 return x_id2rank[x_id] != 0;
273 LaRankPattern & getPattern (int32_t x_id)
275 uint32_t rank = x_id2rank[x_id];
276 return patterns[rank];
279 uint32_t maxcount ()
const
281 return patterns.size ();
284 LaRankPattern & operator [] (uint32_t i)
289 const LaRankPattern & operator [] (uint32_t i)
const
295 std_hash_set < uint32_t >freeidx;
296 std::vector < LaRankPattern > patterns;
297 std_hash_map < int32_t, uint32_t >x_id2rank;
301 #endif // DOXYGEN_SHOULD_SKIP_THIS
328 virtual int32_t
add (int32_t x_id, int32_t yi);
334 virtual int32_t
predict (int32_t x_id);
366 virtual const char*
get_name()
const {
return "LaRank"; }
394 typedef std_hash_map < int32_t, LaRankOutput > outputhash_t;
397 outputhash_t outputs;
399 LaRankOutput *getOutput (int32_t index);
402 LaRankPatterns patterns;
405 int32_t nb_seen_examples;
421 struct outputgradient_t
423 outputgradient_t (int32_t result_output,
float64_t result_gradient)
424 : output (result_output), gradient (result_gradient) {}
426 : output (0), gradient (0) {}
431 bool operator < (
const outputgradient_t & og)
const
433 return gradient > og.gradient;
445 struct process_return_t
447 process_return_t (
float64_t dual, int32_t yprediction)
448 : dual_increase (dual), ypred (yprediction) {}
449 process_return_t () {}
455 process_return_t process (
const LaRankPattern & pattern, process_type ptype);