// File: canzarlab[P]Trajan/src/BnG.cpp
// Function: GenericBnBSolver::EvalBranch(BnBNode*)
vector<BnBNode*>* GenericBnBSolver::EvalBranch(BnBNode* node)
{
    vector<pair<size_t, size_t>> vp;
    size_t p = 0;

    for (size_t i = 0; i < t1.GetNumNodes(); ++i)
        for (size_t j = 0; j < t2.GetNumNodes(); ++j)
            if (K[i][j] != -1 && IsVarFrac(node->sol(K[i][j])) && !node->IsVarFixed(K[i][j]))                
                vp.emplace_back(i, j);                

    sort(vp.begin(), vp.end(), [this, node](pair<size_t, size_t>& p, pair<size_t, size_t>& q)
    {
        return VarScore(K[p.first][p.second], node) > VarScore(K[q.first][q.second], node);  
    });

    for (int i = 0; !p && i < vp.size(); ++i)
    {
        bool flag = 1;
        for (size_t k = 0; flag && k < t1.GetNumNodes(); ++k)          
            for (size_t j = 0; flag && j < t2.GetNumNodes(); ++j)
                if (K[k][j] != -1 && node->IsVarFixed(K[k][j]) && node->var_ub(K[k][j]) != 0)                              
                    flag = IsNotInConflict(vp[i].first, k, vp[i].second, j);                    
        if (flag) p = 1 + K[vp[i].first][vp[i].second];
    }

    if (vp.size())
    {
        vector<BnBNode*>* V = new vector<BnBNode*>;
        bool b0 = !p; 
        p = (b0) ? K[vp[0].first][vp[0].second] : p - 1; 
        if (CheckFix(node->sol(p)))
        {
            if (!b0) V->push_back(MakeNode(node, p, 1));
            V->push_back(MakeNode(node, p, 0));        
        }
        else
        {
            V->push_back(MakeNode(node, p, 0));        
            if (!b0) V->push_back(MakeNode(node, p, 1));
        }
        return V;
    }

    return nullptr;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x200, %rsp            # imm = 0x200
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0xd0(%rbp)
leaq -0x30(%rbp), %rdi
callq 0xcefd0
movq $0x0, -0x38(%rbp)
movq $0x0, -0x40(%rbp)
movq -0xd0(%rbp), %rax
movq -0x40(%rbp), %rcx
movq %rcx, -0xe0(%rbp)
movq 0x30(%rax), %rdi
callq 0xa8e00
movl %eax, -0xd4(%rbp)
jmp 0xd3e8a
movq -0xe0(%rbp), %rax
movl -0xd4(%rbp), %ecx
movslq %ecx, %rcx
cmpq %rcx, %rax
jae 0xd4035
movq $0x0, -0x58(%rbp)
movq -0xd0(%rbp), %rax
movq -0x58(%rbp), %rcx
movq %rcx, -0xf0(%rbp)
movq 0x38(%rax), %rdi
callq 0xa8e00
movl %eax, -0xe4(%rbp)
jmp 0xd3ece
movq -0xf0(%rbp), %rax
movl -0xe4(%rbp), %ecx
movslq %ecx, %rcx
cmpq %rcx, %rax
jae 0xd4022
movq -0xd0(%rbp), %rdi
addq $0xe0, %rdi
movq -0x40(%rbp), %rsi
callq 0x993b0
movq %rax, %rdi
movq -0x58(%rbp), %rsi
callq 0x145d0
cmpl $-0x1, (%rax)
je 0xd400f
movq -0xd0(%rbp), %rdi
movq -0x18(%rbp), %rax
addq $0x50, %rax
movq %rax, -0x100(%rbp)
addq $0xe0, %rdi
movq -0x40(%rbp), %rsi
callq 0x993b0
movq %rax, %rdi
movq -0x58(%rbp), %rsi
callq 0x145d0
movq -0x100(%rbp), %rdi
movslq (%rax), %rsi
callq 0x145f0
movq %rax, -0xf8(%rbp)
jmp 0xd3f5d
movq -0xd0(%rbp), %rdi
movq -0xf8(%rbp), %rax
movsd (%rax), %xmm0
movq (%rdi), %rax
movq 0x60(%rax), %rax
callq *%rax
movb %al, -0x101(%rbp)
jmp 0xd3f80
movb -0x101(%rbp), %al
testb $0x1, %al
jne 0xd3f8f
jmp 0xd400f
movq -0xd0(%rbp), %rdi
movq -0x18(%rbp), %rax
movq %rax, -0x110(%rbp)
addq $0xe0, %rdi
movq -0x40(%rbp), %rsi
callq 0x993b0
movq %rax, %rdi
movq -0x58(%rbp), %rsi
callq 0x145d0
movq -0x110(%rbp), %rdi
movslq (%rax), %rsi
callq 0xd2e90
movb %al, -0x102(%rbp)
jmp 0xd3fd4
movb -0x102(%rbp), %al
testb $0x1, %al
jne 0xd400f
jmp 0xd3fe0
leaq -0x30(%rbp), %rdi
leaq -0x40(%rbp), %rsi
leaq -0x58(%rbp), %rdx
callq 0xceff0
jmp 0xd3ff3
jmp 0xd400f
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
leaq -0x30(%rbp), %rdi
callq 0xcf110
jmp 0xd4690
jmp 0xd4011
movq -0x58(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x58(%rbp)
jmp 0xd3eab
jmp 0xd4024
movq -0x40(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x40(%rbp)
jmp 0xd3e67
leaq -0x30(%rbp), %rdi
movq %rdi, -0x118(%rbp)
callq 0xcf070
movq -0x118(%rbp), %rdi
movq %rax, -0x60(%rbp)
callq 0xcf0a0
movq %rax, %rcx
movq -0xd0(%rbp), %rax
movq %rcx, -0x68(%rbp)
movq %rax, -0x78(%rbp)
movq -0x18(%rbp), %rax
movq %rax, -0x70(%rbp)
movq -0x60(%rbp), %rdi
movq -0x68(%rbp), %rsi
movq -0x78(%rbp), %rdx
movq -0x70(%rbp), %rcx
callq 0xd46a0
jmp 0xd4086
movl $0x0, -0x7c(%rbp)
xorl %eax, %eax
cmpq $0x0, -0x38(%rbp)
movb %al, -0x119(%rbp)
jne 0xd40c6
movslq -0x7c(%rbp), %rax
movq %rax, -0x128(%rbp)
leaq -0x30(%rbp), %rdi
callq 0xcf0d0
movq %rax, %rcx
movq -0x128(%rbp), %rax
cmpq %rcx, %rax
setb %al
movb %al, -0x119(%rbp)
movb -0x119(%rbp), %al
testb $0x1, %al
jne 0xd40d5
jmp 0xd43b5
movb $0x1, -0x7d(%rbp)
movq $0x0, -0x88(%rbp)
xorl %eax, %eax
testb $0x1, -0x7d(%rbp)
movb %al, -0x129(%rbp)
je 0xd4134
movq -0xd0(%rbp), %rax
movq -0x88(%rbp), %rcx
movq %rcx, -0x138(%rbp)
movq 0x30(%rax), %rdi
callq 0xa8e00
movl %eax, -0x130(%rbp)
jmp 0xd4118
movq -0x138(%rbp), %rax
movl -0x130(%rbp), %ecx
movslq %ecx, %rcx
cmpq %rcx, %rax
setb %al
movb %al, -0x129(%rbp)
movb -0x129(%rbp), %al
testb $0x1, %al
jne 0xd4143
jmp 0xd4340
movq $0x0, -0x90(%rbp)
xorl %eax, %eax
testb $0x1, -0x7d(%rbp)
movb %al, -0x139(%rbp)
je 0xd419e
movq -0xd0(%rbp), %rax
movq -0x90(%rbp), %rcx
movq %rcx, -0x148(%rbp)
movq 0x38(%rax), %rdi
callq 0xa8e00
movl %eax, -0x140(%rbp)
jmp 0xd4182
movq -0x148(%rbp), %rax
movl -0x140(%rbp), %ecx
movslq %ecx, %rcx
cmpq %rcx, %rax
setb %al
movb %al, -0x139(%rbp)
movb -0x139(%rbp), %al
testb $0x1, %al
jne 0xd41ad
jmp 0xd4327
movq -0xd0(%rbp), %rdi
addq $0xe0, %rdi
movq -0x88(%rbp), %rsi
callq 0x993b0
movq %rax, %rdi
movq -0x90(%rbp), %rsi
callq 0x145d0
cmpl $-0x1, (%rax)
je 0xd430e
movq -0xd0(%rbp), %rdi
movq -0x18(%rbp), %rax
movq %rax, -0x158(%rbp)
addq $0xe0, %rdi
movq -0x88(%rbp), %rsi
callq 0x993b0
movq %rax, %rdi
movq -0x90(%rbp), %rsi
callq 0x145d0
movq -0x158(%rbp), %rdi
movslq (%rax), %rsi
callq 0xd2e90
movb %al, -0x149(%rbp)
jmp 0xd422a
movb -0x149(%rbp), %al
testb $0x1, %al
jne 0xd4239
jmp 0xd430e
movq -0xd0(%rbp), %rdi
movq -0x18(%rbp), %rax
addq $0x38, %rax
movq %rax, -0x168(%rbp)
addq $0xe0, %rdi
movq -0x88(%rbp), %rsi
callq 0x993b0
movq %rax, %rdi
movq -0x90(%rbp), %rsi
callq 0x145d0
movq -0x168(%rbp), %rdi
movslq (%rax), %rsi
callq 0x145f0
movq %rax, -0x160(%rbp)
jmp 0xd4289
movq -0x160(%rbp), %rax
movsd (%rax), %xmm0
xorps %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jne 0xd42a1
jp 0xd42a1
jmp 0xd430e
movslq -0x7c(%rbp), %rsi
leaq -0x30(%rbp), %rdi
movq %rdi, -0x180(%rbp)
callq 0xcf0f0
movq -0x180(%rbp), %rdi
movl (%rax), %eax
movl %eax, -0x174(%rbp)
movl -0x88(%rbp), %eax
movl %eax, -0x170(%rbp)
movslq -0x7c(%rbp), %rsi
callq 0xcf0f0
movq -0xd0(%rbp), %rdi
movl -0x174(%rbp), %esi
movl -0x170(%rbp), %edx
movl 0x8(%rax), %ecx
movl -0x90(%rbp), %r8d
callq 0xacb00
movb %al, -0x169(%rbp)
jmp 0xd4303
movb -0x169(%rbp), %al
andb $0x1, %al
movb %al, -0x7d(%rbp)
jmp 0xd4310
movq -0x90(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x90(%rbp)
jmp 0xd414e
jmp 0xd4329
movq -0x88(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x88(%rbp)
jmp 0xd40e4
testb $0x1, -0x7d(%rbp)
je 0xd43a5
movq -0xd0(%rbp), %rax
addq $0xe0, %rax
movq %rax, -0x190(%rbp)
movslq -0x7c(%rbp), %rsi
leaq -0x30(%rbp), %rdi
callq 0xcf0f0
movq -0x190(%rbp), %rdi
movq (%rax), %rsi
callq 0x993b0
movq %rax, -0x188(%rbp)
movslq -0x7c(%rbp), %rsi
leaq -0x30(%rbp), %rdi
callq 0xcf0f0
movq -0x188(%rbp), %rdi
movq 0x8(%rax), %rsi
callq 0x145d0
movl (%rax), %eax
addl $0x1, %eax
cltq
movq %rax, -0x38(%rbp)
jmp 0xd43a7
movl -0x7c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x7c(%rbp)
jmp 0xd408d
leaq -0x30(%rbp), %rdi
callq 0xcf0d0
cmpq $0x0, %rax
je 0xd4668
movl $0x18, %edi
callq 0xa450
movq %rax, -0x198(%rbp)
jmp 0xd43db
movq -0x198(%rbp), %rdi
callq 0xd9350
movq -0x198(%rbp), %rax
movq %rax, -0x98(%rbp)
cmpq $0x0, -0x38(%rbp)
setne %al
xorb $-0x1, %al
andb $0x1, %al
movb %al, -0x99(%rbp)
testb $0x1, -0x99(%rbp)
je 0xd4470
movq -0xd0(%rbp), %rax
addq $0xe0, %rax
movq %rax, -0x1b0(%rbp)
leaq -0x30(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0xcf0f0
movq -0x1b0(%rbp), %rdi
movq (%rax), %rsi
callq 0x993b0
movq %rax, -0x1a8(%rbp)
leaq -0x30(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0xcf0f0
movq -0x1a8(%rbp), %rdi
movq 0x8(%rax), %rsi
callq 0x145d0
movslq (%rax), %rax
movq %rax, -0x1a0(%rbp)
jmp 0xd447f
movq -0x38(%rbp), %rax
subq $0x1, %rax
movq %rax, -0x1a0(%rbp)
movq -0x1a0(%rbp), %rax
movq %rax, -0x38(%rbp)
movq -0x18(%rbp), %rdi
addq $0x50, %rdi
movq -0x38(%rbp), %rsi
callq 0x145f0
movq %rax, -0x1b8(%rbp)
jmp 0xd44a4
movq -0xd0(%rbp), %rdi
movq -0x1b8(%rbp), %rax
movsd (%rax), %xmm0
movq (%rdi), %rax
movq 0x70(%rax), %rax
callq *%rax
movb %al, -0x1b9(%rbp)
jmp 0xd44c7
movb -0x1b9(%rbp), %al
testb $0x1, %al
jne 0xd44d6
jmp 0xd4595
testb $0x1, -0x99(%rbp)
jne 0xd453b
movq -0xd0(%rbp), %rdi
movq -0x98(%rbp), %rax
movq %rax, -0x1d0(%rbp)
movq -0x18(%rbp), %rsi
movq -0x38(%rbp), %rdx
movq (%rdi), %rax
movq 0x58(%rax), %rax
movsd 0x3975d(%rip), %xmm0    # 0x10dc68
callq *%rax
movq %rax, -0x1c8(%rbp)
jmp 0xd4516
movq -0x1d0(%rbp), %rdi
movq -0x1c8(%rbp), %rax
movq %rax, -0xa8(%rbp)
leaq -0xa8(%rbp), %rsi
callq 0xd9370
jmp 0xd4539
jmp 0xd453b
movq -0xd0(%rbp), %rdi
movq -0x98(%rbp), %rax
movq %rax, -0x1e0(%rbp)
movq -0x18(%rbp), %rsi
movq -0x38(%rbp), %rdx
movq (%rdi), %rax
movq 0x58(%rax), %rax
xorps %xmm0, %xmm0
callq *%rax
movq %rax, -0x1d8(%rbp)
jmp 0xd456d
movq -0x1e0(%rbp), %rdi
movq -0x1d8(%rbp), %rax
movq %rax, -0xb0(%rbp)
leaq -0xb0(%rbp), %rsi
callq 0xd9370
jmp 0xd4590
jmp 0xd4651
movq -0xd0(%rbp), %rdi
movq -0x98(%rbp), %rax
movq %rax, -0x1f0(%rbp)
movq -0x18(%rbp), %rsi
movq -0x38(%rbp), %rdx
movq (%rdi), %rax
movq 0x58(%rax), %rax
xorps %xmm0, %xmm0
callq *%rax
movq %rax, -0x1e8(%rbp)
jmp 0xd45c7
movq -0x1f0(%rbp), %rdi
movq -0x1e8(%rbp), %rax
movq %rax, -0xb8(%rbp)
leaq -0xb8(%rbp), %rsi
callq 0xd9370
jmp 0xd45ea
testb $0x1, -0x99(%rbp)
jne 0xd464f
movq -0xd0(%rbp), %rdi
movq -0x98(%rbp), %rax
movq %rax, -0x200(%rbp)
movq -0x18(%rbp), %rsi
movq -0x38(%rbp), %rdx
movq (%rdi), %rax
movq 0x58(%rax), %rax
movsd 0x39649(%rip), %xmm0    # 0x10dc68
callq *%rax
movq %rax, -0x1f8(%rbp)
jmp 0xd462a
movq -0x200(%rbp), %rdi
movq -0x1f8(%rbp), %rax
movq %rax, -0xc0(%rbp)
leaq -0xc0(%rbp), %rsi
callq 0xd9370
jmp 0xd464d
jmp 0xd464f
jmp 0xd4651
movq -0x98(%rbp), %rax
movq %rax, -0x8(%rbp)
movl $0x1, -0xc4(%rbp)
jmp 0xd467a
movq $0x0, -0x8(%rbp)
movl $0x1, -0xc4(%rbp)
leaq -0x30(%rbp), %rdi
callq 0xcf110
movq -0x8(%rbp), %rax
addq $0x200, %rsp            # imm = 0x200
popq %rbp
retq
movq -0x48(%rbp), %rdi
callq 0xa7c0
nopl (%rax)