// File: /workspace/github_cpp_makefile_star2_O1/canzarlab[P]Trajan/geno/lineSearch.cpp
// Function: dcstep(double&, double&, double&, double&, double&, double&, double&, double, double, bool&, double, double)
void dcstep(double & stx,
            double & fx,
            double & dx,
            double & sty,
            double & fy,
            double & dy,
            double & stp,
            double fp,
            double dp,
            bool & brackt,
            double const stpmin,
            double const stpmax) {
  double const zero  = 0.0,
               p66   = 0.66,
               two   = 2.0,
               three = 3.0;
  double gamma, p, q, r, s, sgnd, stpc, stpf, stpq, theta;
  sgnd = dp * (dx / std::fabs(dx));
  if (fp > fx) {
    //    std::cout << "dcstep 1" << std::endl;
     theta = three * (fx - fp) / (stp - stx) + dx + dp;
     s = std::max(std::fabs(theta), std::max(std::fabs(dx), std::fabs(dp)));
     gamma = s * std::sqrt(std::pow(theta / s, 2) - (dx / s) * (dp / s));
     if (stp < stx) gamma = -gamma;
     p = (gamma - dx) + theta;
     q = ((gamma - dx) + gamma) + dp;
     r = p / q;
     stpc = stx + r*(stp - stx);
     stpq = stx + ((dx/((fx - fp)/(stp - stx) + dx))/two) * (stp - stx);
     if (std::fabs(stpc-stx) < std::fabs(stpq-stx)) {
        stpf = stpc;
     } else {
        stpf = stpc + (stpq - stpc)/two;
     }
     brackt = true;
  } else if (sgnd < zero) {
    //    std::cout << "dcstep 2" << std::endl;
     theta = three*(fx - fp)/(stp - stx) + dx + dp;
     s = std::max(std::fabs(theta), std::max(std::fabs(dx),std::fabs(dp)));
     gamma = s*std::sqrt(std::pow(theta/s, 2) - (dx/s)*(dp/s));
     if (stp > stx) gamma = -gamma;
     p = (gamma - dp) + theta;
     q = ((gamma - dp) + gamma) + dx;
     r = p/q;
     stpc = stp + r*(stx - stp);
     stpq = stp + (dp/(dp - dx))*(stx - stp);
     if (std::fabs(stpc-stp) > std::fabs(stpq-stp)) {
        stpf = stpc;
     } else {
        stpf = stpq;
     }
     brackt = true;
  } else if (std::fabs(dp) < std::fabs(dx)) {
    //    std::cout << "dcstep 3 ***************" << std::endl;
     theta = three*(fx - fp)/(stp - stx) + dx + dp;
     s = std::max(std::fabs(theta), std::max(std::fabs(dx),std::fabs(dp)));

     gamma = s*std::sqrt(std::max(zero,std::pow(theta/s, 2)-(dx/s)*(dp/s)));
     //     std::cout << "theta = " << theta << std::endl;
     //     std::cout << "gamma = " << gamma << std::endl;
     if (stp > stx) gamma = -gamma;
     p = (gamma - dp) + theta;
     q = (gamma + (dx - dp)) + gamma;
     r = p/q;
     if (r < zero && gamma != zero) {
        stpc = stp + r*(stx - stp);
     } else if (stp > stx) {
        stpc = stpmax;
     } else {
        stpc = stpmin;
     }
     //     std::cout << "stpc = " << stpc << std::endl;
     
     stpq = stp + (dp/(dp - dx))*(stx - stp);

     //     std::cout << "--------------------------------------------" << std::endl;
     //     std::cout << "stpq = " << stpq << std::endl;
     //     std::cout << "stp  = " << stp << std::endl;
     //     std::cout << "dp   = " << dp << std::endl;
     //     std::cout << "dx   = " << dx << std::endl;
     //     std::cout << "stx  = " << stx << std::endl;
     //     std::cout << "dp/(dp-dx) = " << dp/(dp-dx) << std::endl;
     //     std::cout << "--------------------------------------------" << std::endl;



     if (brackt) {
        if (std::fabs(stpc-stp) < std::fabs(stpq-stp)) {
           stpf = stpc;
        } else {
           stpf = stpq;
        }
        if (stp > stx) {
           stpf = std::min(stp+p66*(sty-stp),stpf);
        } else {
           stpf = std::max(stp+p66*(sty-stp),stpf);
        }
     } else {
        if (std::fabs(stpc-stp) > std::fabs(stpq-stp)) {
           stpf = stpc;
        } else {
           stpf = stpq;
        }
        stpf = std::min(stpmax,stpf);
        stpf = std::max(stpmin,stpf);
     }
  } else { 
    //    std::cout << "dcstep 4" << std::endl;
    if (brackt) {

        theta = three*(fp - fy)/(sty - stp) + dy + dp;
        s = std::max(std::fabs(theta), std::max(std::fabs(dy),std::fabs(dp)));
        gamma = s*std::sqrt(std::pow(theta/s, 2) - (dy/s)*(dp/s));
        if (stp > sty) gamma = -gamma;
        p = (gamma - dp) + theta;
        q = ((gamma - dp) + gamma) + dy;
        r = p/q;
        stpc = stp + r*(sty - stp);
        stpf = stpc;
     } else if (stp > stx) {
        stpf = stpmax;
     } else {
        stpf = stpmin;
     }
  }

  if (fp > fx) {
     sty = stp;
     fy = fp;
     dy = dp;
  } else {
     if (sgnd < zero) {
        sty = stx;
        fy = fx;
        dy = dx;
     }
     stx = stp;
     fx = fp;
     dx = dp;
  }
  stp = stpf;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x78, %rsp
movapd %xmm1, %xmm7
movapd %xmm0, %xmm8
movq 0xb8(%rsp), %r10
movq 0xb0(%rsp), %rax
movsd (%rdx), %xmm10
movapd 0x2ebc0(%rip), %xmm0    # 0x5c3f0
andpd %xmm10, %xmm0
movapd %xmm10, %xmm9
divsd %xmm0, %xmm9
mulsd %xmm1, %xmm9
movsd (%rsi), %xmm1
ucomisd %xmm1, %xmm8
jbe 0x2d8d3
subsd %xmm8, %xmm1
mulsd 0x41860(%rip), %xmm1    # 0x6f0c0
movsd (%rax), %xmm2
subsd (%rdi), %xmm2
divsd %xmm2, %xmm1
addsd %xmm1, %xmm10
addsd %xmm7, %xmm10
movapd 0x2eb72(%rip), %xmm5    # 0x5c3f0
movapd %xmm10, %xmm1
andpd %xmm5, %xmm1
movapd %xmm7, %xmm3
andpd %xmm5, %xmm3
maxsd %xmm0, %xmm3
maxsd %xmm1, %xmm3
movapd %xmm10, %xmm0
divsd %xmm3, %xmm0
mulsd %xmm0, %xmm0
movsd (%rdx), %xmm1
movapd %xmm7, %xmm2
divsd %xmm3, %xmm2
divsd %xmm3, %xmm1
mulsd %xmm2, %xmm1
subsd %xmm1, %xmm0
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jb 0x2d95e
sqrtsd %xmm0, %xmm0
jmp 0x2d9e1
xorpd %xmm4, %xmm4
ucomisd %xmm9, %xmm4
jbe 0x2da9d
subsd %xmm8, %xmm1
mulsd 0x417d1(%rip), %xmm1    # 0x6f0c0
movsd (%rax), %xmm3
subsd (%rdi), %xmm3
divsd %xmm3, %xmm1
addsd %xmm1, %xmm10
addsd %xmm7, %xmm10
movapd 0x2eae3(%rip), %xmm5    # 0x5c3f0
movapd %xmm10, %xmm1
andpd %xmm5, %xmm1
movapd %xmm7, %xmm2
andpd %xmm5, %xmm2
maxsd %xmm0, %xmm2
maxsd %xmm1, %xmm2
movapd %xmm10, %xmm0
divsd %xmm2, %xmm0
mulsd %xmm0, %xmm0
movsd (%rdx), %xmm1
movapd %xmm7, %xmm3
divsd %xmm2, %xmm3
divsd %xmm2, %xmm1
mulsd %xmm3, %xmm1
subsd %xmm1, %xmm0
ucomisd %xmm4, %xmm0
jb 0x2db2b
sqrtsd %xmm0, %xmm0
jmp 0x2dbae
movapd %xmm7, 0x40(%rsp)
movsd %xmm8, 0x8(%rsp)
movq %r8, %r12
movq %r9, %rbp
movq %rcx, %r13
movq %rdi, %r14
movq %rsi, %rbx
movq %rdx, %r15
movapd %xmm9, 0x30(%rsp)
movapd %xmm10, 0x20(%rsp)
movapd %xmm3, 0x10(%rsp)
callq 0x92a0
movapd 0x10(%rsp), %xmm3
movapd 0x2ea4c(%rip), %xmm5    # 0x5c3f0
movapd 0x20(%rsp), %xmm10
movq 0xb8(%rsp), %r10
movapd 0x30(%rsp), %xmm9
movq %r15, %rdx
movq %rbx, %rsi
movq %r14, %rdi
movq 0xb0(%rsp), %rax
movq %r13, %rcx
movq %rbp, %r9
movq %r12, %r8
movsd 0x8(%rsp), %xmm8
movapd 0x40(%rsp), %xmm7
mulsd %xmm3, %xmm0
movsd (%rax), %xmm1
movsd (%rdi), %xmm2
movapd 0x2e9eb(%rip), %xmm3    # 0x5c3e0
xorpd %xmm0, %xmm3
movapd %xmm1, %xmm4
cmpltsd %xmm2, %xmm4
andpd %xmm4, %xmm3
andnpd %xmm0, %xmm4
orpd %xmm3, %xmm4
movsd (%rdx), %xmm0
movapd %xmm4, %xmm3
subsd %xmm0, %xmm3
addsd %xmm3, %xmm10
addsd %xmm4, %xmm3
addsd %xmm7, %xmm3
divsd %xmm3, %xmm10
subsd %xmm2, %xmm1
mulsd %xmm1, %xmm10
addsd %xmm2, %xmm10
movsd (%rsi), %xmm3
subsd %xmm8, %xmm3
divsd %xmm1, %xmm3
addsd %xmm0, %xmm3
divsd %xmm3, %xmm0
movsd 0x2e971(%rip), %xmm3    # 0x5c3c8
mulsd %xmm3, %xmm0
mulsd %xmm1, %xmm0
addsd %xmm2, %xmm0
movapd %xmm10, %xmm1
subsd %xmm2, %xmm1
andpd %xmm5, %xmm1
movapd %xmm0, %xmm4
subsd %xmm2, %xmm4
andpd %xmm5, %xmm4
cmpltsd %xmm4, %xmm1
subsd %xmm10, %xmm0
mulsd %xmm3, %xmm0
addsd %xmm10, %xmm0
andpd %xmm1, %xmm10
andnpd %xmm0, %xmm1
jmp 0x2dc46
movapd 0x2e94b(%rip), %xmm5    # 0x5c3f0
andpd %xmm7, %xmm5
ucomisd %xmm5, %xmm0
jbe 0x2dcaa
subsd %xmm8, %xmm1
mulsd 0x41600(%rip), %xmm1    # 0x6f0c0
movsd (%rax), %xmm4
subsd (%rdi), %xmm4
divsd %xmm4, %xmm1
addsd %xmm1, %xmm10
addsd %xmm7, %xmm10
movapd 0x2e912(%rip), %xmm1    # 0x5c3f0
andpd %xmm10, %xmm1
maxsd %xmm0, %xmm5
maxsd %xmm1, %xmm5
movapd %xmm10, %xmm0
divsd %xmm5, %xmm0
mulsd %xmm0, %xmm0
movsd (%rdx), %xmm1
movapd %xmm7, %xmm4
divsd %xmm5, %xmm4
divsd %xmm5, %xmm1
mulsd %xmm4, %xmm1
subsd %xmm1, %xmm0
xorpd %xmm1, %xmm1
maxsd %xmm1, %xmm0
ucomisd %xmm1, %xmm0
jb 0x2dd32
sqrtsd %xmm0, %xmm0
jmp 0x2ddc3
movapd %xmm7, 0x40(%rsp)
movsd %xmm8, 0x8(%rsp)
movq %r8, %r12
movq %r9, %rbp
movq %rcx, %r13
movq %rdi, %r14
movq %rsi, %rbx
movq %rdx, %r15
movapd %xmm9, 0x30(%rsp)
movapd %xmm10, 0x20(%rsp)
movapd %xmm2, 0x10(%rsp)
callq 0x92a0
movapd 0x10(%rsp), %xmm2
movapd 0x2e87f(%rip), %xmm5    # 0x5c3f0
movapd 0x20(%rsp), %xmm10
movq 0xb8(%rsp), %r10
movapd 0x30(%rsp), %xmm9
movq %r15, %rdx
movq %rbx, %rsi
movq %r14, %rdi
movq 0xb0(%rsp), %rax
movq %r13, %rcx
movq %rbp, %r9
movq %r12, %r8
movsd 0x8(%rsp), %xmm8
movapd 0x40(%rsp), %xmm7
mulsd %xmm2, %xmm0
movsd (%rax), %xmm2
movsd (%rdi), %xmm1
movapd 0x2e81e(%rip), %xmm3    # 0x5c3e0
xorpd %xmm0, %xmm3
movapd %xmm1, %xmm4
cmpltsd %xmm2, %xmm4
andpd %xmm4, %xmm3
andnpd %xmm0, %xmm4
orpd %xmm3, %xmm4
movapd %xmm4, %xmm0
subsd %xmm7, %xmm0
addsd %xmm0, %xmm10
addsd %xmm4, %xmm0
movsd (%rdx), %xmm3
addsd %xmm3, %xmm0
divsd %xmm0, %xmm10
subsd %xmm2, %xmm1
mulsd %xmm1, %xmm10
addsd %xmm2, %xmm10
movapd %xmm7, %xmm0
subsd %xmm3, %xmm0
movapd %xmm7, %xmm3
divsd %xmm0, %xmm3
mulsd %xmm1, %xmm3
addsd %xmm2, %xmm3
movapd %xmm10, %xmm0
subsd %xmm2, %xmm0
andpd %xmm5, %xmm0
movapd %xmm3, %xmm1
subsd %xmm2, %xmm1
andpd %xmm5, %xmm1
cmpltsd %xmm0, %xmm1
andpd %xmm1, %xmm10
andnpd %xmm3, %xmm1
orpd %xmm10, %xmm1
movb $0x1, (%r10)
ucomisd (%rsi), %xmm8
jbe 0x2dc61
movq %rcx, %rdi
movq %r8, %rsi
movq %r9, %rdx
jmp 0x2dc86
xorpd %xmm0, %xmm0
ucomisd %xmm9, %xmm0
jbe 0x2dc86
movsd (%rdi), %xmm0
movsd %xmm0, (%rcx)
movsd (%rsi), %xmm0
movsd %xmm0, (%r8)
movsd (%rdx), %xmm0
movsd %xmm0, (%r9)
movsd (%rax), %xmm0
movsd %xmm0, (%rdi)
movsd %xmm8, (%rsi)
movsd %xmm7, (%rdx)
movsd %xmm1, (%rax)
addq $0x78, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
cmpb $0x1, (%r10)
jne 0x2dee3
movapd %xmm8, %xmm6
subsd (%r8), %xmm6
mulsd 0x413fa(%rip), %xmm6    # 0x6f0c0
movsd (%rcx), %xmm0
subsd (%rax), %xmm0
divsd %xmm0, %xmm6
movsd (%r9), %xmm1
addsd %xmm1, %xmm6
addsd %xmm7, %xmm6
movapd 0x2e709(%rip), %xmm0    # 0x5c3f0
movapd %xmm6, %xmm2
andpd %xmm0, %xmm2
andpd %xmm1, %xmm0
maxsd %xmm0, %xmm5
maxsd %xmm2, %xmm5
movapd %xmm6, %xmm0
divsd %xmm5, %xmm0
mulsd %xmm0, %xmm0
movapd %xmm7, %xmm2
divsd %xmm5, %xmm2
divsd %xmm5, %xmm1
mulsd %xmm2, %xmm1
subsd %xmm1, %xmm0
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jb 0x2df21
sqrtsd %xmm0, %xmm0
jmp 0x2df92
movapd %xmm7, 0x40(%rsp)
movsd %xmm8, 0x8(%rsp)
movq %r8, %r12
movq %r9, %rbp
movq %rcx, %r13
movq %rdi, %r14
movq %rsi, %rbx
movq %rdx, %r15
movapd %xmm9, 0x30(%rsp)
movapd %xmm10, 0x20(%rsp)
movaps %xmm3, 0x60(%rsp)
movaps %xmm2, 0x50(%rsp)
movapd %xmm5, 0x10(%rsp)
callq 0x92a0
movapd 0x10(%rsp), %xmm5
movapd 0x50(%rsp), %xmm2
movapd 0x60(%rsp), %xmm3
movapd 0x20(%rsp), %xmm10
movq 0xb8(%rsp), %r10
movapd 0x30(%rsp), %xmm9
movq %r15, %rdx
movq %rbx, %rsi
movq %r14, %rdi
movq 0xb0(%rsp), %rax
movq %r13, %rcx
movq %rbp, %r9
movq %r12, %r8
movsd 0x8(%rsp), %xmm8
movapd 0x40(%rsp), %xmm7
mulsd %xmm5, %xmm0
movsd (%rax), %xmm12
movsd (%rdi), %xmm4
movapd 0x2e608(%rip), %xmm5    # 0x5c3e0
xorpd %xmm0, %xmm5
movapd %xmm4, %xmm11
cmpltsd %xmm12, %xmm11
movsd (%rdx), %xmm1
ucomisd %xmm5, %xmm0
jne 0x2ddf3
jnp 0x2de48
andpd %xmm11, %xmm5
movapd %xmm11, %xmm6
andnpd %xmm0, %xmm6
orpd %xmm5, %xmm6
movapd %xmm1, %xmm0
subsd %xmm7, %xmm0
addsd %xmm6, %xmm0
addsd %xmm6, %xmm0
subsd %xmm7, %xmm6
addsd %xmm6, %xmm10
divsd %xmm0, %xmm10
xorpd %xmm0, %xmm0
ucomisd %xmm10, %xmm0
jbe 0x2de48
movapd %xmm4, %xmm0
subsd %xmm12, %xmm0
mulsd %xmm0, %xmm10
addsd %xmm12, %xmm10
movapd %xmm10, %xmm11
jmp 0x2de5b
movapd %xmm11, %xmm0
andpd %xmm3, %xmm0
andnpd %xmm2, %xmm11
orpd %xmm0, %xmm11
movapd %xmm7, %xmm0
subsd %xmm1, %xmm0
movapd %xmm7, %xmm1
divsd %xmm0, %xmm1
movapd %xmm4, %xmm0
subsd %xmm12, %xmm0
mulsd %xmm1, %xmm0
addsd %xmm12, %xmm0
movapd %xmm11, %xmm1
subsd %xmm12, %xmm1
movapd 0x2e561(%rip), %xmm6    # 0x5c3f0
andpd %xmm6, %xmm1
movapd %xmm0, %xmm5
subsd %xmm12, %xmm5
andpd %xmm6, %xmm5
cmpb $0x1, (%r10)
jne 0x2defd
ucomisd %xmm4, %xmm12
cmpltsd %xmm5, %xmm1
andpd %xmm1, %xmm11
andnpd %xmm0, %xmm1
orpd %xmm11, %xmm1
movsd (%rcx), %xmm0
subsd %xmm12, %xmm0
mulsd 0x411f9(%rip), %xmm0    # 0x6f0c8
addsd %xmm12, %xmm0
jbe 0x2dfe9
minsd %xmm0, %xmm1
jmp 0x2dc4f
movsd (%rdi), %xmm1
cmpltsd (%rax), %xmm1
andpd %xmm1, %xmm3
andnpd %xmm2, %xmm1
orpd %xmm3, %xmm1
jmp 0x2dc4f
cmpltsd %xmm1, %xmm5
andpd %xmm5, %xmm11
andnpd %xmm0, %xmm5
orpd %xmm11, %xmm5
minsd %xmm3, %xmm5
maxsd %xmm2, %xmm5
movapd %xmm5, %xmm1
jmp 0x2dc4f
movapd %xmm7, 0x40(%rsp)
movsd %xmm8, 0x8(%rsp)
movq %r8, %r12
movq %r9, %rbp
movq %rcx, %r13
movq %rdi, %r14
movq %rsi, %rbx
movq %rdx, %r15
movapd %xmm9, 0x30(%rsp)
movapd %xmm5, 0x10(%rsp)
movapd %xmm6, 0x20(%rsp)
callq 0x92a0
movapd 0x20(%rsp), %xmm6
movapd 0x10(%rsp), %xmm5
movapd 0x30(%rsp), %xmm9
movq %r15, %rdx
movq %rbx, %rsi
movq %r14, %rdi
movq 0xb0(%rsp), %rax
movq %r13, %rcx
movq %rbp, %r9
movq %r12, %r8
movsd 0x8(%rsp), %xmm8
movapd 0x40(%rsp), %xmm7
mulsd %xmm5, %xmm0
movsd (%rax), %xmm2
movsd (%rcx), %xmm1
movapd 0x2e43a(%rip), %xmm3    # 0x5c3e0
xorpd %xmm0, %xmm3
movapd %xmm1, %xmm4
cmpltsd %xmm2, %xmm4
andpd %xmm4, %xmm3
andnpd %xmm0, %xmm4
orpd %xmm3, %xmm4
movapd %xmm4, %xmm0
subsd %xmm7, %xmm0
addsd %xmm0, %xmm6
addsd %xmm4, %xmm0
addsd (%r9), %xmm0
divsd %xmm0, %xmm6
subsd %xmm2, %xmm1
mulsd %xmm6, %xmm1
addsd %xmm2, %xmm1
jmp 0x2dc4f
maxsd %xmm0, %xmm1
jmp 0x2dc4f