// File: /workspace/github_cpp_makefile_star2_O3/millanek[P]evo/evo_ABS.cpp
// Function: calculateABSfromAFs(double, double, double, double, double, double, double, double)
inline std::vector<double> calculateABSfromAFs(double pW, double pX, double pY, double pZ,
                                               double pWAlleleCount, double pXAlleleCount, double pYAlleleCount, double pZAlleleCount) {
    // std::cerr << "p:\t" << p1 << "\t" << p2 << "\t" << p3 <<  std::endl;
    double FstWX; double FstWY; double FstWZ;
    double FstXY; double FstXZ; double FstYZ;
    double powerWX = pow(pW-pX, 2); double powerWY = pow(pW-pY, 2);
    double powerWZ = pow(pW-pZ, 2); double powerXY = pow(pX-pY, 2);
    double powerXZ = pow(pX-pZ, 2); double powerYZ = pow(pY-pZ, 2);
    double fractionX = (pW*(1-pW))/(pWAlleleCount-1); double fractionW = (pX*(1-pX))/(pXAlleleCount-1);
    double fractionY = (pY*(1-pY))/(pYAlleleCount-1); double fractionZ = (pZ*(1-pZ))/(pZAlleleCount-1);
    double numeratorWX = powerWX - fractionW - fractionX;
    double numeratorWY = powerWY - fractionW - fractionY;
    double numeratorWZ = powerWZ - fractionW - fractionZ;
    double numeratorXY = powerXY - fractionX - fractionY;
    double numeratorXZ = powerXZ - fractionX - fractionZ;
    double numeratorYZ = powerYZ - fractionY - fractionZ;
    double denominatorWX = (pW*(1-pX))+(pX*(1-pW)); double denominatorWY = (pW*(1-pY))+(pY*(1-pW));
    double denominatorWZ = (pW*(1-pZ))+(pZ*(1-pW)); double denominatorXY = (pX*(1-pY))+(pY*(1-pX));
    double denominatorXZ = (pX*(1-pZ))+(pZ*(1-pX)); double denominatorYZ = (pY*(1-pZ))+(pZ*(1-pY));
    if ((pW == 0 && pX == 0) || (pW == 1 && pX == 1)) { FstWX = 0.0; } else { FstWX = numeratorWX/denominatorWX; }
    if ((pW == 0 && pY == 0) || (pW == 1 && pY == 1)) { FstWY = 0.0; } else { FstWY = numeratorWY/denominatorWY; }
    if ((pW == 0 && pZ == 0) || (pW == 1 && pZ == 1)) { FstWZ = 0.0; } else { FstWZ = numeratorWZ/denominatorWZ; }
    if ((pX == 0 && pY == 0) || (pX == 1 && pY == 1)) { FstXY = 0.0; } else { FstXY = numeratorXY/denominatorXY; }
    if ((pX == 0 && pZ == 0) || (pX == 1 && pZ == 1)) { FstXZ = 0.0; } else { FstXZ = numeratorXZ/denominatorXZ; }
    if ((pY == 0 && pZ == 0) || (pY == 1 && pZ == 1)) { FstYZ = 0.0; } else { FstYZ = numeratorYZ/denominatorYZ; }
    // std::cerr << Fst12 << "\t" << Fst13 << "\t" << Fst23 <<  std::endl;
    if (FstWX < 0) FstWX = 0; if (FstWY < 0) FstWY = 0; if (FstWZ < 0) FstWZ = 0;
    if (FstXY < 0) FstXY = 0; if (FstXZ < 0) FstXZ = 0; if (FstYZ < 0) FstYZ = 0;
    if (FstWX == 1) FstWX = 1 - (FstWX/((pWAlleleCount+pXAlleleCount)/2.0));
    if (FstWY == 1) FstWY = 1 - (FstWY/((pWAlleleCount+pYAlleleCount)/2.0));
    if (FstWZ == 1) FstWZ = 1 - (FstWZ/((pWAlleleCount+pZAlleleCount)/2.0));
    if (FstXY == 1) FstXY = 1 - (FstXY/((pXAlleleCount+pYAlleleCount)/2.0));
    if (FstXZ == 1) FstXZ = 1 - (FstXZ/((pXAlleleCount+pZAlleleCount)/2.0));
    if (FstYZ == 1) FstYZ = 1 - (FstYZ/((pYAlleleCount+pZAlleleCount)/2.0));
    double TWX = -log(1-FstWX); double TWY = -log(1-FstWY); double TWZ = -log(1-FstWZ);
    double TXY = -log(1-FstXY); double TXZ = -log(1-FstXZ); double TYZ = -log(1-FstYZ);
    double TWYTXZ = TWY + TXZ; double TWZTXY = TWZ + TXY; double TWXTYZ = TWX + TYZ;
    double twoMax; if (TWYTXZ >= TWZTXY) { twoMax = TWYTXZ; } else { twoMax = TWZTXY; }
    double ABSalt = (twoMax-TWXTYZ)/2.0;
    double threeMax; double threeMin;
    if (TWYTXZ >= TWZTXY && TWYTXZ >= TWXTYZ) { threeMax = TWYTXZ; if (TWZTXY <= TWXTYZ) { threeMin = TWZTXY;} else { threeMin = TWXTYZ;}}
    else if (TWZTXY >= TWYTXZ && TWZTXY >= TWXTYZ) { threeMax = TWZTXY; if (TWYTXZ <= TWXTYZ) { threeMin = TWYTXZ;} else { threeMin = TWXTYZ;}}
    else { threeMax = TWXTYZ; if (TWYTXZ <= TWZTXY) { threeMin = TWYTXZ;} else { threeMin = TWZTXY;} }
    double ABSmain = (threeMax-threeMin)/2.0;
    //if (PBS1 < 0) PBS1 = 0; if (PBS2 < 0) PBS2 = 0; if (PBS3 < 0) PBS3 = 0;
    //std::cerr << PBS1 << "\t" << PBS2 << "\t" << PBS3 <<  std::endl;
    std::vector<double> ABS; ABS.push_back(ABSmain); ABS.push_back(ABSalt);
    return ABS;
}

