LLM4Binary/decompile-bench-makefile huggingface dataset:
// File: /workspace/github_cpp_makefile_star2_O3/TBody[P]atomicpp/atomicpp/Spline/BicubicSpline.cpp
// Function: atomicpp::BicubicSpline::call0D_shared(std::pair<int, double>, std::pair<int, double>)
double BicubicSpline::call0D_shared(const std::pair<int, double> x_interp, const std::pair<int, double> y_interp){

	int low_x = x_interp.first;
	int low_y = y_interp.first;

	double x = x_interp.second;
	double y = y_interp.second;

	// // Construct the simple interpolation grid
	// // Find weightings based on linear distance
	// // w01 ------ w11    y
	// //  | \     / |      |
	// //  |  w(x,y) |    --/--x
	// //  | /     \ |      |
	// // w00 ------ w10

	grid_matrix alpha_sub = alpha_coeff[low_x][low_y];

	double x_vector[4] = {1, x, x*x, x*x*x}; //Row vector
	double y_vector[4] = {1, y, y*y, y*y*y}; //Column vector

	double return_value = 0.0;
	for(int i=0; i<4; ++i){
		for(int j=0; j<4; ++j){
			return_value += x_vector[i] * alpha_sub[i][j] * y_vector[j];
		}
	}

	return return_value;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %rbx
subq $0x78, %rsp
movsd %xmm1, -0x20(%rbp)
movl %edx, %ebx
movsd %xmm0, -0x28(%rbp)
addq $0x48, %rdi
movslq %esi, %rsi
callq 0x18356
movslq %ebx, %rsi
movq %rax, %rdi
callq 0x1145a
leaq -0x88(%rbp), %rbx
movq %rbx, %rdi
movq %rax, %rsi
callq 0x14dc0
movabsq $0x3ff0000000000000, %rax # imm = 0x3FF0000000000000
movq %rax, -0x70(%rbp)
movsd -0x28(%rbp), %xmm1
movsd %xmm1, -0x68(%rbp)
movapd %xmm1, %xmm0
mulsd %xmm1, %xmm0
movsd %xmm0, -0x60(%rbp)
mulsd %xmm1, %xmm0
movsd %xmm0, -0x58(%rbp)
movq %rax, -0x50(%rbp)
movsd -0x20(%rbp), %xmm1
movsd %xmm1, -0x48(%rbp)
movapd %xmm1, %xmm0
mulsd %xmm1, %xmm0
movsd %xmm0, -0x40(%rbp)
mulsd %xmm1, %xmm0
movsd %xmm0, -0x38(%rbp)
xorpd %xmm0, %xmm0
movsd %xmm0, -0x20(%rbp)
xorl %r14d, %r14d
movsd -0x70(%rbp,%r14,8), %xmm0
movsd %xmm0, -0x28(%rbp)
xorl %r15d, %r15d
movsd -0x20(%rbp), %xmm0
movsd %xmm0, -0x20(%rbp)
movq %rbx, %rdi
movq %r14, %rsi
callq 0x15c9c
movq %rax, %rdi
movq %r15, %rsi
callq 0x539c
movsd (%rax), %xmm0
mulsd -0x28(%rbp), %xmm0
mulsd -0x50(%rbp,%r15,8), %xmm0
movsd -0x20(%rbp), %xmm1
addsd %xmm0, %xmm1
movsd %xmm1, -0x20(%rbp)
movsd -0x20(%rbp), %xmm0
incq %r15
cmpq $0x4, %r15
jne 0x17858
incq %r14
cmpq $0x4, %r14
jne 0x17844
leaq -0x88(%rbp), %rdi
callq 0x10424
movsd -0x20(%rbp), %xmm0
addq $0x78, %rsp
popq %rbx
popq %r14
popq %r15
popq %rbp
retq
// File: /workspace/github_cpp_makefile_star2_O3/TBody[P]atomicpp/atomicpp/Spline/BivariateBSpline.cpp
// Function: atomicpp::BivariateBSpline::bispeu(std::vector<double, std::allocator<double>> const&, std::vector<double, std::allocator<double>> const&, std::vector<double, std::allocator<double>> const&, double const&, double const&)
double BivariateBSpline::bispeu(const std::vector<double>& tx,const std::vector<double>& ty,const std::vector<double>& c,const double& x,const double& y){
  // z = bispeu(tx,ty,c,kx,ky,x,y)

  int nx = tx.size();
  int ny = ty.size();
  int kx = 3;
  int ky = 3;

  double z = fpbisp(tx, nx, ty, ny, c, kx, ky, x, y);

  return z;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x18, %rsp
movq %r9, %r14
movq %r8, -0x30(%rbp)
movq %rcx, %r15
movq %rdx, %r12
movq %rsi, %r13
movq %rsi, %rdi
callq 0x12b22
leaq -0x40(%rbp), %rbx
movl %eax, (%rbx)
movq %r12, %rdi
callq 0x12b22
leaq -0x3c(%rbp), %r8
movl %eax, (%r8)
movl $0x3, %eax
leaq -0x38(%rbp), %rdi
movl %eax, (%rdi)
leaq -0x34(%rbp), %r10
movl %eax, (%r10)
movq %r13, %rsi
movq %rbx, %rdx
movq %r12, %rcx
movq %r15, %r9
pushq %r14
pushq -0x30(%rbp)
pushq %r10
pushq %rdi
callq 0x1cc38
addq $0x38, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
// File: /workspace/github_cpp_makefile_star2_O3/TBody[P]atomicpp/atomicpp/Spline/BivariateBSpline.cpp
// Function: atomicpp::BivariateBSpline::fpgivs(double, double&, double&, double&)
void BivariateBSpline::fpgivs(const double piv, double& ww, double& cos, double& sin){
  //  subroutine fpgivs calculates the parameters of a given
  //  transformation .

  double dd;
  if(abs(piv)>=ww){
    dd = abs(piv)*sqrt(1+(ww/piv)*(ww/piv));
  } else {
    dd = ww*sqrt(1+(piv/ww)*(piv/ww));
  }
  cos = ww/dd;
  sin = piv/dd;
  ww = dd;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %rbx
pushq %rax
movq %rcx, %rbx
movq %rdx, %r15
movq %rsi, %r14
movsd %xmm0, -0x20(%rbp)
callq 0x1d151
movapd %xmm0, %xmm1
movsd (%r14), %xmm0
ucomisd %xmm0, %xmm1
jae 0x1c5bb
movsd -0x20(%rbp), %xmm1
divsd %xmm0, %xmm1
mulsd %xmm1, %xmm1
addsd 0x5a53(%rip), %xmm1     # 0x22008
movapd %xmm0, %xmm2
jmp 0x1c5df
movsd -0x20(%rbp), %xmm0
callq 0x1d151
movsd (%r14), %xmm2
movapd %xmm2, %xmm1
divsd -0x20(%rbp), %xmm1
mulsd %xmm1, %xmm1
addsd 0x5a29(%rip), %xmm1     # 0x22008
sqrtsd %xmm1, %xmm1
mulsd %xmm0, %xmm1
divsd %xmm1, %xmm2
movsd %xmm2, (%r15)
movsd -0x20(%rbp), %xmm0
divsd %xmm1, %xmm0
movsd %xmm0, (%rbx)
movsd %xmm1, (%r14)
addq $0x8, %rsp
popq %rbx
popq %r14
popq %r15
popq %rbp
retq
nop
// File: /workspace/github_cpp_makefile_star2_O3/TBody[P]atomicpp/atomicpp/Spline/BivariateBSpline.cpp
// Function: atomicpp::BivariateBSpline::fpback(std::vector<std::vector<double, std::allocator<double>>, std::allocator<std::vector<double, std::allocator<double>>>> const&, std::vector<double, std::allocator<double>> const&, int, int, std::vector<double, std::allocator<double>>&, int)
void BivariateBSpline::fpback(const std::vector<std::vector<double>>& a, const std::vector<double>& z, const int n, const int k, std::vector<double>& C, const int nest){
  //No shift version of fpback - overloaded

  // std::cout << "fpback called" << std::endl;

  C.at(n-1) = z.at(n-1)/a.at(n-1).at(0);
  
  int i = n-1;
  double store;

  if(i!=0){
    for(int j=2; j <= n; ++j){
      store = z.at(i-1);
      int i1 = k-1;

      if(j <= k-1){
        i1 = j-1;
      }
      int m = i;
      for(int l=1; l <= i1; ++l){
        m = m+1;
        store = store - C.at(m-1)*a.at(i-1).at(l);
      }
      C.at(i-1) = store/a.at(i-1).at(0);
      i -= 1;
    }
  }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x48, %rsp
movq %r9, %r15
movl %r8d, %ebx
movl %ecx, %r12d
movq %rdx, %rdi
movq %rsi, %r13
leal -0x1(%r12), %eax
movslq %eax, %r14
movq %rdx, -0x58(%rbp)
movq %r14, %rsi
callq 0x1d15e
movsd (%rax), %xmm0
movsd %xmm0, -0x30(%rbp)
movq %r13, %rdi
movq %r14, %rsi
callq 0x1d180
movq %rax, %rdi
xorl %esi, %esi
callq 0x1d15e
movsd -0x30(%rbp), %xmm0
divsd (%rax), %xmm0
movsd %xmm0, -0x30(%rbp)
movq %r15, %rdi
movq %r14, %rsi
callq 0x1d102
movsd -0x30(%rbp), %xmm0
movsd %xmm0, (%rax)
movq %r12, -0x48(%rbp)
cmpl $0x2, %r12d
jl 0x1c979
movl -0x48(%rbp), %r12d
decq %r12
movl $0x2, %r14d
movl %ebx, -0x34(%rbp)
movq %r13, -0x40(%rbp)
movq %r15, -0x50(%rbp)
leaq -0x1(%r12), %rsi
movq -0x58(%rbp), %rdi
movq %rsi, %r15
callq 0x1d15e
movsd (%rax), %xmm0
cmpl $0x2, %ebx
movq %r14, -0x60(%rbp)
movsd %xmm0, -0x30(%rbp)
jl 0x1c924
cmpl %ebx, %r14d
cmovll %r14d, %ebx
movslq %ebx, %rax
movq %rax, -0x68(%rbp)
movl $0x1, %r14d
movq -0x40(%rbp), %rbx
leaq 0x1(%r12), %r13
movq -0x50(%rbp), %rdi
movq %r12, %rsi
callq 0x1d102
movsd (%rax), %xmm0
movsd %xmm0, -0x70(%rbp)
movq %rbx, %rdi
movq %r15, %rsi
callq 0x1d180
movq %rax, %rdi
movq %r14, %rsi
callq 0x1d15e
movsd -0x70(%rbp), %xmm1
mulsd (%rax), %xmm1
movsd -0x30(%rbp), %xmm0
subsd %xmm1, %xmm0
movsd %xmm0, -0x30(%rbp)
incq %r14
movq %r13, %r12
cmpq -0x68(%rbp), %r14
jl 0x1c8cf
jmp 0x1c928
movq -0x40(%rbp), %rbx
movq %rbx, %rdi
movq %r15, %r12
movq %r15, %rsi
callq 0x1d180
movq %rax, %rdi
xorl %esi, %esi
callq 0x1d15e
movsd -0x30(%rbp), %xmm0
divsd (%rax), %xmm0
movsd %xmm0, -0x30(%rbp)
movq -0x50(%rbp), %rdi
movq %r15, %rsi
callq 0x1d102
movsd -0x30(%rbp), %xmm0
movsd %xmm0, (%rax)
movq -0x60(%rbp), %rcx
leal 0x1(%rcx), %eax
cmpl -0x48(%rbp), %ecx
movl %eax, %r14d
movl -0x34(%rbp), %ebx
jne 0x1c894
addq $0x48, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
// File: /workspace/github_cpp_makefile_star2_O3/TBody[P]atomicpp/atomicpp/RateEquations.cpp
// Function: atomicpp::RateEquations::calculateStoppingTimeConstantFactor(double)
void RateEquations::calculateStoppingTimeConstantFactor(const double coulomb_logarithm){
	//Stangeby "The Plasma Boundary of Magnetic Fusion Devices" (2000), eqn 6.35
	tau_s_ii_CF = ( 1.47e13 * mz * sqrt(1/mi) ) / ( (1 + mi/mz) * coulomb_logarithm );
	//s is 'stopping'
	//ii is 'ion ion'
	//CF stands for 'Constant Factor'
	collision_frequency_s_ii_CF = 1/tau_s_ii_CF;
	//Use the collision frequency instead of the characteristic time, since multiplication is faster than division
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %rbx
subq $0x18, %rsp
movq %rdi, %rbx
movsd 0x38(%rdi), %xmm2
mulsd 0x6351(%rip), %xmm2     # 0x25060
movsd 0x32f1(%rip), %xmm3     # 0x22008
movapd %xmm3, %xmm1
divsd 0x48(%rdi), %xmm1
movapd %xmm0, %xmm4
xorpd %xmm0, %xmm0
ucomisd %xmm0, %xmm1
jb 0x1ed37
xorps %xmm0, %xmm0
sqrtsd %xmm1, %xmm0
jmp 0x1ed5c
movapd %xmm1, %xmm0
movsd %xmm2, -0x18(%rbp)
movsd %xmm4, -0x10(%rbp)
callq 0x42b0
movsd -0x10(%rbp), %xmm4
movsd 0x32b1(%rip), %xmm3     # 0x22008
movsd -0x18(%rbp), %xmm2
mulsd %xmm0, %xmm2
movsd 0x48(%rbx), %xmm0
divsd 0x38(%rbx), %xmm0
addsd %xmm3, %xmm0
mulsd %xmm4, %xmm0
divsd %xmm0, %xmm2
movsd %xmm2, 0x50(%rbx)
divsd %xmm2, %xmm3
movsd %xmm3, 0x58(%rbx)
addq $0x18, %rsp
popq %rbx
popq %rbp
retq
nop
// File: /workspace/github_cpp_makefile_star2_O3/TBody[P]atomicpp/atomicpp/RateEquations.cpp
// Function: atomicpp::RateEquations::calculateIonIonDragFactor(double, double)
double RateEquations::calculateIonIonDragFactor(const double Ti, const double Ni){
	//Stangeby "The Plasma Boundary of Magnetic Fusion Devices" (2000), eqn 6.35
	double collision_frequency_ii_PF = collision_frequency_s_ii_CF * Ni/(Ti*sqrt(Ti));
	//ii is 'ion ion'
	//PF stands for 'Point Factor' -- i.e. this factor is constant for a single location point at a single time
	return collision_frequency_ii_PF;
	//collision_frequency_s_ii on Impurity^k+ = collision_frequency_ii_PF * k*k where k is the impurity change
}

// Assembly:
mulsd 0x58(%rdi), %xmm1
movapd %xmm0, %xmm2
xorpd %xmm0, %xmm0
ucomisd %xmm0, %xmm2
jb 0x1edcc
xorps %xmm0, %xmm0
sqrtsd %xmm2, %xmm0
jmp 0x1edf6
pushq %rbp
movq %rsp, %rbp
subq $0x10, %rsp
movapd %xmm2, %xmm0
movsd %xmm1, -0x10(%rbp)
movsd %xmm2, -0x8(%rbp)
callq 0x42b0
movsd -0x8(%rbp), %xmm2
movsd -0x10(%rbp), %xmm1
addq $0x10, %rsp
popq %rbp
mulsd %xmm2, %xmm0
divsd %xmm0, %xmm1
movapd %xmm1, %xmm0
retq
nop
// File: /workspace/github_cpp_makefile_star2_O3/TBody[P]atomicpp/atomicpp/RateEquations.cpp
// Function: atomicpp::RateEquations::calculateIonIonDrag(double, double, double, std::vector<double, std::allocator<double>> const&, std::vector<double, std::allocator<double>> const&)
void RateEquations::calculateIonIonDrag(
	const double Ne,
	const double Te,
	const double Vi,
	const std::vector<double>& Nzk,
	const std::vector<double>& Vzk
	){
	
	//Assume that Te = Ti (isothermal), Ne = Ni (quasi-neutrality for Z=1 dominant ion)
	double collision_frequency_ii_PF = calculateIonIonDragFactor(Te, Ne);
	//ii is 'ion ion'
	//PF is 'Point Factor' -- i.e. a constant value shared for this point

	for(int k=1; k <= Z; ++k){//Don't consider the ground state -- not an ion so must be treated separately
		if(Nzk[k] > Nthres){
			double collision_frequency_s_ii = collision_frequency_ii_PF * k*k;
			double IonIonDrag_FF = mz * amu_to_kg * ((Vi+1) - Vzk[k]) * collision_frequency_s_ii;
			F_zk[k] += IonIonDrag_FF; //Calculate the force on the impurity ion due to ion-ion drag
			F_i     -= IonIonDrag_FF; //Calculate the force on the dominant ion due to ion-ion drag
		};
	}
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x28, %rsp
movq %rdx, %rbx
movq %rsi, %r14
movsd %xmm2, -0x30(%rbp)
movapd %xmm0, %xmm2
movq %rdi, %r15
movapd %xmm1, %xmm0
movapd %xmm2, %xmm1
callq 0x1edb0
movsd %xmm0, -0x40(%rbp)
cmpl $0x0, 0x34(%r15)
jle 0x20878
movsd -0x30(%rbp), %xmm0
addsd 0x1853(%rip), %xmm0     # 0x22008
movsd %xmm0, -0x30(%rbp)
leaq 0x88(%r15), %r12
movl $0x1, %r13d
movq %r14, %rdi
movq %r13, %rsi
callq 0x184f2
movsd (%rax), %xmm0
ucomisd 0x40(%r15), %xmm0
jbe 0x20864
xorps %xmm0, %xmm0
cvtsi2sd %r13d, %xmm0
movsd -0x40(%rbp), %xmm1
mulsd %xmm0, %xmm1
mulsd %xmm0, %xmm1
movsd %xmm1, -0x38(%rbp)
movsd 0x38(%r15), %xmm0
mulsd 0x4866(%rip), %xmm0     # 0x25070
movsd %xmm0, -0x48(%rbp)
movq %rbx, %rdi
movq %r13, %rsi
callq 0x184f2
movsd -0x30(%rbp), %xmm0
subsd (%rax), %xmm0
mulsd -0x48(%rbp), %xmm0
mulsd -0x38(%rbp), %xmm0
movsd %xmm0, -0x38(%rbp)
movq %r12, %rdi
movq %r13, %rsi
callq 0x539c
movsd (%rax), %xmm0
movsd -0x38(%rbp), %xmm1
addsd %xmm1, %xmm0
movsd %xmm0, (%rax)
movsd 0xd8(%r15), %xmm0
subsd %xmm1, %xmm0
movsd %xmm0, 0xd8(%r15)
leaq 0x1(%r13), %rax
movslq 0x34(%r15), %rcx
cmpq %rcx, %r13
movq %rax, %r13
jl 0x207c7
addq $0x28, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
nop
// File: /workspace/github_cpp_makefile_star2_O3/TBody[P]atomicpp/atomicpp/RateEquations.cpp
// Function: atomicpp::RateEquations::calculateIonNeutralDrag(double, double, std::vector<double, std::allocator<double>> const&, std::vector<double, std::allocator<double>> const&)
void RateEquations::calculateIonNeutralDrag(
	const double Nn,
	const double Vn,
	const std::vector<double>& Nzk,
	const std::vector<double>& Vzk
	){

	// Hard sphere's approximation
	// Radius of Carbon and Hydrogen atoms are ~ 50pm
	// a12 radius = a1+a2 = 100pm = 100e-12 = 1e-10
	// a12^2 = 1e-20
	// The cross-section (from Lieberman & Lichtenberg, 1994, Principles of Plasma Discharges & Materials Processing, eqn 3.1.4) is
	double sigma = M_PI * 1e-20;

	for(int k=0; k <= Z; ++k){//Don't consider the ground state -- not an ion so must be treated separately
		if(Nzk[k] > Nthres){
			double velocity_shear = Vn - Vzk[k];
			double IonNeutralDrag_FF = mz * amu_to_kg * Nn * sigma * (velocity_shear*velocity_shear);
			F_zk[k] += IonNeutralDrag_FF; //Calculate the force on the impurity ion due to ion-neutral drag
			F_n     -= IonNeutralDrag_FF; //Calculate the force on the dominant neutral due to ion-neutral drag
		};
	}
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x18, %rsp
movsd %xmm1, -0x38(%rbp)
movsd %xmm0, -0x30(%rbp)
cmpl $0x0, 0x34(%rdi)
js 0x20959
movq %rdx, %rbx
movq %rsi, %r14
movq %rdi, %r15
leaq 0x88(%rdi), %r12
movq $-0x1, %r13
incq %r13
movq %r14, %rdi
movq %r13, %rsi
callq 0x184f2
movsd (%rax), %xmm0
ucomisd 0x40(%r15), %xmm0
jbe 0x2094c
movq %rbx, %rdi
movq %r13, %rsi
callq 0x184f2
movsd -0x38(%rbp), %xmm1
subsd (%rax), %xmm1
movsd 0x38(%r15), %xmm0
mulsd 0x4770(%rip), %xmm0     # 0x25070
mulsd -0x30(%rbp), %xmm0
mulsd 0x4773(%rip), %xmm0     # 0x25080
mulsd %xmm1, %xmm1
mulsd %xmm0, %xmm1
movsd %xmm1, -0x40(%rbp)
movq %r12, %rdi
movq %r13, %rsi
callq 0x539c
movsd (%rax), %xmm0
movsd -0x40(%rbp), %xmm1
addsd %xmm1, %xmm0
movsd %xmm0, (%rax)
movsd 0xe8(%r15), %xmm0
subsd %xmm1, %xmm0
movsd %xmm0, 0xe8(%r15)
movslq 0x34(%r15), %rax
cmpq %rax, %r13
jl 0x208c4
addq $0x18, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
// File: /workspace/github_cpp_makefile_star2_O3/TBody[P]atomicpp/atomicpp/RateEquations.cpp
// Function: atomicpp::RateEquations::calculateChargeExchangePowerEquation(double, std::vector<double, std::allocator<double>> const&, double, double)
void RateEquations::calculateChargeExchangePowerEquation(
	const double Nn,
	const std::vector<double>& Nzk,
	const double Te,
	const double Ne
	){
	//Calculate the power - doesn't need as high precision since everything is positive
	
	std::shared_ptr<RateCoefficient> cx_power_coefficient = rate_coefficients["cx_power"];
	for(int k=0; k < Z; ++k){
		double cx_power_coefficient_evaluated = cx_power_coefficient->call0D(k, Te, Ne);
		double cx_power_rate = cx_power_coefficient_evaluated * Nn * Nzk[k+1];
		Prad  += cx_power_rate;
		Pcool += cx_power_rate;
	}
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
subq $0x60, %rsp
movsd %xmm2, -0x40(%rbp)
movsd %xmm1, -0x38(%rbp)
movq %rsi, %rbx
movsd %xmm0, -0x30(%rbp)
movq %rdi, %r14
leaq -0x21(%rbp), %r15
movq %r15, %rdi
callq 0x4540
leaq 0x2c2a(%rip), %rsi      # 0x237d7
leaq -0x78(%rbp), %rdi
movq %r15, %rdx
callq 0x4160
leaq -0x78(%rbp), %rsi
movq %r14, %rdi
callq 0xd17e
leaq -0x58(%rbp), %rdi
movq %rax, %rsi
callq 0xd174
leaq -0x78(%rbp), %rdi
callq 0x41a0
leaq -0x21(%rbp), %rdi
callq 0x58c6
cmpl $0x0, 0x34(%r14)
jle 0x20c54
xorl %r15d, %r15d
leaq -0x58(%rbp), %r12
movq %r12, %rdi
callq 0x53ae
movq %rax, %rdi
movl %r15d, %esi
movsd -0x38(%rbp), %xmm0
movsd -0x40(%rbp), %xmm1
callq 0x11312
mulsd -0x30(%rbp), %xmm0
movsd %xmm0, -0x48(%rbp)
incq %r15
movq %rbx, %rdi
movq %r15, %rsi
callq 0x184f2
movsd -0x48(%rbp), %xmm1
mulsd (%rax), %xmm1
movsd 0x68(%r14), %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, 0x68(%r14)
addsd 0x60(%r14), %xmm1
movsd %xmm1, 0x60(%r14)
movslq 0x34(%r14), %rax
cmpq %rax, %r15
jl 0x20bf1
leaq -0x58(%rbp), %rdi
callq 0x53b8
addq $0x60, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
popq %rbp
retq
movq %rax, %rbx
leaq -0x78(%rbp), %rdi
callq 0x41a0
jmp 0x20c7b
movq %rax, %rbx
leaq -0x21(%rbp), %rdi
callq 0x58c6
jmp 0x20c92
movq %rax, %rbx
leaq -0x58(%rbp), %rdi
callq 0x53b8
movq %rbx, %rdi
callq 0x45a0
// File: /workspace/github_cpp_makefile_star2_O3/TBody[P]atomicpp/atomicpp/RateEquations.cpp
// Function: atomicpp::RateEquations::makeDerivativeStruct()
DerivStruct RateEquations::makeDerivativeStruct(){
	DerivStruct derivative_struct;

	derivative_struct.Pcool = Pcool;
	derivative_struct.Prad  = Prad;
	derivative_struct.dNzk  = dNzk;
	derivative_struct.F_zk  = F_zk;
	derivative_struct.dNe   = dNe;
	derivative_struct.F_i   = F_i;
	derivative_struct.dNn   = dNn;
	derivative_struct.F_n   = F_n;

	return derivative_struct;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r14
pushq %rbx
movq %rsi, %r14
movq %rdi, %rbx
callq 0x21140
movsd 0x60(%r14), %xmm0
movsd %xmm0, (%rbx)
movsd 0x68(%r14), %xmm0
movsd %xmm0, 0x8(%rbx)
leaq 0x70(%r14), %rsi
leaq 0x10(%rbx), %rdi
callq 0x15982
leaq 0x88(%r14), %rsi
leaq 0x28(%rbx), %rdi
callq 0x15982
movsd 0xd0(%r14), %xmm0
movsd %xmm0, 0x40(%rbx)
movsd 0xd8(%r14), %xmm0
movsd %xmm0, 0x48(%rbx)
movsd 0xe0(%r14), %xmm0
movsd %xmm0, 0x50(%rbx)
movsd 0xe8(%r14), %xmm0
movsd %xmm0, 0x58(%rbx)
movq %rbx, %rax
popq %rbx
popq %r14
popq %rbp
retq
movq %rax, %r14
movq %rbx, %rdi
callq 0x5408
movq %r14, %rdi
callq 0x45a0
nop
// File: /workspace/github_cpp_makefile_star2_O3/TBody[P]atomicpp/atomicpp/RateEquations.cpp
// Function: atomicpp::RateEquations::computeDerivsHydrogen(double, double, std::vector<double, std::allocator<double>> const&, std::vector<double, std::allocator<double>> const&)
DerivStruct RateEquations::computeDerivsHydrogen(
	const double Te,
	const double Ne,
	const std::vector<double>& Nhk,
	const std::vector<double>& Vhk){

	resetDerivatives(); //Reset all the derivatives to zero, since the object has a memory of the previous step

	calculateElectronImpactPopulationEquation(Ne, Nhk, Vhk, Te);

	//Apply neumairSum corrections
	for(int k=0; k<=Z; ++k){
		dNzk[k] += dNzk_correction[k]; //Uses 'z' notation since these are the attributes stored in RateEquations object
		F_zk[k] += F_zk_correction[k]; //
	}

	verifyNeumaierSummation(Te, Ne);
	
	calculateElectronImpactPowerEquation(Ne, Nhk, Te);

	// auto derivative_tuple = makeDerivativeTuple();
	// return derivative_tuple;
	DerivStruct derivative_struct = makeDerivativeStruct();
	return derivative_struct;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x38, %rsp
movq %rcx, %rbx
movq %rdx, %r15
movsd %xmm1, -0x30(%rbp)
movsd %xmm0, -0x38(%rbp)
movq %rsi, %r14
movq %rdi, -0x58(%rbp)
movq %rsi, %rdi
callq 0x1efd0
movq %r14, %rdi
movsd -0x30(%rbp), %xmm0
movq %r15, -0x50(%rbp)
movq %r15, %rsi
movq %rbx, %rdx
movsd -0x38(%rbp), %xmm1
callq 0x1f084
movq %r14, -0x40(%rbp)
cmpl $0x0, 0x34(%r14)
js 0x20e19
movq -0x40(%rbp), %rax
leaq 0xa0(%rax), %r12
leaq 0x70(%rax), %r13
leaq 0xb8(%rax), %rbx
leaq 0x88(%rax), %r15
movq $-0x1, %r14
incq %r14
movq %r12, %rdi
movq %r14, %rsi
callq 0x539c
movsd (%rax), %xmm0
movsd %xmm0, -0x48(%rbp)
movq %r13, %rdi
movq %r14, %rsi
callq 0x539c
movsd -0x48(%rbp), %xmm0
addsd (%rax), %xmm0
movsd %xmm0, (%rax)
movq %rbx, %rdi
movq %r14, %rsi
callq 0x539c
movsd (%rax), %xmm0
movsd %xmm0, -0x48(%rbp)
movq %r15, %rdi
movq %r14, %rsi
callq 0x539c
movsd -0x48(%rbp), %xmm0
addsd (%rax), %xmm0
movsd %xmm0, (%rax)
movq -0x40(%rbp), %rax
movslq 0x34(%rax), %rax
cmpq %rax, %r14
jl 0x20db1
movsd 0x11e7(%rip), %xmm2     # 0x22008
movq -0x40(%rbp), %r14
movq %r14, %rdi
movsd -0x38(%rbp), %xmm0
movsd -0x30(%rbp), %xmm1
callq 0x20486
movq %r14, %rdi
movsd -0x30(%rbp), %xmm0
movq -0x50(%rbp), %rsi
movsd -0x38(%rbp), %xmm1
callq 0x20968
movq -0x58(%rbp), %rbx
movq %rbx, %rdi
movq %r14, %rsi
callq 0x20c9a
movq %rbx, %rax
addq $0x38, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
// File: /workspace/github_cpp_makefile_star2_O3/TBody[P]atomicpp/atomicpp/RateEquations.cpp
// Function: atomicpp::neumaierSum(std::vector<double, std::allocator<double>> const&, double)
std::pair<double, double> atomicpp::neumaierSum(const std::vector<double>& list_to_sum, const double previous_correction /* = 0.0*/){
    double sum = 0.0;

    double correction = previous_correction;                 // A running compensation for lost low-order bits. Use previous result to restart summation

    for(int i=0; i < (int)(list_to_sum.size()); ++i){
        double temporary_sum = sum + list_to_sum[i];
        if (std::fabs(sum) >= std::fabs(list_to_sum[i])){
            correction += (sum - temporary_sum) + list_to_sum[i]; // If sum is bigger, low-order digits of list_to_sum[i] are lost.
        } else {
            correction += (list_to_sum[i] - temporary_sum) + sum; // Else low-order digits of sum are lost
        }
        sum = temporary_sum;
	}

	std::pair<double, double> neumaier_pair(sum, correction);

	return neumaier_pair;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r14
pushq %rbx
subq $0x60, %rsp
movq %rdi, %rbx
movq $0x0, -0x48(%rbp)
movsd %xmm0, -0x38(%rbp)
movsd %xmm0, -0x40(%rbp)
callq 0x12b22
testl %eax, %eax
jle 0x20f6f
xorps %xmm0, %xmm0
xorl %r14d, %r14d
movaps %xmm0, -0x30(%rbp)
movq %rbx, %rdi
movq %r14, %rsi
callq 0x184f2
movsd (%rax), %xmm0
movapd -0x30(%rbp), %xmm1
addsd %xmm1, %xmm0
movsd %xmm0, -0x18(%rbp)
movapd 0x3c26(%rip), %xmm0     # 0x24af0
andpd %xmm0, %xmm1
movapd %xmm1, -0x60(%rbp)
movq %rbx, %rdi
movq %r14, %rsi
callq 0x184f2
movsd (%rax), %xmm0
andpd 0x3c06(%rip), %xmm0     # 0x24af0
movapd -0x60(%rbp), %xmm1
ucomisd %xmm0, %xmm1
jae 0x20f14
movq %rbx, %rdi
movq %r14, %rsi
callq 0x184f2
movsd (%rax), %xmm0
subsd -0x18(%rbp), %xmm0
movapd -0x30(%rbp), %xmm1
addsd %xmm0, %xmm1
jmp 0x20f37
movapd -0x30(%rbp), %xmm0
subsd -0x18(%rbp), %xmm0
movapd %xmm0, -0x30(%rbp)
movq %rbx, %rdi
movq %r14, %rsi
callq 0x184f2
movapd -0x30(%rbp), %xmm1
addsd (%rax), %xmm1
movsd -0x38(%rbp), %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, -0x38(%rbp)
movsd %xmm0, -0x40(%rbp)
movsd -0x18(%rbp), %xmm0
movsd %xmm0, -0x48(%rbp)
incq %r14
movq %rbx, %rdi
callq 0x12b22
cltq
movsd -0x18(%rbp), %xmm0
cmpq %rax, %r14
jl 0x20ea1
leaq -0x70(%rbp), %rbx
leaq -0x48(%rbp), %rsi
leaq -0x40(%rbp), %rdx
movq %rbx, %rdi
callq 0x1861e
movsd (%rbx), %xmm0
movsd 0x8(%rbx), %xmm1
addq $0x60, %rsp
popq %rbx
popq %r14
popq %rbp
retq
nop
// File: /workspace/github_cpp_makefile_star2_O3/TBody[P]atomicpp/atomicpp/RateEquations.cpp
// Function: atomicpp::RateEquations::printDerivativeStruct(atomicpp::DerivStruct&)
void RateEquations::printDerivativeStruct(DerivStruct& derivative_struct){
	double Pcool             = derivative_struct.Pcool;
	double Prad              = derivative_struct.Prad;
	std::vector<double> dNzk = derivative_struct.dNzk;
	std::vector<double> F_zk = derivative_struct.F_zk;
	double dNe               = derivative_struct.dNe;
	double F_i               = derivative_struct.F_i;
	double dNn               = derivative_struct.dNn;
	double F_n               = derivative_struct.F_n;

	//Print-verifying the return from computeDerivs
	std::printf("Pcool:       %+.2e [J m^-3 s^-1]\n", Pcool);
	std::printf("Prad:        %+.2e [J m^-3 s^-1]\n" , Prad);
	for(int k=0; k<=Z; ++k){
	std::printf("dNz^(%i)/dt:  %+.2e [p m^-3 s^-1]\n",k ,dNzk[k]);
	}
	for(int k=0; k<=Z; ++k){
	std::printf("Fz^(%i):      %+.2e [N]\n",k ,F_zk[k]);
	}
	std::printf("dNe/dt:      %+.2e [p m^-3 s^-1]\n",dNe);
	std::printf("F_i:         %+.2e [N]\n",F_i);
	std::printf("dNn/dt:      %+.2e [p m^-3 s^-1]\n",dNn);
	std::printf("F_n:         %+.2e [N]\n",F_n);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
subq $0x60, %rsp
movq %rsi, %r14
movq %rdi, %rbx
movsd (%rsi), %xmm0
movsd %xmm0, -0x48(%rbp)
movsd 0x8(%rsi), %xmm0
movsd %xmm0, -0x50(%rbp)
addq $0x10, %rsi
leaq -0x68(%rbp), %rdi
callq 0x14d0e
leaq 0x28(%r14), %rsi
leaq -0x80(%rbp), %rdi
callq 0x14d0e
movsd 0x40(%r14), %xmm0
movsd %xmm0, -0x28(%rbp)
movsd 0x48(%r14), %xmm0
movsd %xmm0, -0x30(%rbp)
movsd 0x50(%r14), %xmm0
movsd %xmm0, -0x38(%rbp)
movsd 0x58(%r14), %xmm0
movsd %xmm0, -0x40(%rbp)
leaq 0x41f1(%rip), %rdi      # 0x251fc
movsd -0x48(%rbp), %xmm0
movb $0x1, %al
callq 0x4080
leaq 0x4200(%rip), %rdi      # 0x2521e
movsd -0x50(%rbp), %xmm0
movb $0x1, %al
callq 0x4080
cmpl $0x0, 0x34(%rbx)
js 0x210a8
xorl %r14d, %r14d
leaq -0x68(%rbp), %r15
leaq 0x4202(%rip), %r12      # 0x25240
movq %r15, %rdi
movq %r14, %rsi
callq 0x539c
movsd (%rax), %xmm0
movq %r12, %rdi
movl %r14d, %esi
movb $0x1, %al
callq 0x4080
leaq 0x1(%r14), %rcx
movslq 0x34(%rbx), %rax
cmpq %rax, %r14
movq %rcx, %r14
jl 0x2103e
testl %eax, %eax
js 0x210a8
xorl %r14d, %r14d
leaq -0x80(%rbp), %r15
leaq 0x41e7(%rip), %r12      # 0x25263
movq %r15, %rdi
movq %r14, %rsi
callq 0x539c
movsd (%rax), %xmm0
movq %r12, %rdi
movl %r14d, %esi
movb $0x1, %al
callq 0x4080
leaq 0x1(%r14), %rax
movslq 0x34(%rbx), %rcx
cmpq %rcx, %r14
movq %rax, %r14
jl 0x2107c
leaq 0x41cd(%rip), %rdi      # 0x2527c
movsd -0x28(%rbp), %xmm0
movb $0x1, %al
callq 0x4080
leaq 0x41dc(%rip), %rdi      # 0x2529e
movsd -0x30(%rbp), %xmm0
movb $0x1, %al
callq 0x4080
leaq 0x41e1(%rip), %rdi      # 0x252b6
movsd -0x38(%rbp), %xmm0
movb $0x1, %al
callq 0x4080
leaq 0x41f0(%rip), %rdi      # 0x252d8
movsd -0x40(%rbp), %xmm0
movb $0x1, %al
callq 0x4080
leaq -0x80(%rbp), %rdi
callq 0x53c6
leaq -0x68(%rbp), %rdi
callq 0x53c6
addq $0x60, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
popq %rbp
retq
movq %rax, %rbx
leaq -0x68(%rbp), %rdi
callq 0x53c6
movq %rbx, %rdi
callq 0x45a0
nop
// File: /workspace/github_cpp_makefile_star2_O3/gkosae[P]ArduinoNeuralNet/neuron.cpp
// Function: Neuron::initialiseWeights()
void Neuron::initialiseWeights() {
 // Initialise all weights with a random number between -1 and 1
  for (double& weight : weights) {
      weight = -1 + 2*randomize();
  }

  threshold = -1 + 2*randomize();
}

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
movq %rdi, %rbx
movq 0x20(%rdi), %r14
movq 0x28(%rdi), %r15
cmpq %r15, %r14
je 0x25b7
callq 0x25d3
addsd %xmm0, %xmm0
addsd 0x4a5c(%rip), %xmm0     # 0x7008
movsd %xmm0, (%r14)
addq $0x8, %r14
jmp 0x2596
callq 0x25d3
addsd %xmm0, %xmm0
addsd 0x4a40(%rip), %xmm0     # 0x7008
movsd %xmm0, 0x18(%rbx)
popq %rbx
popq %r14
popq %r15
retq
// File: /workspace/github_cpp_makefile_star2_O3/gkosae[P]ArduinoNeuralNet/neuron.cpp
// Function: Neuron::activate(std::vector<double, std::allocator<double>>)
void Neuron::activate(std::vector<double> inputs) {
    unsigned int number_of_inputs = inputs.size();
    action_potential = 0;

    for (unsigned int i = 0; i < number_of_inputs; ++i) {
      action_potential += (weights.at(i) * inputs.at(i));
    }

    // Add weighted bias
    action_potential += (bias * threshold);

    output = sigmoid(action_potential);
}

// Assembly:
pushq %rbx
movq %rdi, %rbx
movq (%rsi), %rax
movq 0x8(%rsi), %rdx
subq %rax, %rdx
movq $0x0, 0x8(%rdi)
movq %rdx, %rcx
shrq $0x3, %rcx
testl %ecx, %ecx
je 0x2752
sarq $0x3, %rdx
movq 0x20(%rbx), %rcx
movq 0x28(%rbx), %rsi
subq %rcx, %rsi
sarq $0x3, %rsi
movl %edx, %edi
xorpd %xmm1, %xmm1
xorl %r8d, %r8d
cmpq %r8, %rsi
je 0x278c
cmpq %r8, %rdx
je 0x2798
movsd (%rcx,%r8,8), %xmm0
mulsd (%rax,%r8,8), %xmm0
addsd %xmm0, %xmm1
movsd %xmm1, 0x8(%rbx)
incq %r8
cmpq %r8, %rdi
jne 0x2729
jmp 0x2756
xorpd %xmm1, %xmm1
movsd 0x10(%rbx), %xmm0
mulsd 0x18(%rbx), %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, 0x8(%rbx)
xorpd 0x48cf(%rip), %xmm0     # 0x7040
callq 0x2270
movsd 0x489a(%rip), %xmm1     # 0x7018
addsd %xmm1, %xmm0
divsd %xmm0, %xmm1
movsd %xmm1, (%rbx)
popq %rbx
retq
leaq 0x4950(%rip), %rdi      # 0x70e3
movq %rsi, %rdx
jmp 0x27a2
leaq 0x4944(%rip), %rdi      # 0x70e3
movq %rdx, %rsi
xorl %eax, %eax
callq 0x21d0
nop
// File: /workspace/github_cpp_makefile_star2_O3/gkosae[P]ArduinoNeuralNet/layer.cpp
// Function: Layer::Layer(unsigned short, unsigned short)
Layer::Layer(unsigned short number_of_neurons, unsigned short number_of_inputs) {

  neurons = std::vector<Neuron>(number_of_neurons);
  inputs = std::vector<double>(number_of_inputs);

  for (Neuron& neuron : neurons) {
      neuron.reshape(number_of_inputs);
  }
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
subq $0x50, %rsp
movl %edx, %ebp
movq %rdi, %rbx
xorps %xmm0, %xmm0
movups %xmm0, 0x20(%rdi)
movups %xmm0, 0x10(%rdi)
movups %xmm0, (%rdi)
movl %esi, %esi
leaq 0x30(%rsp), %rdi
leaq 0xf(%rsp), %rdx
callq 0x2dfa
movq 0x28(%rbx), %rax
leaq 0x30(%rsp), %r14
movaps (%r14), %xmm0
movq 0x10(%r14), %rcx
movq %rcx, 0x28(%rbx)
movups 0x18(%rbx), %xmm1
movups %xmm0, 0x18(%rbx)
leaq 0x10(%rsp), %rdi
movaps %xmm1, (%rdi)
movq %rax, 0x10(%rdi)
xorps %xmm0, %xmm0
movaps %xmm0, (%r14)
movq $0x0, 0x10(%r14)
callq 0x2e90
movq %r14, %rdi
callq 0x2e90
movzwl %bp, %r14d
leaq 0x10(%rsp), %rdi
leaq 0x30(%rsp), %rdx
movq %r14, %rsi
callq 0x27aa
movq (%rbx), %rdi
movq 0x10(%rbx), %rsi
movaps 0x10(%rsp), %xmm0
movups %xmm0, (%rbx)
movq 0x20(%rsp), %rax
movq %rax, 0x10(%rbx)
xorps %xmm0, %xmm0
movaps %xmm0, 0x10(%rsp)
movq $0x0, 0x20(%rsp)
testq %rdi, %rdi
je 0x2ca8
subq %rdi, %rsi
callq 0x2180
movq 0x10(%rsp), %rdi
testq %rdi, %rdi
je 0x2ca8
movq 0x20(%rsp), %rsi
subq %rdi, %rsi
callq 0x2180
movq 0x18(%rbx), %r15
movq 0x20(%rbx), %r12
cmpq %r12, %r15
je 0x2cc6
movq %r15, %rdi
movl %r14d, %esi
callq 0x250c
addq $0x40, %r15
jmp 0x2cb0
addq $0x50, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
popq %rbp
retq
jmp 0x2cd7
jmp 0x2cd7
movq %rax, %r14
leaq 0x18(%rbx), %rdi
callq 0x2e90
movq (%rbx), %rdi
testq %rdi, %rdi
je 0x2cf7
movq 0x10(%rbx), %rsi
subq %rdi, %rsi
callq 0x2180
movq %r14, %rdi
callq 0x2260
nop
// File: /workspace/github_cpp_makefile_star2_O3/gkosae[P]ArduinoNeuralNet/layer.cpp
// Function: Layer::getOutputs()
std::vector<double> Layer::getOutputs() {
    std::vector<double> outputs{};
    for (Neuron& neuron : neurons){
        outputs.push_back(neuron.output);
    }

    return outputs;
}

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
movq %rdi, %rbx
xorps %xmm0, %xmm0
movups %xmm0, (%rdi)
movq $0x0, 0x10(%rdi)
movq 0x18(%rsi), %r14
movq 0x20(%rsi), %r15
cmpq %r15, %r14
je 0x2dd1
movq 0x8(%rbx), %rsi
cmpq 0x10(%rbx), %rsi
je 0x2dc0
movsd (%r14), %xmm0
movsd %xmm0, (%rsi)
addq $0x8, %rsi
movq %rsi, 0x8(%rbx)
jmp 0x2dcb
movq %rbx, %rdi
movq %r14, %rdx
callq 0x2f80
addq $0x40, %r14
jmp 0x2d9e
movq %rbx, %rax
popq %rbx
popq %r14
popq %r15
retq
movq %rax, %r14
movq (%rbx), %rdi
testq %rdi, %rdi
je 0x2df1
movq 0x10(%rbx), %rsi
subq %rdi, %rsi
callq 0x2180
movq %r14, %rdi
callq 0x2260
nop
// File: /workspace/github_cpp_makefile_star2_O3/gkosae[P]ArduinoNeuralNet/neuralnet.cpp
// Function: NeuralNet::calculateOverallError()
double NeuralNet::calculateOverallError() {
    double error = 0;

    // Quadratic Cost Function
    for(auto i = 0; i < current_sample; ++i) {
        unsigned short output_layer_size = layers.back().size();
        for(auto j = 0; j < output_layer_size; ++j) {
            error += (0.5*pow(expected_output[i][j] - actual_output[i][j], 2));
        }
    }

    unsigned short number_of_samples = input_data.size();

    error = error/number_of_samples + lambda/2*getRegularizationTerm();
    return error;
}

// Assembly:
subq $0x18, %rsp
movl 0x78(%rdi), %eax
testq %rax, %rax
je 0x36f1
movq 0x20(%rdi), %rdx
movq 0x30(%rdi), %rcx
movl -0x10(%rdx), %esi
subl -0x18(%rdx), %esi
shrl $0x6, %esi
movzwl %si, %edx
movq 0x48(%rdi), %rsi
xorpd %xmm2, %xmm2
xorl %r8d, %r8d
movsd 0x3ab5(%rip), %xmm0     # 0x7160
testq %rdx, %rdx
je 0x36e7
leaq (,%r8,8), %r9
leaq (%r9,%r9,2), %r10
movq (%rsi,%r10), %r9
movq (%rcx,%r10), %r10
xorl %r11d, %r11d
movsd (%r9,%r11,8), %xmm1
subsd (%r10,%r11,8), %xmm1
mulsd %xmm1, %xmm1
mulsd %xmm0, %xmm1
addsd %xmm1, %xmm2
incq %r11
cmpq %r11, %rdx
jne 0x36c7
incq %r8
cmpq %rax, %r8
jne 0x36ab
jmp 0x36f5
xorpd %xmm2, %xmm2
movl 0x68(%rdi), %eax
subl 0x60(%rdi), %eax
shrl $0x3, %eax
imull $0xaaaaaaab, %eax, %eax # imm = 0xAAAAAAAB
movzwl %ax, %eax
xorps %xmm0, %xmm0
cvtsi2sd %eax, %xmm0
divsd %xmm0, %xmm2
movsd %xmm2, 0x10(%rsp)
movsd 0x80(%rdi), %xmm0
mulsd 0x3a38(%rip), %xmm0     # 0x7160
movsd %xmm0, 0x8(%rsp)
callq 0x3d34
mulsd 0x8(%rsp), %xmm0
addsd 0x10(%rsp), %xmm0
addq $0x18, %rsp
retq
// File: /workspace/github_cpp_makefile_star2_O3/gkosae[P]ArduinoNeuralNet/neuralnet.cpp
// Function: NeuralNet::getRegularizationTerm()
double NeuralNet::getRegularizationTerm() {
    double term = 0;

    // sum the square of all weights
    unsigned short count = layers.size();

    for(auto i = 1; i < count; ++i) {
        unsigned short current_layer_size = layers.at(i).size();

        for(auto j = 0; j < current_layer_size; ++j) {
            std::vector<double> weights = layers.at(i).neurons.at(j).weights;

            for(auto weight : weights) {
                term += pow(weight,2);
            }
        }
    }

    term = term/input_data.size();
    return term;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x28, %rsp
movq %rdi, %rbx
movq 0x20(%rdi), %rax
subq 0x18(%rdi), %rax
sarq $0x4, %rax
movabsq $-0x5555555555555555, %rcx # imm = 0xAAAAAAAAAAAAAAAB
imulq %rcx, %rax
testl $0xfffe, %eax           # imm = 0xFFFE
je 0x3e8c
movzwl %ax, %eax
movq %rax, 0x8(%rsp)
xorpd %xmm0, %xmm0
movl $0x1, %r14d
leaq 0x10(%rsp), %r15
movq 0x18(%rbx), %rax
movq 0x20(%rbx), %rdx
subq %rax, %rdx
sarq $0x4, %rdx
movabsq $-0x5555555555555555, %rcx # imm = 0xAAAAAAAAAAAAAAAB
imulq %rcx, %rdx
cmpq %r14, %rdx
jbe 0x3ede
leaq (%r14,%r14,2), %rbp
shlq $0x4, %rbp
movl 0x20(%rax,%rbp), %ecx
subl 0x18(%rax,%rbp), %ecx
shrl $0x6, %ecx
andl $0xffff, %ecx           # imm = 0xFFFF
je 0x3e7c
movl %ecx, %r13d
xorl %r12d, %r12d
movq 0x18(%rbx), %rax
movq 0x20(%rbx), %rdx
subq %rax, %rdx
sarq $0x4, %rdx
movabsq $-0x5555555555555555, %rcx # imm = 0xAAAAAAAAAAAAAAAB
imulq %rcx, %rdx
cmpq %r14, %rdx
jbe 0x3ede
movq 0x18(%rax,%rbp), %rcx
movq 0x20(%rax,%rbp), %rdx
subq %rcx, %rdx
sarq $0x6, %rdx
cmpq %r12, %rdx
jbe 0x3eea
movq %r12, %rax
shlq $0x6, %rax
leaq (%rcx,%rax), %rsi
addq $0x20, %rsi
movq %r15, %rdi
movsd %xmm0, (%rsp)
callq 0x2ee4
movsd (%rsp), %xmm0
movq 0x10(%rsp), %rdi
movq 0x18(%rsp), %rax
movq %rdi, %rcx
cmpq %rax, %rdi
je 0x3e54
movsd (%rcx), %xmm1
mulsd %xmm1, %xmm1
addsd %xmm1, %xmm0
addq $0x8, %rcx
cmpq %rax, %rcx
jne 0x3e3f
testq %rdi, %rdi
je 0x3e70
movq 0x20(%rsp), %rsi
subq %rdi, %rsi
movsd %xmm0, (%rsp)
callq 0x2180
movsd (%rsp), %xmm0
incq %r12
cmpq %r13, %r12
jne 0x3dcc
incq %r14
cmpq 0x8(%rsp), %r14
jne 0x3d81
jmp 0x3e90
xorpd %xmm0, %xmm0
movq 0x68(%rbx), %rax
subq 0x60(%rbx), %rax
sarq $0x3, %rax
movabsq $-0x5555555555555555, %rcx # imm = 0xAAAAAAAAAAAAAAAB
imulq %rcx, %rax
movq %rax, %xmm2
punpckldq 0x3169(%rip), %xmm2 # xmm2 = xmm2[0],mem[0],xmm2[1],mem[1]
subpd 0x3171(%rip), %xmm2     # 0x7030
movapd %xmm2, %xmm1
unpckhpd %xmm2, %xmm1            # xmm1 = xmm1[1],xmm2[1]
addsd %xmm2, %xmm1
divsd %xmm1, %xmm0
addq $0x28, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
leaq 0x31fe(%rip), %rdi      # 0x70e3
movq %r14, %rsi
jmp 0x3ef4
leaq 0x31f2(%rip), %rdi      # 0x70e3
movq %r12, %rsi
xorl %eax, %eax
callq 0x21d0
nop
// File: /workspace/github_cpp_makefile_star2_O3/gkosae[P]ArduinoNeuralNet/neuralnet.cpp
// Function: NeuralNet::buildInfoString[abi:cxx11]()
std::string NeuralNet::buildInfoString() {
  stringstream ss{};
  getNetworkInfo(ss);
  getLayerInfo(ss);
  getNeuronInfo(ss);
  return ss.str();
}

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
subq $0x190, %rsp            # imm = 0x190
movq %rsi, %r14
movq %rdi, %rbx
leaq 0x8(%rsp), %r15
movq %r15, %rdi
callq 0x20e0
movq %r14, %rdi
movq %r15, %rsi
callq 0x4068
leaq 0x8(%rsp), %rsi
movq %r14, %rdi
callq 0x4184
leaq 0x8(%rsp), %rsi
movq %r14, %rdi
callq 0x42ca
leaq 0x20(%rsp), %rsi
movq %rbx, %rdi
callq 0x21f0
movq 0x6fa0(%rip), %rsi      # 0xafb8
leaq 0x8(%rsp), %rdi
callq 0x2100
leaq 0x88(%rsp), %rdi
callq 0x2060
movq %rbx, %rax
addq $0x190, %rsp            # imm = 0x190
popq %rbx
popq %r14
popq %r15
retq
movq %rax, %rbx
movq 0x6f6f(%rip), %rsi      # 0xafb8
leaq 0x8(%rsp), %rdi
callq 0x2100
leaq 0x88(%rsp), %rdi
callq 0x2060
movq %rbx, %rdi
callq 0x2260
// File: /workspace/github_cpp_makefile_star2_O3/gkosae[P]ArduinoNeuralNet/neuralnet.cpp
// Function: NeuralNet::getNetworkInfo(std::__cxx11::basic_stringstream<char, std::char_traits<char>, std::allocator<char>>&)
void NeuralNet::getNetworkInfo(stringstream& ss) {
  ss << "NETWORK INFO\n";
  ss << "Number of inputs: " << layers.front().size() << '\n';
  ss << "Number of outputs: " << layers.back().size() << '\n';
  ss << "Number of hidden layers: " << layers.size() - 2 << '\n';
  ss << '\n';
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %rbx
pushq %rax
movq %rdi, %r14
leaq 0x10(%rsi), %rbx
leaq 0x313b(%rip), %rsi      # 0x71b8
movl $0xd, %edx
movq %rbx, %rdi
callq 0x2190
leaq 0x3135(%rip), %rsi      # 0x71c6
movl $0x12, %edx
movq %rbx, %rdi
callq 0x2190
movq 0x18(%r14), %rax
movl 0x20(%rax), %esi
subl 0x18(%rax), %esi
shrl $0x6, %esi
movl $0xffff, %r15d          # imm = 0xFFFF
andl %r15d, %esi
movq %rbx, %rdi
callq 0x20c0
movb $0xa, %bpl
leaq 0x4(%rsp), %rsi
movb %bpl, (%rsi)
movl $0x1, %edx
movq %rax, %rdi
callq 0x2190
leaq 0x30fe(%rip), %rsi      # 0x71d9
movl $0x13, %edx
movq %rbx, %rdi
callq 0x2190
movq 0x20(%r14), %rax
movl -0x10(%rax), %esi
subl -0x18(%rax), %esi
shrl $0x6, %esi
andl %r15d, %esi
movq %rbx, %rdi
callq 0x20c0
leaq 0x5(%rsp), %rsi
movb %bpl, (%rsi)
movl $0x1, %edx
movq %rax, %rdi
callq 0x2190
leaq 0x30d1(%rip), %rsi      # 0x71ed
movl $0x19, %edx
movq %rbx, %rdi
callq 0x2190
movq 0x20(%r14), %rax
subq 0x18(%r14), %rax
sarq $0x4, %rax
movabsq $-0x5555555555555555, %rsi # imm = 0xAAAAAAAAAAAAAAAB
imulq %rax, %rsi
addq $-0x2, %rsi
movq %rbx, %rdi
callq 0x20c0
leaq 0x6(%rsp), %rsi
movb %bpl, (%rsi)
movl $0x1, %edx
movq %rax, %rdi
callq 0x2190
leaq 0x7(%rsp), %rsi
movb %bpl, (%rsi)
movl $0x1, %edx
movq %rbx, %rdi
callq 0x2190
addq $0x8, %rsp
popq %rbx
popq %r14
popq %r15
popq %rbp
retq
// File: /workspace/github_cpp_makefile_star2_O3/gkosae[P]ArduinoNeuralNet/neuralnet.cpp
// Function: NeuralNet::buildCodeString[abi:cxx11]()
std::string NeuralNet::buildCodeString() {
    stringstream ss{};
    includeHeaders(ss);
    writeBody(ss);
    return ss.str();
}

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
subq $0x190, %rsp            # imm = 0x190
movq %rsi, %r14
movq %rdi, %rbx
leaq 0x8(%rsp), %r15
movq %r15, %rdi
callq 0x20e0
movq %r15, %rsi
callq 0x46ea
leaq 0x8(%rsp), %rsi
movq %r14, %rdi
callq 0x4740
leaq 0x20(%rsp), %rsi
movq %rbx, %rdi
callq 0x21f0
movq 0x691e(%rip), %rsi      # 0xafb8
leaq 0x8(%rsp), %rdi
callq 0x2100
leaq 0x88(%rsp), %rdi
callq 0x2060
movq %rbx, %rax
addq $0x190, %rsp            # imm = 0x190
popq %rbx
popq %r14
popq %r15
retq
movq %rax, %rbx
movq 0x68ed(%rip), %rsi      # 0xafb8
leaq 0x8(%rsp), %rdi
callq 0x2100
leaq 0x88(%rsp), %rdi
callq 0x2060
movq %rbx, %rdi
callq 0x2260
// File: /workspace/github_cpp_makefile_star2_O3/gkosae[P]ArduinoNeuralNet/main.cpp
// Function: createOutputSamples()
vector<vector<double>> createOutputSamples() {

  cout << "Entering createOutputSamples" << endl;
  vector<vector<double>> samples{};

  for(auto i = 0; i < number_of_samples; ++i) {
    samples.push_back(vector<double>{18.00/NORMALIZER, 50.00/NORMALIZER});
  }

  cout << "Leaving createOutputSamples" << endl;

  return samples;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
subq $0x30, %rsp
movq %rdi, %rbx
movq 0x525f(%rip), %r14      # 0xafd8
leaq 0x17f8(%rip), %rsi      # 0x7578
movl $0x1c, %edx
movq %r14, %rdi
callq 0x2190
movq (%r14), %rax
movq -0x18(%rax), %rdi
addq %r14, %rdi
movl $0xa, %esi
callq 0x2160
movsbl %al, %esi
movq %r14, %rdi
callq 0x2030
movq %rax, %rdi
callq 0x20d0
xorps %xmm0, %xmm0
movups %xmm0, (%rbx)
movq $0x0, 0x10(%rbx)
cmpl $0x0, 0x53a7(%rip)      # 0xb170
jle 0x5e27
xorl %ebp, %ebp
leaq 0x8(%rsp), %r14
leaq 0x20(%rsp), %r15
leaq 0x7(%rsp), %r12
movaps 0x16fd(%rip), %xmm0     # 0x74e0
movaps %xmm0, 0x20(%rsp)
movl $0x2, %edx
movq %r14, %rdi
movq %r15, %rsi
movq %r12, %rcx
callq 0x6316
movq %rbx, %rdi
movq %r14, %rsi
callq 0x6b02
movq 0x8(%rsp), %rdi
testq %rdi, %rdi
je 0x5e1d
movq 0x18(%rsp), %rsi
subq %rdi, %rsi
callq 0x2180
incl %ebp
cmpl 0x534b(%rip), %ebp      # 0xb170
jl 0x5ddc
movq 0x51aa(%rip), %r14      # 0xafd8
leaq 0x1760(%rip), %rsi      # 0x7595
movl $0x1b, %edx
movq %r14, %rdi
callq 0x2190
movq (%r14), %rax
addq -0x18(%rax), %r14
movq %r14, %rdi
movl $0xa, %esi
callq 0x2160
movsbl %al, %esi
movq 0x5178(%rip), %rdi      # 0xafd8
callq 0x2030
movq %rax, %rdi
callq 0x20d0
movq %rbx, %rax
addq $0x30, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
popq %rbp
retq
jmp 0x5e7f
movq %rax, %r14
jmp 0x5e9e
movq %rax, %r14
movq 0x8(%rsp), %rdi
testq %rdi, %rdi
je 0x5e9e
movq 0x18(%rsp), %rsi
subq %rdi, %rsi
callq 0x2180
movq %rbx, %rdi
callq 0x532c
movq %r14, %rdi
callq 0x2260
// File: /workspace/github_cpp_makefile_star2_O3/gkosae[P]ArduinoNeuralNet/main.cpp
// Function: testNetwork(NeuralNet&)
void testNetwork(NeuralNet& network) {

    vector<double> input_one{25.04, 25, 25, 25, 25, 30, 22, 31, 25, 28};
    vector<double> input_two{34, 31, 26, 22, 21, 35, 22, 31, 25, 18};
    vector<double> input_three{22.04, 35, 29.55, 23, 26, 31, 33, 21, 22, 41};
    vector<double> input_four{50, 50, 50, 50, 50, 50, 50, 50, 50, 50};

    printResults(network, input_one);
    printResults(network, input_two);
    printResults(network, input_three);
    printResults(network, input_four);
}

// Assembly:
pushq %rbx
subq $0xc0, %rsp
movq %rdi, %rbx
leaq 0x1708(%rip), %rsi      # 0x75c8
leaq 0x70(%rsp), %rax
movl $0xa, %ecx
movq %rax, %rdi
rep  movsq (%rsi), %es:(%rdi)
leaq 0x58(%rsp), %rdi
leaq 0x40(%rsp), %rcx
movl $0xa, %edx
movq %rax, %rsi
callq 0x6316
leaq 0x172a(%rip), %rsi      # 0x7618
leaq 0x70(%rsp), %rax
movl $0xa, %ecx
movq %rax, %rdi
rep  movsq (%rsi), %es:(%rdi)
leaq 0x40(%rsp), %rdi
leaq 0x28(%rsp), %rcx
movl $0xa, %edx
movq %rax, %rsi
callq 0x6316
leaq 0x174c(%rip), %rsi      # 0x7668
leaq 0x70(%rsp), %rax
movl $0xa, %ecx
movq %rax, %rdi
rep  movsq (%rsi), %es:(%rdi)
leaq 0x28(%rsp), %rdi
leaq 0x10(%rsp), %rcx
movl $0xa, %edx
movq %rax, %rsi
callq 0x6316
leaq 0x176e(%rip), %rsi      # 0x76b8
leaq 0x70(%rsp), %rax
movl $0xa, %ecx
movq %rax, %rdi
rep  movsq (%rsi), %es:(%rdi)
leaq 0x10(%rsp), %rdi
leaq 0xf(%rsp), %rcx
movl $0xa, %edx
movq %rax, %rsi
callq 0x6316
leaq 0x58(%rsp), %rsi
movq %rbx, %rdi
callq 0x6080
leaq 0x40(%rsp), %rsi
movq %rbx, %rdi
callq 0x6080
leaq 0x28(%rsp), %rsi
movq %rbx, %rdi
callq 0x6080
leaq 0x10(%rsp), %rsi
movq %rbx, %rdi
callq 0x6080
movq 0x10(%rsp), %rdi
testq %rdi, %rdi
je 0x5fbc
movq 0x20(%rsp), %rsi
subq %rdi, %rsi
callq 0x2180
movq 0x28(%rsp), %rdi
testq %rdi, %rdi
je 0x5fd3
movq 0x38(%rsp), %rsi
subq %rdi, %rsi
callq 0x2180
movq 0x40(%rsp), %rdi
testq %rdi, %rdi
je 0x5fea
movq 0x50(%rsp), %rsi
subq %rdi, %rsi
callq 0x2180
movq 0x58(%rsp), %rdi
testq %rdi, %rdi
je 0x6001
movq 0x68(%rsp), %rsi
subq %rdi, %rsi
callq 0x2180
addq $0xc0, %rsp
popq %rbx
retq
movq %rax, %rbx
jmp 0x6033
movq %rax, %rbx
jmp 0x604a
movq %rax, %rbx
jmp 0x6061
movq %rax, %rbx
movq 0x10(%rsp), %rdi
testq %rdi, %rdi
je 0x6033
movq 0x20(%rsp), %rsi
subq %rdi, %rsi
callq 0x2180
movq 0x28(%rsp), %rdi
testq %rdi, %rdi
je 0x604a
movq 0x38(%rsp), %rsi
subq %rdi, %rsi
callq 0x2180
movq 0x40(%rsp), %rdi
testq %rdi, %rdi
je 0x6061
movq 0x50(%rsp), %rsi
subq %rdi, %rsi
callq 0x2180
movq 0x58(%rsp), %rdi
testq %rdi, %rdi
je 0x6078
movq 0x68(%rsp), %rsi
subq %rdi, %rsi
callq 0x2180
movq %rbx, %rdi
callq 0x2260
// File: /workspace/github_cpp_makefile_star2_O3/gkosae[P]ArduinoNeuralNet/main.cpp
// Function: printResults(NeuralNet&, std::vector<double, std::allocator<double>>&)
void printResults(NeuralNet& network, vector<double>& inputs) {

    cout << "Inputs: ";
    for(auto& input : inputs) {
      cout << input << " ";
      input = input/NORMALIZER;
    }

    cout << endl;

    network.feed(inputs);
    network.forward();
    vector<double> outputs = network.getOutputs();

    cout << "Outputs: ";
    for(auto& output : outputs) {
      output = output * NORMALIZER;
      cout << output << " ";
    }

    cout << endl << endl;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x38, %rsp
movq %rsi, %r14
movq %rdi, %rbx
movq 0x4f3d(%rip), %rdi      # 0xafd8
leaq 0x150f(%rip), %rsi      # 0x75b1
movl $0x8, %edx
callq 0x2190
movq (%r14), %rbp
movq 0x8(%r14), %r15
cmpq %r15, %rbp
je 0x60fe
movq 0x4f19(%rip), %r12      # 0xafd8
leaq 0x11aa(%rip), %r13      # 0x7270
movsd (%rbp), %xmm0
movq %r12, %rdi
callq 0x2200
movl $0x1, %edx
movq %rax, %rdi
movq %r13, %rsi
callq 0x2190
movsd (%rbp), %xmm0
divsd 0xf20(%rip), %xmm0      # 0x7010
movsd %xmm0, (%rbp)
addq $0x8, %rbp
cmpq %r15, %rbp
jne 0x60c6
movq 0x4ed3(%rip), %r15      # 0xafd8
movq (%r15), %rax
movq -0x18(%rax), %rdi
addq %r15, %rdi
movl $0xa, %esi
callq 0x2160
movsbl %al, %esi
movq %r15, %rdi
callq 0x2030
movq %rax, %rdi
callq 0x20d0
leaq 0x20(%rsp), %r15
movq %r15, %rdi
movq %r14, %rsi
callq 0x2ee4
movq 0x18(%rbx), %rdi
movq %r15, %rsi
callq 0x5380
movq 0x20(%rsp), %rdi
testq %rdi, %rdi
je 0x615f
movq 0x30(%rsp), %rsi
subq %rdi, %rsi
callq 0x2180
movq %rbx, %rdi
callq 0x3406
movq 0x20(%rbx), %rsi
addq $-0x30, %rsi
leaq 0x8(%rsp), %rdi
callq 0x2d80
movq 0x4e58(%rip), %rbx      # 0xafd8
leaq 0x1433(%rip), %rsi      # 0x75ba
movl $0x9, %edx
movq %rbx, %rdi
callq 0x2190
movq 0x8(%rsp), %r12
movq 0x10(%rsp), %r13
cmpq %r13, %r12
je 0x61e6
movq 0x4e2e(%rip), %r14      # 0xafd8
leaq 0x10bf(%rip), %r15      # 0x7270
movsd (%r12), %xmm0
mulsd 0xe51(%rip), %xmm0      # 0x7010
movsd %xmm0, (%r12)
movq %r14, %rdi
callq 0x2200
movl $0x1, %edx
movq %rax, %rdi
movq %r15, %rsi
callq 0x2190
addq $0x8, %r12
cmpq %r13, %r12
jne 0x61b1
movq (%rbx), %rax
addq -0x18(%rax), %rbx
movq %rbx, %rdi
movl $0xa, %esi
callq 0x2160
movsbl %al, %esi
movq 0x4dd4(%rip), %rdi      # 0xafd8
callq 0x2030
movq %rax, %rdi
callq 0x20d0
movq %rax, %rbx
movq (%rax), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x2160
movsbl %al, %esi
movq %rbx, %rdi
callq 0x2030
movq %rax, %rdi
callq 0x20d0
movq 0x8(%rsp), %rdi
testq %rdi, %rdi
je 0x6252
movq 0x18(%rsp), %rsi
subq %rdi, %rsi
callq 0x2180
addq $0x38, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movq %rax, %rbx
movq 0x20(%rsp), %rdi
testq %rdi, %rdi
je 0x6291
movq 0x30(%rsp), %rsi
jmp 0x6289
jmp 0x6277
movq %rax, %rbx
movq 0x8(%rsp), %rdi
testq %rdi, %rdi
je 0x6291
movq 0x18(%rsp), %rsi
subq %rdi, %rsi
callq 0x2180
movq %rbx, %rdi
callq 0x2260
nop