|
import os |
|
import gradio as gr |
|
from sympy.core.numbers import Rational |
|
from solution import BadInput, solutions |
|
|
|
|
|
def generate_md(args_dict, name): |
|
try: |
|
ans_latex = solutions[name](**args_dict).get_latex_ans() |
|
|
|
except BadInput as e: |
|
return f"Incorrectly entered. Please enter a valid number: {e}" |
|
|
|
return f"Note that $${ans_latex}$$ QED" |
|
|
|
|
|
def float_to_fraction(x): |
|
x_str = "{0:.10f}".format(x).rstrip("0").rstrip(".") |
|
|
|
|
|
if "." not in x_str: |
|
return Rational(x_str), Rational(1) |
|
|
|
|
|
integer_part, decimal_part = x_str.split(".") |
|
decimal_digits = len(decimal_part) |
|
|
|
|
|
numerator = int(integer_part + decimal_part) |
|
denominator = 10**decimal_digits |
|
|
|
|
|
gcd_value = 1 |
|
a = numerator |
|
b = denominator |
|
while b != 0: |
|
a, b = b, a % b |
|
gcd_value = a |
|
|
|
p = Rational(numerator // gcd_value) |
|
q = Rational(denominator // gcd_value) |
|
return p, q |
|
|
|
|
|
def infer_pi(p, q): |
|
if q == 0: |
|
return "The denominator can not be 0 !" |
|
|
|
p, q = float_to_fraction(p / q) |
|
args_dict = {"p": p, "q": q} |
|
return generate_md(args_dict, "π") |
|
|
|
|
|
def infer_e(p, q): |
|
if q == 0: |
|
return "The denominator can not be 0 !" |
|
|
|
p, q = float_to_fraction(p / q) |
|
args_dict = {"p": p, "q": q} |
|
return generate_md(args_dict, "e") |
|
|
|
|
|
def infer_eq(q1, q2, u, v): |
|
if q2 == 0 or v == 0: |
|
return "The denominator can not be 0 !" |
|
|
|
q1, q2 = float_to_fraction(q1 / q2) |
|
u, v = float_to_fraction(u / v) |
|
args_dict = {"q1": q1, "q2": q2, "u": u, "v": v} |
|
return generate_md(args_dict, "e^q") |
|
|
|
|
|
def infer_pin(n: int, p, q): |
|
if q == 0: |
|
return "The denominator can not be 0 !" |
|
|
|
p, q = float_to_fraction(p / q) |
|
args_dict = {"n": n, "p": p, "q": q} |
|
return generate_md(args_dict, "π^n") |
|
|
|
|
|
if __name__ == "__main__": |
|
os.chdir(os.path.dirname(__file__)) |
|
for file_name in os.listdir("solutions"): |
|
if not file_name.endswith(".py"): |
|
continue |
|
|
|
__import__(f"solutions.{file_name[:-3]}") |
|
|
|
with gr.Blocks() as demo: |
|
gr.Markdown("# Compare sizes by 'Note that' proof") |
|
with gr.Tabs(): |
|
with gr.TabItem("π"): |
|
gr.Interface( |
|
fn=infer_pi, |
|
inputs=[ |
|
gr.Number(label="p", value=314), |
|
gr.Number(label="q", value=100), |
|
], |
|
outputs=gr.Markdown( |
|
value="#### Proof result", |
|
show_copy_button=True, |
|
container=True, |
|
min_height=122, |
|
), |
|
title="Compare π and p/q", |
|
allow_flagging="never", |
|
) |
|
|
|
with gr.TabItem("e"): |
|
gr.Interface( |
|
fn=infer_e, |
|
inputs=[ |
|
gr.Number(label="p", value=2718), |
|
gr.Number(label="q", value=1000), |
|
], |
|
outputs=gr.Markdown( |
|
value="#### Proof result", |
|
show_copy_button=True, |
|
container=True, |
|
min_height=122, |
|
), |
|
title="Compare e and p/q", |
|
allow_flagging="never", |
|
) |
|
|
|
with gr.TabItem("e^q"): |
|
gr.Interface( |
|
fn=infer_eq, |
|
inputs=[ |
|
gr.Number(label="p", value=3), |
|
gr.Number(label="q", value=4), |
|
gr.Number(label="u", value=2117), |
|
gr.Number(label="v", value=1000), |
|
], |
|
outputs=gr.Markdown( |
|
value="#### Proof result", |
|
show_copy_button=True, |
|
container=True, |
|
min_height=122, |
|
), |
|
title="Compare e^(p/q) and u/v", |
|
allow_flagging="never", |
|
) |
|
|
|
with gr.TabItem("π^n"): |
|
gr.Interface( |
|
fn=infer_pin, |
|
inputs=[ |
|
gr.Number(label="n", value=3, step=1), |
|
gr.Number(label="p", value=31), |
|
gr.Number(label="q", value=1), |
|
], |
|
outputs=gr.Markdown( |
|
value="#### Proof result", |
|
show_copy_button=True, |
|
container=True, |
|
min_height=122, |
|
), |
|
title="Compare π^n and p/q", |
|
allow_flagging="never", |
|
) |
|
|
|
demo.launch() |
|
|