/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package android.multiuser;

import android.os.Bundle;

import java.util.ArrayList;
import java.util.Collections;
import java.util.concurrent.TimeUnit;

public class BenchmarkResults {
    private final ArrayList<Long> mResults = new ArrayList<>();

    public void addDuration(long duration) {
        mResults.add(TimeUnit.NANOSECONDS.toMillis(duration));
    }

    public Bundle getStatsToReport() {
        final Bundle stats = new Bundle();
        stats.putDouble("Mean (ms)", mean());
        return stats;
    }

    public Bundle getStatsToLog() {
        final Bundle stats = new Bundle();
        stats.putDouble("Mean (ms)", mean());
        stats.putDouble("Median (ms)", median());
        stats.putDouble("Sigma (ms)", standardDeviation());
        return stats;
    }

    public ArrayList<Long> getAllDurations() {
        return mResults;
    }

    private double mean() {
        final int size = mResults.size();
        long sum = 0;
        for (int i = 0; i < size; ++i) {
            sum += mResults.get(i);
        }
        return (double) sum / size;
    }

    private double median() {
        final int size = mResults.size();
        if (size == 0) {
            return 0f;
        }

        final ArrayList<Long> resultsCopy = new ArrayList<>(mResults);
        Collections.sort(resultsCopy);
        final int idx = size / 2;
        return size % 2 == 0
                ? (double) (resultsCopy.get(idx) + resultsCopy.get(idx - 1)) / 2
                : resultsCopy.get(idx);
    }

    private double standardDeviation() {
        final int size = mResults.size();
        if (size == 0) {
            return 0f;
        }
        final double mean = mean();
        double sd = 0;
        for (int i = 0; i < size; ++i) {
            double diff = mResults.get(i) - mean;
            sd += diff * diff;
        }
        return Math.sqrt(sd / size);
    }
}
