package org.societies.personalisation.CACIDiscovery.test; import java.io.IOException; import java.io.Serializable; import java.net.URI; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import org.societies.api.context.model.CtxAttribute; import org.societies.api.context.model.CtxAttributeIdentifier; import org.societies.api.context.model.CtxAttributeTypes; import org.societies.api.context.model.CtxEntity; import org.societies.api.context.model.CtxEntityIdentifier; import org.societies.api.context.model.CtxHistoryAttribute; import org.societies.api.context.model.util.SerialisationHelper; import org.societies.api.personalisation.model.Action; import org.societies.api.personalisation.model.IAction; import org.societies.api.schema.servicelifecycle.model.ServiceResourceIdentifier; import org.societies.personalisation.CAUI.api.model.UserIntentModelData; import org.societies.personalisation.CAUIDiscovery.impl.ActionDictObject; import org.societies.personalisation.CAUIDiscovery.impl.ConstructUIModel; import org.societies.personalisation.CAUIDiscovery.impl.MockHistoryData; import org.societies.personalisation.CAUIDiscovery.impl.TransProbCalculator; //remove after testing import org.societies.personalisation.CAUITaskManager.impl.CAUITaskManager; import org.societies.personalisation.CAUIDiscovery.impl.CAUIDiscovery; public class UserIntentModelCreator { private static Long nextValue = 0L; Map<CtxHistoryAttribute, List<CtxHistoryAttribute>> mapHocData = new LinkedHashMap<CtxHistoryAttribute, List<CtxHistoryAttribute>>(); private CtxEntity operator = null; CAUIDiscovery discover = null; UserIntentModelCreator(){ System.out.println("creating user intent model "); operator = createOperator(); discover = new CAUIDiscovery(); } /* * creates a user intent model based on input history */ public UserIntentModelData createModel(Map<CtxHistoryAttribute, List<CtxHistoryAttribute>> history){ UserIntentModelData intentModelA = null; //System.out.println("1. create history"); createContextHistoryAttributesSet(); // printHistory(this.mapHocData); // System.out.println("2. Convert History Data"); List<MockHistoryData> mockData = discover.convertHistoryData(history); // System.out.println("Converted Data: "+mockData); // System.out.println("3. Perform learning"); HashMap<Integer,LinkedHashMap<List<String>,ActionDictObject>> dictionary = discover.generateTransitionsDictionaryAll(mockData); for(int i=1; i<= dictionary.size(); i++) { // System.out.println("Print dictionary, step: "+i+" size:"+dictionary.get(i).size()); // printDictionary(dictionary.get(i)); } HashMap<String,List<String>> ctxActionsMap = discover.assignContextToAction(dictionary.get(1)); // System.out.println("4. assignContextToAction"); // System.out.println(ctxActionsMap); // System.out.println("5. Calculate trans probabilites"); // // add context calculation in calcTrans2Prob // System.out.println("5. step 2 "); try { TransProbCalculator transProb = new TransProbCalculator(); LinkedHashMap<List<String>, HashMap<String, Double>> trans2ProbDictionary = transProb.calcTrans2Prob(dictionary.get(2)); // printTransProbDictionary(trans2ProbDictionary); // System.out.println("5. step 3 "); // LinkedHashMap<List<String>,HashMap<String,Double>> trans3ProbDictionary = transProb.calcTrans3Prob(dictionary.get(3)); // printTransProbDictionary(trans3ProbDictionary); // System.out.println("6. Generate UserIntentModelData"); ConstructUIModel cmodel = new ConstructUIModel(discover.getCauiTaskManager(),null); intentModelA = cmodel.constructNewModel(trans2ProbDictionary,ctxActionsMap,discover.getSriMap()); // System.out.println("*********** model created *******"+ intentModelA.getActionModel()); /* for( IUserIntentAction userAction : modelData.getActionModel().keySet()){ System.out.println(userAction); //System.out.println(userAction.getActionContext()); } */ } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } // model discovered return intentModelA; } public void createContextHistoryAttributesSet(){ //create actions //IIdentity identity = new MockIdentity(IdentityType.CSS, "user", "societies.org"); ServiceResourceIdentifier serviceId1 = new ServiceResourceIdentifier(); ServiceResourceIdentifier serviceId2 = new ServiceResourceIdentifier(); try { serviceId1.setIdentifier(new URI("http://testService1")); serviceId2.setIdentifier(new URI("http://testService2")); serviceId1.setServiceInstanceIdentifier("http://testService1"); serviceId2.setServiceInstanceIdentifier("http://testService2"); } catch (URISyntaxException e) { e.printStackTrace(); } //create actions IAction action1 = new Action(serviceId1, "testService", "volume", "high"); IAction action2 = new Action(serviceId2, "testService", "volume", "low"); IAction action3 = new Action(serviceId1, "testService", "volume", "mute"); IAction actionX = new Action(serviceId1, "testService", "XXXX", "XXXX"); IAction action4 = new Action(serviceId2, "testService", "colour", "blue"); IAction action5 = new Action(serviceId2, "testService", "colour", "green"); IAction actionY = new Action(serviceId1, "testService", "YYYY", "YYYY"); //System.out.println ("action service ID "+actionY.getServiceID().getServiceInstanceIdentifier()); for (int i=0; i<4; i++){ monitorAction(action1,"country","free",10); monitorAction(action2,"office","busy",15); monitorAction(action3,"park","away",25); monitorAction(actionX,"park","away",25); monitorAction(actionY,"park","away",25); monitorAction(action4,"park","away",25); monitorAction(action5,"park","away",25); monitorAction(actionY,"park","away",25); monitorAction(actionX,"park","away",25); } } //****************************************************************** // helper methods //****************************************************************** private void monitorAction(IAction action, String location, String status, Integer temperature){ CtxHistoryAttribute mockPrimaryHocActionAttrX = createMockHocActionAttr(action); List<CtxHistoryAttribute> escortingCtxDataX = new ArrayList<CtxHistoryAttribute>(); CtxHistoryAttribute attrLocationX = createMockHocAttr(CtxAttributeTypes.LOCATION_SYMBOLIC,location); CtxHistoryAttribute attrStatusX = createMockHocAttr(CtxAttributeTypes.STATUS,status); CtxHistoryAttribute attrTemperatureX = createMockHocAttr(CtxAttributeTypes.TEMPERATURE,temperature); escortingCtxDataX.add(attrLocationX); escortingCtxDataX.add(attrStatusX); escortingCtxDataX.add(attrTemperatureX); this.mapHocData.put(mockPrimaryHocActionAttrX, escortingCtxDataX); } private CtxHistoryAttribute createMockHocAttr(String ctxAttrType, Serializable ctxAttrValue){ CtxAttributeIdentifier ctxAttrID = new CtxAttributeIdentifier(operator.getId(),ctxAttrType.toString(),getNextValue()); CtxAttribute ctxAttr = new CtxAttribute(ctxAttrID); if(ctxAttrValue instanceof String){ ctxAttr.setStringValue(ctxAttrValue.toString()); } else if (ctxAttrValue instanceof Double){ ctxAttr.setDoubleValue((Double)ctxAttrValue); }else if (ctxAttrValue instanceof Integer){ ctxAttr.setIntegerValue((Integer)ctxAttrValue); } CtxHistoryAttribute ctxHocAttr = new CtxHistoryAttribute(ctxAttr,getNextValue()); return ctxHocAttr; } private CtxHistoryAttribute createMockHocActionAttr(IAction action){ CtxHistoryAttribute ctxHocAttr = null; try { CtxAttributeIdentifier ctxAttrID = new CtxAttributeIdentifier(operator.getId(),CtxAttributeTypes.LAST_ACTION,getNextValue()); CtxAttribute ctxAttr = new CtxAttribute(ctxAttrID); ctxAttr.setBinaryValue(SerialisationHelper.serialise(action)); ctxHocAttr = new CtxHistoryAttribute(ctxAttr,getNextValue()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return ctxHocAttr; } private CtxEntity createOperator(){ CtxEntityIdentifier ctxEntId = new CtxEntityIdentifier("operatorID","person",getNextValue()); CtxEntity ctxEntity = new CtxEntity(ctxEntId); setOperatorEntity(ctxEntity); return ctxEntity; } private void setOperatorEntity(CtxEntity entity){ operator = entity; } public static Long getNextValue() { return nextValue++; } //****************************************************************** // printing methods //****************************************************************** private void printHistory(Map<CtxHistoryAttribute, List<CtxHistoryAttribute>> mapHocData){ int i = 0; for(CtxHistoryAttribute ctxHocAttr :mapHocData.keySet()){ try { IAction action = (IAction)SerialisationHelper.deserialise(ctxHocAttr.getBinaryValue(), this.getClass().getClassLoader()); List<CtxHistoryAttribute> escortingAttrList = mapHocData.get(ctxHocAttr); System.out.println(i+" primary Attr: {"+action.getparameterName() +" "+action.getvalue()+"} escorting: {" +escortingAttrList.get(0).getStringValue()+" "+escortingAttrList.get(1).getStringValue()+" "+escortingAttrList.get(2).getStringValue()+"}"); i++; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public void printDictionary(LinkedHashMap<List<String>,ActionDictObject> dictionary){ System.out.println ("**** printing dictionary contents *****"); System.out.println ("**** total number of entries:" + dictionary.size()); for(List<String> actions : dictionary.keySet()){ ActionDictObject dicObj = dictionary.get(actions); int occurences = dicObj.getTotalOccurences(); System.out.println("Action:"+actions+ "# "+occurences+" | context: "+dicObj.toString()); } } public void printTransProbDictionary (LinkedHashMap<List<String>,HashMap<String,Double>> transProbDictionary){ System.out.println("printing transition probabilites "); //System.out.println ("**** total number of entries:" + transProbDictionary.size()); for(List<String> action : transProbDictionary.keySet()){ HashMap<String,Double> transTargets = transProbDictionary.get(action); System.out.println("Action:"+action+ "| target: "+transTargets); } } }