浏览代码

Merge branch 'feature_gufengshou_20240301_random_with_30RP' into pre-master

gufengshou1 1 年之前
父节点
当前提交
44f46cd1ba
共有 16 个文件被更改,包括 350 次插入129 次删除
  1. 3 3
      ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/score/model/ThompsonSamplingModel.java
  2. 10 0
      ad-engine-server/src/main/resources/feeds_score_config_share0.conf
  3. 3 0
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/constant/RuleRedisKeyConst.java
  4. 4 0
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/container/AbTestConfigContainer.java
  5. 3 1
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/container/PredictPidContainer.java
  6. 101 0
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/container/RandWContainer.java
  7. 34 0
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/enums/ExpCodeEnum.java
  8. 28 35
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/impl/PredictModelServiceImpl.java
  9. 14 79
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/model/threshold/NoShareUserThresholdPredictModel.java
  10. 44 0
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/model/threshold/Random602PredictModel.java
  11. 52 0
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/model/threshold/RandomPredictModel.java
  12. 13 2
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/param/ThresholdPredictModelParam.java
  13. 5 1
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/Share0MergeBreakScorer.java
  14. 3 3
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/VlogMergeEcpmScorer.java
  15. 23 4
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/container/PidLambdaContainer.java
  16. 10 1
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/impl/RankServiceImpl.java

+ 3 - 3
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/score/model/ThompsonSamplingModel.java

