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..37ff9a49c 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 = 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"