Skip to content

Commit

Permalink
Merge pull request #274 from SciML/aqua
Browse files Browse the repository at this point in the history
Aqua + Spellcheck
  • Loading branch information
pogudingleb authored Jan 31, 2024
2 parents 7fd2f68 + f7845e8 commit 3cfc392
Show file tree
Hide file tree
Showing 22 changed files with 71 additions and 43 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/Downgrade.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ jobs:
# if: ${{ matrix.version == '1.6' }}
with:
# skip standard libraries..
skip: Pkg,TOML,Logging,Random,Dates,LinearAlgebra
skip: Aqua,Compat,Dates,IterTools,LinearAlgebra,Logging,Pkg,Random,Test,TOML
strict: 'false'
- uses: julia-actions/julia-buildpkg@v1
- uses: julia-actions/julia-runtest@v1
13 changes: 13 additions & 0 deletions .github/workflows/SpellCheck.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
name: Spell Check

on: [pull_request]

jobs:
typos-check:
name: Spell Check with Typos
runs-on: ubuntu-latest
steps:
- name: Checkout Actions Repository
uses: actions/checkout@v3
- name: Check spelling
uses: crate-ci/[email protected]
2 changes: 2 additions & 0 deletions .typos.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
[default.extend-words]
numer = "numer"
13 changes: 8 additions & 5 deletions Project.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ version = "0.5.2"

[deps]
AbstractAlgebra = "c3fe647b-3220-5bb0-a1ea-a7954cac585d"
BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf"
Combinatorics = "861a8166-3701-5b0c-9a16-15d98fcdc6aa"
DataStructures = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8"
Dates = "ade2ca70-3891-5945-98fb-dc099432e06a"
Expand All @@ -19,7 +18,6 @@ ParamPunPam = "3e851597-e36f-45a9-af0a-b7781937992f"
PrecompileTools = "aea7be01-6a6a-4083-8856-8a6e6704d82a"
Primes = "27ebfcd6-29c5-5fa9-bf4b-fb8fc14df3ae"
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b"
TimerOutputs = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f"

[weakdeps]
Expand All @@ -32,36 +30,41 @@ ModelingToolkitExt = ["ModelingToolkit", "SymbolicUtils", "Symbolics"]

[compat]
AbstractAlgebra = "0.34.5, 0.35"
BenchmarkTools = "1"
Aqua = "0.8"
Combinatorics = "1"
CPUSummary = "0.2"
DataStructures = "0.18"
Dates = "1.6, 1.7"
Groebner = "0.6.3"
IterTools = "1"
LinearAlgebra = "1.6, 1.7"
Logging = "1.6, 1.7"
MacroTools = "0.5"
ModelingToolkit = "8.74"
ModelingToolkit = "8.75"
Nemo = "0.38.3, 0.39"
ParamPunPam = "0.3.1"
Pkg = "1.6, 1.7"
PrecompileTools = "1.2"
Primes = "0.5"
Random = "1.6, 1.7"
SpecialFunctions = "2"
SymbolicUtils = "1.4, 1.5"
Symbolics = "5.16"
Test = "1.6, 1.7"
TestSetExtensions = "2"
TimerOutputs = "0.5"
julia = "1.6, 1.7"

[extras]
Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595"
CPUSummary = "2a0fbf3d-bb9c-48f3-b0a9-814d99fd7ab9"
ModelingToolkit = "961ee093-0014-501f-94e3-6117800e7a78"
Pkg = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f"
SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b"
SymbolicUtils = "d1185830-fcd6-423d-90d6-eec64667417b"
Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7"
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
TestSetExtensions = "98d24dd4-01ad-11ea-1b02-c9a08f80db04"

[targets]
test = ["CPUSummary", "Pkg", "Test", "TestSetExtensions"]
test = ["Aqua", "CPUSummary", "Pkg", "SpecialFunctions", "Test", "TestSetExtensions"]
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ In this example:
- `y(t)` is the **output variable** which is assumed to be observed in the experiments and, thus, known;
- `a01, a21, a12, b` are unknown scalar **parameters**.