@@ -30,9 +30,9 @@ public class ThompsonSamplingModel extends Model {
     // key = adid, value = <exp, click, conversation>
     private Map<Long, AdActionFeature> thompsonSamplingModel;
 
-    private static final int alpha = 6;
-    private static final int beta_click = 100;
-    private static final int beta_conversion = 100;
+    private static final int alpha = 60;
+    private static final int beta_click = 2000;
+    private static final int beta_conversion = 2000;
 
     public ThompsonSamplingModel() {
         //配置不同环境的hdfs conf

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

@@ -1,4 +1,14 @@
 scorer-config = {
+  lr-ctr-score-config = {
+    scorer-name = "com.tzld.piaoquan.ad.engine.service.score.VlogAdCtrLRScorer"
+    scorer-priority = 99
+    model-path = "ad_ctr_model/model_ad_ctr.txt"
+  }
+  lr-cvr-score-config = {
+      scorer-name = "com.tzld.piaoquan.ad.engine.service.score.VlogAdCvrLRScorer"
+      scorer-priority = 98
+      model-path = "ad_cvr_model/model_ad_cvr.txt"
+  }
   str-ros-score-config = {
       scorer-name = "com.tzld.piaoquan.ad.engine.service.score.VlogAdRosAndStrScorer"
       scorer-priority = 97

+ 3 - 0
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/constant/RuleRedisKeyConst.java

@@ -33,4 +33,7 @@ public class RuleRedisKeyConst {
     //  视频无广告时的分享率预测结果存放 redis key 前缀,完整格式:video:predict:share:rate:no:ad:{video_data_key}:{date}
     public static String KEY_NAME_PREFIX_VIDEO_NO_AD="video:predict:share:rate:no:ad:";
 
+    //广告引擎用户特征  ad:engine:user:features:{mid}
+    public static String AD_ENGINE_USER_FUTURE_KEY="ad:engine:user:features:";
+
 }

+ 4 - 0
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/container/AbTestConfigContainer.java

@@ -25,6 +25,7 @@ public class AbTestConfigContainer {
     @Value("${ad.abtest.time.plan.code:555}")
     String adTestCode;
 
+
     public Boolean containsCode(Map<String,List<JSONObject>> configMap,String code){
         return configMap.keySet().contains(code);
     }
@@ -36,16 +37,19 @@ public class AbTestConfigContainer {
                 return true;
             }
         }
+        //
         return flag;
     }
 
     public Boolean inAdTimeTest(JSONObject abExpInfo){
+        //todo youhua
         List<Map<String,Object>> mapList=(List)abExpInfo.get("ab_test002");
         for(Map<String,Object> map:mapList){
             if(adTestCode.equals(map.getOrDefault("abExpCode",""))){
                 return true;
             }
         }
+        //
         return false;
     }
 

+ 3 - 1
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/container/PredictPidContainer.java

@@ -126,7 +126,9 @@ public class PredictPidContainer {
                 try {
                     String[] cols=line.split(",");
                     String group=cols[0].trim();
-                    latestThresholdCache.put(group,Double.parseDouble(cols[4].trim()));
+                    if(group!=null&&cols[4].trim()!=null){
+                        latestThresholdCache.put(group,Double.parseDouble(cols[4].trim()));
+                    }
                 }catch (Exception e){
                     e.printStackTrace();
                 }

+ 101 - 0
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/container/RandWContainer.java

@@ -0,0 +1,101 @@
+package com.tzld.piaoquan.ad.engine.service.predict.container;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.TypeReference;
+import com.aliyun.oss.OSS;
+import com.aliyun.oss.OSSClientBuilder;
+import com.aliyun.oss.common.auth.CredentialsProvider;
+import com.aliyun.oss.common.auth.DefaultCredentialProvider;
+import com.aliyun.oss.model.CopyObjectResult;
+import com.aliyun.oss.model.OSSObject;
+import com.aliyun.oss.model.PutObjectResult;
+import com.tzld.piaoquan.ad.engine.commons.redis.AlgorithmRedisHelper;
+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 javax.annotation.PostConstruct;
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.Random;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+@Component
+public class RandWContainer {
+    private final static Logger log = LoggerFactory.getLogger(RandWContainer.class);
+
+    @Autowired
+    private AlgorithmRedisHelper redisHelper;
+
+    private static final int SCHEDULE_PERIOD = 10;
+    private static final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
+
+    String randWKey = "ad:engine:random:w";
+
+    OSS client;
+
+    public static Integer randW=0;
+
+    private static Random random=new Random();
+    private Date cacheDate;
+
+    @PostConstruct
+    private void init(){
+        final Runnable task = new Runnable() {
+            public void run() {
+                try {
+                    loadAndCalIfNeed();
+                }catch (Exception e){
+                    e.printStackTrace();
+                }
+            }
+        };
+        scheduler.scheduleAtFixedRate(task, 0, SCHEDULE_PERIOD, TimeUnit.SECONDS); // 60分钟
+    }
+
+
+    private void loadAndCalIfNeed(){
+        loadRandW();
+        Date now=new Date(System.currentTimeMillis()-60*60*1000);
+        if(cacheDate==null||now.after(cacheDate)){
+            calNewRandomW();
+            writeToRedis();
+        }
+    }
+
+    private void calNewRandomW() {
+        randW=random.nextInt(100);
+    }
+
+    private void writeToRedis(){
+        //先不考虑各种更新失败及重复更新问题。
+        redisHelper.set(randWKey,randW.toString()+"_"+System.currentTimeMillis(),0);
+    }
+
+    private void loadRandW(){
+        try {
+            String str=redisHelper.getString(randWKey);
+            if(str==null) return;
+            String[] arr=str.split("_");
+            randW=Integer.parseInt(arr[0]);
+            this.cacheDate=new Date(Long.parseLong(arr[1]));
+            System.out.println("randW="+randW);
+        }catch (Exception e){
+            log.error("svc=load_randomW status=failed error={}", Arrays.toString(e.getStackTrace()));
+            e.printStackTrace();
+        }
+    }
+
+    public static Integer getRandW(){
+        return randW;
+    }
+
+}

+ 34 - 0
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/enums/ExpCodeEnum.java

@@ -0,0 +1,34 @@
+package com.tzld.piaoquan.ad.engine.service.predict.enums;
+
+public enum ExpCodeEnum {
+
+    EXP_599("599","shareType"),
+    EXP_602("602","30rp");
+    public String getCode() {
+        return code;
+    }
+
+    public String getRandomModelKey() {
+        return randomModelKey;
+    }
+
+    private String code;
+    private String randomModelKey;
+
+    private ExpCodeEnum(String code, String randomModelKey) {
+        this.code = code;
+        this.randomModelKey = randomModelKey;
+    }
+
+    public static ExpCodeEnum valueOfExpCode(String code) {
+        if (code == null) {
+            return null;
+        }
+        for (ExpCodeEnum expCodeEnum : ExpCodeEnum.values()) {
+            if (expCodeEnum.getCode().equals(code)) {
+                return expCodeEnum;
+            }
+        }
+        return null;
+    }
+}

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

@@ -3,12 +3,9 @@ package com.tzld.piaoquan.ad.engine.service.predict.impl;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.TypeReference;
-import com.google.common.reflect.TypeToken;
 import com.tzld.piaoquan.ad.engine.commons.enums.AppTypeEnum;
 import com.tzld.piaoquan.ad.engine.commons.redis.AlgorithmRedisHelper;
 import com.tzld.piaoquan.ad.engine.commons.util.DateUtils;
-import com.tzld.piaoquan.ad.engine.commons.util.JSONUtils;
-import com.tzld.piaoquan.ad.engine.commons.util.TimerWatchUtil;
 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.PredictModelService;
@@ -65,7 +62,6 @@ public class PredictModelServiceImpl implements PredictModelService {
     private String withoutAdVideoIds;
 
     public Map<String, Object> adPredict(ThresholdPredictModelRequestParam requestParam) {
-
         String[] withoutAdVideoIdsArr=withoutAdVideoIds.split(",");
         for(String videoId:withoutAdVideoIdsArr){
             if(videoId.equals(requestParam.getVideoId()+"")){
@@ -90,6 +86,7 @@ public class PredictModelServiceImpl implements PredictModelService {
         //该用户所有实验合集
         Set<String> expCodes=new HashSet<>();
         boolean isHit = false;
+//        String randomModelExpCode=null;
         for(Map<String,Object> map:mapList){
             String expCode=map.getOrDefault("abExpCode","").toString();
             expCodes.add(expCode);
@@ -100,6 +97,9 @@ public class PredictModelServiceImpl implements PredictModelService {
             if (StringUtils.equals(expCode, adPredictBreakExpCode)) {
                 isHit = true;
             }
+//            if(ExpCodeEnum.EXP_599.getCode().equals(expCode)||ExpCodeEnum.EXP_600.getCode().equals(expCode)){
+//                randomModelExpCode=expCode;
+//            }
         }
 
         int hourOfDay= DateUtils.getCurrentHour();
@@ -122,27 +122,6 @@ public class PredictModelServiceImpl implements PredictModelService {
             return result;
         }
 
-        //人群选择算法判定-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) {
             result.put("msg", "abConfig_error");
@@ -150,12 +129,12 @@ public class PredictModelServiceImpl implements PredictModelService {
         }
         String abtestId = abParamArr[0];
         String abTestConfigTag = abParamArr[1];
-        if("173".equals(abtestId)&&(requestParam.getAbTestCode().equals("ab3")||requestParam.getAbTestCode().equals("ab4"))){
-            requestParam.setAbTestCode("ab5");
-        }
-        if("243".equals(abtestId)&&(requestParam.getAbTestCode().equals("ab1")||requestParam.getAbTestCode().equals("ab2")||requestParam.getAbTestCode().equals("ab3"))){
-            requestParam.setAbTestCode("ab5");
-        }
+//        if("173".equals(abtestId)&&(requestParam.getAbTestCode().equals("ab3")||requestParam.getAbTestCode().equals("ab4"))){
+//            requestParam.setAbTestCode("ab5");
+//        }
+//        if("243".equals(abtestId)&&(requestParam.getAbTestCode().equals("ab1")||requestParam.getAbTestCode().equals("ab2")||requestParam.getAbTestCode().equals("ab3"))){
+//            requestParam.setAbTestCode("ab5");
+//        }
 
         HashMap<String, Map<String, Object>> abConfigMap = abConfig.getAbConfigMap();
         Map<String, Object> abtestParam = abConfigMap.getOrDefault(abtestId + "-" + abTestConfigTag, null);
@@ -221,10 +200,23 @@ public class PredictModelServiceImpl implements PredictModelService {
         modelParam.setExtraParam(new HashMap<>());
         modelParam.addUserExtraFuture("shareType",shareType);
         setExtraParam(modelParam);
-        long startTime=System.currentTimeMillis();
-        String methodName="adPredictNew";
-        int step=1;
-        if (adPredictBreakSwitch || isHit) {
+        if(expCodes.contains("602")){
+            String userEngineFuture=redisHelper.getString(RuleRedisKeyConst.AD_ENGINE_USER_FUTURE_KEY+requestParam.getMid());
+            if(userEngineFuture!=null){
+                modelParam.addAllIntoUserExtraFuture(JSONObject.parseObject(userEngineFuture,Map.class));
+            }else {
+                modelParam.addUserExtraFuture("30rp","0");
+            }
+            result = ThresholdModelContainer.
+                    getThresholdPredictModel("random602")
+                    .predict(modelParam);
+        } else if(expCodes.contains("599")){
+//        if(randomModelExpCode!=null){
+//            modelParam.addUserExtraFuture("randomModelKey",ExpCodeEnum.valueOfExpCode(randomModelExpCode).getRandomModelKey());
+            result = ThresholdModelContainer.
+                    getThresholdPredictModel("random")
+                    .predict(modelParam);
+        } else if (adPredictBreakSwitch || isHit) {
             if(expCodes.contains(adPredictNoShareUserExpCode)&&"noShare".equals(shareType)){
                 result = ThresholdModelContainer.
                         getThresholdPredictModel("share0")
@@ -298,4 +290,5 @@ public class PredictModelServiceImpl implements PredictModelService {
             }
         }
     }
+
 }

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

@@ -6,6 +6,7 @@ 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.RandWContainer;
 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;
@@ -18,11 +19,16 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 
+import javax.annotation.PostConstruct;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Random;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
 
 import static com.tzld.piaoquan.ad.engine.commons.score.ScorerUtils.BREAK_CONFIG;
 import static com.tzld.piaoquan.ad.engine.commons.score.ScorerUtils.SHARE0_CONFIG;
@@ -30,14 +36,13 @@ import static com.tzld.piaoquan.ad.engine.commons.score.ScorerUtils.SHARE0_CONFI
 @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}")
+    @Value("${ad.predict.threshold.share0:0.4}")
     private double threshold;
     @Value("${ad.model.pid.type.share0:-1}")
     private double pidType;
 
+
     @Override
     String initName() {
         return "share0";
@@ -46,84 +51,14 @@ public class NoShareUserThresholdPredictModel extends ThresholdPredictModel {
     @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);
-        }
+        double score=(modelParam.getMid().hashCode()+ RandWContainer.getRandW())%100/100d;
+        score=score<0?-score:score;
 
         Map<String, Object> result = new HashMap<>();
-        result.put("threshold", realThreshold);
-        result.put("score", maxItem == null ? -1 : maxItem.getScore());
-        result.put("ad_predict", adPredict);
+//        result.put("threshold", realThreshold);
+//        result.put("score", maxItem == null ? -1 : maxItem.getScore());
+        result.put("ad_predict", score<threshold?2:1);
+        result.put("score", score);
 
         return result;
     }

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

@@ -0,0 +1,44 @@
+package com.tzld.piaoquan.ad.engine.service.predict.model.threshold;
+
+import com.tzld.piaoquan.ad.engine.service.predict.container.RandWContainer;
+import com.tzld.piaoquan.ad.engine.service.predict.param.ThresholdPredictModelParam;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Component
+public class Random602PredictModel extends ThresholdPredictModel {
+    private final static Logger log = LoggerFactory.getLogger(Random602PredictModel.class);
+
+    @Override
+    String initName() {
+        return "random602";
+    }
+
+
+    @Override
+    public Map<String, Object> predict(ThresholdPredictModelParam modelParam) {
+        int hash=modelParam.getMid().hashCode();
+        hash=hash<0?-hash:hash;
+        double score=(hash+ RandWContainer.getRandW())%100/100d;
+        double threshold=Double.parseDouble(
+                modelParam.getExtraParam().getOrDefault(modelParam.getAppType()+"_30rp_"+modelParam.getUserExtraFuture("30rp").toString(),-1
+                ).toString());
+        if(threshold<0d){
+            threshold=Double.parseDouble(
+                    modelParam.getExtraParam().getOrDefault("default_threshold","0.5")
+                            .toString());
+        }
+        Map<String, Object> result = new HashMap<>();
+        result.put("ad_predict", score<threshold?2:1);
+        result.put("score", score);
+        result.put("threshold", threshold);
+        result.put("model", "random600");
+
+        return result;
+    }
+
+}

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

@@ -0,0 +1,52 @@
+package com.tzld.piaoquan.ad.engine.service.predict.model.threshold;
+
+import com.tzld.piaoquan.ad.engine.service.predict.container.RandWContainer;
+import com.tzld.piaoquan.ad.engine.service.predict.param.ThresholdPredictModelParam;
+import com.tzld.piaoquan.ad.engine.service.remote.FeatureRemoteService;
+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 javax.annotation.PostConstruct;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Random;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+@Component
+public class RandomPredictModel extends ThresholdPredictModel {
+    private final static Logger log = LoggerFactory.getLogger(RandomPredictModel.class);
+
+    @Override
+    String initName() {
+        return "random";
+    }
+
+
+    @Override
+    public Map<String, Object> predict(ThresholdPredictModelParam modelParam) {
+        int hash=modelParam.getMid().hashCode();
+        hash=hash<0?-hash:hash;
+        double score=(hash+ RandWContainer.getRandW())%100/100d;
+        double threshold=Double.parseDouble(
+                modelParam.getExtraParam().getOrDefault(modelParam.getAppType()+"_"+modelParam.getUserExtraFuture("shareType").toString(),-1
+                ).toString());
+        if(threshold<0d){
+            threshold=Double.parseDouble(
+                    modelParam.getExtraParam().getOrDefault("default_threshold","0.5")
+                    .toString());
+        }
+        Map<String, Object> result = new HashMap<>();
+        result.put("ad_predict", score<threshold?2:1);
+        result.put("score", score);
+        result.put("threshold", threshold);
+        result.put("model", "random");
+
+        return result;
+    }
+
+}

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

@@ -48,12 +48,23 @@ public class ThresholdPredictModelParam {
     public void addUserExtraFuture(String key,Object val){
         if(userExtraFutureMap!=null){
             userExtraFutureMap.put(key,val);
+        }else {
+            userExtraFutureMap=new HashMap<>();
+            userExtraFutureMap.put(key,val);
+        }
+    }
+
+    public void addAllIntoUserExtraFuture(Map<String,Object> map){
+        if(userExtraFutureMap!=null){
+            userExtraFutureMap.putAll(map);
+        }else {
+            userExtraFutureMap=map;
         }
     }
 
-    public T getUserExtraFuture(String key){
+    public Object getUserExtraFuture(String key){
         if(userExtraFutureMap!=null){
-            return (T)userExtraFutureMap.getOrDefault(key,new T());
+            return userExtraFutureMap.getOrDefault(key,new T());
         }
         return null;
     }

+ 5 - 1
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/Share0MergeBreakScorer.java

@@ -31,7 +31,11 @@ public class Share0MergeBreakScorer extends BaseLRModelScorer {
                                     final List<AdRankItem> rankItems) {
 
         for (AdRankItem item : rankItems) {
-            item.setScore(item.getStr()*item.getRos());
+           try {
+               item.setScore(item.getCtr()*item.getCvr()/(item.getStr()*item.getRos()*0.2));
+           }catch (Exception e){
+               item.setScore(0);
+           }
         }
         Collections.sort(rankItems);
         return rankItems;

+ 3 - 3
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/VlogMergeEcpmScorer.java

@@ -65,7 +65,7 @@ public class VlogMergeEcpmScorer extends BaseLRModelScorer {
 
     public void callMergeScore(AdRankItem item,CountDownLatch countDownLatch){
         try {
-            boolean isTfType=item.getItemFeature().getCreative_7day_cnt_features().getAdView()<10000;
+            boolean isTfType=item.getItemFeature().getCreative_7day_cnt_features().getAdView()<5000;
             double cpa = item.getCpa();
             double bid1 = item.getBid1();
             double bid2 = item.getBid2();
@@ -77,9 +77,9 @@ public class VlogMergeEcpmScorer extends BaseLRModelScorer {
             if(isTfType){
                 ecpm = cpa * bid1 * bid2 * pcvr * pctr * 1000d;
             }else {
-                ecpm = (cpa+item.getPidLambda()) * bid1 * bid2 * pcvr * pctr * 1000d;
+                ecpm = cpa*item.getPidLambda() * bid1 * bid2 * pcvr * pctr * 1000d;
             }
-//                double ecpm = cpa * bid1 * bid2 * pcvr * pctr;
+//            ecpm = cpa * bid1 * bid2 * pcvr * pctr * 1000d;
             item.setEcpm1(ecpm/1000d);
             item.setScore(ecpm/1000d);
         } catch (Exception e) {

+ 23 - 4
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/container/PidLambdaContainer.java

@@ -97,17 +97,32 @@ public class PidLambdaContainer {
             InputStreamReader isr=new InputStreamReader(is);
             BufferedReader bufferedReader = new BufferedReader(isr);
             String line = null;
+            ConcurrentHashMap<Long,Double>  temp=new ConcurrentHashMap<>();
             while ((line = bufferedReader.readLine()) != null){
                 try {
                     String[] cols=line.split(",");
                     Long creativeId=Long.parseLong(cols[0]);
-                    Double lambdaNew=lambdaCache.getOrDefault(creativeId,0d)+
-                            kp*Double.parseDouble(cols[1])+ki*Double.parseDouble(cols[2])+kd*Double.parseDouble(cols[3]);
-                    lambdaCache.put(creativeId,lambdaNew);
+//                    Double lambdaNew=lambdaCache.getOrDefault(creativeId,0d)+
+//                            kp*Double.parseDouble(cols[1])+ki*Double.parseDouble(cols[2])+kd*Double.parseDouble(cols[3]);
+//                  Ecpm = CPA * pctr * pcvr * bid * lambad
+//                  Lambad = real_ctcvr / p_ctcvr (按上一个小时统计这两个值)
+                    Double pctr=Double.parseDouble(cols[1]);
+                    Double pcvr=Double.parseDouble(cols[2]);
+                    Double ctr=Double.parseDouble(cols[3]);
+                    Double cvr=Double.parseDouble(cols[4]);
+                    Double lambdaNew=null;
+                    if((pctr*pcvr)==0d||ctr*cvr==0d){
+                        lambdaNew=1d;
+                    }else {
+                        lambdaNew=cvr*ctr/(pctr*pctr);
+                    }
+                    temp.put(creativeId,lambdaNew);
                 }catch (Exception e){
                     e.printStackTrace();
                 }
             }
+            lambdaCache.clear();
+            lambdaCache=temp;
         }catch (Exception e){
             log.error("svc=calNewLambda status=failed error={}", Arrays.toString(e.getStackTrace()));
         }
@@ -150,6 +165,10 @@ public class PidLambdaContainer {
     }
 
     public static Double getPidLambda(Long creativeId){
-        return lambdaCache.getOrDefault(creativeId,0d);
+        try {
+            return lambdaCache.getOrDefault(creativeId,1d);
+        }catch (Exception e){
+            return 1d;
+        }
     }
 }

+ 10 - 1
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/impl/RankServiceImpl.java

@@ -22,9 +22,11 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
+import javax.annotation.PostConstruct;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 @Service
@@ -89,9 +91,13 @@ public class RankServiceImpl implements RankService {
             object.put("type",rankResult.get(0).getScore_type());
             object.put("pctr",rankResult.get(0).getCtr());
             object.put("pcvr",rankResult.get(0).getCvr());
+            object.put("score",rankResult.get(0).getScore());
+            object.put("pidLambda",rankResult.get(0).getPidLambda());
             object.put("lrsamples",rankResult.get(0).getLrSampleString());
             object.put("dataTime",currentTime.format(timeFormatter));
             log.info("svc=adItemRank {}", JSONObject.toJSONString(object));
+            object.remove("lrsamples");
+            log.info("svc=pid_log obj={}", JSONObject.toJSONString(object));
             return rankResult.get(0);
         }else {
             //空返回值
@@ -183,13 +189,16 @@ public class RankServiceImpl implements RankService {
         JSONObject object=new JSONObject();
         object.put("mid",request.getMid());
         object.put("adid",result.getCreativeId());
+        object.put("creativeCode",result.getCreativeCode());
         object.put("type",topItem.getScore_type());
         object.put("pctr",topItem.getCtr());
         object.put("pcvr",topItem.getCvr());
         object.put("lrsamples",topItem.getLrSampleString());
+        object.put("pidLambda",topItem.getPidLambda());
         object.put("dataTime",currentTime.format(timeFormatter));
         log.info("svc=adBidRank {}", JSONObject.toJSONString(object));
-
+        object.remove("lrsamples");
+        log.info("svc=pid_log obj={}", JSONObject.toJSONString(object));
         return result;
     }