All Downloads are FREE. Search and download functionalities are using the official Maven repository.

commonMain.io.github.alexandrepiveteau.graphs.builder.DirectedNetworkBuilder.kt Maven / Gradle / Ivy

@file:JvmName("GraphBuilders")
@file:JvmMultifileClass

package io.github.alexandrepiveteau.graphs.builder

import io.github.alexandrepiveteau.graphs.Arc
import io.github.alexandrepiveteau.graphs.DirectedNetwork
import io.github.alexandrepiveteau.graphs.internal.graphs.AdjacencyListDirectedNetwork
import kotlin.jvm.JvmMultifileClass
import kotlin.jvm.JvmName

/** A [DirectedNetworkBuilder] is a [DirectedGraphBuilder] which can also add arcs with a weight. */
public interface DirectedNetworkBuilder : NetworkBuilder, DirectedNetworkBuilderScope {
  override fun toGraph(): DirectedNetwork
}

/** Returns a new [DirectedNetworkBuilder] instance. */
@JvmName("directedNetwork")
public fun DirectedNetwork.Companion.builder(): DirectedNetworkBuilder =
    MutableListDirectedNetworkBuilder()

/**
 * Builds a [DirectedNetwork] using the given [scope].
 *
 * @param scope the scope in which the graph is built.
 * @return the newly built graph.
 */
public inline fun buildDirectedNetwork(
    scope: DirectedNetworkBuilderScope.() -> Unit,
): DirectedNetwork = DirectedNetwork.builder().apply(scope).toGraph()

/** A [MutableListNetworkBuilder] for [DirectedNetworkBuilder]. */
private class MutableListDirectedNetworkBuilder :
    MutableListNetworkBuilder(), DirectedNetworkBuilder {
  override fun addArc(arc: Arc, weight: Int) {
    val (u, v) = arc
    checkLink(u, v)
    neighbors[u.index] += v.index
    weights[u.index] += weight
  }
  override fun toGraph(): DirectedNetwork {
    val (n, w) = compactToVertexAndWeightsArray(neighbors, weights)
    return AdjacencyListDirectedNetwork(n, w)
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy