// File: Kingsford-Group[P]ghost2/src/sigApprox.hpp
// Function: inverseIter(Eigen::Matrix<double, -1, -1, 0, -1, -1>*, double)
double inverseIter(MatrixXd *A, double mu)
{
  int N=(*A).rows(); // rows and cols should be the same
  double prev=200, cur;  // dummy value
  bool flag=false;
  VectorXd seed = randomVec(N);
  for(int i=0;i<N;i++)
    (*A)(i,i) -= mu;
  LDLT<MatrixXd,Lower> ALU = (*A).ldlt();
  for(int i=0;i<1000;i++)
  {
    VectorXd temp = seed;
    seed = ALU.solve(seed);
    cur = normalize(&seed); // in place
    if(fabs(cur-prev) < ZERO) 
    {
      for(int i=0;i<N;i++)
        if(fabs(temp(i)) > ZERO)
        {
          cur*=(temp(i)*seed(i)>0)?1:-1;
          break;
        }
      flag=true;
      break;
    }
    prev=cur;
  }
  for(int i=0;i<N;i++)
    (*A)(i,i) += mu;
//  if(!flag) cout << "warning: did not converge\n"; // uncomment for warning
  cur = 1.0/cur + mu;
  return cur;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x130, %rsp            # imm = 0x130
movq %rdi, -0x8(%rbp)
movsd %xmm0, -0x10(%rbp)
movq -0x8(%rbp), %rdi
callq 0x24690
movl %eax, -0x14(%rbp)
movsd 0xa79a8(%rip), %xmm0    # 0xbc060
movsd %xmm0, -0x20(%rbp)
movb $0x0, -0x29(%rbp)
movl -0x14(%rbp), %esi
leaq -0x40(%rbp), %rdi
callq 0x145d0
movl $0x0, -0x44(%rbp)
movl -0x44(%rbp), %eax
cmpl -0x14(%rbp), %eax
jge 0x14739
movsd -0x10(%rbp), %xmm0
movsd %xmm0, -0xe0(%rbp)
movq -0x8(%rbp), %rdi
movslq -0x44(%rbp), %rdx
movq %rdx, %rsi
callq 0x246b0
movq %rax, -0xd8(%rbp)
jmp 0x14702
movq -0xd8(%rbp), %rax
movsd -0xe0(%rbp), %xmm1
movsd (%rax), %xmm0
subsd %xmm1, %xmm0
movsd %xmm0, (%rax)
movl -0x44(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x44(%rbp)
jmp 0x146d4
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
jmp 0x14a46
movq -0x8(%rbp), %rsi
leaq -0x98(%rbp), %rdi
callq 0x24770
jmp 0x1474b
movl $0x0, -0x9c(%rbp)
cmpl $0x3e8, -0x9c(%rbp)     # imm = 0x3E8
jge 0x14980
leaq -0xb0(%rbp), %rdi
leaq -0x40(%rbp), %rsi
callq 0x247b0
jmp 0x14777
leaq -0x98(%rbp), %rdi
leaq -0x40(%rbp), %rsi
callq 0x24850
movq %rdx, -0xf0(%rbp)
movq %rax, -0xe8(%rbp)
jmp 0x14797
movq -0xf0(%rbp), %rax
movq -0xe8(%rbp), %rcx
movq %rcx, -0xc0(%rbp)
movq %rax, -0xb8(%rbp)
leaq -0x40(%rbp), %rdi
leaq -0xc0(%rbp), %rsi
callq 0x24930
jmp 0x147c5
leaq -0x40(%rbp), %rdi
callq 0x14660
movsd %xmm0, -0xf8(%rbp)
jmp 0x147d8
movsd -0xf8(%rbp), %xmm0
movsd %xmm0, -0x28(%rbp)
movsd -0x28(%rbp), %xmm1
subsd -0x20(%rbp), %xmm1
movaps 0xa792a(%rip), %xmm0    # 0xbc120
pand %xmm0, %xmm1
movsd 0xa7866(%rip), %xmm0    # 0xbc068
ucomisd %xmm1, %xmm0
jbe 0x1493c
movl $0x0, -0xc4(%rbp)
movl -0xc4(%rbp), %eax
cmpl -0x14(%rbp), %eax
jge 0x1492c
movslq -0xc4(%rbp), %rsi
leaq -0xb0(%rbp), %rdi
callq 0x24960
movq %rax, -0x100(%rbp)
jmp 0x14841
movq -0x100(%rbp), %rax
movsd (%rax), %xmm0
movaps 0xa78cd(%rip), %xmm1    # 0xbc120
pand %xmm1, %xmm0
movsd 0xa7809(%rip), %xmm1    # 0xbc068
ucomisd %xmm1, %xmm0
jbe 0x14916
movslq -0xc4(%rbp), %rsi
leaq -0xb0(%rbp), %rdi
callq 0x24960
movq %rax, -0x108(%rbp)
jmp 0x14885
movq -0x108(%rbp), %rax
movsd (%rax), %xmm0
movsd %xmm0, -0x118(%rbp)
movslq -0xc4(%rbp), %rsi
leaq -0x40(%rbp), %rdi
callq 0x24960
movq %rax, -0x110(%rbp)
jmp 0x148b1
movq -0x110(%rbp), %rax
movsd -0x118(%rbp), %xmm0
mulsd (%rax), %xmm0
xorps %xmm1, %xmm1
movl $0xffffffff, %eax       # imm = 0xFFFFFFFF
movl $0x1, %ecx
ucomisd %xmm1, %xmm0
cmoval %ecx, %eax
cvtsi2sd %eax, %xmm0
mulsd -0x28(%rbp), %xmm0
movsd %xmm0, -0x28(%rbp)
jmp 0x1492c
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
jmp 0x14a3a
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
leaq -0xb0(%rbp), %rdi
callq 0x24650
jmp 0x14a3a
jmp 0x14918
movl -0xc4(%rbp), %eax
addl $0x1, %eax
movl %eax, -0xc4(%rbp)
jmp 0x14816
movb $0x1, -0x29(%rbp)
movl $0x5, -0xc8(%rbp)
jmp 0x14950
movsd -0x28(%rbp), %xmm0
movsd %xmm0, -0x20(%rbp)
movl $0x0, -0xc8(%rbp)
leaq -0xb0(%rbp), %rdi
callq 0x24650
movl -0xc8(%rbp), %eax
testl %eax, %eax
je 0x1496a
jmp 0x14968
jmp 0x14980
jmp 0x1496c
movl -0x9c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x9c(%rbp)
jmp 0x14755
movl $0x0, -0xcc(%rbp)
movl -0xcc(%rbp), %eax
cmpl -0x14(%rbp), %eax
jge 0x149e6
movsd -0x10(%rbp), %xmm0
movsd %xmm0, -0x128(%rbp)
movq -0x8(%rbp), %rdi
movslq -0xcc(%rbp), %rdx
movq %rdx, %rsi
callq 0x246b0
movq %rax, -0x120(%rbp)
jmp 0x149be
movq -0x120(%rbp), %rax
movsd -0x128(%rbp), %xmm0
addsd (%rax), %xmm0
movsd %xmm0, (%rax)
movl -0xcc(%rbp), %eax
addl $0x1, %eax
movl %eax, -0xcc(%rbp)
jmp 0x1498a
movsd 0xa7682(%rip), %xmm0    # 0xbc070
divsd -0x28(%rbp), %xmm0
addsd -0x10(%rbp), %xmm0
movsd %xmm0, -0x28(%rbp)
movsd -0x28(%rbp), %xmm0
movsd %xmm0, -0x130(%rbp)
movl $0x1, -0xc8(%rbp)
leaq -0x98(%rbp), %rdi
callq 0x249f0
leaq -0x40(%rbp), %rdi
callq 0x24650
movsd -0x130(%rbp), %xmm0
addq $0x130, %rsp            # imm = 0x130
popq %rbp
retq
leaq -0x98(%rbp), %rdi
callq 0x249f0
leaq -0x40(%rbp), %rdi
callq 0x24650
movq -0x50(%rbp), %rdi
callq 0x10cc0
nopl (%rax,%rax)