From f37ec9b1c09e3f0cd816dfd8c42609018a9beb76 Mon Sep 17 00:00:00 2001 From: Antonio De Lucreziis Date: Wed, 22 Jan 2025 01:27:51 +0100 Subject: [PATCH] fix: random loading/state bug --- src/Primal.tsx | 54 ++++++++++++++++++++------------------------------ 1 file changed, 22 insertions(+), 32 deletions(-) diff --git a/src/Primal.tsx b/src/Primal.tsx index fe8cf56..a63aaa4 100644 --- a/src/Primal.tsx +++ b/src/Primal.tsx @@ -1,4 +1,4 @@ -import { useEffect, useState } from 'preact/hooks' +import { useEffect, useMemo, useState } from 'preact/hooks' import { MobileScrollable } from './components' import { Katex } from './Katex' import { fillDot, drawSemiplane, drawSimpleArrow, strokeInfiniteLine } from './lib-v2/canvas' @@ -68,26 +68,20 @@ const PrimalStep = ({ )}
- +
) } export const Primal = ({ input }: { input: ProblemInput }) => { - const [problemOutput, setProblemOutput] = useState | null>(null) - const [timerDelta, setTimerDelta] = useState(null) + const [[problemInput, problemOutput, elapsedTime], setProblem] = useState< + [ProblemInput, ReturnType, number] | [null, null] + >([null, null]) useEffect(() => { + console.log('Computing primal simplex steps') + const timerStart = performance.now() const output = computePrimalSimplexSteps({ A: input.A, @@ -97,13 +91,13 @@ export const Primal = ({ input }: { input: ProblemInput }) => { maxIterations: 10, }) const elapsedTime = performance.now() - timerStart + console.log('Computed primal simplex steps in', elapsedTime, 'ms') - setProblemOutput(output) - setTimerDelta(elapsedTime) + setProblem([input, output, elapsedTime]) }, [input]) return ( -
+
{problemOutput ? ( <>
@@ -111,12 +105,13 @@ export const Primal = ({ input }: { input: ProblemInput }) => {
{problemOutput.steps.map((step, iter) => ( { ) } -const PrimalCanvas = ({ - A, - b, - c, - B, - - x, - xi, -}: { +type PrimalCanvasProps = { A: Matrix b: Vector c: Vector @@ -152,12 +139,16 @@ const PrimalCanvas = ({ x?: Vector xi?: Vector -}) => { - const render = ($canvas: HTMLCanvasElement | null) => { +} + +const PrimalCanvas = ({ A, b, c, B, x, xi }: PrimalCanvasProps) => { + const render = ($canvas: HTMLCanvasElement | null, props: PrimalCanvasProps) => { if (!$canvas) { return } + const { A, b, c, B, x, xi } = props + $canvas.width = $canvas.offsetWidth * window.devicePixelRatio $canvas.height = $canvas.offsetHeight * window.devicePixelRatio @@ -256,7 +247,6 @@ const PrimalCanvas = ({ }) // draw semiplanes in B - B.forEach(i => { const [a1, a2] = A.rowAt(i).getData() const b_i = b.at(i) @@ -325,7 +315,7 @@ const PrimalCanvas = ({ g.fillText(`c`, 50 - (c1.toNumber() / cLen) * 20, height - 50 + (c2.toNumber() / cLen) * 20) } - return + return render($canvas, { A, b, c, B, x, xi })} /> } // export const PrimaleStep = ({ input, step }: { input: ProblemInput; step: Step }) => {