Note that there may be mulitple inputs and outputs.
Note that there may be multiple inputs and outputs.

### Assessing identifiability

Expand Down
2 changes: 1 addition & 1 deletion benchmarking/IdentifiableFunctions/experiments.jl
Original file line number Diff line number Diff line change
Expand Up @@ -1116,7 +1116,7 @@ end
#! format: off

new_rff = StructuralIdentifiability.RationalFunctionField(funcs1)
cfs = StructuralIdentifiability.beautifuly_generators(new_rff)
cfs = StructuralIdentifiability.beautiful_generators(new_rff)
gb_rff = StructuralIdentifiability.RationalFunctionField(cfs)

K = GF(2^31 - 1)
Expand Down
2 changes: 1 addition & 1 deletion benchmarking/IdentifiableFunctions/homogenization.jl
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ Bilirubin2_io = @ODEmodel(
funcs = find_identifiable_functions(Bilirubin2_io, with_states = true, strategy = (:gb,))

rff = StructuralIdentifiability.RationalFunctionField(funcs)
cfs = StructuralIdentifiability.beautifuly_generators(rff)
cfs = StructuralIdentifiability.beautiful_generators(rff)
rff = StructuralIdentifiability.RationalFunctionField(cfs)

K = GF(2^31 - 1)
Expand Down
4 changes: 2 additions & 2 deletions docs/src/tutorials/creating_ode.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ which involves

- a vector $\mathbf{x}(t)$ of the state variables of the system,

- a vector $\mathbf{u}(t)$ of extermal inputs,
- a vector $\mathbf{u}(t)$ of external inputs,
- a vector $\mathbf{p}$ of scalar parameters,
- a vector $\mathbf{y}(t)$ of outputs (i.e., observations),
- and vectors of rational functions $\mathbf{f}$ and $\mathbf{g}$ (for discussion of the non-rational case, see this [issue](https://github.com/SciML/StructuralIdentifiability.jl/issues/144)).
Expand Down Expand Up @@ -54,7 +54,7 @@ assess_identifiability(ode)

## Defining using `ModelingToolkit`

`StructuralIdentifiability` has an extension `ModelingToolkitExt` which allows to use `ODESystem` from `ModelingToolkit` to descibe
`StructuralIdentifiability` has an extension `ModelingToolkitExt` which allows to use `ODESystem` from `ModelingToolkit` to describe
a model. The extension is loaded automatically once `ModelingToolkit` is loaded via `using ModelingToolkit`.
In this case, one should encode the equations for the states as `ODESystem` and specify the outputs separately.
In order to do this, we first introduce all functions and scalars:
Expand Down
1 change: 1 addition & 0 deletions ext/ModelingToolkitExt.jl
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ else
using ..ModelingToolkit
end

export mtk_to_si
export assess_local_identifiability, assess_identifiability, find_identifiable_functions

# ------------------------------------------------------------------------------
Expand Down
20 changes: 10 additions & 10 deletions src/RationalFunctionFields/RationalFunctionField.jl
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,7 @@ end
# ------------------------------------------------------------------------------

"""
beautifuly_generators(rff::RationalFunctionField)
beautiful_generators(rff::RationalFunctionField)
Given a field of rational functions `rff` returns a set of "simpler" and
standardized generators for `rff`.
Expand All @@ -221,7 +221,7 @@ Applies the following passes:
1. Filter constants,
2. Remove redundant generators.
"""
@timeit _to function beautifuly_generators(
@timeit _to function beautiful_generators(
rff::RationalFunctionField;
discard_redundant = true,
reversed_order = false,
Expand Down Expand Up @@ -402,7 +402,7 @@ Returns a set of Groebner bases for multiple different rankings of variables.
# The first basis in some ordering
ord = InputOrdering()
new_rff = groebner_basis_coeffs(rff, seed = seed, ordering = ord)
cfs = beautifuly_generators(new_rff)
cfs = beautiful_generators(new_rff)
ordering_to_generators[ord] = cfs
if isempty(cfs)
return ordering_to_generators
Expand All @@ -427,7 +427,7 @@ Returns a set of Groebner bases for multiple different rankings of variables.
ordering = ord,
up_to_degree = up_to_degree,
)
cfs = beautifuly_generators(new_rff, discard_redundant = false)
cfs = beautiful_generators(new_rff, discard_redundant = false)
ordering_to_generators[ord] = cfs
end
end
Expand All @@ -444,7 +444,7 @@ Returns a set of Groebner bases for multiple different rankings of variables.
ordering = ord,
up_to_degree = up_to_degree,
)
cfs = beautifuly_generators(new_rff, discard_redundant = false)
cfs = beautiful_generators(new_rff, discard_redundant = false)
ordering_to_generators[ord] = cfs
end
end
Expand All @@ -462,7 +462,7 @@ Returns a set of Groebner bases for multiple different rankings of variables.
ordering = ord,
up_to_degree = up_to_degree,
)
cfs = beautifuly_generators(new_rff, discard_redundant = false)
cfs = beautiful_generators(new_rff, discard_redundant = false)
ordering_to_generators[ord] = cfs
end
end
Expand All @@ -479,7 +479,7 @@ function monomial_generators_up_to_degree(
) where {T}
@assert strategy in (:monte_carlo,)
relations = linear_relations_between_normal_forms(
beautifuly_generators(rff),
beautiful_generators(rff),
up_to_degree,
seed = seed,
)
Expand Down Expand Up @@ -544,7 +544,7 @@ Result is correct (in the Monte-Carlo sense) with probability at least `prob_thr
seed = seed,
rational_interpolator = rational_interpolator,
)
new_fracs = beautifuly_generators(new_rff)
new_fracs = beautiful_generators(new_rff)
if isempty(new_fracs)
return new_fracs
end
Expand All @@ -568,7 +568,7 @@ Result is correct (in the Monte-Carlo sense) with probability at least `prob_thr
Final cleaning and simplification of generators.
Out of $(length(new_fracs)) fractions $(length(new_fracs_unique)) are syntactically unique."""
runtime =
@elapsed new_fracs = beautifuly_generators(RationalFunctionField(new_fracs_unique))
@elapsed new_fracs = beautiful_generators(RationalFunctionField(new_fracs_unique))
@debug "Checking inclusion with probability $prob_threshold"
runtime =
@elapsed result = issubfield(rff, RationalFunctionField(new_fracs), prob_threshold)
Expand All @@ -578,7 +578,7 @@ Out of $(length(new_fracs)) fractions $(length(new_fracs_unique)) are syntactica
throw("The new subfield generators are not correct.")
end
@info "Inclusion checked with probability $prob_threshold in $(_runtime_logger[:id_inclusion_check]) seconds"
@debug "Out of $(length(rff.mqs.nums_qq)) initial generators there are $(length(new_fracs)) indepdendent"
@debug "Out of $(length(rff.mqs.nums_qq)) initial generators there are $(length(new_fracs)) independent"
ranking = generating_set_rank(new_fracs)
_runtime_logger[:id_ranking] = ranking
@debug "The ranking of the new set of generators is $ranking"
Expand Down
2 changes: 1 addition & 1 deletion src/RationalFunctionFields/normalforms.jl
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@

# Maintans a row echelon form of a set of vectors over the integrals.
# Maintains a row echelon form of a set of vectors over the integrals.
# Works well when the ambient dimension is small.
mutable struct TinyRowEchelonForm{T}
rows::Vector{Vector{T}}
Expand Down
2 changes: 1 addition & 1 deletion src/StructuralIdentifiability.jl
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ using ParamPunPam: reduce_mod_p!, specialize_mod_p, AbstractBlackboxIdeal
ParamPunPam.enable_progressbar(false)

# defining a model
export ODE, @ODEmodel, @DDSmodel, mtk_to_si
export ODE, @ODEmodel, @DDSmodel

# assessing identifiability
export assess_local_identifiability, assess_identifiability
Expand Down
8 changes: 4 additions & 4 deletions src/discrete.jl
Original file line number Diff line number Diff line change
Expand Up @@ -93,11 +93,11 @@ Input:
- `param_values` - parameter values, must be a dictionary mapping parameter to a value
- `initial_conditions` - initial conditions of `ode`, must be a dictionary mapping state variable to a value
- `input_values` - input sequences in the form input => list of terms; length of the lists must be at least
teh required number of terms in the result
the required number of terms in the result
- `num_terms` - number of terms to compute
Output:
- computes a sequence solution with teh required number of terms prec presented as a dictionary state_variable => corresponding sequence
- computes a sequence solution with the required number of terms prec presented as a dictionary state_variable => corresponding sequence
"""
function sequence_solution(
dds::DDS{P},
Expand Down Expand Up @@ -301,8 +301,8 @@ function _assess_local_identifiability_discrete_aux(
# Computing the bound from the Schwartz-Zippel-DeMilo-Lipton lemma
deg_x = _degree_with_common_denom(values(x_equations(dds)))
deg_y = _degree_with_common_denom(values(y_equations(dds)))
deg_known = reduce(+, map(total_degree, known_ic), init = 0)
deg_to_check = max(map(total_degree, funcs_to_check)...)
deg_known = reduce(+, map(total_degree_frac, known_ic), init = 0)
deg_to_check = max(map(total_degree_frac, funcs_to_check)...)
Jac_degree = deg_to_check + deg_known
if deg_x > 1
Jac_degree += 2 * deg_y * ((deg_x^prec - 1) ÷ (deg_x - 1))
Expand Down
2 changes: 1 addition & 1 deletion src/global_identifiability.jl
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
Takes as input input-output equations, the corresponding ode, a list of functions assumed to be known
and a flag `with_states`.
Extracts generators of the field of identifiable functions (with or without states) withous
Extracts generators of the field of identifiable functions (with or without states) without
any simplifications.
Returns a tuple consisting of
Expand Down
4 changes: 2 additions & 2 deletions src/input_macro.jl
Original file line number Diff line number Diff line change
Expand Up @@ -263,7 +263,7 @@ Here,
- `x1`, `x2` are state variables
- `y` is an output variable
- `u` is an input variable
- `a`, `b`, `c` are time-indepdendent parameters
- `a`, `b`, `c` are time-independent parameters
"""
macro ODEmodel(ex::Expr...)
Expand Down Expand Up @@ -297,7 +297,7 @@ Here,
- `x1`, `x2` are state variables
- `y` is an output variable
- `u` is an input variable
- `a`, `b`, `c` are time-indepdendent parameters
- `a`, `b`, `c` are time-independent parameters
"""
macro DDSmodel(ex::Expr...)
Expand Down
2 changes: 1 addition & 1 deletion src/states.jl
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ Input:
- `vars` - list of variables
The function considers `f` as `A / B`, where `A` and `B` are polynomials in `vars` with
coefficients in rational fucntion field in the remaining variables such that at least one of the
coefficients in rational function field in the remaining variables such that at least one of the
coefficients is equal to one.
Output:
Expand Down
2 changes: 1 addition & 1 deletion src/submodels.jl
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ end

# ------------------------------------------------------------------------------

# filters the models containin all states or no states
# filters the models containing all states or no states
function filter_max_empty(
ode::ODE{P},
submodels::Array{Set{QQMPolyRingElem}, 1},
Expand Down
10 changes: 5 additions & 5 deletions src/util.jl
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
# ------------------------------------------------------------------------------

function Nemo.vars(f::Generic.Frac{<:MPolyRingElem})
return collect(union(Set(vars(numerator(f))), Set(vars(denominator(f)))))
function total_degree_frac(f::Generic.Frac{<:MPolyRingElem})
return sum(map(total_degree, unpack_fraction(f)))
end

function Nemo.total_degree(f::Generic.Frac{<:MPolyRingElem})
return sum(map(total_degree, unpack_fraction(f)))
function total_degree_frac(f::MPolyRingElem)
return total_degree(f)
end

# ------------------------------------------------------------------------------
Expand Down Expand Up @@ -376,7 +376,7 @@ Input:
- `poly` - multivariate polynomial
- `variables` - a list of variables from the generators of the ring of p
Output:
- dictionary with keys being tuples of length `lenght(variables)` and values being polynomials in the variables other than those which are the coefficients at the corresponding monomials (in a smaller polynomial ring)
- dictionary with keys being tuples of length `length(variables)` and values being polynomials in the variables other than those which are the coefficients at the corresponding monomials (in a smaller polynomial ring)
"""
function extract_coefficients(poly::P, variables::Array{P, 1}) where {P <: MPolyRingElem}
xs = gens(parent(poly))
Expand Down
2 changes: 1 addition & 1 deletion test/extract_coefficients.jl
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
@testset "Coefficient extraction for rational fucntions" begin
@testset "Coefficient extraction for rational functions" begin
R, (x, y, z) = polynomial_ring(QQ, ["x", "y", "z"])
C = extract_coefficients_ratfunc(
(x^2 + y * z - y^2 * z^3 + 3 * x * z^3) // (x + y + z + z^2 * (x^2 + 1)),
Expand Down
4 changes: 2 additions & 2 deletions test/ode_ps_solution.jl
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@
end
end

# Testing ps_ode_solution in conjuntion with the ODE class
# Testing ps_ode_solution in conjunction with the ODE class
for i in 1:30
# Setting up the ring
NUMX = 3
Expand All @@ -68,7 +68,7 @@
PType = fpMPolyRingElem
TDict = Dict{PType, Union{PType, Generic.Frac{PType}}}

# Generating the intial conditions etc
# Generating the initial conditions etc
ic = Dict(vars[i] => F(rand(-5:5)) for i in 1:NUMX)
param_vals = Dict(vars[i + NUMX] => F(rand(-5:5)) for i in 1:NUMP)
inputs =
Expand Down
11 changes: 11 additions & 0 deletions test/qa.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
using StructuralIdentifiability, Aqua
@testset "Aqua" begin
Aqua.find_persistent_tasks_deps(StructuralIdentifiability)
Aqua.test_ambiguities(StructuralIdentifiability, recursive = false)
Aqua.test_deps_compat(StructuralIdentifiability)
Aqua.test_piracies(StructuralIdentifiability, treat_as_own = [])
Aqua.test_project_extras(StructuralIdentifiability)
Aqua.test_stale_deps(StructuralIdentifiability)
Aqua.test_unbound_args(StructuralIdentifiability)
Aqua.test_undefined_exports(StructuralIdentifiability)
end
4 changes: 1 addition & 3 deletions test/runtests.jl
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ using StructuralIdentifiability

using Test
using TestSetExtensions
using SpecialFunctions

using StructuralIdentifiability.DataStructures
using StructuralIdentifiability.Nemo
Expand Down Expand Up @@ -136,9 +137,6 @@ end

@info "Testing started"

@test isempty(Test.detect_ambiguities(StructuralIdentifiability))
@test isempty(Test.detect_unbound_args(StructuralIdentifiability))

all_tests = get_test_files(GROUP)
if !isempty(ARGS)
all_tests = ARGS
Expand Down

0 comments on commit 3cfc392

Please sign in to comment.