1 /*
2  * Copyright (C) 2017 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.nn.benchmark.app;
18 
19 import android.app.Activity;
20 import android.content.Intent;
21 import android.os.Bundle;
22 import android.os.Parcelable;
23 import android.text.method.ScrollingMovementMethod;
24 import android.util.Log;
25 import android.view.Menu;
26 import android.view.MenuInflater;
27 import android.view.MenuItem;
28 import android.view.View;
29 import android.widget.ArrayAdapter;
30 import android.widget.ListView;
31 import android.widget.TextView;
32 
33 import com.android.nn.benchmark.core.BenchmarkResult;
34 import com.android.nn.benchmark.core.TestModels;
35 import com.android.nn.benchmark.util.TestExternalStorageActivity;
36 
37 import java.util.ArrayList;
38 import java.util.Arrays;
39 import java.util.Random;
40 
41 public class NNControls extends Activity {
42     private static final String TAG = NNControls.class.getSimpleName();
43 
44     private ListView mTestListView;
45     private TextView mResultView;
46 
47     private ArrayAdapter<String> mTestListAdapter;
48     private ArrayList<String> mTestList = new ArrayList<String>();
49 
50     private boolean mSettings[] = {false, false, false};
51     private static final int SETTING_LONG_RUN = 0;
52     private static final int SETTING_PAUSE = 1;
53     private static final int SETTING_DISABLE_NNAPI = 2;
54 
55     private float mResults[];
56     private String mInfo[];
57 
58     private static int DOGFOOD_MODELS_PER_RUN = 20;
59 
60     @Override
onCreateOptionsMenu(Menu menu)61     public boolean onCreateOptionsMenu(Menu menu) {
62         // Inflate the menu items for use in the action bar
63         MenuInflater inflater = getMenuInflater();
64         inflater.inflate(R.menu.main_activity_actions, menu);
65 
66         return super.onCreateOptionsMenu(menu);
67     }
68 
init()69     void init() {
70         TestExternalStorageActivity.testWriteExternalStorage(this, true);
71 
72         for (TestModels.TestModelEntry testModel : TestModels.modelsList()) {
73             mTestList.add(testModel.toString());
74         }
75 
76         mTestListView = findViewById(R.id.test_list);
77         mTestListAdapter = new ArrayAdapter(this,
78                 android.R.layout.simple_list_item_activated_1,
79                 mTestList);
80 
81         mTestListView.setAdapter(mTestListAdapter);
82         mTestListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
83         mTestListAdapter.notifyDataSetChanged();
84 
85         mResultView = findViewById(R.id.results);
86         mResultView.setMovementMethod(new ScrollingMovementMethod());
87     }
88 
89     @Override
onCreate(Bundle savedInstanceState)90     protected void onCreate(Bundle savedInstanceState) {
91         super.onCreate(savedInstanceState);
92         setContentView(R.layout.controls);
93         init();
94     }
95 
96     @Override
onPause()97     protected void onPause() {
98         super.onPause();
99     }
100 
101     @Override
onResume()102     protected void onResume() {
103         super.onResume();
104     }
105 
makeBasicLaunchIntent()106     Intent makeBasicLaunchIntent() {
107         Intent intent = new Intent(this, NNBenchmark.class);
108         intent.putExtra(NNBenchmark.EXTRA_ENABLE_LONG, mSettings[SETTING_LONG_RUN]);
109         intent.putExtra(NNBenchmark.EXTRA_ENABLE_PAUSE, mSettings[SETTING_PAUSE]);
110         intent.putExtra(NNBenchmark.EXTRA_DISABLE_NNAPI, mSettings[SETTING_DISABLE_NNAPI]);
111         intent.putExtra(NNBenchmark.EXTRA_MAX_ITERATIONS, 1);
112         return intent;
113     }
114 
btnRun(View v)115     public void btnRun(View v) {
116         int count = 0;
117         int modelsCount = TestModels.modelsList().size();
118         for (int i = 0; i < modelsCount; i++) {
119             if (mTestListView.isItemChecked(i)) {
120                 count++;
121             }
122         }
123         if (count == 0) {
124             return;
125         }
126 
127         int testList[] = new int[count];
128         count = 0;
129         for (int i = 0; i < modelsCount; i++) {
130             if (mTestListView.isItemChecked(i)) {
131                 testList[count++] = i;
132             }
133         }
134 
135         Intent intent = makeBasicLaunchIntent();
136         intent.putExtra(NNBenchmark.EXTRA_TESTS, testList);
137         startActivityForResult(intent, 0);
138     }
139 
getResultShortSummary(BenchmarkResult br, TestModels.TestModelEntry t)140     String getResultShortSummary(BenchmarkResult br, TestModels.TestModelEntry t) {
141         return br.getSummary(t.mBaselineSec);
142     }
143 
onActivityResult(int requestCode, int resultCode, Intent data)144     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
145         if (requestCode == 0) {
146             if (resultCode == RESULT_OK) {
147                 int size = TestModels.modelsList().size();
148                 mResults = new float[size];
149                 mInfo = new String[size];
150 
151                 Parcelable r[] = data.getParcelableArrayExtra(NNBenchmark.EXTRA_RESULTS_RESULTS);
152                 int id[] = data.getIntArrayExtra(NNBenchmark.EXTRA_RESULTS_TESTS);
153 
154                 String mOutResult = "";
155                 for (int ct = 0; ct < id.length; ct++) {
156                     TestModels.TestModelEntry t = TestModels.modelsList().get(id[ct]);
157                     BenchmarkResult br = (BenchmarkResult) r[ct];
158 
159                     String s = t.toString() + " " + getResultShortSummary(br, t);
160                     mTestList.set(id[ct], s);
161                     mTestListAdapter.notifyDataSetChanged();
162                     mOutResult += s + '\n';
163                     mResults[id[ct]] = ((BenchmarkResult) r[ct]).getMeanTimeSec();
164                 }
165 
166                 mResultView.setText(mOutResult);
167             }
168         }
169     }
170 
btnSelAll(View v)171     public void btnSelAll(View v) {
172         for (int i = 0; i < TestModels.modelsList().size(); i++) {
173             mTestListView.setItemChecked(i, true);
174         }
175     }
176 
btnSelNone(View v)177     public void btnSelNone(View v) {
178         for (int i = 0; i < TestModels.modelsList().size(); i++) {
179             mTestListView.setItemChecked(i, false);
180         }
181     }
182 
onOptionsItemSelected(MenuItem item)183     public boolean onOptionsItemSelected(MenuItem item) {
184         // Handle presses on the action bar items.
185         // Use if-else rather than switch, so that this code can be compiled into a library where
186         // resource ids are not compile-time constants.
187         if (item.getItemId() == R.id.action_settings) {
188             NNSettings newFragment = new NNSettings(mSettings);
189             newFragment.show(getFragmentManager(), "settings");
190             return true;
191         } else {
192             return super.onOptionsItemSelected(item);
193         }
194     }
195 
btnSettings(View v)196     public void btnSettings(View v) {
197         NNSettings newFragment = new NNSettings(mSettings);
198         newFragment.show(getFragmentManager(), "settings");
199     }
200 
btnRunDogfood(View v)201     public void btnRunDogfood(View v) {
202         // Update settings for dogfood.
203         mSettings[SETTING_LONG_RUN] = true;
204         mSettings[SETTING_PAUSE] = false;
205         mSettings[SETTING_DISABLE_NNAPI] = false;
206 
207         // Select dogfood models.
208         long seed = System.currentTimeMillis();
209         Log.v(NNBenchmark.TAG, "Dogfood run seed " + seed);
210         Random random = new Random(seed);
211         int numModelsToSelect = Math.min(DOGFOOD_MODELS_PER_RUN, mTestList.size());
212         for (int i = 0; i < mTestList.size(); i++) {
213           mTestListView.setItemChecked(i, false);
214         }
215         while (numModelsToSelect > 0) {
216             int i = random.nextInt(mTestList.size());
217             if (mTestListView.isItemChecked(i)) {
218                 continue;
219             }
220             mTestListView.setItemChecked(i, true);
221             numModelsToSelect--;
222         }
223 
224         // Run benchmark.
225         btnRun(v);
226     }
227 }
228