1984e52f31d596840cfa51b1238e1c43d2e1918f8saberian/*
2984e52f31d596840cfa51b1238e1c43d2e1918f8saberian * Copyright (C) 2012 The Android Open Source Project
3984e52f31d596840cfa51b1238e1c43d2e1918f8saberian *
4984e52f31d596840cfa51b1238e1c43d2e1918f8saberian * Licensed under the Apache License, Version 2.0 (the "License");
5984e52f31d596840cfa51b1238e1c43d2e1918f8saberian * you may not use this file except in compliance with the License.
6984e52f31d596840cfa51b1238e1c43d2e1918f8saberian * You may obtain a copy of the License at
7984e52f31d596840cfa51b1238e1c43d2e1918f8saberian *
8984e52f31d596840cfa51b1238e1c43d2e1918f8saberian *      http://www.apache.org/licenses/LICENSE-2.0
9984e52f31d596840cfa51b1238e1c43d2e1918f8saberian *
10984e52f31d596840cfa51b1238e1c43d2e1918f8saberian * Unless required by applicable law or agreed to in writing, software
11984e52f31d596840cfa51b1238e1c43d2e1918f8saberian * distributed under the License is distributed on an "AS IS" BASIS,
12984e52f31d596840cfa51b1238e1c43d2e1918f8saberian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13984e52f31d596840cfa51b1238e1c43d2e1918f8saberian * See the License for the specific language governing permissions and
14984e52f31d596840cfa51b1238e1c43d2e1918f8saberian * limitations under the License.
15984e52f31d596840cfa51b1238e1c43d2e1918f8saberian */
16984e52f31d596840cfa51b1238e1c43d2e1918f8saberian
17984e52f31d596840cfa51b1238e1c43d2e1918f8saberianpackage android.bordeaux.services;
18984e52f31d596840cfa51b1238e1c43d2e1918f8saberian
19984e52f31d596840cfa51b1238e1c43d2e1918f8saberianimport android.bordeaux.services.IPredictor;
20984e52f31d596840cfa51b1238e1c43d2e1918f8saberianimport android.content.Context;
21984e52f31d596840cfa51b1238e1c43d2e1918f8saberianimport android.os.RemoteException;
22984e52f31d596840cfa51b1238e1c43d2e1918f8saberianimport android.util.Log;
23f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Linimport android.util.Pair;
24984e52f31d596840cfa51b1238e1c43d2e1918f8saberian
25984e52f31d596840cfa51b1238e1c43d2e1918f8saberianimport java.util.ArrayList;
26984e52f31d596840cfa51b1238e1c43d2e1918f8saberianimport java.util.List;
27984e52f31d596840cfa51b1238e1c43d2e1918f8saberianimport java.util.HashMap;
28984e52f31d596840cfa51b1238e1c43d2e1918f8saberianimport java.util.Map;
29984e52f31d596840cfa51b1238e1c43d2e1918f8saberian
30984e52f31d596840cfa51b1238e1c43d2e1918f8saberian/** Predictor for the Learning framework.
31984e52f31d596840cfa51b1238e1c43d2e1918f8saberian */
32984e52f31d596840cfa51b1238e1c43d2e1918f8saberianpublic class BordeauxPredictor {
33984e52f31d596840cfa51b1238e1c43d2e1918f8saberian    static final String TAG = "BordeauxPredictor";
34984e52f31d596840cfa51b1238e1c43d2e1918f8saberian    static final String PREDICTOR_NOTAVAILABLE = "Predictor is not available.";
35984e52f31d596840cfa51b1238e1c43d2e1918f8saberian    private Context mContext;
36984e52f31d596840cfa51b1238e1c43d2e1918f8saberian    private String mName;
37984e52f31d596840cfa51b1238e1c43d2e1918f8saberian    private IPredictor mPredictor;
38984e52f31d596840cfa51b1238e1c43d2e1918f8saberian
39984e52f31d596840cfa51b1238e1c43d2e1918f8saberian    public BordeauxPredictor(Context context) {
40984e52f31d596840cfa51b1238e1c43d2e1918f8saberian        mContext = context;
41984e52f31d596840cfa51b1238e1c43d2e1918f8saberian        mName = "defaultPredictor";
42984e52f31d596840cfa51b1238e1c43d2e1918f8saberian        mPredictor = BordeauxManagerService.getPredictor(context, mName);
43984e52f31d596840cfa51b1238e1c43d2e1918f8saberian    }
44984e52f31d596840cfa51b1238e1c43d2e1918f8saberian
45984e52f31d596840cfa51b1238e1c43d2e1918f8saberian    public BordeauxPredictor(Context context, String name) {
46984e52f31d596840cfa51b1238e1c43d2e1918f8saberian        mContext = context;
47984e52f31d596840cfa51b1238e1c43d2e1918f8saberian        mName = name;
48984e52f31d596840cfa51b1238e1c43d2e1918f8saberian        mPredictor = BordeauxManagerService.getPredictor(context, mName);
49984e52f31d596840cfa51b1238e1c43d2e1918f8saberian    }
50984e52f31d596840cfa51b1238e1c43d2e1918f8saberian
51984e52f31d596840cfa51b1238e1c43d2e1918f8saberian    public boolean reset() {
52984e52f31d596840cfa51b1238e1c43d2e1918f8saberian        if (!retrievePredictor()){
5347c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin            Log.e(TAG, "reset: " + PREDICTOR_NOTAVAILABLE);
54984e52f31d596840cfa51b1238e1c43d2e1918f8saberian            return false;
55984e52f31d596840cfa51b1238e1c43d2e1918f8saberian        }
56984e52f31d596840cfa51b1238e1c43d2e1918f8saberian        try {
57f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin            mPredictor.resetPredictor();
58984e52f31d596840cfa51b1238e1c43d2e1918f8saberian            return true;
59984e52f31d596840cfa51b1238e1c43d2e1918f8saberian        } catch (RemoteException e) {
60984e52f31d596840cfa51b1238e1c43d2e1918f8saberian        }
61984e52f31d596840cfa51b1238e1c43d2e1918f8saberian        return false;
62984e52f31d596840cfa51b1238e1c43d2e1918f8saberian    }
63984e52f31d596840cfa51b1238e1c43d2e1918f8saberian
64f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    public boolean retrievePredictor() {
65f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin        if (mPredictor == null) {
66f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin            mPredictor = BordeauxManagerService.getPredictor(mContext, mName);
67f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin        }
68f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin        if (mPredictor == null) {
6947c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin            Log.e(TAG, "retrievePredictor: " + PREDICTOR_NOTAVAILABLE);
70f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin            return false;
71f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin        }
72f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin        return true;
73f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    }
74f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin
75f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    public void addSample(String sampleName) {
76984e52f31d596840cfa51b1238e1c43d2e1918f8saberian        if (!retrievePredictor())
77984e52f31d596840cfa51b1238e1c43d2e1918f8saberian            throw new RuntimeException(PREDICTOR_NOTAVAILABLE);
78984e52f31d596840cfa51b1238e1c43d2e1918f8saberian        try {
79f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin            mPredictor.pushNewSample(sampleName);
80984e52f31d596840cfa51b1238e1c43d2e1918f8saberian        } catch (RemoteException e) {
81984e52f31d596840cfa51b1238e1c43d2e1918f8saberian            Log.e(TAG,"Exception: pushing a new example");
82984e52f31d596840cfa51b1238e1c43d2e1918f8saberian            throw new RuntimeException(PREDICTOR_NOTAVAILABLE);
83984e52f31d596840cfa51b1238e1c43d2e1918f8saberian        }
84984e52f31d596840cfa51b1238e1c43d2e1918f8saberian    }
85984e52f31d596840cfa51b1238e1c43d2e1918f8saberian
86f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    public ArrayList<Pair<String, Float> > getTopSamples() {
87f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin        return getTopSamples(0);
88f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    }
89f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin
90f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    public ArrayList<Pair<String, Float> > getTopSamples(int topK) {
91984e52f31d596840cfa51b1238e1c43d2e1918f8saberian        try {
92f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin            ArrayList<StringFloat> topList =
93f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin                    (ArrayList<StringFloat>) mPredictor.getTopCandidates(topK);
94f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin
95f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin            ArrayList<Pair<String, Float> > topSamples =
96f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin                    new ArrayList<Pair<String, Float> >(topList.size());
97f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin            for (int i = 0; i < topList.size(); ++i) {
98f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin                topSamples.add(new Pair<String, Float>(topList.get(i).key, topList.get(i).value));
99f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin            }
100f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin            return topSamples;
101f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin        } catch(RemoteException e) {
102f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin            Log.e(TAG,"Exception: getTopSamples");
103984e52f31d596840cfa51b1238e1c43d2e1918f8saberian            throw new RuntimeException(PREDICTOR_NOTAVAILABLE);
104984e52f31d596840cfa51b1238e1c43d2e1918f8saberian        }
105984e52f31d596840cfa51b1238e1c43d2e1918f8saberian    }
106984e52f31d596840cfa51b1238e1c43d2e1918f8saberian
107984e52f31d596840cfa51b1238e1c43d2e1918f8saberian    public boolean setParameter(String key, String value) {
108984e52f31d596840cfa51b1238e1c43d2e1918f8saberian        if (!retrievePredictor())
109984e52f31d596840cfa51b1238e1c43d2e1918f8saberian            throw new RuntimeException(PREDICTOR_NOTAVAILABLE);
110984e52f31d596840cfa51b1238e1c43d2e1918f8saberian        try {
111984e52f31d596840cfa51b1238e1c43d2e1918f8saberian            return mPredictor.setPredictorParameter(key, value);
112984e52f31d596840cfa51b1238e1c43d2e1918f8saberian        } catch (RemoteException e) {
113984e52f31d596840cfa51b1238e1c43d2e1918f8saberian            Log.e(TAG,"Exception: setting predictor parameter");
114984e52f31d596840cfa51b1238e1c43d2e1918f8saberian            throw new RuntimeException(PREDICTOR_NOTAVAILABLE);
115984e52f31d596840cfa51b1238e1c43d2e1918f8saberian        }
116984e52f31d596840cfa51b1238e1c43d2e1918f8saberian    }
117984e52f31d596840cfa51b1238e1c43d2e1918f8saberian}
118