// File: /workspace/github_c_makefile_star2_O2/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 %r15
pushq %r14
pushq %rbx
subq $0x18, %rsp
movl 0x20(%rbp), %eax
movq 0x18(%rbp), %r10
movq 0x10(%rbp), %r11
movl %r9d, %ebx
movq %rsp, %r14
leaq 0xf(,%rbx,4), %r15
andq $-0x10, %r15
subq %r15, %r14
movq %r14, %rsp
xorl %r15d, %r15d
testl %r9d, %r9d
cmovlel %r15d, %r9d
cmpq %r15, %r9
je 0x291ae
movss (%rcx,%r15,4), %xmm1
movss (%rsi,%r15,4), %xmm2
addss %xmm0, %xmm2
divss %xmm2, %xmm1
movss %xmm1, (%r14,%r15,4)
incq %r15
jmp 0x2918a
xorps %xmm1, %xmm1
xorl %r15d, %r15d
cmpq %r15, %r9
je 0x291e9
movss (%rcx,%r15,4), %xmm2
mulss (%r14,%r15,4), %xmm2
movss (%rsi,%r15,4), %xmm3
movaps %xmm2, %xmm4
mulss %xmm3, %xmm4
addss %xmm0, %xmm3
divss %xmm3, %xmm4
unpcklps %xmm4, %xmm2            # xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
cvtps2pd %xmm2, %xmm2
addpd %xmm2, %xmm1
incq %r15
jmp 0x291b4
movapd %xmm1, %xmm0
unpckhpd %xmm1, %xmm0            # xmm0 = xmm0[1],xmm1[1]
divsd %xmm0, %xmm1
cvtsd2ss %xmm1, %xmm0
cvtss2sd %xmm0, %xmm0
xorl %ecx, %ecx
cmpq %r9, %rcx
je 0x29248
xorpd %xmm1, %xmm1
xorl %esi, %esi
cmpq %rsi, %rbx
je 0x2922c
movss (%r14,%rsi,4), %xmm2
movq (%rdx,%rsi,8), %r15
mulss (%r15,%rcx,4), %xmm2
cvtss2sd %xmm2, %xmm2
addsd %xmm2, %xmm1
incq %rsi
jmp 0x2920a
mulsd %xmm0, %xmm1
cvtss2sd (%r8,%rcx,4), %xmm2
divsd %xmm2, %xmm1
cvtsd2ss %xmm1, %xmm1
movss %xmm1, (%rdi,%rcx,4)
incq %rcx
jmp 0x291ff
xorl %ecx, %ecx
testl %eax, %eax
movl $0x0, %edx
cmovgl %eax, %edx
xorpd %xmm1, %xmm1
xorpd %xmm6, %xmm6
xorpd %xmm0, %xmm0
cmpq %rdx, %rcx
je 0x292ce
movq (%r11,%rcx,8), %rsi
xorps %xmm2, %xmm2
xorl %r8d, %r8d
cmpq %r8, %r9
je 0x2928d
movss (%rsi,%r8,4), %xmm3
mulss (%rdi,%r8,4), %xmm3
cvtss2sd %xmm3, %xmm3
addsd %xmm3, %xmm2
incq %r8
jmp 0x2926f
movss (%r10,%rcx,4), %xmm3
cvtss2sd %xmm3, %xmm4
mulss %xmm3, %xmm3
cvtss2sd %xmm3, %xmm3
addsd %xmm1, %xmm3
movaps %xmm4, %xmm5
mulsd %xmm2, %xmm5
addsd %xmm5, %xmm6
movlhps %xmm2, %xmm4            # xmm4 = xmm4[0],xmm2[0]
addpd %xmm4, %xmm0
unpckhpd %xmm1, %xmm1            # xmm1 = xmm1[1,1]
mulsd %xmm2, %xmm2
addsd %xmm1, %xmm2
unpcklpd %xmm2, %xmm3            # xmm3 = xmm3[0],xmm2[0]
incq %rcx
movapd %xmm3, %xmm1
jmp 0x29260
movapd %xmm0, %xmm2
cvtsi2sd %eax, %xmm3
mulpd %xmm0, %xmm2
movapd %xmm0, %xmm4
unpckhpd %xmm0, %xmm4            # xmm4 = xmm4[1],xmm0[1]
mulsd %xmm0, %xmm4
divsd %xmm3, %xmm4
unpcklpd %xmm3, %xmm3            # xmm3 = xmm3[0,0]
divpd %xmm3, %xmm2
subpd %xmm2, %xmm1
subsd %xmm4, %xmm6
movapd %xmm1, %xmm0
unpckhpd %xmm1, %xmm0            # xmm0 = xmm0[1],xmm1[1]
mulsd %xmm1, %xmm0
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jb 0x29316
sqrtsd %xmm0, %xmm0
jmp 0x29325
movapd %xmm6, -0x30(%rbp)
callq 0x2290
movapd -0x30(%rbp), %xmm6
divsd %xmm0, %xmm6
cvtsd2ss %xmm6, %xmm0
leaq -0x18(%rbp), %rsp
popq %rbx
popq %r14
popq %r15
popq %rbp
retq