2525
2626import asyncio
2727import copy
28+ import inspect
2829from collections .abc import Callable
2930from typing import TYPE_CHECKING , Literal
3031
@@ -299,9 +300,12 @@ def ModelCreator(model, model_params, seed=1):
299300 - The component provides an interface for adjusting user-defined parameters and reseeding the model.
300301
301302 """
302- user_params , fixed_params = split_model_params (model_params )
303+ solara .use_effect (
304+ lambda : _check_model_params (model .value .__class__ .__init__ , fixed_params ),
305+ [model .value ],
306+ )
303307
304- reactive_seed = solara . use_reactive ( seed )
308+ user_params , fixed_params = split_model_params ( model_params )
305309
306310 model_parameters , set_model_parameters = solara .use_state (
307311 {
@@ -310,29 +314,35 @@ def ModelCreator(model, model_params, seed=1):
310314 }
311315 )
312316
313- def do_reseed ():
314- """Update the random seed for the model."""
315- reactive_seed .value = model .value .random .random ()
316-
317317 def on_change (name , value ):
318- set_model_parameters ({** model_parameters , name : value })
318+ new_model_parameters = {** model_parameters , name : value }
319+ model .value = model .value .__class__ (** new_model_parameters )
320+ set_model_parameters (new_model_parameters )
319321
320- def create_model ():
321- model .value = model .value .__class__ (** model_parameters )
322- model .value ._seed = reactive_seed .value
322+ UserInputs (user_params , on_change = on_change )
323323
324- solara .use_effect (create_model , [model_parameters , reactive_seed .value ])
325324
326- with solara .Row (justify = "space-between" ):
327- solara .InputText (
328- label = "Seed" ,
329- value = reactive_seed ,
330- continuous_update = True ,
331- )
325+ def _check_model_params (init_func , model_params ):
326+ """Check if model parameters are valid for the model's initialization function.
332327
333- solara .Button (label = "Reseed" , color = "primary" , on_click = do_reseed )
328+ Args:
329+ init_func: Model initialization function
330+ model_params: Dictionary of model parameters
334331
335- UserInputs (user_params , on_change = on_change )
332+ Raises:
333+ ValueError: If a parameter is not valid for the model's initialization function
334+ """
335+ model_parameters = inspect .signature (init_func ).parameters
336+ for name in model_parameters :
337+ if (
338+ model_parameters [name ].default == inspect .Parameter .empty
339+ and name not in model_params
340+ and name != "self"
341+ ):
342+ raise ValueError (f"Missing required model parameter: { name } " )
343+ for name in model_params :
344+ if name not in model_parameters :
345+ raise ValueError (f"Invalid model parameter: { name } " )
336346
337347
338348@solara .component
0 commit comments