B @`L@sddlZddlZddlmZmZmZeeZe dZ GdddeZ ddZ dd Z d d Zd d ZddZddZddZddZddZddZddZddZddZd d!Zd"d#Zd$d%Zd&d'ZdS)(N)DeveloperErrorInfeasibleConstraintExceptionPyomoExceptioninfc@s eZdZdS)IntervalExceptionN)__name__ __module__ __qualname__r r ?/tmp/pip-unpacked-wheel-bi3529v6/pyomo/contrib/fbbt/interval.pyrsrcCs||||fS)Nr )xlxuylyur r r addsrcCs||||fS)Nr )r r rrr r r subsrcCsbt||||||||}t||||||||}t|rLt }t|rZt}||fS)N)minmaxmathisnanr)r r rrlbubr r r muls  rcCs6||kr|| krt }t}nd|}d|}||fS)Ng?)r)r r feasibility_tolrrr r r inv)s rcCsB||kr|| krt }t}nt||ft|||\}}||fS)N)rrr)r r rrrrrr r r div4s rcCsv|dkr|dkr>|dkr>t||||}t||||}nb|dkrlt||||}t||||}n4|dkrt||||}t||||}ntn|dkr|dkrt||||}t||||}n t }t}n||kr|t|kr|}|dkr|dkrp|ddkrH||}|dkr>t}n||}n&|dkr^t }t}n||}||}n0|ddkr||}||}n||}||}nr|dkr|ddkrt||||}t}n t }t}n6|ddkrd}t||||}n||}||}nX||krd|dkrLd|}|d||7}t|d}t||||\}}n t }t}||fS)z! Compute bounds on x**y. rz4Cannot raise a negative number to the power of {0}. z?The upper bound of a variable raised to the power of {0} is {1})rrrrroundformatrpower)r r rrrrymsgr r r r>sr               rc Cst||\}}t|||||\}}t||\}}||kr|t|kr|} | dkrbt }t}n| ddkrd||dkrtd| | dkr|dkrd} d} nF|dkr| } |} n2|| |kr| } n|} |||kr| } n|} | }| }nn|dkrtd| nL|dkr$t } t} n6|| |kr<| } n|} |||krV| } n|} | }| }n| dkrt|d| }t ||}t|d| }t ||}nj|dkrn^|dkr|dkrt }nt|d|  }|dkrt }nt|d|  }n t }t}||fS)z z = x**y => compute bounds on x. First, start by computing bounds on x with x = exp(ln(z) / y) However, if y is an integer, then x can be negative, so there are several special cases. See the docs below. rrz:Infeasible. Anything to the power of {0} must be positive.g?) logrexprrrrabsrcopysign) zlzurrZorig_xlZorig_xurr r r Z_xlZ_xur r r _inverse_power1sp           r(c Csp|dkrtd|dkr |dks0|dkr8|dkr8tdt||\}}t||\}}t|||||\} } | | fS)z z = x**y => compute bounds on y y = ln(z) / ln(x) This function assumes the exponent can be fractional, so x must be positive. This method should not be called if the exponent is an integer. rz7Cannot raise a negative variable to a fractional power.zEA positive variable raised to the power of anything must be positive.)rrr"r) r&r'r r Zfeasiblity_tolZlbaZubaZlbbZubbrrr r r _inverse_power2s r)cCs\yt|}Wntk r(tj}YnXyt|}Wntk rRtj}YnX||fS)N)rr# OverflowErrorr)r r rrr r r r#s  r#cCs<|dkrt|}nt }|dkr.t|}nt }||fS)Nr)rr"r)r r rrr r r r""s  r"cCs<|dkrt|}nt }|dkr.t|}nt }||fS)Nr)rlog10r)r r rrr r r r+.s  r+cCs|t ks|tkrdStj}||dd|}t|}d|||d}||kr\d}ntt|t|}||dd|}t|}d|||d}||krd}ntt|t|}||fS)zu Parameters ---------- xl: float xu: float Returns ------- lb: float ub: float )rr,r-)rrpiceilrsinfloorr)r r r.ix_at_minrx_at_maxrr r r r0:s   r0cCs|t ks|tkrdStj}||d|}t|}d|||}||krTd}ntt|t|}|d|}t|}d||}||krd}ntt|t|}||fS)zu Parameters ---------- xl: float xu: float Returns ------- lb: float ub: float )r,r-rr,r-)rrr.r/rcosr1r)r r r.r2r3rr4rr r r r5cs     r5cCs||t ks|tkrt tfStj}||d|}t|}|||d}||kr`t }t}nt|}t|}||fS)zu Parameters ---------- xl: float xu: float Returns ------- lb: float ub: float r)rrr.r/tan)r r r.r2Zx_at_undefinedrrr r r r6s    r6cCs|dkr d}|dkrd}tj}|t kr0|}nR|t|krJ|krVnn|}n,t||kr||dd|}t|}t|} d|||d}d|| |d} t|} | | d} || } | | } | ||kr| }n| }n||dd|}t|}t|} d|||d}d|| |d} t|} |d| } || } | | } | ||kr~| }n| }|tkr|}nZ|t|kr|krnn|}n0t||kr^||dd|}t|}t|} d|||d}d|| |d} t|} |d| } || }| | }|||krX|}n|}n||dd|}t|}t|} d|||d}d|| |d} t|} | | d} || }| | }|||kr|}n|}||fS)z y = asin(x); propagate bounds from x to y x = sin(y) Parameters ---------- xl: float xu: float yl: float yu: float Returns ------- lb: float ub: float r,r-r)rr.rr0r1r/asin)r r rrrr.rr2i1i2y_tmpdistlb1lb2rub1ub2r r r r7s           "       r7cCs|dkr d}|dkrd}tj}|t kr0|}n|t|krJ|krTnn|}nt||kr||d|}t|}t|} d|||}d|| |} t|} || } || } | | } | ||kr| }n| }nn|d|}t|}t|} d||}d|| } t|} | } || } | | } | ||krJ| }n| }|tkr`|}n&|t|kr~|krnn|}nt||kr|d|}t|}t|} d||}d|| } t|} | } || }| | }|||kr|}n|}n~||d|}t|}t|} d|||}d|| |} t|} || } || }| | }|||kr|}n|}||fS)z y = acos(x); propagate bounds from x to y x = cos(y) Parameters ---------- xl: float xu: float yl: float yu: float Returns ------- lb: float ub: float r,r-r)rr.rr5r1r/acos)r r rrrr.rr2r8r9r:r;r<r=rr>r?r r r r@s             "         r@c Cstj}|t ks|t kr |}nJ||d|}t|}|||d}t|}|| d}||}|tksz|tkr|} nH||d|}t|}|||d}t|}|d|}||} ||kr|}|| kr|} || fS)z y = atan(x); propagate bounds from x to y x = tan(y) Parameters ---------- xl: float xu: float yl: float yu: float Returns ------- lb: float ub: float r)rr.rr1atanr/) r r rrr.rr2r:r;rr r r rAs,     rA)rloggingZpyomo.common.errorsrrr getLoggerrloggerfloatrrrrrrrrr(r)r#r"r+r0r5r6r7r@rAr r r r  s,    Ym   ))"op