Skip to content

Commit

Permalink
Merge pull request #90 from sumiya11/update
Browse files Browse the repository at this point in the history
Update versions of SI, Nemo, MTK, etc
  • Loading branch information
alexeyovchinnikov authored Apr 18, 2024
2 parents ecbf84d + e3d99c5 commit c09cf3a
Show file tree
Hide file tree
Showing 11 changed files with 110 additions and 103 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/testing.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
julia-version: ["1", "1.6"]
julia-version: ["1"]
julia-arch: [x64]
os: [macos-latest, ubuntu-latest, windows-latest]

Expand Down
22 changes: 14 additions & 8 deletions Project.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name = "SIAN"
uuid = "cf7bdac0-b945-4905-b5ad-bc3f1a757483"
authors = ["Ilia Ilmer <[email protected]>", "Alexey Ovchinnikov <[email protected]>", "Gleb Pogudin <[email protected]>"]
version = "1.4.2"
version = "1.5.0"

[deps]
BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf"
Expand All @@ -15,21 +15,27 @@ OrderedCollections = "bac558e1-5e72-5ebc-8fee-abe8a469f55d"
SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b"
StructuralIdentifiability = "220ca800-aa68-49bb-acd8-6037fa93a544"
SymbolicUtils = "d1185830-fcd6-423d-90d6-eec64667417b"
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
TestSetExtensions = "98d24dd4-01ad-11ea-1b02-c9a08f80db04"


[compat]
BenchmarkTools = "1"
Groebner = "0.2 - 0.6"
Groebner = "0.6, 0.7"
MacroTools = "0.5"
ModelingToolkit = "6, 7, 8"
Nemo = "0.22 - 0.40"
ModelingToolkit = "9"
Nemo = "0.40 - 0.43"
OrderedCollections = "1.3"
SpecialFunctions = "1, 2"
StructuralIdentifiability = "0.4 - 0.6"
SymbolicUtils = "0.18, 0.19, 1"
StructuralIdentifiability = "0.5"
SymbolicUtils = "1"
TestSetExtensions = "2"
LinearAlgebra = "1.0 - 2.0"
Logging = "1.0 - 2.0"
Test = "1.0 - 2.0"
julia = "1"

[extras]
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
TestSetExtensions = "98d24dd4-01ad-11ea-1b02-c9a08f80db04"

[targets]
test = ["Test", "TestSetExtensions"]
62 changes: 31 additions & 31 deletions src/ODE.jl
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,13 @@ struct ODE{P}
y_vars::Array{P,1}
u_vars::Array{P,1}
parameters::Array{P,1}
x_equations::AbstractDict{P,<:Union{P,Generic.Frac{P}}}
y_equations::AbstractDict{P,<:Union{P,Generic.Frac{P}}}
x_equations::AbstractDict{P,<:Union{P,Generic.FracFieldElem{P}}}
y_equations::AbstractDict{P,<:Union{P,Generic.FracFieldElem{P}}}
function ODE{P}(
x_eqs::AbstractDict{P,<:Union{P,Generic.Frac{P}}},
y_eqs::AbstractDict{P,<:Union{P,Generic.Frac{P}}},
x_eqs::AbstractDict{P,<:Union{P,Generic.FracFieldElem{P}}},
y_eqs::AbstractDict{P,<:Union{P,Generic.FracFieldElem{P}}},
inputs::Array{P,1}
) where {P<:MPolyElem{<:FieldElem}}
) where {P<:MPolyRingElem{<:FieldElem}}
# Initialize ODE
# x_eqs is a dictionary x_i => f_i(x, u, params)
# y_eqs is a dictionary y_i => g_i(x, u, params)
Expand All @@ -30,7 +30,7 @@ end

