// File: /workspace/github_cpp_makefile_star2_O1/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, 0x8(%rsp)
movapd %xmm0, %xmm9
movq %rdi, %rbx
movsd 0x1880e(%rip), %xmm0    # 0xcf440
movapd %xmm0, %xmm12
subsd %xmm9, %xmm12
movapd %xmm12, %xmm7
mulsd %xmm9, %xmm7
movsd 0x187f9(%rip), %xmm11   # 0xcf448
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, 0x20(%rsp)
mulsd %xmm2, %xmm10
movsd %xmm6, 0x60(%rsp)
movapd %xmm6, %xmm14
addsd %xmm11, %xmm14
subsd %xmm3, %xmm0
movsd %xmm0, 0x10(%rsp)
xorpd %xmm6, %xmm6
xorpd %xmm0, %xmm0
movsd %xmm0, 0x30(%rsp)
ucomisd %xmm6, %xmm9
jne 0xb6cd6
jp 0xb6cd6
xorpd %xmm15, %xmm15
ucomisd %xmm15, %xmm1
jne 0xb6cd6
jnp 0xb6d28
ucomisd 0x18761(%rip), %xmm9    # 0xcf440
jne 0xb6cef
jp 0xb6cef
ucomisd 0x18755(%rip), %xmm1    # 0xcf440
jne 0xb6cef
jnp 0xb6d28
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, 0x30(%rsp)
divsd %xmm14, %xmm10
movsd 0x10(%rsp), %xmm15
mulsd %xmm3, %xmm15
addsd 0x8(%rsp), %xmm11
xorpd %xmm14, %xmm14
ucomisd %xmm14, %xmm9
jne 0xb6d5a
jp 0xb6d5a
xorpd %xmm0, %xmm0
ucomisd %xmm0, %xmm2
jne 0xb6d5a
jnp 0xb6da9
ucomisd 0x186dd(%rip), %xmm9    # 0xcf440
jne 0xb6d73
jp 0xb6d73
ucomisd 0x186d1(%rip), %xmm2    # 0xcf440
jne 0xb6d73
jnp 0xb6da9
movapd %xmm9, %xmm14
subsd %xmm2, %xmm14
mulsd %xmm14, %xmm14
subsd %xmm13, %xmm14
movapd %xmm12, %xmm0
mulsd %xmm2, %xmm0
movapd %xmm9, %xmm6
mulsd 0x20(%rsp), %xmm6
addsd %xmm0, %xmm6
subsd %xmm10, %xmm14
divsd %xmm6, %xmm14
divsd %xmm11, %xmm15
xorpd %xmm11, %xmm11
ucomisd %xmm11, %xmm9
jne 0xb6dc8
jp 0xb6dc8
xorpd %xmm0, %xmm0
ucomisd %xmm0, %xmm3
jne 0xb6dc8
jnp 0xb6e10
ucomisd 0x1866f(%rip), %xmm9    # 0xcf440
jne 0xb6de1
jp 0xb6de1
ucomisd 0x18663(%rip), %xmm3    # 0xcf440
jne 0xb6de1
jnp 0xb6e10
movapd %xmm9, %xmm11
subsd %xmm3, %xmm11
mulsd %xmm11, %xmm11
subsd %xmm13, %xmm11
mulsd %xmm3, %xmm12
mulsd 0x10(%rsp), %xmm9
addsd %xmm12, %xmm9
subsd %xmm15, %xmm11
divsd %xmm9, %xmm11
xorpd %xmm0, %xmm0
ucomisd %xmm0, %xmm1
jne 0xb6e28
jp 0xb6e28
xorpd %xmm6, %xmm6
ucomisd %xmm6, %xmm2
jne 0xb6e28
jnp 0xb6e74
ucomisd 0x18610(%rip), %xmm1    # 0xcf440
jne 0xb6e40
jp 0xb6e40
ucomisd 0x18604(%rip), %xmm2    # 0xcf440
jne 0xb6e40
jnp 0xb6e74
movapd %xmm1, %xmm0
subsd %xmm2, %xmm0
mulsd %xmm0, %xmm0
subsd %xmm7, %xmm0
movapd %xmm8, %xmm6
mulsd %xmm2, %xmm6
movapd %xmm1, %xmm9
mulsd 0x20(%rsp), %xmm9
addsd %xmm6, %xmm9
subsd %xmm10, %xmm0
divsd %xmm9, %xmm0
xorpd %xmm12, %xmm12
ucomisd %xmm12, %xmm1
jne 0xb6e8e
jp 0xb6e8e
xorpd %xmm6, %xmm6
ucomisd %xmm6, %xmm3
jne 0xb6e8e
jnp 0xb6ed4
ucomisd 0x185aa(%rip), %xmm1    # 0xcf440
jne 0xb6ea6
jp 0xb6ea6
ucomisd 0x1859e(%rip), %xmm3    # 0xcf440
jne 0xb6ea6
jnp 0xb6ed4
movapd %xmm1, %xmm12
subsd %xmm3, %xmm12
mulsd %xmm12, %xmm12
subsd %xmm7, %xmm12
mulsd %xmm3, %xmm8
mulsd 0x10(%rsp), %xmm1
addsd %xmm8, %xmm1
subsd %xmm15, %xmm12
divsd %xmm1, %xmm12
xorpd %xmm8, %xmm8
ucomisd %xmm8, %xmm2
jne 0xb6eee
jp 0xb6eee
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm3
jne 0xb6eee
jnp 0xb6f3c
ucomisd 0x1854a(%rip), %xmm2    # 0xcf440
jne 0xb6f06
jp 0xb6f06
ucomisd 0x1853e(%rip), %xmm3    # 0xcf440
jne 0xb6f06
jnp 0xb6f3c
movapd %xmm2, %xmm8
subsd %xmm3, %xmm8
mulsd %xmm8, %xmm8
subsd %xmm10, %xmm8
movsd 0x20(%rsp), %xmm1
mulsd %xmm3, %xmm1
movsd 0x10(%rsp), %xmm3
mulsd %xmm2, %xmm3
addsd %xmm1, %xmm3
subsd %xmm15, %xmm8
divsd %xmm3, %xmm8
xorpd %xmm1, %xmm1
xorpd %xmm6, %xmm6
maxsd 0x30(%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 0x184cb(%rip), %xmm2    # 0xcf450
mulsd %xmm2, %xmm8
movapd %xmm2, %xmm11
movapd %xmm6, %xmm2
movsd 0x184a4(%rip), %xmm12   # 0xcf440
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 0x60(%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, 0x10(%rsp)
movsd 0x8(%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, 0x30(%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, 0x20(%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, 0x50(%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, 0x60(%rsp)
movapd %xmm12, %xmm0
subsd %xmm2, %xmm0
callq 0x83b0
movsd %xmm0, 0x8(%rsp)
movsd 0x18328(%rip), %xmm0    # 0xcf440
subsd 0x10(%rsp), %xmm0
callq 0x83b0
movsd %xmm0, 0x10(%rsp)
movsd 0x1830f(%rip), %xmm0    # 0xcf440
subsd 0x30(%rsp), %xmm0
callq 0x83b0
movsd %xmm0, 0x30(%rsp)
movsd 0x182f6(%rip), %xmm0    # 0xcf440
subsd 0x20(%rsp), %xmm0
callq 0x83b0
xorpd 0x18303(%rip), %xmm0    # 0xcf460
movapd %xmm0, 0x20(%rsp)
movsd 0x182d5(%rip), %xmm0    # 0xcf440
subsd 0x50(%rsp), %xmm0
callq 0x83b0
xorpd 0x182e2(%rip), %xmm0    # 0xcf460
movapd %xmm0, 0x50(%rsp)
movsd 0x182b4(%rip), %xmm0    # 0xcf440
subsd 0x60(%rsp), %xmm0
callq 0x83b0
movapd 0x50(%rsp), %xmm4
movapd 0x20(%rsp), %xmm3
xorpd 0x182b5(%rip), %xmm0    # 0xcf460
subsd 0x10(%rsp), %xmm4
subsd 0x30(%rsp), %xmm3
subsd 0x8(%rsp), %xmm0
ucomisd %xmm3, %xmm4
movapd %xmm3, %xmm1
cmpnlesd %xmm4, %xmm1
movapd %xmm1, %xmm2
andpd %xmm3, %xmm2
andnpd %xmm4, %xmm1
orpd %xmm2, %xmm1
subsd %xmm0, %xmm1
mulsd 0x1826a(%rip), %xmm1    # 0xcf450
movsd %xmm1, 0x48(%rsp)
jb 0xb720f
ucomisd %xmm0, %xmm4
jb 0xb720f
movapd %xmm3, %xmm1
cmplesd %xmm0, %xmm1
andpd %xmm1, %xmm3
andnpd %xmm0, %xmm1
orpd %xmm3, %xmm1
movapd %xmm4, %xmm0
jmp 0xb724b
ucomisd %xmm4, %xmm3
jb 0xb7236
ucomisd %xmm0, %xmm3
jb 0xb7236
movapd %xmm4, %xmm1
cmplesd %xmm0, %xmm1
andpd %xmm1, %xmm4
andnpd %xmm0, %xmm1
orpd %xmm4, %xmm1
movapd %xmm3, %xmm0
jmp 0xb724b
movapd %xmm4, %xmm1
cmpnlesd %xmm3, %xmm1
andpd %xmm1, %xmm3
andnpd %xmm4, %xmm1
orpd %xmm3, %xmm1
subsd %xmm1, %xmm0
mulsd 0x181f9(%rip), %xmm0    # 0xcf450
movsd %xmm0, 0x70(%rsp)
xorpd %xmm1, %xmm1
movupd %xmm1, (%rbx)
movq $0x0, 0x10(%rbx)
movq 0x8(%rbx), %rsi
testq %rsi, %rsi
je 0xb7284
movsd %xmm0, (%rsi)
addq $0x8, %rsi
movq %rsi, 0x8(%rbx)
jmp 0xb7291
leaq 0x70(%rsp), %rdx
movq %rbx, %rdi
callq 0x79f34
movq 0x8(%rbx), %rsi
cmpq 0x10(%rbx), %rsi
je 0xb72af
movsd 0x48(%rsp), %xmm0
movsd %xmm0, (%rsi)
addq $0x8, %rsi
movq %rsi, 0x8(%rbx)
jmp 0xb72bc
leaq 0x48(%rsp), %rdx
movq %rbx, %rdi
callq 0x79f34
movq %rbx, %rax
addq $0x78, %rsp
popq %rbx
popq %r14
retq
movq %rax, %r14
movq (%rbx), %rdi
testq %rdi, %rdi
je 0xb72de
movq 0x10(%rbx), %rsi
subq %rdi, %rsi
callq 0x8480
movq %r14, %rdi
callq 0x8840
nop