Carlexxx commited on
Commit
4e95a36
·
verified ·
1 Parent(s): 057fc30

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +79 -48
app.py CHANGED
@@ -1,3 +1,4 @@
 
1
  import numpy as np
2
  import matplotlib.pyplot as plt
3
  import math
@@ -29,55 +30,41 @@ def aprender_com_o_eco(pontos_do_eco: list) -> dict:
29
  bearing_radianos = math.atan2(vetor_velocidade[1], vetor_velocidade[0])
30
  return {"bearing_rad": bearing_radianos, "velocity_vector": vetor_velocidade}
31
 
32
- # --- Simulação com os Dados de Entrada Fornecidos ---
33
 
34
- def simular_jornada_especifica():
35
  """
36
- Executa a simulação com os pontos-chave definidos pelo Arquiteto
37
- e plota o resultado.
38
  """
39
  # 1. DEFINIÇÃO DOS PONTOS DA JORNADA
40
- # A trajetória da Criança A é definida por estes 4 vetores (pontos)
41
- p1 = np.array([0, 0]) # Vetor x1, y=0
42
- p2 = np.array([25, 15]) # Vetor x2, y=15 (Assumindo um X para visualização)
43
- p3 = np.array([50, 30]) # Vetor x3, y=30 (Assumindo um X para visualização)
44
- p4_encontro = np.array([75, 45]) # Vetor x4, y=45 (Ponto de Handover)
45
-
46
- # O destino da Criança B
47
- p5_destino = np.array([100, 90]) # Vetor final, y=90 (Assumindo um X para o destino)
48
-
49
- # Número de pontos a serem usados como "eco de memória"
50
- NUMERO_DE_VETORES_ECO = 150 # Equivalente a 15% de 1000 pontos
51
 
52
- print(f"--- DADOS DE ENTRADA ---")
53
- print(f"Caminho da Criança A definido por: {p1}, {p2}, {p3}, {p4_encontro}")
54
- print(f"Destino da Criança B: {p5_destino}")
55
- print(f"Número de vetores no Eco de Memória: {NUMERO_DE_VETORES_ECO}")
56
- print("------------------------\n")
57
 
58
- # 2. GERAR A CURVA DA CRIANÇA A
59
- # Usamos os 4 pontos para criar uma curva de Bézier cúbica, mais complexa.
60
  pontos_curva_a = [p1, p2, p3, p4_encontro]
61
  x_a, y_a = bezier_curve(pontos_curva_a, n_times=1000)
62
 
63
  # 3. ISOLAR O ECO
 
 
 
64
  x_eco = x_a[-NUMERO_DE_VETORES_ECO:]
65
  y_eco = y_a[-NUMERO_DE_VETORES_ECO:]
66
  pontos_do_eco = list(zip(x_eco, y_eco))
67
 
68
- # 4. CRIANÇA B APRENDE COM O ECO
69
  essencia_movimento = aprender_com_o_eco(pontos_do_eco)
70
  vetor_aprendido = essencia_movimento["velocity_vector"]
71
 
72
- print("--- APRENDIZADO DA CRIANÇA B ---")
73
- print(f"Vetor de Inércia aprendido no Eco: ({vetor_aprendido[0]:.2f}, {vetor_aprendido[1]:.2f})")
74
- print(f"Direção final da Criança A: {math.degrees(essencia_movimento['bearing_rad']):.2f} graus")
75
- print("------------------------------\n")
76
-
77
- # 5. GERAR A CURVA DA CRIANÇA B
78
- # O ponto de controle que define a tangente de saída é o ponto de encontro + o vetor aprendido
79
  ponto_controle_b = p4_encontro + vetor_aprendido
80
- # A curva vai do ponto de encontro ao destino, guiada pelo ponto de controle
81
  pontos_curva_b = [p4_encontro, ponto_controle_b, p5_destino]
82
  x_b, y_b = bezier_curve(pontos_curva_b, n_times=1000)
83
 
@@ -86,7 +73,6 @@ def simular_jornada_especifica():
86
  fig.patch.set_facecolor('black')
87
  ax.set_facecolor('black')
88
 
89
- # Configuração dos eixos para serem visíveis
90
  ax.spines['bottom'].set_color('white')
91
  ax.spines['left'].set_color('white')
92
  ax.spines['top'].set_color('black')
@@ -94,31 +80,76 @@ def simular_jornada_especifica():
94
  ax.tick_params(axis='x', colors='white')
95
  ax.tick_params(axis='y', colors='white')
96
 