# ------------------------------------------------------------------------------
"""
func set_parameter_values(ode::ODE{P}, param_values::OrderedDict{P,T}) where {T <: FieldElem,P <: MPolyElem{T}}
func set_parameter_values(ode::ODE{P}, param_values::OrderedDict{P,T}) where {T <: FieldElem,P <: MPolyRingElem{T}}
Substitute parameters with numerical values.
Expand All @@ -41,30 +41,30 @@ Substitute parameters with numerical values.
## Output:
- new ode with the parameters in param_values plugged with the given numbers
"""
function set_parameter_values(ode::ODE{P}, param_values::OrderedDict{P,T}) where {T<:FieldElem,P<:MPolyElem{T}}
function set_parameter_values(ode::ODE{P}, param_values::OrderedDict{P,T}) where {T<:FieldElem,P<:MPolyRingElem{T}}
new_vars = map(var_to_str, [v for v in gens(ode.poly_ring) if !(v in keys(param_values))])
small_ring, small_vars = Nemo.PolynomialRing(base_ring(ode.poly_ring), new_vars)
small_ring, small_vars = Nemo.polynomial_ring(base_ring(ode.poly_ring), new_vars)
eval_dict = OrderedDict(str_to_var(v, ode.poly_ring) => str_to_var(v, small_ring) for v in new_vars)
merge!(eval_dict, OrderedDict(p => small_ring(val) for (p, val) in param_values))

return SIAN.ODE{P}(
OrderedDict{P,Union{P,Generic.Frac{P}}}(eval_at_dict(v, eval_dict) => eval_at_dict(f, eval_dict) for (v, f) in ode.x_equations),
OrderedDict{P,Union{P,Generic.Frac{P}}}(eval_at_dict(v, eval_dict) => eval_at_dict(f, eval_dict) for (v, f) in ode.y_equations),
OrderedDict{P,Union{P,Generic.FracFieldElem{P}}}(eval_at_dict(v, eval_dict) => eval_at_dict(f, eval_dict) for (v, f) in ode.x_equations),
OrderedDict{P,Union{P,Generic.FracFieldElem{P}}}(eval_at_dict(v, eval_dict) => eval_at_dict(f, eval_dict) for (v, f) in ode.y_equations),
Array{P, 1}([eval_at_dict(u, eval_dict) for u in ode.u_vars])
)
end

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

"""
func print_for_SIAN(ode::ODE{P}, outputs::Array{P,1}) where P <: MPolyElem{<: FieldElem}
func print_for_SIAN(ode::ODE{P}, outputs::Array{P,1}) where P <: MPolyRingElem{<: FieldElem}
Prints the ODE in the format accepted by SIAN (https://github.com/pogudingleb/SIAN)
"""
function print_for_SIAN(ode::ODE{P}, outputs::Array{P,1}) where {P<:MPolyElem{<:FieldElem}}
function print_for_SIAN(ode::ODE{P}, outputs::Array{P,1}) where {P<:MPolyRingElem{<:FieldElem}}
vars_str = OrderedDict(x => var_to_str(x) * "(t)" for x in vcat(ode.x_vars, ode.u_vars, ode.y_vars))
merge!(vars_str, OrderedDict(p => var_to_str(p) for p in ode.parameters))
R_print, vars_print = Nemo.PolynomialRing(base_ring(ode.poly_ring), [vars_str[v] for v in gens(ode.poly_ring)])
R_print, vars_print = Nemo.polynomial_ring(base_ring(ode.poly_ring), [vars_str[v] for v in gens(ode.poly_ring)])
result = ""

function _lhs_to_str(lhs)
Expand Down Expand Up @@ -151,16 +151,16 @@ macro ODEmodel(ex::Expr...)
vars_list = :([$(all_symb...)])
R = gensym()
vars_aux = gensym()
exp_ring = :(($R, $vars_aux) = SIAN.Nemo.PolynomialRing(SIAN.Nemo.QQ, map(string, $all_symb)))
exp_ring = :(($R, $vars_aux) = SIAN.Nemo.polynomial_ring(SIAN.Nemo.QQ, map(string, $all_symb)))
assignments = [:($(all_symb[i]) = $vars_aux[$i]) for i in 1:length(all_symb)]

# preparing equations
equations = map(macrohelper_clean, equations)
x_dict = gensym()
y_dict = gensym()
y_vars = Array{Any}(undef, 0)
x_dict_create_expr = :($x_dict = Dict{SIAN.Nemo.fmpq_mpoly,Union{SIAN.Nemo.fmpq_mpoly,SIAN.Nemo.Generic.Frac{SIAN.Nemo.fmpq_mpoly}}}())
y_dict_create_expr = :($y_dict = Dict{SIAN.Nemo.fmpq_mpoly,Union{SIAN.Nemo.fmpq_mpoly,SIAN.Nemo.Generic.Frac{SIAN.Nemo.fmpq_mpoly}}}())
x_dict_create_expr = :($x_dict = Dict{SIAN.Nemo.QQMPolyRingElem,Union{SIAN.Nemo.QQMPolyRingElem,SIAN.Nemo.Generic.FracFieldElem{SIAN.Nemo.QQMPolyRingElem}}}())
y_dict_create_expr = :($y_dict = Dict{SIAN.Nemo.QQMPolyRingElem,Union{SIAN.Nemo.QQMPolyRingElem,SIAN.Nemo.Generic.FracFieldElem{SIAN.Nemo.QQMPolyRingElem}}}())
eqs_expr = []
for eq in equations
if eq.head != :(=)
Expand Down Expand Up @@ -193,7 +193,7 @@ macro ODEmodel(ex::Expr...)
@info "Outputs: [$(join(map(string, y_vars), ", "))]"

