Prechádzať zdrojové kódy

新增594实验无分享支持逻辑

gufengshou1 1 rok pred
rodič
commit
711e669530
12 zmenil súbory, kde vykonal 262 pridanie a 39 odobranie
  1. 2 0
      ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/score/ScorerUtils.java
  2. 15 0
      ad-engine-server/src/main/resources/feeds_score_config_share0.conf
  3. 1 1
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/helper/RuleParamHelper.java
  4. 50 33
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/impl/PredictModelServiceImpl.java
  5. 1 1
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/model/threshold/AddThresholdPredictModel.java
  6. 1 1
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/model/threshold/BasicThresholdPredictModel.java
  7. 1 1
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/model/threshold/MultiplyThresholdPredictModel.java
  8. 130 0
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/model/threshold/NoShareUserThresholdPredictModel.java
  9. 1 1
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/model/threshold/RoiThresholdPredictModel.java
  10. 1 1
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/model/threshold/ScoreThresholdPredictModel.java
  11. 15 0
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/param/ThresholdPredictModelParam.java
  12. 44 0
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/Share0MergeBreakScorer.java

+ 2 - 0
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/score/ScorerUtils.java

@@ -24,6 +24,7 @@ public final class ScorerUtils {
     public static String THOMPSON_CONF = "feeds_score_config_thompson.conf";
 
     public static String BREAK_CONFIG = "feeds_score_config_break.conf";
+    public static String SHARE0_CONFIG = "feeds_score_config_share0.conf";
 
 
     public static void warmUp() {
@@ -31,6 +32,7 @@ public final class ScorerUtils {
         ScorerUtils.init(BASE_CONF);
         ScorerUtils.init(THOMPSON_CONF);
         ScorerUtils.init(BREAK_CONFIG);
+        ScorerUtils.init(SHARE0_CONFIG);
 
     }
 

+ 15 - 0
ad-engine-server/src/main/resources/feeds_score_config_share0.conf

@@ -0,0 +1,15 @@
+scorer-config = {
+  str-ros-score-config = {
+      scorer-name = "com.tzld.piaoquan.ad.engine.service.score.VlogAdRosAndStrScorer"
+      scorer-priority = 97
+  }
+  break-score-config = {
+      scorer-name = "com.tzld.piaoquan.ad.engine.service.score.VlogAdBreakScorer"
+      scorer-priority = 96
+  }
+  break-merge-config = {
+      scorer-name = "com.tzld.piaoquan.ad.engine.service.score.Share0MergeBreakScorer"
+      scorer-priority = 1
+  }
+
+}

+ 1 - 1
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/param/RuleParamHelper.java → ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/helper/RuleParamHelper.java

@@ -1,4 +1,4 @@
-package com.tzld.piaoquan.ad.engine.service.predict.param;
+package com.tzld.piaoquan.ad.engine.service.predict.helper;
 
 import com.tzld.piaoquan.ad.engine.commons.redis.AlgorithmRedisHelper;
 import com.tzld.piaoquan.ad.engine.service.predict.constant.RuleRedisKeyConst;

+ 50 - 33
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/impl/PredictModelServiceImpl.java

@@ -16,7 +16,6 @@ import com.tzld.piaoquan.ad.engine.service.predict.container.AbTestConfigContain
 import com.tzld.piaoquan.ad.engine.service.predict.container.ThresholdModelContainer;
 import com.tzld.piaoquan.ad.engine.service.predict.container.TopOneVideoContainer;
 import com.tzld.piaoquan.ad.engine.service.predict.param.RoiThresholdPredictModelParam;
-import com.tzld.piaoquan.ad.engine.service.predict.param.RuleParamHelper;
 import com.tzld.piaoquan.ad.engine.service.predict.param.ThresholdPredictModelParam;
 import com.tzld.piaoquan.ad.engine.service.predict.param.request.RoiPredictModelRequestParam;
 import com.tzld.piaoquan.ad.engine.service.predict.param.request.ThresholdPredictModelRequestParam;
@@ -29,7 +28,6 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 import java.util.*;
-import java.util.concurrent.ConcurrentHashMap;
 
 @Service
 public class PredictModelServiceImpl implements PredictModelService {
@@ -57,6 +55,9 @@ public class PredictModelServiceImpl implements PredictModelService {
     @Value("${ad.predict.break.exp.code:570}")
     private String adPredictBreakExpCode;
 
+    @Value("${ad.predict.share0.exp.code:000}")
+    private String adPredictNoShareUserExpCode;
+
     @Value("${ad.predict.param.testIds:0}")
     private String testIds;
     @Value("${ad.predict.without.ad.video_ids:0}")
@@ -83,17 +84,23 @@ public class PredictModelServiceImpl implements PredictModelService {
         Map<String,Object> result=new HashMap<>();
         List<Map<String,Object>> mapList=(List)requestParam.getAbExpInfo().get("ab_test002");
         Map<String,List<JSONObject>> configMap=new HashMap<>();
+        //该用户所有实验合集
+        Set<String> expCodes=new HashSet<>();
+        boolean isHit = false;
         for(Map<String,Object> map:mapList){
-            if("555".equals(map.getOrDefault("abExpCode",""))){
+            String expCode=map.getOrDefault("abExpCode","").toString();
+            expCodes.add(expCode);
+            if("555".equals(expCode)){
                 configMap=JSONObject.parseObject(map.get("configValue").toString(),Map.class);
-                break;
+            }
+            //判断570是否命中
+            if (StringUtils.equals(expCode, adPredictBreakExpCode)) {
+                isHit = true;
             }
         }
         int hourOfDay= DateUtils.getCurrentHour();
         Boolean condition1=abTestConfigContainer.inAdTimeTest(requestParam.getAbExpInfo());
         Boolean condition2=abTestConfigContainer.containsCode(configMap,requestParam.getAbTestCode());
-
-
         if(condition1
                 &&
                 condition2
@@ -111,28 +118,26 @@ public class PredictModelServiceImpl implements PredictModelService {
             return result;
         }
 
-
-        boolean isHit = false;
-
-        try {
-            JSONObject object = requestParam.getAbExpInfo();
-            if (object != null) {
-                JSONArray array = object.getJSONArray("ab_test002");
-                if (array != null) {
-                    List<Map<String, String>> abExps = JSONUtils.fromJson(array.toJSONString(),
-                            new TypeToken<List<Map<String, String>>>() {
-                            }, Collections.emptyList());
-                    for (Map<String, String> abExpMap : abExps) {
-                        if (StringUtils.equals(abExpMap.get("abExpCode"), adPredictBreakExpCode)) {
-                            isHit = true;
-                            break;
-                        }
-                    }
-                }
-            }
-        } catch (Exception e) {
-            log.error("adPredict hit error", e);
-        }
+        //人群选择算法判定-570
+//        try {
+//            JSONObject object = requestParam.getAbExpInfo();
+//            if (object != null) {
+//                JSONArray array = object.getJSONArray("ab_test002");
+//                if (array != null) {
+//                    List<Map<String, String>> abExps = JSONUtils.fromJson(array.toJSONString(),
+//                            new TypeToken<List<Map<String, String>>>() {
+//                            }, Collections.emptyList());
+//                    for (Map<String, String> abExpMap : abExps) {
+//                        if (StringUtils.equals(abExpMap.get("abExpCode"), adPredictBreakExpCode)) {
+//                            isHit = true;
+//                            break;
+//                        }
+//                    }
+//                }
+//            }
+//        } catch (Exception e) {
+//            log.error("adPredict hit error", e);
+//        }
 
         String[] abParamArr = abConfig.getAbParams(requestParam.getAbTestCode(), requestParam.getAbExpInfo());
         if (abParamArr == null) {
@@ -148,7 +153,6 @@ public class PredictModelServiceImpl implements PredictModelService {
             requestParam.setAbTestCode("ab5");
         }
 
-
         HashMap<String, Map<String, Object>> abConfigMap = abConfig.getAbConfigMap();
         Map<String, Object> abtestParam = abConfigMap.getOrDefault(abtestId + "-" + abTestConfigTag, null);
         if (abtestParam == null) {
@@ -159,13 +163,15 @@ public class PredictModelServiceImpl implements PredictModelService {
         requestParam.setRegion(requestParam.getRegion().replace("省", ""));
         requestParam.setCity(requestParam.getCity().replace("市", ""));
 
-
         // Determine the group to which mid belongs
         String groupClassKey = (String) abtestParam.get("group_class_key");
         String midGroupKeyName = RuleRedisKeyConst.KEY_NAME_PREFIX_MID_GROUP + groupClassKey + ":" + requestParam.getMid();
+        //没有时为新用户或者无分享用户
         String midGroup = redisHelper.getString(midGroupKeyName);
+        String shareType =null;
         if (midGroup == null) {
             midGroup = "mean_group";
+            shareType="noShare";
         }
 
         String[] noAdMidGroupList = new String[0];
@@ -209,12 +215,23 @@ public class PredictModelServiceImpl implements PredictModelService {
         modelParam.setAbtestParam(abtestParam);
         modelParam.setMidGroup(midGroup);
         modelParam.setExtraParam(new HashMap<>());
+        modelParam.addUserExtraFuture("shareType",shareType);
         setExtraParam(modelParam);
 
         if (adPredictBreakSwitch || isHit) {
-            result = ThresholdModelContainer.
-                    getThresholdPredictModel("modelV2")
-                    .predict(modelParam);
+            if(expCodes.contains(adPredictNoShareUserExpCode)&&"noShare".equals(shareType)){
+                result = ThresholdModelContainer.
+                        getThresholdPredictModel("share0")
+                        .predict(modelParam);
+            }else if(expCodes.contains(adPredictNoShareUserExpCode)&&"return25_nmids".equals(shareType)){
+                result.put("mid_group", midGroup);
+                result.put("ad_predict", 1);
+                result.put("no_ad_strategy", adPredictNoShareUserExpCode+"_"+midGroup);
+            }else {
+                result = ThresholdModelContainer.
+                        getThresholdPredictModel("modelV2")
+                        .predict(modelParam);
+            }
         } else {
             Object thresholdMixFunc = abtestParam.getOrDefault("threshold_mix_func", "basic");
             result = ThresholdModelContainer.

+ 1 - 1
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/model/threshold/AddThresholdPredictModel.java

@@ -3,7 +3,7 @@ package com.tzld.piaoquan.ad.engine.service.predict.model.threshold;
 
 import com.tzld.piaoquan.ad.engine.commons.redis.AlgorithmRedisHelper;
 import com.tzld.piaoquan.ad.engine.service.predict.calculator.ThresholdPredictCalculator;
-import com.tzld.piaoquan.ad.engine.service.predict.param.RuleParamHelper;
+import com.tzld.piaoquan.ad.engine.service.predict.helper.RuleParamHelper;
 import com.tzld.piaoquan.ad.engine.service.predict.param.ThresholdCalculateParam;
 import com.tzld.piaoquan.ad.engine.service.predict.param.ThresholdPredictModelParam;
 import org.springframework.beans.factory.annotation.Autowired;

+ 1 - 1
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/model/threshold/BasicThresholdPredictModel.java

@@ -2,7 +2,7 @@ package com.tzld.piaoquan.ad.engine.service.predict.model.threshold;
 
 import com.tzld.piaoquan.ad.engine.commons.redis.AlgorithmRedisHelper;
 import com.tzld.piaoquan.ad.engine.service.predict.calculator.ThresholdPredictCalculator;
-import com.tzld.piaoquan.ad.engine.service.predict.param.RuleParamHelper;
+import com.tzld.piaoquan.ad.engine.service.predict.helper.RuleParamHelper;
 import com.tzld.piaoquan.ad.engine.service.predict.param.ThresholdCalculateParam;
 import com.tzld.piaoquan.ad.engine.service.predict.param.ThresholdPredictModelParam;
 import org.springframework.beans.factory.annotation.Autowired;

+ 1 - 1
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/model/threshold/MultiplyThresholdPredictModel.java

@@ -2,7 +2,7 @@ package com.tzld.piaoquan.ad.engine.service.predict.model.threshold;
 
 import com.tzld.piaoquan.ad.engine.commons.redis.AlgorithmRedisHelper;
 import com.tzld.piaoquan.ad.engine.service.predict.calculator.ThresholdPredictCalculator;
-import com.tzld.piaoquan.ad.engine.service.predict.param.RuleParamHelper;
+import com.tzld.piaoquan.ad.engine.service.predict.helper.RuleParamHelper;
 import com.tzld.piaoquan.ad.engine.service.predict.param.ThresholdCalculateParam;
 import com.tzld.piaoquan.ad.engine.service.predict.param.ThresholdPredictModelParam;
 import org.springframework.beans.factory.annotation.Autowired;

+ 130 - 0
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/model/threshold/NoShareUserThresholdPredictModel.java

@@ -0,0 +1,130 @@
+package com.tzld.piaoquan.ad.engine.service.predict.model.threshold;
+
+import com.alibaba.fastjson.JSONObject;
+import com.tzld.piaoquan.ad.engine.commons.score.AdConfig;
+import com.tzld.piaoquan.ad.engine.commons.score.ScoreParam;
+import com.tzld.piaoquan.ad.engine.commons.score.ScorerUtils;
+import com.tzld.piaoquan.ad.engine.commons.util.CommonCollectionUtils;
+import com.tzld.piaoquan.ad.engine.service.predict.container.PredictPidContainer;
+import com.tzld.piaoquan.ad.engine.service.predict.container.ThresholdModelContainer;
+import com.tzld.piaoquan.ad.engine.service.predict.param.ThresholdPredictModelParam;
+import com.tzld.piaoquan.ad.engine.service.remote.FeatureRemoteService;
+import com.tzld.piaoquan.recommend.feature.domain.ad.base.AdRankItem;
+import com.tzld.piaoquan.recommend.feature.domain.ad.base.AdRequestContext;
+import com.tzld.piaoquan.recommend.feature.domain.ad.base.UserAdFeature;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static com.tzld.piaoquan.ad.engine.commons.score.ScorerUtils.BREAK_CONFIG;
+import static com.tzld.piaoquan.ad.engine.commons.score.ScorerUtils.SHARE0_CONFIG;
+
+@Component
+public class NoShareUserThresholdPredictModel extends ThresholdPredictModel {
+    private final static Logger log = LoggerFactory.getLogger(NoShareUserThresholdPredictModel.class);
+    @Autowired
+    private FeatureRemoteService featureRemoteService;
+
+    @Value("${ad.predict.threshold.share0:1}")
+    private double threshold;
+    @Value("${ad.model.pid.type.share0:-1}")
+    private double pidType;
+
+    @Override
+    String initName() {
+        return "share0";
+    }
+
+    @Override
+    public Map<String, Object> predict(ThresholdPredictModelParam modelParam) {
+
+        UserAdFeature userAdFeature = featureRemoteService.getUserAdFeature(modelParam.getMid());
+        if (userAdFeature == null) {
+            userAdFeature = new UserAdFeature();
+        }
+        List<AdRankItem> rankItems = featureRemoteService.getAllAdFeatureList(CommonCollectionUtils.toList(AdConfig.getAdIds(), id -> id.toString()));
+
+        // scoreParam
+        AdRequestContext context = new AdRequestContext();
+        context.setApptype(modelParam.getAppType().toString());
+        context.setMachineinfoBrand(modelParam.getMachineInfo().getBrand());
+        context.setMachineinfoModel(modelParam.getMachineInfo().getModel());
+        context.setMachineinfoSdkversion(modelParam.getMachineInfo().getSdkVersion());
+        context.setMachineinfoWchatversion(modelParam.getMachineInfo().getWeChatVersion());
+        LocalDateTime date = LocalDateTime.now();
+        context.setHour(date.getHour() + "");
+        context.setDay(date.format(DateTimeFormatter.ofPattern("yyyyMMdd")));
+        context.setWeek(date.getDayOfWeek().getValue() + "");
+
+        ScoreParam scoreParam = new ScoreParam();
+        scoreParam.setRequestContext(context);
+        scoreParam.getRequestContext().setRegion(modelParam.getRegion().replace("省", ""));
+        scoreParam.getRequestContext().setCity(modelParam.getCity().replace("市", ""));
+        scoreParam.setVideoId(modelParam.getVideoId());
+        scoreParam.setMid(modelParam.getMid());
+        scoreParam.setUid("");
+        scoreParam.setProvince(modelParam.getRegion());
+        scoreParam.setCity(modelParam.getCity());
+        scoreParam.setExtraParam(modelParam.getExtraParam());
+
+        List<AdRankItem> scoreResult = ScorerUtils
+                .getScorerPipeline(SHARE0_CONFIG)
+                .scoring(scoreParam, userAdFeature, rankItems);
+
+        // 找出ctr*cvr最大的
+//        double max = -1;
+        AdRankItem maxItem = scoreResult.get(0);
+//        for (int i = 0; i < scoreResult.size(); i++) {
+//            AdRankItem item = scoreResult.get(i);
+//            double ctrCvr = item.getCtr() * item.getCvr();
+//            if (ctrCvr > max) {
+//                max = ctrCvr;
+//                maxItem = item;
+//            }
+//        }
+        double realThreshold=Double.parseDouble(
+                scoreParam.getExtraParam().getOrDefault("Share0Predict_"+modelParam.getAppType(),threshold).toString()
+        );
+        int adPredict;
+        //加入pid逻辑
+        if(pidType>1){
+            realThreshold=realThreshold+ PredictPidContainer.getPidLambda(
+                    scoreParam.getExtraParam().getOrDefault("predict_test_id","default")+"_"+modelParam.getAppType());
+        }else if(pidType>=0){
+            realThreshold=PredictPidContainer.getLatestThreshold(
+                    scoreParam.getExtraParam().getOrDefault("predict_test_id","default")+"_"+modelParam.getAppType());
+        }
+
+
+        if (maxItem != null && maxItem.getScore() < realThreshold) {
+            // If final score is below threshold, do not show the ad
+            adPredict = 1;
+        } else {
+            // Otherwise, show the ad
+            adPredict = 2;
+        }
+        if(maxItem != null){
+            //删除多余打印
+            maxItem.setItemFeature(null);
+            maxItem.setLrSampleString(null);
+            maxItem.setLrSampleStringOrgin(null);
+            log.info("svc=Share0ThresholdPredictModel_predict modelName=ScoreV2ThresholdPredictModel maxItem={} extraParam={} app_type={} realThreshold={}",
+                    JSONObject.toJSONString(maxItem), JSONObject.toJSONString(scoreParam.getExtraParam()),modelParam.getAppType(),realThreshold);
+        }
+
+        Map<String, Object> result = new HashMap<>();
+        result.put("threshold", realThreshold);
+        result.put("score", maxItem == null ? -1 : maxItem.getScore());
+        result.put("ad_predict", adPredict);
+
+        return result;
+    }
+}

+ 1 - 1
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/model/threshold/RoiThresholdPredictModel.java

@@ -6,7 +6,7 @@ import com.tzld.piaoquan.ad.engine.service.predict.config.RoiModelConfig;
 import com.tzld.piaoquan.ad.engine.service.predict.constant.RuleRedisKeyConst;
 import com.tzld.piaoquan.ad.engine.service.predict.container.RoiPredictParamContainer;
 import com.tzld.piaoquan.ad.engine.service.predict.param.RoiThresholdPredictModelParam;
-import com.tzld.piaoquan.ad.engine.service.predict.param.RuleParamHelper;
+import com.tzld.piaoquan.ad.engine.service.predict.helper.RuleParamHelper;
 import com.tzld.piaoquan.ad.engine.service.predict.param.ThresholdPredictModelParam;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;

+ 1 - 1
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/model/threshold/ScoreThresholdPredictModel.java

@@ -5,7 +5,7 @@ import com.tzld.piaoquan.ad.engine.commons.redis.AlgorithmRedisHelper;
 import com.tzld.piaoquan.ad.engine.service.predict.config.AdOutV1OnlineWeightConfig;
 import com.tzld.piaoquan.ad.engine.service.predict.constant.RuleRedisKeyConst;
 import com.tzld.piaoquan.ad.engine.service.predict.container.ThresholdModelContainer;
-import com.tzld.piaoquan.ad.engine.service.predict.param.RuleParamHelper;
+import com.tzld.piaoquan.ad.engine.service.predict.helper.RuleParamHelper;
 import com.tzld.piaoquan.ad.engine.service.predict.param.ThresholdPredictModelParam;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;

+ 15 - 0
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/param/ThresholdPredictModelParam.java

@@ -6,6 +6,7 @@ import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
+import org.apache.poi.ss.formula.functions.T;
 
 import java.util.Date;
 import java.util.HashMap;
@@ -42,4 +43,18 @@ public class ThresholdPredictModelParam {
     MachineInfoParam machineInfo = new MachineInfoParam();
 
     Map<String,Object> extraParam=new HashMap<>();
+    Map<String,Object> userExtraFutureMap=new HashMap<>();
+
+    public void addUserExtraFuture(String key,Object val){
+        if(userExtraFutureMap!=null){
+            userExtraFutureMap.put(key,val);
+        }
+    }
+
+    public T getUserExtraFuture(String key){
+        if(userExtraFutureMap!=null){
+            return (T)userExtraFutureMap.getOrDefault(key,new T());
+        }
+        return null;
+    }
 }

+ 44 - 0
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/Share0MergeBreakScorer.java

@@ -0,0 +1,44 @@
+package com.tzld.piaoquan.ad.engine.service.score;
+
+
+import com.tzld.piaoquan.ad.engine.commons.score.BaseLRModelScorer;
+import com.tzld.piaoquan.ad.engine.commons.score.ScoreParam;
+import com.tzld.piaoquan.ad.engine.commons.score.ScorerConfigInfo;
+import com.tzld.piaoquan.recommend.feature.domain.ad.base.AdRankItem;
+import com.tzld.piaoquan.recommend.feature.domain.ad.base.UserAdFeature;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.math.BigDecimal;
+import java.util.Collections;
+import java.util.List;
+
+
+//@Service
+public class Share0MergeBreakScorer extends BaseLRModelScorer {
+
+    private final static Logger log = LoggerFactory.getLogger(Share0MergeBreakScorer.class);
+
+
+    public Share0MergeBreakScorer(ScorerConfigInfo configInfo) {
+        super(configInfo);
+    }
+
+
+    @Override
+    public List<AdRankItem> scoring(final ScoreParam param,
+                                    final UserAdFeature userFeature,
+                                    final List<AdRankItem> rankItems) {
+
+        for (AdRankItem item : rankItems) {
+            item.setScore(item.getStr()*item.getRos());
+        }
+        Collections.sort(rankItems);
+        return rankItems;
+    }
+
+    @Override
+    public void loadModel() {
+        // nothing;
+    }
+}