// File: sjain12[P]CliqueCounting/Graph.cpp
// Function: Escape::degeneracy(Escape::CGraph&)
double Escape::degeneracy(CGraph &g)
{
  // CGraph cg = g.copy();
  VertexIdx n = g.nVertices;
  VertexIdx min_deg = n;
  double degen = 0;

  map <VertexIdx, unordered_set<VertexIdx> > deg_list;    
  map <VertexIdx, bool> touched;
  vector<VertexIdx> cur_degs;
  cur_degs.resize(n);
	//deg_list.resize(40000);
	//printf("before for\n");
  for (int i=0; i<n; i++)
  {
    VertexIdx deg = g.degree(i);
    deg_list[deg].insert(i);
    cur_degs[i] = deg;
    if (min_deg > deg) min_deg = deg;
  }
	//printf("after for\n");
  for(int i=0; i<n; i++)
  {
	//printf("Inside first for\n");
    while(deg_list[min_deg].size() == 0)
      min_deg++;
    unordered_set<VertexIdx>::iterator it = deg_list[min_deg].begin();
    VertexIdx source = *it;
    touched[source] = true;
    if (degen < min_deg) 
    {
      degen = min_deg;
      // printf("degen = %f\n", degen);
    }
    deg_list[min_deg].erase(it);
   //printf("Calling second for\n"); 
    for (int j=g.offsets[source]; j<g.offsets[source+1]; j++)
    {
      VertexIdx nbr = g.nbors[j];
      if (touched[nbr] == true)
          continue;
      VertexIdx deg = cur_degs[nbr];
      deg_list[deg].erase(nbr);
      deg_list[deg-1].insert(nbr);
      if (deg-1 < min_deg)
          min_deg = deg-1;
      cur_degs[nbr] = deg - 1;
            
    }

  }
  printf("returning degen = %f\n", degen);
  return degen;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x1b0, %rsp            # imm = 0x1B0
movq %rdi, -0x8(%rbp)
movq -0x8(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x10(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x18(%rbp)
movq $0x0, -0x20(%rbp)
leaq -0x50(%rbp), %rdi
callq 0xea50
leaq -0x80(%rbp), %rdi
callq 0xea70
leaq -0x98(%rbp), %rdi
movq %rdi, -0x128(%rbp)
callq 0xea90
movq -0x128(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0xeab0
jmp 0xe421
movl $0x0, -0xa8(%rbp)
movslq -0xa8(%rbp), %rax
cmpq -0x10(%rbp), %rax
jge 0xe556
movq -0x8(%rbp), %rdi
movslq -0xa8(%rbp), %rsi
callq 0xeb40
movq %rax, -0x130(%rbp)
jmp 0xe455
movq -0x130(%rbp), %rax
movq %rax, -0xb0(%rbp)
leaq -0x50(%rbp), %rdi
leaq -0xb0(%rbp), %rsi
callq 0xeb70
movq %rax, -0x138(%rbp)
jmp 0xe47c
movq -0x138(%rbp), %rdi
movslq -0xa8(%rbp), %rax
movq %rax, -0xb8(%rbp)
leaq -0xb8(%rbp), %rsi
callq 0xec50
movb %dl, -0x141(%rbp)
movq %rax, -0x140(%rbp)
jmp 0xe4ac
movb -0x141(%rbp), %al
movq -0x140(%rbp), %rcx
movq %rcx, -0xc8(%rbp)
movb %al, -0xc0(%rbp)
movq -0xb0(%rbp), %rax
movq %rax, -0x150(%rbp)
movslq -0xa8(%rbp), %rsi
leaq -0x98(%rbp), %rdi
callq 0xec90
movq -0x150(%rbp), %rcx
movq %rcx, (%rax)
movq -0x18(%rbp), %rax
cmpq -0xb0(%rbp), %rax
jle 0xe540
movq -0xb0(%rbp), %rax
movq %rax, -0x18(%rbp)
jmp 0xe540
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xa0(%rbp)
movl %eax, -0xa4(%rbp)
leaq -0x98(%rbp), %rdi
callq 0xefa0
leaq -0x80(%rbp), %rdi
callq 0xf000
leaq -0x50(%rbp), %rdi
callq 0xf020
jmp 0xe875
jmp 0xe542
movl -0xa8(%rbp), %eax
addl $0x1, %eax
movl %eax, -0xa8(%rbp)
jmp 0xe42b
movl $0x0, -0xcc(%rbp)
movslq -0xcc(%rbp), %rax
cmpq -0x10(%rbp), %rax
jge 0xe824
jmp 0xe573
leaq -0x50(%rbp), %rdi
leaq -0x18(%rbp), %rsi
callq 0xeb70
movq %rax, -0x158(%rbp)
jmp 0xe589
movq -0x158(%rbp), %rdi
callq 0xecb0
cmpq $0x0, %rax
jne 0xe5a9
movq -0x18(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x18(%rbp)
jmp 0xe573
leaq -0x50(%rbp), %rdi
leaq -0x18(%rbp), %rsi
callq 0xeb70
movq %rax, -0x160(%rbp)
jmp 0xe5bf
movq -0x160(%rbp), %rdi
callq 0xecd0
movq %rax, -0xd8(%rbp)
leaq -0xd8(%rbp), %rdi
callq 0xed00
movq (%rax), %rax
movq %rax, -0xe0(%rbp)
leaq -0x80(%rbp), %rdi
leaq -0xe0(%rbp), %rsi
callq 0xed30
movq %rax, -0x168(%rbp)
jmp 0xe601
movq -0x168(%rbp), %rax
movb $0x1, (%rax)
movsd -0x20(%rbp), %xmm1
cvtsi2sdq -0x18(%rbp), %xmm0
ucomisd %xmm1, %xmm0
jbe 0xe627
cvtsi2sdq -0x18(%rbp), %xmm0
movsd %xmm0, -0x20(%rbp)
leaq -0x50(%rbp), %rdi
leaq -0x18(%rbp), %rsi
callq 0xeb70
movq %rax, -0x170(%rbp)
jmp 0xe63d
movq -0x170(%rbp), %rdi
movq -0xd8(%rbp), %rax
movq %rax, -0xe8(%rbp)
movq -0xe8(%rbp), %rsi
callq 0xee10
movq %rax, -0x178(%rbp)
jmp 0xe667
movq -0x178(%rbp), %rax
movq %rax, -0xf0(%rbp)
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
movq -0xe0(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movl %eax, -0xf4(%rbp)
movslq -0xf4(%rbp), %rax
movq -0x8(%rbp), %rcx
movq 0x10(%rcx), %rcx
movq -0xe0(%rbp), %rdx
cmpq 0x8(%rcx,%rdx,8), %rax
jge 0xe80e
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rax
movslq -0xf4(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movq %rax, -0x100(%rbp)
leaq -0x80(%rbp), %rdi
leaq -0x100(%rbp), %rsi
callq 0xed30
movq %rax, -0x180(%rbp)
jmp 0xe6e2
movq -0x180(%rbp), %rax
movb (%rax), %al
andb $0x1, %al
movzbl %al, %eax
cmpl $0x1, %eax
jne 0xe6fa
jmp 0xe7fa
movq -0x100(%rbp), %rsi
leaq -0x98(%rbp), %rdi
callq 0xec90
movq (%rax), %rax
movq %rax, -0x108(%rbp)
leaq -0x50(%rbp), %rdi
leaq -0x108(%rbp), %rsi
callq 0xeb70
movq %rax, -0x188(%rbp)
jmp 0xe730
movq -0x188(%rbp), %rdi
leaq -0x100(%rbp), %rsi
callq 0xee50
jmp 0xe745
movq -0x108(%rbp), %rax
decq %rax
movq %rax, -0x110(%rbp)
leaq -0x50(%rbp), %rdi
leaq -0x110(%rbp), %rsi
callq 0xee80
movq %rax, -0x190(%rbp)
jmp 0xe76f
movq -0x190(%rbp), %rdi
leaq -0x100(%rbp), %rsi
callq 0xef60
movb %dl, -0x199(%rbp)
movq %rax, -0x198(%rbp)
jmp 0xe791
movb -0x199(%rbp), %al
movq -0x198(%rbp), %rcx
movq %rcx, -0x120(%rbp)
movb %al, -0x118(%rbp)
movq -0x108(%rbp), %rax
subq $0x1, %rax
cmpq -0x18(%rbp), %rax
jge 0xe7cb
movq -0x108(%rbp), %rax
subq $0x1, %rax
movq %rax, -0x18(%rbp)
movq -0x108(%rbp), %rax
subq $0x1, %rax
movq %rax, -0x1a8(%rbp)
movq -0x100(%rbp), %rsi
leaq -0x98(%rbp), %rdi
callq 0xec90
movq -0x1a8(%rbp), %rcx
movq %rcx, (%rax)
movl -0xf4(%rbp), %eax
addl $0x1, %eax
movl %eax, -0xf4(%rbp)
jmp 0xe68e
jmp 0xe810
movl -0xcc(%rbp), %eax
addl $0x1, %eax
movl %eax, -0xcc(%rbp)
jmp 0xe560
movsd -0x20(%rbp), %xmm0
leaq 0xaddd(%rip), %rdi      # 0x1960d
movb $0x1, %al
callq 0x3050
jmp 0xe839
movsd -0x20(%rbp), %xmm0
movsd %xmm0, -0x1b0(%rbp)
leaq -0x98(%rbp), %rdi
callq 0xefa0
leaq -0x80(%rbp), %rdi
callq 0xf000
leaq -0x50(%rbp), %rdi
callq 0xf020
movsd -0x1b0(%rbp), %xmm0
addq $0x1b0, %rsp            # imm = 0x1B0
popq %rbp
retq
movq -0xa0(%rbp), %rdi
callq 0x3580
nopw %cs:(%rax,%rax)