@@ -412,6 +412,8 @@ function SII.observed(nw::Network, snis)
412412 stateidx = Dict {Int, Int} ()
413413 # mapping i -> index in output
414414 outidx = Dict {Int, Int} ()
415+ # mapping i -> index in aggbuf
416+ aggidx = Dict {Int, Int} ()
415417 # mapping i -> f(fullstate, p, t) (component observables)
416418 obsfuns = Dict {Int, Function} ()
417419 for (i, sni) in enumerate (_snis)
@@ -427,12 +429,28 @@ function SII.observed(nw::Network, snis)
427429 elseif (idx= findfirst (isequal (sni. subidx), obssym (cf))) != nothing # found in observed
428430 _obsf = _get_observed_f (nw, cf, resolvecompidx (nw, sni))
429431 obsfuns[i] = (u, outbuf, aggbuf, extbuf, p, t) -> _obsf (u, outbuf, aggbuf, extbuf, p, t)[idx]
432+ elseif hasinsym (cf) && sni. subidx ∈ insym_all (cf) # found in input
433+ if sni isa SymbolicVertexIndex
434+ idx = findfirst (isequal (sni. subidx), insym_all (cf))
435+ aggidx[i] = nw. im. v_aggr[resolvecompidx (nw, sni)][idx]
436+ elseif sni isa SymbolicEdgeIndex
437+ edge = nw. im. edgevec[resolvecompidx (nw, sni)]
438+ if (idx = findfirst (isequal (sni. subidx), insym (cf). src)) != nothing
439+ outidx[i] = nw. im. v_out[edge. src][idx]
440+ elseif (idx = findfirst (isequal (sni. subidx), insym (cf). dst)) != nothing
441+ outidx[i] = nw. im. v_out[edge. dst][idx]
442+ else
443+ error ()
444+ end
445+ else
446+ error ()
447+ end
430448 else
431449 throw (ArgumentError (" Cannot resolve observable $sni " ))
432450 end
433451 end
434452 end
435- initbufs = ! isempty (outidx) || ! isempty (obsfuns)
453+ initbufs = ! isempty (outidx) || ! isempty (aggidx) || ! isempty ( obsfuns)
436454
437455 if isscalar
438456 @closure (u, p, t) -> begin
@@ -443,6 +461,9 @@ function SII.observed(nw::Network, snis)
443461 elseif ! isempty (outidx)
444462 idx = only (outidx). second
445463 outbuf[idx]
464+ elseif ! isempty (aggidx)
465+ idx = only (aggidx). second
466+ aggbuf[idx]
446467 else
447468 obsf = only (obsfuns). second
448469 obsf (u, outbuf, aggbuf, extbuf, p, t):: eltype (u)
@@ -459,6 +480,9 @@ function SII.observed(nw::Network, snis)
459480 for (i, outi) in outidx
460481 out[i] = outbuf[outi]
461482 end
483+ for (i, aggi) in aggidx
484+ out[i] = aggbuf[aggi]
485+ end
462486 for (i, obsf) in obsfuns
463487 out[i] = obsf (u, outbuf, aggbuf, extbuf, p, t):: eltype (u)
464488 end
0 commit comments