Subversion Repositories SmartDukaan

Rev

Rev 2547 | Rev 3717 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2171 rajveer 1
/**
2
 * 
3
 */
4
package in.shop2020.util;
5
 
6
import in.shop2020.metamodel.core.Entity;
7
import in.shop2020.metamodel.core.Slide;
8
import in.shop2020.metamodel.definitions.CMPBucketDefinition;
9
import in.shop2020.metamodel.definitions.Catalog;
10
import in.shop2020.metamodel.definitions.DefinitionsContainer;
11
import in.shop2020.metamodel.util.CreationUtils;
12
import in.shop2020.metamodel.util.ExpandedCMPSlideRuleDefinition;
2657 rajveer 13
import in.shop2020.metamodel.util.ExpandedEntity;
2171 rajveer 14
import in.shop2020.metamodel.util.ExpandedSlide;
15
 
16
import java.util.HashMap;
17
import java.util.List;
18
import java.util.Map;
19
import java.util.TreeMap;
20
 
21
/**
22
 * @author naveen
23
 *
24
 */
25
public class NewCMP {
26
 
27
	/**
28
	 * 
29
	 */
30
	//private long categoryID;
31
 
2367 rajveer 32
	List<Entity> entities;
2171 rajveer 33
 
34
 
35
	/**
36
	 * @param args
37
	 * @throws Exception 
38
	 */
39
	public static void main(String[] args) throws Exception {
40
		String usage = "Usage: CMP {Category ID}";
41
 
42
		if(args.length > 1) {
43
			System.out.println(usage);
44
			System.exit(-1);
45
		}
46
		/*
47
		NewCMP cmp = new NewCMP(entityIdItemMap);
48
//		
49
//		Entity entity = CreationUtils.getEntity(1000165);
50
//		 Map<Long, Double> slideScores = cmp.getSlideScores(entity);
51
//		 Utils.info(slideScores);
52
 
53
 
54
		// Entity ID > Map(Slide ID > Score)
55
		Map<Long, Map<Long, Double>> slideScoresByEntity = cmp.getSlideScores();
56
		Utils.info("slideScoresByEntity=" + slideScoresByEntity);
57
 
58
		CreationUtils.storeSlideScores(slideScoresByEntity);
59
 
60
		// Entity ID > Final Score 
61
		Map<Long, Double> finalScoreByEntityID = cmp.getFinalScores(
62
				slideScoresByEntity);
63
		Utils.info("finalScoreByEntityID=" + finalScoreByEntityID);
64
 
65
		CreationUtils.storeDefaultEntityScores(finalScoreByEntityID);
66
	*/
67
	}
68
 
69
	/**
70
	 * 
71
	 * @param entityIdItemMap
72
	 */
2367 rajveer 73
	public NewCMP(List<Entity> entities) {
74
	    this.entities = entities;
2171 rajveer 75
	}
76
 
77
	/**
78
	 * 
79
	 * @return Map<Long, Map<Long, Double>>
80
	 * @throws Exception 
81
	 */
82
	public Map<Long, Map<Long, Double>> getSlideScores() throws Exception {
83
		Map<Long, Map<Long, Double>> slideScoresByEntityID = 
84
			new TreeMap<Long, Map<Long, Double>>();
85
 
86
 
87
 
2367 rajveer 88
		for(Entity entity : entities) {
2171 rajveer 89
			//Skip categories with value as -1 or categories except mobile phones
2547 rajveer 90
			if(entity.getCategoryID() == -1 || !(Catalog.getInstance().getDefinitionsContainer().getCategory(entity.getCategoryID()).getParentCategory().getID() != Utils.MOBILE_ACCESSORIES_CATEGORY)){
2171 rajveer 91
			    continue;
92
			}
2657 rajveer 93
			ExpandedEntity expEntity = new ExpandedEntity(entity);
94
			Map<Long, Double> slideScores = this.getSlideScores(expEntity);
2171 rajveer 95
 
2367 rajveer 96
			slideScoresByEntityID.put(entity.getID(), slideScores);
2171 rajveer 97
		}
98
 
99
		return slideScoresByEntityID;
100
	}
101
 
102
	/**
103
	 * 
104
	 * @param entity
105
	 * @return Map<Long, Double>
106
	 * @throws Exception 
107
	 */
2657 rajveer 108
	private Map<Long, Double> getSlideScores(ExpandedEntity expEntity) throws Exception {
2171 rajveer 109
		Map<Long, Double> slideScores = new HashMap<Long, Double>();
110
 
111
		DefinitionsContainer defs = 
112
			Catalog.getInstance().getDefinitionsContainer();
113
 
114
		// Python wrapper for executing rule in python script
115
		CMPJythonWrapper cmpJW = new CMPJythonWrapper();
116
 
117
		// Scores are required for parent slides only
2657 rajveer 118
		List<ExpandedSlide> expSlides = expEntity.getExpandedSlides();
119
		if(expSlides==null){
2171 rajveer 120
			return slideScores;
121
		}
2657 rajveer 122
		for(ExpandedSlide expSlide : expSlides) {
2171 rajveer 123
			cmpJW.reset();
124
			cmpJW.initialize();
125
 
126
			cmpJW.setExpandedSlide(expSlide);
2657 rajveer 127
			cmpJW.setCategory(expEntity.getCategory());
2171 rajveer 128
 
2657 rajveer 129
			long slideDefinitionID = expSlide.getSlideDefinitionID();
2171 rajveer 130
			ExpandedCMPSlideRuleDefinition expCMPSlideRuleDef = 
131
				defs.getExpandedComparisonSlideRuleDefinition(
132
						slideDefinitionID);
133
 
134
			if(expCMPSlideRuleDef == null) {
135
				Utils.warning("Could not find comparison definition for " + 
136
						"slide definition ID " + slideDefinitionID);
137
				continue;
138
			}
139
 
140
			cmpJW.setExpandedCMPSlideRuleDefinition(expCMPSlideRuleDef);
141
 
142
			cmpJW.executeRule();
143
 
144
			double score = cmpJW.getScore();
145
			Utils.info("score=" + score);
146
 
147
			slideScores.put(new Long(slideDefinitionID), new Double(score));
148
		}
149
 
150
		return slideScores;
151
	}
152
 
153
	/**
154
	 * 
155
	 * @param slideScoresByEntity
156
	 * @return Map<Long, Double>
157
	 * @throws Exception 
158
	 */
159
	public Map<Long, Double> getFinalScores(
160
			Map<Long, Map<Long, Double>> slideScoresByEntity) throws Exception {
161
		Map<Long, Double> finalScoreByEntityID = new TreeMap<Long, Double>();
162
 
163
		// Considering default Weights per Slide bucket
164
		// Slide buckets > List(Very Important, Regular, Not-so-Important)
165
		// Default Weights > List(70%, 20%, 10%)
166
		DefinitionsContainer defs = 
167
			Catalog.getInstance().getDefinitionsContainer();
168
 
169
		for(Long entityID : slideScoresByEntity.keySet()) {
170
			Map<Long, Double> slideScores = slideScoresByEntity.get(entityID);
171
 
172
			Entity entity = CreationUtils.getEntity(entityID);
173
			long categoryID = entity.getCategoryID();
174
			if(categoryID == -1){
175
				continue;
176
			}
177
			if(categoryID>10010){
178
				continue;
179
			}
180
 
181
			List<CMPBucketDefinition> bucketDefs = 
182
				defs.getComparisonBucketDefinitions(categoryID);
183
 
184
			Map<String, Double> bucketScores = new HashMap<String, Double>();
185
			Map<String, Double> bucketSlideCounts = 
186
				new HashMap<String, Double>();
187
 
188
			for(Long slideDefinitionID : slideScores.keySet()) {
189
				Double slideScore = slideScores.get(slideDefinitionID);
190
 
191
				Slide slide = CreationUtils.getSlide(entityID, slideDefinitionID);
192
 
193
				String bucketName = null;
194
				if(CreationUtils.isBorrowedSlide(slide.getSlideDefinitionID(), entity.getCategoryID())) {
195
					long borrowedCategoryID = CreationUtils.getBorrowedCategoryID(slide.getSlideDefinitionID(), entity.getCategoryID());
196
 
197
					bucketName = defs.getComparisonBucketName(borrowedCategoryID, slideDefinitionID.longValue());
198
				}
199
				else {
200
					bucketName = defs.getComparisonBucketName(categoryID, 
201
						slideDefinitionID.longValue());
202
				}
203
 
204
				if(bucketName == null) {
205
					Utils.warning("Comparison bucket not defined for " +
206
							"Category ID=" + categoryID + 
207
							" Slide Definition ID=" + slideDefinitionID);
208
 
209
					continue;
210
				}
211
 
212
				if(!bucketScores.containsKey(bucketName)) {
213
					bucketScores.put(bucketName, new Double(0));
214
				}
215
 
216
				if(!bucketSlideCounts.containsKey(bucketName)) {
217
					bucketSlideCounts.put(bucketName, new Double(0));
218
				}
219
 
220
				Double bucketScore = bucketScores.get(bucketName);
221
				Double bucketSlideCount = bucketSlideCounts.get(bucketName);
222
 
223
 
224
				Double newBucketScore =  new Double(
225
						bucketScore.intValue() + slideScore.intValue());
226
 
227
				Double newBucketSlideCount =  new Double(
228
						bucketSlideCount.intValue() + 1);
229
 
230
				bucketScores.put(bucketName, newBucketScore);
231
				bucketSlideCounts.put(bucketName, newBucketSlideCount);
232
			}
233
 
234
			int finalEntityScore = 0;
235
 
236
			// Apply weights and sum up
237
			for(CMPBucketDefinition bucketDef : bucketDefs) {
238
				String bucketName = bucketDef.getName();
239
				Utils.info("bucketName=" + bucketName);
240
 
241
				if(bucketScores.get(bucketName)==null){
242
					continue;
243
				}
244
				double aggregateBucketScore = bucketScores.get(bucketName);
245
				Utils.info("aggregateBucketScore=" + aggregateBucketScore);
246
 
247
				double bucketSlideCount = bucketSlideCounts.get(bucketName);
248
				Utils.info("bucketSlideCount=" + bucketSlideCount);
249
 
250
				double defaultWeight = bucketDef.getDefaultWeight();
251
				Utils.info("defaultWeight=" + defaultWeight);
252
 
253
				float percentageBucketScore = 
254
					(((float)aggregateBucketScore/
255
							((float)bucketSlideCount * 10))) * 100;
256
 
257
				Utils.info("percentageBucketScore=" + percentageBucketScore);
258
 
259
				float weightedBucketScore = 
260
					(float)percentageBucketScore * ((float)defaultWeight / 100);
261
				Utils.info("weightedBucketScore=" + weightedBucketScore);
262
 
263
				finalEntityScore += Math.round(weightedBucketScore);
264
			}
265
			Utils.info("finalEntityScore=" + finalEntityScore);
266
 
267
			finalScoreByEntityID.put(entityID, new Double(finalEntityScore));
268
		}
269
 
270
		return finalScoreByEntityID;
271
	}
272
}