| 
					
				 | 
			
			
				@@ -0,0 +1,99 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+package com.tzld.piaoquan.ad.engine.service.score.scorer; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.google.common.collect.Lists; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.tzld.piaoquan.ad.engine.commons.score.BaseXGBoostModelScorer; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.tzld.piaoquan.ad.engine.commons.score.ScoreParam; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.tzld.piaoquan.ad.engine.commons.score.ScorerConfigInfo; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.tzld.piaoquan.ad.engine.commons.score.model.PAIModel; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.tzld.piaoquan.ad.engine.commons.score.model.XGBoostModel683; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.tzld.piaoquan.recommend.feature.domain.ad.base.AdRankItem; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.tzld.piaoquan.recommend.feature.domain.ad.base.UserAdFeature; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.apache.commons.collections4.CollectionUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.apache.commons.collections4.MapUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.apache.commons.lang.exception.ExceptionUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.slf4j.Logger; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.slf4j.LoggerFactory; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.stereotype.Component; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.*; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.concurrent.*; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+public class PAIScorer extends BaseXGBoostModelScorer { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private final static Logger LOGGER = LoggerFactory.getLogger(PAIScorer.class); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public PAIScorer(ScorerConfigInfo configInfo) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        super(configInfo); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public void loadModel() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        doLoadModel(XGBoostModel683.class); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public List<AdRankItem> scoring(final ScoreParam param, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    final UserAdFeature userAdFeature, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    final List<AdRankItem> rankItems) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        throw new NoSuchMethodError(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public List<AdRankItem> scoring(final Map<String, String> sceneFeatureMap, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    final Map<String, String> userFeatureMap, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    final List<AdRankItem> rankItems) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (CollectionUtils.isEmpty(rankItems)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return rankItems; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        long startTime = System.currentTimeMillis(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<AdRankItem> result = rankByJava(sceneFeatureMap, userFeatureMap, rankItems); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        LOGGER.debug("ctr ranker time java items size={}, time={} ", result != null ? result.size() : 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                System.currentTimeMillis() - startTime); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return result; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private List<AdRankItem> rankByJava(final Map<String, String> sceneFeatureMap, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        final Map<String, String> userFeatureMap, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        final List<AdRankItem> items) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        long startTime = System.currentTimeMillis(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        PAIModel model = (PAIModel) this.getModel(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        LOGGER.debug("model size: [{}]", model.getModelSize()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 所有都参与打分,按照ctr排序 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        multipleCtrScore(items, userFeatureMap, sceneFeatureMap, model); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // debug log 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (LOGGER.isDebugEnabled()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            for (int i = 0; i < items.size(); i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                LOGGER.debug("before enter feeds model predict ctr score [{}] [{}]", items.get(i), items.get(i)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Collections.sort(items); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        LOGGER.debug("ctr ranker java execute time: [{}]", System.currentTimeMillis() - startTime); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        LOGGER.debug("[ctr ranker time java] items size={}, cost={} ", items != null ? items.size() : 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                System.currentTimeMillis() - startTime); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return items; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private void multipleCtrScore(final List<AdRankItem> items, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                  final Map<String, String> userFeatureMap, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                  final Map<String, String> sceneFeatureMap, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                  final PAIModel model) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<Float> score = model.score(items, userFeatureMap, sceneFeatureMap); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        LOGGER.debug("PAIScorer score={}", score); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for (int i = 0; i < items.size(); i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Double pro = Double.valueOf(score.get(i)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            items.get(i).setLrScore(pro); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            items.get(i).getScoreMap().put("ctcvrScore", pro); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 |