mathhook_core/educational/message_registry/
solvers.rs

1//! Solver educational messages for equation systems
2
3use super::core::{MessageCategory, MessageKey, MessageTemplate, MessageType};
4use std::collections::HashMap;
5
6/// Initialize all solver-related messages
7pub fn initialize_solver_messages(registry: &mut HashMap<MessageKey, MessageTemplate>) {
8    initialize_substitution_messages(registry);
9    initialize_elimination_messages(registry);
10    initialize_matrix_method_messages(registry);
11    initialize_solution_interpretation_messages(registry);
12}
13
14/// Initialize substitution method messages
15fn initialize_substitution_messages(registry: &mut HashMap<MessageKey, MessageTemplate>) {
16    registry.insert(
17        MessageKey::new(MessageCategory::SystemEquation, MessageType::SystemSubstitution, 0),
18        MessageTemplate::new(
19            "Substitution Method Introduction",
20            "Solve system using substitution method\nStep 1: Solve one equation for one variable\nStep 2: Substitute into other equation",
21            &[]
22        )
23    );
24
25    registry.insert(
26        MessageKey::new(MessageCategory::SystemEquation, MessageType::SystemSubstitution, 1),
27        MessageTemplate::new(
28            "Substitution Step 1: Isolate Variable",
29            "From equation {equation_number}: {equation}\nSolve for {variable}: {variable} = {expression}",
30            &["equation_number", "equation", "variable", "expression"]
31        )
32    );
33
34    registry.insert(
35        MessageKey::new(MessageCategory::SystemEquation, MessageType::SystemSubstitution, 2),
36        MessageTemplate::new(
37            "Substitution Step 2: Substitute",
38            "Substitute {variable} = {expression} into equation {equation_number}:\n{original_equation} becomes {substituted_equation}",
39            &["variable", "expression", "equation_number", "original_equation", "substituted_equation"]
40        )
41    );
42
43    registry.insert(
44        MessageKey::new(MessageCategory::SystemEquation, MessageType::SystemSubstitution, 3),
45        MessageTemplate::new(
46            "Substitution Step 3: Solve Single Variable",
47            "Now solve for {variable} in the single-variable equation:\n{equation}\nSolution: {variable} = {solution}",
48            &["variable", "equation", "solution"]
49        )
50    );
51
52    registry.insert(
53        MessageKey::new(MessageCategory::SystemEquation, MessageType::SystemSubstitution, 4),
54        MessageTemplate::new(
55            "Substitution Step 4: Back-Substitute",
56            "Substitute {variable} = {value} back into {variable_expr} = {expression}:\n{result_variable} = {result_value}",
57            &["variable", "value", "variable_expr", "expression", "result_variable", "result_value"]
58        )
59    );
60}
61
62/// Initialize elimination method messages
63fn initialize_elimination_messages(registry: &mut HashMap<MessageKey, MessageTemplate>) {
64    registry.insert(
65        MessageKey::new(MessageCategory::SystemEquation, MessageType::SystemElimination, 0),
66        MessageTemplate::new(
67            "Elimination Method Introduction",
68            "Solve system using elimination (addition) method\nAlign equations and add/subtract to eliminate one variable",
69            &[]
70        )
71    );
72
73    registry.insert(
74        MessageKey::new(
75            MessageCategory::SystemEquation,
76            MessageType::SystemElimination,
77            1,
78        ),
79        MessageTemplate::new(
80            "Elimination Step 1: Align Equations",
81            "Write system in standard form:\nEquation 1: {equation1}\nEquation 2: {equation2}",
82            &["equation1", "equation2"],
83        ),
84    );
85
86    registry.insert(
87        MessageKey::new(MessageCategory::SystemEquation, MessageType::SystemElimination, 2),
88        MessageTemplate::new(
89            "Elimination Step 2: Multiply for Elimination",
90            "To eliminate {variable}, multiply:\nEquation 1 by {multiplier1}: {new_equation1}\nEquation 2 by {multiplier2}: {new_equation2}",
91            &["variable", "multiplier1", "new_equation1", "multiplier2", "new_equation2"]
92        )
93    );
94
95    registry.insert(
96        MessageKey::new(MessageCategory::SystemEquation, MessageType::SystemElimination, 3),
97        MessageTemplate::new(
98            "Elimination Step 3: Add/Subtract Equations",
99            "{operation} the equations to eliminate {variable}:\n({equation1}) {operator} ({equation2})\nResult: {resulting_equation}",
100            &["operation", "variable", "equation1", "operator", "equation2", "resulting_equation"]
101        )
102    );
103
104    registry.insert(
105        MessageKey::new(
106            MessageCategory::SystemEquation,
107            MessageType::SystemElimination,
108            4,
109        ),
110        MessageTemplate::new(
111            "Elimination Step 4: Solve for Remaining Variable",
112            "Solve simplified equation for {variable}:\n{equation}\n{variable} = {solution}",
113            &["variable", "equation", "solution"],
114        ),
115    );
116
117    registry.insert(
118        MessageKey::new(MessageCategory::SystemEquation, MessageType::SystemElimination, 5),
119        MessageTemplate::new(
120            "Elimination Step 5: Find Other Variable",
121            "Substitute {variable} = {value} into original equation:\n{equation}\nSolve for {other_variable}: {other_variable} = {other_value}",
122            &["variable", "value", "equation", "other_variable", "other_value"]
123        )
124    );
125}
126
127/// Initialize matrix method messages
128fn initialize_matrix_method_messages(registry: &mut HashMap<MessageKey, MessageTemplate>) {
129    registry.insert(
130        MessageKey::new(MessageCategory::SystemEquation, MessageType::SystemMatrix, 0),
131        MessageTemplate::new(
132            "Matrix Method Introduction",
133            "Solve system using matrix form: Ax = b\nWrite system as augmented matrix and row reduce",
134            &[]
135        )
136    );
137
138    registry.insert(
139        MessageKey::new(MessageCategory::SystemEquation, MessageType::SystemMatrix, 1),
140        MessageTemplate::new(
141            "Matrix Form Setup",
142            "Express system as matrix equation:\nCoefficient matrix A: {coefficient_matrix}\nVariable vector x: {variable_vector}\nConstant vector b: {constant_vector}",
143            &["coefficient_matrix", "variable_vector", "constant_vector"]
144        )
145    );
146
147    registry.insert(
148        MessageKey::new(
149            MessageCategory::SystemEquation,
150            MessageType::SystemMatrix,
151            2,
152        ),
153        MessageTemplate::new(
154            "Augmented Matrix",
155            "Form augmented matrix [A|b]:\n{augmented_matrix}\nApply row operations to reduce",
156            &["augmented_matrix"],
157        ),
158    );
159
160    registry.insert(
161        MessageKey::new(
162            MessageCategory::SystemEquation,
163            MessageType::SystemMatrix,
164            3,
165        ),
166        MessageTemplate::new(
167            "Row Reduction Step",
168            "Row operation: {operation}\nBefore: {matrix_before}\nAfter: {matrix_after}",
169            &["operation", "matrix_before", "matrix_after"],
170        ),
171    );
172
173    registry.insert(
174        MessageKey::new(MessageCategory::SystemEquation, MessageType::SystemMatrix, 4),
175        MessageTemplate::new(
176            "Reduced Row Echelon Form",
177            "Matrix in reduced row echelon form:\n{rref_matrix}\nRead solutions directly from final column",
178            &["rref_matrix"]
179        )
180    );
181}
182
183/// Initialize solution interpretation messages
184fn initialize_solution_interpretation_messages(
185    registry: &mut HashMap<MessageKey, MessageTemplate>,
186) {
187    registry.insert(
188        MessageKey::new(MessageCategory::SystemEquation, MessageType::Result, 0),
189        MessageTemplate::new(
190            "Unique Solution Found",
191            "System has unique solution:\n{solution_display}\nThis is the only point that satisfies all equations",
192            &["solution_display"]
193        )
194    );
195
196    registry.insert(
197        MessageKey::new(MessageCategory::SystemEquation, MessageType::Result, 1),
198        MessageTemplate::new(
199            "No Solution",
200            "System has no solution (inconsistent)\n{contradiction_explanation}\nThe equations represent parallel lines/planes that never intersect",
201            &["contradiction_explanation"]
202        )
203    );
204
205    registry.insert(
206        MessageKey::new(MessageCategory::SystemEquation, MessageType::Result, 2),
207        MessageTemplate::new(
208            "Infinitely Many Solutions",
209            "System has infinitely many solutions (dependent)\nSolution set: {parametric_solution}\nThe equations represent the same line/plane",
210            &["parametric_solution"]
211        )
212    );
213
214    registry.insert(
215        MessageKey::new(MessageCategory::SystemEquation, MessageType::Verification, 0),
216        MessageTemplate::new(
217            "Verify System Solution",
218            "Check solution {solution} in all equations:\nEquation 1: {verification1}\nEquation 2: {verification2}\n{verification_conclusion}",
219            &["solution", "verification1", "verification2", "verification_conclusion"]
220        )
221    );
222
223    registry.insert(
224        MessageKey::new(MessageCategory::SystemEquation, MessageType::Insight, 0),
225        MessageTemplate::new(
226            "System Solving Strategy",
227            "Choosing solution method:\nSubstitution: Best when one variable is already isolated\nElimination: Best when coefficients line up nicely\nMatrix: Best for large systems (3+ equations)",
228            &[]
229        )
230    );
231
232    registry.insert(
233        MessageKey::new(MessageCategory::SystemEquation, MessageType::Insight, 1),
234        MessageTemplate::new(
235            "Geometric Interpretation",
236            "Geometric meaning for {dimension}D system:\n{geometric_description}\nSolution represents intersection point(s)",
237            &["dimension", "geometric_description"]
238        )
239    );
240}