Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion Project.toml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ DocStringExtensions = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae"
DynamicPolynomials = "7c1d4256-1411-5781-91ec-d7bc3513ac07"
DynamicQuantities = "06fc5a27-2a28-4c7c-a15d-362465fb6821"
EnumX = "4e289a0a-7415-4d19-859d-a7e5c4648b56"
ExplicitImports = "7d51a73a-1435-4ff3-83d9-f097790105c7"
Graphs = "86223c79-3864-5bf0-83f7-82e725a168b6"
JumpProcesses = "ccbc3e58-028d-4f4c-8cd5-9ae44345cda5"
LaTeXStrings = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f"
Expand All @@ -24,6 +25,7 @@ RuntimeGeneratedFunctions = "7e49a35a-f44a-4d26-94aa-eba1b4ca6b47"
SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462"
Setfield = "efcf1570-3423-57d1-acb7-fd33fddbac46"
SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
SymbolicIndexingInterface = "2efcf032-c050-4f8e-a9bb-153293bab1f5"
SymbolicUtils = "d1185830-fcd6-423d-90d6-eec64667417b"
Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7"
Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d"
Expand Down Expand Up @@ -54,6 +56,7 @@ DocStringExtensions = "0.8, 0.9"
DynamicPolynomials = "0.6"
DynamicQuantities = "1"
EnumX = "1"
ExplicitImports = "1.13.1"
GraphMakie = "0.5"
Graphs = "1.4"
HomotopyContinuation = "2.9"
Expand All @@ -71,12 +74,14 @@ RuntimeGeneratedFunctions = "0.5.12"
SciMLBase = "2.84"
Setfield = "1"
StructuralIdentifiability = "0.5.11"
SymbolicIndexingInterface = "0.3"
SymbolicUtils = "3.20"
Symbolics = "6.31.1"
Unitful = "1.12.4"
julia = "1.10"

[extras]
Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595"
DataInterpolations = "82cc6244-b520-54b8-b5a6-8a565e85f1d0"
DiffEqCallbacks = "459566f4-90b8-5000-8ac3-15dfb0a30def"
DomainSets = "5b8099bc-c8ec-5219-889f-1d9e522a28bf"
Expand All @@ -100,4 +105,4 @@ StochasticDiffEq = "789caeaf-c7a9-5a7d-9973-96adeb23e2a0"
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"

[targets]
test = ["DataInterpolations", "DiffEqCallbacks", "DomainSets", "Logging", "NonlinearSolve", "OrdinaryDiffEqBDF", "OrdinaryDiffEqDefault", "OrdinaryDiffEqRosenbrock", "OrdinaryDiffEqTsit5", "OrdinaryDiffEqVerner", "Pkg", "Plots", "Random", "SafeTestsets", "StableRNGs", "StaticArrays", "Statistics", "SteadyStateDiffEq", "StochasticDiffEq", "Test"]
test = ["Aqua", "DataInterpolations", "DiffEqCallbacks", "DomainSets", "Logging", "NonlinearSolve", "OrdinaryDiffEqBDF", "OrdinaryDiffEqDefault", "OrdinaryDiffEqRosenbrock", "OrdinaryDiffEqTsit5", "OrdinaryDiffEqVerner", "Pkg", "Plots", "Random", "SafeTestsets", "StableRNGs", "StaticArrays", "Statistics", "SteadyStateDiffEq", "StochasticDiffEq", "Test"]
4 changes: 3 additions & 1 deletion ext/CatalystBifurcationKitExtension.jl
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
module CatalystBifurcationKitExtension

# Fetch packages.
using Catalyst
using Catalyst: Catalyst, ReactionSystem, NonlinearSystem, ModelingToolkit,
isautonomous, get_iv, symmap_to_varmap, conservationlaw_constants,
complete, conservationlaw_errorcheck, get_networkproperties
import BifurcationKit as BK

# Extends BifurcationProblem to work for ReactionSystem.
Expand Down
7 changes: 4 additions & 3 deletions ext/CatalystCairoMakieExtension.jl
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
module CatalystCairoMakieExtension

# Fetch packages.
using Catalyst, CairoMakie, SparseArrays
import Catalyst: lattice_plot, lattice_animation, lattice_kymograph,
demask_vals, extract_vals, extract_grid_axes
using Catalyst: Catalyst, lattice_plot, lattice_animation, lattice_kymograph,
demask_vals, extract_vals, extract_grid_axes
using CairoMakie: CairoMakie
using SparseArrays: SparseArrays

# Creates and exports utilities for plotting lattice simulations.
include("CatalystCairoMakieExtension/cairo_makie_extension_spatial_modelling.jl")
Expand Down
11 changes: 8 additions & 3 deletions ext/CatalystGraphMakieExtension.jl
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
module CatalystGraphMakieExtension

# Fetch packages.
using Catalyst, GraphMakie, Graphs, Symbolics, SparseArrays, NetworkLayout, Makie
using Symbolics: get_variables!
import Catalyst: species_reaction_graph, incidencematgraph, lattice_plot, lattice_animation
using Catalyst: Catalyst, species_reaction_graph, incidencematgraph,
lattice_plot, lattice_animation
using GraphMakie: GraphMakie
using Graphs: Graphs
using Symbolics: Symbolics, get_variables!
using SparseArrays: SparseArrays
using NetworkLayout: NetworkLayout
using Makie: Makie

