// File: /workspace/github_c_makefile_star2_O3/ugobas[P]tnm/ridge_regression.c
// Function: Make_fit
float Make_fit(float *A, float Lambda, float *lambda, float **evec,
	       float *yalpha, float *D, int Npar, float **X, float *Y, int N)
{
  // Compute A
  int a, b, i; double sum;
  float coeff[Npar];
  for(a=0; a<Npar; a++)coeff[a]=yalpha[a]/(lambda[a]+Lambda);
  double H1=0, H2l=0;
  for(a=0; a<Npar; a++){
    float yl=yalpha[a]*coeff[a];
    H1+=yl; H2l+=yl*lambda[a]/(lambda[a]+Lambda);
  }
  float nu=H1/H2l;
  for(a=0; a<Npar; a++){
    sum=0; for(b=0; b<Npar; b++)sum+=coeff[b]*evec[b][a];
    A[a]=nu*sum/D[a];
  }

  double xy=0, x2=0, y2=0, x1=0, y1=0;
  for(i=0; i<N; i++){
    float *Xi=X[i]; double Y_pred=0;
    for(a=0; a<Npar; a++)Y_pred+=Xi[a]*A[a];
    x1+=Y[i]; x2+=Y[i]*Y[i]; xy+=Y[i]*Y_pred;
    y1+=Y_pred; y2+=Y_pred*Y_pred;
  }
  x2=x2-x1*x1/N;
  y2=y2-y1*y1/N;
  xy=(xy-x1*y1/N)/sqrt(x2*y2);
  return(xy);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %rbx
subq $0x18, %rsp
movl 0x20(%rbp), %eax
movl %r9d, %r10d
movq %rsp, %r11
leaq 0xf(,%r10,4), %rbx
andq $-0x10, %rbx
subq %rbx, %r11
movq %r11, %rsp
testl %r9d, %r9d
jle 0x2c21a
xorl %ebx, %ebx
movss (%rcx,%rbx,4), %xmm1
movss (%rsi,%rbx,4), %xmm2
addss %xmm0, %xmm2
divss %xmm2, %xmm1
movss %xmm1, (%r11,%rbx,4)
incq %rbx
cmpq %rbx, %r10
jne 0x2c159
testl %r9d, %r9d
jle 0x2c21a
xorps %xmm1, %xmm1
xorl %ebx, %ebx
movss (%rcx,%rbx,4), %xmm2
mulss (%r11,%rbx,4), %xmm2
movss (%rsi,%rbx,4), %xmm3
movaps %xmm2, %xmm4
mulss %xmm3, %xmm4
addss %xmm0, %xmm3
divss %xmm3, %xmm4
unpcklps %xmm2, %xmm4            # xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1]
cvtps2pd %xmm4, %xmm2
addpd %xmm2, %xmm1
incq %rbx
cmpq %rbx, %r10
jne 0x2c187
testl %r9d, %r9d
jle 0x2c21a
movapd %xmm1, %xmm0
unpckhpd %xmm1, %xmm0            # xmm0 = xmm0[1],xmm1[1]
divsd %xmm1, %xmm0
cvtsd2ss %xmm0, %xmm0
cvtss2sd %xmm0, %xmm0
xorl %ecx, %ecx
xorpd %xmm1, %xmm1
xorl %esi, %esi
movss (%r11,%rsi,4), %xmm2
movq (%rdx,%rsi,8), %rbx
mulss (%rbx,%rcx,4), %xmm2
cvtss2sd %xmm2, %xmm2
addsd %xmm2, %xmm1
incq %rsi
cmpq %rsi, %r10
jne 0x2c1d9
xorps %xmm2, %xmm2
cvtss2sd (%r8,%rcx,4), %xmm2
mulsd %xmm0, %xmm1
divsd %xmm2, %xmm1
cvtsd2ss %xmm1, %xmm1
movss %xmm1, (%rdi,%rcx,4)
incq %rcx
cmpq %r10, %rcx
jne 0x2c1d3
xorps %xmm1, %xmm1
testl %eax, %eax
jle 0x2c297
movq 0x18(%rbp), %rcx
movq 0x10(%rbp), %rdx
movl %eax, %esi
xorpd %xmm6, %xmm6
xorps %xmm2, %xmm2
xorl %r8d, %r8d
xorps %xmm0, %xmm0
xorps %xmm3, %xmm3
testl %r9d, %r9d
jle 0x2c261
movq (%rdx,%r8,8), %r11
xorl %ebx, %ebx
movss (%r11,%rbx,4), %xmm4
mulss (%rdi,%rbx,4), %xmm4
cvtss2sd %xmm4, %xmm4
addsd %xmm4, %xmm3
incq %rbx
cmpq %rbx, %r10
jne 0x2c246
movss (%rcx,%r8,4), %xmm4
xorps %xmm5, %xmm5
cvtss2sd %xmm4, %xmm5
mulss %xmm4, %xmm4
cvtss2sd %xmm4, %xmm4
addsd %xmm4, %xmm2
movlhps %xmm3, %xmm5            # xmm5 = xmm5[0],xmm3[0]
addpd %xmm5, %xmm0
unpcklpd %xmm3, %xmm3            # xmm3 = xmm3[0,0]
mulpd %xmm5, %xmm3
addpd %xmm3, %xmm6
incq %r8
cmpq %rsi, %r8
jne 0x2c238
jmp 0x2c2a1
xorpd %xmm6, %xmm6
xorps %xmm2, %xmm2
xorps %xmm0, %xmm0
movapd %xmm0, %xmm3
xorps %xmm4, %xmm4
cvtsi2sd %eax, %xmm4
mulpd %xmm0, %xmm3
movapd %xmm0, %xmm5
unpckhpd %xmm0, %xmm5            # xmm5 = xmm5[1],xmm0[1]
mulsd %xmm0, %xmm5
divsd %xmm4, %xmm5
unpcklpd %xmm4, %xmm4            # xmm4 = xmm4[0,0]
divpd %xmm4, %xmm3
shufpd $0x2, %xmm6, %xmm2      # xmm2 = xmm2[0],xmm6[1]
subpd %xmm3, %xmm2
subsd %xmm5, %xmm6
movapd %xmm2, %xmm0
unpckhpd %xmm2, %xmm0            # xmm0 = xmm0[1],xmm2[1]
mulsd %xmm2, %xmm0
ucomisd %xmm1, %xmm0
jb 0x2c2ed
sqrtsd %xmm0, %xmm0
jmp 0x2c2fc
movapd %xmm6, -0x20(%rbp)
callq 0x22a0
movapd -0x20(%rbp), %xmm6
divsd %xmm0, %xmm6
xorps %xmm0, %xmm0
cvtsd2ss %xmm6, %xmm0
leaq -0x8(%rbp), %rsp
popq %rbx
popq %rbp
retq
nop