package edu.ucla.nesl.mca.classifier; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import org.json.JSONArray; import org.json.JSONObject; import org.json.JSONTokener; import android.util.Log; import edu.ucla.nesl.mca.feature.BuiltInFeature; import edu.ucla.nesl.mca.feature.Feature; import edu.ucla.nesl.mca.feature.Feature.OPType; import edu.ucla.nesl.mca.feature.FeaturePool; import edu.ucla.nesl.mca.feature.Trigger; public class ClassifierBuilder { public static ArrayList<Classifier> BuildFromFile(File file) throws IOException { String jsonString = ""; BufferedReader fileInput = new BufferedReader(new FileReader(file)); String line = null; while ((line = fileInput.readLine()) != null) { jsonString += line + "\n"; } fileInput.close(); return Build(jsonString); } public static ArrayList<Classifier> Build(String jsonString) throws IOException { // String modelType = Classifier.getJSONModelType(jsonString); // Log.i("ClassifierBuilder", "model type: " + modelType); // Classifier cl = null; ArrayList<Classifier> result = new ArrayList<Classifier>(); FeaturePool m_inputs = new FeaturePool(); Feature m_output = null; try { JSONObject object = (JSONObject) new JSONTokener(jsonString).nextValue(); object.getString("Name"); JSONArray featureList = object.getJSONArray("Feature List"); //JSONObject model = object.getJSONObject("Model"); for (int i = 0; i < featureList.length(); i++) { JSONObject featureObj = featureList.getJSONObject(i); Feature feature = new Feature(); feature.setId(featureObj.getInt("ID")); feature.setOpType(BuiltInFeature.getOPType(feature.getId())); feature.setName(featureObj.getString("Name")); if (featureObj.has("WindowSize")) { feature.setWindowSize(featureObj.getInt("WindowSize")); } if (featureObj.has("isResult") && featureObj.getBoolean("isResult")) { feature.setResult(true); JSONArray res = featureObj.getJSONArray("Result"); for (int j = 0; j < res.length(); j++) { feature.addMembership(res.getString(j)); } feature.setOpType(Feature.OPType.NOMINAL); m_output = feature; } else { feature.setResult(false); feature.setSensor(featureObj.getInt("SensorID")); if (featureObj.has("TriggerOn")) { JSONObject triggerObj = featureObj .getJSONObject("TriggerOn"); int featureID = triggerObj.getInt("Feature"); Log.i("Classifier", "Trigger on found id" + featureID); Log.i("Classifier", "trigger type " + BuiltInFeature.getOPType(featureID) + " real type " + OPType.REAL); if (BuiltInFeature.getOPType(featureID) == OPType.REAL) { String operator = triggerObj.getString("Operation"); double value = triggerObj.getDouble("Value"); int duration = triggerObj.getInt("Duration"); Log.i("Classifier", "Trigger on is " + operator); feature.setTriggerOn(new Trigger(featureID, operator, value, duration)); } else if (BuiltInFeature.getOPType(featureID) == OPType.NOMINAL) { String value = triggerObj.getString("Value"); int duration = triggerObj.getInt("Duration"); feature.setTriggerOn(new Trigger(featureID, value, duration)); } } if (featureObj.has("TriggerOff")) { JSONObject triggerObj = featureObj .getJSONObject("TriggerOff"); int featureID = triggerObj.getInt("Feature"); Log.i("Classifier", "Trigger off found id" + featureID); if (BuiltInFeature.getOPType(featureID) == OPType.REAL) { String operator = triggerObj.getString("Operation"); double value = triggerObj.getDouble("Value"); int duration = triggerObj.getInt("Duration"); Log.i("Classifier", "Trigger off is " + operator); feature.setTriggerOff(new Trigger(featureID, operator, value, duration)); } else if (BuiltInFeature.getOPType(featureID) == OPType.NOMINAL) { String value = triggerObj.getString("Value"); int duration = triggerObj.getInt("Duration"); feature.setTriggerOff(new Trigger(featureID, value, duration)); } } // System.out.println(feature.id + " " + feature.name + " " // + feature.sensor); m_inputs.addFeature(feature); } } JSONArray modelList = object.getJSONArray("ModelList"); for (int i = 0; i < modelList.length(); i++) { JSONObject curModel = modelList.getJSONObject(i); String type = curModel.getString("Type"); int id = curModel.getInt("ID"); if (type.equals("TREE")) { Classifier tree = new DecisionTree(); tree.setId(id); tree.setType("TREE"); tree.setM_inputs(m_inputs); tree.setM_output(m_output); tree.getModel(curModel); if (curModel.has("TriggerOn")) { JSONObject triggerObj = curModel.getJSONObject("TriggerOn"); int featureID = triggerObj.getInt("Feature"); Log.i("Classifier", "trigger on for classifier, featureID=" + featureID); //Log.i("Classifier", "Trigger on found id" + featureID); Log.i("Classifier", "trigger type " + BuiltInFeature.getOPType(featureID) + " real type " + OPType.REAL); if (BuiltInFeature.getOPType(featureID) == OPType.REAL) { String operator = triggerObj.getString("Operation"); double value = triggerObj.getDouble("Value"); int duration = triggerObj.getInt("Duration"); //Log.i("Classifier", "Trigger on is " + operator); tree.setTriggerOn(new Trigger(featureID, operator, value, duration)); } else if (BuiltInFeature.getOPType(featureID) == OPType.NOMINAL) { String value = triggerObj.getString("Value"); int duration = triggerObj.getInt("Duration"); tree.setTriggerOn(new Trigger(featureID, value, duration)); } } if (curModel.has("TriggerOff")) { JSONObject triggerObj = curModel.getJSONObject("TriggerOff"); int featureID = triggerObj.getInt("Feature"); Log.i("Classifier", "Trigger off found id" + featureID); if (BuiltInFeature.getOPType(featureID) == OPType.REAL) { String operator = triggerObj.getString("Operation"); double value = triggerObj.getDouble("Value"); int duration = triggerObj.getInt("Duration"); //Log.i("Classifier", "Trigger off is " + operator); tree.setTriggerOff(new Trigger(featureID, operator, value, duration)); } else if (BuiltInFeature.getOPType(featureID) == OPType.NOMINAL) { String value = triggerObj.getString("Value"); int duration = triggerObj.getInt("Duration"); tree.setTriggerOff(new Trigger(featureID, value, duration)); } } result.add(tree); } } } catch (Exception ex) { Log.i("ClassifierBuilder", ex.toString()); ex.printStackTrace(); } Log.i("ClassifierBuilder", "model count " + result.size()); Log.i("ClassifierBuilder", "model0 type " + result.get(0).type); Log.i("ClassifierBuilder", "model1 type " + result.get(1).type); return result; // if (modelType.equals("TREE")) { // cl = new DecisionTree(); // cl.type = modelType; // try { // cl.parseJSON(jsonString); // } // catch (Exception e) { // // TODO Auto-generated catch block // Log.i("ClassifierBuilder", e.toString()); // e.printStackTrace(); // } // } // else { // Log.i("ClassifierBuilder", // "[ClassifierBuilder] cannot recognize the model type."); // throw new // IOException("[ClassifierBuilder] cannot recognize the model type."); // } // return cl; } /** * Test ClassifierBuilder * * @param args */ public static void main(String[] args) { } }