# Creates and exports graph plotting functions.
include("CatalystGraphMakieExtension/graph_makie_extension_spatial_modelling.jl")
Expand Down
9 changes: 7 additions & 2 deletions ext/CatalystHomotopyContinuationExtension.jl
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
module CatalystHomotopyContinuationExtension

# Fetch packages.
using Catalyst
using Catalyst: Catalyst, ReactionSystem, NonlinearSystem, ModelingToolkit,
isautonomous, get_iv, complete, conservationlaw_constants,
conservedequations, species, unknowns, parameters, substitute,
symmap_to_varmap, get_networkproperties, conservationlaw_errorcheck,
hc_steady_states, Initial, equations, defaults, mm, hill
import DynamicPolynomials
import ModelingToolkit as MT
import HomotopyContinuation as HC
import Setfield: @set
import Symbolics: unwrap, wrap, Rewriters, symtype, issym, maketerm, BasicSymbolic, metadata
using Symbolics: iscall
using Symbolics: iscall, simplify, simplify_fractions, solve, arguments, operation,
sorted_arguments

# Creates and exports hc_steady_states function.
include("CatalystHomotopyContinuationExtension/homotopy_continuation_extension.jl")
Expand Down
7 changes: 5 additions & 2 deletions ext/CatalystStructuralIdentifiabilityExtension.jl
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
module CatalystStructuralIdentifiabilityExtension

# Fetch packages.
using Catalyst
import DataStructures.OrderedDict
using Catalyst: Catalyst, ReactionSystem, ODESystem, ModelingToolkit, Equation,
complete, conservationlaw_constants, conservedequations,
species, unknowns, parameters, substitute, equations,
observed, flatten, defaults, make_si_ode
import DataStructures: OrderedDict
import StructuralIdentifiability as SI

