diff --git a/apps/class-solid/src/lib/runner.ts b/apps/class-solid/src/lib/runner.ts index bae7006..8a7f701 100644 --- a/apps/class-solid/src/lib/runner.ts +++ b/apps/class-solid/src/lib/runner.ts @@ -11,11 +11,9 @@ const asyncRunner = wrap(worker); export async function runClassAsync(config: Config): Promise { try { - const output = asyncRunner(config); - return output; + return await asyncRunner(config); } catch (error) { console.error({ config, error }); - // TODO use toast to give feedback to the user + throw error; } - throw new Error("Model run failed"); } diff --git a/apps/class-solid/src/lib/store.ts b/apps/class-solid/src/lib/store.ts index 190bc42..25a2552 100644 --- a/apps/class-solid/src/lib/store.ts +++ b/apps/class-solid/src/lib/store.ts @@ -8,6 +8,7 @@ import { mergeConfigurations, pruneConfig, } from "@classmodel/class/config_utils"; +import { showToast } from "~/components/ui/toast"; import { decodeAppState } from "./encode"; import { parseExperimentConfig } from "./experiment_config"; import type { ExperimentConfig } from "./experiment_config"; @@ -38,9 +39,19 @@ export async function runExperiment(id: number) { // Run reference const referenceConfig = unwrap(exp.config.reference); - const newOutput = await runClassAsync(referenceConfig); - - setExperiments(id, "output", "reference", newOutput); + try { + const newOutput = await runClassAsync(referenceConfig); + setExperiments(id, "output", "reference", newOutput); + } catch (error) { + showToast({ + title: "Error running reference configuration", + description: `${(error as Error).message}; Please correct configuration and try again.`, + variant: "destructive", + duration: Number.POSITIVE_INFINITY, + }); + setExperiments(id, "output", "running", false); + return; + } // Run permutations let permCounter = 0; @@ -50,8 +61,19 @@ export async function runExperiment(id: number) { referenceConfig, permConfig, ) as Config; - const newOutput = await runClassAsync(combinedConfig); - setExperiments(id, "output", "permutations", permCounter, newOutput); + try { + const newOutput = await runClassAsync(combinedConfig); + setExperiments(id, "output", "permutations", permCounter, newOutput); + } catch (error) { + showToast({ + title: `Error running permutation: ${permConfig.name}`, + description: `${(error as Error).message}. Please correct configuration and try again.`, + variant: "destructive", + duration: Number.POSITIVE_INFINITY, + }); + setExperiments(id, "output", "running", false); + return; + } permCounter++; } diff --git a/packages/class/src/runner.ts b/packages/class/src/runner.ts index e3ca529..09910a3 100644 --- a/packages/class/src/runner.ts +++ b/packages/class/src/runner.ts @@ -41,6 +41,11 @@ export function runClass(config: Config, freq = 600): ClassOutput { // Initial time writeOutput(); + // TODO remove when we see this error rendered + if (config.runtime === 42_000) { + throw new Error("Runtime cannot be 42_000 seconds."); + } + // Update loop while (model.t <= config.runtime) { model.update();