Skip to content

dictionary support for de.jit #120

@sibyjackgrove

Description

@sibyjackgrove

First of all, thank you very much for 6770470 and fc32432. I am trying to solve multiple ODEs at once by concatenating them using the below code. The code without de.jit works fine.

func = de.ODEFunction(combined_model)
prob = de.ODEProblem(func, y0, (t0, dt),pvder_dict)
prob_jit = de.jit(prob ) #Error occurs if I use de.jit

def combined_model(dy,y,p,t):
	"""Concatenate ODE residuals from multiple models of same type"""

	i = 0
	pvder_dict = p
	for dss_id in pvder_dict:
		for node in pvder_dict[dss_id]:			
			for der_id in pvder_dict[dss_id][node]:
				sim = pvder_dict[dss_id][node][der_id]["sim"]
				nEqs = sim.DER_model.n_ODE
				start_index = i * nEqs
				end_index = (i + 1) * nEqs
				dy[start_index:end_index] = sim.ODE_model(y[start_index:end_index],t)
				i += 1
			
	return dy

However, if I use de.jit I am getting the following error:
@ChrisRackauckas @LilithHafner could you suggest something that I could try out? For individual ODE, I can get up to 10 times speed up with de.jit. However, my application requires solving hundreds of ODE models simultaneously.

  File "/home/tdcosim_cloud/tdcosim_cloud/model/pvder/odesolverutilities.py", line 154, in get_diffeqpy_integrator
    diffeqpy_ode = ode.jit(diffeqpy_ode)
                   ^^^^^^^^^^^^^^^^^^^^^
  File "/root/.julia/packages/PythonCall/qTEA1/src/jlwrap/any.jl", line 208, in __call__
    return self._jl_callmethod($(pyjl_methodnum(pyjlany_call)), args, kwargs)
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/tdcosim_cloud/tdcosim_cloud/model/pvder/odesolverutilities.py", line 103, in funcval_diffeqpy
    for der_id in pvder_dict[dss_id][node]:
                  ~~~~~~~~~~~~~~~~~~^^^^^^
  File "/root/.julia/packages/PythonCall/qTEA1/src/jlwrap/any.jl", line 214, in __getitem__
    return self._jl_callmethod($(pyjl_methodnum(pyjlany_getitem)), k)
       ^^^^^^^^^^^^^^^^^^^^^^^^^^
juliacall.JuliaError: MethodError: no method matching getindex(::Symbolics.Num, ::Symbolics.Num)

Closest candidates are:
  getindex(::Number)
   @ Base number.jl:95
  getindex(::Union{AbstractChar, Number}, !Matched::CartesianIndex{0})
   @ Base multidimensional.jl:853
  getindex(::Number, !Matched::Integer)
   @ Base number.jl:96

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions