// File: epfml[P]Bi-Sent2Vec/src/fasttext.cc
// Function: fasttext::FastText::analogies(int)
void FastText::analogies(int32_t k) {
  std::string word;
  Vector buffer(args_->dim), query(args_->dim);
  Matrix wordVectors(dict_->nwords(), args_->dim);
  precomputeWordVectors(wordVectors);
  std::set<std::string> banSet;
  std::cerr << "Query triplet (A - B + C)? " << std::endl;
  while (true) {
    banSet.clear();
    query.zero();
    std::cin >> word;
    banSet.insert(word);
    getVector(buffer, word);
    query.addVector(buffer, 1.0);
    std::cin >> word;
    banSet.insert(word);
    getVector(buffer, word);
    query.addVector(buffer, -1.0);
    std::cin >> word;
    banSet.insert(word);
    getVector(buffer, word);
    query.addVector(buffer, 1.0);

    findNN(wordVectors, query, k, banSet);
    std::cerr << "Query triplet (A - B + C)? " << std::endl;
  }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x130, %rsp            # imm = 0x130
movq %rdi, -0x8(%rbp)
movl %esi, -0xc(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0xe0(%rbp)
leaq -0x30(%rbp), %rdi
callq 0x5600
movq -0xe0(%rbp), %rdi
callq 0xe6e0
movslq 0x94(%rax), %rsi
leaq -0x40(%rbp), %rdi
callq 0x20c00
jmp 0x2ebb4
movq -0xe0(%rbp), %rdi
callq 0xe6e0
movslq 0x94(%rax), %rsi
leaq -0x60(%rbp), %rdi
callq 0x20c00
jmp 0x2ebd2
movq -0xe0(%rbp), %rdi
addq $0x10, %rdi
callq 0x34050
movq %rax, %rdi
callq 0x8340
movl %eax, -0xe4(%rbp)
jmp 0x2ebf2
movq -0xe0(%rbp), %rdi
movl -0xe4(%rbp), %eax
cltq
movq %rax, -0xf0(%rbp)
callq 0xe6e0
movq -0xf0(%rbp), %rsi
movslq 0x94(%rax), %rdx
leaq -0x78(%rbp), %rdi
callq 0x1de00
jmp 0x2ec26
movq -0xe0(%rbp), %rdi
leaq -0x78(%rbp), %rsi
callq 0x2dca0
jmp 0x2ec38
leaq -0xa8(%rbp), %rdi
callq 0x35550
movq 0x303a5(%rip), %rdi     # 0x5eff0
leaq 0x14c04(%rip), %rsi     # 0x43856
callq 0x5420
movq %rax, -0xf8(%rbp)
jmp 0x2ec60
movq -0xf8(%rbp), %rdi
movq 0x30322(%rip), %rsi     # 0x5ef90
callq 0x5460
jmp 0x2ec75
jmp 0x2ec77
jmp 0x2ec79
leaq -0xa8(%rbp), %rdi
callq 0x35570
leaq -0x60(%rbp), %rdi
callq 0x20cb0
jmp 0x2ec90
movq 0x30341(%rip), %rdi     # 0x5efd8
leaq -0x30(%rbp), %rsi
callq 0x5560
jmp 0x2eca2
leaq -0xa8(%rbp), %rdi
leaq -0x30(%rbp), %rsi
callq 0x35590
movb %dl, -0x101(%rbp)
movq %rax, -0x100(%rbp)
jmp 0x2ecc1
movq -0xe0(%rbp), %rdi
movb -0x101(%rbp), %al
movq -0x100(%rbp), %rcx
movq %rcx, -0xb8(%rbp)
movb %al, -0xb0(%rbp)
leaq -0x40(%rbp), %rsi
leaq -0x30(%rbp), %rdx
callq 0x27ec0
jmp 0x2ecf1
leaq -0x60(%rbp), %rdi
leaq -0x40(%rbp), %rsi
movss 0x13bc7(%rip), %xmm0    # 0x428c8
callq 0x20e80
jmp 0x2ed08
movq 0x302c9(%rip), %rdi     # 0x5efd8
leaq -0x30(%rbp), %rsi
callq 0x5560
jmp 0x2ed1a
leaq -0xa8(%rbp), %rdi
leaq -0x30(%rbp), %rsi
callq 0x35590
movb %dl, -0x111(%rbp)
movq %rax, -0x110(%rbp)
jmp 0x2ed39
movq -0xe0(%rbp), %rdi
movb -0x111(%rbp), %al
movq -0x110(%rbp), %rcx
movq %rcx, -0xc8(%rbp)
movb %al, -0xc0(%rbp)
leaq -0x40(%rbp), %rsi
leaq -0x30(%rbp), %rdx
callq 0x27ec0
jmp 0x2ed69
leaq -0x60(%rbp), %rdi
leaq -0x40(%rbp), %rsi
movss 0x14927(%rip), %xmm0    # 0x436a0
callq 0x20e80
jmp 0x2ed80
movq 0x30251(%rip), %rdi     # 0x5efd8
leaq -0x30(%rbp), %rsi
callq 0x5560
jmp 0x2ed92
leaq -0xa8(%rbp), %rdi
leaq -0x30(%rbp), %rsi
callq 0x35590
movb %dl, -0x121(%rbp)
movq %rax, -0x120(%rbp)
jmp 0x2edb1
movq -0xe0(%rbp), %rdi
movb -0x121(%rbp), %al
movq -0x120(%rbp), %rcx
movq %rcx, -0xd8(%rbp)
movb %al, -0xd0(%rbp)
leaq -0x40(%rbp), %rsi
leaq -0x30(%rbp), %rdx
callq 0x27ec0
jmp 0x2ede1
leaq -0x60(%rbp), %rdi
leaq -0x40(%rbp), %rsi
movss 0x13ad7(%rip), %xmm0    # 0x428c8
callq 0x20e80
jmp 0x2edf8
movq -0xe0(%rbp), %rdi
movl -0xc(%rbp), %ecx
leaq -0x78(%rbp), %rsi
leaq -0x60(%rbp), %rdx
leaq -0xa8(%rbp), %r8
callq 0x2e130
jmp 0x2ee18
movq 0x301d1(%rip), %rdi     # 0x5eff0
leaq 0x14a30(%rip), %rsi     # 0x43856
callq 0x5420
movq %rax, -0x130(%rbp)
jmp 0x2ee34
movq -0x130(%rbp), %rdi
movq 0x3014e(%rip), %rsi     # 0x5ef90
callq 0x5460
jmp 0x2ee49
jmp 0x2ec77
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
jmp 0x2eeb9
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
jmp 0x2eeb0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
jmp 0x2eea7
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
jmp 0x2ee9e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
leaq -0xa8(%rbp), %rdi
callq 0x355e0
leaq -0x78(%rbp), %rdi
callq 0x1df90
leaq -0x60(%rbp), %rdi
callq 0x20c60
leaq -0x40(%rbp), %rdi
callq 0x20c60
leaq -0x30(%rbp), %rdi
callq 0x58d8
movq -0x48(%rbp), %rdi
callq 0x57a0
nopl (%rax,%rax)