static _fromCircuitAtTime_noFallback(circuitDefinition, time) {
circuitDefinition = circuitDefinition.withMinimumWireCount();
const numWires = circuitDefinition.numWires;
// Advance state while collecting stats into textures.
let stateTrader = new WglTextureTrader(CircuitShaders.classicalState(0).toVec2Texture(numWires));
let controlTex = CircuitShaders.controlMask(Controls.NONE).toBoolTexture(numWires);
let {colQubitDensities, colNorms, customStats, customStatsMap} = advanceStateWithCircuit(
new CircuitEvalContext(
time,
0,
numWires,
Controls.NONE,
controlTex,
stateTrader,
new Map()),
circuitDefinition,
true);
controlTex.deallocByDepositingInPool("controlTex in _fromCircuitAtTime_noFallback");
if (currentShaderCoder().vec2.needRearrangingToBeInVec4Format) {
stateTrader.shadeHalveAndTrade(Shaders.packVec2IntoVec4);
}
// Read all texture data.
let pixelData = Util.objectifyArrayFunc(KetTextureUtil.mergedReadFloats)({
output: stateTrader.currentTexture,
colQubitDensities,
colNorms,
customStats});
// -- INTERPRET --
let qubitDensities =
CircuitStats._extractColumnQubitStatsFromPixelDatas(circuitDefinition, pixelData.colQubitDensities);
let survivalRates =
CircuitStats._extractColumnSurvivalRateStatsFromPixelDatas(pixelData.colNorms);
let outputSuperposition = KetTextureUtil.pixelsToAmplitudes(
pixelData.output,
survivalRates.length === 0 ? 1 : survivalRates[survivalRates.length - 1]);
let customStatsProcessed = new Map();
for (let {col, row, out} of customStatsMap) {
//noinspection JSUnusedAssignment
let func = circuitDefinition.gateInSlot(col, row).customStatPostProcesser || (e => e);
//noinspection JSUnusedAssignment
customStatsProcessed.set(col+":"+row, func(pixelData.customStats[out], circuitDefinition, col, row));
}
return new CircuitStats(
circuitDefinition,
time,
survivalRates,
qubitDensities,
outputSuperposition,
customStatsProcessed);
}