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