// File: /workspace/github_c_makefile_star2_O1/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
pushq %rax
movl %r9d, %eax
movq %rsp, %r10
leaq 0xf(,%rax,4), %r11
andq $-0x10, %r11
subq %r11, %r10
movq %r10, %rsp
testl %r9d, %r9d
jle 0x2c45c
xorl %r11d, %r11d
movss (%rcx,%r11,4), %xmm1
movss (%rsi,%r11,4), %xmm2
addss %xmm0, %xmm2
divss %xmm2, %xmm1
movss %xmm1, (%r10,%r11,4)
incq %r11
cmpq %r11, %rax
jne 0x2c43a
testl %r9d, %r9d
jle 0x2c4a5
xorps %xmm1, %xmm1
xorl %r11d, %r11d
xorps %xmm2, %xmm2
movss (%rcx,%r11,4), %xmm3
mulss (%r10,%r11,4), %xmm3
xorps %xmm4, %xmm4
cvtss2sd %xmm3, %xmm4
addsd %xmm4, %xmm2
movss (%rsi,%r11,4), %xmm4
mulss %xmm4, %xmm3
addss %xmm0, %xmm4
divss %xmm4, %xmm3
cvtss2sd %xmm3, %xmm3
addsd %xmm3, %xmm1
incq %r11
cmpq %r11, %rax
jne 0x2c46a
jmp 0x2c4ab
xorps %xmm2, %xmm2
xorps %xmm1, %xmm1
movl 0x20(%rbp), %ecx
testl %r9d, %r9d
jle 0x2c50c
divsd %xmm1, %xmm2
xorps %xmm0, %xmm0
cvtsd2ss %xmm2, %xmm0
cvtss2sd %xmm0, %xmm0
xorl %esi, %esi
xorpd %xmm1, %xmm1
xorl %r11d, %r11d
movss (%r10,%r11,4), %xmm2
movq (%rdx,%r11,8), %rbx
mulss (%rbx,%rsi,4), %xmm2
cvtss2sd %xmm2, %xmm2
addsd %xmm2, %xmm1
incq %r11
cmpq %r11, %rax
jne 0x2c4cb
xorps %xmm2, %xmm2
cvtss2sd (%r8,%rsi,4), %xmm2
mulsd %xmm0, %xmm1
divsd %xmm2, %xmm1
cvtsd2ss %xmm1, %xmm1
movss %xmm1, (%rdi,%rsi,4)
incq %rsi
cmpq %rax, %rsi
jne 0x2c4c4
xorpd %xmm1, %xmm1
xorpd %xmm8, %xmm8
xorps %xmm4, %xmm4
xorps %xmm0, %xmm0
xorpd %xmm2, %xmm2
xorpd %xmm3, %xmm3
testl %ecx, %ecx
jle 0x2c599
movq 0x18(%rbp), %rdx
movq 0x10(%rbp), %rsi
movl %ecx, %r8d
xorl %r10d, %r10d
xorpd %xmm5, %xmm5
testl %r9d, %r9d
jle 0x2c55f
movq (%rsi,%r10,8), %r11
xorl %ebx, %ebx
movss (%r11,%rbx,4), %xmm6
mulss (%rdi,%rbx,4), %xmm6
cvtss2sd %xmm6, %xmm6
addsd %xmm6, %xmm5
incq %rbx
cmpq %rbx, %rax
jne 0x2c544
movss (%rdx,%r10,4), %xmm6
xorps %xmm7, %xmm7
cvtss2sd %xmm6, %xmm7
addsd %xmm7, %xmm2
mulss %xmm6, %xmm6
cvtss2sd %xmm6, %xmm6
addsd %xmm6, %xmm4
mulsd %xmm5, %xmm7
addsd %xmm7, %xmm8
addsd %xmm5, %xmm3
mulsd %xmm5, %xmm5
addsd %xmm5, %xmm0
incq %r10
cmpq %r8, %r10
jne 0x2c535
movapd %xmm2, %xmm5
xorps %xmm6, %xmm6
cvtsi2sd %ecx, %xmm6
mulsd %xmm2, %xmm5
divsd %xmm6, %xmm5
subsd %xmm5, %xmm4
mulsd %xmm3, %xmm2
mulsd %xmm3, %xmm3
divsd %xmm6, %xmm3
subsd %xmm3, %xmm0
mulsd %xmm4, %xmm0
divsd %xmm6, %xmm2
subsd %xmm2, %xmm8
ucomisd %xmm1, %xmm0
jb 0x2c5d9
sqrtsd %xmm0, %xmm0
jmp 0x2c5ea
movsd %xmm8, -0x10(%rbp)
callq 0x2290
movsd -0x10(%rbp), %xmm8
divsd %xmm0, %xmm8
xorps %xmm0, %xmm0
cvtsd2ss %xmm8, %xmm0
leaq -0x8(%rbp), %rsp
popq %rbx
popq %rbp
retq
nop