#pragma once // TODO: others namespace Semiring { template struct Viterbi { T one = 1.0; T null = 0.0; T add(T x, T y); T multiply(T x, T y); T convert(T x); }; template T Viterbi::add(T x, T y) { return max(x, y); } template T Viterbi::multiply(T x, T y) { return x * y; } template T Viterbi::convert(T x) { return (T)x; } } // namespace