// File: /workspace/github_c_makefile_star2_O1/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
xorl %eax, %eax
movq %rax, 0x39aa1(%rip)     # 0x7aa30
movq %rax, 0x39aa2(%rip)     # 0x7aa38
movl %edx, %r13d
testl %edx, %edx
jle 0x40fdc
xorpd %xmm0, %xmm0
xorl %eax, %eax
xorpd %xmm1, %xmm1
movss (%r12,%rax,4), %xmm2
xorps %xmm3, %xmm3
cvtss2sd %xmm2, %xmm3
addsd %xmm3, %xmm0
mulss %xmm2, %xmm2
cvtss2sd %xmm2, %xmm2
addsd %xmm2, %xmm1
incq %rax
cmpq %rax, %r13
jne 0x40fa7
movsd %xmm0, 0x39a5c(%rip)    # 0x7aa30
movsd %xmm1, 0x39a5c(%rip)    # 0x7aa38
cvtsi2sd %ebp, %xmm6
movsd 0x39a48(%rip), %xmm1    # 0x7aa30
divsd %xmm6, %xmm1
movsd %xmm1, 0x39a3c(%rip)    # 0x7aa30
movsd 0x39a3c(%rip), %xmm0    # 0x7aa38
divsd %xmm6, %xmm0
mulsd %xmm1, %xmm1
subsd %xmm1, %xmm0
xorpd %xmm7, %xmm7
ucomisd %xmm7, %xmm0
jb 0x41018
sqrtsd %xmm0, %xmm0
jmp 0x4102b
movsd %xmm6, (%rsp)
callq 0x2290
xorpd %xmm7, %xmm7
movsd (%rsp), %xmm6
movsd %xmm0, 0x39a05(%rip)    # 0x7aa38
testl %ebp, %ebp
jle 0x4104e
xorl %eax, %eax
xorps %xmm1, %xmm1
cvtss2sd (%r15,%rax,4), %xmm1
addsd %xmm1, %xmm7
incq %rax
cmpq %rax, %r13
jne 0x41039
divsd %xmm6, %xmm7
movsd %xmm7, 0x399e6(%rip)    # 0x7aa40
xorpd %xmm2, %xmm2
xorpd %xmm1, %xmm1
testl %ebp, %ebp
jle 0x41084
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 0x41068
divsd %xmm6, %xmm1
movsd 0x399a0(%rip), %xmm3    # 0x7aa30
movapd 0xfff8(%rip), %xmm4     # 0x51090
xorpd %xmm7, %xmm4
movapd %xmm7, %xmm5
mulsd %xmm3, %xmm5
subsd %xmm5, %xmm1
movsd %xmm1, 0x399a0(%rip)    # 0x7aa50
testl %ebp, %ebp
jle 0x410d4
xorpd %xmm2, %xmm2
xorl %eax, %eax
movss (%r15,%rax,4), %xmm5
mulss %xmm5, %xmm5
cvtss2sd %xmm5, %xmm5
addsd %xmm5, %xmm2
incq %rax
cmpq %rax, %r13
jne 0x410ba
divsd %xmm6, %xmm2
movsd 0x1bc28(%rip), %xmm5    # 0x5cd08
mulsd %xmm7, %xmm5
mulsd %xmm7, %xmm5
addsd %xmm2, %xmm5
movsd %xmm5, 0x3996c(%rip)    # 0x7aa60
movapd %xmm1, %xmm2
divsd %xmm5, %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 0x41133
xorps %xmm0, %xmm0
sqrtsd %xmm1, %xmm0
jmp 0x4113c
movapd %xmm1, %xmm0
callq 0x2290
cvtsd2ss %xmm0, %xmm0
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
nop