97
- # Plot das curvas
98
- ax.plot(x_a, y_a, label='Caminho da Criança A', color='cyan', linewidth=2)
99
- ax.plot(x_b, y_b, label='Continuidade da Criança B', color='lime', linewidth=2, linestyle='--')
100
-
101
- # Destaque do Eco
102
  ax.plot(x_eco, y_eco, label=f'Eco de Memória ({NUMERO_DE_VETORES_ECO} vetores)', color='magenta', linewidth=4)
103
 
104
- # Plot dos pontos chave
105
- pontos_chave = np.array([p1, p2, p3, p4_encontro, p5_destino])
106
- ax.plot(pontos_chave[:,0], pontos_chave[:,1], 'o', color='red', markersize=8, label='Pontos-Chave Definidos')
107
- ax.plot(p4_encontro[0], p4_encontro[1], 'o', color='yellow', markersize=10, label='Ponto de Encontro')
108
 
109
- # Títulos e legendas
110
- ax.set_title('Demonstração do Teorema da Continuidade', color='white', fontsize=16)
111
  ax.set_xlabel('Eixo X', color='white', fontsize=12)
112
  ax.set_ylabel('Eixo Y', color='white', fontsize=12)
113
- legend = ax.legend(facecolor='gray', edgecolor='white', framealpha=0.1)
114
  for text in legend.get_texts():
115
  text.set_color('white')
116
 
117
- ax.grid(True, linestyle='--', color='gray', alpha=0.5)
118
  ax.set_aspect('equal', adjustable='box')
119
 
120
- plt.show()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
121
 
122
- # --- Execução do Script ---
123
  if __name__ == "__main__":
124
- simular_jornada_especifica()
 
1
+ import gradio as gr
2
  import numpy as np
3
  import matplotlib.pyplot as plt
4
  import math
 
30
  bearing_radianos = math.atan2(vetor_velocidade[1], vetor_velocidade[0])
31
  return {"bearing_rad": bearing_radianos, "velocity_vector": vetor_velocidade}
32
 
33
+ # --- Função Principal do Gradio (A Interface do Laboratório) ---
34
 
35
+ def gerar_grafico_dinamico(destino_x, destino_y, eco_vetores):
36
  """
37
+ Gera e plota a jornada com o caminho da Criança A fixo
38
+ e o destino da Criança B dinâmico.
39
  """
40
  # 1. DEFINIÇÃO DOS PONTOS DA JORNADA
41
+ # Caminho da Criança A é fixo e representa o passado
42
+ p1 = np.array([0, 0])
43
+ p2 = np.array([25, 15])
44
+ p3 = np.array([50, 30])
45
+ p4_encontro = np.array([75, 45])
 
 
 
 
 
 
46
 
47
+ # Destino da Criança B é dinâmico, vindo da UI
48
+ p5_destino = np.array([destino_x, destino_y])
 
 
 
49
 
50
+ # 2. GERAR A CURVA FIXA DA CRIANÇA A
 
51
  pontos_curva_a = [p1, p2, p3, p4_encontro]
52
  x_a, y_a = bezier_curve(pontos_curva_a, n_times=1000)
53
 
54
  # 3. ISOLAR O ECO
55
+ NUMERO_DE_VETORES_ECO = int(eco_vetores)
56
+ if NUMERO_DE_VETORES_ECO < 2: NUMERO_DE_VETORES_ECO = 2
57
+
58
  x_eco = x_a[-NUMERO_DE_VETORES_ECO:]
59
  y_eco = y_a[-NUMERO_DE_VETORES_ECO:]
60
  pontos_do_eco = list(zip(x_eco, y_eco))
61
 
62
+ # 4. CRIANÇA B APRENDE COM O ECO (mesma lógica de sempre)
63
  essencia_movimento = aprender_com_o_eco(pontos_do_eco)
64
  vetor_aprendido = essencia_movimento["velocity_vector"]
65
 
66
+ # 5. GERAR A CURVA DINÂMICA DA CRIANÇA B
 
 
 
 
 
 
67
  ponto_controle_b = p4_encontro + vetor_aprendido
 
68
  pontos_curva_b = [p4_encontro, ponto_controle_b, p5_destino]
69
  x_b, y_b = bezier_curve(pontos_curva_b, n_times=1000)
70
 
 
73
  fig.patch.set_facecolor('black')
74
  ax.set_facecolor('black')
75
 
 
76
  ax.spines['bottom'].set_color('white')
77
  ax.spines['left'].set_color('white')
78
  ax.spines['top'].set_color('black')
 
80
  ax.tick_params(axis='x', colors='white')
81
  ax.tick_params(axis='y', colors='white')
82
 
