// File: /workspace/github_c_makefile_star2_O3/ugobas[P]tnm/Fit.c
// Function: Fit_1
float Fit_1(float *Y, float *X0, int N, float *A0, float *bias)
{
  float mu1=0;
  // 0: do not allow offset 1: do not penalize offset 0.5: penalize

  // Fit Y=XA with X=(1*n) setting bias b=0
  // and evaluating it as b=<Y>-<X>A
  // A=<X^T X>^{-1}<X^T Y>
  float *x[1]; x[0]=X0; int i;
  if(1){ // Compute also for variable X1, which is the same at all calls
    Y1=0; Y2=0; for(i=0; i<N; i++){Y1+=Y[i]; Y2+=Y[i]*Y[i];}
    Y1/=N; Y2=sqrt(Y2/N-Y1*Y1); 
  }

  int a=0;
  float *xa=x[a];
  double s=0; for(i=0; i<N; i++){s+=xa[i];} X_ave[a]=s/N;
  //s=0; for(i=0; i<N; i++){s+=xa[i]*xa[i];}
  //X_dev[a]=sqrt(s/N-X_ave[a]*X_ave[a]);
  s=0; for(i=0; i<N; i++){s+=xa[i]*Y[i];}
  corr_y[a]=s/N-X_ave[a]*Y1;
  s=0; for(i=0; i<N; i++){s+=xa[i]*xa[i];}
  Corr[a][a]=s/N-mu1*X_ave[a]*X_ave[a];

  double A=corr_y[a]/Corr[0][0];
  double r2=A*corr_y[a];
  (*bias)=Y1-X_ave[a]*A;
  *A0=A;

  return(sqrt(r2/Y2));
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
pushq %rax
movq %r8, %r14
movq %rcx, %rbx
movl %edx, %ebp
movq %rsi, %r15
movq %rdi, %r12
movl %edx, %r13d
xorpd %xmm0, %xmm0
testl %edx, %edx
jle 0x40f59
xorl %eax, %eax
movss (%r12,%rax,4), %xmm1
movaps %xmm1, %xmm2
mulss %xmm1, %xmm2
unpcklps %xmm1, %xmm2            # xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
cvtps2pd %xmm2, %xmm1
addpd %xmm1, %xmm0
incq %rax
cmpq %rax, %r13
jne 0x40f3a
cvtsi2sd %ebp, %xmm7
movapd %xmm0, %xmm1
unpckhpd %xmm0, %xmm1            # xmm1 = xmm1[1],xmm0[1]
divsd %xmm7, %xmm1
movsd %xmm1, 0x39aaf(%rip)    # 0x7aa20
divsd %xmm7, %xmm0
mulsd %xmm1, %xmm1
subsd %xmm1, %xmm0
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jb 0x40f8d
sqrtsd %xmm0, %xmm0
jmp 0x40f9c
movsd %xmm7, (%rsp)
callq 0x22a0
movsd (%rsp), %xmm7
movsd %xmm0, 0x39a84(%rip)    # 0x7aa28
xorps %xmm2, %xmm2
testl %ebp, %ebp
jle 0x4104e
xorl %eax, %eax
xorps %xmm1, %xmm1
cvtss2sd (%r15,%rax,4), %xmm1
addsd %xmm1, %xmm2
incq %rax
cmpq %rax, %r13
jne 0x40fb1
divsd %xmm7, %xmm2
movsd %xmm2, 0x39a5e(%rip)    # 0x7aa30
testl %ebp, %ebp
jle 0x4105a
xorpd %xmm1, %xmm1
xorl %eax, %eax
movss (%r15,%rax,4), %xmm3
mulss (%r12,%rax,4), %xmm3
cvtss2sd %xmm3, %xmm3
addsd %xmm3, %xmm1
incq %rax
cmpq %rax, %r13
jne 0x40fe0
divsd %xmm7, %xmm1
movsd 0x39a18(%rip), %xmm3    # 0x7aa20
movapd 0x10080(%rip), %xmm4    # 0x51090
xorpd %xmm2, %xmm4
movapd %xmm2, %xmm5
mulsd %xmm3, %xmm5
subsd %xmm5, %xmm1
movsd %xmm1, 0x39a18(%rip)    # 0x7aa40
xorpd %xmm5, %xmm5
testl %ebp, %ebp
jle 0x4108e
xorl %eax, %eax
movss (%r15,%rax,4), %xmm6
mulss %xmm6, %xmm6
cvtss2sd %xmm6, %xmm6
addsd %xmm6, %xmm5
incq %rax
cmpq %rax, %r13
jne 0x41032
jmp 0x4108e
divsd %xmm7, %xmm2
movsd %xmm2, 0x399d6(%rip)    # 0x7aa30
xorpd %xmm5, %xmm5
xorpd %xmm1, %xmm1
divsd %xmm7, %xmm1
movsd 0x399b2(%rip), %xmm3    # 0x7aa20
movapd 0x1001a(%rip), %xmm4    # 0x51090
xorpd %xmm2, %xmm4
movapd %xmm2, %xmm6
mulsd %xmm3, %xmm6
subsd %xmm6, %xmm1
movsd %xmm1, 0x399b2(%rip)    # 0x7aa40
divsd %xmm7, %xmm5
movsd 0x1bc2e(%rip), %xmm6    # 0x5ccc8
mulsd %xmm2, %xmm6
mulsd %xmm2, %xmm6
addsd %xmm5, %xmm6
movsd %xmm6, 0x399a2(%rip)    # 0x7aa50
movapd %xmm1, %xmm2
divsd %xmm6, %xmm2
mulsd %xmm2, %xmm1
mulsd %xmm2, %xmm4
addsd %xmm3, %xmm4
xorps %xmm3, %xmm3
cvtsd2ss %xmm4, %xmm3
movss %xmm3, (%r14)
cvtsd2ss %xmm2, %xmm2
movss %xmm2, (%rbx)
divsd %xmm0, %xmm1
xorpd %xmm0, %xmm0
ucomisd %xmm0, %xmm1
jb 0x410ed
xorps %xmm0, %xmm0
sqrtsd %xmm1, %xmm0
jmp 0x410f6
movapd %xmm1, %xmm0
callq 0x22a0
cvtsd2ss %xmm0, %xmm0
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
nopl (%rax)