Skip to content

Commit

Permalink
Add square momentum generator
Browse files Browse the repository at this point in the history
  • Loading branch information
knokko committed Sep 4, 2024
1 parent dfb7cb3 commit 19604fb
Show file tree
Hide file tree
Showing 17 changed files with 193 additions and 2 deletions.
7 changes: 7 additions & 0 deletions example-configs/balls2d.gddl
Original file line number Diff line number Diff line change
Expand Up @@ -50,10 +50,17 @@
momenta = [{
className = "Momentum",
floatType = "Double",
square = "SquareMomentum",
mass = "Mass",
speed = "Speed",
createNumberExtensions = true
}],
squareMomenta = [{
className = "SquareMomentum",
floatType = "Double",
momentum = "Momentum",
createNumberExtensions = true
}],
volumes = [{
className = "Volume",
floatType = "Double",
Expand Down
6 changes: 6 additions & 0 deletions example-configs/int16/float-connections.json
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,12 @@
"speed": "Speed",
"createNumberExtensions": true
}],
"squareMomenta": [{
"className": "SquareMomentum",
"floatType": "Float",
"momentum": "Momentum",
"createNumberExtensions": false
}],
"densities": [{
"className": "Density",
"floatType": "%FLOAT_TYPE%",
Expand Down
6 changes: 6 additions & 0 deletions example-configs/int32/float-connections.json
Original file line number Diff line number Diff line change
Expand Up @@ -62,10 +62,16 @@
"momenta": [{
"className": "Momentum",
"floatType": "%FLOAT_TYPE%",
"square": "SquareMomentum",
"mass": "Mass",
"speed": "Speed",
"createNumberExtensions": false
}],
"squareMomenta": [{
"className": "SquareMomentum",
"floatType": "Double",
"createNumberExtensions": true
}],
"densities": [{
"className": "Density",
"floatType": "%FLOAT_TYPE%",
Expand Down
7 changes: 7 additions & 0 deletions example-configs/int64/float-connections.json
Original file line number Diff line number Diff line change
Expand Up @@ -65,10 +65,17 @@
"momenta": [{
"className": "Momentum",
"floatType": "%FLOAT_TYPE%",
"square": "SquareMomentum",
"speed": "Speed",
"mass": "Mass",
"createNumberExtensions": true
}],
"squareMomenta": [{
"className": "SquareMomentum",
"floatType": "Double",
"momentum": "Momentum",
"createNumberExtensions": true
}],
"densities": [{
"className": "Density",
"floatType": "%FLOAT_TYPE%",
Expand Down
7 changes: 7 additions & 0 deletions example-configs/int8/float-connections.json
Original file line number Diff line number Diff line change
Expand Up @@ -65,10 +65,17 @@
"momenta": [{
"className": "Momentum",
"floatType": "%FLOAT_TYPE%",
"square": "SquareMomentum",
"mass": "Mass",
"speed": "Speed",
"createNumberExtensions": false
}],
"squareMomenta": [{
"className": "SquareMomentum",
"floatType": "%FLOAT_TYPE%",
"momentum": "Momentum",
"createNumberExtensions": true
}],
"densities": [{
"className": "Density",
"floatType": "%FLOAT_TYPE%",
Expand Down
7 changes: 7 additions & 0 deletions example-configs/uint16/float-connections.json
Original file line number Diff line number Diff line change
Expand Up @@ -62,9 +62,16 @@
"momenta": [{
"className": "Momentum",
"floatType": "Float",
"square": "SquareMomentum",
"speed": "Speed",
"createNumberExtensions": false
}],
"squareMomenta": [{
"className": "SquareMomentum",
"floatType": "%FLOAT_TYPE%",
"momentum": "Momentum",
"createNumberExtensions": true
}],
"densities": [{
"className": "Density",
"floatType": "%FLOAT_TYPE%",
Expand Down
7 changes: 7 additions & 0 deletions example-configs/uint64/float-connections.json
Original file line number Diff line number Diff line change
Expand Up @@ -65,10 +65,17 @@
"momenta": [{
"className": "Momentum",
"floatType": "%FLOAT_TYPE%",
"square": "SquareMomentum",
"speed": "Speed",
"mass": "Mass",
"createNumberExtensions": true
}],
"squareMomenta": [{
"className": "SquareMomentum",
"floatType": "%FLOAT_TYPE%",
"momentum": "Momentum",
"createNumberExtensions": true
}],
"densities": [{
"className": "Density",
"floatType": "Float",
Expand Down
7 changes: 7 additions & 0 deletions example-configs/uint8/float-connections.json
Original file line number Diff line number Diff line change
Expand Up @@ -64,10 +64,17 @@
"momenta": [{
"className": "Momentum",
"floatType": "%FLOAT_TYPE%",
"square": "SquareMomentum",
"speed": "Speed",
"mass": "Mass",
"createNumberExtensions": false
}],
"squareMomenta": [{
"className": "SquareMomentum",
"floatType": "Float",
"momentum": "Momentum",
"createNumberExtensions": false
}],
"densities": [{
"className": "Density",
"floatType": "%FLOAT_TYPE%",
Expand Down
6 changes: 5 additions & 1 deletion src/main/kotlin/fixie/generator/module/FixieModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import fixie.generator.density.DensityClass
import fixie.generator.displacement.DisplacementClass
import fixie.generator.mass.MassClass
import fixie.generator.momentum.MomentumClass
import fixie.generator.momentum.SquareMomentumClass
import fixie.generator.number.NumberClass
import fixie.generator.parser.InvalidConfigException
import fixie.generator.quantity.QuantityClass
Expand All @@ -24,6 +25,7 @@ class FixieModule(
val volumes: List<VolumeClass> = emptyList(),
val masses: List<MassClass> = emptyList(),
val momenta: List<MomentumClass> = emptyList(),
val squareMomenta: List<SquareMomentumClass> = emptyList(),
val displacements: List<DisplacementClass> = emptyList(),
val speed: List<SpeedClass> = emptyList(),
val spins: List<SpinClass> = emptyList(),
Expand Down Expand Up @@ -71,6 +73,8 @@ class FixieModule(
throw IllegalArgumentException("Packages should be separated by dots instead of slashes")
}

resolve(squareMomenta, momenta, { it.momentumClassName }) { square, momentum -> square.momentum = momentum }
resolve(momenta, squareMomenta, { it.squareClassName }) { momentum, square -> momentum.square = square }
resolve(momenta, masses, { it.massClassName }) { momentum, mass -> momentum.mass = mass }
resolve(momenta, speed, { it.speedClassName }) { momentum, speed -> momentum.speed = speed }
resolve(densities, masses, { it.massClassName }) { density, mass -> density.mass = mass }
Expand Down Expand Up @@ -109,7 +113,7 @@ class FixieModule(
val allClassNames = numbers.map { it.className } +
displacements.map { it.className } + areas.map { it.className } + volumes.map { it.className } +
speed.map { it.className } + accelerations.map { it.className } + masses.map { it.className } +
momenta.map { it.className } +
momenta.map { it.className } + squareMomenta.map { it.className } +
angles.map { it.className } + spins.map { it.className } + densities.map { it.className }

for (className in allClassNames) {
Expand Down
3 changes: 3 additions & 0 deletions src/main/kotlin/fixie/generator/module/ModuleGenerator.kt
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ import fixie.generator.mass.MassTestsGenerator
import fixie.generator.mass.MassUnit
import fixie.generator.momentum.MomentumClassGenerator
import fixie.generator.momentum.MomentumTestsGenerator
import fixie.generator.momentum.SquareMomentumClassGenerator
import fixie.generator.momentum.SquareMomentumTestsGenerator
import fixie.generator.number.NumberClassGenerator
import fixie.generator.number.NumberTestsGenerator
import fixie.generator.quantity.QuantityClass
Expand Down Expand Up @@ -108,6 +110,7 @@ fun generateModule(module: FixieModule, directory: File, clearExistingFiles: Boo
generateQuantityFiles(module.spins, ::SpinClassGenerator, ::SpinTestsGenerator)
generateQuantityFiles(module.densities, ::DensityClassGenerator, ::DensityTestsGenerator)
generateQuantityFiles(module.momenta, ::MomentumClassGenerator, ::MomentumTestsGenerator)
generateQuantityFiles(module.squareMomenta, ::SquareMomentumClassGenerator, ::SquareMomentumTestsGenerator)

generateMathFile(
module.numbers,
Expand Down
2 changes: 2 additions & 0 deletions src/main/kotlin/fixie/generator/momentum/MomentumClass.kt
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,13 @@ import fixie.generator.speed.SpeedClass
class MomentumClass(
className: String,
floatType: FloatType,
val squareClassName: String?,
val speedClassName: String?,
val massClassName: String?,
createNumberExtensions: Boolean
) : FloatQuantityClass(className, floatType, createNumberExtensions) {

var square: SquareMomentumClass? = null
var speed: SpeedClass? = null
var mass: MassClass? = null

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,12 @@ class MomentumClassGenerator(
writer.println("\toperator fun div(right: ${quantity.massClassName}) = " +
"${quantity.speedClassName}.METERS_PER_SECOND * (toDouble() / right.toDouble(MassUnit.KILOGRAM))")
}

if (quantity.square != null) {
writer.println()
writer.println("\toperator fun times(right: ${quantity.className}) = " +
"${quantity.squareClassName}.SQUARE_NEWTON_SECOND * toDouble() * right.toDouble()")
}
}

override fun generateCompanionContent() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,5 +29,10 @@ class MomentumTestsGenerator(
writer.println("\t\tassertEquals(1.5, (0.75 * ${quantity.className}.NEWTON_SECOND / (0.5 * " +
"${quantity.speedClassName}.METERS_PER_SECOND)).toDouble(MassUnit.KILOGRAM), $margin)")
}

if (quantity.square != null) {
writer.println("\t\tassertEquals(2.4, ((${quantity.className}.NEWTON_SECOND * 1.2) * " +
"(${quantity.className}.NEWTON_SECOND * 2)).toDouble(), 0.001)")
}
}
}
19 changes: 19 additions & 0 deletions src/main/kotlin/fixie/generator/momentum/SquareMomentumClass.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package fixie.generator.momentum

import fixie.generator.number.FloatType
import fixie.generator.quantity.FloatQuantityClass
import fixie.generator.quantity.QuantityUnit

class SquareMomentumClass(
className: String,
floatType: FloatType,
val momentumClassName: String?,
createNumberExtensions: Boolean
) : FloatQuantityClass(className, floatType, createNumberExtensions) {

var momentum: MomentumClass? = null

override fun getSupportedUnits() = listOf(QuantityUnit(
"SQUARE_NEWTON_SECOND", "", "(Ns)^2", "squareNs", 0.0001, 1e6, 1.0
))
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package fixie.generator.momentum

import fixie.generator.quantity.FloatQuantityClassGenerator
import java.io.PrintWriter

class SquareMomentumClassGenerator(
writer: PrintWriter,
quantity: SquareMomentumClass,
packageName: String
) : FloatQuantityClassGenerator<SquareMomentumClass>(writer, quantity, packageName) {

override fun getImports() =
super.getImports() + if (quantity.momentum != null) arrayOf("kotlin.math.sqrt") else emptyArray()

override fun generateToDoubleComment() {
writer.println("\t/** Gets the square momentum value, in (Ns)^2 */")
}

override fun generateNumberUnitExtensionFunctions(typeName: String) {
// TODO Why is this not done automatically?
writer.println()
writer.println("val $typeName.squareNs")
writer.println("\tget() = ${quantity.className}.SQUARE_NEWTON_SECOND * this")
}

override fun generateToString() {
writer.println()
writer.println("\toverride fun toString() = String.format(\"%.2f%s\", value, \"(Ns)^2\")")
}

override fun generateCompanionContent() {
// TODO Maybe do this automatically
val suffix = if (quantity.floatType.numBytes == 4) "f" else ".0"
writer.println("\t\tval SQUARE_NEWTON_SECOND = ${quantity.className}(1$suffix)")
}

override fun generateArithmetic() {
super.generateArithmetic()

if (quantity.momentum != null) {
writer.println()
writer.println("\toperator fun div(right: ${quantity.momentumClassName}) = " +
"${quantity.momentumClassName}.NEWTON_SECOND * toDouble() / right.toDouble()")
}
}

override fun generateMathFunctions() {
super.generateMathFunctions()

if (quantity.momentum != null) {
writer.println()
writer.println("fun sqrt(x: ${quantity.className}) = ${quantity.momentumClassName}.NEWTON_SECOND * sqrt(x.value)")
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package fixie.generator.momentum

import fixie.generator.quantity.FloatQuantityTestsGenerator
import java.io.PrintWriter

class SquareMomentumTestsGenerator(
writer: PrintWriter,
quantity: SquareMomentumClass,
packageName: String
) : FloatQuantityTestsGenerator<SquareMomentumClass>(writer, quantity, packageName) {

override fun generateToStringBody() {
writer.println("\t\tassertEquals(\"2.34(Ns)^2\", (${quantity.className}.SQUARE_NEWTON_SECOND * 2.34).toString())")
}

override fun generateArithmeticBody() {
super.generateArithmeticBody()

if (quantity.momentum != null) {
writer.println("\t\tassertEquals(2.5, ((10 * ${quantity.className}.SQUARE_NEWTON_SECOND) / " +
"(4 * ${quantity.momentumClassName}.NEWTON_SECOND)).toDouble(), 0.001)")
}
}

override fun generateMathFunctionsBody() {
super.generateMathFunctionsBody()

if (quantity.momentum != null) {
writer.println("\t\tassertEquals(3.0, sqrt(9 * ${quantity.className}.SQUARE_NEWTON_SECOND).toDouble(), 0.001)")
}
}
}
13 changes: 12 additions & 1 deletion src/main/kotlin/fixie/generator/parser/ModuleParser.kt
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import fixie.generator.mass.MassClass
import fixie.generator.mass.MassUnit
import fixie.generator.module.FixieModule
import fixie.generator.momentum.MomentumClass
import fixie.generator.momentum.SquareMomentumClass
import fixie.generator.number.FloatType
import fixie.generator.number.IntType
import fixie.generator.number.NumberClass
Expand Down Expand Up @@ -306,11 +307,19 @@ private class ModuleParser(
private fun loadMomentum(properties: GddlMap, path: String) = MomentumClass(
className = requiredString(properties, "className", path),
floatType = requiredFloatType(properties, "floatType", path),
squareClassName = optionalString(properties, "square", path),
speedClassName = optionalString(properties, "speed", path),
massClassName = optionalString(properties, "mass", path),
createNumberExtensions = requiredBoolean(properties, "createNumberExtensions", path)
)

private fun loadSquareMomentum(properties: GddlMap, path: String) = SquareMomentumClass(
className = requiredString(properties, "className", path),
floatType = requiredFloatType(properties, "floatType", path),
momentumClassName = optionalString(properties, "momentum", path),
createNumberExtensions = requiredBoolean(properties, "createNumberExtensions", path)
)

private fun loadVariation(properties: GddlMap, path: String): Variation {
val rawMap = mutableMapOf<String, List<String>>()
for ((key, value) in properties.entries) {
Expand Down Expand Up @@ -352,6 +361,7 @@ private class ModuleParser(
val densities = mapList(root, "densities", "(root)", ::loadDensity)
val masses = mapList(root, "masses", "(root)", ::loadMass)
val momenta = mapList(root, "momenta", "(root)", ::loadMomentum)
val squareMomenta = mapList(root, "squareMomenta", "(root)", ::loadSquareMomentum)

return listOf(
FixieModule(
Expand All @@ -367,7 +377,8 @@ private class ModuleParser(
spins = spins,
densities = densities,
masses = masses,
momenta = momenta
momenta = momenta,
squareMomenta = squareMomenta
)
)
}
Expand Down

0 comments on commit 19604fb

Please sign in to comment.