// File: /workspace/github_cpp_makefile_star2_O3/richardposner[P]BioNetFit2/src/code/Swarm.cpp
// Function: Swarm::processParamsPSO(std::vector<double, std::allocator<double>>&, unsigned int, double)
void Swarm::processParamsPSO(vector<double> &params, unsigned int subParID, double fit) {
	//unsigned int mid = fcalcMID(subParID,options.models.size());
	unsigned int pID = fcalcParID(subParID,options.models.size());

	if (options.verbosity >= 3) {
		cout << "Processing finished params for particle " << pID << " subParticle:" << subParID<<"  with fit of " << fit << endl;
	}

	unsigned int i = 0;

	//razi: TODO: modify, the params order is based on free parameters in the corresonding model, reorder based on the global list

	//outputError("Needs modifications: for models that have different numbers of free parameters, we need to check if the values are in the correct order.");

	// If this is the particle's first iteration, we need to store its params
	if (particleIterationCounter_[pID][0] == 1) {   //razi: later check consistency, models parameters
		//cout << "Storing " << params.size() << " params for particle " << pID << endl;
		for (auto param = params.begin(); param != params.end(); ++param) {
			if (options.verbosity >= 3) {
				cout << *param << endl;
			}
			particleCurrParamSets_[pID][i] = *param;

			//Raquel added: now parameters for subparticles are processed as well
			for(unsigned int mid=0; mid < options.models.size(); mid++){
				subparticleCurrParamSets_[pID][mid][i] = *param;
			}

			++i;
		}
	}
	// The the fit value of this param set is less than the particles best fit
	// we should update the particle's best fit, then store the best fit params
	if (particleBestFits_.at(pID) == 0 || fit < particleBestFits_.at(pID)) {
		if (options.verbosity >= 3) {
			cout << "Updating best fit and params for particle " << pID << endl;
		}
		// Insert into best fit lists, erasing in the case of the map with fits as keys
		particleBestFits_[pID] = fit;
		subparticleBestFits_[subParID] = fit; //Raquel added support to subparticles
		subparticleBestFits_copy[subParID] = fit;

		map<double, unsigned int>::iterator toDelIt = particleBestFitsByFit_.end();

		for (auto it = particleBestFitsByFit_.begin(); it != particleBestFitsByFit_.end(); ++it) {

			//cout << "loop: " << it->second << endl;
			if (it->second == pID) {
				//cout << "Erasing old best fit for particle " << pID << endl;
				toDelIt = it;
			}
		}

		if (toDelIt != particleBestFitsByFit_.end()) {
			particleBestFitsByFit_.erase(toDelIt);
		}

		particleBestFitsByFit_.insert(pair<double, unsigned int>(fit, pID));
		particleBestFitsByFit_copy.insert(pair<double, unsigned int>(fit, pID));

		unsigned int i = 0;
		for (auto param = params.begin(); param != params.end(); ++param) {
			//cout << "Updating best param for particle " << pID << ": " << *param << endl;
			particleBestParamSets_[pID][i] = *param;
			++i;
		}

		for(unsigned int mid = 0; mid < options.models.size(); mid++){
			update_cur_particle_params(pID, mid, true);
		}



	}


	//Raquel added to support subparticles
	if (subparticleBestFits_.at(subParID) == 0 || fit < subparticleBestFits_.at(subParID)) {
			if (options.verbosity >= 3) {
				cout << "Updating best fit and params for particle " << pID << endl;
			}
			// Insert into best fit lists, erasing in the case of the map with fits as keys
			subparticleBestFits_[subParID] = fit; //Raquel added support to subparticles
			subparticleBestFits_copy[subParID] = fit;

			map<double, unsigned int>::iterator toDelIt2 = subparticleBestFitsByFit_.end();

			for (auto it = subparticleBestFitsByFit_.begin(); it != subparticleBestFitsByFit_.end(); ++it) {
				//cout << "loop: " << it->second << endl;
				if (it->second == subParID) {
					//cout << "Erasing old best fit for particle " << pID << endl;
					toDelIt2 = it;
				}
			}

			if (toDelIt2 != subparticleBestFitsByFit_.end()) {
				subparticleBestFitsByFit_.erase(toDelIt2); //Raquel added support to subparticles
			}


			//cout << "Adding " << fit << " to the fit values of subpar " << subParID << endl;
			subparticleBestFitsByFit_.insert(pair<double, unsigned int>(fit, subParID)); //Raquel added support to subparticles
			currentsubparticleBestFitsByFit_.insert(pair<double, unsigned int>(fit, subParID)); //Raquel added support to subparticles
			currentsubparticleBestFitsByFit_copy.insert(pair<double, unsigned int>(fit, subParID));
			for(unsigned int mid = 0; mid < options.models.size(); mid++){
				update_cur_particle_params(pID, mid, true);
			}
	}



}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x48, %rsp
movsd %xmm0, 0x10(%rsp)
movl %edx, %ebp
movq %rsi, 0x30(%rsp)
movq %rdi, %rbx
movl %edx, 0xc(%rsp)
movq 0x15c8(%rdi), %rsi
subq 0x15c0(%rdi), %rsi
shrq $0x3, %rsi
movl %edx, %edi
callq 0xbe99e
movl %eax, 0x8(%rsp)
cmpl $0x3, 0x1614(%rbx)
jb 0x8ab7f
movl %eax, %r15d
movq 0xeb4b8(%rip), %r12     # 0x175fa8
leaq 0x7479e(%rip), %rsi     # 0xff295
movl $0x28, %edx
movq %r12, %rdi
callq 0x22ab0
movl %r15d, %esi
movq %r12, %rdi
callq 0x22650
movq %rax, %r15
leaq 0x97d8f(%rip), %rsi     # 0x1228a8
movl $0xd, %edx
movq %rax, %rdi
callq 0x22ab0
movl %ebp, %esi
movq %r15, %rdi
callq 0x22650
movq %rax, %r15
leaq 0x74784(%rip), %rsi     # 0xff2be
movl $0xe, %edx
movq %rax, %rdi
callq 0x22ab0
movq %r15, %rdi
movsd 0x10(%rsp), %xmm0
callq 0x23060
movq %rax, %r15
movq (%rax), %rax
movq -0x18(%rax), %rdi
addq %r15, %rdi
movl $0xa, %esi
callq 0x22940
movsbl %al, %esi
movq %r15, %rdi
callq 0x22050
movq %rax, %rdi
callq 0x22660
leaq 0x1950(%rbx), %rdi
leaq 0x8(%rsp), %rsi
callq 0xa7ecc
leaq 0x20(%rsp), %rsi
movl $0x0, (%rsi)
movq %rax, %rdi
callq 0xa7800
cmpl $0x1, (%rax)
jne 0x8acd9
movq 0x30(%rsp), %rax
movq (%rax), %r15
cmpq 0x8(%rax), %r15
je 0x8acd9
leaq 0x1400(%rbx), %rax
movq %rax, 0x40(%rsp)
leaq 0x1460(%rbx), %r12
xorl %r14d, %r14d
leaq 0x8(%rsp), %rbp
leaq 0x20(%rsp), %r13
cmpl $0x3, 0x1614(%rbx)
jb 0x8ac26
movsd (%r15), %xmm0
movq 0xeb3b5(%rip), %rdi     # 0x175fa8
callq 0x23060
movq %rax, 0x18(%rsp)
movq (%rax), %rcx
movq -0x18(%rcx), %rdi
addq %rax, %rdi
movl $0xa, %esi
callq 0x22940
movsbl %al, %esi
movq 0x18(%rsp), %rdi
callq 0x22050
movq %rax, %rdi
callq 0x22660
movsd (%r15), %xmm0
movsd %xmm0, 0x18(%rsp)
movq 0x40(%rsp), %rdi
movq %rbp, %rsi
callq 0xa7e00
movl %r14d, 0x3c(%rsp)
movl %r14d, %r14d
movq (%rax), %rax
movsd 0x18(%rsp), %xmm0
movsd %xmm0, (%rax,%r14,8)
movl $0x0, 0x20(%rsp)
movq 0x15c8(%rbx), %rax
cmpq 0x15c0(%rbx), %rax
je 0x8acbe
movsd (%r15), %xmm0
movsd %xmm0, 0x18(%rsp)
movq %r12, %rdi
movq %rbp, %rsi
callq 0xa7e66
movq %rax, %rdi
movq %r13, %rsi
callq 0xa7e00
movq (%rax), %rax
movsd 0x18(%rsp), %xmm0
movsd %xmm0, (%rax,%r14,8)
movl 0x20(%rsp), %eax
incl %eax
movl %eax, 0x20(%rsp)
movq 0x15c8(%rbx), %rcx
subq 0x15c0(%rbx), %rcx
sarq $0x3, %rcx
cmpq %rax, %rcx
ja 0x8ac6d
movl 0x3c(%rsp), %r14d
incl %r14d
addq $0x8, %r15
movq 0x30(%rsp), %rax
cmpq 0x8(%rax), %r15
jne 0x8abde
leaq 0x1a20(%rbx), %r15
leaq 0x8(%rsp), %rsi
movq %r15, %rdi
callq 0xa7a8c
movsd (%rax), %xmm0
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jne 0x8acfd
jnp 0x8ad1a
leaq 0x8(%rsp), %rsi
movq %r15, %rdi
callq 0xa7a8c
movsd (%rax), %xmm0
ucomisd 0x10(%rsp), %xmm0
jbe 0x8aede
cmpl $0x3, 0x1614(%rbx)
jb 0x8ad74
movq 0xeb27e(%rip), %r14     # 0x175fa8
leaq 0x7459c(%rip), %rsi     # 0xff2cd
movl $0x2a, %edx
movq %r14, %rdi
callq 0x22ab0
movl 0x8(%rsp), %esi
movq %r14, %rdi
callq 0x22650
movq %rax, %r14
movq (%rax), %rax
movq -0x18(%rax), %rdi
addq %r14, %rdi
movl $0xa, %esi
callq 0x22940
movsbl %al, %esi
movq %r14, %rdi
callq 0x22050
movq %rax, %rdi
callq 0x22660
leaq 0x8(%rsp), %rsi
movq %r15, %rdi
callq 0xa7ad2
movsd 0x10(%rsp), %xmm0
movsd %xmm0, (%rax)
leaq 0x1a50(%rbx), %rdi
leaq 0xc(%rsp), %r14
movq %r14, %rsi
callq 0xa7ad2
movsd 0x10(%rsp), %xmm0
movsd %xmm0, (%rax)
leaq 0x1a80(%rbx), %rdi
movq %r14, %rsi
callq 0xa7ad2
movsd 0x10(%rsp), %xmm0
movsd %xmm0, (%rax)
leaq 0x1ab0(%rbx), %r15
leaq 0x1ab8(%rbx), %r14
movq 0x1ac8(%rbx), %rax
cmpq %r14, %rax
movq 0x30(%rsp), %r13
je 0x8ae0c
movl 0x8(%rsp), %ebp
movq %r14, %r12
cmpl %ebp, 0x28(%rax)
cmoveq %rax, %r12
movq %rax, %rdi
callq 0x22670
cmpq %r14, %rax
jne 0x8ade8
cmpq %r14, %r12
je 0x8ae0c
movq %r15, %rdi
movq %r12, %rsi
callq 0xaf960
leaq 0x20(%rsp), %r14
movsd 0x10(%rsp), %xmm0
movsd %xmm0, (%r14)
movl 0x8(%rsp), %eax
movl %eax, 0x8(%r14)
movq %r15, %rdi
movq %r14, %rsi
callq 0xaefd4
leaq 0x1ae0(%rbx), %rdi
movsd 0x10(%rsp), %xmm0
movsd %xmm0, (%r14)
movl 0x8(%rsp), %eax
movl %eax, 0x8(%r14)
leaq 0x20(%rsp), %rsi
callq 0xaefd4
movq (%r13), %r14
cmpq 0x8(%r13), %r14
je 0x8ae9d
leaq 0x1cc0(%rbx), %r15
xorl %ebp, %ebp
leaq 0x8(%rsp), %r12
movsd (%r14), %xmm0
movsd %xmm0, 0x18(%rsp)
movq %r15, %rdi
movq %r12, %rsi
callq 0xa7e00
movl %ebp, %ecx
movq (%rax), %rax
movsd 0x18(%rsp), %xmm0
movsd %xmm0, (%rax,%rcx,8)
incl %ebp
addq $0x8, %r14
cmpq 0x8(%r13), %r14
jne 0x8ae6b
movq 0x15c8(%rbx), %rax
cmpq 0x15c0(%rbx), %rax
je 0x8aede
xorl %r14d, %r14d
movl 0x8(%rsp), %esi
movq %rbx, %rdi
movl %r14d, %edx
movl $0x1, %ecx
callq 0x8b0b0
incl %r14d
movq 0x15c8(%rbx), %rax
subq 0x15c0(%rbx), %rax
sarq $0x3, %rax
cmpq %r14, %rax
ja 0x8aeb0
leaq 0x1a50(%rbx), %r14
leaq 0xc(%rsp), %rsi
movq %r14, %rdi
callq 0xa7a8c
movsd (%rax), %xmm0
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jne 0x8af02
jnp 0x8af1f
leaq 0xc(%rsp), %rsi
movq %r14, %rdi
callq 0xa7a8c
movsd (%rax), %xmm0
ucomisd 0x10(%rsp), %xmm0
jbe 0x8b0a0
cmpl $0x3, 0x1614(%rbx)
jb 0x8af79
movq 0xeb079(%rip), %r15     # 0x175fa8
leaq 0x74397(%rip), %rsi     # 0xff2cd
movl $0x2a, %edx
movq %r15, %rdi
callq 0x22ab0
movl 0x8(%rsp), %esi
movq %r15, %rdi
callq 0x22650
movq %rax, %r15
movq (%rax), %rax
movq -0x18(%rax), %rdi
addq %r15, %rdi
movl $0xa, %esi
callq 0x22940
movsbl %al, %esi
movq %r15, %rdi
callq 0x22050
movq %rax, %rdi
callq 0x22660
leaq 0xc(%rsp), %r15
movq %r14, %rdi
movq %r15, %rsi
callq 0xa7ad2
movsd 0x10(%rsp), %xmm0
movsd %xmm0, (%rax)
leaq 0x1a80(%rbx), %rdi
movq %r15, %rsi
callq 0xa7ad2
movsd 0x10(%rsp), %xmm0
movsd %xmm0, (%rax)
leaq 0x1b10(%rbx), %r14
leaq 0x1b18(%rbx), %r12
movq 0x1b28(%rbx), %rax
cmpq %r12, %rax
je 0x8aff1
movl 0xc(%rsp), %ebp
movq %r12, %r15
cmpl %ebp, 0x28(%rax)
cmoveq %rax, %r15
movq %rax, %rdi
callq 0x22670
cmpq %r12, %rax
jne 0x8afcd
cmpq %r12, %r15
je 0x8aff1
movq %r14, %rdi
movq %r15, %rsi
callq 0xaf960
leaq 0x20(%rsp), %r15
movsd 0x10(%rsp), %xmm0
movsd %xmm0, (%r15)
movl 0xc(%rsp), %eax
movl %eax, 0x8(%r15)
movq %r14, %rdi
movq %r15, %rsi
callq 0xaefd4
leaq 0x1b70(%rbx), %rdi
movsd 0x10(%rsp), %xmm0
movsd %xmm0, (%r15)
movl 0xc(%rsp), %eax
movl %eax, 0x8(%r15)
leaq 0x20(%rsp), %r14
movq %r14, %rsi
callq 0xaefd4
leaq 0x1ba0(%rbx), %rdi
movsd 0x10(%rsp), %xmm0
movsd %xmm0, (%r14)
movl 0xc(%rsp), %eax
movl %eax, 0x8(%r14)
leaq 0x20(%rsp), %rsi
callq 0xaefd4
movq 0x15c8(%rbx), %rax
cmpq 0x15c0(%rbx), %rax
je 0x8b0a0
xorl %r14d, %r14d
movl 0x8(%rsp), %esi
movq %rbx, %rdi
movl %r14d, %edx
movl $0x1, %ecx
callq 0x8b0b0
incl %r14d
movq 0x15c8(%rbx), %rax
subq 0x15c0(%rbx), %rax
sarq $0x3, %rax
cmpq %r14, %rax
ja 0x8b072
addq $0x48, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
nop