Skip to content

Flip functions with states in denominator #409

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
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
14 changes: 13 additions & 1 deletion src/RationalFunctionFields/RationalFunctionField.jl
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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)
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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 =
Expand Down
1 change: 1 addition & 0 deletions src/identifiable_functions.jl
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
1 change: 1 addition & 0 deletions src/known_ic.jl
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
Loading