// File: /workspace/github_cpp_makefile_star2_O2/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 0x9ec1e
movl %eax, 0x8(%rsp)
cmpl $0x3, 0x1614(%rbx)
jb 0x7567b
movl %eax, %r15d
movq 0xf0972(%rip), %rdi     # 0x165f98
leaq 0x67dc8(%rip), %rsi     # 0xdd3f5
callq 0x289f0
movl %r15d, %esi
movq %rax, %rdi
callq 0x286e0
leaq 0x8b762(%rip), %rsi     # 0x100da6
movq %rax, %rdi
callq 0x289f0
movl %ebp, %esi
movq %rax, %rdi
callq 0x286e0
leaq 0x67dc1(%rip), %rsi     # 0xdd41e
movq %rax, %rdi
callq 0x289f0
movq %rax, %rdi
movsd 0x10(%rsp), %xmm0
callq 0x290f0
movq %rax, %rdi
callq 0x284a0
leaq 0x1950(%rbx), %rdi
leaq 0x8(%rsp), %rsi
callq 0x865fc
leaq 0x20(%rsp), %rsi
andl $0x0, (%rsi)
movq %rax, %rdi
callq 0x86102
cmpl $0x1, (%rax)
jne 0x75795
movq 0x30(%rsp), %rax
movq (%rax), %r14
leaq 0x1400(%rbx), %rax
movq %rax, 0x40(%rsp)
leaq 0x1460(%rbx), %r12
xorl %r15d, %r15d
leaq 0x8(%rsp), %rbp
leaq 0x20(%rsp), %r13
movq 0x30(%rsp), %rax
cmpq 0x8(%rax), %r14
je 0x75795
cmpl $0x3, 0x1614(%rbx)
jb 0x756fe
movsd (%r14), %xmm0
movq 0xf08a7(%rip), %rdi     # 0x165f98
callq 0x290f0
movq %rax, %rdi
callq 0x284a0
movsd (%r14), %xmm0
movsd %xmm0, 0x18(%rsp)
movq 0x40(%rsp), %rdi
movq %rbp, %rsi
callq 0x86502
movl %r15d, 0x3c(%rsp)
movl %r15d, %r15d
movq (%rax), %rax
movsd 0x18(%rsp), %xmm0
movsd %xmm0, (%rax,%r15,8)
xorl %eax, %eax
movl %eax, 0x20(%rsp)
movl %eax, %eax
movq 0x15c8(%rbx), %rcx
subq 0x15c0(%rbx), %rcx
sarq $0x3, %rcx
cmpq %rax, %rcx
jbe 0x75784
movsd (%r14), %xmm0
movsd %xmm0, 0x18(%rsp)
movq %r12, %rdi
movq %rbp, %rsi
callq 0x86550
movq %rax, %rdi
movq %r13, %rsi
callq 0x86502
movq (%rax), %rax
movsd 0x18(%rsp), %xmm0
movsd %xmm0, (%rax,%r15,8)
movl 0x20(%rsp), %eax
incl %eax
jmp 0x7572f
movl 0x3c(%rsp), %r15d
incl %r15d
addq $0x8, %r14
jmp 0x756cd
leaq 0x1a20(%rbx), %r15
leaq 0x8(%rsp), %rsi
movq %r15, %rdi
callq 0x8626a
movsd (%rax), %xmm0
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jne 0x757b9
jnp 0x757d6
leaq 0x8(%rsp), %rsi
movq %r15, %rdi
callq 0x8626a
movsd (%rax), %xmm0
ucomisd 0x10(%rsp), %xmm0
jbe 0x75960
cmpl $0x3, 0x1614(%rbx)
jb 0x75806
movq 0xf07b2(%rip), %rdi     # 0x165f98
leaq 0x67c40(%rip), %rsi     # 0xdd42d
callq 0x289f0
movl 0x8(%rsp), %esi
movq %rax, %rdi
callq 0x286e0
movq %rax, %rdi
callq 0x284a0
leaq 0x8(%rsp), %r12
movq %r15, %rdi
movq %r12, %rsi
callq 0x862a2
movsd 0x10(%rsp), %xmm0
movsd %xmm0, (%rax)
leaq 0x1a50(%rbx), %rdi
leaq 0xc(%rsp), %r15
movq %r15, %rsi
callq 0x862a2
movsd 0x10(%rsp), %xmm0
movsd %xmm0, (%rax)
leaq 0x1a80(%rbx), %rdi
movq %r15, %rsi
callq 0x862a2
movsd 0x10(%rsp), %xmm0
movsd %xmm0, (%rax)
leaq 0x1ab8(%rbx), %r14
movq 0x1ac8(%rbx), %rax
movl (%r12), %ebp
movq %r14, %r15
cmpq %r14, %rax
je 0x75882
cmpl %ebp, 0x28(%rax)
cmoveq %rax, %r15
movq %rax, %rdi
callq 0x28700
jmp 0x7586c
leaq 0x1ab0(%rbx), %r12
cmpq %r14, %r15
je 0x7589d
movq %r12, %rdi
movq %r15, %rsi
callq 0x8f7e2
movl 0x8(%rsp), %ebp
leaq 0x20(%rsp), %r13
movsd 0x10(%rsp), %xmm0
movsd %xmm0, (%r13)
movl %ebp, 0x8(%r13)
movq %r12, %rdi
movq %r13, %rsi
callq 0x8edfc
leaq 0x1ae0(%rbx), %rdi
movsd 0x10(%rsp), %xmm0
movsd %xmm0, (%r13)
leaq 0x8(%rsp), %r15
movl (%r15), %eax
movl %eax, 0x8(%r13)
leaq 0x20(%rsp), %rsi
callq 0x8edfc
movq 0x30(%rsp), %r13
movq (%r13), %r14
leaq 0x1cc0(%rbx), %r12
xorl %ebp, %ebp
cmpq 0x8(%r13), %r14
je 0x7592c
movsd (%r14), %xmm0
movsd %xmm0, 0x18(%rsp)
movq %r12, %rdi
movq %r15, %rsi
callq 0x86502
movl %ebp, %ecx
movq (%rax), %rax
movsd 0x18(%rsp), %xmm0
movsd %xmm0, (%rax,%rcx,8)
incl %ebp
addq $0x8, %r14
jmp 0x758f8
xorl %ebp, %ebp
pushq $0x1
popq %r14
movl %ebp, %eax
movq 0x15c8(%rbx), %rcx
subq 0x15c0(%rbx), %rcx
sarq $0x3, %rcx
cmpq %rax, %rcx
jbe 0x75960
movl 0x8(%rsp), %esi
movq %rbx, %rdi
movl %ebp, %edx
movl %r14d, %ecx
callq 0x75af6
incl %ebp
jmp 0x75932
leaq 0x1a50(%rbx), %r14
leaq 0xc(%rsp), %rsi
movq %r14, %rdi
callq 0x8626a
movsd (%rax), %xmm0
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jne 0x75984
jnp 0x759a1
leaq 0xc(%rsp), %rsi
movq %r14, %rdi
callq 0x8626a
movsd (%rax), %xmm0
ucomisd 0x10(%rsp), %xmm0
jbe 0x75ae7
cmpl $0x3, 0x1614(%rbx)
jb 0x759d1
movq 0xf05e7(%rip), %rdi     # 0x165f98
leaq 0x67a75(%rip), %rsi     # 0xdd42d
callq 0x289f0
movl 0x8(%rsp), %esi
movq %rax, %rdi
callq 0x286e0
movq %rax, %rdi
callq 0x284a0
leaq 0xc(%rsp), %r15
movq %r14, %rdi
movq %r15, %rsi
callq 0x862a2
movsd 0x10(%rsp), %xmm0
movsd %xmm0, (%rax)
leaq 0x1a80(%rbx), %rdi
movq %r15, %rsi
callq 0x862a2
movsd 0x10(%rsp), %xmm0
movsd %xmm0, (%rax)
leaq 0x1b18(%rbx), %r12
movq 0x1b28(%rbx), %rax
movl (%r15), %ebp
movq %r12, %r14
cmpq %r12, %rax
je 0x75a2e
cmpl %ebp, 0x28(%rax)
cmoveq %rax, %r14
movq %rax, %rdi
callq 0x28700
jmp 0x75a18
leaq 0x1b10(%rbx), %r15
cmpq %r12, %r14
je 0x75a49
movq %r15, %rdi
movq %r14, %rsi
callq 0x8f7e2
movl 0xc(%rsp), %ebp
leaq 0x20(%rsp), %r14
movsd 0x10(%rsp), %xmm0
movsd %xmm0, (%r14)
movl %ebp, 0x8(%r14)
movq %r15, %rdi
movq %r14, %rsi
callq 0x8edfc
leaq 0x1b70(%rbx), %rdi
movsd 0x10(%rsp), %xmm0
movsd %xmm0, (%r14)
movl 0xc(%rsp), %eax
movl %eax, 0x8(%r14)
leaq 0x20(%rsp), %r14
movq %r14, %rsi
callq 0x8edfc
leaq 0x1ba0(%rbx), %rdi
movsd 0x10(%rsp), %xmm0
movsd %xmm0, (%r14)
movl 0xc(%rsp), %eax
movl %eax, 0x8(%r14)
leaq 0x20(%rsp), %rsi
callq 0x8edfc
xorl %ebp, %ebp
pushq $0x1
popq %r14
movl %ebp, %eax
movq 0x15c8(%rbx), %rcx
subq 0x15c0(%rbx), %rcx
sarq $0x3, %rcx
cmpq %rax, %rcx
jbe 0x75ae7
movl 0x8(%rsp), %esi
movq %rbx, %rdi
movl %ebp, %edx
movl %r14d, %ecx
callq 0x75af6
incl %ebp
jmp 0x75ab9
addq $0x48, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq