Spaces:
Sleeping
Sleeping
File size: 3,398 Bytes
ce05002 2baf94a ce04ad4 2273894 ce05002 90bcf50 2baf94a 90bcf50 2baf94a 5f704da e5d5105 695fe89 e5d5105 9c6afa0 2baf94a e5d5105 695fe89 2baf94a e5d5105 9c6afa0 695fe89 451e5be f04f86a 402c271 9c6afa0 451e5be 695fe89 9c6afa0 695fe89 9c6afa0 695fe89 9c6afa0 695fe89 9c6afa0 451e5be f04f86a 9c6afa0 f04f86a 9c6afa0 f04f86a 9c6afa0 f04f86a |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
import gradio as gr
import matplotlib.pyplot as plt
from matplotlib_venn import venn3
from io import BytesIO
from PIL import Image
def validate_inputs(A, B, C, AB, AC, BC, ABC, U):
total_needed = A + B + C - AB - AC - BC + ABC
errors = []
if total_needed > U:
errors.append("El conjunto universal U debe ser mayor o igual a la suma de los subconjuntos y sus intersecciones.")
return errors
def calculate_probabilities(A, B, C, AB, AC, BC, ABC, U):
total = U
P_A = A / total
P_B = B / total
P_C = C / total
P_AB = AB / total
P_AC = AC / total
P_BC = BC / total
P_ABC = ABC / total
formatted_probs = {
"P(A)": f"{P_A:.2%} ({A}/{total})",
"P(B)": f"{P_B:.2%} ({B}/{total})",
"P(C)": f"{P_C:.2%} ({C}/{total})",
"P(A ∩ B)": f"{P_AB:.2%} ({AB}/{total})",
"P(A ∩ C)": f"{P_AC:.2%} ({AC}/{total})",
"P(B ∩ C)": f"{P_BC:.2%} ({BC}/{total})",
"P(A ∩ B ∩ C)": f"{P_ABC:.2%} ({ABC}/{total})"
}
return formatted_probs
def plot_venn(A, B, C, AB, AC, BC, ABC):
plt.figure(figsize=(8, 8))
subsets = {
'100': A - AB - AC + ABC,
'010': B - AB - BC + ABC,
'001': C - AC - BC + ABC,
'110': AB - ABC,
'101': AC - ABC,
'011': BC - ABC,
'111': ABC
}
venn = venn3(subsets=subsets, set_labels=('A', 'B', 'C'))
plt.title(f"Diagrama de Venn")
buf = BytesIO()
plt.savefig(buf, format='png')
buf.seek(0)
img = Image.open(buf)
return img
def suggest_intersections(A, B, C, AB, AC, BC, ABC):
max_AB = min(A, B)
max_AC = min(A, C)
max_BC = min(B, C)
max_ABC = min(max_AB, max_AC, max_BC)
min_AB = max(0, AB)
min_AC = max(0, AC)
min_BC = max(0, BC)
min_ABC = max(0, ABC)
suggestions = {
"Máximo valor sugerido para A ∩ B": max_AB,
"Mínimo valor sugerido para A ∩ B": min_AB,
"Máximo valor sugerido para A ∩ C": max_AC,
"Mínimo valor sugerido para A ∩ C": min_AC,
"Máximo valor sugerido para B ∩ C": max_BC,
"Mínimo valor sugerido para B ∩ C": min_BC,
"Máximo valor sugerido para A ∩ B ∩ C": max_ABC,
"Mínimo valor sugerido para A ∩ B ∩ C": min_ABC,
}
return suggestions
def main(A, B, C, AB, AC, BC, ABC, U):
errors = validate_inputs(A, B, C, AB, AC, BC, ABC, U)
if errors:
return None, {"error": "\n".join(errors), "sugerencias": suggest_intersections(A, B, C, AB, AC, BC, ABC)}
venn_diagram = plot_venn(A, B, C, AB, AC, BC, ABC)
probabilities = calculate_probabilities(A, B, C, AB, AC, BC, ABC, U)
return venn_diagram, {"probabilidades": probabilities, "sugerencias": suggest_intersections(A, B, C, AB, AC, BC, ABC)}
iface = gr.Interface(
fn=main,
inputs=[
gr.Number(label="Conjunto Universal (U)", value=0),
gr.Number(label="Cantidad en A"),
gr.Number(label="Cantidad en B"),
gr.Number(label="Cantidad en C"),
gr.Number(label="Cantidad en A ∩ B"),
gr.Number(label="Cantidad en A ∩ C"),
gr.Number(label="Cantidad en B ∩ C"),
gr.Number(label="Cantidad en A ∩ B ∩ C")
],
outputs=[
gr.Image(type="pil", label="Diagrama de Venn"),
gr.JSON(label="Resultados y Sugerencias")
],
live=True
)
iface.launch()
|