// File: tetsuok[P]kernel-pa/kernel_pa_classify.cc
// Function: kernel::(anonymous namespace)::KernelPAClassify(int, char**)
int KernelPAClassify(int argc, char** argv) {
  if (argc < 3) {
    fprintf(stderr, "usage: %s test_file model\n", argv[0]);
    return -1;
  }

  const char* test_file = argv[1];
  const char* model = argv[2];
  kernel::Learner learner;
  if (!learner.Load(model)) {
    LOG(ERROR) << "cannot load " << model;
    return -1;
  }

  std::ifstream ifs(test_file);
  if (!ifs) {
    LOG(ERROR) << "no such file or directory " << test_file;
    return -1;
  }

  Result result;
  unsigned int line_num = 0;
  std::string line;
  while (std::getline(ifs, line)) {
    if (line[0] == '#' || line.empty()) continue;       // ignore comments
    ++line_num;

    short label;
    fv x;
    size_t dummy = 0;
    if (!Tokenize(line.c_str(), &x, &label, &dummy)) {
      LOG(ERROR) << "cannot tokenize: " << line;
      return -1;
    }

    const short predict = learner.Predict(x);
    result.Add(label, predict);
  }

  result.Show();
  return 0;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x440, %rsp            # imm = 0x440
movl %edi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
cmpl $0x3, -0x8(%rbp)
jge 0x2513
movq 0xeae1(%rip), %rax      # 0x10fd0
movq (%rax), %rdi
movq -0x10(%rbp), %rax
movq (%rax), %rdx
leaq 0x8b10(%rip), %rsi      # 0xb010
movb $0x0, %al
callq 0x2210
movl $0xffffffff, -0x4(%rbp) # imm = 0xFFFFFFFF
jmp 0x2c3f
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x18(%rbp)
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0x20(%rbp)
leaq -0x78(%rbp), %rdi
movq %rdi, -0x310(%rbp)
callq 0x41d0
movq -0x310(%rbp), %rdi
movq -0x20(%rbp), %rsi
callq 0x4c60
movb %al, -0x307(%rbp)
jmp 0x2553
movb -0x307(%rbp), %al
testb $0x1, %al
jne 0x26e6
jmp 0x2563
leaq -0x88(%rbp), %rdi
movl $0x2, %esi
callq 0x2e30
jmp 0x2576
callq 0x2e60
movq %rax, -0x318(%rbp)
jmp 0x2584
movq -0x318(%rbp), %rdi
leaq 0x8a99(%rip), %rsi      # 0xb02b
callq 0x2150
movq %rax, -0x320(%rbp)
jmp 0x25a0
movq -0x320(%rbp), %rdi
leaq 0x8a82(%rip), %rsi      # 0xb030
callq 0x2150
movq %rax, -0x328(%rbp)
jmp 0x25bc
movq -0x328(%rbp), %rdi
leaq 0x8a6c(%rip), %rsi      # 0xb036
callq 0x2150
movq %rax, -0x330(%rbp)
jmp 0x25d8
movq -0x330(%rbp), %rdi
leaq 0x8a54(%rip), %rsi      # 0xb03a
callq 0x2150
movq %rax, -0x338(%rbp)
jmp 0x25f4
movq -0x338(%rbp), %rdi
leaq 0x8a2c(%rip), %rsi      # 0xb02e
callq 0x2150
movq %rax, -0x340(%rbp)
jmp 0x2610
movq -0x340(%rbp), %rdi
movl $0x3e, %esi
callq 0x22a0
movq %rax, -0x348(%rbp)
jmp 0x262a
movq -0x348(%rbp), %rdi
leaq 0x8a18(%rip), %rsi      # 0xb050
callq 0x2150
movq %rax, -0x350(%rbp)
jmp 0x2646
movq -0x350(%rbp), %rdi
leaq 0x89ff(%rip), %rsi      # 0xb053
callq 0x2150
movq %rax, -0x358(%rbp)
jmp 0x2662
movq -0x358(%rbp), %rdi
movq -0x20(%rbp), %rsi
callq 0x2150
movq %rax, -0x360(%rbp)
jmp 0x267b
movq -0x360(%rbp), %rsi
leaq -0x88(%rbp), %rdi
callq 0x2e50
jmp 0x2690
leaq -0x88(%rbp), %rdi
callq 0x2e70
movl $0xffffffff, -0x4(%rbp) # imm = 0xFFFFFFFF
movl $0x1, -0x8c(%rbp)
jmp 0x2c29
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x80(%rbp)
movl %eax, -0x84(%rbp)
jmp 0x2c34
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x80(%rbp)
movl %eax, -0x84(%rbp)
leaq -0x88(%rbp), %rdi
callq 0x2e70
jmp 0x2c34
movq -0x18(%rbp), %rsi
leaq -0x298(%rbp), %rdi
movl $0x8, %edx
callq 0x22c0
jmp 0x26fd
movq -0x298(%rbp), %rax
movq -0x18(%rax), %rax
leaq -0x298(%rbp,%rax), %rdi
callq 0x20e0
movb %al, -0x361(%rbp)
jmp 0x271d
movb -0x361(%rbp), %al
testb $0x1, %al
jne 0x272c
jmp 0x28af
leaq -0x29c(%rbp), %rdi
movl $0x2, %esi
callq 0x2e30
jmp 0x273f
callq 0x2e60
movq %rax, -0x370(%rbp)
jmp 0x274d
movq -0x370(%rbp), %rdi
leaq 0x88d0(%rip), %rsi      # 0xb02b
callq 0x2150
movq %rax, -0x378(%rbp)
jmp 0x2769
movq -0x378(%rbp), %rdi
leaq 0x88b9(%rip), %rsi      # 0xb030
callq 0x2150
movq %rax, -0x380(%rbp)
jmp 0x2785
movq -0x380(%rbp), %rdi
leaq 0x88a3(%rip), %rsi      # 0xb036
callq 0x2150
movq %rax, -0x388(%rbp)
jmp 0x27a1
movq -0x388(%rbp), %rdi
leaq 0x888b(%rip), %rsi      # 0xb03a
callq 0x2150
movq %rax, -0x390(%rbp)
jmp 0x27bd
movq -0x390(%rbp), %rdi
leaq 0x8863(%rip), %rsi      # 0xb02e
callq 0x2150
movq %rax, -0x398(%rbp)
jmp 0x27d9
movq -0x398(%rbp), %rdi
movl $0x44, %esi
callq 0x22a0
movq %rax, -0x3a0(%rbp)
jmp 0x27f3
movq -0x3a0(%rbp), %rdi
leaq 0x884f(%rip), %rsi      # 0xb050
callq 0x2150
movq %rax, -0x3a8(%rbp)
jmp 0x280f
movq -0x3a8(%rbp), %rdi
leaq 0x8843(%rip), %rsi      # 0xb060
callq 0x2150
movq %rax, -0x3b0(%rbp)
jmp 0x282b
movq -0x3b0(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0x2150
movq %rax, -0x3b8(%rbp)
jmp 0x2844
movq -0x3b8(%rbp), %rsi
leaq -0x29c(%rbp), %rdi
callq 0x2e50
jmp 0x2859
leaq -0x29c(%rbp), %rdi
callq 0x2e70
movl $0xffffffff, -0x4(%rbp) # imm = 0xFFFFFFFF
movl $0x1, -0x8c(%rbp)
jmp 0x2c0d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x80(%rbp)
movl %eax, -0x84(%rbp)
jmp 0x2c1b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x80(%rbp)
movl %eax, -0x84(%rbp)
leaq -0x29c(%rbp), %rdi
callq 0x2e70
jmp 0x2c1b
leaq -0x2b4(%rbp), %rdi
callq 0x2c60
movl $0x0, -0x2b8(%rbp)
leaq -0x2d8(%rbp), %rdi
callq 0x21f0
leaq -0x298(%rbp), %rdi
leaq -0x2d8(%rbp), %rsi
callq 0x2060
movq %rax, -0x3c0(%rbp)
jmp 0x28ed
movq -0x3c0(%rbp), %rdi
movq (%rdi), %rax
movq -0x18(%rax), %rax
addq %rax, %rdi
callq 0x21c0
movb %al, -0x3c1(%rbp)
jmp 0x290b
movb -0x3c1(%rbp), %al
testb $0x1, %al
jne 0x291a
jmp 0x2bd2
xorl %eax, %eax
movl %eax, %esi
leaq -0x2d8(%rbp), %rdi
callq 0x22d0
movq %rax, -0x3d0(%rbp)
jmp 0x2933
movq -0x3d0(%rbp), %rax
movsbl (%rax), %eax
cmpl $0x23, %eax
je 0x2954
leaq -0x2d8(%rbp), %rdi
callq 0x2280
testb $0x1, %al
jne 0x2954
jmp 0x296d
jmp 0x28d1
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x80(%rbp)
movl %eax, -0x84(%rbp)
jmp 0x2bff
movl -0x2b8(%rbp), %eax
incl %eax
movl %eax, -0x2b8(%rbp)
leaq -0x2f8(%rbp), %rdi
movq %rdi, -0x3e0(%rbp)
callq 0x2ec0
movq $0x0, -0x300(%rbp)
leaq -0x2d8(%rbp), %rdi
callq 0x20d0
movq -0x3e0(%rbp), %rsi
movq %rax, %rdi
leaq -0x2da(%rbp), %rdx
leaq -0x300(%rbp), %rcx
callq 0xa340
movb %al, -0x3d1(%rbp)
jmp 0x29ca
movb -0x3d1(%rbp), %al
testb $0x1, %al
jne 0x2b5a
jmp 0x29da
leaq -0x304(%rbp), %rdi
movl $0x2, %esi
callq 0x2e30
jmp 0x29ed
callq 0x2e60
movq %rax, -0x3e8(%rbp)
jmp 0x29fb
movq -0x3e8(%rbp), %rdi
leaq 0x8622(%rip), %rsi      # 0xb02b
callq 0x2150
movq %rax, -0x3f0(%rbp)
jmp 0x2a17
movq -0x3f0(%rbp), %rdi
leaq 0x860b(%rip), %rsi      # 0xb030
callq 0x2150
movq %rax, -0x3f8(%rbp)
jmp 0x2a33
movq -0x3f8(%rbp), %rdi
leaq 0x85f5(%rip), %rsi      # 0xb036
callq 0x2150
movq %rax, -0x400(%rbp)
jmp 0x2a4f
movq -0x400(%rbp), %rdi
leaq 0x85dd(%rip), %rsi      # 0xb03a
callq 0x2150
movq %rax, -0x408(%rbp)
jmp 0x2a6b
movq -0x408(%rbp), %rdi
leaq 0x85b5(%rip), %rsi      # 0xb02e
callq 0x2150
movq %rax, -0x410(%rbp)
jmp 0x2a87
movq -0x410(%rbp), %rdi
movl $0x53, %esi
callq 0x22a0
movq %rax, -0x418(%rbp)
jmp 0x2aa1
movq -0x418(%rbp), %rdi
leaq 0x85a1(%rip), %rsi      # 0xb050
callq 0x2150
movq %rax, -0x420(%rbp)
jmp 0x2abd
movq -0x420(%rbp), %rdi
leaq 0x85b0(%rip), %rsi      # 0xb07b
callq 0x2150
movq %rax, -0x428(%rbp)
jmp 0x2ad9
movq -0x428(%rbp), %rdi
leaq -0x2d8(%rbp), %rsi
callq 0x2140
movq %rax, -0x430(%rbp)
jmp 0x2af5
movq -0x430(%rbp), %rsi
leaq -0x304(%rbp), %rdi
callq 0x2e50
jmp 0x2b0a
leaq -0x304(%rbp), %rdi
callq 0x2e70
movl $0xffffffff, -0x4(%rbp) # imm = 0xFFFFFFFF
movl $0x1, -0x8c(%rbp)
jmp 0x2ba7
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x80(%rbp)
movl %eax, -0x84(%rbp)
jmp 0x2bc4
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x80(%rbp)
movl %eax, -0x84(%rbp)
leaq -0x304(%rbp), %rdi
callq 0x2e70
jmp 0x2bc4
leaq -0x78(%rbp), %rdi
leaq -0x2f8(%rbp), %rsi
callq 0x2ee0
movw %ax, -0x432(%rbp)
jmp 0x2b73
movw -0x432(%rbp), %ax
movw %ax, -0x306(%rbp)
movswl -0x2da(%rbp), %esi
movswl -0x306(%rbp), %edx
leaq -0x2b4(%rbp), %rdi
callq 0x2cc0
jmp 0x2b9d
movl $0x0, -0x8c(%rbp)
leaq -0x2f8(%rbp), %rdi
callq 0x2f30
movl -0x8c(%rbp), %eax
testl %eax, %eax
jne 0x2bf1
jmp 0x2bbf
jmp 0x28d1
leaq -0x2f8(%rbp), %rdi
callq 0x2f30
jmp 0x2bff
leaq -0x2b4(%rbp), %rdi
callq 0x2da0
jmp 0x2be0
movl $0x0, -0x4(%rbp)
movl $0x1, -0x8c(%rbp)
leaq -0x2d8(%rbp), %rdi
callq 0x2110
jmp 0x2c0d
leaq -0x2d8(%rbp), %rdi
callq 0x2110
jmp 0x2c1b
leaq -0x298(%rbp), %rdi
callq 0x2090
jmp 0x2c29
leaq -0x298(%rbp), %rdi
callq 0x2090
jmp 0x2c34
leaq -0x78(%rbp), %rdi
callq 0x4230
jmp 0x2c3f
leaq -0x78(%rbp), %rdi
callq 0x4230
jmp 0x2c4b
movl -0x4(%rbp), %eax
addq $0x440, %rsp            # imm = 0x440
popq %rbp
retq
movq -0x80(%rbp), %rdi
callq 0x22b0
nopw %cs:(%rax,%rax)