# creating the ode object
ode_expr = :(SIAN.ODE{SIAN.Nemo.fmpq_mpoly}($x_dict, $y_dict, Array{SIAN.Nemo.fmpq_mpoly}([$(u_vars...)])))
ode_expr = :(SIAN.ODE{SIAN.Nemo.QQMPolyRingElem}($x_dict, $y_dict, Array{SIAN.Nemo.QQMPolyRingElem}([$(u_vars...)])))

result = Expr(
:block,
Expand All @@ -207,28 +207,28 @@ end
function Base.show(io::IO, ode::SIAN.ODE)
varstr = Dict(x => var_to_str(x) * "(t)" for x in vcat(ode.x_vars, ode.u_vars, ode.y_vars))
merge!(varstr, Dict(p => var_to_str(p) for p in ode.parameters))
R_print, vars_print = SIAN.Nemo.PolynomialRing(base_ring(ode.poly_ring), [varstr[v] for v in gens(ode.poly_ring)])
R_print, vars_print = Nemo.polynomial_ring(base_ring(ode.poly_ring), [varstr[v] for v in gens(ode.poly_ring)])
for (x, eq) in ode.x_equations
print(io, var_to_str(x) * "'(t) = ")
print(io, SIAN.Nemo.evaluate(eq, vars_print))
print(io, Nemo.evaluate(eq, vars_print))
print(io, "\n")
end
for (y, eq) in ode.y_equations
print(io, SIAN.var_to_str(y) * "(t) = ")
print(io, SIAN.Nemo.evaluate(eq, vars_print))
print(io, Nemo.evaluate(eq, vars_print))
print(io, "\n")
end
end

# ------------------------------------------------------------------------------
"""
func generate_replica(ode::ODE{P}, r::Int) where P <: MPolyElem
func generate_replica(ode::ODE{P}, r::Int) where P <: MPolyRingElem
Generate a replica of the original input system as per <Theorem here>.
Returns `ode_r`, and r-fold replica of the original ode.
States, outputs, and inputs are replicated, parameters are not.
"""
function generate_replica(ode::ODE{P}, r::Int) where {P<:MPolyElem}
function generate_replica(ode::ODE{P}, r::Int) where {P<:MPolyRingElem}
"""
Returns ode_r, and r-fold replica of the original ode.
States, outputs, and inputs are replicated, parameters are not
Expand All @@ -238,9 +238,9 @@ function generate_replica(ode::ODE{P}, r::Int) where {P<:MPolyElem}
append!(new_varnames, [var_to_str(v) * "_r$i" for i in 1:r])
end
append!(new_varnames, map(string, ode.parameters))
new_ring, new_vars = Nemo.PolynomialRing(base_ring(ode.poly_ring), new_varnames)
new_x_eqs = OrderedDict{P,Union{P,Generic.Frac{P}}}()
new_y_eqs = OrderedDict{P,Union{P,Generic.Frac{P}}}()
new_ring, new_vars = Nemo.polynomial_ring(base_ring(ode.poly_ring), new_varnames)
new_x_eqs = OrderedDict{P,Union{P,Generic.FracFieldElem{P}}}()
new_y_eqs = OrderedDict{P,Union{P,Generic.FracFieldElem{P}}}()
new_us = Array{P,1}()
for i in 1:r
eval = merge(
Expand All @@ -250,11 +250,11 @@ function generate_replica(ode::ODE{P}, r::Int) where {P<:MPolyElem}
eval_vec = [eval[v] for v in gens(ode.poly_ring)]
new_x_eqs = merge(
new_x_eqs,
OrderedDict{P,Union{P,Generic.Frac{P}}}(evaluate(x, eval_vec) => evaluate(f, eval_vec) for (x, f) in ode.x_equations)
OrderedDict{P,Union{P,Generic.FracFieldElem{P}}}(evaluate(x, eval_vec) => evaluate(f, eval_vec) for (x, f) in ode.x_equations)
)
new_y_eqs = merge(
new_y_eqs,
OrderedDict{P,Union{P,Generic.Frac{P}}}(evaluate(x, eval_vec) => evaluate(f, eval_vec) for (x, f) in ode.y_equations)
OrderedDict{P,Union{P,Generic.FracFieldElem{P}}}(evaluate(x, eval_vec) => evaluate(f, eval_vec) for (x, f) in ode.y_equations)
)
append!(new_us, [str_to_var(var_to_str(u) * "_r$i", new_ring) for u in ode.u_vars])
end
Expand All @@ -263,20 +263,20 @@ end

# ------------------------------------------------------------------------------
"""
func _reduce_poly_mod_p(poly::MPolyElem{Nemo.fmpq}, p::Int)
func _reduce_poly_mod_p(poly::MPolyRingElem{Nemo.QQFieldElem}, p::Int)
Reduces a polynomial modulo p.
"""
function _reduce_poly_mod_p(poly::MPolyElem{Nemo.fmpq}, p::Int)
function _reduce_poly_mod_p(poly::MPolyRingElem{Nemo.QQFieldElem}, p::Int)
"""
Reduces a polynomial over Q modulo p
"""
den = denominator(poly)
num = change_base_ring(Nemo.ZZ, den * poly)
if Nemo.GF(p)(den) == 0
if Nemo.Native.GF(p)(den) == 0
throw(Base.ArgumentError("Prime $p divides the denominator of $poly"))
end
return change_base_ring(Nemo.GF(p), num) * (1 // Nemo.GF(p)(den))
return change_base_ring(Nemo.Native.GF(p), num) * (1 // Nemo.Native.GF(p)(den))
end

# ------------------------------------------------------------------------------
Expand Down
31 changes: 16 additions & 15 deletions src/SIAN.jl
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
module SIAN

using Nemo
using StructuralIdentifiability: preprocess_ode, eval_at_nemo, make_substitution
using LinearAlgebra
using Groebner
using MacroTools
using OrderedCollections
using ModelingToolkit
using Logging # * for the @warn macro
using StructuralIdentifiability
using StructuralIdentifiability: make_substitution
include("util.jl")
include("ODE.jl")
include("max_poly_system.jl")
Expand Down Expand Up @@ -107,14 +108,14 @@ function identifiability_ode(ode, params_to_assess; p=0.99, p_mod=0, infolevel=0
# (e) ------------------
alpha = [1 for i in 1:n]
beta = [0 for i in 1:m]
Et = Array{fmpq_poly}(undef, 0)
Et = Array{QQMPolyRingElem}(undef, 0)
x_theta_vars = all_params
prolongation_possible = [1 for i in 1:m]

# (f) ------------------
all_x_theta_vars_subs = SIAN.insert_zeros_to_vals(all_subs[1], all_subs[2])
eqs_i_old = Array{fmpq_mpoly}(undef, 0)
evl_old = Array{fmpq_mpoly}(undef, 0)
eqs_i_old = Array{QQMPolyRingElem}(undef, 0)
evl_old = Array{QQMPolyRingElem}(undef, 0)
while sum(prolongation_possible) > 0
for i in 1:m
if prolongation_possible[i] == 1
Expand All @@ -129,12 +130,12 @@ function identifiability_ode(ode, params_to_assess; p=0.99, p_mod=0, infolevel=0
# adding necessary X-equations
polys_to_process = vcat(Et, [Y[k][beta[k]+1] for k in 1:m])
while length(polys_to_process) != 0
new_to_process = Array{fmpq_mpoly}(undef, 0)
vrs = Set{fmpq_mpoly}()
new_to_process = Array{QQMPolyRingElem}(undef, 0)
vrs = Set{QQMPolyRingElem}()
for poly in polys_to_process
vrs = union(vrs, [v for v in vars(poly) if v in x_variables])
end
vars_to_add = Set{fmpq_mpoly}(v for v in vrs if !(v in x_theta_vars))
vars_to_add = Set{QQMPolyRingElem}(v for v in vrs if !(v in x_theta_vars))
for v in vars_to_add
x_theta_vars = vcat(x_theta_vars, v)
ord_var = SIAN.get_order_var2(v, all_indets, n + m + u, s)
Expand Down Expand Up @@ -171,7 +172,7 @@ function identifiability_ode(ode, params_to_assess; p=0.99, p_mod=0, infolevel=0
end
end

theta_l = Array{fmpq_mpoly}(undef, 0)
theta_l = Array{QQMPolyRingElem}(undef, 0)
params_to_assess_ = [SIAN.add_to_var(param, Rjet, 0) for param in params_to_assess if !(param in known_states)]
known_states_jet_form = [SIAN.add_to_var(param, Rjet, 0) for param in known_states]
known_values = [evaluate(ic, all_x_theta_vars_subs) for ic in known_states_jet_form]
Expand Down Expand Up @@ -222,7 +223,7 @@ function identifiability_ode(ode, params_to_assess; p=0.99, p_mod=0, infolevel=0
push!(Et_hat, each[1] - each[2])
end

Et_x_vars = Set{fmpq_mpoly}()
Et_x_vars = Set{QQMPolyRingElem}()
for poly in Et_hat
Et_x_vars = union(Et_x_vars, Set(vars(poly)))
end
Expand Down Expand Up @@ -256,9 +257,9 @@ function identifiability_ode(ode, params_to_assess; p=0.99, p_mod=0, infolevel=0
Et_hat = [SIAN._reduce_poly_mod_p(e, p_mod) for e in Et_hat]
z_aux = SIAN._reduce_poly_mod_p(z_aux, p_mod)
Q_hat = SIAN._reduce_poly_mod_p(Q_hat, p_mod)
Rjet_new, vrs_sorted = Nemo.PolynomialRing(Nemo.GF(p_mod), [string(v) for v in vrs_sorted], ordering=:degrevlex)
Rjet_new, vrs_sorted = Nemo.polynomial_ring(Nemo.Native.GF(p_mod), [string(v) for v in vrs_sorted], internal_ordering=:degrevlex)
else
Rjet_new, vrs_sorted = Nemo.PolynomialRing(Nemo.QQ, [string(v) for v in vrs_sorted], ordering=:degrevlex)
Rjet_new, vrs_sorted = Nemo.polynomial_ring(Nemo.QQ, [string(v) for v in vrs_sorted], internal_ordering=:degrevlex)
end


Expand Down Expand Up @@ -313,20 +314,20 @@ function identifiability_ode(ode::ModelingToolkit.ODESystem, params_to_assess=[]
end
end
#ode_prep, input_syms, gens_ = PreprocessODE(ode, measured_quantities)
ode_prep, symb2gens = preprocess_ode(ode, measured_quantities)
ode_prep, symb2gens = StructuralIdentifiability.mtk_to_si(ode, measured_quantities)
symb2gens = collect(symb2gens)
input_syms = [x[1] for x in symb2gens]
gens_ = [x[2] for x in symb2gens]
t = ModelingToolkit.arguments(ModelingToolkit.states(ode)[1])[1]
t = ModelingToolkit.arguments(ModelingToolkit.unknowns(ode)[1])[1]
if length(params_to_assess) == 0
params_to_assess_ = SIAN.get_parameters(ode_prep)
nemo2mtk = Dict(gens_ .=> input_syms)
else
params_to_assess_ = [eval_at_nemo(each, Dict(input_syms .=> gens_)) for each in params_to_assess]
params_to_assess_ = [StructuralIdentifiability.eval_at_nemo(each, Dict(input_syms .=> gens_)) for each in params_to_assess]
nemo2mtk = Dict(params_to_assess_ .=> params_to_assess)
end
if length(known_states) != 0
known_states_ = [eval_at_nemo(each, Dict(input_syms .=> gens_)) for each in known_states]
known_states_ = [StructuralIdentifiability.eval_at_nemo(each, Dict(input_syms .=> gens_)) for each in known_states]
else
known_states_ = []
end
Expand Down
8 changes: 4 additions & 4 deletions src/get_weights.jl
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ function get_weights(ode, non_identifiable_parameters)
s = length(mu) + n

current_level = 0
visible_states = Dict{Int,Set{fmpq_mpoly}}(current_level => Set{fmpq_mpoly}())
visible_states = Dict{Int,Set{QQMPolyRingElem}}(current_level => Set{QQMPolyRingElem}())
for eq in y_eqs
numer, denom = SIAN.unpack_fraction(eq[2])
# visible states must be in non-jet representation!
Expand Down Expand Up @@ -56,8 +56,8 @@ function get_weights(ode, non_identifiable_parameters)
end

# find states that newly appeared
visible_states[current_level] = union(get(visible_states, current_level, Set{fmpq_mpoly}()), Set(SIAN.get_order_var(vn, non_jet_ring)[1] for vn in vars(numer)))
visible_states[current_level] = union(get(visible_states, current_level, Set{fmpq_mpoly}()), Set(SIAN.get_order_var(vd, non_jet_ring)[1] for vd in vars(denom)))
visible_states[current_level] = union(get(visible_states, current_level, Set{QQMPolyRingElem}()), Set(SIAN.get_order_var(vn, non_jet_ring)[1] for vn in vars(numer)))
visible_states[current_level] = union(get(visible_states, current_level, Set{QQMPolyRingElem}()), Set(SIAN.get_order_var(vd, non_jet_ring)[1] for vd in vars(denom)))

# add previous level to "what we have seen so far"-set
union!(seen_so_far, visible_states[current_level-1])
Expand All @@ -75,7 +75,7 @@ function get_weights(ode, non_identifiable_parameters)
break
end
end
weights = Dict{fmpq_mpoly,Int64}()
weights = Dict{QQMPolyRingElem,Int64}()
max_level = current_level - 1
for (level, states) in visible_states
for st in states
Expand Down
6 changes: 3 additions & 3 deletions src/get_x_eq.jl
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
function get_x_eq(x_eqs::Vector{Vector{Nemo.AbstractAlgebra.RingElem}}, y_eqs::Vector{Vector{Nemo.AbstractAlgebra.RingElem}}, n::Int, m::Int, s::Int, u::Int, gens_Rjet)
X = Array{Nemo.fmpq_poly}(undef, 0)
X_eq = Array{Nemo.fmpq_poly}(undef, 0)
X = Array{Nemo.QQPolyRingElem}(undef, 0)
X_eq = Array{Nemo.QQPolyRingElem}(undef, 0)
for i in 1:n
X = vcat(X, [Array{Nemo.fmpq_poly}(undef, 0)])
X = vcat(X, [Array{Nemo.QQPolyRingElem}(undef, 0)])
poly_d = SIAN.unpack_fraction(x_eqs[i][1] - x_eqs[i][2])[1]
for j in 0:s+1
if j > 0
Expand Down
6 changes: 3 additions & 3 deletions src/get_y_eq.jl
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
function get_y_eq(x_eqs::Vector{Vector{Nemo.AbstractAlgebra.RingElem}}, y_eqs::Vector{Vector{Nemo.AbstractAlgebra.RingElem}}, n::Int, m::Int, s::Int, u::Int, gens_Rjet)
Y = Array{Nemo.fmpq_poly}(undef, 0)
Y_eq = Array{Nemo.fmpq_poly}(undef, 0)
Y = Array{Nemo.QQMPolyRingElem}(undef, 0)
Y_eq = Array{Nemo.QQMPolyRingElem}(undef, 0)
for i in 1:m
Y = vcat(Y, [Array{Nemo.fmpq_poly}(undef, 0)])
Y = vcat(Y, [Array{Nemo.QQMPolyRingElem}(undef, 0)])
poly_d = SIAN.unpack_fraction(y_eqs[i][1] - y_eqs[i][2])[1]
for j in 0:s+1
if j > 0
Expand Down
Loading

2 comments on commit c09cf3a

@alexeyovchinnikov
Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@JuliaRegistrator
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Registration pull request created: JuliaRegistries/General/105191

Tip: Release Notes

Did you know you can add release notes too? Just add markdown formatted text underneath the comment after the text
"Release notes:" and it will be added to the registry PR, and if TagBot is installed it will also be added to the
release that TagBot creates. i.e.

@JuliaRegistrator register

Release notes:

## Breaking changes

- blah

To add them here just re-invoke and the PR will be updated.

Tagging

After the above pull request is merged, it is recommended that a tag is created on this repository for the registered package version.

This will be done automatically if the Julia TagBot GitHub Action is installed, or can be done manually through the github interface, or via:

git tag -a v1.5.0 -m "<description of version>" c09cf3af531f8257a52fb695688b277e06c8b785
git push origin v1.5.0

Please sign in to comment.