Kamocodes commited on
Commit
6fc87f8
·
verified ·
1 Parent(s): 78d8ab3

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +219 -0
app.py ADDED
@@ -0,0 +1,219 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import json
3
+ import random
4
+ import math
5
+
6
+ # Define a list of topics with specific formulas and question templates
7
+ TOPICS = {
8
+ "Average Value": {
9
+ "formula": "f_avg = (1/(b-a)) * ∫[a,b] f(x) dx",
10
+ "functions": {
11
+ "easy": [
12
+ {"func": "x^2", "domain": [0, 2], "solution": "4/3"},
13
+ {"func": "sin(x)", "domain": [0, "π"], "solution": "2/π"},
14
+ {"func": "e^x", "domain": [0, 1], "solution": "(e-1)"},
15
+ {"func": "x", "domain": [1, 4], "solution": "5/2"},
16
+ {"func": "x^3", "domain": [0, 1], "solution": "1/4"}
17
+ ],
18
+ "hard": [
19
+ {"func": "x*sin(x)", "domain": [0, "π"], "solution": "π/2"},
20
+ {"func": "ln(x)", "domain": [1, "e"], "solution": "1-1/e"},
21
+ {"func": "x^2*e^x", "domain": [0, 1], "solution": "2e-2"},
22
+ {"func": "1/(1+x^2)", "domain": [0, 1], "solution": "π/4"},
23
+ {"func": "sqrt(x)", "domain": [0, 4], "solution": "4/3"}
24
+ ]
25
+ }
26
+ },
27
+ "Arc Length": {
28
+ "formula": "L = ∫[a,b] sqrt(1 + (f'(x))^2) dx",
29
+ "functions": {
30
+ "easy": [
31
+ {"func": "x^2", "domain": [0, 1], "solution": "approx. 1.4789"},
32
+ {"func": "x^(3/2)", "domain": [0, 1], "solution": "approx. 1.1919"},
33
+ {"func": "2x+1", "domain": [0, 2], "solution": "sqrt(5)*2"},
34
+ {"func": "x^3", "domain": [0, 1], "solution": "approx. 1.0801"},
35
+ {"func": "sin(x)", "domain": [0, "π/2"], "solution": "approx. 1.9118"}
36
+ ],
37
+ "hard": [
38
+ {"func": "ln(x)", "domain": [1, 3], "solution": "approx. 2.3861"},
39
+ {"func": "e^x", "domain": [0, 1], "solution": "approx. 1.1752"},
40
+ {"func": "cosh(x)", "domain": [0, 1], "solution": "sinh(1)"},
41
+ {"func": "x^2 - ln(x)", "domain": [1, 2], "solution": "approx. 3.1623"},
42
+ {"func": "parametric: x=cos(t), y=sin(t) for t∈[0,π]", "domain": [0, "π"], "solution": "π"}
43
+ ]
44
+ }
45
+ },
46
+ "Surface Area": {
47
+ "formula": "S = 2π * ∫[a,b] f(x) * sqrt(1 + (f'(x))^2) dx",
48
+ "functions": {
49
+ "easy": [
50
+ {"func": "x", "domain": [0, 3], "solution": "2π*4.5"},
51
+ {"func": "x^2", "domain": [0, 1], "solution": "approx. 2π*0.7169"},
52
+ {"func": "sqrt(x)", "domain": [0, 4], "solution": "approx. 2π*4.5177"},
53
+ {"func": "1", "domain": [0, 2], "solution": "2π*2"},
54
+ {"func": "x/2", "domain": [0, 4], "solution": "2π*4.1231"}
55
+ ],
56
+ "hard": [
57
+ {"func": "x^3", "domain": [0, 1], "solution": "approx. 2π*0.6004"},
58
+ {"func": "e^x", "domain": [0, 1], "solution": "approx. 2π*1.1793"},
59
+ {"func": "sin(x)", "domain": [0, "π/2"], "solution": "approx. 2π*0.6366"},
60
+ {"func": "1/x", "domain": [1, 2], "solution": "approx. 2π*1.1478"},
61
+ {"func": "ln(x)", "domain": [1, 2], "solution": "approx. 2π*0.5593"}
62
+ ]
63
+ }
64
+ },
65
+ "Differential Equations": {
66
+ "formula": "Various types",
67
+ "functions": {
68
+ "easy": [
69
+ {"func": "dy/dx = 2x", "domain": ["y(0)=1"], "solution": "y = x^2 + 1"},
70
+ {"func": "dy/dx = y", "domain": ["y(0)=1"], "solution": "y = e^x"},
71
+ {"func": "dy/dx = 3x^2", "domain": ["y(0)=2"], "solution": "y = x^3 + 2"},
72
+ {"func": "dy/dx = -y", "domain": ["y(0)=4"], "solution": "y = 4e^(-x)"},
73
+ {"func": "dy/dx = x+1", "domain": ["y(0)=-2"], "solution": "y = x^2/2 + x - 2"}
74
+ ],
75
+ "hard": [
76
+ {"func": "y'' + 4y = 0", "domain": ["y(0)=1, y'(0)=0"], "solution": "y = cos(2x)"},
77
+ {"func": "y'' - y = x", "domain": ["y(0)=0, y'(0)=1"], "solution": "y = e^x/2 - e^(-x)/2 - x"},
78
+ {"func": "y' + y = e^x", "domain": ["y(0)=0"], "solution": "y = xe^x"},
79
+ {"func": "y'' + 2y' + y = 0", "domain": ["y(0)=1, y'(0)=-1"], "solution": "y = (1-x)e^(-x)"},
80
+ {"func": "y'' - 2y' + y = x^2", "domain": ["y(0)=1, y'(0)=1"], "solution": "y = (x^2)/2 + 2x + 1"}
81
+ ]
82
+ }
83
+ },
84
+ "Area and Volume": {
85
+ "formula": "A = ∫[a,b] f(x) dx, V = π * ∫[a,b] [f(x)]^2 dx",
86
+ "functions": {
87
+ "easy": [
88
+ {"func": "f(x) = x^2, find area under the curve", "domain": [0, 3], "solution": "9"},
89
+ {"func": "f(x) = sin(x), find area under the curve", "domain": [0, "π"], "solution": "2"},
90
+ {"func": "f(x) = 4-x^2, find area under the curve", "domain": [-2, 2], "solution": "16/3"},
91
+ {"func": "f(x) = sqrt(x), find volume of revolution around x-axis", "domain": [0, 4], "solution": "16π/3"},
92
+ {"func": "f(x) = x, find volume of revolution around x-axis", "domain": [0, 2], "solution": "8π/3"}
93
+ ],
94
+ "hard": [
95
+ {"func": "Area between f(x) = x^2 and g(x) = x^3", "domain": [0, 1], "solution": "1/12"},
96
+ {"func": "Volume of solid bounded by z = 4-x^2-y^2 and z = 0", "domain": ["x^2+y^2≤4"], "solution": "8π"},
97
+ {"func": "Volume of solid formed by rotating region bounded by y = x^2, y = 0, x = 2 around y-axis", "domain": [0, 2], "solution": "8π/5"},
98
+ {"func": "Area between f(x) = sin(x) and g(x) = cos(x)", "domain": [0, "π/4"], "solution": "sqrt(2)-1"},
99
+ {"func": "Volume of solid formed by rotating region bounded by y = e^x, y = 0, x = 0, x = 1 around x-axis", "domain": [0, 1], "solution": "π(e^2-1)/2"}
100
+ ]
101
+ }
102
+ },
103
+ "Parametric Curves and Equations": {
104
+ "formula": "x = x(t), y = y(t), Arc length = ∫[a,b] sqrt((dx/dt)^2 + (dy/dt)^2) dt",
105
+ "functions": {
106
+ "easy": [
107
+ {"func": "x = t, y = t^2, find dy/dx", "domain": ["t"], "solution": "dy/dx = 2t"},
108
+ {"func": "x = cos(t), y = sin(t), find the arc length", "domain": [0, "π/2"], "solution": "π/2"},
109
+ {"func": "x = t^2, y = t^3, find dy/dx", "domain": ["t"], "solution": "dy/dx = 3t/2"},
110
+ {"func": "x = 2t, y = t^2, find the area under the curve", "domain": [0, 2], "solution": "4/3"},
111
+ {"func": "x = t, y = sin(t), find dy/dx", "domain": ["t"], "solution": "dy/dx = cos(t)"}
112
+ ],
113
+ "hard": [
114
+ {"func": "x = e^t*cos(t), y = e^t*sin(t), find dy/dx", "domain": ["t"], "solution": "dy/dx = tan(t) + 1"},
115
+ {"func": "x = t-sin(t), y = 1-cos(t), find the arc length", "domain": [0, "2π"], "solution": "8"},
116
+ {"func": "x = ln(sec(t)), y = tan(t), find dy/dx", "domain": ["t"], "solution": "dy/dx = sec^2(t)"},
117
+ {"func": "x = cos^3(t), y = sin^3(t), find the area enclosed", "domain": [0, "2π"], "solution": "3π/8"},
118
+ {"func": "x = cos(t)+t*sin(t), y = sin(t)-t*cos(t), find the arc length", "domain": [0, "2π"], "solution": "2π*sqrt(1+4π^2)"}
119
+ ]
120
+ }
121
+ }
122
+ }
123
+
124
+ # Function to generate a single question
125
+ def generate_question(topic_name, difficulty):
126
+ topic_data = TOPICS[topic_name]
127
+ formula = topic_data["formula"]
128
+
129
+ # Select a random function from the available ones for this topic and difficulty
130
+ function_data = random.choice(topic_data["functions"][difficulty])
131
+ func = function_data["func"]
132
+ domain = function_data["domain"]
133
+ solution = function_data["solution"]
134
+
135
+ # Format domain for display
136
+ if isinstance(domain, list) and len(domain) == 2:
137
+ domain_str = f"[{domain[0]}, {domain[1]}]"
138
+ else:
139
+ domain_str = str(domain)
140
+
141
+ # Create question and solution based on difficulty
142
+ if difficulty == "easy":
143
+ question = f"Find the {topic_name.lower()} of {func} over the domain {domain_str}."
144
+ solution_text = f"Step 1: Apply the formula for {topic_name.lower()}: {formula}\n\n"
145
+ solution_text += f"Step 2: Substitute f(x) = {func} and evaluate over {domain_str}\n\n"
146
+ solution_text += f"Step 3: Solve the resulting integral or calculation\n\n"
147
+ solution_text += f"Final Answer: {solution}"
148
+ else:
149
+ question = f"Compute the {topic_name.lower()} for {func} over {domain_str}."
150
+ solution_text = f"Step 1: Apply the formula for {topic_name.lower()}: {formula}\n\n"
151
+ solution_text += f"Step 2: For {func}, substitute into the formula and evaluate over {domain_str}\n\n"
152
+ solution_text += f"Step 3: This requires advanced integration techniques or careful analysis\n\n"
153
+ solution_text += f"Step 4: After simplification and evaluation of the integral\n\n"
154
+ solution_text += f"Final Answer: {solution}"
155
+
156
+ return question, solution_text
157
+
158
+ # Function to generate multiple questions
159
+ def generate_multiple_questions(topic_name, difficulty, count):
160
+ questions = []
161
+ solutions = []
162
+
163
+ for _ in range(count):
164
+ question, solution = generate_question(topic_name, difficulty)
165
+ questions.append(question)
166
+ solutions.append(solution)
167
+
168
+ combined_questions = "\n\n".join([f"{i+1}. {q}" for i, q in enumerate(questions)])
169
+ combined_solutions = "\n\n" + "-"*50 + "\n\n".join([f"Solution {i+1}:\n{s}" for i, s in enumerate(solutions)])
170
+
171
+ return combined_questions, combined_solutions
172
+
173
+ # Gradio app function
174
+ def generate_calculus_questions(topic, difficulty, count):
175
+ count = int(count) # Convert to int in case it's a string
176
+ questions, solutions = generate_multiple_questions(topic, difficulty, count)
177
+ return questions, solutions
178
+
179
+ # Create the Gradio interface
180
+ with gr.Blocks(title="Calculus Question Generator") as demo:
181
+ gr.Markdown("# Calculus Question Generator")
182
+ gr.Markdown("Select a topic, difficulty level, and the number of questions to generate.")
183
+
184
+ with gr.Row():
185
+ with gr.Column():
186
+ topic = gr.Dropdown(
187
+ choices=list(TOPICS.keys()),
188
+ label="Calculus Topic",
189
+ value="Average Value"
190
+ )
191
+ difficulty = gr.Radio(
192
+ choices=["easy", "hard"],
193
+ label="Difficulty Level",
194
+ value="easy"
195
+ )
196
+ count = gr.Slider(
197
+ minimum=1,
198
+ maximum=10,
199
+ value=3,
200
+ step=1,
201
+ label="Number of Questions"
202
+ )
203
+ generate_button = gr.Button("Generate Questions")
204
+
205
+ with gr.Column():
206
+ questions_output = gr.Textbox(label="Generated Questions", lines=10)
207
+ solutions_output = gr.Textbox(label="Solutions", lines=15)
208
+
209
+ generate_button.click(
210
+ generate_calculus_questions,
211
+ inputs=[topic, difficulty, count],
212
+ outputs=[questions_output, solutions_output]
213
+ )
214
+
215
+ gr.Markdown("### Created by KamogeloMosiai")
216
+
217
+ # Launch the app
218
+ if __name__ == "__main__":
219
+ demo.launch()