From f8e829d368394760920d866fa497215f74e5fe90 Mon Sep 17 00:00:00 2001 From: Alexander Demin Date: Fri, 16 May 2025 04:25:06 +0300 Subject: [PATCH 1/2] Flip functions with states in denominator --- .../RationalFunctionField.jl | 14 +++++++++++++- src/identifiable_functions.jl | 1 + src/known_ic.jl | 1 + 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/RationalFunctionFields/RationalFunctionField.jl b/src/RationalFunctionFields/RationalFunctionField.jl index b41a83a9f..0feeb7b33 100644 --- a/src/RationalFunctionFields/RationalFunctionField.jl +++ b/src/RationalFunctionFields/RationalFunctionField.jl @@ -406,14 +406,16 @@ Given a field of rational functions `rff` returns a set of "simpler" and standardized generators for `rff`. Applies the following passes: -1. Filter constants, +1. Filter constants. 2. Remove redundant generators. +3. Flip some fractions. """ @timeit _to function beautiful_generators( rff::RationalFunctionField; discard_redundant = true, reversed_order = false, priority_variables = [], + want_in_numerator = [], ) time_start = time_ns() fracs = dennums_to_fractions(rff.dennums) @@ -424,6 +426,14 @@ Applies the following passes: @debug "The set of generators is empty" return fracs end + # Flip a/x => x/a when x is in want_in_numerator + for i in 1:length(fracs) + if !isempty(vars(denominator(fracs[i]))) && + issubset(vars(denominator(fracs[i])), want_in_numerator) && + isempty(intersect(vars(numerator(fracs[i])), want_in_numerator)) + fracs[i] = denominator(fracs[i]) // numerator(fracs[i]) + end + end # Remove redundant pass if discard_redundant fracs_priority = filter(f -> issubset(vars(f), priority_variables), fracs) @@ -698,6 +708,7 @@ Result is correct (in the Monte-Carlo sense) with probability at least `prob_thr check_variables = false, # almost always slows down and thus turned off rational_interpolator = :VanDerHoevenLecerf, priority_variables = [], + want_in_numerator = [], ) @info "Simplifying generating set. Simplification level: $simplify" _runtime_logger[:id_groebner_time] = 0.0 @@ -769,6 +780,7 @@ Out of $(length(new_fracs)) fractions $(length(new_fracs_unique)) are syntactica runtime = @elapsed new_fracs = beautiful_generators( RationalFunctionField(new_fracs_unique), priority_variables = priority_variables, + want_in_numerator = want_in_numerator, ) @debug "Checking inclusion with probability $prob_threshold" runtime = diff --git a/src/identifiable_functions.jl b/src/identifiable_functions.jl index 0ef38f182..bcc3c702a 100644 --- a/src/identifiable_functions.jl +++ b/src/identifiable_functions.jl @@ -124,6 +124,7 @@ function _find_identifiable_functions( simplify = simplify, rational_interpolator = rational_interpolator, priority_variables = [parent_ring_change(p, bring) for p in ode.parameters], + want_in_numerator = [parent_ring_change(p, bring) for p in ode.x_vars], ) else id_funcs_fracs = dennums_to_fractions(id_funcs) diff --git a/src/known_ic.jl b/src/known_ic.jl index a61fcc797..37107e3ac 100644 --- a/src/known_ic.jl +++ b/src/known_ic.jl @@ -55,6 +55,7 @@ function _find_identifiable_functions_kic( seed = seed, simplify = simplify, rational_interpolator = rational_interpolator, + want_in_numerator = ode.x_vars, ) @info "The search for identifiable functions with known initial conditions concluded in $((time_ns() - runtime_start) / 1e9) seconds" From 4e875570c976b3809f7040b1f82749a6ca83deca Mon Sep 17 00:00:00 2001 From: Alexander Demin <60229118+sumiya11@users.noreply.github.com> Date: Fri, 16 May 2025 06:12:11 +0300 Subject: [PATCH 2/2] Another try --- src/identifiable_functions.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/identifiable_functions.jl b/src/identifiable_functions.jl index bcc3c702a..37ff9a49c 100644 --- a/src/identifiable_functions.jl +++ b/src/identifiable_functions.jl @@ -124,7 +124,7 @@ function _find_identifiable_functions( simplify = simplify, rational_interpolator = rational_interpolator, priority_variables = [parent_ring_change(p, bring) for p in ode.parameters], - want_in_numerator = [parent_ring_change(p, bring) for p in ode.x_vars], + want_in_numerator = ode.x_vars, ) else id_funcs_fracs = dennums_to_fractions(id_funcs)