Skip to content

Commit

Permalink
refactor: remove new term properties
Browse files Browse the repository at this point in the history
  • Loading branch information
lbressler13 committed Jan 24, 2024
1 parent e2f2522 commit 67def3d
Show file tree
Hide file tree
Showing 7 changed files with 60 additions and 127 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import xyz.lbres.exactnumbers.utils.deprecatedV1
import xyz.lbres.exactnumbers.utils.irrationalsPackage
import xyz.lbres.kotlinutils.collection.ext.toConstMultiSet
import xyz.lbres.kotlinutils.general.simpleIf
import xyz.lbres.kotlinutils.iterable.ext.countElement
import java.math.BigDecimal
import kotlin.math.abs

Expand All @@ -25,10 +26,6 @@ import kotlin.math.abs
sealed class Term : Number() {
abstract val coefficient: ExactFraction
abstract val factors: List<IrrationalNumber<*>>
abstract val logs: List<Log>
abstract val pis: List<Pi>
abstract val piCount: Int
abstract val squareRoots: List<Sqrt>

abstract operator fun unaryMinus(): Term
abstract operator fun unaryPlus(): Term
Expand Down Expand Up @@ -68,17 +65,24 @@ sealed class Term : Number() {
override fun toFloat(): Float = castToFloat(getValue(), this, "Term")
override fun toDouble(): Double = castToDouble(getValue(), this, "Term")

@Deprecated("Method $deprecatedV1", ReplaceWith("getIrrationalsByType(Log.TYPE)", "$irrationalsPackage.log.Log"), DeprecationLevel.WARNING)
@JvmName("getLogsDeprecated")
fun getLogs(): List<Log> = logs
@Deprecated("Method $deprecatedV1", ReplaceWith("getFactorsByType(Log.TYPE)", "$irrationalsPackage.log.Log"), DeprecationLevel.WARNING)
@Suppress("UNCHECKED_CAST")
fun getLogs(): List<Log> {
return getFactorsByType(Log.TYPE) as List<Log>
}

@Deprecated("Method $deprecatedV1", ReplaceWith("piCount"), DeprecationLevel.WARNING)
@JvmName("getPiCountDeprecated")
fun getPiCount(): Int = piCount
@Deprecated("Method $deprecatedV1", ReplaceWith("getFactorsByType(Pi.TYPE)"), DeprecationLevel.WARNING)
@Suppress("UNCHECKED_CAST")
fun getPiCount(): Int {
val pis = getFactorsByType(Pi.TYPE) as List<Pi>
return pis.countElement(Pi()) * 2 - pis.size // positive - (numbers.size - positive)
}

@Deprecated("Method $deprecatedV1", ReplaceWith("getIrrationalsByType(Sqrt.TYPE)", "$irrationalsPackage.sqrt.Sqrt"), DeprecationLevel.WARNING)
@JvmName("getSquareRootsDeprecated")
fun getSquareRoots(): List<Sqrt> = squareRoots
@Deprecated("Method $deprecatedV1", ReplaceWith("getFactorsByType(Sqrt.TYPE)", "$irrationalsPackage.sqrt.Sqrt"), DeprecationLevel.WARNING)
@Suppress("UNCHECKED_CAST")
fun getSquareRoots(): List<Sqrt> {
return getFactorsByType(Sqrt.TYPE) as List<Sqrt>
}

companion object {
val ZERO = fromValues(ExactFraction.ZERO, emptyList())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,6 @@ package xyz.lbres.exactnumbers.expressions.term
import xyz.lbres.exactnumbers.exactfraction.ExactFraction
import xyz.lbres.exactnumbers.ext.divideBy
import xyz.lbres.exactnumbers.irrationals.IrrationalNumber
import xyz.lbres.exactnumbers.irrationals.log.Log
import xyz.lbres.exactnumbers.irrationals.pi.Pi
import xyz.lbres.exactnumbers.irrationals.sqrt.Sqrt
import xyz.lbres.exactnumbers.utils.createHashCode
import xyz.lbres.exactnumbers.utils.divideByZero
import xyz.lbres.kotlinutils.collection.ext.toConstMultiSet
Expand All @@ -26,11 +23,6 @@ internal class TermImpl(coefficient: ExactFraction, factors: ConstMultiSet<Irrat
private val factorSet: ConstMultiSet<IrrationalNumber<*>>
override val factors: List<IrrationalNumber<*>>

override val logs: List<Log>
override val squareRoots: List<Sqrt>
override val pis: List<Pi>
override val piCount: Int

// previously computed values for method returns
private var simplified: Term? = null
private var value: BigDecimal? = null
Expand All @@ -42,24 +34,11 @@ internal class TermImpl(coefficient: ExactFraction, factors: ConstMultiSet<Irrat
this.factors = emptyList()
this.factorSet = emptyConstMultiSet()
this.factorTypeMapping = emptyMap()

this.logs = emptyList()
this.squareRoots = emptyList()
this.pis = emptyList()
this.piCount = 0
} else {
this.coefficient = coefficient
this.factors = factors.toList()
this.factorSet = factors
this.factorTypeMapping = factorSet.groupBy { it.type }

@Suppress("UNCHECKED_CAST")
this.logs = factorTypeMapping.getOrDefault(Log.TYPE, emptyList()) as List<Log>
@Suppress("UNCHECKED_CAST")
this.squareRoots = factorTypeMapping.getOrDefault(Sqrt.TYPE, emptyList()) as List<Sqrt>
@Suppress("UNCHECKED_CAST")
this.pis = factorTypeMapping.getOrDefault(Pi.TYPE, emptyList()) as List<Pi>
this.piCount = factorSet.getCountOf(Pi()) - factorSet.getCountOf(Pi().inverse())
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package xyz.lbres.exactnumbers.expressions.term

import xyz.lbres.exactnumbers.exactfraction.ExactFraction
import xyz.lbres.exactnumbers.irrationals.IrrationalNumber
import xyz.lbres.exactnumbers.irrationals.log.Log
import xyz.lbres.exactnumbers.irrationals.pi.Pi
import xyz.lbres.exactnumbers.irrationals.sqrt.Sqrt
Expand Down Expand Up @@ -54,40 +55,39 @@ private fun runFactorsConstructorTests() {
checkTerm(term, ExactFraction(-17, 100043))

term = Term.fromValues(one, listOf(logWhole, logInverse))
var logs = listOf(logWhole, logInverse)
checkTerm(term, one, logs, logs = logs)
var factors: List<IrrationalNumber<*>> = listOf(logWhole, logInverse)
checkTerm(term, one, factors)

term = Term.fromValues(one, listOf(sqrtWhole))
checkTerm(term, one, listOf(sqrtWhole), sqrts = listOf(sqrtWhole))
checkTerm(term, one, listOf(sqrtWhole))

term = Term.fromValues(one, listOf(pi))
checkTerm(term, one, listOf(pi), pis = listOf(pi), piCount = 1)
checkTerm(term, one, listOf(pi))

term = Term.fromValues(one, listOf(pi, piInverse))
var pis = listOf(pi, piInverse)
checkTerm(term, one, pis, pis = pis, piCount = 0)
factors = listOf(pi, piInverse)
checkTerm(term, one, factors)

// multi type
term = Term.fromValues(ExactFraction(-17, 100043), listOf(logWhole))
checkTerm(term, ExactFraction(-17, 100043), listOf(logWhole), logs = listOf(logWhole))
checkTerm(term, ExactFraction(-17, 100043), listOf(logWhole))

term = Term.fromValues(ExactFraction.NEG_ONE, listOf(piInverse, logWhole))
logs = listOf(logWhole)
pis = listOf(piInverse)
checkTerm(term, ExactFraction.NEG_ONE, listOf(piInverse, logWhole), logs = logs, pis = pis, piCount = -1)
factors = listOf(piInverse, logWhole)
checkTerm(term, ExactFraction.NEG_ONE, factors)

logs = listOf(logChangeBase, logInverse, logDecimal)
val logs = listOf(logChangeBase, logInverse, logDecimal)
val sqrts = listOf(sqrtDecimal, Sqrt.ONE)
pis = listOf(pi, pi, piInverse)
val pis = listOf(pi, pi, piInverse)

term = Term.fromValues(ExactFraction(-1, 5), logs + sqrts)
checkTerm(term, ExactFraction(-1, 5), logs + sqrts, logs, sqrts, emptyList(), 0)
checkTerm(term, ExactFraction(-1, 5), logs + sqrts)

term = Term.fromValues(ExactFraction(-1, 5), sqrts + pis)
checkTerm(term, ExactFraction(-1, 5), sqrts + pis, emptyList(), sqrts, pis, 1)
checkTerm(term, ExactFraction(-1, 5), sqrts + pis)

term = Term.fromValues(one, pis + logs + listOf(testNumber1, testNumber2))
checkTerm(term, one, pis + logs + listOf(testNumber1, testNumber2), logs, sqrts = emptyList(), pis, 1)
checkTerm(term, one, pis + logs + listOf(testNumber1, testNumber2))
}

private fun runComponentConstructorTests() {
Expand All @@ -113,35 +113,35 @@ private fun runComponentConstructorTests() {

term = Term.fromValues(one, listOf(logWhole, logInverse), emptyList(), 0)
var logs = listOf(logWhole, logInverse)
checkTerm(term, one, logs, logs = logs)
checkTerm(term, one, logs)

term = Term.fromValues(one, emptyList(), listOf(sqrtPartialWhole), 0)
checkTerm(term, one, listOf(sqrtPartialWhole), sqrts = listOf(sqrtPartialWhole))
checkTerm(term, one, listOf(sqrtPartialWhole))

term = Term.fromValues(one, emptyList(), emptyList(), -2)
var pis = listOf(piInverse, piInverse)
checkTerm(term, one, pis, pis = pis, piCount = -2)
checkTerm(term, one, pis)

// multi type
term = Term.fromValues(ExactFraction(-17, 100043), listOf(logWhole), emptyList(), 0)
checkTerm(term, ExactFraction(-17, 100043), listOf(logWhole), logs = listOf(logWhole))
checkTerm(term, ExactFraction(-17, 100043), listOf(logWhole))

term = Term.fromValues(ExactFraction.NEG_ONE, emptyList(), emptyList(), -1)
checkTerm(term, ExactFraction.NEG_ONE, listOf(piInverse), pis = listOf(piInverse), piCount = -1)
checkTerm(term, ExactFraction.NEG_ONE, listOf(piInverse))

logs = listOf(logChangeBase, logInverse, logDecimal)
val sqrts = listOf(sqrtDecimal, Sqrt.ONE)
pis = listOf(pi, pi)

term = Term.fromValues(ExactFraction(-1, 5), logs, sqrts, 0)
checkTerm(term, ExactFraction(-1, 5), logs + sqrts, logs, sqrts, emptyList(), 0)
checkTerm(term, ExactFraction(-1, 5), logs + sqrts)

term = Term.fromValues(ExactFraction(-1, 5), logs, emptyList(), 2)
checkTerm(term, ExactFraction(-1, 5), logs + pis, logs, emptyList(), pis, 2)
checkTerm(term, ExactFraction(-1, 5), logs + pis)

term = Term.fromValues(ExactFraction(-1, 5), emptyList(), sqrts, 2)
checkTerm(term, ExactFraction(-1, 5), sqrts + pis, emptyList(), sqrts, pis, 2)
checkTerm(term, ExactFraction(-1, 5), sqrts + pis)

term = Term.fromValues(ExactFraction(-1, 5), logs, sqrts, 2)
checkTerm(term, ExactFraction(-1, 5), logs + sqrts + pis, logs, sqrts, pis, 2)
checkTerm(term, ExactFraction(-1, 5), logs + sqrts + pis)
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package xyz.lbres.exactnumbers.expressions.term

import xyz.lbres.exactnumbers.exactfraction.ExactFraction
import xyz.lbres.exactnumbers.irrationals.IrrationalNumber
import xyz.lbres.exactnumbers.irrationals.log.Log
import xyz.lbres.exactnumbers.irrationals.pi.Pi
import xyz.lbres.exactnumbers.irrationals.sqrt.Sqrt
Expand All @@ -22,66 +21,56 @@ fun runCommonSimplifyTests(simplify: (Term) -> Term) {
// simplified
var term = Term.fromValues(ExactFraction.EIGHT, listOf(pi, piInverse))
var result = simplify(term)
var expectedCoeff = ExactFraction.EIGHT
checkTerm(result, expectedCoeff)
checkTerm(result, ExactFraction.EIGHT)

term = Term.fromValues(ExactFraction(-3, 2), listOf(log1, pi, piInverse, pi))
result = simplify(term)
expectedCoeff = ExactFraction(-3, 2)
var expectedFactors: List<IrrationalNumber<*>> = listOf(log1, pi)
checkTerm(result, expectedCoeff, expectedFactors, logs = listOf(log1), pis = listOf(pi), piCount = 1)
var expectedFactors = listOf(log1, pi)
checkTerm(result, ExactFraction(-3, 2), expectedFactors)

term = Term.fromValues(ExactFraction.HALF, listOf(Log.ONE, log1, testNumber2, testNumber2))
result = simplify(term)
expectedCoeff = ExactFraction(49, 2)
expectedFactors = listOf(log1)
checkTerm(result, expectedCoeff, expectedFactors, logs = listOf(log1))
checkTerm(result, ExactFraction(49, 2), expectedFactors)

term = Term.fromValues(-ExactFraction.HALF, listOf(Log.ONE, piInverse))
result = simplify(term)
expectedCoeff = -ExactFraction.HALF
expectedFactors = listOf(piInverse)
checkTerm(result, expectedCoeff, expectedFactors, pis = listOf(piInverse), piCount = -1)
checkTerm(result, -ExactFraction.HALF, expectedFactors)

term = Term.fromValues(ExactFraction.TEN, listOf(Sqrt.ONE, sqrt, testNumber1, testNumber1, testNumber1.inverse(), testNumber1.inverse(), testNumber1.inverse()))
result = simplify(term)
expectedCoeff = ExactFraction(20)
expectedFactors = listOf(Sqrt(ExactFraction(5, 33)), testNumber1.inverse())
var sqrts = listOf(Sqrt(ExactFraction(5, 33)))
checkTerm(result, expectedCoeff, expectedFactors, sqrts = sqrts)
checkTerm(result, ExactFraction(20), expectedFactors)

term = Term.fromValues(ExactFraction.TWO, listOf(Sqrt(64), Sqrt(ExactFraction(75, 98)), Sqrt(26)))
result = simplify(term)
expectedCoeff = ExactFraction(80, 7)
expectedFactors = listOf(Sqrt(ExactFraction(39)))
checkTerm(result, expectedCoeff, expectedFactors, sqrts = listOf(Sqrt(ExactFraction(39))))
checkTerm(result, ExactFraction(80, 7), expectedFactors)

term = Term.fromValues(
ExactFraction(18, 5),
listOf(log2, log2, log1, log2.inverse(), piInverse, piInverse, piInverse, pi)
)
result = simplify(term)
expectedCoeff = ExactFraction(18, 5)
var logs = listOf(log2, log1)
var pis = listOf(piInverse, piInverse)
checkTerm(result, expectedCoeff, logs + pis, logs = logs, pis = pis, piCount = -2)
checkTerm(result, ExactFraction(18, 5), logs + pis)

term = Term.fromValues(ExactFraction.FOUR, listOf(Log(100), Sqrt(9), testNumber1, Sqrt(ExactFraction(1, 4))))
result = simplify(term)
expectedCoeff = ExactFraction(12)
checkTerm(result, expectedCoeff, listOf(testNumber1))
checkTerm(result, ExactFraction(12), listOf(testNumber1))

term = Term.fromValues(-ExactFraction.EIGHT, listOf(Sqrt(ExactFraction(27, 98)), piInverse))
result = simplify(term)
expectedCoeff = ExactFraction(-24, 7)
expectedFactors = listOf(Sqrt(ExactFraction(3, 2)), piInverse)
sqrts = listOf(Sqrt(ExactFraction(3, 2)))
checkTerm(result, expectedCoeff, expectedFactors, sqrts = sqrts, pis = listOf(piInverse), piCount = -1)
checkTerm(result, ExactFraction(-24, 7), expectedFactors)

term = Term.fromValues(ExactFraction(20), listOf(Log(ExactFraction(1, 27), 3).inverse()))
result = simplify(term)
expectedCoeff = ExactFraction(-20, 3)
checkTerm(result, expectedCoeff)
checkTerm(result, ExactFraction(-20, 3))

term = Term.fromValues(
ExactFraction(3, 5),
Expand All @@ -97,52 +86,40 @@ fun runCommonSimplifyTests(simplify: (Term) -> Term) {
)
)
result = simplify(term)
expectedCoeff = ExactFraction(-6)
expectedFactors = listOf(Log(4), Log(1000, 12), Sqrt(ExactFraction(78, 7)), pi)
logs = listOf(Log(4), Log(1000, 12))
sqrts = listOf(Sqrt(ExactFraction(78, 7)))
checkTerm(result, expectedCoeff, expectedFactors, logs, sqrts, listOf(pi), 1)
checkTerm(result, ExactFraction(-6), expectedFactors)

term = Term.fromValues(
ExactFraction(4, 7),
listOf(testNumber2, pi, piInverse, Log.ONE, Sqrt(ExactFraction(9, 49)), Log(1000), Log(ExactFraction(1, 32), 2))
)
result = simplify(term)
expectedCoeff = ExactFraction(-180, 7)
checkTerm(result, expectedCoeff)
checkTerm(result, ExactFraction(-180, 7))

// no changes
term = Term.fromValues(ExactFraction.EIGHT, emptyList())
result = simplify(term)
expectedCoeff = ExactFraction.EIGHT
checkTerm(result, expectedCoeff)
checkTerm(result, ExactFraction.EIGHT)

term = Term.fromValues(ExactFraction.EIGHT, listOf(log1))
result = simplify(term)
expectedCoeff = ExactFraction.EIGHT
expectedFactors = listOf(log1)
checkTerm(result, expectedCoeff, expectedFactors, logs = listOf(log1))
checkTerm(result, ExactFraction.EIGHT, expectedFactors)

term = Term.fromValues(ExactFraction.EIGHT, listOf(Sqrt(ExactFraction(1, 46))))
result = simplify(term)
expectedCoeff = ExactFraction.EIGHT
expectedFactors = listOf(Sqrt(ExactFraction(1, 46)))
sqrts = listOf(Sqrt(ExactFraction(1, 46)))
checkTerm(result, expectedCoeff, expectedFactors, sqrts = sqrts)
checkTerm(result, ExactFraction.EIGHT, expectedFactors)

term = Term.fromValues(ExactFraction(-5, 6), listOf(piInverse, testNumber1))
result = simplify(term)
expectedCoeff = ExactFraction(-5, 6)
expectedFactors = listOf(piInverse, testNumber1)
checkTerm(result, expectedCoeff, expectedFactors, pis = listOf(piInverse), piCount = -1)
checkTerm(result, ExactFraction(-5, 6), expectedFactors)

term = Term.fromValues(ExactFraction.SEVEN, listOf(log1, log1, log2.inverse(), Sqrt(5), pi, pi))
result = simplify(term)
expectedCoeff = ExactFraction.SEVEN
expectedFactors = listOf(log1, log1, log2.inverse(), Sqrt(5), pi, pi)
logs = listOf(log1, log1, log2.inverse())
pis = listOf(pi, pi)
checkTerm(result, expectedCoeff, expectedFactors, logs, listOf(Sqrt(5)), pis, 2)
checkTerm(result, ExactFraction.SEVEN, expectedFactors)
}

fun runGetValueTests() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,6 @@ package xyz.lbres.exactnumbers.expressions.term

import xyz.lbres.exactnumbers.exactfraction.ExactFraction
import xyz.lbres.exactnumbers.irrationals.IrrationalNumber
import xyz.lbres.exactnumbers.irrationals.log.Log
import xyz.lbres.exactnumbers.irrationals.pi.Pi
import xyz.lbres.exactnumbers.irrationals.sqrt.Sqrt
import kotlin.test.assertEquals

/**
Expand All @@ -13,24 +10,8 @@ import kotlin.test.assertEquals
* @param term [Term]: term to check
* @param coeff [ExactFraction]: expected coefficient
* @param factors [List]<IrrationalNumber<*>>: expected factors. Defaults to empty list
* @param logs [List]<Log>: expected logs. Defaults to empty list
* @param sqrts [List]<Sqrt>: expected squareRoots. Defaults to empty list
* @param pis [List]<Pi>: expected pis. Defaults to empty list
* @param piCount [Int]: expected piCount. Defaults to 0
*/
fun checkTerm(
term: Term,
coeff: ExactFraction,
factors: List<IrrationalNumber<*>> = emptyList(),
logs: List<Log> = emptyList(),
sqrts: List<Sqrt> = emptyList(),
pis: List<Pi> = emptyList(),
piCount: Int = 0
) {
fun checkTerm(term: Term, coeff: ExactFraction, factors: List<IrrationalNumber<*>> = emptyList()) {
assertEquals(coeff, term.coefficient)
assertEquals(factors, term.factors)
assertEquals(logs.sorted(), term.logs.sorted())
assertEquals(sqrts.sorted(), term.squareRoots.sorted())
assertEquals(pis.sorted(), term.pis.sorted())
assertEquals(piCount, term.piCount)
}
Loading

0 comments on commit 67def3d

Please sign in to comment.