// File: /workspace/github_cpp_makefile_star2_O2/aalto-speech[P]ftk/src/EM.cc
// Function: viterbi(std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, double, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const, double>>>, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, double, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const, double>>>>>> const&, FactorGraph&, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, double, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const, double>>>, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, double, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const, double>>>>>>&, double)
flt_type viterbi(const transitions_t &transitions,
                 FactorGraph &text,
                 transitions_t &stats,
                 flt_type multiplier)
{
    vector<string> best_path;
    flt_type lp = viterbi(transitions, text, best_path, true);
    if (best_path.size() < 2) return MIN_FLOAT;
    for (unsigned int i=1; i<best_path.size(); i++)
        stats[best_path[i-1]][best_path[i]] += multiplier;
    return lp;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r14
pushq %rbx
subq $0x30, %rsp
movsd %xmm0, -0x38(%rbp)
movq %rdx, %rbx
xorpd %xmm0, %xmm0
leaq -0x30(%rbp), %rdx
movapd %xmm0, (%rdx)
andq $0x0, 0x10(%rdx)
pushq $0x1
popq %rcx
callq 0x1608b
movq -0x30(%rbp), %rsi
movq -0x28(%rbp), %rax
movq %rax, %rcx
subq %rsi, %rcx
cmpq $0x21, %rcx
jae 0x163e8
movsd 0xd3c4(%rip), %xmm0     # 0x23790
movsd %xmm0, -0x18(%rbp)
leaq -0x30(%rbp), %rdi
callq 0x54b6
movsd -0x18(%rbp), %xmm0
addq $0x30, %rsp
popq %rbx
popq %r14
popq %rbp
retq
xorl %ecx, %ecx
movsd %xmm0, -0x18(%rbp)
leal 0x1(%rcx), %r14d
subq %rsi, %rax
sarq $0x5, %rax
cmpq %r14, %rax
jbe 0x163d1
movl %ecx, %eax
shlq $0x5, %rax
addq %rax, %rsi
movq %rbx, %rdi
callq 0x19048
movq %r14, %rsi
shlq $0x5, %rsi
addq -0x30(%rbp), %rsi
movq %rax, %rdi
callq 0x18d90
movsd (%rax), %xmm0
addsd -0x38(%rbp), %xmm0
movsd %xmm0, (%rax)
movq -0x30(%rbp), %rsi
movq -0x28(%rbp), %rax
movl %r14d, %ecx
jmp 0x163ef
jmp 0x1643f
movq %rax, %rbx
leaq -0x30(%rbp), %rdi
callq 0x54b6
movq %rbx, %rdi
callq 0x45f0