// File: /workspace/github_cpp_makefile_star2_O2/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 0x12dd0(%rip), %xmm0    # 0x975f0
movapd %xmm0, %xmm12
subsd %xmm9, %xmm12
movapd %xmm12, %xmm7
mulsd %xmm9, %xmm7
movsd 0x12dbb(%rip), %xmm11   # 0x975f8
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, 0x50(%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 0x848c4
jp 0x848c4
xorpd %xmm15, %xmm15
ucomisd %xmm15, %xmm1
jne 0x848c4
jnp 0x84916
ucomisd 0x12d23(%rip), %xmm9    # 0x975f0
jne 0x848dd
jp 0x848dd
ucomisd 0x12d17(%rip), %xmm1    # 0x975f0
jne 0x848dd
jnp 0x84916
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 0x84948
jp 0x84948
xorpd %xmm0, %xmm0
ucomisd %xmm0, %xmm2
jne 0x84948
jnp 0x84997
ucomisd 0x12c9f(%rip), %xmm9    # 0x975f0
jne 0x84961
jp 0x84961
ucomisd 0x12c93(%rip), %xmm2    # 0x975f0
jne 0x84961
jnp 0x84997
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 0x849b6
jp 0x849b6
xorpd %xmm0, %xmm0
ucomisd %xmm0, %xmm3
jne 0x849b6
jnp 0x849fe
ucomisd 0x12c31(%rip), %xmm9    # 0x975f0
jne 0x849cf
jp 0x849cf
ucomisd 0x12c25(%rip), %xmm3    # 0x975f0
jne 0x849cf
jnp 0x849fe
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 0x84a16
jp 0x84a16
xorpd %xmm6, %xmm6
ucomisd %xmm6, %xmm2
jne 0x84a16
jnp 0x84a62
ucomisd 0x12bd2(%rip), %xmm1    # 0x975f0
jne 0x84a2e
jp 0x84a2e
ucomisd 0x12bc6(%rip), %xmm2    # 0x975f0
jne 0x84a2e
jnp 0x84a62
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 0x84a7c
jp 0x84a7c
xorpd %xmm6, %xmm6
ucomisd %xmm6, %xmm3
jne 0x84a7c
jnp 0x84ac2
ucomisd 0x12b6c(%rip), %xmm1    # 0x975f0
jne 0x84a94
jp 0x84a94
ucomisd 0x12b60(%rip), %xmm3    # 0x975f0
jne 0x84a94
jnp 0x84ac2
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 0x84adc
jp 0x84adc
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm3
jne 0x84adc
jnp 0x84b2a
ucomisd 0x12b0c(%rip), %xmm2    # 0x975f0
jne 0x84af4
jp 0x84af4
ucomisd 0x12b00(%rip), %xmm3    # 0x975f0
jne 0x84af4
jnp 0x84b2a
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 0x12a8d(%rip), %xmm2    # 0x97600
mulsd %xmm2, %xmm8
movapd %xmm2, %xmm11
movapd %xmm6, %xmm2
movsd 0x12a66(%rip), %xmm12   # 0x975f0
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, 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, 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 0x83e0
movsd %xmm0, 0x8(%rsp)
movsd 0x128ea(%rip), %xmm0    # 0x975f0
subsd 0x10(%rsp), %xmm0
callq 0x83e0
movsd %xmm0, 0x10(%rsp)
movsd 0x128d1(%rip), %xmm0    # 0x975f0
subsd 0x30(%rsp), %xmm0
callq 0x83e0
movsd %xmm0, 0x30(%rsp)
movsd 0x128b8(%rip), %xmm0    # 0x975f0
subsd 0x20(%rsp), %xmm0
callq 0x83e0
xorpd 0x12875(%rip), %xmm0    # 0x975c0
movapd %xmm0, 0x20(%rsp)
movsd 0x12897(%rip), %xmm0    # 0x975f0
subsd 0x40(%rsp), %xmm0
callq 0x83e0
xorpd 0x12854(%rip), %xmm0    # 0x975c0
movapd %xmm0, 0x40(%rsp)
movsd 0x12876(%rip), %xmm0    # 0x975f0
subsd 0x50(%rsp), %xmm0
callq 0x83e0
movapd 0x40(%rsp), %xmm4
movapd 0x20(%rsp), %xmm3
xorpd 0x12827(%rip), %xmm0    # 0x975c0
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 0x1282c(%rip), %xmm1    # 0x97600
movsd %xmm1, 0x68(%rsp)
jb 0x84dfd
ucomisd %xmm0, %xmm4
jb 0x84dfd
movapd %xmm3, %xmm1
cmplesd %xmm0, %xmm1
andpd %xmm1, %xmm3
andnpd %xmm0, %xmm1
orpd %xmm3, %xmm1
movapd %xmm4, %xmm0
jmp 0x84e39
ucomisd %xmm4, %xmm3
jb 0x84e24
ucomisd %xmm0, %xmm3
jb 0x84e24
movapd %xmm4, %xmm1
cmplesd %xmm0, %xmm1
andpd %xmm1, %xmm4
andnpd %xmm0, %xmm1
orpd %xmm4, %xmm1
movapd %xmm3, %xmm0
jmp 0x84e39
movapd %xmm4, %xmm1
cmpnlesd %xmm3, %xmm1
andpd %xmm1, %xmm3
andnpd %xmm4, %xmm1
orpd %xmm3, %xmm1
subsd %xmm1, %xmm0
mulsd 0x127bb(%rip), %xmm0    # 0x97600
leaq 0x70(%rsp), %rsi
movsd %xmm0, (%rsi)
xorpd %xmm0, %xmm0
movupd %xmm0, (%rbx)
andq $0x0, 0x10(%rbx)
movq %rbx, %rdi
callq 0x5a406
leaq 0x68(%rsp), %rsi
movq %rbx, %rdi
callq 0x5a406
movq %rbx, %rax
addq $0x78, %rsp
popq %rbx
popq %r14
retq
movq %rax, %r14
movq %rbx, %rdi
callq 0x2b43c
movq %r14, %rdi
callq 0x8870
nop