1
0
Fork 0
mirror of https://github.com/pgpainless/pgpainless.git synced 2024-12-25 04:17:59 +01:00

Implement Cost

This commit is contained in:
Heiko Schaefer 2023-07-14 21:07:48 +02:00
parent 71f859af9b
commit ec9753ad71
No known key found for this signature in database
GPG key ID: 4A849A1904CCBD7D
2 changed files with 65 additions and 0 deletions

View file

@ -0,0 +1,36 @@
// SPDX-FileCopyrightText: 2023 Heiko Schaefer <heiko@schaefer.name>
//
// SPDX-License-Identifier: Apache-2.0
package org.pgpainless.wot.dijkstra
import kotlin.math.min
/**
* A path's "cost".
*
* This Cost type is used for comparison in Dijkstra's algorithm.
*/
internal class Cost(
// The path's length (i.e., the number of hops to the target).
// *Less* length is "cheaper" (short paths require less "depth" in delegations).
val length: Int,
// The trust amount along this path.
// Smaller trust amount is "more expensive"
// (paths with a low trust amount are more constraining and thus less desirable).
val amount: Int,
) : Comparable<Cost> {
// "Smaller than" means: the path is "cheaper", and thus preferable:
// - A small length (requiring fewer hops).
// - For equal length: A higher "trust amount" (which is less constraining)
override fun compareTo(other: Cost) =
compareValuesBy(this, other, { it.length }, { -it.amount })
override fun toString() = "length $length, amount $amount"
/** Calculate the cost of a path, when adding a new segment with trust amount `amount` */
fun extendBy(amount: Int) = Cost(this.length + 1, min(amount, this.amount))
}

View file

@ -0,0 +1,29 @@
// SPDX-FileCopyrightText: 2023 Heiko Schaefer <heiko@schaefer.name>
//
// SPDX-License-Identifier: Apache-2.0
package org.pgpainless.wot.dijkstra
import kotlin.test.Test
class CostTest {
@Test
fun cost() {
val cost1 = Cost(1, 60)
val cost2 = Cost(1, 120)
val cost3 = Cost(2, 60)
val cost4 = Cost(2, 120)
assert(cost1 > cost2) // cost2 is "cheaper": it constrains the amount of the path less
assert(cost1 < cost3) // cost2 is "cheaper": it costs fewer hops
assert(cost2 < cost3)
assert(cost3 > cost4)
assert(cost1 < cost4) // cost1 is "cheaper": even though it constrains the amount more, it costs fewer hops
assert(cost2 < cost4)
}
}