// Assembly:
pushq %r14
pushq %rbx
subq $0x78, %rsp
movsd %xmm7, 0x30(%rsp)
movapd %xmm0, %xmm9
movq %rdi, %rbx
movsd 0x16a42(%rip), %xmm0    # 0xcc710
movapd %xmm0, %xmm12
subsd %xmm9, %xmm12
movapd %xmm12, %xmm7
mulsd %xmm9, %xmm7
movsd 0x16a2d(%rip), %xmm11   # 0xcc718
movapd %xmm4, %xmm8
addsd %xmm11, %xmm8
divsd %xmm8, %xmm7
movapd %xmm0, %xmm8
subsd %xmm1, %xmm8
movapd %xmm8, %xmm13
mulsd %xmm1, %xmm13
movapd %xmm5, %xmm10
addsd %xmm11, %xmm10
divsd %xmm10, %xmm13
movapd %xmm0, %xmm10
subsd %xmm2, %xmm10
movsd %xmm10, 0x10(%rsp)
mulsd %xmm2, %xmm10
movsd %xmm6, 0x50(%rsp)
movapd %xmm6, %xmm14
addsd %xmm11, %xmm14
subsd %xmm3, %xmm0
movsd %xmm0, (%rsp)
xorpd %xmm6, %xmm6
xorpd %xmm0, %xmm0
movsd %xmm0, 0x20(%rsp)
ucomisd %xmm6, %xmm9
jne 0xb5d71
jp 0xb5d71
xorpd %xmm15, %xmm15
ucomisd %xmm15, %xmm1
jne 0xb5d71
jnp 0xb5dc3
ucomisd 0x16996(%rip), %xmm9    # 0xcc710
jne 0xb5d8a
jp 0xb5d8a
ucomisd 0x1698a(%rip), %xmm1    # 0xcc710
jne 0xb5d8a
jnp 0xb5dc3
movapd %xmm9, %xmm6
subsd %xmm1, %xmm6
mulsd %xmm6, %xmm6
subsd %xmm13, %xmm6
subsd %xmm7, %xmm6
movapd %xmm12, %xmm15
mulsd %xmm1, %xmm15
movapd %xmm9, %xmm0
mulsd %xmm8, %xmm0
addsd %xmm15, %xmm0
divsd %xmm0, %xmm6
movsd %xmm6, 0x20(%rsp)
divsd %xmm14, %xmm10
movsd (%rsp), %xmm15
mulsd %xmm3, %xmm15
addsd 0x30(%rsp), %xmm11
xorpd %xmm14, %xmm14
ucomisd %xmm14, %xmm9
jne 0xb5df4
jp 0xb5df4
xorpd %xmm0, %xmm0
ucomisd %xmm0, %xmm2
jne 0xb5df4
jnp 0xb5e43
ucomisd 0x16913(%rip), %xmm9    # 0xcc710
jne 0xb5e0d
jp 0xb5e0d
ucomisd 0x16907(%rip), %xmm2    # 0xcc710
jne 0xb5e0d
jnp 0xb5e43
movapd %xmm9, %xmm14
subsd %xmm2, %xmm14
mulsd %xmm14, %xmm14
subsd %xmm13, %xmm14
movapd %xmm12, %xmm0
mulsd %xmm2, %xmm0
movapd %xmm9, %xmm6
mulsd 0x10(%rsp), %xmm6
addsd %xmm0, %xmm6
subsd %xmm10, %xmm14
divsd %xmm6, %xmm14
divsd %xmm11, %xmm15
xorpd %xmm11, %xmm11
ucomisd %xmm11, %xmm9
jne 0xb5e62
jp 0xb5e62
xorpd %xmm0, %xmm0
ucomisd %xmm0, %xmm3
jne 0xb5e62
jnp 0xb5ea9
ucomisd 0x168a5(%rip), %xmm9    # 0xcc710
jne 0xb5e7b
jp 0xb5e7b
ucomisd 0x16899(%rip), %xmm3    # 0xcc710
jne 0xb5e7b
jnp 0xb5ea9
movapd %xmm9, %xmm11
subsd %xmm3, %xmm11
mulsd %xmm11, %xmm11
subsd %xmm13, %xmm11
mulsd %xmm3, %xmm12
mulsd (%rsp), %xmm9
addsd %xmm12, %xmm9
subsd %xmm15, %xmm11
divsd %xmm9, %xmm11
xorpd %xmm0, %xmm0
ucomisd %xmm0, %xmm1
jne 0xb5ec1
jp 0xb5ec1
xorpd %xmm6, %xmm6
ucomisd %xmm6, %xmm2
jne 0xb5ec1
jnp 0xb5f0d
ucomisd 0x16847(%rip), %xmm1    # 0xcc710
jne 0xb5ed9
jp 0xb5ed9
ucomisd 0x1683b(%rip), %xmm2    # 0xcc710
jne 0xb5ed9
jnp 0xb5f0d
movapd %xmm1, %xmm0
subsd %xmm2, %xmm0
mulsd %xmm0, %xmm0
subsd %xmm7, %xmm0
movapd %xmm8, %xmm6
mulsd %xmm2, %xmm6
movapd %xmm1, %xmm9
mulsd 0x10(%rsp), %xmm9
addsd %xmm6, %xmm9
subsd %xmm10, %xmm0
divsd %xmm9, %xmm0
xorpd %xmm12, %xmm12
ucomisd %xmm12, %xmm1
jne 0xb5f27
jp 0xb5f27
xorpd %xmm6, %xmm6
ucomisd %xmm6, %xmm3
jne 0xb5f27
jnp 0xb5f6c
ucomisd 0x167e1(%rip), %xmm1    # 0xcc710
jne 0xb5f3f
jp 0xb5f3f
ucomisd 0x167d5(%rip), %xmm3    # 0xcc710
jne 0xb5f3f
jnp 0xb5f6c
movapd %xmm1, %xmm12
subsd %xmm3, %xmm12
mulsd %xmm12, %xmm12
subsd %xmm7, %xmm12
mulsd %xmm3, %xmm8
mulsd (%rsp), %xmm1
addsd %xmm8, %xmm1
subsd %xmm15, %xmm12
divsd %xmm1, %xmm12
xorpd %xmm8, %xmm8
ucomisd %xmm8, %xmm2
jne 0xb5f86
jp 0xb5f86
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm3
jne 0xb5f86
jnp 0xb5fd3
ucomisd 0x16782(%rip), %xmm2    # 0xcc710
jne 0xb5f9e
jp 0xb5f9e
ucomisd 0x16776(%rip), %xmm3    # 0xcc710
jne 0xb5f9e
jnp 0xb5fd3
movapd %xmm2, %xmm8
subsd %xmm3, %xmm8
mulsd %xmm8, %xmm8
subsd %xmm10, %xmm8
movsd 0x10(%rsp), %xmm1
mulsd %xmm3, %xmm1
movsd (%rsp), %xmm3
mulsd %xmm2, %xmm3
addsd %xmm1, %xmm3
subsd %xmm15, %xmm8
divsd %xmm3, %xmm8
xorpd %xmm1, %xmm1
xorpd %xmm6, %xmm6
maxsd 0x20(%rsp), %xmm6
xorpd %xmm10, %xmm10
maxsd %xmm14, %xmm10
xorpd %xmm7, %xmm7
maxsd %xmm11, %xmm7
xorpd %xmm3, %xmm3
maxsd %xmm0, %xmm3
xorpd %xmm0, %xmm0
maxsd %xmm12, %xmm0
maxsd %xmm8, %xmm1
movapd %xmm4, %xmm8
addsd %xmm5, %xmm8
movsd 0x16704(%rip), %xmm2    # 0xcc720
mulsd %xmm2, %xmm8
movapd %xmm2, %xmm11
movapd %xmm6, %xmm2
movsd 0x166dd(%rip), %xmm12   # 0xcc710
cmpeqsd %xmm12, %xmm2
movapd %xmm2, %xmm9
andnpd %xmm6, %xmm9
divsd %xmm8, %xmm6
movapd %xmm12, %xmm8
subsd %xmm6, %xmm8
andpd %xmm8, %xmm2
orpd %xmm9, %xmm2
movapd %xmm4, %xmm6
movsd 0x50(%rsp), %xmm9
addsd %xmm9, %xmm6
mulsd %xmm11, %xmm6
movapd %xmm10, %xmm13
cmpeqsd %xmm12, %xmm13
movapd %xmm13, %xmm8
andnpd %xmm10, %xmm8
divsd %xmm6, %xmm10
movapd %xmm12, %xmm6
subsd %xmm10, %xmm6
andpd %xmm6, %xmm13
orpd %xmm8, %xmm13
movapd %xmm13, (%rsp)
movsd 0x30(%rsp), %xmm8
addsd %xmm8, %xmm4
mulsd %xmm11, %xmm4
movapd %xmm7, %xmm10
cmpeqsd %xmm12, %xmm10
movapd %xmm10, %xmm6
andnpd %xmm7, %xmm6
divsd %xmm4, %xmm7
movapd %xmm12, %xmm4
subsd %xmm7, %xmm4
andpd %xmm4, %xmm10
orpd %xmm6, %xmm10
movapd %xmm10, 0x20(%rsp)
movapd %xmm5, %xmm4
addsd %xmm9, %xmm4
mulsd %xmm11, %xmm4
movapd %xmm3, %xmm7
cmpeqsd %xmm12, %xmm7
movapd %xmm7, %xmm6
andnpd %xmm3, %xmm6
divsd %xmm4, %xmm3
movapd %xmm12, %xmm4
subsd %xmm3, %xmm4
andpd %xmm4, %xmm7
orpd %xmm6, %xmm7
movapd %xmm7, 0x10(%rsp)
addsd %xmm8, %xmm5
mulsd %xmm11, %xmm5
movapd %xmm0, %xmm6
cmpeqsd %xmm12, %xmm6
movapd %xmm6, %xmm3
andnpd %xmm0, %xmm3
divsd %xmm5, %xmm0
movapd %xmm12, %xmm4
subsd %xmm0, %xmm4
andpd %xmm4, %xmm6
orpd %xmm3, %xmm6
movapd %xmm6, 0x40(%rsp)
addsd %xmm8, %xmm9
mulsd %xmm11, %xmm9
movapd %xmm1, %xmm4
cmpeqsd %xmm12, %xmm4
movapd %xmm4, %xmm0
andnpd %xmm1, %xmm0
divsd %xmm9, %xmm1
movapd %xmm12, %xmm3
subsd %xmm1, %xmm3
andpd %xmm3, %xmm4
orpd %xmm0, %xmm4
movapd %xmm4, 0x50(%rsp)
movapd %xmm12, %xmm0
subsd %xmm2, %xmm0
callq 0x83b0
movsd %xmm0, 0x30(%rsp)
movsd 0x16562(%rip), %xmm0    # 0xcc710
subsd (%rsp), %xmm0
callq 0x83b0
movsd %xmm0, (%rsp)
movsd 0x1654b(%rip), %xmm0    # 0xcc710
subsd 0x20(%rsp), %xmm0
callq 0x83b0
movsd %xmm0, 0x20(%rsp)
movsd 0x16532(%rip), %xmm0    # 0xcc710
subsd 0x10(%rsp), %xmm0
callq 0x83b0
xorpd 0x164ef(%rip), %xmm0    # 0xcc6e0
movapd %xmm0, 0x10(%rsp)
movsd 0x16511(%rip), %xmm0    # 0xcc710
subsd 0x40(%rsp), %xmm0
callq 0x83b0
xorpd 0x164ce(%rip), %xmm0    # 0xcc6e0
movapd %xmm0, 0x40(%rsp)
movsd 0x164f0(%rip), %xmm0    # 0xcc710
subsd 0x50(%rsp), %xmm0
callq 0x83b0
movapd 0x40(%rsp), %xmm4
movapd 0x10(%rsp), %xmm3
xorpd 0x164a1(%rip), %xmm0    # 0xcc6e0
subsd (%rsp), %xmm4
subsd 0x20(%rsp), %xmm3
subsd 0x30(%rsp), %xmm0
ucomisd %xmm3, %xmm4
movapd %xmm3, %xmm2
cmpnlesd %xmm4, %xmm2
movapd %xmm2, %xmm1
andpd %xmm3, %xmm1
andnpd %xmm4, %xmm2
orpd %xmm1, %xmm2
subsd %xmm0, %xmm2
mulsd 0x164a7(%rip), %xmm2    # 0xcc720
movapd %xmm2, 0x30(%rsp)
movsd %xmm2, 0x68(%rsp)
jb 0xb62a8
ucomisd %xmm0, %xmm4
jb 0xb62a8
movapd %xmm3, %xmm1
cmplesd %xmm0, %xmm1
andpd %xmm1, %xmm3
andnpd %xmm0, %xmm1
orpd %xmm3, %xmm1
movapd %xmm4, %xmm0
jmp 0xb62e4
ucomisd %xmm4, %xmm3
jb 0xb62cf
ucomisd %xmm0, %xmm3
jb 0xb62cf
movapd %xmm4, %xmm1
cmplesd %xmm0, %xmm1
andpd %xmm1, %xmm4
andnpd %xmm0, %xmm1
orpd %xmm4, %xmm1
movapd %xmm3, %xmm0
jmp 0xb62e4
movapd %xmm4, %xmm1
cmpnlesd %xmm3, %xmm1
andpd %xmm1, %xmm3
andnpd %xmm4, %xmm1
orpd %xmm3, %xmm1
subsd %xmm1, %xmm0
mulsd 0x16430(%rip), %xmm0    # 0xcc720
leaq 0x70(%rsp), %rdx
movsd %xmm0, (%rdx)
xorpd %xmm0, %xmm0
movupd %xmm0, (%rbx)
movq $0x0, 0x10(%rbx)
movq %rbx, %rdi
xorl %esi, %esi
callq 0x79b8e
movq 0x8(%rbx), %rsi
cmpq 0x10(%rbx), %rsi
je 0xb6331
movapd 0x30(%rsp), %xmm0
movsd %xmm0, (%rsi)
addq $0x8, %rsi
movq %rsi, 0x8(%rbx)
jmp 0xb633e
leaq 0x68(%rsp), %rdx
movq %rbx, %rdi
callq 0x79b8e
movq %rbx, %rax
addq $0x78, %rsp
popq %rbx
popq %r14
retq
movq %rax, %r14
movq (%rbx), %rdi
testq %rdi, %rdi
je 0xb6360
movq 0x10(%rbx), %rsi
subq %rdi, %rsi
callq 0x8480
movq %r14, %rdi
callq 0x8840