fuookami.ospf.kotlin.framework.solver.SerialCombinatorialColumnGenerationSolver.kt Maven / Gradle / Ivy
package fuookami.ospf.kotlin.framework.solver
import org.apache.logging.log4j.kotlin.*
import fuookami.ospf.kotlin.utils.error.*
import fuookami.ospf.kotlin.utils.functional.*
import fuookami.ospf.kotlin.core.frontend.model.mechanism.*
import fuookami.ospf.kotlin.core.backend.solver.output.*
class SerialCombinatorialColumnGenerationSolver(
private val solvers: List>,
private val stopErrorCode: Set = setOf(ErrorCode.ORModelNoSolution, ErrorCode.ORModelUnbounded)
): ColumnGenerationSolver {
private val logger = logger()
companion object {
@JvmName("constructBySolvers")
operator fun invoke(
solvers: List,
stopErrorCode: Set = setOf(ErrorCode.ORModelNoSolution, ErrorCode.ORModelUnbounded)
): SerialCombinatorialColumnGenerationSolver {
return SerialCombinatorialColumnGenerationSolver(solvers.map { lazy { it } }, stopErrorCode)
}
@JvmName("constructBySolverExtractors")
operator fun invoke(
solvers: List<() -> ColumnGenerationSolver>,
stopErrorCode: Set = setOf(ErrorCode.ORModelNoSolution, ErrorCode.ORModelUnbounded)
): SerialCombinatorialColumnGenerationSolver {
return SerialCombinatorialColumnGenerationSolver(solvers.map { lazy { it() } }, stopErrorCode)
}
}
override val name: String by lazy { "SerialCombinatorial(${solvers.joinToString(",") { it.value.name }})" }
override suspend fun solveMILP(
name: String,
metaModel: LinearMetaModel,
toLogModel: Boolean
): Ret {
for (solver in solvers) {
when (val result = solver.value.solveMILP(name, metaModel, toLogModel)) {
is Ok -> {
return Ok(result.value)
}
is Failed -> {
if (stopErrorCode.contains(result.error.code)) {
return Failed(result.error.code, result.error.message)
} else {
logger.warn { "Solver ${solver.value.name} failed with error ${result.error.code}: ${result.error.message}" }
}
}
}
}
return Failed(ErrorCode.SolverNotFound, "No solver valid.")
}
override suspend fun solveLP(
name: String,
metaModel: LinearMetaModel,
toLogModel: Boolean
): Ret {
for (solver in solvers) {
when (val result = solver.value.solveLP(name, metaModel, toLogModel)) {
is Ok -> {
return Ok(result.value)
}
is Failed -> {
if (stopErrorCode.contains(result.error.code)) {
return Failed(result.error.code, result.error.message)
} else {
logger.warn { "Solver ${solver.value.name} failed with error ${result.error.code}: ${result.error.message}" }
}
}
}
}
return Failed(ErrorCode.SolverNotFound, "No solver valid.")
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy