// File: aleperno[P]Datos/HashingPerceptron.cpp
// Function: HashingPerceptron::Initialize()
void HashingPerceptron::Initialize()
{

	cout << "Began to balance perceptron's weights" << endl;
	printf("\nIterations \t Errors \t Average \t Time \n");
	int iter_count = 1;
	int rev_counter = 0;
	clock_t inicio = clock();
	int min_error = -1;
	int min_count = 0;
	vector<float> aux_weights;
	while (true)
	{
		int error_count = 0;
		rev_counter = 0;
		pair<int,vector<unsigned int>> elem;
		BOOST_FOREACH(elem,this->test_vec)
		{
			rev_counter++;
			float aux = dot_product(elem.second);
			bool result = aux > this->threshold;
			//int error = elem.second.first - result;
			int error = elem.first - result;
			if (error != 0)
			{
				int pos;
				error_count++;
				BOOST_FOREACH(pos, elem.second)
				{
					this->weights[pos] += learning_rate * error;
				}
			}
		}
		//Imprimo los resultados parciales del balanceo
		double final = clock();
		double secs = double(final - inicio) / CLOCKS_PER_SEC;
		float min = floor(secs/60);
		float sec = secs - min*60;
		printf("%d\t\t%d\t\t%0.5f\t\t%.0f:%.3f\n",iter_count,error_count, 1.0 - (double)error_count/rev_counter,min,sec);
		fflush(stdout);
		//Veo si el error es el minimo, guardo el hiperplano
		if (error_count <= min_error || min_error == -1)
		{
			if (error_count == min_error)
				min_count++;
			else
				min_count = 0;
			min_error = error_count;
			aux_weights = this->weights;
		}
		//Controlo el corte
		if (iter_count == ITERATION_LIMIT)
		{
			cout << "Reached Iteration Limit" << endl;
			break;
		}
		if (error_count == 0) break;
		if (min_count == 5)
		{
			cout << "Reached Iteration Limit with minimum error" << endl;
			break;
		}
		iter_count++;
	}
	cout << "Finished perceptron balance" << endl;
	//Guardo el hiperplano de minimo error
	cout << "Minimum error was " << min_error << endl;
	this->weights = aux_weights;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x1e0, %rsp            # imm = 0x1E0
movq %rdi, -0x8(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0x130(%rbp)
movq 0x14ad7(%rip), %rdi     # 0x22fd8
leaq 0x8d19(%rip), %rsi      # 0x17221
callq 0x42d0
movq %rax, %rdi
movq 0x14ab1(%rip), %rsi     # 0x22fc8
callq 0x4310
leaq 0x8d24(%rip), %rdi      # 0x17247
movb $0x0, %al
callq 0x4060
movl $0x1, -0xc(%rbp)
movl $0x0, -0x10(%rbp)
callq 0x41c0
movq %rax, -0x18(%rbp)
movl $0xffffffff, -0x1c(%rbp) # imm = 0xFFFFFFFF
movl $0x0, -0x20(%rbp)
leaq -0x38(%rbp), %rdi
callq 0xf510
jmp 0xe55a
movl $0x0, -0x3c(%rbp)
movl $0x0, -0x10(%rbp)
leaq -0x60(%rbp), %rdi
callq 0xf570
jmp 0xe573
movq -0x130(%rbp), %rdi
addq $0x88, %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0xfc40
movq %rax, -0x138(%rbp)
jmp 0xe593
movq -0x138(%rbp), %rax
movq %rax, -0x80(%rbp)
leaq -0x80(%rbp), %rax
movq %rax, -0x78(%rbp)
movq -0x78(%rbp), %rdi
callq 0x6a70
movb %al, -0x139(%rbp)
jmp 0xe5b7
movb -0x139(%rbp), %al
testb $0x1, %al
jne 0xe5c3
jmp 0xe5f3
jmp 0xea82
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x68(%rbp)
movl %eax, -0x6c(%rbp)
jmp 0xed19
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x68(%rbp)
movl %eax, -0x6c(%rbp)
leaq -0x60(%rbp), %rdi
callq 0xf720
jmp 0xed19
movq -0x78(%rbp), %rdi
xorl %eax, %eax
movl %eax, %edx
movq %rdx, %rsi
callq 0xfc80
movq %rax, -0x148(%rbp)
jmp 0xe60c
movq -0x148(%rbp), %rax
movq %rax, -0x90(%rbp)
leaq -0x90(%rbp), %rax
movq %rax, -0x88(%rbp)
movq -0x88(%rbp), %rdi
callq 0x6a70
movb %al, -0x149(%rbp)
jmp 0xe63c
movb -0x149(%rbp), %al
testb $0x1, %al
jne 0xe648
jmp 0xe64d
jmp 0xea80
movq -0x78(%rbp), %rdi
xorl %eax, %eax
movl %eax, %edx
movq %rdx, %rsi
callq 0xfcc0
movq %rax, -0x158(%rbp)
jmp 0xe666
movq -0x158(%rbp), %rax
movq %rax, -0xa0(%rbp)
leaq -0xa0(%rbp), %rax
movq %rax, -0x98(%rbp)
movq -0x98(%rbp), %rdi
callq 0x6a70
movb %al, -0x159(%rbp)
jmp 0xe696
movb -0x159(%rbp), %al
testb $0x1, %al
jne 0xe6a2
jmp 0xe6a7
jmp 0xea7e
movb $0x1, -0xa1(%rbp)
xorl %eax, %eax
testb $0x1, -0xa1(%rbp)
movb %al, -0x15a(%rbp)
je 0xe6ec
movq -0x88(%rbp), %rdi
movq -0x98(%rbp), %rsi
xorl %eax, %eax
movl %eax, %edx
callq 0xfd00
movb %al, -0x15b(%rbp)
jmp 0xe6de
movb -0x15b(%rbp), %al
xorb $-0x1, %al
movb %al, -0x15a(%rbp)
movb -0x15a(%rbp), %al
testb $0x1, %al
jne 0xe6fb
jmp 0xea7c
leaq -0xa1(%rbp), %rdi
callq 0x6b40
movb %al, -0x15c(%rbp)
jmp 0xe70f
movb -0x15c(%rbp), %al
testb $0x1, %al
jne 0xe71b
jmp 0xe720
jmp 0xea56
movq -0x88(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0xfd40
movq %rax, -0x168(%rbp)
jmp 0xe739
movq -0x168(%rbp), %rsi
leaq -0x60(%rbp), %rdi
callq 0xf890
jmp 0xe74b
jmp 0xe74d
movb -0xa1(%rbp), %al
xorb $-0x1, %al
testb $0x1, %al
jne 0xe75e
jmp 0xea54
movl -0x10(%rbp), %eax
incl %eax
movl %eax, -0x10(%rbp)
leaq -0x58(%rbp), %rsi
leaq -0xc0(%rbp), %rdi
callq 0xfd70
jmp 0xe778
movq -0x130(%rbp), %rdi
leaq -0xc0(%rbp), %rsi
callq 0xed30
movss %xmm0, -0x16c(%rbp)
leaq -0xc0(%rbp), %rdi
callq 0xf8d0
movss -0x16c(%rbp), %xmm0
movq -0x130(%rbp), %rax
movss %xmm0, -0xa8(%rbp)
movss -0xa8(%rbp), %xmm0
ucomiss 0x54(%rax), %xmm0
seta %al
andb $0x1, %al
movb %al, -0xc1(%rbp)
movl -0x60(%rbp), %eax
movb -0xc1(%rbp), %cl
andb $0x1, %cl
movzbl %cl, %ecx
subl %ecx, %eax
movl %eax, -0xc8(%rbp)
cmpl $0x0, -0xc8(%rbp)
je 0xea46
movl -0x3c(%rbp), %eax
incl %eax
movl %eax, -0x3c(%rbp)
leaq -0x58(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0xfe60
movq %rax, -0x178(%rbp)
jmp 0xe80f
movq -0x178(%rbp), %rax
movq %rax, -0xe0(%rbp)
leaq -0xe0(%rbp), %rax
movq %rax, -0xd8(%rbp)
movq -0xd8(%rbp), %rdi
callq 0x6a70
movb %al, -0x179(%rbp)
jmp 0xe83f
movb -0x179(%rbp), %al
testb $0x1, %al
jne 0xe84b
jmp 0xe850
jmp 0xea44
movq -0xd8(%rbp), %rdi
xorl %eax, %eax
movl %eax, %edx
movq %rdx, %rsi
callq 0xfea0
movq %rax, -0x188(%rbp)
jmp 0xe86c
movq -0x188(%rbp), %rax
movq %rax, -0xf0(%rbp)
leaq -0xf0(%rbp), %rax
movq %rax, -0xe8(%rbp)
movq -0xe8(%rbp), %rdi
callq 0x6a70
movb %al, -0x189(%rbp)
jmp 0xe89c
movb -0x189(%rbp), %al
testb $0x1, %al
jne 0xe8a8
jmp 0xe8ad
jmp 0xea42
movq -0xd8(%rbp), %rdi
xorl %eax, %eax
movl %eax, %edx
movq %rdx, %rsi
callq 0xfee0
movq %rax, -0x198(%rbp)
jmp 0xe8c9
movq -0x198(%rbp), %rax
movq %rax, -0x100(%rbp)
leaq -0x100(%rbp), %rax
movq %rax, -0xf8(%rbp)
movq -0xf8(%rbp), %rdi
callq 0x6a70
movb %al, -0x199(%rbp)
jmp 0xe8f9
movb -0x199(%rbp), %al
testb $0x1, %al
jne 0xe905
jmp 0xe90a
jmp 0xea40
movb $0x1, -0x101(%rbp)
xorl %eax, %eax
testb $0x1, -0x101(%rbp)
movb %al, -0x19a(%rbp)
je 0xe94f
movq -0xe8(%rbp), %rdi
movq -0xf8(%rbp), %rsi
xorl %eax, %eax
movl %eax, %edx
callq 0xff20
movb %al, -0x19b(%rbp)
jmp 0xe941
movb -0x19b(%rbp), %al
xorb $-0x1, %al
movb %al, -0x19a(%rbp)
movb -0x19a(%rbp), %al
testb $0x1, %al
jne 0xe95e
jmp 0xea3e
leaq -0x101(%rbp), %rdi
callq 0x6b40
movb %al, -0x19c(%rbp)
jmp 0xe972
movb -0x19c(%rbp), %al
testb $0x1, %al
jne 0xe97e
jmp 0xe983
jmp 0xea18
movq -0xe8(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0xff60
movq %rax, -0x1a8(%rbp)
jmp 0xe99c
movq -0x1a8(%rbp), %rax
movl (%rax), %eax
movl %eax, -0xcc(%rbp)
movb -0x101(%rbp), %al
xorb $-0x1, %al
testb $0x1, %al
jne 0xe9b9
jmp 0xea16
movq -0x130(%rbp), %rdi
movss 0x50(%rdi), %xmm0
movss %xmm0, -0x1b0(%rbp)
cvtsi2ssl -0xc8(%rbp), %xmm0
movss %xmm0, -0x1ac(%rbp)
addq $0x38, %rdi
movslq -0xcc(%rbp), %rsi
callq 0x4ed0
movss -0x1b0(%rbp), %xmm0
movss -0x1ac(%rbp), %xmm2
movss (%rax), %xmm1
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
movss %xmm0, (%rax)
movb $0x1, -0x101(%rbp)
jmp 0xe9ab
jmp 0xea18
jmp 0xea1a
testb $0x1, -0x101(%rbp)
je 0xea37
movq -0xe8(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0xff90
jmp 0xea35
jmp 0xea39
jmp 0xea39
jmp 0xe911
jmp 0xea40
jmp 0xea42
jmp 0xea44
jmp 0xea46
jmp 0xea48
movb $0x1, -0xa1(%rbp)
jmp 0xe74d
jmp 0xea56
jmp 0xea58
testb $0x1, -0xa1(%rbp)
je 0xea75
movq -0x88(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0xffc0
jmp 0xea73
jmp 0xea77
jmp 0xea77
jmp 0xe6ae
jmp 0xea7e
jmp 0xea80
jmp 0xea82
callq 0x41c0
cvtsi2sd %rax, %xmm0
movsd %xmm0, -0x110(%rbp)
movsd -0x110(%rbp), %xmm0
cvtsi2sdq -0x18(%rbp), %xmm1
subsd %xmm1, %xmm0
movsd 0x86e2(%rip), %xmm1     # 0x17190
divsd %xmm1, %xmm0
movsd %xmm0, -0x118(%rbp)
movsd -0x118(%rbp), %xmm0
movsd 0x86ce(%rip), %xmm1     # 0x17198
divsd %xmm1, %xmm0
callq 0x4500
cvtsd2ss %xmm0, %xmm0
movss %xmm0, -0x11c(%rbp)
movsd -0x118(%rbp), %xmm0
movss -0x11c(%rbp), %xmm1
movss 0x86b9(%rip), %xmm2     # 0x171b0
mulss %xmm2, %xmm1
cvtss2sd %xmm1, %xmm1
addsd %xmm1, %xmm0
cvtsd2ss %xmm0, %xmm0
movss %xmm0, -0x120(%rbp)
movl -0xc(%rbp), %esi
movl -0x3c(%rbp), %edx
cvtsi2sd %edx, %xmm1
cvtsi2sdl -0x10(%rbp), %xmm0
divsd %xmm0, %xmm1
movsd 0x8676(%rip), %xmm0     # 0x171a0
subsd %xmm1, %xmm0
movss -0x11c(%rbp), %xmm1
cvtss2sd %xmm1, %xmm1
movss -0x120(%rbp), %xmm2
cvtss2sd %xmm2, %xmm2
leaq 0x8722(%rip), %rdi      # 0x1726f
movb $0x3, %al
callq 0x4060
jmp 0xeb56
movq 0x1445b(%rip), %rax     # 0x22fb8
movq (%rax), %rdi
callq 0x4390
jmp 0xeb67
movl -0x3c(%rbp), %eax
cmpl -0x1c(%rbp), %eax
jle 0xeb75
cmpl $-0x1, -0x1c(%rbp)
jne 0xebad
movl -0x3c(%rbp), %eax
cmpl -0x1c(%rbp), %eax
jne 0xeb88
movl -0x20(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x20(%rbp)
jmp 0xeb8f
movl $0x0, -0x20(%rbp)
movq -0x130(%rbp), %rsi
movl -0x3c(%rbp), %eax
movl %eax, -0x1c(%rbp)
addq $0x38, %rsi
leaq -0x38(%rbp), %rdi
callq 0xfff0
jmp 0xebab
jmp 0xebad
cmpl $0x96, -0xc(%rbp)
jne 0xebf3
movq 0x1441b(%rip), %rdi     # 0x22fd8
leaq 0x86c5(%rip), %rsi      # 0x17289
callq 0x42d0
movq %rax, -0x1b8(%rbp)
jmp 0xebd2
movq -0x1b8(%rbp), %rdi
movq 0x143e8(%rip), %rsi     # 0x22fc8
callq 0x4310
jmp 0xebe7
movl $0x3, -0x124(%rbp)
jmp 0xec5b
cmpl $0x0, -0x3c(%rbp)
jne 0xec05
movl $0x3, -0x124(%rbp)
jmp 0xec5b
cmpl $0x5, -0x20(%rbp)
jne 0xec48
movq 0x143c6(%rip), %rdi     # 0x22fd8
leaq 0x8688(%rip), %rsi      # 0x172a1
callq 0x42d0
movq %rax, -0x1c0(%rbp)
jmp 0xec27
movq -0x1c0(%rbp), %rdi
movq 0x14393(%rip), %rsi     # 0x22fc8
callq 0x4310
jmp 0xec3c
movl $0x3, -0x124(%rbp)
jmp 0xec5b
movl -0xc(%rbp), %eax
addl $0x1, %eax
movl %eax, -0xc(%rbp)
movl $0x0, -0x124(%rbp)
leaq -0x60(%rbp), %rdi
callq 0xf720
movl -0x124(%rbp), %eax
testl %eax, %eax
je 0xec72
jmp 0xec70
jmp 0xec77
jmp 0xe558
movq 0x1435a(%rip), %rdi     # 0x22fd8
leaq 0x8647(%rip), %rsi      # 0x172cc
callq 0x42d0
movq %rax, -0x1c8(%rbp)
jmp 0xec93
movq -0x1c8(%rbp), %rdi
movq 0x14327(%rip), %rsi     # 0x22fc8
callq 0x4310
jmp 0xeca8
movq 0x14329(%rip), %rdi     # 0x22fd8
leaq 0x8632(%rip), %rsi      # 0x172e8
callq 0x42d0
movq %rax, -0x1d0(%rbp)
jmp 0xecc4
movq -0x1d0(%rbp), %rdi
movl -0x1c(%rbp), %esi
callq 0x4530
movq %rax, -0x1d8(%rbp)
jmp 0xecdc
movq -0x1d8(%rbp), %rdi
movq 0x142de(%rip), %rsi     # 0x22fc8
callq 0x4310
jmp 0xecf1
movq -0x130(%rbp), %rdi
addq $0x38, %rdi
leaq -0x38(%rbp), %rsi
callq 0xfff0
jmp 0xed07
leaq -0x38(%rbp), %rdi
callq 0xfa00
addq $0x1e0, %rsp            # imm = 0x1E0
popq %rbp
retq
leaq -0x38(%rbp), %rdi
callq 0xfa00
movq -0x68(%rbp), %rdi
callq 0x4550
nopl (%rax,%rax)