Skip to content
This repository was archived by the owner on Sep 1, 2024. It is now read-only.

Commit 43dfa74

Browse files
authored
Merge pull request #11 from mathetake/add-credit-func
Modify relative rank credit function
2 parents cdf1a48 + c6bc78f commit 43dfa74

File tree

2 files changed

+106
-13
lines changed

2 files changed

+106
-13
lines changed

om/om.go

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ func (o *OptimizedMultiLeaving) GetInterleavedRanking(num int, rks ...intergo.Ra
5858
return cRks[maxIDx], nil
5959
}
6060

61-
func getCredit(rankingIdx int, itemId interface{}, idToPlacements []map[interface{}]int, creditLabel int, isSameRankingIdx bool) float64 {
61+
func (o *OptimizedMultiLeaving) GetCredit(rankingIdx int, itemId interface{}, idToPlacements []map[interface{}]int, creditLabel int, isSameRankingIdx bool) float64 {
6262
switch creditLabel {
6363
case 0:
6464
// credit = 1 / (original rank)
@@ -70,22 +70,19 @@ func getCredit(rankingIdx int, itemId interface{}, idToPlacements []map[interfac
7070
}
7171
case 1:
7272
// credit = -(relative rank - 1)
73-
numGreater := 0.0
73+
if _, ok := idToPlacements[rankingIdx][itemId]; !ok {
74+
return -float64(len(idToPlacements))
75+
}
76+
var numLess float64
7477
for i := 0; i < len(idToPlacements); i++ {
75-
_, ok1 := idToPlacements[i][itemId]
76-
_, ok2 := idToPlacements[rankingIdx][itemId]
77-
if !ok2 {
78-
continue
79-
}
80-
if !ok1 {
81-
numGreater += 1
78+
if _, ok := idToPlacements[i][itemId]; !ok {
8279
continue
8380
}
84-
if idToPlacements[i][itemId] > idToPlacements[rankingIdx][itemId] {
85-
numGreater += 1
81+
if idToPlacements[i][itemId] < idToPlacements[rankingIdx][itemId] {
82+
numLess += 1
8683
}
8784
}
88-
return -numGreater
85+
return -numLess
8986
default:
9087
// credit = 1 if output ranking idx equals input ranking idx
9188
// else credit = 0
@@ -128,7 +125,7 @@ func (o *OptimizedMultiLeaving) CalcInsensitivityAndBias(rks []intergo.Ranking,
128125
for j := 0; j < len(res); j++ {
129126
var s = 1 / float64(j+1)
130127
itemId := rks[res[j].RankingIDx].GetIDByIndex(res[j].ItemIDx)
131-
credit := getCredit(i, itemId, idToPlacements, creditLabel, res[j].RankingIDx == i)
128+
credit := o.GetCredit(i, itemId, idToPlacements, creditLabel, res[j].RankingIDx == i)
132129
ss := s * credit
133130
insensitivityMap[i] += ss
134131
insensitivityMean += ss

om/om_test.go

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,102 @@ func TestGetInterleavedRanking(t *testing.T) {
8383
}
8484
}
8585

86+
func TestGetCredit(t *testing.T) {
87+
88+
cases := []struct {
89+
rankingIdx int
90+
itemId interface{}
91+
idToPlacements []map[interface{}]int
92+
creditLabel int
93+
isSameRankingIdx bool
94+
expected float64
95+
}{
96+
{
97+
rankingIdx: 1,
98+
itemId: "item1",
99+
idToPlacements: []map[interface{}]int{
100+
{"item1": 1, "item2": 2, "item3": 3},
101+
{"item1": 3, "item2": 1, "item3": 2},
102+
{"item1": 2, "item2": 1, "item3": 3},
103+
},
104+
creditLabel: 0,
105+
isSameRankingIdx: false,
106+
expected: 0.3333333333333333,
107+
},
108+
{
109+
rankingIdx: 1,
110+
itemId: "item1",
111+
idToPlacements: []map[interface{}]int{
112+
{"item1": 1, "item2": 2, "item3": 3},
113+
{"item1": 3, "item2": 1, "item3": 2},
114+
{"item1": 2, "item2": 1, "item3": 3},
115+
},
116+
creditLabel: 1,
117+
isSameRankingIdx: false,
118+
expected: -2.0,
119+
},
120+
{
121+
rankingIdx: 0,
122+
itemId: "item2",
123+
idToPlacements: []map[interface{}]int{
124+
{"item1": 1, "item3": 3},
125+
{"item1": 3, "item2": 1, "item3": 2},
126+
{"item1": 2, "item2": 1, "item3": 3},
127+
},
128+
creditLabel: 1,
129+
isSameRankingIdx: false,
130+
expected: -3.0,
131+
},
132+
{
133+
rankingIdx: 1,
134+
itemId: "item2",
135+
idToPlacements: []map[interface{}]int{
136+
{"item1": 1, "item3": 3},
137+
{"item1": 3, "item2": 1, "item3": 2},
138+
{"item1": 2, "item2": 1, "item3": 3},
139+
},
140+
creditLabel: 1,
141+
isSameRankingIdx: false,
142+
expected: 0.0,
143+
},
144+
{
145+
rankingIdx: 0,
146+
itemId: "item2",
147+
idToPlacements: []map[interface{}]int{
148+
{"item1": 1, "item2": 2, "item3": 3},
149+
{"item1": 3, "item2": 1, "item3": 2},
150+
{"item1": 2, "item2": 1, "item3": 3},
151+
},
152+
creditLabel: 3,
153+
isSameRankingIdx: false,
154+
expected: 0,
155+
},
156+
{
157+
rankingIdx: 0,
158+
itemId: "item2",
159+
idToPlacements: []map[interface{}]int{
160+
{"item1": 1, "item2": 2, "item3": 3},
161+
{"item1": 3, "item2": 1, "item3": 2},
162+
{"item1": 2, "item2": 1, "item3": 3},
163+
},
164+
creditLabel: 3,
165+
isSameRankingIdx: true,
166+
expected: 1,
167+
},
168+
}
169+
170+
for n, tc := range cases {
171+
tcc := tc
172+
o := &om.OptimizedMultiLeaving{
173+
CreditLabel: tc.creditLabel,
174+
}
175+
t.Run(fmt.Sprintf("%d-th unit test", n), func(t *testing.T) {
176+
actual := o.GetCredit(tcc.rankingIdx, tcc.itemId, tcc.idToPlacements, tcc.creditLabel, tcc.isSameRankingIdx)
177+
assert.Equal(t, tcc.expected, actual)
178+
})
179+
}
180+
}
181+
86182
func TestPrefixConstraintSampling(t *testing.T) {
87183
o := &om.OptimizedMultiLeaving{}
88184

0 commit comments

Comments
 (0)