blob: 2a37139cdbd94d3d835d20c82b89f8fa5fd8d95b [file] [log] [blame]
import { type FileMetadata } from "../types/files.js";
import { BenchmarkWrapper } from "./benchmarks.js";
export interface Indexed<T> {
// The source of the benchmark.
source: string;
// `source` index.
index: number;
// The underlying type.
value: T;
}
export type IndexedWrapper = Indexed<BenchmarkWrapper>;
/**
* A Benchmarking plotting session.
*/
export class Session {
// className -> BenchmarkWrapper[]
public classGroups: Record<string, IndexedWrapper[]> = {};
// BenchmarkWrapper[]
public benchmarks: IndexedWrapper[] = [];
public fileNames: Set<string> = new Set();
constructor(public files: FileMetadata[]) {
this.initialize();
}
private initialize() {
this.classGroups = {};
this.fileNames = new Set();
this.benchmarks = [];
for (let i = 0; i < this.files.length; i += 1) {
const fileIndex = i;
const fileMeta = this.files[fileIndex];
for (let j = 0; j < fileMeta.container.benchmarks.length; j += 1) {
const wrapper = new BenchmarkWrapper(fileMeta.container.benchmarks[j]);
const fileGroupKey = wrapper.className();
const classGroup = this.classGroups[fileGroupKey] || [];
const item = {
source: fileMeta.file.name,
index: fileIndex,
value: wrapper
};
classGroup.push(item);
// Update
this.classGroups[fileGroupKey] = classGroup;
this.fileNames.add(fileMeta.file.name);
this.benchmarks.push(item);
}
}
}
static datasetNames(wrappers: IndexedWrapper[]): Set<string> {
const names = new Set<string>();
for (let i = 0; i < wrappers.length; i += 1) {
const wrapper = wrappers[i];
names.add(wrapper.value.datasetName());
}
return names;
}
static sources(wrappers: IndexedWrapper[]): Set<string> {
const sources = new Set<string>();
for (let i = 0; i < wrappers.length; i += 1) {
sources.add(wrappers[i].source);
}
return sources;
}
}