Anupam251272 commited on
Commit
afbd4c4
·
verified ·
1 Parent(s): e9f11ef

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +561 -0
app.py ADDED
@@ -0,0 +1,561 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import numpy as np
3
+ import torch
4
+ import sympy as sp
5
+ from transformers import pipeline
6
+ import plotly.graph_objects as go
7
+ import plotly.express as px
8
+ import matplotlib.pyplot as plt
9
+ from scipy.integrate import odeint
10
+ from typing import Dict, List, Tuple
11
+
12
+ class PhysicsSolver:
13
+ def __init__(self):
14
+ self.nlp = pipeline("text-classification", model="bert-base-uncased")
15
+
16
+ def solve_mechanics_problem(self, problem_text: str, problem_type: str) -> str:
17
+ """Solve various physics problems using symbolic mathematics"""
18
+ try:
19
+ # Common symbols
20
+ t, v, a, s, m, F, E, P, W, k, x = sp.symbols('t v a s m F E P W k x')
21
+ g = 9.81
22
+
23
+ solutions = {
24
+ 'kinematics': self._solve_kinematics,
25
+ 'forces': self._solve_forces,
26
+ 'energy': self._solve_energy,
27
+ 'harmonic': self._solve_harmonic_motion
28
+ }
29
+
30
+ if problem_type in solutions:
31
+ return solutions[problem_type](problem_text)
32
+ else:
33
+ return "Unsupported problem type"
34
+
35
+ except Exception as e:
36
+ return f"Error solving problem: {str(e)}"
37
+
38
+ def _solve_kinematics(self, problem_text: str) -> str:
39
+ """Handle kinematics problems"""
40
+ t, v, a, s = sp.symbols('t v a s')
41
+ solution = "Kinematics Analysis:\n\n"
42
+ solution += "Using equations:\n"
43
+ solution += "1. v = u + at\n"
44
+ solution += "2. s = ut + ½at²\n"
45
+ solution += "3. v² = u² + 2as\n\n"
46
+ return solution
47
+
48
+ def _solve_forces(self, problem_text: str) -> str:
49
+ """Handle force and Newton's laws problems"""
50
+ m, a, F = sp.symbols('m a F')
51
+ solution = "Force Analysis:\n\n"
52
+ solution += "Using Newton's Laws:\n"
53
+ solution += "1. F = ma\n"
54
+ solution += "2. Action = -Reaction\n"
55
+ return solution
56
+
57
+ def _solve_energy(self, problem_text: str) -> str:
58
+ """Handle energy conservation problems"""
59
+ m, v, h, k, E = sp.symbols('m v h k E')
60
+ solution = "Energy Analysis:\n\n"
61
+ solution += "Using energy conservation:\n"
62
+ solution += "1. KE = ½mv²\n"
63
+ solution += "2. PE = mgh\n"
64
+ solution += "3. Total E = KE + PE\n"
65
+ return solution
66
+
67
+ def _solve_harmonic_motion(self, problem_text: str) -> str:
68
+ """Handle simple harmonic motion problems"""
69
+ m, k, x, t = sp.symbols('m k x t')
70
+ solution = "Harmonic Motion Analysis:\n\n"
71
+ solution += "Using SHM equations:\n"
72
+ solution += "1. F = -kx\n"
73
+ solution += "2. ω = √(k/m)\n"
74
+ solution += "3. x = A cos(ωt)\n"
75
+ return solution
76
+
77
+ class ExperimentSimulator:
78
+ def __init__(self):
79
+ self.supported_experiments = ['pendulum', 'projectile', 'spring', 'wave']
80
+
81
+ def simulate_pendulum(self, length: float, theta0: float, time_span: float) -> Tuple[np.ndarray, np.ndarray, np.ndarray]:
82
+ """Simulate simple pendulum motion"""
83
+ def pendulum_eq(state, t, L):
84
+ theta, omega = state
85
+ dydt = [omega, -(9.81/L) * np.sin(theta)]
86
+ return dydt
87
+
88
+ t = np.linspace(0, time_span, 1000)
89
+ state0 = [theta0, 0]
90
+ solution = odeint(pendulum_eq, state0, t, args=(length,))
91
+
92
+ x = length * np.sin(solution[:, 0])
93
+ y = -length * np.cos(solution[:, 0])
94
+
95
+ return x, y, t
96
+
97
+ def simulate_projectile(self, v0: float, angle: float, height: float) -> Tuple[np.ndarray, np.ndarray]:
98
+ """Simulate projectile motion"""
99
+ g = 9.81
100
+ theta = np.radians(angle)
101
+
102
+ # Calculate time of flight
103
+ t_flight = (v0 * np.sin(theta) + np.sqrt((v0 * np.sin(theta))**2 + 2*g*height)) / g
104
+ t = np.linspace(0, t_flight, 1000)
105
+
106
+ # Calculate position
107
+ x = v0 * np.cos(theta) * t
108
+ y = height + v0 * np.sin(theta) * t - 0.5 * g * t**2
109
+
110
+ return x, y
111
+
112
+ def simulate_spring(self, mass: float, k: float, x0: float, time_span: float) -> Tuple[np.ndarray, np.ndarray]:
113
+ """Simulate spring motion"""
114
+ omega = np.sqrt(k/mass)
115
+ t = np.linspace(0, time_span, 1000)
116
+ x = x0 * np.cos(omega * t)
117
+ v = -x0 * omega * np.sin(omega * t)
118
+
119
+ return x, v, t
120
+
121
+ def simulate_wave(self, amplitude: float, frequency: float, wavelength: float, time_span: float) -> Tuple[np.ndarray, np.ndarray, np.ndarray]:
122
+ """Simulate wave propagation"""
123
+ x = np.linspace(0, 5*wavelength, 1000)
124
+ t = np.linspace(0, time_span, 100)
125
+ k = 2 * np.pi / wavelength
126
+ omega = 2 * np.pi * frequency
127
+
128
+ X, T = np.meshgrid(x, t)
129
+ Y = amplitude * np.sin(k*X - omega*T)
130
+
131
+ return X, T, Y
132
+
133
+ class VisualizationTools:
134
+ @staticmethod
135
+ def plot_pendulum(x: np.ndarray, y: np.ndarray, t: np.ndarray) -> go.Figure:
136
+ """Create an interactive pendulum visualization"""
137
+ fig = go.Figure()
138
+
139
+ # Add pendulum path
140
+ fig.add_trace(go.Scatter(x=x, y=y, mode='lines', name='Pendulum Path'))
141
+
142
+ # Add animation frames
143
+ frames = [go.Frame(data=[go.Scatter(
144
+ x=[0, x[i]],
145
+ y=[0, y[i]],
146
+ mode='lines+markers',
147
+ line=dict(color='red', width=2),
148
+ marker=dict(size=[10, 20])
149
+ )]) for i in range(0, len(t), 10)]
150
+
151
+ fig.frames = frames
152
+
153
+ # Add animation controls
154
+ fig.update_layout(
155
+ updatemenus=[dict(
156
+ type='buttons',
157
+ showactive=False,
158
+ buttons=[dict(label='Play',
159
+ method='animate',
160
+ args=[None, dict(frame=dict(duration=50, redraw=True),
161
+ fromcurrent=True,
162
+ mode='immediate')])])])
163
+
164
+ fig.update_layout(
165
+ title='Simple Pendulum Motion',
166
+ xaxis_title='X Position (m)',
167
+ yaxis_title='Y Position (m)',
168
+ yaxis=dict(scaleanchor="x", scaleratio=1),
169
+ )
170
+
171
+ return fig
172
+
173
+ @staticmethod
174
+ def plot_projectile(x: np.ndarray, y: np.ndarray) -> go.Figure:
175
+ """Create projectile motion visualization"""
176
+ fig = go.Figure()
177
+
178
+ fig.add_trace(go.Scatter(x=x, y=y, mode='lines',
179
+ name='Projectile Path'))
180
+
181
+ fig.update_layout(
182
+ title='Projectile Motion',
183
+ xaxis_title='Distance (m)',
184
+ yaxis_title='Height (m)',
185
+ yaxis=dict(scaleanchor="x", scaleratio=1),
186
+ )
187
+
188
+ return fig
189
+
190
+ @staticmethod
191
+ def plot_spring(x: np.ndarray, v: np.ndarray, t: np.ndarray) -> go.Figure:
192
+ """Create spring motion visualization"""
193
+ fig = go.Figure()
194
+
195
+ fig.add_trace(go.Scatter(x=t, y=x, name='Position'))
196
+ fig.add_trace(go.Scatter(x=t, y=v, name='Velocity'))
197
+
198
+ fig.update_layout(
199
+ title='Spring Motion',
200
+ xaxis_title='Time (s)',
201
+ yaxis_title='Position/Velocity',
202
+ )
203
+
204
+ return fig
205
+
206
+ @staticmethod
207
+ def plot_wave(X: np.ndarray, T: np.ndarray, Y: np.ndarray) -> go.Figure:
208
+ """Create wave propagation visualization"""
209
+ fig = go.Figure()
210
+
211
+ # Create animation frames
212
+ frames = [go.Frame(
213
+ data=[go.Scatter(
214
+ x=X[i],
215
+ y=Y[i],
216
+ mode='lines',
217
+ line=dict(width=2)
218
+ )],
219
+ name=f'frame{i}'
220
+ ) for i in range(len(T))]
221
+
222
+ fig.frames = frames
223
+
224
+ # Add initial data
225
+ fig.add_trace(go.Scatter(
226
+ x=X[0],
227
+ y=Y[0],
228
+ mode='lines',
229
+ line=dict(width=2)
230
+ ))
231
+
232
+ # Add animation controls
233
+ fig.update_layout(
234
+ updatemenus=[dict(
235
+ type='buttons',
236
+ showactive=False,
237
+ buttons=[dict(label='Play',
238
+ method='animate',
239
+ args=[None, dict(frame=dict(duration=50, redraw=True),
240
+ fromcurrent=True,
241
+ mode='immediate')])])])
242
+
243
+ fig.update_layout(
244
+ title='Wave Propagation',
245
+ xaxis_title='Position (m)',
246
+ yaxis_title='Amplitude',
247
+ )
248
+
249
+ return fig
250
+
251
+ def create_interface():
252
+ # Initialize components
253
+ solver = PhysicsSolver()
254
+ simulator = ExperimentSimulator()
255
+ viz_tools = VisualizationTools()
256
+
257
+ # Define interface functions
258
+ def solve_physics_problem(problem_text: str, problem_type: str) -> str:
259
+ return solver.solve_mechanics_problem(problem_text, problem_type)
260
+
261
+ def run_pendulum_simulation(length: float, initial_angle: float, duration: float) -> go.Figure:
262
+ x, y, t = simulator.simulate_pendulum(length, np.radians(initial_angle), duration)
263
+ return viz_tools.plot_pendulum(x, y, t)
264
+
265
+ def run_projectile_simulation(velocity: float, angle: float, height: float) -> go.Figure:
266
+ x, y = simulator.simulate_projectile(velocity, angle, height)
267
+ return viz_tools.plot_projectile(x, y)
268
+
269
+ def run_spring_simulation(mass: float, k: float, x0: float, duration: float) -> go.Figure:
270
+ x, v, t = simulator.simulate_spring(mass, k, x0, duration)
271
+ return viz_tools.plot_spring(x, v, t)
272
+
273
+ def run_wave_simulation(amplitude: float, frequency: float, wavelength: float, duration: float) -> go.Figure:
274
+ X, T, Y = simulator.simulate_wave(amplitude, frequency, wavelength, duration)
275
+ return viz_tools.plot_wave(X, T, Y)
276
+
277
+ # Create the interface
278
+ with gr.Blocks() as interface:
279
+ gr.Markdown("# Enhanced AI Physics Platform")
280
+
281
+ with gr.Tab("Problem Solver"):
282
+ problem_input = gr.Textbox(
283
+ label="Enter your physics problem",
284
+ placeholder="Describe your physics problem here..."
285
+ )
286
+ problem_type = gr.Dropdown(
287
+ choices=['kinematics', 'forces', 'energy', 'harmonic'],
288
+ label="Problem Type"
289
+ )
290
+ solve_button = gr.Button("Solve Problem")
291
+ solution_output = gr.Textbox(label="Solution")
292
+
293
+ solve_button.click(
294
+ fn=solve_physics_problem,
295
+ inputs=[problem_input, problem_type],
296
+ outputs=solution_output
297
+ )
298
+
299
+ with gr.Tab("Pendulum Simulation"):
300
+ with gr.Row():
301
+ length_input = gr.Slider(1, 10, value=2, label="Pendulum Length (m)")
302
+ angle_input = gr.Slider(0, 90, value=45, label="Initial Angle (degrees)")
303
+ duration_input = gr.Slider(1, 20, value=10, label="Simulation Duration (s)")
304
+
305
+ pendulum_button = gr.Button("Run Pendulum Simulation")
306
+ pendulum_plot = gr.Plot(label="Pendulum Motion")
307
+
308
+ pendulum_button.click(
309
+ fn=run_pendulum_simulation,
310
+ inputs=[length_input, angle_input, duration_input],
311
+ outputs=pendulum_plot
312
+ )
313
+
314
+ with gr.Tab("Projectile Motion"):
315
+ with gr.Row():
316
+ velocity_input = gr.Slider(0, 50, value=20, label="Initial Velocity (m/s)")
317
+ proj_angle_input = gr.Slider(0, 90, value=45, label="Launch Angle (degrees)")
318
+ height_input = gr.Slider(0, 100, value=0, label="Initial Height (m)")
319
+
320
+ projectile_button = gr.Button("Run Projectile Simulation")
321
+ projectile_plot = gr.Plot(label="Projectile Motion")
322
+
323
+ projectile_button.click(
324
+ fn=run_projectile_simulation,
325
+ inputs=[velocity_input, proj_angle_input, height_input],
326
+ outputs=projectile_plot
327
+ )
328
+
329
+ with gr.Tab("Spring Motion"):
330
+ with gr.Row():
331
+ mass_input = gr.Slider(0.1, 10, value=1, label="Mass (kg)")
332
+ k_input = gr.Slider(1, 100, value=10, label="Spring Constant (N/m)")
333
+ x0_input = gr.Slider(0.1, 2, value=0.5, label="Initial Displacement (m)")
334
+ spring_duration = gr.Slider(1, 20, value=10, label="Simulation Duration (s)")
335
+
336
+ spring_button = gr.Button("Run Spring Simulation")
337
+ spring_plot = gr.Plot(label="Spring Motion")
338
+
339
+ spring_button.click(
340
+ fn=run_spring_simulation,
341
+ inputs=[mass_input, k_input, x0_input, spring_duration],
342
+ outputs=spring_plot
343
+ )
344
+
345
+ with gr.Tab("Wave Propagation"):
346
+ with gr.Row():
347
+ amp_input = gr.Slider(0.1, 2, value=1, label="Amplitude (m)")
348
+ freq_input = gr.Slider(0.1, 5, value=1, label="Frequency (Hz)")
349
+ wavelength_input = gr.Slider(0.1, 10, value=2, label="Wavelength (m)")
350
+ wave_duration = gr.Slider(1, 20, value=10, label="Simulation Duration (s)")
351
+
352
+ # Continuing from the previous code...
353
+ wave_button = gr.Button("Run Wave Simulation")
354
+ wave_plot = gr.Plot(label="Wave Propagation")
355
+
356
+ wave_button.click(
357
+ fn=run_wave_simulation,
358
+ inputs=[amp_input, freq_input, wavelength_input, wave_duration],
359
+ outputs=wave_plot
360
+ )
361
+
362
+ with gr.Tab("Advanced Visualizations"):
363
+ with gr.Row():
364
+ visualization_type = gr.Dropdown(
365
+ choices=[
366
+ 'Phase Space Plot',
367
+ 'Energy Distribution',
368
+ 'Vector Field',
369
+ '3D Motion'
370
+ ],
371
+ label="Visualization Type"
372
+ )
373
+
374
+ def create_advanced_visualization(viz_type):
375
+ if viz_type == 'Phase Space Plot':
376
+ return create_phase_space_plot()
377
+ elif viz_type == 'Energy Distribution':
378
+ return create_energy_distribution()
379
+ elif viz_type == 'Vector Field':
380
+ return create_vector_field()
381
+ elif viz_type == '3D Motion':
382
+ return create_3d_motion()
383
+
384
+ advanced_viz_button = gr.Button("Generate Visualization")
385
+ advanced_plot = gr.Plot(label="Advanced Visualization")
386
+
387
+ advanced_viz_button.click(
388
+ fn=create_advanced_visualization,
389
+ inputs=visualization_type,
390
+ outputs=advanced_plot
391
+ )
392
+
393
+ with gr.Tab("Data Analysis"):
394
+ data_input = gr.File(label="Upload Experimental Data (CSV)")
395
+ analysis_type = gr.Dropdown(
396
+ choices=[
397
+ 'Statistical Analysis',
398
+ 'Curve Fitting',
399
+ 'Error Analysis',
400
+ 'Fourier Transform'
401
+ ],
402
+ label="Analysis Type"
403
+ )
404
+
405
+ def analyze_data(file, analysis_type):
406
+ # Add data analysis functionality here
407
+ return f"Analysis results for {analysis_type}"
408
+
409
+ analyze_button = gr.Button("Analyze Data")
410
+ analysis_output = gr.Textbox(label="Analysis Results")
411
+ analysis_plot = gr.Plot(label="Analysis Visualization")
412
+
413
+ analyze_button.click(
414
+ fn=analyze_data,
415
+ inputs=[data_input, analysis_type],
416
+ outputs=[analysis_output, analysis_plot]
417
+ )
418
+
419
+ return interface
420
+
421
+ # Additional visualization functions
422
+ def create_phase_space_plot():
423
+ """Create a phase space plot for a dynamical system"""
424
+ fig = go.Figure()
425
+
426
+ # Generate sample phase space data
427
+ t = np.linspace(0, 20, 1000)
428
+ x = np.sin(t)
429
+ v = np.cos(t)
430
+
431
+ fig.add_trace(go.Scatter(x=x, y=v, mode='lines',
432
+ name='Phase Space Trajectory'))
433
+
434
+ fig.update_layout(
435
+ title='Phase Space Plot',
436
+ xaxis_title='Position',
437
+ yaxis_title='Velocity'
438
+ )
439
+
440
+ return fig
441
+
442
+ def create_energy_distribution():
443
+ """Create an energy distribution visualization"""
444
+ fig = go.Figure()
445
+
446
+ # Generate sample energy data
447
+ E = np.linspace(0, 10, 100)
448
+ P = np.exp(-E) * np.sqrt(E) # Maxwell-Boltzmann-like distribution
449
+
450
+ fig.add_trace(go.Scatter(x=E, y=P, mode='lines',
451
+ name='Energy Distribution'))
452
+
453
+ fig.update_layout(
454
+ title='Energy Distribution',
455
+ xaxis_title='Energy (J)',
456
+ yaxis_title='Probability Density'
457
+ )
458
+
459
+ return fig
460
+
461
+ def create_vector_field():
462
+ """Create a vector field visualization"""
463
+ fig = go.Figure()
464
+
465
+ # Generate vector field data
466
+ x = np.linspace(-5, 5, 20)
467
+ y = np.linspace(-5, 5, 20)
468
+ X, Y = np.meshgrid(x, y)
469
+
470
+ U = -Y # x-component of vector field
471
+ V = X # y-component of vector field
472
+
473
+ fig.add_trace(go.Cone(
474
+ x=X.flatten(),
475
+ y=Y.flatten(),
476
+ u=U.flatten(),
477
+ v=V.flatten(),
478
+ name='Vector Field'
479
+ ))
480
+
481
+ fig.update_layout(
482
+ title='Vector Field Visualization',
483
+ scene=dict(
484
+ xaxis_title='X',
485
+ yaxis_title='Y'
486
+ )
487
+ )
488
+
489
+ return fig
490
+
491
+ def create_3d_motion():
492
+ """Create a 3D motion visualization"""
493
+ fig = go.Figure()
494
+
495
+ # Generate 3D motion data (e.g., spiral motion)
496
+ t = np.linspace(0, 10*np.pi, 1000)
497
+ x = np.cos(t)
498
+ y = np.sin(t)
499
+ z = t/10
500
+
501
+ fig.add_trace(go.Scatter3d(
502
+ x=x, y=y, z=z,
503
+ mode='lines',
504
+ name='3D Motion Path'
505
+ ))
506
+
507
+ fig.update_layout(
508
+ title='3D Motion Visualization',
509
+ scene=dict(
510
+ xaxis_title='X',
511
+ yaxis_title='Y',
512
+ zaxis_title='Z'
513
+ )
514
+ )
515
+
516
+ return fig
517
+
518
+ class DataAnalyzer:
519
+ @staticmethod
520
+ def statistical_analysis(data):
521
+ """Perform statistical analysis on experimental data"""
522
+ stats = {
523
+ 'mean': np.mean(data),
524
+ 'std': np.std(data),
525
+ 'median': np.median(data),
526
+ 'min': np.min(data),
527
+ 'max': np.max(data)
528
+ }
529
+ return stats
530
+
531
+ @staticmethod
532
+ def curve_fit(x, y):
533
+ """Perform curve fitting on experimental data"""
534
+ from scipy.optimize import curve_fit
535
+
536
+ def func(x, a, b, c):
537
+ return a * np.exp(-b * x) + c
538
+
539
+ popt, pcov = curve_fit(func, x, y)
540
+ return popt, pcov
541
+
542
+ @staticmethod
543
+ def error_analysis(data, uncertainties):
544
+ """Perform error propagation analysis"""
545
+ # Add error analysis calculations here
546
+ pass
547
+
548
+ @staticmethod
549
+ def fourier_transform(data):
550
+ """Perform Fourier transform analysis"""
551
+ from scipy.fft import fft, fftfreq
552
+
553
+ n = len(data)
554
+ freq = fftfreq(n)
555
+ freq_spectrum = fft(data)
556
+ return freq, freq_spectrum
557
+
558
+ # Launch the interface
559
+ if __name__ == "__main__":
560
+ interface = create_interface()
561
+ interface.launch(share=True)