83
+ ax.plot(x_a, y_a, label='Caminho da Criança A (Passado Fixo)', color='cyan', linewidth=2)
84
+ ax.plot(x_b, y_b, label='Continuidade da Criança B (Futuro Gerado)', color='lime', linewidth=2, linestyle='--')
 
 
 
85
  ax.plot(x_eco, y_eco, label=f'Eco de Memória ({NUMERO_DE_VETORES_ECO} vetores)', color='magenta', linewidth=4)
86
 
87
+ pontos_chave_a = np.array([p1, p2, p3, p4_encontro])
88
+ ax.plot(pontos_chave_a[:,0], pontos_chave_a[:,1], 'o', color='gray', markersize=8, label='Controle da Criança A')
89
+ ax.plot(p4_encontro[0], p4_encontro[1], 'o', color='yellow', markersize=12, markeredgecolor='black', label='Ponto de Encontro')
90
+ ax.plot(p5_destino[0], p5_destino[1], 'X', color='red', markersize=12, markeredgecolor='white', label='Destino da Criança B (Seu Input)')
91
 
92
+ ax.set_title('Laboratório de Continuidade Causal', color='white', fontsize=16)
 
93
  ax.set_xlabel('Eixo X', color='white', fontsize=12)
94
  ax.set_ylabel('Eixo Y', color='white', fontsize=12)
95
+ legend = ax.legend(facecolor='#111111', edgecolor='white', framealpha=0.5)
96
  for text in legend.get_texts():
97
  text.set_color('white')
98
 
99
+ ax.grid(True, linestyle='--', color='gray', alpha=0.3)
100
  ax.set_aspect('equal', adjustable='box')
101
 
102
+ caminho_figura = "laboratorio_continuidade.png"
103
+ plt.savefig(caminho_figura, bbox_inches='tight', pad_inches=0.1, dpi=100, transparent=True)
104
+ plt.close(fig)
105
+
106
+ # Retorna o caminho da imagem e o vetor aprendido para a UI
107
+ info_vetor = f"Vetor de Inércia Aprendido: ({vetor_aprendido[0]:.2f}, {vetor_aprendido[1]:.2f}) | Direção: {math.degrees(essencia_movimento['bearing_rad']):.2f}°"
108
+
109
+ return caminho_figura, info_vetor
110
+
111
+ # --- Interface Gradio ---
112
+
113
+ with gr.Blocks(theme=gr.themes.Base(primary_hue="teal")) as demo:
114
+ gr.Markdown(
115
+ """
116
+ # 🔬 Laboratório de Continuidade Causal
117
+ O caminho da "Criança A" (em ciano) é fixo, representando um evento passado.
118
+ Use os controles para definir o **destino da Criança B** e o **tamanho da memória (eco)**.
119
+ Observe como o sistema calcula a inércia do passado para gerar uma trajetória futura perfeitamente contínua.
120
+ """
121
+ )
122
+
123
+ with gr.Row():
124
+ with gr.Column(scale=1):
125
+ gr.Markdown("### 🎮 Controles da Simulação")
126
+
127
+ gr.Markdown("**Defina o Destino da Criança B:**")
128
+ destino_x_input = gr.Slider(-50, 150, value=100, label="Destino Final (X)")
129
+ destino_y_input = gr.Slider(-50, 150, value=90, label="Destino Final (Y)")
130
+
131
+ gr.Markdown("**Defina a Memória:**")
132
+ eco_input = gr.Slider(2, 300, value=150, step=1, label="Nº de Vetores no Eco de Memória")
133
+
134
+ # Botão não é estritamente necessário com live=True, mas é bom ter
135
+ run_button = gr.Button("Calcular e Gerar Gráfico", variant="primary")
136
+
137
+ with gr.Column(scale=2):
138
+ gr.Markdown("### 📊 Visualização da Jornada")
139
+ info_output = gr.Textbox(label="Dados do Aprendizado (Calculado)", interactive=False)
140
+ plot_output = gr.Image(label="Gráfico da Continuidade", type="filepath")
141
+
142
+ # Lista de componentes de entrada para a função
143
+ inputs = [destino_x_input, destino_y_input, eco_input]
144
+
145
+ # Conecta os sliders e o botão à função
146
+ for component in inputs:
147
+ component.change(fn=gerar_grafico_dinamico, inputs=inputs, outputs=[plot_output, info_output])
148
+ run_button.click(fn=gerar_grafico_dinamico, inputs=inputs, outputs=[plot_output, info_output])
149
+
150
+ # Gera o gráfico inicial ao carregar a página
151
+ demo.load(fn=gerar_grafico_dinamico, inputs=inputs, outputs=[plot_output, info_output])
152
+
153
 
 
154
  if __name__ == "__main__":
155
+ demo.launch()