// File: chhylp123[P]hifiasm/Correct.cpp
// Function: cal_estimate_err(overlap_region*, long, long, long, double)
int64_t cal_estimate_err(overlap_region *z, int64_t wl, int64_t qs, int64_t qe, double e_rate)
{
    int64_t k, ws, we, wid, os, oe, ovlp, tot, cov_l, est = (qe-qs)*e_rate, wn = z->w_list.n; 
    if(!wn) return est;
    if(qs < z->x_pos_s) qs = z->x_pos_s;
    if(qe > z->x_pos_e+1) qe = z->x_pos_e+1;
    ws = qs/wl; ws *= wl; wid = get_win_id_by_s(z, ws, wl, NULL);
    if(wid>=wn) wid = wn-1;
    for (k = wid;k < wn && qs > z->w_list.a[k].x_end; k++); if(k == wn) return est;
    ///qs <= z->w_list.a[k].x_end
    for (;k>=0 && qs < z->w_list.a[k].x_start; k--); if(k < 0) k = 0;
    ///qs >= z->w_list.a[k].x_start

    for (tot = cov_l = 0; k < wn && z->w_list.a[k].x_start < qe; k++) {
        if(z->w_list.a[k].y_end == -1) continue;
        ws = z->w_list.a[k].x_start; we = z->w_list.a[k].x_end+1;
        os = MAX(qs, ws); oe = MIN(qe, we);
	    ovlp = ((oe>os)? (oe-os):0);
        if(!ovlp) continue;
        cov_l += ovlp;
        // if(!ovlp) {
        //     fprintf(stderr, "\n[M::%s::] utg%.6dl(%c), q::[%ld, %ld), w::[%ld, %ld), z::::[%d, %d)\n", 
        //         __func__, (int32_t)z->y_id+1, "+-"[z->y_pos_strand], qs, qe, ws, we, z->x_pos_s, z->x_pos_e+1);
        // }
        if(ovlp == (we-ws)) {
            tot += z->w_list.a[k].error;
        } else {
            tot += ((double)z->w_list.a[k].error)*((double)ovlp)/((double)(we-ws));
        }
    }
    tot += ((qe-qs)-cov_l)*e_rate; 
    return tot;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xb0, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq %rdx, -0x20(%rbp)
movq %rcx, -0x28(%rbp)
movsd %xmm0, -0x30(%rbp)
movq -0x28(%rbp), %rax
subq -0x20(%rbp), %rax
cvtsi2sd %rax, %xmm0
mulsd -0x30(%rbp), %xmm0
cvttsd2si %xmm0, %rax
movq %rax, -0x80(%rbp)
movq -0x10(%rbp), %rax
movq 0x48(%rax), %rax
movq %rax, -0x88(%rbp)
cmpq $0x0, -0x88(%rbp)
jne 0x5dd51
movq -0x80(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x5e0d0
movq -0x20(%rbp), %rax
movq -0x10(%rbp), %rcx
movl 0x4(%rcx), %ecx
cmpq %rcx, %rax
jge 0x5dd6c
movq -0x10(%rbp), %rax
movl 0x4(%rax), %eax
movq %rax, -0x20(%rbp)
movq -0x28(%rbp), %rax
movq -0x10(%rbp), %rcx
movl 0x8(%rcx), %ecx
addl $0x1, %ecx
movl %ecx, %ecx
cmpq %rcx, %rax
jle 0x5dd91
movq -0x10(%rbp), %rax
movl 0x8(%rax), %eax
addl $0x1, %eax
movl %eax, %eax
movq %rax, -0x28(%rbp)
movq -0x20(%rbp), %rax
cqto
idivq -0x18(%rbp)
movq %rax, -0x40(%rbp)
movq -0x18(%rbp), %rax
imulq -0x40(%rbp), %rax
movq %rax, -0x40(%rbp)
movq -0x10(%rbp), %rdi
movq -0x40(%rbp), %rsi
movq -0x18(%rbp), %rdx
xorl %eax, %eax
movl %eax, %ecx
callq 0x9e2e0
movq %rax, -0x50(%rbp)
movq -0x50(%rbp), %rax
cmpq -0x88(%rbp), %rax
jl 0x5dde1
movq -0x88(%rbp), %rax
subq $0x1, %rax
movq %rax, -0x50(%rbp)
movq -0x50(%rbp), %rax
movq %rax, -0x38(%rbp)
movq -0x38(%rbp), %rcx
xorl %eax, %eax
cmpq -0x88(%rbp), %rcx
movb %al, -0x89(%rbp)
jge 0x5de25
movq -0x20(%rbp), %rax
movq -0x10(%rbp), %rcx
movq 0x58(%rcx), %rcx
movq -0x38(%rbp), %rdx
shlq $0x5, %rdx
addq %rdx, %rcx
movslq 0x4(%rcx), %rcx
cmpq %rcx, %rax
setg %al
movb %al, -0x89(%rbp)
movb -0x89(%rbp), %al
testb $0x1, %al
jne 0x5de31
jmp 0x5de41
jmp 0x5de33
movq -0x38(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x38(%rbp)
jmp 0x5dde9
movq -0x38(%rbp), %rax
cmpq -0x88(%rbp), %rax
jne 0x5de5b
movq -0x80(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x5e0d0
jmp 0x5de5d
xorl %eax, %eax
cmpq $0x0, -0x38(%rbp)
movb %al, -0x8a(%rbp)
jl 0x5de92
movq -0x20(%rbp), %rax
movq -0x10(%rbp), %rcx
movq 0x58(%rcx), %rcx
movq -0x38(%rbp), %rdx
shlq $0x5, %rdx
addq %rdx, %rcx
movslq (%rcx), %rcx
cmpq %rcx, %rax
setl %al
movb %al, -0x8a(%rbp)
movb -0x8a(%rbp), %al
testb $0x1, %al
jne 0x5de9e
jmp 0x5deae
jmp 0x5dea0
movq -0x38(%rbp), %rax
addq $-0x1, %rax
movq %rax, -0x38(%rbp)
jmp 0x5de5d
cmpq $0x0, -0x38(%rbp)
jge 0x5debd
movq $0x0, -0x38(%rbp)
movq $0x0, -0x78(%rbp)
movq $0x0, -0x70(%rbp)
movq -0x38(%rbp), %rcx
xorl %eax, %eax
cmpq -0x88(%rbp), %rcx
movb %al, -0x8b(%rbp)
jge 0x5df05
movq -0x10(%rbp), %rax
movq 0x58(%rax), %rax
movq -0x38(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
movslq (%rax), %rax
cmpq -0x28(%rbp), %rax
setl %al
movb %al, -0x8b(%rbp)
movb -0x8b(%rbp), %al
testb $0x1, %al
jne 0x5df14
jmp 0x5e09b
movq -0x10(%rbp), %rax
movq 0x58(%rax), %rax
movq -0x38(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
cmpl $-0x1, 0xc(%rax)
jne 0x5df32
jmp 0x5e08a
movq -0x10(%rbp), %rax
movq 0x58(%rax), %rax
movq -0x38(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
movslq (%rax), %rax
movq %rax, -0x40(%rbp)
movq -0x10(%rbp), %rax
movq 0x58(%rax), %rax
movq -0x38(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
movl 0x4(%rax), %eax
addl $0x1, %eax
cltq
movq %rax, -0x48(%rbp)
movq -0x20(%rbp), %rax
cmpq -0x40(%rbp), %rax
jl 0x5df82
movq -0x20(%rbp), %rax
movq %rax, -0x98(%rbp)
jmp 0x5df8d
movq -0x40(%rbp), %rax
movq %rax, -0x98(%rbp)
movq -0x98(%rbp), %rax
movq %rax, -0x58(%rbp)
movq -0x28(%rbp), %rax
cmpq -0x48(%rbp), %rax
jg 0x5dfaf
movq -0x28(%rbp), %rax
movq %rax, -0xa0(%rbp)
jmp 0x5dfba
movq -0x48(%rbp), %rax
movq %rax, -0xa0(%rbp)
movq -0xa0(%rbp), %rax
movq %rax, -0x60(%rbp)
movq -0x60(%rbp), %rax
cmpq -0x58(%rbp), %rax
jle 0x5dfe0
movq -0x60(%rbp), %rax
subq -0x58(%rbp), %rax
movq %rax, -0xa8(%rbp)
jmp 0x5dfeb
xorl %eax, %eax
movq %rax, -0xa8(%rbp)
jmp 0x5dfeb
movq -0xa8(%rbp), %rax
movq %rax, -0x68(%rbp)
cmpq $0x0, -0x68(%rbp)
jne 0x5e002
jmp 0x5e08a
movq -0x68(%rbp), %rax
addq -0x78(%rbp), %rax
movq %rax, -0x78(%rbp)
movq -0x68(%rbp), %rax
movq -0x48(%rbp), %rcx
subq -0x40(%rbp), %rcx
cmpq %rcx, %rax
jne 0x5e041
movq -0x10(%rbp), %rax
movq 0x58(%rax), %rax
movq -0x38(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
movswq 0x14(%rax), %rax
addq -0x70(%rbp), %rax
movq %rax, -0x70(%rbp)
jmp 0x5e088
movq -0x10(%rbp), %rax
movq 0x58(%rax), %rax
movq -0x38(%rbp), %rcx
shlq $0x5, %rcx
movswl 0x14(%rax,%rcx), %eax
cvtsi2sd %eax, %xmm1
cvtsi2sdq -0x68(%rbp), %xmm0
mulsd %xmm0, %xmm1
movq -0x48(%rbp), %rax
subq -0x40(%rbp), %rax
cvtsi2sd %rax, %xmm0
divsd %xmm0, %xmm1
cvtsi2sdq -0x70(%rbp), %xmm0
addsd %xmm1, %xmm0
cvttsd2si %xmm0, %rax
movq %rax, -0x70(%rbp)
jmp 0x5e08a
movq -0x38(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x38(%rbp)
jmp 0x5decd
movq -0x28(%rbp), %rax
subq -0x20(%rbp), %rax
subq -0x78(%rbp), %rax
cvtsi2sd %rax, %xmm0
movsd -0x30(%rbp), %xmm2
cvtsi2sdq -0x70(%rbp), %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
cvttsd2si %xmm0, %rax
movq %rax, -0x70(%rbp)
movq -0x70(%rbp), %rax
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rax
addq $0xb0, %rsp
popq %rbp
retq
nopl (%rax)