algorithm/eas/easyrec/easyrec_request_builder.go (512 lines of code) (raw):
package easyrec
import (
"bytes"
"strings"
)
const (
MULTI_SPLIT = "|"
HA3_MULTI_SPLIT = "\u001D"
FEA_LIST_MIN_LEN = 2
)
type EasyrecRequestBuilder struct {
request *PBRequest
separator string
}
func NewEasyrecRequestBuilder() *EasyrecRequestBuilder {
return &EasyrecRequestBuilder{
request: &PBRequest{
UserFeatures: make(map[string]*PBFeature, 0),
ContextFeatures: make(map[string]*ContextFeatures, 0),
ItemFeatures: make(map[string]*ContextFeatures, 0),
// DebugLevel: int32(1),
},
separator: "\u0002",
}
}
func NewEasyrecRequestBuilderDebug() *EasyrecRequestBuilder {
builder := NewEasyrecRequestBuilder()
builder.request.DebugLevel = int32(1)
return builder
}
func NewEasyrecRequestBuilderDebugWithLevel(level int) *EasyrecRequestBuilder {
builder := NewEasyrecRequestBuilder()
builder.request.DebugLevel = int32(level)
return builder
}
func (b *EasyrecRequestBuilder) EasyrecRequest() *PBRequest {
return b.request
}
func (b *EasyrecRequestBuilder) AddUserFeature(k string, v interface{}) {
switch val := v.(type) {
case float32:
b.request.UserFeatures[k] = &PBFeature{Value: &PBFeature_FloatFeature{val}}
case int32:
b.request.UserFeatures[k] = &PBFeature{Value: &PBFeature_IntFeature{val}}
case int:
b.request.UserFeatures[k] = &PBFeature{Value: &PBFeature_IntFeature{int32(val)}}
case int64:
b.request.UserFeatures[k] = &PBFeature{Value: &PBFeature_LongFeature{val}}
case float64:
b.request.UserFeatures[k] = &PBFeature{Value: &PBFeature_DoubleFeature{val}}
case string:
b.request.UserFeatures[k] = &PBFeature{Value: &PBFeature_StringFeature{val}}
case map[int64]string:
b.request.UserFeatures[k] = &PBFeature{Value: &PBFeature_LongStringMap{LongStringMap: &LongStringMap{MapField: val}}}
case map[int64]int32:
b.request.UserFeatures[k] = &PBFeature{Value: &PBFeature_LongIntMap{LongIntMap: &LongIntMap{MapField: val}}}
case map[int64]int:
values := make(map[int64]int32, len(val))
for k, v := range val {
values[k] = int32(v)
}
b.request.UserFeatures[k] = &PBFeature{Value: &PBFeature_LongIntMap{LongIntMap: &LongIntMap{MapField: values}}}
case map[int64]int64:
b.request.UserFeatures[k] = &PBFeature{Value: &PBFeature_LongLongMap{LongLongMap: &LongLongMap{MapField: val}}}
case map[int64]float32:
b.request.UserFeatures[k] = &PBFeature{Value: &PBFeature_LongFloatMap{LongFloatMap: &LongFloatMap{MapField: val}}}
case map[int64]float64:
b.request.UserFeatures[k] = &PBFeature{Value: &PBFeature_LongDoubleMap{LongDoubleMap: &LongDoubleMap{MapField: val}}}
case map[string]string:
b.request.UserFeatures[k] = &PBFeature{Value: &PBFeature_StringStringMap{StringStringMap: &StringStringMap{MapField: val}}}
case map[string]int32:
b.request.UserFeatures[k] = &PBFeature{Value: &PBFeature_StringIntMap{StringIntMap: &StringIntMap{MapField: val}}}
case map[string]int:
values := make(map[string]int32, len(val))
for k, v := range val {
values[k] = int32(v)
}
b.request.UserFeatures[k] = &PBFeature{Value: &PBFeature_StringIntMap{StringIntMap: &StringIntMap{MapField: values}}}
case map[string]int64:
b.request.UserFeatures[k] = &PBFeature{Value: &PBFeature_StringLongMap{StringLongMap: &StringLongMap{MapField: val}}}
case map[string]float32:
b.request.UserFeatures[k] = &PBFeature{Value: &PBFeature_StringFloatMap{StringFloatMap: &StringFloatMap{MapField: val}}}
case map[string]float64:
b.request.UserFeatures[k] = &PBFeature{Value: &PBFeature_StringDoubleMap{StringDoubleMap: &StringDoubleMap{MapField: val}}}
case map[int32]string:
b.request.UserFeatures[k] = &PBFeature{Value: &PBFeature_IntStringMap{IntStringMap: &IntStringMap{MapField: val}}}
case map[int32]int32:
b.request.UserFeatures[k] = &PBFeature{Value: &PBFeature_IntIntMap{IntIntMap: &IntIntMap{MapField: val}}}
case map[int32]int64:
b.request.UserFeatures[k] = &PBFeature{Value: &PBFeature_IntLongMap{IntLongMap: &IntLongMap{MapField: val}}}
case map[int32]float32:
b.request.UserFeatures[k] = &PBFeature{Value: &PBFeature_IntFloatMap{IntFloatMap: &IntFloatMap{MapField: val}}}
case map[int32]float64:
b.request.UserFeatures[k] = &PBFeature{Value: &PBFeature_IntDoubleMap{IntDoubleMap: &IntDoubleMap{MapField: val}}}
case map[int]string:
values := make(map[int32]string, len(val))
for k, v := range val {
values[int32(k)] = v
}
b.request.UserFeatures[k] = &PBFeature{Value: &PBFeature_IntStringMap{IntStringMap: &IntStringMap{MapField: values}}}
case map[int]int32:
values := make(map[int32]int32, len(val))
for k, v := range val {
values[int32(k)] = v
}
b.request.UserFeatures[k] = &PBFeature{Value: &PBFeature_IntIntMap{IntIntMap: &IntIntMap{MapField: values}}}
case map[int]int:
values := make(map[int32]int32, len(val))
for k, v := range val {
values[int32(k)] = int32(v)
}
b.request.UserFeatures[k] = &PBFeature{Value: &PBFeature_IntIntMap{IntIntMap: &IntIntMap{MapField: values}}}
case map[int]int64:
values := make(map[int32]int64, len(val))
for k, v := range val {
values[int32(k)] = v
}
b.request.UserFeatures[k] = &PBFeature{Value: &PBFeature_IntLongMap{IntLongMap: &IntLongMap{MapField: values}}}
case map[int]float32:
values := make(map[int32]float32, len(val))
for k, v := range val {
values[int32(k)] = v
}
b.request.UserFeatures[k] = &PBFeature{Value: &PBFeature_IntFloatMap{IntFloatMap: &IntFloatMap{MapField: values}}}
case map[int]float64:
values := make(map[int32]float64, len(val))
for k, v := range val {
values[int32(k)] = v
}
b.request.UserFeatures[k] = &PBFeature{Value: &PBFeature_IntDoubleMap{IntDoubleMap: &IntDoubleMap{MapField: values}}}
case []int32:
b.request.UserFeatures[k] = &PBFeature{Value: &PBFeature_IntList{IntList: &IntList{Features: val}}}
case []int:
values := make([]int32, len(val))
for i, v := range val {
values[i] = int32(v)
}
b.request.UserFeatures[k] = &PBFeature{Value: &PBFeature_IntList{IntList: &IntList{Features: values}}}
case []int64:
b.request.UserFeatures[k] = &PBFeature{Value: &PBFeature_LongList{LongList: &LongList{Features: val}}}
case []string:
b.request.UserFeatures[k] = &PBFeature{Value: &PBFeature_StringList{StringList: &StringList{Features: val}}}
case []float32:
b.request.UserFeatures[k] = &PBFeature{Value: &PBFeature_FloatList{FloatList: &FloatList{Features: val}}}
case []float64:
b.request.UserFeatures[k] = &PBFeature{Value: &PBFeature_DoubleList{DoubleList: &DoubleList{Features: val}}}
case [][]int32:
values := make([]*IntList, len(val))
for i, v := range val {
values[i] = &IntList{Features: v}
}
b.request.UserFeatures[k] = &PBFeature{Value: &PBFeature_IntLists{IntLists: &IntLists{Lists: values}}}
case [][]int64:
values := make([]*LongList, len(val))
for i, v := range val {
values[i] = &LongList{Features: v}
}
b.request.UserFeatures[k] = &PBFeature{Value: &PBFeature_LongLists{LongLists: &LongLists{Lists: values}}}
case [][]string:
values := make([]*StringList, len(val))
for i, v := range val {
values[i] = &StringList{Features: v}
}
b.request.UserFeatures[k] = &PBFeature{Value: &PBFeature_StringLists{StringLists: &StringLists{Lists: values}}}
case [][]float32:
values := make([]*FloatList, len(val))
for i, v := range val {
values[i] = &FloatList{Features: v}
}
b.request.UserFeatures[k] = &PBFeature{Value: &PBFeature_FloatLists{FloatLists: &FloatLists{Lists: values}}}
case [][]float64:
values := make([]*DoubleList, len(val))
for i, v := range val {
values[i] = &DoubleList{Features: v}
}
b.request.UserFeatures[k] = &PBFeature{Value: &PBFeature_DoubleLists{DoubleLists: &DoubleLists{Lists: values}}}
default:
}
}
func (b *EasyrecRequestBuilder) AddUserFeatureStr(featureStr string) {
userFeas := strings.Split(featureStr, b.separator)
for _, fea := range userFeas {
if !strings.Contains(fea, ":") {
continue
}
feaList := strings.Split(fea, ":")
value := b.buildValue(feaList)
b.request.UserFeatures[feaList[0]] = &PBFeature{Value: &PBFeature_StringFeature{value}}
}
}
func (b *EasyrecRequestBuilder) AddItemId(itemId string) {
b.request.ItemIds = append(b.request.ItemIds, itemId)
}
func (b *EasyrecRequestBuilder) AddItemIds(itemIdsStr string) {
itemIds := strings.Split(itemIdsStr, ",")
b.request.ItemIds = append(b.request.ItemIds, itemIds...)
}
func (b *EasyrecRequestBuilder) buildValue(feaList []string) string {
if len(feaList) < FEA_LIST_MIN_LEN {
return ""
}
joinStr := feaList[1]
if len(feaList) > FEA_LIST_MIN_LEN {
var buf bytes.Buffer
for i := 1; i < len(feaList); i++ {
buf.WriteString(feaList[i])
if i < len(feaList)-1 {
buf.WriteString(":")
}
}
joinStr = buf.String()
}
if strings.Index(joinStr, MULTI_SPLIT) > 0 && strings.Index(joinStr, HA3_MULTI_SPLIT) > 0 {
joinStr = strings.ReplaceAll(joinStr, HA3_MULTI_SPLIT, ",")
}
return joinStr
}
func (b *EasyrecRequestBuilder) AddContextFeature(key string, features []interface{}) {
contextFeatures := &ContextFeatures{
Features: make([]*PBFeature, 0),
}
for _, f := range features {
switch val := f.(type) {
case float32:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_FloatFeature{val}})
case int32:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_IntFeature{val}})
case int:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_IntFeature{int32(val)}})
case int64:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_LongFeature{val}})
case float64:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_DoubleFeature{val}})
case string:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_StringFeature{val}})
case map[int64]string:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_LongStringMap{LongStringMap: &LongStringMap{MapField: val}}})
case map[int64]int32:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_LongIntMap{LongIntMap: &LongIntMap{MapField: val}}})
case map[int64]int:
values := make(map[int64]int32, len(val))
for k, v := range val {
values[k] = int32(v)
}
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_LongIntMap{LongIntMap: &LongIntMap{MapField: values}}})
case map[int64]int64:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_LongLongMap{LongLongMap: &LongLongMap{MapField: val}}})
case map[int64]float32:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_LongFloatMap{LongFloatMap: &LongFloatMap{MapField: val}}})
case map[int64]float64:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_LongDoubleMap{LongDoubleMap: &LongDoubleMap{MapField: val}}})
case map[string]string:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_StringStringMap{StringStringMap: &StringStringMap{MapField: val}}})
case map[string]int32:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_StringIntMap{StringIntMap: &StringIntMap{MapField: val}}})
case map[string]int:
values := make(map[string]int32, len(val))
for k, v := range val {
values[k] = int32(v)
}
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_StringIntMap{StringIntMap: &StringIntMap{MapField: values}}})
case map[string]int64:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_StringLongMap{StringLongMap: &StringLongMap{MapField: val}}})
case map[string]float32:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_StringFloatMap{StringFloatMap: &StringFloatMap{MapField: val}}})
case map[string]float64:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_StringDoubleMap{StringDoubleMap: &StringDoubleMap{MapField: val}}})
case map[int32]string:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_IntStringMap{IntStringMap: &IntStringMap{MapField: val}}})
case map[int32]int32:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_IntIntMap{IntIntMap: &IntIntMap{MapField: val}}})
case map[int32]int64:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_IntLongMap{IntLongMap: &IntLongMap{MapField: val}}})
case map[int32]float32:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_IntFloatMap{IntFloatMap: &IntFloatMap{MapField: val}}})
case map[int32]float64:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_IntDoubleMap{IntDoubleMap: &IntDoubleMap{MapField: val}}})
case map[int]string:
values := make(map[int32]string, len(val))
for k, v := range val {
values[int32(k)] = v
}
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_IntStringMap{IntStringMap: &IntStringMap{MapField: values}}})
case map[int]int32:
values := make(map[int32]int32, len(val))
for k, v := range val {
values[int32(k)] = v
}
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_IntIntMap{IntIntMap: &IntIntMap{MapField: values}}})
case map[int]int:
values := make(map[int32]int32, len(val))
for k, v := range val {
values[int32(k)] = int32(v)
}
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_IntIntMap{IntIntMap: &IntIntMap{MapField: values}}})
case map[int]int64:
values := make(map[int32]int64, len(val))
for k, v := range val {
values[int32(k)] = v
}
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_IntLongMap{IntLongMap: &IntLongMap{MapField: values}}})
case map[int]float32:
values := make(map[int32]float32, len(val))
for k, v := range val {
values[int32(k)] = v
}
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_IntFloatMap{IntFloatMap: &IntFloatMap{MapField: values}}})
case map[int]float64:
values := make(map[int32]float64, len(val))
for k, v := range val {
values[int32(k)] = v
}
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_IntDoubleMap{IntDoubleMap: &IntDoubleMap{MapField: values}}})
case []int32:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_IntList{IntList: &IntList{Features: val}}})
case []int:
values := make([]int32, len(val))
for i, v := range val {
values[i] = int32(v)
}
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_IntList{IntList: &IntList{Features: values}}})
case []int64:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_LongList{LongList: &LongList{Features: val}}})
case []string:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_StringList{StringList: &StringList{Features: val}}})
case []float32:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_FloatList{FloatList: &FloatList{Features: val}}})
case []float64:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_DoubleList{DoubleList: &DoubleList{Features: val}}})
case [][]int32:
values := make([]*IntList, len(val))
for i, v := range val {
values[i] = &IntList{Features: v}
}
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_IntLists{IntLists: &IntLists{Lists: values}}})
case [][]int64:
values := make([]*LongList, len(val))
for i, v := range val {
values[i] = &LongList{Features: v}
}
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_LongLists{LongLists: &LongLists{Lists: values}}})
case [][]string:
values := make([]*StringList, len(val))
for i, v := range val {
values[i] = &StringList{Features: v}
}
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_StringLists{StringLists: &StringLists{Lists: values}}})
case [][]float32:
values := make([]*FloatList, len(val))
for i, v := range val {
values[i] = &FloatList{Features: v}
}
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_FloatLists{FloatLists: &FloatLists{Lists: values}}})
case [][]float64:
values := make([]*DoubleList, len(val))
for i, v := range val {
values[i] = &DoubleList{Features: v}
}
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_DoubleLists{DoubleLists: &DoubleLists{Lists: values}}})
default:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_StringFeature{""}})
}
}
b.request.ContextFeatures[key] = contextFeatures
}
func (b *EasyrecRequestBuilder) AddItemFeature(key string, features []interface{}) {
contextFeatures := &ContextFeatures{
Features: make([]*PBFeature, 0, len(features)),
}
for _, f := range features {
switch val := f.(type) {
case float32:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_FloatFeature{val}})
case int32:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_IntFeature{val}})
case int:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_IntFeature{int32(val)}})
case int64:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_LongFeature{val}})
case float64:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_DoubleFeature{val}})
case string:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_StringFeature{val}})
case map[int64]string:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_LongStringMap{LongStringMap: &LongStringMap{MapField: val}}})
case map[int64]int32:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_LongIntMap{LongIntMap: &LongIntMap{MapField: val}}})
case map[int64]int:
values := make(map[int64]int32, len(val))
for k, v := range val {
values[k] = int32(v)
}
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_LongIntMap{LongIntMap: &LongIntMap{MapField: values}}})
case map[int64]int64:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_LongLongMap{LongLongMap: &LongLongMap{MapField: val}}})
case map[int64]float32:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_LongFloatMap{LongFloatMap: &LongFloatMap{MapField: val}}})
case map[int64]float64:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_LongDoubleMap{LongDoubleMap: &LongDoubleMap{MapField: val}}})
case map[string]string:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_StringStringMap{StringStringMap: &StringStringMap{MapField: val}}})
case map[string]int32:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_StringIntMap{StringIntMap: &StringIntMap{MapField: val}}})
case map[string]int:
values := make(map[string]int32, len(val))
for k, v := range val {
values[k] = int32(v)
}
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_StringIntMap{StringIntMap: &StringIntMap{MapField: values}}})
case map[string]int64:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_StringLongMap{StringLongMap: &StringLongMap{MapField: val}}})
case map[string]float32:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_StringFloatMap{StringFloatMap: &StringFloatMap{MapField: val}}})
case map[string]float64:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_StringDoubleMap{StringDoubleMap: &StringDoubleMap{MapField: val}}})
case map[int32]string:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_IntStringMap{IntStringMap: &IntStringMap{MapField: val}}})
case map[int32]int32:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_IntIntMap{IntIntMap: &IntIntMap{MapField: val}}})
case map[int32]int64:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_IntLongMap{IntLongMap: &IntLongMap{MapField: val}}})
case map[int32]float32:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_IntFloatMap{IntFloatMap: &IntFloatMap{MapField: val}}})
case map[int32]float64:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_IntDoubleMap{IntDoubleMap: &IntDoubleMap{MapField: val}}})
case map[int]string:
values := make(map[int32]string, len(val))
for k, v := range val {
values[int32(k)] = v
}
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_IntStringMap{IntStringMap: &IntStringMap{MapField: values}}})
case map[int]int32:
values := make(map[int32]int32, len(val))
for k, v := range val {
values[int32(k)] = v
}
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_IntIntMap{IntIntMap: &IntIntMap{MapField: values}}})
case map[int]int:
values := make(map[int32]int32, len(val))
for k, v := range val {
values[int32(k)] = int32(v)
}
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_IntIntMap{IntIntMap: &IntIntMap{MapField: values}}})
case map[int]int64:
values := make(map[int32]int64, len(val))
for k, v := range val {
values[int32(k)] = v
}
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_IntLongMap{IntLongMap: &IntLongMap{MapField: values}}})
case map[int]float32:
values := make(map[int32]float32, len(val))
for k, v := range val {
values[int32(k)] = v
}
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_IntFloatMap{IntFloatMap: &IntFloatMap{MapField: values}}})
case map[int]float64:
values := make(map[int32]float64, len(val))
for k, v := range val {
values[int32(k)] = v
}
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_IntDoubleMap{IntDoubleMap: &IntDoubleMap{MapField: values}}})
case []int32:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_IntList{IntList: &IntList{Features: val}}})
case []int:
values := make([]int32, len(val))
for i, v := range val {
values[i] = int32(v)
}
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_IntList{IntList: &IntList{Features: values}}})
case []int64:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_LongList{LongList: &LongList{Features: val}}})
case []string:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_StringList{StringList: &StringList{Features: val}}})
case []float32:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_FloatList{FloatList: &FloatList{Features: val}}})
case []float64:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_DoubleList{DoubleList: &DoubleList{Features: val}}})
case [][]int32:
values := make([]*IntList, len(val))
for i, v := range val {
values[i] = &IntList{Features: v}
}
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_IntLists{IntLists: &IntLists{Lists: values}}})
case [][]int64:
values := make([]*LongList, len(val))
for i, v := range val {
values[i] = &LongList{Features: v}
}
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_LongLists{LongLists: &LongLists{Lists: values}}})
case [][]string:
values := make([]*StringList, len(val))
for i, v := range val {
values[i] = &StringList{Features: v}
}
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_StringLists{StringLists: &StringLists{Lists: values}}})
case [][]float32:
values := make([]*FloatList, len(val))
for i, v := range val {
values[i] = &FloatList{Features: v}
}
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_FloatLists{FloatLists: &FloatLists{Lists: values}}})
case [][]float64:
values := make([]*DoubleList, len(val))
for i, v := range val {
values[i] = &DoubleList{Features: v}
}
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_DoubleLists{DoubleLists: &DoubleLists{Lists: values}}})
default:
contextFeatures.Features = append(contextFeatures.Features, &PBFeature{Value: &PBFeature_StringFeature{""}})
}
}
b.request.ItemFeatures[key] = contextFeatures
}