// File: /workspace/github_cpp_makefile_star2_O1/huiwenliuge[P]EmoAnaer/src/RNNet.cpp
// Function: RNNet::_Forward_CROSSENTROPY(sentence*)
double RNNet::_Forward_CROSSENTROPY(Sentence sen){

    int t,i,j;
    
    for(i=0;i<hidlayerNUM;++i){
        sen->hidLay[0][i]=0.0;
        for(j=0;j<featureNUM;++j)
            sen->hidLay[0][i]+=in2hid[i][j]*sen->inVec[0][j];
        sen->kLayer[0][i]=sigm(sen->hidLay[0][i]);
    }
    
    for(i=0;i<EMOTIONNUM;++i){
        sen->outLay[0][i]=0.0;
        for(j=0;j<hidlayerNUM;++j)
            sen->outLay[0][i]+=k2out[i][j]*sen->kLayer[0][j];
        sen->eng[i]=0.0;
    }
    softmax_add(sen,sen->outLay[0],0);
    // sen->loss=0.0;
    // for(i=0;i<EMOTIONNUM;++i)
    //     sen->loss+=-sen->stdAns[i]*log(sen->energy[i]);

    for(t=1;t<sen->tlen;++t){

        for(i=0;i<hidlayerNUM;++i){
            sen->hidLay[t][i]=0.0;
            for(j=0;j<featureNUM;++j)
                sen->hidLay[t][i]+=in2hid[i][j]*sen->inVec[t][j];
            for(j=0;j<hidlayerNUM;++j)
                sen->hidLay[t][i]+=rh2h[i][j]*sen->kLayer[t-1][j];
            for(j=0;j<EMOTIONNUM;++j)
                sen->hidLay[t][i]+=ro2h[i][j]*sen->outLay[t-1][j];
            sen->kLayer[t][i]=sigm(sen->hidLay[t][i]);
        }

        for(i=0;i<EMOTIONNUM;++i){
            sen->outLay[t][i]=0.0;
            for(j=0;j<hidlayerNUM;++j)
                sen->outLay[t][i]+=k2out[i][j]*sen->kLayer[t][j];  
        }
        softmax_add(sen,sen->outLay[t],t);

    }

    for(i=0;i<sen->tlen;++i)
        for(j=0;j<EMOTIONNUM;++j)
            sen->eng[j]+=sen->energy[i][j];
    for(i=0;i<EMOTIONNUM;++i)
        sen->eng[i]/=sen->tlen;
    
    sen->loss=0.0;
    for(i=0;i<EMOTIONNUM;++i)
        sen->loss+=-sen->stdAns[i]*log(sen->eng[i]);
    
    return sen->loss;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
subq $0x10, %rsp
movq %rsi, %rbx
movq %rdi, %r14
movl 0x34(%rdi), %esi
testl %esi, %esi
jle 0x34c6
xorl %r15d, %r15d
movq 0x20(%rbx), %rax
movq (%rax), %rax
movq $0x0, (%rax,%r15,8)
movslq 0x30(%r14), %rcx
testq %rcx, %rcx
jle 0x3486
movq 0x10(%r14), %rdx
movq (%rdx,%r15,8), %rdx
movq 0x18(%rbx), %rsi
movq (%rsi), %rsi
movsd (%rax,%r15,8), %xmm0
xorl %edi, %edi
movsd (%rdx,%rdi,8), %xmm1
mulsd (%rsi,%rdi,8), %xmm1
addsd %xmm1, %xmm0
movsd %xmm0, (%rax,%r15,8)
incq %rdi
cmpq %rdi, %rcx
jne 0x346a
movsd (%rax,%r15,8), %xmm0
xorpd 0x2b7c(%rip), %xmm0     # 0x6010
callq 0x2270
movsd 0x2b7f(%rip), %xmm1     # 0x6020
addsd %xmm1, %xmm0
divsd %xmm0, %xmm1
movq 0x28(%rbx), %rax
movq (%rax), %rax
movsd %xmm1, (%rax,%r15,8)
incq %r15
movslq 0x34(%r14), %rsi
cmpq %rsi, %r15
jl 0x343b
movq 0x30(%rbx), %rcx
movq 0x40(%rbx), %rax
movq (%rcx), %rcx
movq 0x18(%r14), %rdx
movl %esi, %esi
xorl %edi, %edi
movq $0x0, (%rcx,%rdi,8)
testl %esi, %esi
jle 0x3515
movq (%rdx,%rdi,8), %r8
movq 0x28(%rbx), %r9
movq (%r9), %r9
movsd (%rcx,%rdi,8), %xmm0
xorl %r10d, %r10d
movsd (%r8,%r10,8), %xmm1
mulsd (%r9,%r10,8), %xmm1
addsd %xmm1, %xmm0
movsd %xmm0, (%rcx,%rdi,8)
incq %r10
cmpq %r10, %rsi
jne 0x34f8
movq $0x0, (%rax,%rdi,8)
incq %rdi
cmpq $0x7, %rdi
jne 0x34d9
movq 0x30(%rbx), %rax
movq (%rax), %rdx
movq %rbx, %rsi
xorl %ecx, %ecx
callq 0x4876
movl 0x10(%rbx), %eax
cmpl $0x2, %eax
jl 0x36d3
movl $0x1, %r15d
movl 0x34(%r14), %ecx
testl %ecx, %ecx
jle 0x365a
xorl %r12d, %r12d
movq 0x20(%rbx), %rax
movq (%rax,%r15,8), %rax
movq $0x0, (%rax,%r12,8)
movslq 0x30(%r14), %rdx
testq %rdx, %rdx
jle 0x35a8
movq 0x10(%r14), %rsi
movq (%rsi,%r12,8), %rsi
movq 0x18(%rbx), %rdi
movq (%rdi,%r15,8), %rdi
movsd (%rax,%r12,8), %xmm0
xorl %r8d, %r8d
movsd (%rsi,%r8,8), %xmm1
mulsd (%rdi,%r8,8), %xmm1
addsd %xmm1, %xmm0
movsd %xmm0, (%rax,%r12,8)
incq %r8
cmpq %r8, %rdx
jne 0x358a
testl %ecx, %ecx
jle 0x35e3
movq 0x20(%r14), %rdx
movq (%rdx,%r12,8), %rdx
movq 0x28(%rbx), %rsi
movq -0x8(%rsi,%r15,8), %rsi
movsd (%rax,%r12,8), %xmm0
movl %ecx, %ecx
xorl %edi, %edi
movsd (%rdx,%rdi,8), %xmm1
mulsd (%rsi,%rdi,8), %xmm1
addsd %xmm1, %xmm0
movsd %xmm0, (%rax,%r12,8)
incq %rdi
cmpq %rdi, %rcx
jne 0x35c7
movq 0x28(%r14), %rcx
movq (%rcx,%r12,8), %rcx
movq 0x30(%rbx), %rdx
movq -0x8(%rdx,%r15,8), %rdx
movsd (%rax,%r12,8), %xmm0
xorl %esi, %esi
movsd (%rcx,%rsi,8), %xmm1
mulsd (%rdx,%rsi,8), %xmm1
addsd %xmm1, %xmm0
movsd %xmm0, (%rax,%r12,8)
incq %rsi
cmpq $0x7, %rsi
jne 0x35fc
movsd (%rax,%r12,8), %xmm0
xorpd 0x29e9(%rip), %xmm0     # 0x6010
callq 0x2270
movsd 0x29ec(%rip), %xmm1     # 0x6020
addsd %xmm1, %xmm0
divsd %xmm0, %xmm1
movq 0x28(%rbx), %rax
movq (%rax,%r15,8), %rax
movsd %xmm1, (%rax,%r12,8)
incq %r12
movslq 0x34(%r14), %rcx
cmpq %rcx, %r12
jl 0x3558
movq 0x30(%rbx), %rax
movq (%rax,%r15,8), %rax
movq 0x18(%r14), %rdx
movl %ecx, %ecx
xorl %esi, %esi
movq $0x0, (%rax,%rsi,8)
testl %ecx, %ecx
jle 0x36a7
movq (%rdx,%rsi,8), %rdi
movq 0x28(%rbx), %r8
movq (%r8,%r15,8), %r8
movsd (%rax,%rsi,8), %xmm0
xorl %r9d, %r9d
movsd (%rdi,%r9,8), %xmm1
mulsd (%r8,%r9,8), %xmm1
addsd %xmm1, %xmm0
movsd %xmm0, (%rax,%rsi,8)
incq %r9
cmpq %r9, %rcx
jne 0x368a
incq %rsi
cmpq $0x7, %rsi
jne 0x366a
movq 0x30(%rbx), %rax
movq (%rax,%r15,8), %rdx
movq %rbx, %rsi
movl %r15d, %ecx
callq 0x4876
incq %r15
movslq 0x10(%rbx), %rax
cmpq %rax, %r15
jl 0x3549
testl %eax, %eax
jle 0x370d
movq 0x38(%rbx), %rcx
movq 0x40(%rbx), %rdx
movl %eax, %esi
xorl %edi, %edi
movq (%rcx,%rdi,8), %r8
xorl %r9d, %r9d
movsd (%r8,%r9,8), %xmm0
addsd (%rdx,%r9,8), %xmm0
movsd %xmm0, (%rdx,%r9,8)
incq %r9
cmpq $0x7, %r9
jne 0x36ea
incq %rdi
cmpq %rsi, %rdi
jne 0x36e3
xorps %xmm0, %xmm0
cvtsi2sd %eax, %xmm0
movq 0x40(%rbx), %rax
xorl %ecx, %ecx
movsd (%rax,%rcx,8), %xmm1
divsd %xmm0, %xmm1
movsd %xmm1, (%rax,%rcx,8)
incq %rcx
cmpq $0x7, %rcx
jne 0x371a
movq $0x0, 0x50(%rbx)
xorl %r14d, %r14d
movq 0x40(%rbx), %rax
movq 0x48(%rbx), %rcx
movsd (%rcx,%r14,8), %xmm0
movsd %xmm0, -0x28(%rbp)
movsd (%rax,%r14,8), %xmm0
callq 0x2100
movsd 0x50(%rbx), %xmm1
mulsd -0x28(%rbp), %xmm0
subsd %xmm0, %xmm1
movsd %xmm1, 0x50(%rbx)
incq %r14
cmpq $0x7, %r14
jne 0x373c
movsd 0x50(%rbx), %xmm0
addq $0x10, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
popq %rbp
retq