// File: ashlall[P]StreamStats/Test/GK_test.cpp
// Function: test_reverseQuantile(double, double)
void test_reverseQuantile(double stream_size, double sample_size)
{
	GK m(sample_size);
	GK n(sample_size);
	double epsilon = log(stream_size)/sample_size;
	//cout << "e: " << error<<endl;
	bool check1, check2;
	double hold1, hold2;

	for(double i = 0; i<=stream_size; i++)
	{
		m.insert(i);
		n.insert(stream_size-i);
	}

	//If the sample_size is large enough, then the reverse quantile lookup should return the EXACT index. Here, we transformed into probability.
	if (sample_size >= stream_size*3)
	{
		for(double i = 0; i<=stream_size; i++)
		{ 
			hold1 = ((m.reverseQuantile(i, stream_size))/stream_size);
			check1 = (hold1 == i/stream_size);
			assert(check1==true);

			hold2 = ((n.reverseQuantile(i, stream_size))/stream_size);
			check2 = (hold2 == i/stream_size);
			assert(check2==true);
		}
	}

	//Theoratically, the reverse quantile lookup will generate 3epsilon.

	else
	{
		for(double i = 0; i<=stream_size; i++)
		{ 
			hold1 = ((m.reverseQuantile(i, stream_size))/stream_size);
			check1 = ((hold1 >= i/stream_size - 3*epsilon) &&  (hold1 <= i/stream_size + 3*epsilon));
			assert(check1==true);

			hold2 = ((n.reverseQuantile(i, stream_size))/stream_size);
			check2 = ((hold2 >= i/stream_size - 3*epsilon) &&  (hold2 <= i/stream_size + 3*epsilon));
			assert(check2==true);
		}			
	}		
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xf0, %rsp
movsd %xmm0, -0x8(%rbp)
movsd %xmm1, -0x10(%rbp)
cvttsd2si -0x10(%rbp), %esi
leaq -0x40(%rbp), %rdi
callq 0x12e0
cvttsd2si -0x10(%rbp), %esi
leaq -0x70(%rbp), %rdi
callq 0x12e0
jmp 0x27f3
movsd -0x8(%rbp), %xmm0
callq 0x1090
divsd -0x10(%rbp), %xmm0
movsd %xmm0, -0x88(%rbp)
xorps %xmm0, %xmm0
movsd %xmm0, -0xa8(%rbp)
movsd -0xa8(%rbp), %xmm1
movsd -0x8(%rbp), %xmm0
ucomisd %xmm1, %xmm0
jb 0x289e
movsd -0xa8(%rbp), %xmm0
leaq -0x40(%rbp), %rdi
callq 0x1450
jmp 0x283b
movsd -0x8(%rbp), %xmm0
movsd -0xa8(%rbp), %xmm1
subsd %xmm1, %xmm0
leaq -0x70(%rbp), %rdi
callq 0x1450
jmp 0x2857
jmp 0x2859
movsd 0x17a7(%rip), %xmm0     # 0x4008
addsd -0xa8(%rbp), %xmm0
movsd %xmm0, -0xa8(%rbp)
jmp 0x2815
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x78(%rbp)
movl %eax, -0x7c(%rbp)
jmp 0x2c4e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x78(%rbp)
movl %eax, -0x7c(%rbp)
leaq -0x70(%rbp), %rdi
callq 0x13c0
jmp 0x2c4e
movsd -0x10(%rbp), %xmm0
movsd 0x176d(%rip), %xmm1     # 0x4018
mulsd -0x8(%rbp), %xmm1
ucomisd %xmm1, %xmm0
jb 0x2a1e
xorps %xmm0, %xmm0
movsd %xmm0, -0xb0(%rbp)
movsd -0xb0(%rbp), %xmm1
movsd -0x8(%rbp), %xmm0
ucomisd %xmm1, %xmm0
jb 0x2a19
movsd -0xb0(%rbp), %xmm0
cvttsd2si -0x8(%rbp), %esi
leaq -0x40(%rbp), %rdi
callq 0x1250
movsd %xmm0, -0xc0(%rbp)
jmp 0x28fc
movsd -0xc0(%rbp), %xmm0
divsd -0x8(%rbp), %xmm0
movsd %xmm0, -0x98(%rbp)
movsd -0x98(%rbp), %xmm0
movsd -0xb0(%rbp), %xmm1
divsd -0x8(%rbp), %xmm1
ucomisd %xmm1, %xmm0
sete %al
setnp %cl
andb %cl, %al
andb $0x1, %al
movb %al, -0x89(%rbp)
movb -0x89(%rbp), %al
andb $0x1, %al
movzbl %al, %eax
cmpl $0x1, %eax
jne 0x294c
jmp 0x296b
leaq 0x17eb(%rip), %rdi      # 0x413e
leaq 0x1725(%rip), %rsi      # 0x407f
movl $0xc0, %edx
leaq 0x17e5(%rip), %rcx      # 0x414b
callq 0x1070
movsd -0xb0(%rbp), %xmm0
cvttsd2si -0x8(%rbp), %esi
leaq -0x70(%rbp), %rdi
callq 0x1250
movsd %xmm0, -0xc8(%rbp)
jmp 0x298b
movsd -0xc8(%rbp), %xmm0
divsd -0x8(%rbp), %xmm0
movsd %xmm0, -0xa0(%rbp)
movsd -0xa0(%rbp), %xmm0
movsd -0xb0(%rbp), %xmm1
divsd -0x8(%rbp), %xmm1
ucomisd %xmm1, %xmm0
sete %al
setnp %cl
andb %cl, %al
andb $0x1, %al
movb %al, -0x8a(%rbp)
movb -0x8a(%rbp), %al
andb $0x1, %al
movzbl %al, %eax
cmpl $0x1, %eax
jne 0x29db
jmp 0x29fa
leaq 0x1793(%rip), %rdi      # 0x4175
leaq 0x1696(%rip), %rsi      # 0x407f
movl $0xc4, %edx
leaq 0x1756(%rip), %rcx      # 0x414b
callq 0x1070
jmp 0x29fc
movsd 0x1604(%rip), %xmm0     # 0x4008
addsd -0xb0(%rbp), %xmm0
movsd %xmm0, -0xb0(%rbp)
jmp 0x28c5
jmp 0x2c33
xorps %xmm0, %xmm0
movsd %xmm0, -0xb8(%rbp)
movsd -0xb8(%rbp), %xmm1
movsd -0x8(%rbp), %xmm0
ucomisd %xmm1, %xmm0
jb 0x2c31
movsd -0xb8(%rbp), %xmm0
cvttsd2si -0x8(%rbp), %esi
leaq -0x40(%rbp), %rdi
callq 0x1250
movsd %xmm0, -0xd0(%rbp)
jmp 0x2a60
movsd -0xd0(%rbp), %xmm0
divsd -0x8(%rbp), %xmm0
movsd %xmm0, -0x98(%rbp)
movsd -0x98(%rbp), %xmm0
movsd -0xb8(%rbp), %xmm2
divsd -0x8(%rbp), %xmm2
movsd -0x88(%rbp), %xmm1
movsd 0x1586(%rip), %xmm3     # 0x4020
mulsd %xmm3, %xmm1
addsd %xmm2, %xmm1
xorl %eax, %eax
ucomisd %xmm1, %xmm0
movb %al, -0xd1(%rbp)
jb 0x2aea
movsd -0x98(%rbp), %xmm1
movsd -0xb8(%rbp), %xmm2
divsd -0x8(%rbp), %xmm2
movsd -0x88(%rbp), %xmm0
movsd 0x1543(%rip), %xmm3     # 0x4018
mulsd %xmm3, %xmm0
addsd %xmm2, %xmm0
ucomisd %xmm1, %xmm0
setae %al
movb %al, -0xd1(%rbp)
movb -0xd1(%rbp), %al
andb $0x1, %al
movb %al, -0x89(%rbp)
movb -0x89(%rbp), %al
andb $0x1, %al
movzbl %al, %eax
cmpl $0x1, %eax
jne 0x2b0a
jmp 0x2b29
leaq 0x162d(%rip), %rdi      # 0x413e
leaq 0x1567(%rip), %rsi      # 0x407f
movl $0xd0, %edx
leaq 0x1627(%rip), %rcx      # 0x414b
callq 0x1070
movsd -0xb8(%rbp), %xmm0
cvttsd2si -0x8(%rbp), %esi
leaq -0x70(%rbp), %rdi
callq 0x1250
movsd %xmm0, -0xe0(%rbp)
jmp 0x2b49
movsd -0xe0(%rbp), %xmm0
divsd -0x8(%rbp), %xmm0
movsd %xmm0, -0xa0(%rbp)
movsd -0xa0(%rbp), %xmm0
movsd -0xb8(%rbp), %xmm2
divsd -0x8(%rbp), %xmm2
movsd -0x88(%rbp), %xmm1
movsd 0x149d(%rip), %xmm3     # 0x4020
mulsd %xmm3, %xmm1
addsd %xmm2, %xmm1
xorl %eax, %eax
ucomisd %xmm1, %xmm0
movb %al, -0xe1(%rbp)
jb 0x2bd3
movsd -0xa0(%rbp), %xmm1
movsd -0xb8(%rbp), %xmm2
divsd -0x8(%rbp), %xmm2
movsd -0x88(%rbp), %xmm0
movsd 0x145a(%rip), %xmm3     # 0x4018
mulsd %xmm3, %xmm0
addsd %xmm2, %xmm0
ucomisd %xmm1, %xmm0
setae %al
movb %al, -0xe1(%rbp)
movb -0xe1(%rbp), %al
andb $0x1, %al
movb %al, -0x8a(%rbp)
movb -0x8a(%rbp), %al
andb $0x1, %al
movzbl %al, %eax
cmpl $0x1, %eax
jne 0x2bf3
jmp 0x2c12
leaq 0x157b(%rip), %rdi      # 0x4175
leaq 0x147e(%rip), %rsi      # 0x407f
movl $0xd4, %edx
leaq 0x153e(%rip), %rcx      # 0x414b
callq 0x1070
jmp 0x2c14
movsd 0x13ec(%rip), %xmm0     # 0x4008
addsd -0xb8(%rbp), %xmm0
movsd %xmm0, -0xb8(%rbp)
jmp 0x2a29
jmp 0x2c33
leaq -0x70(%rbp), %rdi
callq 0x13c0
leaq -0x40(%rbp), %rdi
callq 0x13c0
addq $0xf0, %rsp
popq %rbp
retq
leaq -0x40(%rbp), %rdi
callq 0x13c0
movq -0x78(%rbp), %rdi
callq 0x1100