feat: add tags support to formulas
This commit is contained in:
parent
d396d71afc
commit
1a7fd0c884
3 changed files with 22 additions and 8 deletions
|
|
@ -22,6 +22,11 @@ class Multimap<K, V> extends DelegatingMap<K, List<V>> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class FormulaCorpus{
|
||||||
|
final Multimap<String, Formula> _tags = Multimap.create();
|
||||||
|
final Map<String, Formula> _allFormulas = {};
|
||||||
|
}
|
||||||
|
|
||||||
class UnitCorpus {
|
class UnitCorpus {
|
||||||
final Multimap<String, String> _baseToUnits = Multimap.create();
|
final Multimap<String, String> _baseToUnits = Multimap.create();
|
||||||
final Map<String, UnitSpec> _allUnits = {};
|
final Map<String, UnitSpec> _allUnits = {};
|
||||||
|
|
|
||||||
|
|
@ -127,6 +127,7 @@ class Formula {
|
||||||
final List<VariableSpec> input;
|
final List<VariableSpec> input;
|
||||||
final VariableSpec output;
|
final VariableSpec output;
|
||||||
final String d4rtCode;
|
final String d4rtCode;
|
||||||
|
final List<String> tags;
|
||||||
|
|
||||||
Formula({
|
Formula({
|
||||||
required this.name,
|
required this.name,
|
||||||
|
|
@ -134,6 +135,7 @@ class Formula {
|
||||||
required this.input,
|
required this.input,
|
||||||
required this.output,
|
required this.output,
|
||||||
required this.d4rtCode,
|
required this.d4rtCode,
|
||||||
|
this.tags = const [],
|
||||||
}) {
|
}) {
|
||||||
validate();
|
validate();
|
||||||
}
|
}
|
||||||
|
|
@ -146,7 +148,7 @@ class Formula {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() =>
|
String toString() =>
|
||||||
'Formula(name: $name, description: $description, input: $input, output: $output, d4rtCode: $d4rtCode)';
|
'Formula(name: $name, description: $description, input: $input, output: $output, d4rtCode: $d4rtCode, tags: $tags)';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool operator ==(Object other) =>
|
bool operator ==(Object other) =>
|
||||||
|
|
@ -157,11 +159,12 @@ class Formula {
|
||||||
description == other.description &&
|
description == other.description &&
|
||||||
output == other.output &&
|
output == other.output &&
|
||||||
ListEquality().equals(input, other.input) &&
|
ListEquality().equals(input, other.input) &&
|
||||||
d4rtCode == other.d4rtCode;
|
d4rtCode == other.d4rtCode &&
|
||||||
|
ListEquality().equals(tags, other.tags);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
int get hashCode =>
|
int get hashCode =>
|
||||||
Object.hash(name, description, ListEquality().hash(input), output, d4rtCode);
|
Object.hash(name, description, ListEquality().hash(input), output, d4rtCode, ListEquality().hash(tags));
|
||||||
|
|
||||||
List<String> inputVarNames() =>
|
List<String> inputVarNames() =>
|
||||||
input.map((v) => v.name).toList(growable: false);
|
input.map((v) => v.name).toList(growable: false);
|
||||||
|
|
@ -199,6 +202,7 @@ class Formula {
|
||||||
|
|
||||||
String name = SetUtils.stringValue(theSet, "name");
|
String name = SetUtils.stringValue(theSet, "name");
|
||||||
String? description = theSet ["description"] as String?;
|
String? description = theSet ["description"] as String?;
|
||||||
|
List<String> tags = (theSet["tags"] as List<Object?>? ?? []).map((t) => t.toString()).toList();
|
||||||
final List<Object?> inputSet = SetUtils.listValue(theSet, "input");
|
final List<Object?> inputSet = SetUtils.listValue(theSet, "input");
|
||||||
List<VariableSpec> input = inputSet
|
List<VariableSpec> input = inputSet
|
||||||
.map((v) => parseVar(v as Map))
|
.map((v) => parseVar(v as Map))
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,8 @@ Where:
|
||||||
{name: "g", unit: "m/s²"} // Gravitational acceleration
|
{name: "g", unit: "m/s²"} // Gravitational acceleration
|
||||||
],
|
],
|
||||||
output: {name: "h", unit: "m"}, // Height in meters
|
output: {name: "h", unit: "m"}, // Height in meters
|
||||||
d4rtCode: "h = 0.5 * g * pow(t, 2)"
|
d4rtCode: "h = 0.5 * g * pow(t, 2)",
|
||||||
|
tags: ["physics", "kinematics"]
|
||||||
},
|
},
|
||||||
|
|
||||||
// Newton's Law of Universal Gravitation
|
// Newton's Law of Universal Gravitation
|
||||||
|
|
@ -40,7 +41,8 @@ Where:
|
||||||
{name: "r", unit: "m"} // Distance between masses
|
{name: "r", unit: "m"} // Distance between masses
|
||||||
],
|
],
|
||||||
output: {name: "F", unit: "N"}, // Force in newtons
|
output: {name: "F", unit: "N"}, // Force in newtons
|
||||||
d4rtCode: "F = (6.67430e-11 * m1 * m2) / pow(r, 2)"
|
d4rtCode: "F = (6.67430e-11 * m1 * m2) / pow(r, 2)",
|
||||||
|
tags: ["physics", "astronomy", "gravity"]
|
||||||
},
|
},
|
||||||
|
|
||||||
// Kinetic Energy
|
// Kinetic Energy
|
||||||
|
|
@ -61,7 +63,8 @@ Where:
|
||||||
{name: "v", unit: "m/s"} // Velocity
|
{name: "v", unit: "m/s"} // Velocity
|
||||||
],
|
],
|
||||||
output: {name: "KE", unit: "J"}, // Energy in joules
|
output: {name: "KE", unit: "J"}, // Energy in joules
|
||||||
d4rtCode: "KE = 0.5 * m * pow(v, 2)"
|
d4rtCode: "KE = 0.5 * m * pow(v, 2)",
|
||||||
|
tags: ["physics", "energy", "mechanics"]
|
||||||
},
|
},
|
||||||
|
|
||||||
// Projectile Motion Range
|
// Projectile Motion Range
|
||||||
|
|
@ -79,7 +82,8 @@ Where:
|
||||||
{name: "θ", unit: "deg"} // Launch angle
|
{name: "θ", unit: "deg"} // Launch angle
|
||||||
],
|
],
|
||||||
output: {name: "R", unit: "m"}, // Horizontal distance
|
output: {name: "R", unit: "m"}, // Horizontal distance
|
||||||
d4rtCode: "R = (pow(v, 2) * sin(2 * radians(θ))) / 9.80665"
|
d4rtCode: "R = (pow(v, 2) * sin(2 * radians(θ))) / 9.80665",
|
||||||
|
tags: ["physics", "kinematics", "projectile"]
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|
@ -99,6 +103,7 @@ Where:
|
||||||
{name: "a", unit: "m/s²"} // Acceleration
|
{name: "a", unit: "m/s²"} // Acceleration
|
||||||
],
|
],
|
||||||
output: {name: "F", unit: "N"}, // Force in newtons
|
output: {name: "F", unit: "N"}, // Force in newtons
|
||||||
d4rtCode: "F = m * a"
|
d4rtCode: "F = m * a",
|
||||||
|
tags: ["physics", "mechanics", "newton"]
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue