Skip to content

Commit 033f202

Browse files
Fixes for compatibility with latest Catlab/ACSets (#15)
* fixes for new versions of Catlab/ACSets * drop Catlab dep, add ACSets; use parts rather than 1:nparts * fix tutorials and tests --------- Co-authored-by: Bíma, Jan <[email protected]>
1 parent aec5820 commit 033f202

21 files changed

+143
-144
lines changed

Project.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ uuid = "c7456e7d-545a-4b79-91ea-6e93d96dd4d4"
33
version = "0.2.7"
44

55
[deps]
6+
ACSets = "227ef7b5-1206-438b-ac65-934d6da304b8"
67
AlgebraicAgents = "f6eb0ae3-10fa-40e6-88dd-9006ba45093a"
78
CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b"
8-
Catlab = "134e5e36-593f-5add-ad60-77f754baafbe"
99
ComponentArrays = "b0b7db55-cfe3-40fc-9ded-d10e2dbeff66"
1010
Crayons = "a8cc5b0e-0ffa-5ad4-8c14-923d3ee1735f"
1111
DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"
@@ -28,8 +28,8 @@ TOML = "fa267f1f-6049-4f14-aa54-33bafae1ed76"
2828
Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c"
2929

3030
[compat]
31+
ACSets = "0.2.6"
3132
CSV = "0.10"
32-
Catlab = "0.14"
3333
ComponentArrays = "0.14"
3434
Crayons = "4.1"
3535
DataFrames = "1.6"

docs/build/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<!DOCTYPE html>
2-
<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>API Documentation · ReactiveDynamics.jl API Documentation</title><script data-outdated-warner src="assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.045/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.13.24/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL="."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="assets/documenter.js"></script><script src="siteinfo.js"></script><script src="../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="assets/themeswap.js"></script></head><body><div id="documenter"><nav class="docs-sidebar"><div class="docs-package-name"><span class="docs-autofit"><a href="index.html">ReactiveDynamics.jl API Documentation</a></span></div><form class="docs-search" action="search.html"><input class="docs-search-query" id="documenter-search-query" name="q" type="text" placeholder="Search docs"/></form><ul class="docs-menu"><li class="is-active"><a class="tocitem" href="index.html">API Documentation</a><ul class="internal"><li><a class="tocitem" href="#Create-a-model"><span>Create a model</span></a></li><li><a class="tocitem" href="#Modify-a-model"><span>Modify a model</span></a></li><li><a class="tocitem" href="#Resource-costs"><span>Resource costs</span></a></li><li><a class="tocitem" href="#Add-reactions"><span>Add reactions</span></a></li><li><a class="tocitem" href="#Set-initial-values,-uncertainty,-and-solver-arguments"><span>Set initial values, uncertainty, and solver arguments</span></a></li><li><a class="tocitem" href="#Model-unions"><span>Model unions</span></a></li><li><a class="tocitem" href="#Model-import-and-export"><span>Model import and export</span></a></li><li><a class="tocitem" href="#Solution-import-and-export"><span>Solution import and export</span></a></li><li><a class="tocitem" href="#Problematize,sSolve,-and-plot"><span>Problematize,sSolve, and plot</span></a></li><li><a class="tocitem" href="#Optimization-and-fitting"><span>Optimization and fitting</span></a></li></ul></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><nav class="breadcrumb"><ul class="is-hidden-mobile"><li class="is-active"><a href="index.html">API Documentation</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href="index.html">API Documentation</a></li></ul></nav><div class="docs-right"><a class="docs-edit-link" href="https://github.com//blob/main/docs/src/index.md" title="Edit on GitHub"><span class="docs-icon fab"></span><span class="docs-label is-hidden-touch">Edit on GitHub</span></a><a class="docs-settings-button fas fa-cog" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-sidebar-button fa fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a></div></header><article class="content" id="documenter-page"><h1 id="API-Documentation"><a class="docs-heading-anchor" href="#API-Documentation">API Documentation</a><a id="API-Documentation-1"></a><a class="docs-heading-anchor-permalink" href="#API-Documentation" title="Permalink"></a></h1><h2 id="Create-a-model"><a class="docs-heading-anchor" href="#Create-a-model">Create a model</a><a id="Create-a-model-1"></a><a class="docs-heading-anchor-permalink" href="#Create-a-model" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-binding" id="ReactiveDynamics.@ReactionNetwork" href="#ReactiveDynamics.@ReactionNetwork"><code>ReactiveDynamics.@ReactionNetwork</code></a><span class="docstring-category">Macro</span></header><section><div><p>Macro that takes an expression corresponding to a reaction network and outputs an instance of <code>TheoryReactionNetwork</code> that can be converted to a <code>DiscreteProblem</code> or solved directly.</p><p>Most arrows accepted (both right, left, and bi-drectional arrows). Use 0 or ∅ for annihilation/creation to/from nothing.</p><p>Custom functions and sampleable objects can be used as numeric parameters. Note that these have to be accessible from ReactiveDynamics&#39;s source code.</p><p><strong>Examples</strong></p><pre><code class="language-julia hljs">acs = @ReactionNetwork begin
2+
<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>API Documentation · ReactiveDynamics.jl API Documentation</title><script data-outdated-warner src="assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.045/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.13.24/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL="."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="assets/documenter.js"></script><script src="siteinfo.js"></script><script src="../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="assets/themeswap.js"></script></head><body><div id="documenter"><nav class="docs-sidebar"><div class="docs-package-name"><span class="docs-autofit"><a href="index.html">ReactiveDynamics.jl API Documentation</a></span></div><form class="docs-search" action="search.html"><input class="docs-search-query" id="documenter-search-query" name="q" type="text" placeholder="Search docs"/></form><ul class="docs-menu"><li class="is-active"><a class="tocitem" href="index.html">API Documentation</a><ul class="internal"><li><a class="tocitem" href="#Create-a-model"><span>Create a model</span></a></li><li><a class="tocitem" href="#Modify-a-model"><span>Modify a model</span></a></li><li><a class="tocitem" href="#Resource-costs"><span>Resource costs</span></a></li><li><a class="tocitem" href="#Add-reactions"><span>Add reactions</span></a></li><li><a class="tocitem" href="#Set-initial-values,-uncertainty,-and-solver-arguments"><span>Set initial values, uncertainty, and solver arguments</span></a></li><li><a class="tocitem" href="#Model-unions"><span>Model unions</span></a></li><li><a class="tocitem" href="#Model-import-and-export"><span>Model import and export</span></a></li><li><a class="tocitem" href="#Solution-import-and-export"><span>Solution import and export</span></a></li><li><a class="tocitem" href="#Problematize,sSolve,-and-plot"><span>Problematize,sSolve, and plot</span></a></li><li><a class="tocitem" href="#Optimization-and-fitting"><span>Optimization and fitting</span></a></li></ul></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><nav class="breadcrumb"><ul class="is-hidden-mobile"><li class="is-active"><a href="index.html">API Documentation</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href="index.html">API Documentation</a></li></ul></nav><div class="docs-right"><a class="docs-edit-link" href="https://github.com//blob/main/docs/src/index.md" title="Edit on GitHub"><span class="docs-icon fab"></span><span class="docs-label is-hidden-touch">Edit on GitHub</span></a><a class="docs-settings-button fas fa-cog" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-sidebar-button fa fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a></div></header><article class="content" id="documenter-page"><h1 id="API-Documentation"><a class="docs-heading-anchor" href="#API-Documentation">API Documentation</a><a id="API-Documentation-1"></a><a class="docs-heading-anchor-permalink" href="#API-Documentation" title="Permalink"></a></h1><h2 id="Create-a-model"><a class="docs-heading-anchor" href="#Create-a-model">Create a model</a><a id="Create-a-model-1"></a><a class="docs-heading-anchor-permalink" href="#Create-a-model" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-binding" id="ReactiveDynamics.@ReactionNetwork" href="#ReactiveDynamics.@ReactionNetwork"><code>ReactiveDynamics.@ReactionNetwork</code></a><span class="docstring-category">Macro</span></header><section><div><p>Macro that takes an expression corresponding to a reaction network and outputs an instance of <code>TheoryReactionNetwork</code> that can be converted to a <code>DiscreteProblem</code> or solved directly.</p><p>Most arrows accepted (both right, left, and bi-drectional arrows). Use 0 or ∅ for annihilation/creation to/from nothing.</p><p>Custom functions and sampleable objects can be used as numeric parameters. Note that these have to be accessible from ReactiveDynamics&#39;s source code.</p><p><strong>Examples</strong></p><pre><code class="language-julia hljs">acs = @ReactionNetworkSchema begin
33
1.0, X ⟶ Y
44
1.0, X ⟶ Y, priority=&gt;6., prob=&gt;.7, capacity=&gt;3.
55
1.0, ∅ --&gt; (Poisson(.3γ)X, Poisson(.5)Y)

docs/build/search_index.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

readme.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ Follow the SIR model's reactions:
6868
using ReactiveDynamics
6969

7070
# model dynamics
71-
sir_acs = @ReactionNetwork begin
71+
sir_acs = @ReactionNetworkSchema begin
7272
α*S*I, S+I --> 2I, name=>I2R
7373
β*I, I --> R, name=>R2S
7474
end
@@ -196,7 +196,7 @@ To harness the capabilities of **GeneratedExpressions.jl**, let us first declare
196196
end
197197

198198
# generate submodel dynamics
199-
push!(rd_models, @ReactionNetwork begin
199+
push!(rd_models, @ReactionNetworkSchema begin
200200
M[$i][$m, $n], state[$m] + {demand[$i][$m, $n, $l]*resource[$l], l=1:$r, dlm=+} --> state[$n] +
201201
{production[$i][$m, $n, $l]*resource[$l], l=1:$r, dlm=+}, cycle_time=>cycle_times[$i][$m, $n], probability_of_success=>$m*$n/(n[$i])^2
202202
end m=1:ReactiveDynamics.ns[$i] n=1:ReactiveDynamics.ns[$i]
@@ -292,7 +292,7 @@ end
292292
Next we set up a simple dynamics and supply initial parameters.
293293

294294
```julia
295-
acs = @ReactionNetwork begin
295+
acs = @ReactionNetworkSchema begin
296296
function_to_learn(A, B, C, params), A --> B+C
297297
1., B --> C
298298
2., C --> B

src/ReactiveDynamics.jl

Lines changed: 51 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module ReactiveDynamics
22

3-
using Catlab, Catlab.CategoricalAlgebra, Catlab.Present
3+
using ACSets
44
using Reexport
55
using MacroTools
66
using ComponentArrays
@@ -27,50 +27,50 @@ Base.@kwdef mutable struct FoldedObservable
2727
on::Vector{SampleableValues} = SampleableValues[]
2828
end
2929

30-
@present TheoryReactionNetwork(FreeSchema) begin
31-
(S, T)::Ob # species, transitions
32-
33-
(
34-
SymbolicAttributeT,
35-
DescriptiveAttributeT,
36-
SampleableAttributeT,
37-
ModalityAttributeT,
38-
PcsOptT,
39-
PrmAttributeT,
40-
)::AttrType
41-
42-
specName::Attr(S, SymbolicAttributeT)
43-
specModality::Attr(S, ModalityAttributeT)
44-
specInitVal::Attr(S, SampleableAttributeT)
45-
specInitUncertainty::Attr(S, SampleableAttributeT)
46-
(specCost, specReward, specValuation)::Attr(S, SampleableAttributeT)
47-
48-
trans::Attr(T, SampleableAttributeT)
49-
transPriority::Attr(T, SampleableAttributeT)
50-
transRate::Attr(T, SampleableAttributeT)
51-
transCycleTime::Attr(T, SampleableAttributeT)
52-
transProbOfSuccess::Attr(T, SampleableAttributeT)
53-
transCapacity::Attr(T, SampleableAttributeT)
54-
transMaxLifeTime::Attr(T, SampleableAttributeT)
55-
transPostAction::Attr(T, SampleableAttributeT)
56-
transMultiplier::Attr(T, SampleableAttributeT)
57-
transName::Attr(T, DescriptiveAttributeT)
58-
59-
E::Ob # events
60-
(eventTrigger, eventAction)::Attr(E, SampleableAttributeT)
61-
62-
obs::Ob # processes (observables)
63-
obsName::Attr(obs, SymbolicAttributeT)
64-
obsOpts::Attr(obs, PcsOptT)
65-
66-
(P, M)::Ob # model params, solver args
67-
68-
prmName::Attr(P, SymbolicAttributeT)
69-
prmVal::Attr(P, PrmAttributeT)
70-
71-
metaKeyword::Attr(M, SymbolicAttributeT)
72-
metaVal::Attr(M, SampleableAttributeT)
73-
end
30+
TheoryReactionNetwork = BasicSchema(
31+
[:S, :T, :E, :obs, :P, :M], # species, transitions, events, processes (observables), model params, solver args
32+
[], # no homs
33+
[
34+
:SymbolicAttributeT,
35+
:DescriptiveAttributeT,
36+
:SampleableAttributeT,
37+
:ModalityAttributeT,
38+
:PcsOptT,
39+
:PrmAttributeT,
40+
], # AttrTypes
41+
[
42+
# species
43+
(:specName, :S, :SymbolicAttributeT),
44+
(:specModality, :S, :ModalityAttributeT),
45+
(:specInitVal, :S, :SampleableAttributeT),
46+
(:specInitUncertainty, :S, :SampleableAttributeT),
47+
(:specCost, :S, :SampleableAttributeT),
48+
(:specReward, :S, :SampleableAttributeT),
49+
(:specValuation, :S, :SampleableAttributeT),
50+
# transitions
51+
(:trans, :T, :SampleableAttributeT),
52+
(:transPriority, :T, :SampleableAttributeT),
53+
(:transRate, :T, :SampleableAttributeT),
54+
(:transCycleTime, :T, :SampleableAttributeT),
55+
(:transProbOfSuccess, :T, :SampleableAttributeT),
56+
(:transCapacity, :T, :SampleableAttributeT),
57+
(:transMaxLifeTime, :T, :SampleableAttributeT),
58+
(:transPostAction, :T, :SampleableAttributeT),
59+
(:transMultiplier, :T, :SampleableAttributeT),
60+
(:transName, :T, :DescriptiveAttributeT),
61+
# events
62+
(:eventTrigger, :E, :SampleableAttributeT),
63+
(:eventAction, :E, :SampleableAttributeT),
64+
# observables
65+
(:obsName, :obs, :SymbolicAttributeT),
66+
(:obsOpts, :obs, :PcsOptT),
67+
# params, args
68+
(:prmName, :P, :SymbolicAttributeT),
69+
(:prmVal, :P, :PrmAttributeT),
70+
(:metaKeyword, :M, :SymbolicAttributeT),
71+
(:metaVal, :M, :SampleableAttributeT),
72+
],
73+
)
7474

7575
@acset_type FoldedReactionNetworkType(TheoryReactionNetwork)
7676

@@ -93,6 +93,7 @@ Base.convert(::Type{Union{String,Symbol,Missing}}, ex::String) =
9393
end
9494

9595
Base.convert(::Type{SampleableValues}, ex::String) = MacroTools.striplines(Meta.parse(ex))
96+
9697
Base.convert(::Type{Set{Symbol}}, ex::String) = eval(Meta.parse(ex))
9798
Base.convert(::Type{FoldedObservable}, ex::String) = eval(Meta.parse(ex))
9899

@@ -137,23 +138,18 @@ species_modalities = [:nonblock, :conserved, :rate]
137138

138139
function assign_defaults!(acs::ReactionNetworkSchema)
139140
for (_, v_) in defargs, (k, v) in v_
140-
for i = 1:length(subpart(acs, k))
141-
isnothing(acs[i, k]) && (subpart(acs, k)[i] = v)
141+
for i in dom_parts(acs, k)
142+
isnothing(acs[i, k]) && (acs[i, k] = v)
142143
end
143144
end
144145

145146
foreach(
146-
i ->
147-
!isnothing(acs[i, :specModality]) ||
148-
(subpart(acs, :specModality)[i] = Set{Symbol}()),
149-
1:nparts(acs, :S),
147+
i -> !isnothing(acs[i, :specModality]) || (acs[i, :specModality] = Set{Symbol}()),
148+
parts(acs, :S),
150149
)
151150
k = [:specCost, :specReward, :specValuation]
152151
foreach(
153-
k -> foreach(
154-
i -> !isnothing(acs[i, k]) || (subpart(acs, k)[i] = 0.0),
155-
1:nparts(acs, :S),
156-
),
152+
k -> foreach(i -> !isnothing(acs[i, k]) || (acs[i, k] = 0.0), parts(acs, :S)),
157153
k,
158154
)
159155

src/compilers.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ function compile_attrs(acs::ReactionNetworkSchema)
164164
transitions[:transActivated] = fill(true, nparts(acs, :T))
165165
transitions[:transToSpawn] = zeros(nparts(acs, :T))
166166
transitions[:transHash] =
167-
[coalesce(acs[i, :transName], gensym()) for i = 1:nparts(acs, :T)]
167+
[coalesce(acs[i, :transName], gensym()) for i in parts(acs, :T)]
168168

169169
return attrs, transitions, wrap_fun
170170
end

src/interface/update.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ macro name_transition(acsex, exs...)
7070
acs = $(esc(acsex))
7171
ixs = findall(
7272
i -> string(acs[i, :transName]) == $(string(ex.args[1])),
73-
1:nparts(acs, :T),
73+
parts(acs, :T),
7474
)
7575
foreach(i -> acs[i, :transName] = $(string(ex.args[2])), ixs)
7676
end

src/loadsave.jl

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ function export_network(acs::ReactionNetworkSchema)
2828
dict = Dict()
2929
for (key, val) in objects_aliases
3030
push!(dict, val => [])
31-
for i = 1:nparts(acs, key)
31+
for i in parts(acs, key)
3232
dict_ = Dict()
3333
for attr in get_attrs(val)
3434
attr_val = acs[i, Symbol(attr)]
@@ -44,13 +44,16 @@ function export_network(acs::ReactionNetworkSchema)
4444
end
4545

4646
function load_network(dict::Dict)
47-
acs = ReactionNetwork()
47+
acs = ReactionNetworkSchema()
4848
for (key, val) in objects_aliases
4949
val == "prm" && continue
5050
for row in get(dict, val, [])
5151
i = add_part!(acs, key)
5252
for (attr, attrval) in row
5353
set_subpart!(acs, i, Symbol(attr), attrval)
54+
if (acs[i, Symbol(attr)] isa String && !(contains(attr, "name")))
55+
acs[i, Symbol(attr)] = MacroTools.striplines(Meta.parse(attrval))
56+
end
5457
end
5558
end
5659
end
@@ -230,10 +233,10 @@ Export a solution as a `DataFrame`.
230233
```
231234
"""
232235
macro export_solution_as_table(solex, pathex = "sol.jld2")
233-
return :(DataFrame($(esc(solex))))
236+
return :(DataFrame($(esc(solex)).sol))
234237
end
235238

236-
get_DataFrame(sol) = sol isa EnsembleSolution ? DataFrame(sol)[!, [:u, :t]] : DataFrame(sol)
239+
get_DataFrame(sol) = sol.sol
237240

238241
"""
239242
@export_solution_as_csv sol

src/operators/equalize.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ function equalize!(acs::ReactionNetworkSchema, eqs = [])
2727
block_alias = findfirst(e -> e[1] == :alias, block)
2828
block_alias = !isnothing(block_alias) ? block[block_alias][2] : first(block)[2]
2929
species_ixs = Int64[]
30-
for e in block, i = 1:nparts(acs, :S)
30+
for e in block, i in parts(acs, :S)
3131
(
3232
(i == e[2]) ||
3333
(

0 commit comments

Comments
 (0)