У меня есть следующее определение ориентированного графа в Котлине. (Я все еще изучаю Kotlin, поэтому, пожалуйста, прости любые недостатки. Улучшения и предложения всегда приветствуются.) Моя цель - иметь метод reverse
, который поддерживает вершины и петли, но меняет направления других ребер.
// We use an edge list because it makes it the easiest to swap.
data class ReversibleDirectedGraph<T>(val vertices: Set<T>, val edgeList: List<Pair<T,T>>) {
// This should be a self-inverting function.
fun reverse(): ReversibleDirectedGraph<T> {
// Make sure all vertices in edgeList are in vertices.
val allVertices = edgeList.flatMap { it.toList() }
require(allVertices.all { it in vertices }) { "Illegal graph specification" }
// Swap the edges.
val newEdgeList = edgeList.map { it.second to it.first }
return ReversibleDirectedGraph(allVertices.toSet(), newEdgeList)
}
}
fun main() {
// Example test: works correctly. Double edge reversal results in original graph.
val g = ReversibleDirectedGraph(setOf(0, 1, 2, 3),
listOf(0 to 1, 2 to 1, 3 to 2, 3 to 0, 1 to 3))
println(g)
val gr = g.reverse()
println(gr)
val grr = gr.reverse()
println(grr)
println(grr == g)
}
Я бы хотел использовать тестирование на основе свойств для тестирования этого кода с использованием KotinTest, но у меня возникают проблемы с его структурированием для правильного получения случайных выборок неориентированных графов. Если мне удастся достичь этой точки, я смогу дважды изменить направление края и затем убедиться, что достигнут исходный график.
Я знаком с Gen.list
, Gen.choose
и т. Д., Но не могуПохоже, что они соединяют кусочки вместе, чтобы получить конечный продукт, то есть случайный неискаженный график.
Я уже понял это, но это явно недостающие кусочки, и я надеялся, что кто-то сможет помочь,Я подозреваю, что мог бы сделать это в Scala, так как у меня там больше опыта, но я полон решимости изучать Kotlin. В конечном итоге, что-то вроде:
class ReversibleDirectedGraphTest: StringSpec() {
init {
"reversibleDirectedGraphTest" {
forAll { g: ReversibleDirectedGraph<Int> ->
assertEqual(g.reverse().reverse() == g) }
}
}
}
}
Любая помощь / предложения будут с благодарностью. Спасибо!