package org.singinst.uf.model;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.singinst.uf.presenter.HtmlUtil;
import org.singinst.uf.presenter.ScalarValuePointList;
import org.singinst.uf.presenter.LineBounds;
class MooresLawNodeMetadataContentsFactory {
private final List<MooreAsymptote> asymptotes = new ArrayList<MooreAsymptote>();
private final List<ScalarSchema> scalarSchemata = new ArrayList<ScalarSchema>();
private final List<ScalarValueHolder> scalarValueHolders = new ArrayList<ScalarValueHolder>();
private final ScalarRelation relation;
public MooresLawNodeMetadataContentsFactory(Node node) {
LineBounds yearDomain = new LineBounds(1950, 2070);
Axis year = new Axis(yearDomain);
Axis flopsPerDollar = new Axis(new LineBounds(-4, 18, true));
int asymptoteLowerBound = 8;
for (NotablePercentile percentile : NotablePercentile.values()) {
LineBounds asymptoteRange = new LineBounds(asymptoteLowerBound, 18);
MooreAsymptote asymptote = new MooreAsymptote(node, yearDomain, asymptoteRange, percentile);
asymptotes.add(asymptote);
scalarSchemata.add(asymptote.getScalar());
scalarValueHolders.add(asymptote.getConjecture());
asymptoteLowerBound += 2;
}
new MooreConstraint(getScalars()).constrain();
relation = new ScalarRelation(year, flopsPerDollar, MooresLawData.getInstance().points) {
public List<? extends ConclusionReportGenerator> getConclusionGenerators() {
return Collections.singletonList(new ConclusionReportGenerator() {
public String getText(ScalarValueHolder scalarValueHolder, double value) {
return "The limiting value of log(FLOPS/dollar) has a 90% chance of being between " +
HtmlUtil.green(getScalars().get(0).getScalarValueHolder().getValue()) +
" and " + HtmlUtil.red(getScalars().get(2).getScalarValueHolder().getValue());
}
});
}
public List<ScalarValueHolder> getScalarValues() {
return scalarValueHolders;
}
@Override
public List<ScalarValuePointList> getPointLists() {
List<ScalarValuePointList> retVal = new ArrayList<ScalarValuePointList>();
for (MooreAsymptote asymptote : asymptotes) {
retVal.addAll(asymptote.getPointLists());
}
return retVal;
}
};
}
public ScalarRelation getRelation() {
return relation;
}
public List<ScalarSchema> getScalars() {
return scalarSchemata;
}
}