package test.drs_tst.recs.utils.appprofiles; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.math3.analysis.polynomials.PolynomialFunction; import org.apache.commons.math3.fitting.PolynomialFitter; import org.apache.commons.math3.fitting.GaussianFitter.ParameterGuesser; import org.apache.commons.math3.optim.nonlinear.vector.jacobian.LevenbergMarquardtOptimizer; import test.drs_tst.recs.utils.db.SQLLiteManager; public class ApplicationProfileBase { private static final Map appnameMap; static { appnameMap = new HashMap(); appnameMap.put("Intel_i7", "i7%"); appnameMap.put("AMD_Fusion", "amdf%"); appnameMap.put("AMD_Fusion", "amdf%"); appnameMap.put("Atom_Z510", "atom32%"); appnameMap.put("Atom_D510", "atom64%"); } SQLLiteManager sql = SQLLiteManager.getManager(); private boolean getDefault = false; public double getPower(String query, double defaultValue){ if(getDefault){ return defaultValue; } String [] params = explodeQuery(query); float [][] data; SQLLiteManager manager = SQLLiteManager.getManager(); ResultSet rs = manager .executeQuery("select freq, `recs:power_avg` from rundata where hostname like '" + params[1] + "' and test = '" + params[0] + "' and cores=" + params[3] + "" ); List rows = new ArrayList(); try { while (rs.next()) { float[] row = new float[] {rs.getFloat("freq"), rs.getFloat("recs:power_avg") }; rows.add(row); } data = new float[rows.size()][]; for (int i = 0; i < rows.size(); i++) { data[i] = rows.get(i); } try{ return calculate(data, Float.valueOf(params[2])); }catch(Exception e){ e.printStackTrace(); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return defaultValue; } protected double calculate(float[][] data, float value) throws Exception { PolynomialFitter fitter = new PolynomialFitter( new LevenbergMarquardtOptimizer()); for (float[] d : data) { fitter.addObservedPoint(d[0], d[1]); } double[] ges = new double[2]; if (fitter.getObservations().length >= 3) { ParameterGuesser pg = new ParameterGuesser(fitter.getObservations()); ges = pg.guess(); } double[] guess = new double[data.length / 2]; if (guess.length == 0) { guess = new double[ges.length]; } for (int i = 0; i < Math.min(guess.length, ges.length); i++) { guess[i] = ges[i]; } PolynomialFunction pf; if (fitter.getObservations().length > 0) { pf = new PolynomialFunction(fitter.fit(guess)); } else { throw new Exception("not ehough observations"); } return pf.value(value); } protected String [] explodeQuery(String query){ String [] q = query.split("\\."); q[1] = appnameMap.get(q[1]); return q; } public boolean isGetDefault() { return getDefault; } public void setGetDefault(boolean getDefault) { this.getDefault = getDefault; } }