import * as plotly from "plotly.js-dist-min" import React, { ChangeEvent, FC, useEffect, useState } from "react" import { Box, Checkbox, FormControl, FormLabel, FormControlLabel, Grid, Typography, useTheme, CardContent, Card, } from "@mui/material" import { plotlyDarkTemplate } from "./PlotlyDarkMode" const plotDomId = "graph-intermediate-values" export const GraphIntermediateValuesBeta: FC<{ trials: Trial[] includePruned: boolean logScale: boolean }> = ({ trials, includePruned, logScale }) => { const theme = useTheme() useEffect(() => { plotIntermediateValue( trials, theme.palette.mode, false, !includePruned, logScale ) }, [trials, theme.palette.mode, false, includePruned, logScale]) return ( Intermediate values ) } export const GraphIntermediateValues: FC<{ trials: Trial[] }> = ({ trials = [] }) => { const theme = useTheme() const [filterCompleteTrial, setFilterCompleteTrial] = useState(false) const [filterPrunedTrial, setFilterPrunedTrial] = useState(false) useEffect(() => { plotIntermediateValue( trials, theme.palette.mode, filterCompleteTrial, filterPrunedTrial, false ) }, [trials, theme.palette.mode, filterCompleteTrial, filterPrunedTrial]) const handleFilterCompleteChange = (e: ChangeEvent) => { e.preventDefault() setFilterCompleteTrial(!filterCompleteTrial) } const handleFilterPrunedChange = (e: ChangeEvent) => { e.preventDefault() setFilterPrunedTrial(!filterPrunedTrial) } return ( Intermediate values Filter state: } label="Complete" /> } label="Pruned" /> ) } const plotIntermediateValue = ( trials: Trial[], mode: string, filterCompleteTrial: boolean, filterPrunedTrial: boolean, logScale: boolean ) => { if (document.getElementById(plotDomId) === null) { return } const layout: Partial = { margin: { l: 50, t: 0, r: 50, b: 0, }, yaxis: { title: "Objective Value", type: logScale ? "log" : "linear", }, xaxis: { title: "Step", type: "linear", }, uirevision: "true", template: mode === "dark" ? plotlyDarkTemplate : {}, } if (trials.length === 0) { plotly.react(plotDomId, [], layout) return } const filteredTrials = trials.filter( (t) => (!filterCompleteTrial && t.state === "Complete") || (!filterPrunedTrial && t.state === "Pruned" && t.values && t.values.length > 0) || t.state == "Running" ) const plotData: Partial[] = filteredTrials.map((trial) => { const values = trial.intermediate_values.filter( (iv) => iv.value !== "inf" && iv.value !== "-inf" && iv.value !== "nan" ) return { x: values.map((iv) => iv.step), y: values.map((iv) => iv.value), marker: { maxdisplayed: 10 }, mode: "lines+markers", type: "scatter", name: trial.state !== "Running" ? `trial #${trial.number}` : `trial #${trial.number} (running)`, } }) plotly.react(plotDomId, plotData, layout) }