// File: chhylp123[P]hifiasm/hic.cpp
// Function: weight_kv_u_trans(ha_ug_index*, kvec_pe_hit*, hc_links*, bubble_type*, kv_u_trans_t*, trans_idx*, int)
void weight_kv_u_trans(ha_ug_index* idx, kvec_pe_hit* hits, hc_links* link, bubble_type* bub, 
kv_u_trans_t *ta, trans_idx* dis, int sc_weight)
{
    uint64_t k, i, shif = 64 - idx->uID_bits, beg, end, t_d;
    u_trans_t *e1 = NULL, *e2 = NULL;
    long double weight;
    double *sw = NULL;
    u_trans_t *p = NULL;
    uint32_t is_cc, ii1, ii2;

    for (i = 0, ta->idx.n = ta->n = 0; i < link->a.n; i++)
    {
        for (k = 0; k < link->a.a[i].e.n; k++)
        {
            if(link->a.a[i].e.a[k].del) continue;
            if(IF_HOM(i, *bub)) continue;
            if(IF_HOM(link->a.a[i].e.a[k].uID, *bub)) continue;
            if(i == link->a.a[i].e.a[k].uID) continue;

            kv_pushp(u_trans_t, *ta, &p);
            memset(p, 0, sizeof(u_trans_t));
            p->qn = i; p->tn = link->a.a[i].e.a[k].uID;
            p->nw = 0; p->occ = 0;
        }
    }
    kt_u_trans_t_idx(ta, idx->ug->g->n_seq);
    if(sc_weight) {
        k = ta->n*3;
        MALLOC(sw, k);
        for (i = 0; i < k; i++) sw[i] = 0;
    }


    for (k = 0; k < hits->a.n; ++k) 
    {
        beg = ((hits->a.a[k].s<<1)>>shif);
        end = ((hits->a.a[k].e<<1)>>shif);

        if(beg == end) continue;
        if(IF_HOM(beg, *bub)) continue;
        if(IF_HOM(end, *bub)) continue;
        if(is_hom_hit(hits->a.a[k])) continue;
        
        t_d = get_hic_distance(&(hits->a.a[k]), link, idx, &is_cc);
        // if(t_d == (uint64_t)-1) continue;
        // if(t_d == (uint64_t)-1 && is_cc == 0) continue;
        // if(t_d == (uint64_t)-1 && !dis) continue;

        get_u_trans_spec_idx(ta, beg, end, &e1, NULL, &ii1);
        get_u_trans_spec_idx(ta, end, beg, &e2, NULL, &ii2);

        if(e1 == NULL || e2 == NULL) continue;
        weight = 1;
        if(dis) weight = get_trans_weight_advance(idx, t_d, dis);
        
        if(sc_weight){
            i = hic_sc_type(idx, hits, k);
            if(i == 0){
                e1->nw -= weight; e2->nw -= weight;
            }
            else{
                i--;
                sw[(ii1*3)+i] -= weight;
                sw[(ii2*3)+i] -= weight;
            }
        } else{
            e1->nw -= weight; e2->nw -= weight; 
        }
        e1->occ++; e2->occ++;
    }    

    if(sc_weight) {
        for (i = 0; i < ta->n; ++i){
            if(ta->a[i].nw > sw[(i*3)]) ta->a[i].nw = sw[(i*3)];
            if(ta->a[i].nw > sw[(i*3)+1]) ta->a[i].nw = sw[(i*3)+1];
            if(ta->a[i].nw > sw[(i*3)+2]) ta->a[i].nw = sw[(i*3)+2];
            ta->a[i].nw *= 2/**4**/;
        }
        free(sw);
    }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xd0, %rsp
movl 0x10(%rbp), %eax
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq %rcx, -0x20(%rbp)
movq %r8, -0x28(%rbp)
movq %r9, -0x30(%rbp)
movq -0x8(%rbp), %rcx
movl $0x40, %eax
subq 0x18(%rcx), %rax
movq %rax, -0x48(%rbp)
movq $0x0, -0x68(%rbp)
movq $0x0, -0x70(%rbp)
movq $0x0, -0x88(%rbp)
movq $0x0, -0x90(%rbp)
movq $0x0, -0x40(%rbp)
movq -0x28(%rbp), %rax
movq $0x0, (%rax)
movq -0x28(%rbp), %rax
movq $0x0, 0x18(%rax)
movq -0x40(%rbp), %rax
movq -0x18(%rbp), %rcx
cmpq (%rcx), %rax
jae 0x201c07
movq $0x0, -0x38(%rbp)
movq -0x38(%rbp), %rax
movq -0x18(%rbp), %rcx
movq 0x10(%rcx), %rcx
imulq $0x30, -0x40(%rbp), %rdx
addq %rdx, %rcx
cmpq (%rcx), %rax
jae 0x201bf4
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rax
imulq $0x30, -0x40(%rbp), %rcx
addq %rcx, %rax
movq 0x10(%rax), %rax
imulq $0x28, -0x38(%rbp), %rcx
addq %rcx, %rax
movb 0x18(%rax), %al
shrb $0x7, %al
cmpb $0x0, %al
je 0x201a4d
jmp 0x201be3
movq -0x20(%rbp), %rax
movq (%rax), %rax
movq -0x40(%rbp), %rcx
movl (%rax,%rcx,4), %eax
movq -0x20(%rbp), %rcx
movq 0x80(%rcx), %rcx
addq $0x1, %rcx
cmpq %rcx, %rax
jbe 0x201a74
jmp 0x201be3
movq -0x20(%rbp), %rax
movq (%rax), %rax
movq -0x18(%rbp), %rcx
movq 0x10(%rcx), %rcx
imulq $0x30, -0x40(%rbp), %rdx
addq %rdx, %rcx
movq 0x10(%rcx), %rcx
imulq $0x28, -0x38(%rbp), %rdx
addq %rdx, %rcx
movl 0x8(%rcx), %ecx
movl (%rax,%rcx,4), %eax
movq -0x20(%rbp), %rcx
movq 0x80(%rcx), %rcx
addq $0x1, %rcx
cmpq %rcx, %rax
jbe 0x201ab6
jmp 0x201be3
movq -0x40(%rbp), %rax
movq -0x18(%rbp), %rcx
movq 0x10(%rcx), %rcx
imulq $0x30, -0x40(%rbp), %rdx
addq %rdx, %rcx
movq 0x10(%rcx), %rcx
imulq $0x28, -0x38(%rbp), %rdx
addq %rdx, %rcx
movl 0x8(%rcx), %ecx
cmpq %rcx, %rax
jne 0x201ae3
jmp 0x201be3
jmp 0x201ae5
movq -0x28(%rbp), %rax
movq (%rax), %rax
movq -0x28(%rbp), %rcx
cmpq 0x8(%rcx), %rax
jne 0x201b53
movq -0x28(%rbp), %rax
cmpq $0x0, 0x8(%rax)
je 0x201b15
movq -0x28(%rbp), %rax
movq 0x8(%rax), %rax
shlq %rax
movq %rax, -0xc8(%rbp)
jmp 0x201b23
movl $0x2, %eax
movq %rax, -0xc8(%rbp)
jmp 0x201b23
movq -0xc8(%rbp), %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x8(%rax)
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rdi
movq -0x28(%rbp), %rax
imulq $0x30, 0x8(%rax), %rsi
callq 0x2360
movq %rax, %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x10(%rax)
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movq -0x28(%rbp), %rdx
movq (%rdx), %rcx
movq %rcx, %rsi
addq $0x1, %rsi
movq %rsi, (%rdx)
imulq $0x30, %rcx, %rcx
addq %rcx, %rax
movq %rax, -0x90(%rbp)
movq -0x90(%rbp), %rdi
xorl %esi, %esi
movl $0x30, %edx
callq 0x2100
movq -0x40(%rbp), %rax
movl %eax, %ecx
movq -0x90(%rbp), %rax
movl %ecx, 0x8(%rax)
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rax
imulq $0x30, -0x40(%rbp), %rcx
addq %rcx, %rax
movq 0x10(%rax), %rax
imulq $0x28, -0x38(%rbp), %rcx
addq %rcx, %rax
movl 0x8(%rax), %ecx
movq -0x90(%rbp), %rax
movl %ecx, 0x14(%rax)
movq -0x90(%rbp), %rax
xorps %xmm0, %xmm0
movsd %xmm0, 0x20(%rax)
movq -0x90(%rbp), %rax
movl $0x0, 0x18(%rax)
movq -0x38(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x38(%rbp)
jmp 0x201a05
jmp 0x201bf6
movq -0x40(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x40(%rbp)
jmp 0x2019ec
movq -0x28(%rbp), %rdi
movq -0x8(%rbp), %rax
movq (%rax), %rax
movq 0x18(%rax), %rax
movl 0x14(%rax), %esi
andl $0x7fffffff, %esi       # imm = 0x7FFFFFFF
callq 0x104540
cmpl $0x0, 0x10(%rbp)
je 0x201c7f
movq -0x28(%rbp), %rax
imulq $0x3, (%rax), %rax
movq %rax, -0x38(%rbp)
movq -0x38(%rbp), %rdi
shlq $0x3, %rdi
callq 0x2270
movq %rax, -0x88(%rbp)
movq $0x0, -0x40(%rbp)
movq -0x40(%rbp), %rax
cmpq -0x38(%rbp), %rax
jae 0x201c7d
movq -0x88(%rbp), %rax
movq -0x40(%rbp), %rcx
xorps %xmm0, %xmm0
movsd %xmm0, (%rax,%rcx,8)
movq -0x40(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x40(%rbp)
jmp 0x201c52
jmp 0x201c7f
movq $0x0, -0x38(%rbp)
movq -0x38(%rbp), %rax
movq -0x10(%rbp), %rcx
cmpq (%rcx), %rax
jae 0x201f2e
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq -0x38(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
movq (%rax), %rax
shlq %rax
movq -0x48(%rbp), %rcx
shrq %cl, %rax
movq %rax, -0x50(%rbp)
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq -0x38(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
movq 0x8(%rax), %rax
shlq %rax
movq -0x48(%rbp), %rcx
shrq %cl, %rax
movq %rax, -0x58(%rbp)
movq -0x50(%rbp), %rax
cmpq -0x58(%rbp), %rax
jne 0x201cf0
jmp 0x201f1d
movq -0x20(%rbp), %rax
movq (%rax), %rax
movq -0x50(%rbp), %rcx
movl (%rax,%rcx,4), %eax
movq -0x20(%rbp), %rcx
movq 0x80(%rcx), %rcx
addq $0x1, %rcx
cmpq %rcx, %rax
jbe 0x201d17
jmp 0x201f1d
movq -0x20(%rbp), %rax
movq (%rax), %rax
movq -0x58(%rbp), %rcx
movl (%rax,%rcx,4), %eax
movq -0x20(%rbp), %rcx
movq 0x80(%rcx), %rcx
addq $0x1, %rcx
cmpq %rcx, %rax
jbe 0x201d3e
jmp 0x201f1d
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq -0x38(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
cmpq $-0x1, 0x10(%rax)
jne 0x201d5d
jmp 0x201f1d
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rdi
movq -0x38(%rbp), %rax
shlq $0x5, %rax
addq %rax, %rdi
movq -0x18(%rbp), %rsi
movq -0x8(%rbp), %rdx
leaq -0x94(%rbp), %rcx
callq 0x1db730
movq %rax, -0x60(%rbp)
movq -0x28(%rbp), %rdi
movq -0x50(%rbp), %rax
movl %eax, %esi
movq -0x58(%rbp), %rax
movl %eax, %edx
leaq -0x68(%rbp), %rcx
xorl %eax, %eax
movl %eax, %r8d
leaq -0x98(%rbp), %r9
callq 0x2015e0
movq -0x28(%rbp), %rdi
movq -0x58(%rbp), %rax
movl %eax, %esi
movq -0x50(%rbp), %rax
movl %eax, %edx
leaq -0x70(%rbp), %rcx
xorl %eax, %eax
movl %eax, %r8d
leaq -0x9c(%rbp), %r9
callq 0x2015e0
cmpq $0x0, -0x68(%rbp)
je 0x201de0
cmpq $0x0, -0x70(%rbp)
jne 0x201de5
jmp 0x201f1d
fld1
fstpt -0x80(%rbp)
cmpq $0x0, -0x30(%rbp)
je 0x201e13
movq -0x8(%rbp), %rdi
movq -0x60(%rbp), %rsi
movq -0x30(%rbp), %rdx
callq 0x2148a0
movsd %xmm0, -0xa8(%rbp)
fldl -0xa8(%rbp)
fstpt -0x80(%rbp)
cmpl $0x0, 0x10(%rbp)
je 0x201ed5
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x38(%rbp), %rdx
callq 0x201750
cltq
movq %rax, -0x40(%rbp)
cmpq $0x0, -0x40(%rbp)
jne 0x201e6b
fldt -0x80(%rbp)
movq -0x68(%rbp), %rax
fldl 0x20(%rax)
fsubp %st, %st(1)
fstpl 0x20(%rax)
fldt -0x80(%rbp)
movq -0x70(%rbp), %rax
fldl 0x20(%rax)
fsubp %st, %st(1)
fstpl -0xc0(%rbp)
movsd -0xc0(%rbp), %xmm0
movsd %xmm0, 0x20(%rax)
jmp 0x201ed3
movq -0x40(%rbp), %rax
decq %rax
movq %rax, -0x40(%rbp)
fldt -0x80(%rbp)
movq -0x88(%rbp), %rax
movl -0x98(%rbp), %edx
movl %edx, %ecx
leal (%rcx,%rcx,2), %ecx
movq -0x40(%rbp), %rdx
addq %rdx, %rcx
fldl (%rax,%rcx,8)
fsubp %st, %st(1)
fstpl (%rax,%rcx,8)
fldt -0x80(%rbp)
movq -0x88(%rbp), %rax
movl -0x9c(%rbp), %edx
movl %edx, %ecx
leal (%rcx,%rcx,2), %ecx
movl %ecx, %edx
movq -0x40(%rbp), %rcx
addq %rcx, %rdx
movq %rdx, %rcx
fldl (%rax,%rdx,8)
fsubp %st, %st(1)
fstpl -0xb8(%rbp)
movsd -0xb8(%rbp), %xmm0
movsd %xmm0, (%rax,%rcx,8)
jmp 0x201f03
fldt -0x80(%rbp)
movq -0x68(%rbp), %rax
fldl 0x20(%rax)
fsubp %st, %st(1)
fstpl 0x20(%rax)
fldt -0x80(%rbp)
movq -0x70(%rbp), %rax
fldl 0x20(%rax)
fsubp %st, %st(1)
fstpl -0xb0(%rbp)
movsd -0xb0(%rbp), %xmm0
movsd %xmm0, 0x20(%rax)
movq -0x68(%rbp), %rax
movl 0x18(%rax), %ecx
addl $0x1, %ecx
movl %ecx, 0x18(%rax)
movq -0x70(%rbp), %rax
movl 0x18(%rax), %ecx
addl $0x1, %ecx
movl %ecx, 0x18(%rax)
movq -0x38(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x38(%rbp)
jmp 0x201c87
cmpl $0x0, 0x10(%rbp)
je 0x20207e
movq $0x0, -0x40(%rbp)
movq -0x40(%rbp), %rax
movq -0x28(%rbp), %rcx
cmpq (%rcx), %rax
jae 0x202072
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
imulq $0x30, -0x40(%rbp), %rcx
addq %rcx, %rax
movsd 0x20(%rax), %xmm0
movq -0x88(%rbp), %rax
imulq $0x3, -0x40(%rbp), %rcx
ucomisd (%rax,%rcx,8), %xmm0
jbe 0x201f9f
movq -0x88(%rbp), %rax
imulq $0x3, -0x40(%rbp), %rcx
movsd (%rax,%rcx,8), %xmm0
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
imulq $0x30, -0x40(%rbp), %rcx
addq %rcx, %rax
movsd %xmm0, 0x20(%rax)
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
imulq $0x30, -0x40(%rbp), %rcx
addq %rcx, %rax
movsd 0x20(%rax), %xmm0
movq -0x88(%rbp), %rax
imulq $0x3, -0x40(%rbp), %rcx
ucomisd 0x8(%rax,%rcx,8), %xmm0
jbe 0x201fef
movq -0x88(%rbp), %rax
imulq $0x3, -0x40(%rbp), %rcx
movsd 0x8(%rax,%rcx,8), %xmm0
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
imulq $0x30, -0x40(%rbp), %rcx
addq %rcx, %rax
movsd %xmm0, 0x20(%rax)
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
imulq $0x30, -0x40(%rbp), %rcx
addq %rcx, %rax
movsd 0x20(%rax), %xmm0
movq -0x88(%rbp), %rax
imulq $0x3, -0x40(%rbp), %rcx
ucomisd 0x10(%rax,%rcx,8), %xmm0
jbe 0x20203f
movq -0x88(%rbp), %rax
imulq $0x3, -0x40(%rbp), %rcx
movsd 0x10(%rax,%rcx,8), %xmm0
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
imulq $0x30, -0x40(%rbp), %rcx
addq %rcx, %rax
movsd %xmm0, 0x20(%rax)
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
imulq $0x30, -0x40(%rbp), %rcx
addq %rcx, %rax
movsd 0x180291(%rip), %xmm0   # 0x3822e8
mulsd 0x20(%rax), %xmm0
movsd %xmm0, 0x20(%rax)
movq -0x40(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x40(%rbp)
jmp 0x201f40
movq -0x88(%rbp), %rdi
callq 0x2210
addq $0xd0, %rsp
popq %rbp
retq
nopw (%rax,%rax)