# Creates and exports make_si_ode function.
Expand Down
64 changes: 40 additions & 24 deletions src/Catalyst.jl
Original file line number Diff line number Diff line change
Expand Up @@ -3,50 +3,66 @@ $(DocStringExtensions.README)
"""
module Catalyst

using DocStringExtensions
using SparseArrays, DiffEqBase, Reexport, Setfield, EnumX
using LaTeXStrings, Latexify, Requires
using LinearAlgebra, Combinatorics
using DocStringExtensions: DocStringExtensions, FIELDS, TYPEDEF, README
using SparseArrays: SparseArrays, AbstractSparseArray, SparseMatrixCSC,
SparseVector, findnz, issparse, nnz, nonzeros, nzrange,
rowvals, sparse, spzeros
using DiffEqBase: DiffEqBase, ODESolution, SciMLBase, deleteat!, remake
using Reexport: Reexport, @reexport
using Setfield: Setfield, @set, @set!, get
using EnumX: EnumX, @enumx
using LaTeXStrings: LaTeXStrings, LaTeXString
using Latexify: Latexify, @latexrecipe, latexraw, md
using Requires: Requires
using LinearAlgebra: LinearAlgebra, I, rank, tr, eigvals
using Combinatorics: Combinatorics, factorial
using JumpProcesses: JumpProcesses, JumpProblem,
MassActionJump, ConstantRateJump, VariableRateJump,
SpatialMassActionJump, CartesianGrid, CartesianGridRej

# ModelingToolkit imports and convenience functions we use
using ModelingToolkit
using ModelingToolkit: ModelingToolkit, @parameters, @unpack, DiscreteProblem,
Initial, JumpSystem, NonlinearProblem, NonlinearSystem,
ODEFunction, ODEProblem, ODESystem, SDEProblem,
SDESystem, SteadyStateProblem, Sym, asgraph, complete,
continuous_events, defaults, discrete_events, entry,
eqeq_dependencies, equations, has_alg_equations,
independent_variables, observed, parameters, unknowns,
variable_dependencies, D_nounits, t_nounits
const MT = ModelingToolkit
using DynamicQuantities #, Unitful # Having Unitful here as well currently gives an error.
using DynamicQuantities: DynamicQuantities

@reexport using ModelingToolkit
using Symbolics
using LinearAlgebra
using RuntimeGeneratedFunctions
using Symbolics: Symbolics, @register_symbolic, @variables, Differential,
Equation, Num, PolyForm, SymbolicUtils, arguments,
build_function, operation, substitute, iscall, sorted_arguments
using RuntimeGeneratedFunctions: RuntimeGeneratedFunctions,
@RuntimeGeneratedFunction, drop_expr
RuntimeGeneratedFunctions.init(@__MODULE__)

import Symbolics: BasicSymbolic
using Symbolics: iscall, sorted_arguments
using ModelingToolkit: Symbolic, value, get_unknowns, get_ps, get_iv, get_systems,
get_eqs, get_defaults, toparam, get_var_to_name, get_observed,
getvar, has_iv
import SymbolicUtils: BasicSymbolic
import SymbolicUtils: Symbolic
import Symbolics: value
using ModelingToolkit: get_unknowns, get_ps, get_iv, get_systems,
get_eqs, get_defaults, get_observed, has_iv

import ModelingToolkit: get_variables, namespace_expr, namespace_equation, get_variables!,
modified_unknowns!, validate, namespace_variables,
namespace_parameters, rename, renamespace, getname, flatten,
is_alg_equation, is_diff_equation, collect_vars!,
eqtype_supports_collect_vars
import ModelingToolkit: get_variables, namespace_expr, namespace_equation,
validate, namespace_variables, flatten, is_diff_equation
import Symbolics: get_variables!
import SymbolicIndexingInterface: getname

# internal but needed ModelingToolkit functions
import ModelingToolkit: check_variables,
check_parameters, _iszero, _merge, check_units,
get_unit, check_equations, iscomplete

import Base: (==), hash, size, getindex, setindex, isless, Sort.defalg, length, show
import Base: (==), hash, size, getindex, isless, Sort.defalg, length, show, occursin
import MacroTools, Graphs
using MacroTools: striplines
import Graphs: DiGraph, SimpleGraph, SimpleDiGraph, vertices, edges, add_vertices!, nv, ne
import Graphs: DiGraph, SimpleGraph, SimpleDiGraph, edges, nv, ne
import DataStructures: OrderedDict, OrderedSet
import Parameters: @with_kw_noshow
import Symbolics: occursin, wrap
import Symbolics.RewriteHelpers: hasnode, replacenode
using Symbolics.RewriteHelpers: hasnode, replacenode
import SymbolicUtils: getmetadata, hasmetadata, setmetadata

# globals for the modulate
Expand Down Expand Up @@ -170,7 +186,7 @@ export isedgeparameter
include("spatial_reaction_systems/lattice_reaction_systems.jl")
export LatticeReactionSystem
export spatial_species, vertex_parameters, edge_parameters
export CartesianGrid, CartesianGridReJ # (Implemented in JumpProcesses)
export CartesianGrid, CartesianGridRej # (Implemented in JumpProcesses)
export has_cartesian_lattice, has_masked_lattice, has_grid_lattice, has_graph_lattice,
grid_dims, grid_size
export make_edge_p_values, make_directed_edge_values
Expand Down
62 changes: 62 additions & 0 deletions test/qa.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
using Test
using Catalyst
using Aqua
using ExplicitImports

@testset "Code quality (Aqua.jl)" begin
# Test with Aqua.jl - testing code quality
# We allow unbound type parameters in some constructors
# We allow some ambiguities that are hard to resolve without breaking changes
Aqua.test_all(Catalyst;
ambiguities = false, # TODO: Fix ambiguities in future PR
unbound_args = false, # Some constructors have unbound type parameters by design
stale_deps = false, # Some test dependencies might appear stale
piracies = false # We extend some Base/MTK methods which might be detected as piracy
)

# Test individual Aqua checks that we want to enforce
@testset "Aqua selective tests" begin
Aqua.test_undefined_exports(Catalyst)
Aqua.test_project_extras(Catalyst)
Aqua.test_deps_compat(Catalyst)
end
end

@testset "Explicit imports (ExplicitImports.jl)" begin
# Test that we're not relying on implicit imports
@testset "No implicit imports" begin
# Main module should have no implicit imports
@test isnothing(check_no_implicit_imports(Catalyst; skip = (Base, Core)))
end

@testset "No stale explicit imports" begin
# Check for unused explicit imports (allowing some that might be used in macros)
stale_imports = check_no_stale_explicit_imports(Catalyst; skip = (Base, Core))
if !isnothing(stale_imports)
# Allow some exceptions for imports that are used in macros or re-exported
allowed_stale = [
:MacroTools, # Used in DSL macros
:Graphs, # Some imports might be re-exported
:DataStructures # Used in internal data structures
]
for (mod, imports) in stale_imports
filtered = filter(x -> !(x in allowed_stale), imports)
if !isempty(filtered)
@warn "Stale imports in $mod: $filtered"
end
end
end
end

@testset "All qualified accesses are public" begin
# Check that we only use public APIs when accessing other modules with qualified names
@test isnothing(check_all_qualified_accesses_are_public(Catalyst))
end

@testset "Print analysis for review" begin
# This is not a test, but prints useful information for review
# It helps identify any remaining implicit imports or other issues
@info "Printing explicit imports analysis for Catalyst module:"
print_explicit_imports(Catalyst; strict = false)
end
end
5 changes: 5 additions & 0 deletions test/runtests.jl
Original file line number Diff line number Diff line change
Expand Up @@ -92,4 +92,9 @@ end
@time @safetestset "Lattice Simulation Plotting" begin include("extensions/lattice_simulation_plotting.jl") end
end

# Code quality tests (Aqua.jl and ExplicitImports.jl)
if GROUP == "All" || GROUP == "QA"
@time @safetestset "Code Quality Assurance" begin include("qa.jl") end
end

end # @time
Loading