///|
fn main {
let semiring = @wfst.tropical_semiring()
let morphology = @wfst.transducer_builder(semiring)
let start = @wfst.add_state(morphology)
let accepting = @wfst.add_state(morphology)
ignore(@wfst.set_start(morphology, start))
ignore(
@wfst.set_final(morphology, accepting, @wfst.tropical_cost(0).unwrap()),
)
// Two analyses share the surface form; the lower-cost path is selected.
ignore(
@wfst.add_arc(
morphology,
start,
@wfst.Label::Symbol("went"),
@wfst.Label::Symbol("go+PAST"),
accepting,
@wfst.tropical_cost(1).unwrap(),
),
)
ignore(
@wfst.add_arc(
morphology,
start,
@wfst.Label::Symbol("went"),
@wfst.Label::Symbol("went+NOUN"),
accepting,
@wfst.tropical_cost(4).unwrap(),
),
)
let analyzer = @wfst.project_output(@wfst.build_transducer(morphology))
let best = @wfst.shortest_path(analyzer, @wfst.tropical_path_order()).unwrap()
let analysis = match @wfst.accepting_path_steps(best)[0].arc.output {
@wfst.Label::Symbol(text) => text
@wfst.Label::Epsilon => ""
}
let cost = @wfst.tropical_value(@wfst.accepting_path_total_weight(best)).unwrap()
println(
"morphology analysis for went: " + analysis + ", cost=" + cost.to_string(),
)
}