https://blog.tdevin.com/posts/maximum-likelihood-decoding/