// File: chhylp123[P]hifiasm/inter.cpp
// Function: gl_chain_flter(overlap_region_alloc*, Correct_dumy*, st_mt_t*, glchain_t*, ul_idx_t const*, double, long, long, ug_opt_t const*, unsigned int*)
int64_t gl_chain_flter(overlap_region_alloc* olist, Correct_dumy* dumy, st_mt_t *sps, glchain_t *ll, 
const ul_idx_t *uref, double diff_ec_ul, int64_t wl, int64_t ql, const ug_opt_t *uopt, uint32_t *need_phase)
{
	(*need_phase) = 1;
	uint64_t k, nw; ul_ov_t *m, *p; int64_t occ, i, ovlp, idx_n;
	ll->tk.n = ll->lo.n = 0;
	kv_ul_ov_t *idx = &(ll->lo); 
	ks_introsort_or_xe(olist->length, olist->list);
	regen_ul_ov_t_lst(uref, olist, idx);
	if(idx->n == 0) return 0;
	kv_resize(uint64_t, ll->srt.a, idx->n);
	kv_resize(uint64_t, *sps, idx->n);
	kv_resize(ul_ov_t, ll->tk, idx->n);

	occ = ed_dp_c(olist, idx, ll->tk.a, uref, uopt, G_CHAIN_BW, N_GCHAIN_RATE, ql, 75, dumy->overlapID, ll->srt.a.a, sps->a, ERROR_RATE, 0, NULL, uref->ug, 0);
	if((!occ) || (!idx->n)) return 0;
	idx_n = idx->n; p = &(idx->a[idx_n-1]);
	if(idx_n <= 1) {//one chain; nothing to do
		if(p->te - p->ts <= 1) (*need_phase) = 0;//one alignment; nothing to do
		return 0;
	}
	// fprintf(stderr, "[M::%s] qs::%u, qe::%u, ql::%ld, occ::%u\n", __func__, p->qs, p->qe, ql, p->te - p->ts);
	if(p->qe-p->qs <= (ql*0.333333)) return 0;///primary chain is too short

	i = idx_n-1; occ = p->te - p->ts;
	if(p->qe-p->qs < ql && idx_n > 1) {
		for (occ = 0; i >= 0; i--) {
			p = &(idx->a[i]);
			for (k = i + 1; k < idx->n; k++) {
				m = &(idx->a[k]);
				ovlp = ((MIN(m->qe, p->qe) > MAX(m->qs, p->qs))? (MIN(m->qe, p->qe) - MAX(m->qs, p->qs)):0);
				if(((ovlp > ((m->qe-m->qs)*0.005)) || (ovlp > ((p->qe-p->qs)*0.015))) && ovlp > 32) break;
				if((ovlp == (m->qe-m->qs)) || (ovlp == (p->qe-p->qs))) break;
			}
			if(k < idx->n) break;
			occ += p->te - p->ts;
		}
		i++;
	} 
	//all alignments are primary chains; nothing to do
	if(occ == (int64_t)olist->length) return 1;

	// if(i >= ((int64_t)idx->n)) return 0;
	nw = get_num_wins(0, ql, wl); kv_resize(uint64_t, ll->srt.a, (uint64_t)nw);
	if(filter_sec(olist, idx->a+i, idx->n-i, ll->tk.a, ll->srt.a.a, nw, wl, ql)) {
		(*need_phase) = 0;
	}
	return 1;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %rbx
subq $0xf8, %rsp
movq 0x20(%rbp), %rax
movq 0x18(%rbp), %rax
movq 0x10(%rbp), %rax
movq %rdi, -0x28(%rbp)
movq %rsi, -0x30(%rbp)
movq %rdx, -0x38(%rbp)
movq %rcx, -0x40(%rbp)
movq %r8, -0x48(%rbp)
movsd %xmm0, -0x50(%rbp)
movq %r9, -0x58(%rbp)
movq 0x20(%rbp), %rax
movl $0x1, (%rax)
movq -0x40(%rbp), %rax
movq $0x0, 0x8(%rax)
movq -0x40(%rbp), %rax
movq $0x0, 0x20(%rax)
movq -0x40(%rbp), %rax
movq %rax, -0xa0(%rbp)
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rdi
movq -0x28(%rbp), %rax
movq (%rax), %rsi
callq 0x279a00
movq -0x48(%rbp), %rdi
movq -0x28(%rbp), %rsi
movq -0xa0(%rbp), %rdx
callq 0x2ad540
movq -0xa0(%rbp), %rax
cmpq $0x0, 0x8(%rax)
jne 0x2ad8e9
movq $0x0, -0x20(%rbp)
jmp 0x2ae13e
jmp 0x2ad8eb
movq -0x40(%rbp), %rax
movq 0x50(%rax), %rax
movq -0xa0(%rbp), %rcx
cmpq 0x8(%rcx), %rax
jae 0x2ad9d2
movq -0xa0(%rbp), %rax
movq 0x8(%rax), %rcx
movq -0x40(%rbp), %rax
movq %rcx, 0x50(%rax)
movq -0x40(%rbp), %rax
movq 0x50(%rax), %rcx
addq $-0x1, %rcx
movq %rcx, 0x50(%rax)
movq -0x40(%rbp), %rax
movq 0x50(%rax), %rcx
shrq %rcx
movq -0x40(%rbp), %rax
orq 0x50(%rax), %rcx
movq %rcx, 0x50(%rax)
movq -0x40(%rbp), %rax
movq 0x50(%rax), %rcx
shrq $0x2, %rcx
movq -0x40(%rbp), %rax
orq 0x50(%rax), %rcx
movq %rcx, 0x50(%rax)
movq -0x40(%rbp), %rax
movq 0x50(%rax), %rcx
shrq $0x4, %rcx
movq -0x40(%rbp), %rax
orq 0x50(%rax), %rcx
movq %rcx, 0x50(%rax)
movq -0x40(%rbp), %rax
movq 0x50(%rax), %rcx
shrq $0x8, %rcx
movq -0x40(%rbp), %rax
orq 0x50(%rax), %rcx
movq %rcx, 0x50(%rax)
movq -0x40(%rbp), %rax
movq 0x50(%rax), %rcx
shrq $0x10, %rcx
movq -0x40(%rbp), %rax
orq 0x50(%rax), %rcx
movq %rcx, 0x50(%rax)
movq -0x40(%rbp), %rax
movq 0x50(%rax), %rcx
addq $0x1, %rcx
movq %rcx, 0x50(%rax)
movq -0x40(%rbp), %rax
movq 0x58(%rax), %rdi
movq -0x40(%rbp), %rax
movq 0x50(%rax), %rsi
shlq $0x3, %rsi
callq 0x2360
movq %rax, %rcx
movq -0x40(%rbp), %rax
movq %rcx, 0x58(%rax)
jmp 0x2ad9d4
jmp 0x2ad9d6
movq -0x38(%rbp), %rax
movq 0x8(%rax), %rax
movq -0xa0(%rbp), %rcx
cmpq 0x8(%rcx), %rax
jae 0x2adabd
movq -0xa0(%rbp), %rax
movq 0x8(%rax), %rcx
movq -0x38(%rbp), %rax
movq %rcx, 0x8(%rax)
movq -0x38(%rbp), %rax
movq 0x8(%rax), %rcx
addq $-0x1, %rcx
movq %rcx, 0x8(%rax)
movq -0x38(%rbp), %rax
movq 0x8(%rax), %rcx
shrq %rcx
movq -0x38(%rbp), %rax
orq 0x8(%rax), %rcx
movq %rcx, 0x8(%rax)
movq -0x38(%rbp), %rax
movq 0x8(%rax), %rcx
shrq $0x2, %rcx
movq -0x38(%rbp), %rax
orq 0x8(%rax), %rcx
movq %rcx, 0x8(%rax)
movq -0x38(%rbp), %rax
movq 0x8(%rax), %rcx
shrq $0x4, %rcx
movq -0x38(%rbp), %rax
orq 0x8(%rax), %rcx
movq %rcx, 0x8(%rax)
movq -0x38(%rbp), %rax
movq 0x8(%rax), %rcx
shrq $0x8, %rcx
movq -0x38(%rbp), %rax
orq 0x8(%rax), %rcx
movq %rcx, 0x8(%rax)
movq -0x38(%rbp), %rax
movq 0x8(%rax), %rcx
shrq $0x10, %rcx
movq -0x38(%rbp), %rax
orq 0x8(%rax), %rcx
movq %rcx, 0x8(%rax)
movq -0x38(%rbp), %rax
movq 0x8(%rax), %rcx
addq $0x1, %rcx
movq %rcx, 0x8(%rax)
movq -0x38(%rbp), %rax
movq 0x10(%rax), %rdi
movq -0x38(%rbp), %rax
movq 0x8(%rax), %rsi
shlq $0x3, %rsi
callq 0x2360
movq %rax, %rcx
movq -0x38(%rbp), %rax
movq %rcx, 0x10(%rax)
jmp 0x2adabf
jmp 0x2adac1
movq -0x40(%rbp), %rax
movq 0x28(%rax), %rax
movq -0xa0(%rbp), %rcx
cmpq 0x8(%rcx), %rax
jae 0x2adba5
movq -0xa0(%rbp), %rax
movq 0x8(%rax), %rcx
movq -0x40(%rbp), %rax
movq %rcx, 0x28(%rax)
movq -0x40(%rbp), %rax
movq 0x28(%rax), %rcx
addq $-0x1, %rcx
movq %rcx, 0x28(%rax)
movq -0x40(%rbp), %rax
movq 0x28(%rax), %rcx
shrq %rcx
movq -0x40(%rbp), %rax
orq 0x28(%rax), %rcx
movq %rcx, 0x28(%rax)
movq -0x40(%rbp), %rax
movq 0x28(%rax), %rcx
shrq $0x2, %rcx
movq -0x40(%rbp), %rax
orq 0x28(%rax), %rcx
movq %rcx, 0x28(%rax)
movq -0x40(%rbp), %rax
movq 0x28(%rax), %rcx
shrq $0x4, %rcx
movq -0x40(%rbp), %rax
orq 0x28(%rax), %rcx
movq %rcx, 0x28(%rax)
movq -0x40(%rbp), %rax
movq 0x28(%rax), %rcx
shrq $0x8, %rcx
movq -0x40(%rbp), %rax
orq 0x28(%rax), %rcx
movq %rcx, 0x28(%rax)
movq -0x40(%rbp), %rax
movq 0x28(%rax), %rcx
shrq $0x10, %rcx
movq -0x40(%rbp), %rax
orq 0x28(%rax), %rcx
movq %rcx, 0x28(%rax)
movq -0x40(%rbp), %rax
movq 0x28(%rax), %rcx
addq $0x1, %rcx
movq %rcx, 0x28(%rax)
movq -0x40(%rbp), %rax
movq 0x18(%rax), %rdi
movq -0x40(%rbp), %rax
imulq $0x1c, 0x28(%rax), %rsi
callq 0x2360
movq %rax, %rcx
movq -0x40(%rbp), %rax
movq %rcx, 0x18(%rax)
jmp 0x2adba7
movq -0x28(%rbp), %rdi
movq -0xa0(%rbp), %rsi
movq -0x40(%rbp), %rax
movq 0x18(%rax), %rdx
movq -0x48(%rbp), %rcx
movq 0x18(%rbp), %r8
movq 0x10(%rbp), %r14
movq -0x30(%rbp), %rax
movq 0x28(%rax), %rbx
movq -0x40(%rbp), %rax
movq 0x58(%rax), %r11
movq -0x38(%rbp), %rax
movq 0x10(%rax), %r10
movq -0x48(%rbp), %rax
movq (%rax), %rax
movl $0x10, %r9d
movsd 0xd143d(%rip), %xmm0    # 0x37f030
movsd 0xd4605(%rip), %xmm1    # 0x382200
xorl %r15d, %r15d
xorl %r15d, %r15d
movq %r14, (%rsp)
movq $0x4b, 0x8(%rsp)
movq %rbx, 0x10(%rsp)
movq %r11, 0x18(%rsp)
movq %r10, 0x20(%rsp)
movq $0x0, 0x28(%rsp)
movq $0x0, 0x30(%rsp)
movq %rax, 0x38(%rsp)
movl $0x0, 0x40(%rsp)
callq 0x2abb90
movq %rax, -0x80(%rbp)
cmpq $0x0, -0x80(%rbp)
je 0x2adc5a
movq -0xa0(%rbp), %rax
cmpq $0x0, 0x8(%rax)
jne 0x2adc67
movq $0x0, -0x20(%rbp)
jmp 0x2ae13e
movq -0xa0(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x98(%rbp)
movq -0xa0(%rbp), %rax
movq (%rax), %rax
movq -0x98(%rbp), %rcx
subq $0x1, %rcx
imulq $0x1c, %rcx, %rcx
addq %rcx, %rax
movq %rax, -0x78(%rbp)
cmpq $0x1, -0x98(%rbp)
jg 0x2adccd
movq -0x78(%rbp), %rax
movl 0x14(%rax), %eax
movq -0x78(%rbp), %rcx
subl 0x10(%rcx), %eax
cmpl $0x1, %eax
ja 0x2adcc0
movq 0x20(%rbp), %rax
movl $0x0, (%rax)
movq $0x0, -0x20(%rbp)
jmp 0x2ae13e
movq -0x78(%rbp), %rax
movl 0x4(%rax), %ecx
movl 0x8(%rax), %eax
subl %ecx, %eax
cvtsi2sd %rax, %xmm1
cvtsi2sdq 0x10(%rbp), %xmm0
movsd 0xd45dc(%rip), %xmm2    # 0x3822c8
mulsd %xmm2, %xmm0
ucomisd %xmm1, %xmm0
jb 0x2add03
movq $0x0, -0x20(%rbp)
jmp 0x2ae13e
movq -0x98(%rbp), %rax
subq $0x1, %rax
movq %rax, -0x88(%rbp)
movq -0x78(%rbp), %rax
movl 0x14(%rax), %eax
movq -0x78(%rbp), %rcx
subl 0x10(%rcx), %eax
movl %eax, %eax
movq %rax, -0x80(%rbp)
movq -0x78(%rbp), %rax
movl 0x8(%rax), %eax
movq -0x78(%rbp), %rcx
subl 0x4(%rcx), %eax
movl %eax, %eax
cmpq 0x10(%rbp), %rax
jge 0x2adfc6
cmpq $0x1, -0x98(%rbp)
jle 0x2adfc6
movq $0x0, -0x80(%rbp)
cmpq $0x0, -0x88(%rbp)
jl 0x2adfb4
movq -0xa0(%rbp), %rax
movq (%rax), %rax
imulq $0x1c, -0x88(%rbp), %rcx
addq %rcx, %rax
movq %rax, -0x78(%rbp)
movq -0x88(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x60(%rbp)
movq -0x60(%rbp), %rax
movq -0xa0(%rbp), %rcx
cmpq 0x8(%rcx), %rax
jae 0x2adf72
movq -0xa0(%rbp), %rax
movq (%rax), %rax
imulq $0x1c, -0x60(%rbp), %rcx
addq %rcx, %rax
movq %rax, -0x70(%rbp)
movq -0x70(%rbp), %rax
movl 0x8(%rax), %eax
movq -0x78(%rbp), %rcx
cmpl 0x8(%rcx), %eax
ja 0x2addd9
movq -0x70(%rbp), %rax
movl 0x8(%rax), %eax
movl %eax, -0xa4(%rbp)
jmp 0x2adde6
movq -0x78(%rbp), %rax
movl 0x8(%rax), %eax
movl %eax, -0xa4(%rbp)
movl -0xa4(%rbp), %eax
movl %eax, -0xa8(%rbp)
movq -0x70(%rbp), %rax
movl 0x4(%rax), %eax
movq -0x78(%rbp), %rcx
cmpl 0x4(%rcx), %eax
jb 0x2ade11
movq -0x70(%rbp), %rax
movl 0x4(%rax), %eax
movl %eax, -0xac(%rbp)
jmp 0x2ade1e
movq -0x78(%rbp), %rax
movl 0x4(%rax), %eax
movl %eax, -0xac(%rbp)
movl -0xa8(%rbp), %eax
movl -0xac(%rbp), %ecx
cmpl %ecx, %eax
jbe 0x2adea8
movq -0x70(%rbp), %rax
movl 0x8(%rax), %eax
movq -0x78(%rbp), %rcx
cmpl 0x8(%rcx), %eax
ja 0x2ade4d
movq -0x70(%rbp), %rax
movl 0x8(%rax), %eax
movl %eax, -0xb0(%rbp)
jmp 0x2ade5a
movq -0x78(%rbp), %rax
movl 0x8(%rax), %eax
movl %eax, -0xb0(%rbp)
movl -0xb0(%rbp), %eax
movl %eax, -0xb4(%rbp)
movq -0x70(%rbp), %rax
movl 0x4(%rax), %eax
movq -0x78(%rbp), %rcx
cmpl 0x4(%rcx), %eax
jb 0x2ade85
movq -0x70(%rbp), %rax
movl 0x4(%rax), %eax
movl %eax, -0xb8(%rbp)
jmp 0x2ade92
movq -0x78(%rbp), %rax
movl 0x4(%rax), %eax
movl %eax, -0xb8(%rbp)
movl -0xb4(%rbp), %eax
movl -0xb8(%rbp), %ecx
subl %ecx, %eax
movl %eax, -0xbc(%rbp)
jmp 0x2adeb2
xorl %eax, %eax
movl %eax, -0xbc(%rbp)
jmp 0x2adeb2
movl -0xbc(%rbp), %eax
movl %eax, %eax
movq %rax, -0x90(%rbp)
cvtsi2sdq -0x90(%rbp), %xmm0
movq -0x70(%rbp), %rax
movl 0x4(%rax), %ecx
movl 0x8(%rax), %eax
subl %ecx, %eax
cvtsi2sd %rax, %xmm1
movsd 0xddfc5(%rip), %xmm2    # 0x38bea8
mulsd %xmm2, %xmm1
ucomisd %xmm1, %xmm0
ja 0x2adf19
cvtsi2sdq -0x90(%rbp), %xmm0
movq -0x78(%rbp), %rax
movl 0x4(%rax), %ecx
movl 0x8(%rax), %eax
subl %ecx, %eax
cvtsi2sd %rax, %xmm1
movsd 0xe0249(%rip), %xmm2    # 0x38e158
mulsd %xmm2, %xmm1
ucomisd %xmm1, %xmm0
jbe 0x2adf25
cmpq $0x20, -0x90(%rbp)
jle 0x2adf25
jmp 0x2adf72
movq -0x90(%rbp), %rax
movq -0x70(%rbp), %rcx
movl 0x8(%rcx), %ecx
movq -0x70(%rbp), %rdx
subl 0x4(%rdx), %ecx
movl %ecx, %ecx
cmpq %rcx, %rax
je 0x2adf5d
movq -0x90(%rbp), %rax
movq -0x78(%rbp), %rcx
movl 0x8(%rcx), %ecx
movq -0x78(%rbp), %rdx
subl 0x4(%rdx), %ecx
movl %ecx, %ecx
cmpq %rcx, %rax
jne 0x2adf5f
jmp 0x2adf72
jmp 0x2adf61
movq -0x60(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x60(%rbp)
jmp 0x2add8f
movq -0x60(%rbp), %rax
movq -0xa0(%rbp), %rcx
cmpq 0x8(%rcx), %rax
jae 0x2adf85
jmp 0x2adfb4
movq -0x78(%rbp), %rax
movl 0x14(%rax), %eax
movq -0x78(%rbp), %rcx
subl 0x10(%rcx), %eax
movl %eax, %eax
addq -0x80(%rbp), %rax
movq %rax, -0x80(%rbp)
movq -0x88(%rbp), %rax
addq $-0x1, %rax
movq %rax, -0x88(%rbp)
jmp 0x2add59
movq -0x88(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x88(%rbp)
movq -0x80(%rbp), %rax
movq -0x28(%rbp), %rcx
cmpq 0x10(%rcx), %rax
jne 0x2adfe1
movq $0x1, -0x20(%rbp)
jmp 0x2ae13e
movq 0x10(%rbp), %rsi
movq -0x58(%rbp), %rdx
xorl %eax, %eax
movl %eax, %edi
callq 0x340c0
movq %rax, -0x68(%rbp)
movq -0x40(%rbp), %rax
movq 0x50(%rax), %rax
cmpq -0x68(%rbp), %rax
jae 0x2ae0cf
movq -0x68(%rbp), %rcx
movq -0x40(%rbp), %rax
movq %rcx, 0x50(%rax)
movq -0x40(%rbp), %rax
movq 0x50(%rax), %rcx
addq $-0x1, %rcx
movq %rcx, 0x50(%rax)
movq -0x40(%rbp), %rax
movq 0x50(%rax), %rcx
shrq %rcx
movq -0x40(%rbp), %rax
orq 0x50(%rax), %rcx
movq %rcx, 0x50(%rax)
movq -0x40(%rbp), %rax
movq 0x50(%rax), %rcx
shrq $0x2, %rcx
movq -0x40(%rbp), %rax
orq 0x50(%rax), %rcx
movq %rcx, 0x50(%rax)
movq -0x40(%rbp), %rax
movq 0x50(%rax), %rcx
shrq $0x4, %rcx
movq -0x40(%rbp), %rax
orq 0x50(%rax), %rcx
movq %rcx, 0x50(%rax)
movq -0x40(%rbp), %rax
movq 0x50(%rax), %rcx
shrq $0x8, %rcx
movq -0x40(%rbp), %rax
orq 0x50(%rax), %rcx
movq %rcx, 0x50(%rax)
movq -0x40(%rbp), %rax
movq 0x50(%rax), %rcx
shrq $0x10, %rcx
movq -0x40(%rbp), %rax
orq 0x50(%rax), %rcx
movq %rcx, 0x50(%rax)
movq -0x40(%rbp), %rax
movq 0x50(%rax), %rcx
addq $0x1, %rcx
movq %rcx, 0x50(%rax)
movq -0x40(%rbp), %rax
movq 0x58(%rax), %rdi
movq -0x40(%rbp), %rax
movq 0x50(%rax), %rsi
shlq $0x3, %rsi
callq 0x2360
movq %rax, %rcx
movq -0x40(%rbp), %rax
movq %rcx, 0x58(%rax)
jmp 0x2ae0d1
movq -0x28(%rbp), %rdi
movq -0xa0(%rbp), %rax
movq (%rax), %rsi
imulq $0x1c, -0x88(%rbp), %rax
addq %rax, %rsi
movq -0xa0(%rbp), %rax
movq 0x8(%rax), %rdx
subq -0x88(%rbp), %rdx
movq -0x40(%rbp), %rax
movq 0x18(%rax), %rcx
movq -0x40(%rbp), %rax
movq 0x58(%rax), %r8
movq -0x68(%rbp), %r9
movq -0x58(%rbp), %r10
movq 0x10(%rbp), %rax
movq %r10, (%rsp)
movq %rax, 0x8(%rsp)
callq 0x2ad0e0
cmpq $0x0, %rax
je 0x2ae136
movq 0x20(%rbp), %rax
movl $0x0, (%rax)
movq $0x1, -0x20(%rbp)
movq -0x20(%rbp), %rax
addq $0xf8, %rsp
popq %rbx
popq %r14
popq %r15
popq %rbp
retq