@@ -325,6 +325,22 @@ function Base.showerror(io::IO, err::UnexpectedSymbolicValueInVarmap)
325325 """ )
326326end
327327
328+ struct MissingGuessError <: Exception
329+ sym:: Any
330+ val:: Any
331+ end
332+
333+ function Base. showerror (io:: IO , err:: MissingGuessError )
334+ println (io,
335+ """
336+ The problem cannot be initialized without providing an additional numeric \
337+ guess to serve as a starting point for solving for the initial state. Please \
338+ provide another numeric value to `guesses` in the problem constructor.
339+
340+ This error was thrown because symbolic value $(err. val) was found for variable $(err. sym) .
341+ """ )
342+ end
343+
328344"""
329345 $(TYPEDSIGNATURES)
330346
@@ -342,10 +358,11 @@ Keyword arguments:
342358 [`missingvars`](@ref) to perform the check.
343359- `allow_symbolic` allows the returned array to contain symbolic values. If this is `true`,
344360 `promotetoconcrete` is set to `false`.
361+ - `is_initializeprob`: Whether the parent problem is an initialization problem.
345362"""
346363function better_varmap_to_vars (varmap:: AbstractDict , vars:: Vector ;
347364 tofloat = true , use_union = true , container_type = Array,
348- toterm = default_toterm, promotetoconcrete = nothing , check = true , allow_symbolic = false )
365+ toterm = default_toterm, promotetoconcrete = nothing , check = true , allow_symbolic = false , is_initializeprob = false )
349366 isempty (vars) && return nothing
350367
351368 if check
@@ -356,7 +373,11 @@ function better_varmap_to_vars(varmap::AbstractDict, vars::Vector;
356373 if ! allow_symbolic
357374 for (sym, val) in zip (vars, vals)
358375 symbolic_type (val) == NotSymbolic () && continue
359- throw (UnexpectedSymbolicValueInVarmap (sym, val))
376+ if is_initializeprob
377+ throw (MissingGuessError (sym, val))
378+ else
379+ throw (UnexpectedSymbolicValueInVarmap (sym, val))
380+ end
360381 end
361382 end
362383
@@ -704,7 +725,7 @@ Keyword arguments:
704725- `fully_determined`: Override whether the initialization system is fully determined.
705726- `check_initialization_units`: Enable or disable unit checks when constructing the
706727 initialization problem.
707- - `tofloat`, `use_union`: Passed to [`better_varmap_to_vars`](@ref) for building `u0` (and
728+ - `tofloat`, `use_union`, `is_initializeprob` : Passed to [`better_varmap_to_vars`](@ref) for building `u0` (and
708729 possibly `p`).
709730- `u0_constructor`: A function to apply to the `u0` value returned from `better_varmap_to_vars`
710731 to construct the final `u0` value.
@@ -742,7 +763,7 @@ function process_SciMLProblem(
742763 circular_dependency_max_cycles = 10 ,
743764 substitution_limit = 100 , use_scc = true ,
744765 force_initialization_time_independent = false , algebraic_only = false ,
745- allow_incomplete = false , kwargs... )
766+ allow_incomplete = false , is_initializeprob = false , kwargs... )
746767 dvs = unknowns (sys)
747768 ps = parameters (sys; initial_parameters = true )
748769 iv = has_iv (sys) ? get_iv (sys) : nothing
@@ -815,7 +836,7 @@ function process_SciMLProblem(
815836
816837 u0 = better_varmap_to_vars (
817838 op, dvs; tofloat = true , use_union = false ,
818- container_type = u0Type, allow_symbolic = symbolic_u0)
839+ container_type = u0Type, allow_symbolic = symbolic_u0, is_initializeprob )
819840
820841 if u0 != = nothing
821842 u0 = u0_constructor (u0)
0 commit comments