"use client"; import React, { useEffect } from "react"; import { useForm, Controller, useFieldArray } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import * as z from "zod"; import { Button } from '@/components/ui/button'; import { Play, StopCircle, Settings, RefreshCw } from 'lucide-react'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription } from "@/components/ui/dialog"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Tabs, TabsList, TabsTrigger, TabsContent } from '@/components/ui/tabs'; import { ScrollArea } from '@/components/ui/scroll-area'; const trainingFormSchema = z.object({ modelName: z.string().min(3, "Model name must be at least 3 characters"), totalEpochs: z.coerce.number().int().min(1).max(200), batchSize: z.coerce.number().int().min(8).max(256), learningRate: z.coerce.number().min(0.00001).max(0.1), weightDecay: z.coerce.number().min(0).max(0.1), mixupAlpha: z.coerce.number().min(0).max(10), momentumParams: z.array(z.coerce.number().min(0).max(1)).length(6, "Must have 6 momentum values"), strengthParams: z.array(z.coerce.number().min(0).max(1)).length(6, "Must have 6 strength values"), noiseParams: z.array(z.coerce.number().min(0).max(1)).length(6, "Must have 6 noise values"), couplingParams: z.array(z.coerce.number().min(0).max(1)).length(6, "Must have 6 coupling values"), quantumCircuitSize: z.coerce.number().int().min(4).max(64), labelSmoothing: z.coerce.number().min(0).max(0.5), quantumMode: z.boolean(), baseConfigId: z.string().optional(), }); const defaultZPEParams = { momentum: [0.9, 0.85, 0.8, 0.75, 0.7, 0.65], strength: [0.35, 0.33, 0.31, 0.60, 0.27, 0.50], noise: [0.3, 0.28, 0.26, 0.35, 0.22, 0.25], coupling: [0.5, 0.5, 0.5, 0.5, 0.5, 0.5], }; const defaultValues = { modelName: "ZPE-Colab-Sim", totalEpochs: 30, batchSize: 32, learningRate: 0.001, weightDecay: 0.0001, mixupAlpha: 0.5, momentumParams: defaultZPEParams.momentum, strengthParams: defaultZPEParams.strength, noiseParams: defaultZPEParams.noise, couplingParams: defaultZPEParams.coupling, quantumCircuitSize: 32, labelSmoothing: 0.1, quantumMode: true, baseConfigId: undefined, }; interface ControlsPanelProps { startJob: (params: any) => void; stopJob: () => void; isJobActive: boolean; jobId: string | null; jobStatus: string | null; } const ControlsPanel: React.FC = ({ startJob, stopJob, isJobActive, jobId, jobStatus }) => { const [showConfig, setShowConfig] = React.useState(false); const [isSubmitting, setIsSubmitting] = React.useState(false); const { control, handleSubmit, reset, watch, getValues, formState: { errors } } = useForm({ resolver: zodResolver(trainingFormSchema), defaultValues, }); // Helper to render array fields const renderParamArrayFields = (paramName: "momentumParams" | "strengthParams" | "noiseParams" | "couplingParams", labelPrefix: string) => (
{(watch(paramName) || []).map((_: any, index: number) => (
( <> {fieldState.error &&

{fieldState.error.message}

} )} />
))}
); // Field controller for text/number fields const FieldController = ({ name, label, type = "text", placeholder, min, step }: any) => (
( <> {fieldState.error &&

{fieldState.error.message}

} )} />
); // Field controller for switch/boolean const FieldControllerSwitch = ({ name, label }: any) => (
( field.onChange(e.target.checked)} /> )} />
); const onSubmit = async (data: any) => { setIsSubmitting(true); try { // Send camelCase keys to backend (matches backend validation) const mapped = { modelName: data.modelName, totalEpochs: data.totalEpochs, batchSize: data.batchSize, learningRate: data.learningRate, weightDecay: data.weightDecay, mixupAlpha: data.mixupAlpha, momentumParams: data.momentumParams, strengthParams: data.strengthParams, noiseParams: data.noiseParams, couplingParams: data.couplingParams, quantumCircuitSize: data.quantumCircuitSize, labelSmoothing: data.labelSmoothing, quantumMode: data.quantumMode, baseConfigId: data.baseConfigId, }; await startJob(mapped); setShowConfig(false); } finally { setIsSubmitting(false); } }; return ( <>
{isJobActive && (

Status: {jobStatus}

)}
Train Configuration Adjust parameters for the ZPE model.
General ZPE Quantum {renderParamArrayFields("momentumParams", "Momentum Parameters")} {renderParamArrayFields("strengthParams", "Strength Parameters")} {renderParamArrayFields("noiseParams", "Noise Parameters")} {renderParamArrayFields("couplingParams", "Coupling Parameters")}
); }; export default ControlsPanel;