///|
/// Continue an unbalanced distribution-reconciliation solve after changing
/// epsilon and the observed target. Counts are measurements for this input,
/// not a promise that continuation uses fewer iterations.
fn main {
let source = [0.55, 0.30, 0.15]
let first_target = [0.20, 0.50, 0.30]
let next_target = [0.25, 0.45, 0.30]
let cost = [[0.0, 0.4, 1.1], [0.5, 0.0, 0.3], [1.2, 0.4, 0.0]]
match
@moonot.unbalanced_sinkhorn_with_warm_start(
source,
first_target,
cost,
{
epsilon: 0.8,
rho_source: 1.2,
rho_target: 0.9,
cost_weight: 1.0,
tolerance: 1.0e-9,
max_iterations: 2000,
},
None,
) {
Err(_) => println("initial unbalanced solve failed")
Ok((initial, seed)) => {
println("initial solve iterations and objective:")
println(initial.iterations)
println(initial.objective)
match
@moonot.unbalanced_sinkhorn_with_warm_start(
source,
next_target,
cost,
{
epsilon: 0.35,
rho_source: 1.2,
rho_target: 0.9,
cost_weight: 1.0,
tolerance: 1.0e-9,
max_iterations: 2000,
},
Some(seed),
) {
Err(_) => println("continued unbalanced solve failed")
Ok((continued, _)) => {
println(
"continued solve iterations, objective, and scaling residual:",
)
println(continued.iterations)
println(continued.objective)
println(continued.scaling_residual)
match
@moonot.unbalanced_sinkhorn(source, next_target, cost, {
epsilon: 0.35,
rho_source: 1.2,
rho_target: 0.9,
cost_weight: 1.0,
tolerance: 1.0e-9,
max_iterations: 2000,
}) {
Err(_) => println("cold comparison solve failed")
Ok(cold) => {
println("cold solve iterations and objective:")
println(cold.iterations)
println(cold.objective)
}
}
}
}
}
}
}