// File: /workspace/github_c_makefile_star2_O2/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), %r10d
movl 0x18(%rbp), %edi
movq 0x10(%rbp), %rax
xorl %r11d, %r11d
testl %edi, %edi
movl $0x0, %r14d
cmovgl %edi, %r14d
xorpd %xmm3, %xmm3
xorpd %xmm4, %xmm4
movsd 0x22279(%rip), %xmm2    # 0x4b048
xorpd %xmm7, %xmm7
xorpd %xmm5, %xmm5
xorpd %xmm6, %xmm6
cmpq %r11, %r14
je 0x28e5f
movss (%rsi,%r11,4), %xmm8
movss 0xc(%rbx), %xmm9
addss %xmm8, %xmm9
cvtss2sd %xmm9, %xmm10
movapd %xmm2, %xmm11
divsd %xmm10, %xmm11
addsd %xmm11, %xmm4
movss (%r8,%r11,4), %xmm10
divss %xmm9, %xmm10
movaps %xmm10, %xmm11
divss %xmm9, %xmm11
cvtss2sd %xmm11, %xmm12
addsd %xmm12, %xmm6
movaps %xmm8, %xmm12
mulss %xmm11, %xmm12
unpcklps %xmm12, %xmm10          # xmm10 = xmm10[0],xmm12[0],xmm10[1],xmm12[1]
cvtps2pd %xmm10, %xmm10
addpd %xmm10, %xmm3
divss %xmm9, %xmm11
cvtss2sd %xmm11, %xmm9
addsd %xmm9, %xmm5
mulss %xmm8, %xmm11
cvtss2sd %xmm11, %xmm8
addsd %xmm8, %xmm7
incq %r11
jmp 0x28ddb
movapd %xmm3, %xmm8
unpckhpd %xmm3, %xmm8            # xmm8 = xmm8[1],xmm3[1]
movapd %xmm6, %xmm2
movapd %xmm3, %xmm9
divsd %xmm8, %xmm9
cvtsd2ss %xmm9, %xmm10
divsd %xmm8, %xmm2
movss %xmm10, 0x8(%rbx)
cvtss2sd %xmm1, %xmm9
cvtss2sd %xmm10, %xmm11
movapd %xmm3, %xmm1
mulsd %xmm11, %xmm1
movaps %xmm9, %xmm12
subsd %xmm1, %xmm12
movss 0xc(%rbx), %xmm1
cvtss2sd %xmm1, %xmm10
movapd %xmm6, %xmm13
mulsd %xmm6, %xmm13
movapd %xmm3, %xmm14
mulsd %xmm5, %xmm14
subsd %xmm13, %xmm14
movapd %xmm3, %xmm13
movsd %xmm10, %xmm13          # xmm13 = xmm10[0],xmm13[1]
mulpd %xmm3, %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
movlpd %xmm12, 0x10(%rbx)
mulsd %xmm11, %xmm6
mulsd %xmm11, %xmm6
mulsd %xmm10, %xmm5
subsd %xmm7, %xmm5
unpcklpd %xmm5, %xmm6            # xmm6 = xmm6[0],xmm5[0]
cvtpd2ps %xmm6, %xmm5
movlpd %xmm5, 0x24(%rbx)
cvtsi2ss %r10d, %xmm5
subl %edi, %r10d
cvtsi2sd %r10d, %xmm6
mulsd %xmm10, %xmm4
addsd %xmm6, %xmm4
cvtsd2ss %xmm4, %xmm4
addsd %xmm3, %xmm3
subsd %xmm3, %xmm9
addsd %xmm8, %xmm9
cvtsd2ss %xmm9, %xmm3
movaps %xmm4, %xmm6
mulss %xmm4, %xmm6
unpcklps %xmm5, %xmm6            # xmm6 = xmm6[0],xmm5[0],xmm6[1],xmm5[1]
mulss %xmm3, %xmm5
cvtsi2ss %r10d, %xmm7
mulss %xmm3, %xmm7
divss %xmm0, %xmm7
addss %xmm4, %xmm4
subss %xmm4, %xmm7
unpcklps %xmm7, %xmm5            # xmm5 = xmm5[0],xmm7[0],xmm5[1],xmm7[1]
divps %xmm6, %xmm5
movlps %xmm5, 0x34(%rbx)
movl %edi, %edi
movq %rsp, %r8
leaq 0xf(,%rdi,4), %r10
andq $-0x10, %r10
subq %r10, %r8
movq %r8, %rsp
xorl %r10d, %r10d
cmpq %r10, %r14
je 0x28fac
movss (%rcx,%r10,4), %xmm0
movss (%rsi,%r10,4), %xmm3
addss %xmm1, %xmm3
divss %xmm3, %xmm0
movss %xmm0, (%r8,%r10,4)
incq %r10
jmp 0x28f88
xorl %ecx, %ecx
cmpq %r14, %rcx
je 0x28ff4
xorps %xmm0, %xmm0
xorl %esi, %esi
cmpq %rsi, %rdi
je 0x28fda
movss (%r8,%rsi,4), %xmm1
movq (%rdx,%rsi,8), %r10
mulss (%r10,%rcx,4), %xmm1
cvtss2sd %xmm1, %xmm1
addsd %xmm1, %xmm0
incq %rsi
jmp 0x28fb8
cvtss2sd 0x8(%rbx), %xmm1
mulsd %xmm1, %xmm0
cvtsd2ss %xmm0, %xmm0
movq (%rbx), %rsi
movss %xmm0, (%rsi,%rcx,4)
incq %rcx
jmp 0x28fae
cvtsd2ss %xmm2, %xmm0
movaps 0x27861(%rip), %xmm2    # 0x50860
xorps %xmm0, %xmm2
xorps %xmm1, %xmm1
xorl %ecx, %ecx
cmpq %rcx, %r14
je 0x29039
movq (%rbx), %rdx
movss (%rdx,%rcx,4), %xmm3
movss (%r9,%rcx,4), %xmm4
mulss %xmm2, %xmm4
addss %xmm3, %xmm4
subss (%rax,%rcx,4), %xmm3
unpcklps %xmm3, %xmm4            # xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1]
mulps %xmm4, %xmm4
cvtps2pd %xmm4, %xmm3
addpd %xmm3, %xmm1
incq %rcx
jmp 0x29007
movss 0xc(%rbx), %xmm2
cvtss2sd %xmm2, %xmm3
movlhps %xmm3, %xmm3            # xmm3 = xmm3[0,0]
mulpd %xmm3, %xmm1
cvtpd2ps %xmm1, %xmm1
movlpd %xmm1, 0x18(%rbx)
addss %xmm2, %xmm2
subss 0x4b3ae(%rip), %xmm0    # 0x7440c
mulss %xmm2, %xmm0
movss 0x21fa6(%rip), %xmm2    # 0x4b010
addss %xmm2, %xmm0
divss %xmm0, %xmm2
shufps $0x55, %xmm1, %xmm1     # xmm1 = xmm1[1,1,1,1]
mulss %xmm2, %xmm1
movss %xmm1, 0x20(%rbx)
xorps %xmm1, %xmm1
xorl %r15d, %r15d
xorps %xmm2, %xmm2
xorps %xmm0, %xmm0
movsd %xmm0, -0x20(%rbp)
cmpq %r15, %r14
je 0x2910c
movq (%rbx), %rax
movss (%rax,%r15,4), %xmm4
movaps %xmm4, %xmm0
andps 0x28188(%rip), %xmm0    # 0x51230
ucomiss 0x21f5d(%rip), %xmm4    # 0x4b00c
cvtss2sd %xmm0, %xmm3
jne 0x290b7
jnp 0x290f7
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 -0x28(%rbp), %xmm1
mulsd %xmm3, %xmm0
movsd -0x20(%rbp), %xmm2
addsd %xmm0, %xmm2
movsd %xmm2, -0x20(%rbp)
movsd -0x38(%rbp), %xmm2
mulss %xmm4, %xmm4
cvtss2sd %xmm4, %xmm0
addsd %xmm0, %xmm2
addsd %xmm3, %xmm1
incq %r15
jmp 0x29090
movaps %xmm1, %xmm0
mulsd %xmm1, %xmm0
divsd %xmm0, %xmm2
cvtsd2ss %xmm2, %xmm0
movss %xmm0, 0x2c(%rbx)
movapd %xmm1, %xmm0
movsd %xmm1, -0x28(%rbp)
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