// File: /workspace/github_c_makefile_star2_O3/ugobas[P]tnm/ridge_regression.c
// Function: Score_computation
void Score_computation(struct ridge_fit *fit,
		       float *lambda, float **evec,
		       float *yalpha, float *ya2, float *D,
		       float E0, float Y2, float *A_ref, float *A_inf,
		       int P, int N)
{
  int a;
  double H1=0, H2=0, H3=0, H2l=0, H3l=0, L1=0; 
  for(a=0; a<P; a++){
    float laLa=lambda[a]+fit->Lambda;   
    L1+=1./laLa;
    float yl=ya2[a]/laLa;  H1+=yl;
    yl/=laLa; H2+=yl;
    H2l+=yl*lambda[a];
    yl/=laLa; H3+=yl;
    H3l+=yl*lambda[a];
  }
  float csi=H2/H2l;
  //fit->nu=1.+fit->Lambda*csi; 
  fit->nu=H1/H2l; 
  fit->E=Y2-H1*fit->nu;
  fit->Cv=fit->Lambda*H1*(H1*H3-H2*H2)/(H2l*H2l);
  fit->A2=H2*fit->nu*fit->nu;
  fit->Sv1=fit->Lambda*H3-H3l;

  //*Cv2=yL5;
  //double E_nu=Y2-(H1+Lambda*H2);
  float Trace=(N-P+fit->Lambda*L1);
  float E_nu=Y2-2*H1+H2l;
  fit->GCV=N*E_nu/(Trace*Trace);
  fit->RR=((N-P)*E_nu/E0-2*Trace)/N;

  float A_ns[P]; 
  for(a=0; a<P; a++)A_ns[a]=yalpha[a]/(lambda[a]+fit->Lambda);
  for(a=0; a<P; a++){
    double sum=0; for(int b=0; b<P; b++)sum+=A_ns[b]*evec[b][a];
    fit->A[a]=fit->nu*sum;
  }

  double sum_csi=0, sum_inf=0;
  for(a=0; a<P; a++){
    float d=fit->A[a]-csi*A_ref[a]; sum_csi+=d*d;
    d=fit->A[a]-A_inf[a]; sum_inf+=d*d;
  }
  fit->LF_csi=fit->Lambda*sum_csi;
  fit->LF_inf=fit->Lambda*sum_inf;
  float mu_inv=1./(1+2*fit->Lambda*(csi-csi_inf));
  fit->LF_mu=fit->LF_inf*mu_inv;

  double norm=0, R2=0, Sh=0;
  for(a=0; a<P; a++){
    float x=fabs(fit->A[a]); R2+=x*x; if(x)Sh+=x*log(x); norm+=x;
  }
  fit->R2=R2/(norm*norm);
  fit->Sh=-Sh/norm+log(norm);

}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %rbx
subq $0x38, %rsp
movq %rdi, %rbx
movl 0x20(%rbp), %eax
movl 0x18(%rbp), %r14d
movss 0xc(%rdi), %xmm3
xorpd %xmm2, %xmm2
testl %r14d, %r14d
jle 0x2bdd6
xorpd %xmm5, %xmm5
xorpd %xmm4, %xmm4
xorl %edi, %edi
movsd 0x25412(%rip), %xmm9    # 0x51148
xorpd %xmm7, %xmm7
xorpd %xmm8, %xmm8
xorpd %xmm6, %xmm6
movss (%rsi,%rdi,4), %xmm10
movaps %xmm10, %xmm11
addss %xmm3, %xmm11
xorps %xmm12, %xmm12
cvtss2sd %xmm11, %xmm12
movapd %xmm9, %xmm13
movss (%r8,%rdi,4), %xmm14
divsd %xmm12, %xmm13
divss %xmm11, %xmm14
movaps %xmm14, %xmm12
divss %xmm11, %xmm12
addsd %xmm13, %xmm6
xorps %xmm13, %xmm13
cvtss2sd %xmm12, %xmm13
movaps %xmm10, %xmm15
mulss %xmm12, %xmm15
addsd %xmm13, %xmm4
unpcklps %xmm15, %xmm14          # xmm14 = xmm14[0],xmm15[0],xmm14[1],xmm15[1]
cvtps2pd %xmm14, %xmm13
addpd %xmm13, %xmm5
divss %xmm11, %xmm12
xorps %xmm11, %xmm11
cvtss2sd %xmm12, %xmm11
mulss %xmm10, %xmm12
addsd %xmm11, %xmm7
xorps %xmm10, %xmm10
cvtss2sd %xmm12, %xmm10
addsd %xmm10, %xmm8
incq %rdi
cmpq %rdi, %r14
jne 0x2bd43
jmp 0x2bdeb
xorpd %xmm6, %xmm6
xorpd %xmm8, %xmm8
xorpd %xmm7, %xmm7
xorpd %xmm4, %xmm4
xorpd %xmm5, %xmm5
movapd %xmm5, %xmm9
unpckhpd %xmm5, %xmm9            # xmm9 = xmm9[1],xmm5[1]
movapd %xmm5, %xmm10
divsd %xmm9, %xmm10
cvtsd2ss %xmm10, %xmm10
movss %xmm10, 0x8(%rbx)
cvtss2sd %xmm1, %xmm1
xorps %xmm11, %xmm11
cvtss2sd %xmm10, %xmm11
movapd %xmm5, %xmm10
mulsd %xmm11, %xmm10
movaps %xmm1, %xmm12
subsd %xmm10, %xmm12
xorps %xmm10, %xmm10
cvtss2sd %xmm3, %xmm10
movapd %xmm4, %xmm13
mulsd %xmm4, %xmm13
movapd %xmm5, %xmm14
mulsd %xmm7, %xmm14
subsd %xmm13, %xmm14
movapd %xmm5, %xmm13
movsd %xmm10, %xmm13          # xmm13 = xmm10[0],xmm13[1]
mulpd %xmm5, %xmm13
mulsd %xmm13, %xmm14
unpckhpd %xmm13, %xmm13          # xmm13 = xmm13[1,1]
divsd %xmm13, %xmm14
unpcklpd %xmm14, %xmm12          # xmm12 = xmm12[0],xmm14[0]
cvtpd2ps %xmm12, %xmm12
movapd %xmm4, %xmm13
mulsd %xmm11, %xmm13
mulsd %xmm11, %xmm13
mulsd %xmm10, %xmm7
subsd %xmm8, %xmm7
unpcklpd %xmm7, %xmm13           # xmm13 = xmm13[0],xmm7[0]
cvtpd2ps %xmm13, %xmm8
movlpd %xmm12, 0x10(%rbx)
xorps %xmm7, %xmm7
cvtsi2ss %eax, %xmm7
subl %r14d, %eax
xorps %xmm11, %xmm11
cvtsi2sd %eax, %xmm11
mulsd %xmm10, %xmm6
addsd %xmm11, %xmm6
cvtsd2ss %xmm6, %xmm6
addsd %xmm5, %xmm5
subsd %xmm5, %xmm1
addsd %xmm9, %xmm1
cvtsd2ss %xmm1, %xmm1
movlpd %xmm8, 0x24(%rbx)
movaps %xmm6, %xmm5
mulss %xmm6, %xmm5
unpcklps %xmm7, %xmm5            # xmm5 = xmm5[0],xmm7[0],xmm5[1],xmm7[1]
xorps %xmm8, %xmm8
cvtsi2ss %eax, %xmm8
mulss %xmm1, %xmm7
mulss %xmm1, %xmm8
divss %xmm0, %xmm8
addss %xmm6, %xmm6
subss %xmm6, %xmm8
unpcklps %xmm8, %xmm7            # xmm7 = xmm7[0],xmm8[0],xmm7[1],xmm8[1]
divps %xmm5, %xmm7
movlps %xmm7, 0x34(%rbx)
movq %rsp, %rdi
leaq 0xf(,%r14,4), %rax
andq $-0x10, %rax
subq %rax, %rdi
movq %rdi, %rsp
divsd %xmm9, %xmm4
cvtsd2ss %xmm4, %xmm0
testl %r14d, %r14d
jle 0x2bff0
movq 0x10(%rbp), %rax
xorl %r8d, %r8d
movss (%rcx,%r8,4), %xmm1
movss (%rsi,%r8,4), %xmm4
addss %xmm3, %xmm4
divss %xmm4, %xmm1
movss %xmm1, (%rdi,%r8,4)
incq %r8
cmpq %r8, %r14
jne 0x2bf38
testl %r14d, %r14d
jle 0x2bff0
movq (%rbx), %rcx
xorl %esi, %esi
xorps %xmm1, %xmm1
xorl %r8d, %r8d
movss (%rdi,%r8,4), %xmm3
movq (%rdx,%r8,8), %r10
mulss (%r10,%rsi,4), %xmm3
cvtss2sd %xmm3, %xmm3
addsd %xmm3, %xmm1
incq %r8
cmpq %r8, %r14
jne 0x2bf6e
xorps %xmm3, %xmm3
cvtss2sd 0x8(%rbx), %xmm3
mulsd %xmm3, %xmm1
cvtsd2ss %xmm1, %xmm1
movss %xmm1, (%rcx,%rsi,4)
incq %rsi
cmpq %r14, %rsi
jne 0x2bf68
testl %r14d, %r14d
jle 0x2bff0
movq (%rbx), %rcx
movaps 0x25076(%rip), %xmm1    # 0x51030
xorps %xmm0, %xmm1
xorpd %xmm2, %xmm2
xorl %edx, %edx
movss (%rcx,%rdx,4), %xmm3
movss (%r9,%rdx,4), %xmm4
mulss %xmm1, %xmm4
addss %xmm3, %xmm4
subss (%rax,%rdx,4), %xmm3
unpcklps %xmm3, %xmm4            # xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1]
mulps %xmm4, %xmm4
cvtps2pd %xmm4, %xmm3
addpd %xmm3, %xmm2
incq %rdx
cmpq %rdx, %r14
jne 0x2bfc3
movss 0xc(%rbx), %xmm1
xorps %xmm3, %xmm3
cvtss2sd %xmm1, %xmm3
movlhps %xmm3, %xmm3            # xmm3 = xmm3[0,0]
mulpd %xmm2, %xmm3
cvtpd2ps %xmm3, %xmm2
movlpd %xmm2, 0x18(%rbx)
addss %xmm1, %xmm1
subss 0x4d3f4(%rip), %xmm0    # 0x7940c
mulss %xmm1, %xmm0
movss 0x250f8(%rip), %xmm1    # 0x5111c
addss %xmm1, %xmm0
divss %xmm0, %xmm1
shufps $0x55, %xmm2, %xmm2     # xmm2 = xmm2[1,1,1,1]
mulss %xmm1, %xmm2
movss %xmm2, 0x20(%rbx)
testl %r14d, %r14d
jle 0x2c0d5
xorps %xmm0, %xmm0
movsd %xmm0, -0x20(%rbp)
xorl %r15d, %r15d
xorps %xmm2, %xmm2
xorps %xmm1, %xmm1
movq (%rbx), %rax
movss (%rax,%r15,4), %xmm4
movaps %xmm4, %xmm0
andps 0x2b27a(%rip), %xmm0    # 0x572e0
ucomiss 0x250ab(%rip), %xmm4    # 0x51118
xorps %xmm3, %xmm3
cvtss2sd %xmm0, %xmm3
jne 0x2c078
jnp 0x2c0b8
movaps %xmm3, %xmm0
movsd %xmm1, -0x28(%rbp)
movsd %xmm2, -0x38(%rbp)
movsd %xmm3, -0x30(%rbp)
movaps %xmm4, -0x50(%rbp)
callq 0x2120
movaps -0x50(%rbp), %xmm4
movsd -0x30(%rbp), %xmm3
movsd -0x38(%rbp), %xmm2
mulsd %xmm3, %xmm0
movsd -0x20(%rbp), %xmm1
addsd %xmm0, %xmm1
movsd %xmm1, -0x20(%rbp)
movsd -0x28(%rbp), %xmm1
mulss %xmm4, %xmm4
xorps %xmm0, %xmm0
cvtss2sd %xmm4, %xmm0
addsd %xmm0, %xmm2
addsd %xmm3, %xmm1
incq %r15
cmpq %r15, %r14
jne 0x2c053
jmp 0x2c0e3
xorps %xmm1, %xmm1
xorps %xmm2, %xmm2
xorps %xmm0, %xmm0
movsd %xmm0, -0x20(%rbp)
movsd %xmm1, -0x28(%rbp)
movaps %xmm1, %xmm0
mulsd %xmm1, %xmm0
divsd %xmm0, %xmm2
xorps %xmm0, %xmm0
cvtsd2ss %xmm2, %xmm0
movss %xmm0, 0x2c(%rbx)
movapd %xmm1, %xmm0
callq 0x2120
movsd -0x20(%rbp), %xmm1
divsd -0x28(%rbp), %xmm1
subsd %xmm1, %xmm0
cvtsd2ss %xmm0, %xmm0
movss %xmm0, 0x30(%rbx)
leaq -0x18(%rbp), %rsp
popq %rbx
popq %r14
popq %r15
popq %rbp
retq