// File: icemiliang[P]vot/src/votx/otx.cc
// Function: votx::OTX::update_dirac()
bool OTX::update_dirac() {
        if (vFlagVerb || vFlagDebug) { std::cout << "updating dirac... " << std::endl; }
        int converge = true;
        // Create a new double array to replace the old one.
        for (auto d : vDiracXs) {
            // If index set does not change, no need to update.
            if (!d->update_flag()) { if (vFlagDebug) d->print(); continue; }

            double* coor = new double[d->dim()];
            std::fill(&coor[0], &coor[d->dim()], 0.0);
            std::unordered_set<int>& tmpSet = d->set();
            for (auto idx : tmpSet) for (int i = 0; i < vDim; i++) 
                coor[i] += (*vEmpiricalXs[idx])[i]*vEmpiricalXs[idx]->mass();

            d->update_coor(*coor);
            *d /= d->mass();

            if (vFlagDebug) d->print();
            converge = false;
        }
        // 0 means no dirac points have been updated.
        return converge;
    }

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x90, %rsp
movq %rdi, -0x8(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0x70(%rbp)
testb $0x1, 0x70(%rax)
jne 0x1f257
movq -0x70(%rbp), %rax
testb $0x1, 0x71(%rax)
je 0x1f279
movq 0x17d4a(%rip), %rdi     # 0x36fa8
leaq 0x6ce4(%rip), %rsi      # 0x25f49
callq 0x9480
movq %rax, %rdi
movq 0x17cd4(%rip), %rsi     # 0x36f48
callq 0x94d0
movq -0x70(%rbp), %rax
movl $0x1, -0xc(%rbp)
movq %rax, -0x18(%rbp)
movq -0x18(%rbp), %rdi
callq 0x205c0
movq %rax, -0x20(%rbp)
movq -0x18(%rbp), %rdi
callq 0x205f0
movq %rax, -0x28(%rbp)
leaq -0x20(%rbp), %rdi
leaq -0x28(%rbp), %rsi
callq 0x20620
testb $0x1, %al
jne 0x1f2b8
jmp 0x1f489
leaq -0x20(%rbp), %rdi
callq 0x20660
movq (%rax), %rax
movq %rax, -0x30(%rbp)
movq -0x30(%rbp), %rdi
callq 0x207c0
testb $0x1, %al
jne 0x1f2ed
movq -0x70(%rbp), %rax
testb $0x1, 0x71(%rax)
je 0x1f2e8
movq -0x30(%rbp), %rdi
callq 0x20800
jmp 0x1f47b
movq -0x30(%rbp), %rdi
callq 0x20950
cltq
movl $0x8, %ecx
mulq %rcx
movq %rax, %rdi
seto %cl
movq $-0x1, %rax
testb $0x1, %cl
cmovneq %rax, %rdi
callq 0x9030
movq %rax, -0x38(%rbp)
movq -0x38(%rbp), %rax
movq %rax, -0x78(%rbp)
movq -0x38(%rbp), %rax
movq %rax, -0x80(%rbp)
movq -0x30(%rbp), %rdi
callq 0x20950
movq -0x80(%rbp), %rsi
movq -0x78(%rbp), %rdi
cltq
shlq $0x3, %rax
addq %rax, %rsi
xorps %xmm0, %xmm0
movsd %xmm0, -0x40(%rbp)
leaq -0x40(%rbp), %rdx
callq 0x20970
movq -0x30(%rbp), %rdi
callq 0x209a0
movq %rax, -0x48(%rbp)
movq -0x48(%rbp), %rax
movq %rax, -0x50(%rbp)
movq -0x50(%rbp), %rdi
callq 0x209c0
movq %rax, -0x58(%rbp)
movq -0x50(%rbp), %rdi
callq 0x209f0
movq %rax, -0x60(%rbp)
leaq -0x58(%rbp), %rdi
leaq -0x60(%rbp), %rsi
callq 0x20a20
testb $0x1, %al
jne 0x1f39d
jmp 0x1f442
leaq -0x58(%rbp), %rdi
callq 0x20a50
movl (%rax), %eax
movl %eax, -0x64(%rbp)
movl $0x0, -0x68(%rbp)
movq -0x70(%rbp), %rcx
movl -0x68(%rbp), %eax
cmpl 0x84(%rcx), %eax
jge 0x1f432
movq -0x70(%rbp), %rdi
addq $0x18, %rdi
movslq -0x64(%rbp), %rsi
callq 0x20a80
movq (%rax), %rdi
movl -0x68(%rbp), %esi
callq 0x20aa0
movq -0x70(%rbp), %rdi
movsd (%rax), %xmm0
movsd %xmm0, -0x88(%rbp)
addq $0x18, %rdi
movslq -0x64(%rbp), %rsi
callq 0x20a80
movq (%rax), %rdi
callq 0x20780
movaps %xmm0, %xmm2
movsd -0x88(%rbp), %xmm0
movq -0x38(%rbp), %rax
movslq -0x68(%rbp), %rcx
movsd (%rax,%rcx,8), %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, (%rax,%rcx,8)
movl -0x68(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x68(%rbp)
jmp 0x1f3b2
jmp 0x1f434
leaq -0x58(%rbp), %rdi
callq 0x20b60
jmp 0x1f387
movq -0x30(%rbp), %rdi
movq -0x38(%rbp), %rsi
callq 0x20b90
movq -0x30(%rbp), %rdi
callq 0x20bd0
movq -0x30(%rbp), %rdi
callq 0x20bf0
movq -0x70(%rbp), %rax
testb $0x1, 0x71(%rax)
je 0x1f474
movq -0x30(%rbp), %rdi
callq 0x20800
movl $0x0, -0xc(%rbp)
leaq -0x20(%rbp), %rdi
callq 0x206a0
jmp 0x1f2a2
cmpl $0x0, -0xc(%rbp)
setne %al
andb $0x1, %al
addq $0x90, %rsp
popq %rbp
retq
nopl (%rax,%rax)