B ÔÂ_ÆKã @s\dZy4ddlZddlZddlmZddlZddlm Z Wne k rPdZYnXy0ddl Z ddl mZddlmZddlmZWne eefk r dZYnXddlmZdd „Zd d „Zd d „Zd(dd„Zd)dd„Zd*dd„Zd+dd„Zdd„Zddgdddddfdd„Z dd„Z!dd„Z"dd„Z#d d!„Z$dd"d#gdfd$d%„Z%dd"d#gdfd&d'„Z&dS),TéN)Ústats)ÚgriddataF)ÚLine2D)Úcheck_min_versionc Csr| ¡}| ¡d}| ¡d}| ¡d}tt ||¡ƒ}tt ||||¡ƒ}||}||} || ||ffS)Néré)Zget_subplotspecZ get_geometryÚintÚnpÚmod) ÚaxÚcolumnsZspsZnxÚnyÚcellÚxlocÚylocÚxvarÚyvar©rúB/tmp/pip-unpacked-wheel-d4p3hk07/pyomo/contrib/parmest/graphics.pyÚ_get_variables%s   rcCs¤t t|ƒtt|ƒt|ƒƒdt|ƒtt|ƒt|ƒƒd|¡}t t|ƒtt|ƒt|ƒƒdt|ƒtt|ƒt|ƒƒd|¡}t ||¡\}}||fS)Nr)r ZlinspaceÚminÚabsÚmaxZmeshgrid)ÚxÚyÚncellsZxlinZylinÚXÚYrrrÚ _get_XYgrid4sFFrcCs>i}x8|D]0}|||gkr,|| ¡||<q ||g||<q Wtjttj| ¡Žƒ| ¡d}x†||jD]x}||  ¡||  ¡} | dkrj|  ¡} | dkr¼| |||  ¡d| |<n| |||  ¡| |<|j | dd}qjWt t ||¡t |dg¡t ||¡ddd |d<||} ||} |d} | | | fS) N)r g:Œ0âŽyE>ré T)Ú ignore_indexÚobjZlinear)ÚmethodZrescale)ÚuniqueÚpdÚ DataFrameÚlistÚ itertoolsÚproductÚvaluesÚkeysr ÚstdÚmeanÚcopyÚappendrr Úarray)rrr ÚdataÚ theta_starZ search_rangesÚvarÚ data_sliceÚcolZcvÚtemprrÚZrrrÚ_get_data_slice<s0     r7c Cs6t ¡}t||ƒ\}}} |j|||||dddS)Né#)ÚcÚs)ÚpltÚgcarÚscatter) rrÚcolorr r1Úlabelr rrÚlocrrrÚ _add_scattercsrAcCsœt ¡}t||ƒ\}} } ||} || } ||} || }|j| | g| | g|d|j| | g| |g|d|j| | g||g|d|j| | g|| g|ddS)N)r>)r;r<rZplot)rrr>r Ú lower_boundÚ upper_boundr?r rrr@ZxminZyminZxmaxZymaxrrrÚ_add_rectangle_CIjsrDc Csjt ¡} t| |ƒ\} } } t|||ƒ\} }g}t|tjjƒr®xb|jD]X}|| krZ|  | ¡qB|| krn|  |¡qB|| | gkrB|  t   ||g|g|¡¡qBWt   t |ƒ¡}nŠt|tjjƒr4xh|jD]^}|| krâ|  |  ¡¡qÆ|| krú|  | ¡¡qÆ|| | gkrÆ|  t   ||g||¡¡qÆWt   |¡}ndS| |¡}| ||f¡}| j| |||g|ddS)N)ÚlevelsÚcolors)r;r<rrÚ isinstancerZ _multivariateZmultivariate_normal_frozenÚindexr.r r/ZdstackÚtupleÚkdeÚ gaussian_kdeZravelÚpdfZreshapeZcontour)rrr>r rÚalphaÚdistr1r?r rrr@rrr3r2r6rrrÚ_add_scipy_dist_CIys4    $  "  rOcCszt ¡}t||ƒ\}} } yBt|| |||ƒ\} } } t | | ¡}tj d¡}tj|| |dWnt d|| dƒYnXdS)NZGreys)ÚcmapzObjective contour plot forz slice failed) r;r<rr7ÚtriZ TriangulationÚcmZget_cmapZ tricontourfÚprint)rrr>r r0r1r?r rrr@rrr6ZtriangrPrrrÚ_add_obj_contours  rTc Csö|dk r|j|dd}|dkr”i}xp|jD]f}t || ¡|| ¡¡}|dkrd|| ¡d}|| ¡|d|| ¡|dg||<q*Wx\|j ¡D]N}t||jƒ\}}\} } | | krà|  ||¡|  ||¡q |  ||¡q WdS)NT)r g»½×Ùß|Û=ré) r.r r rrrÚfigZget_axesrZset_ylimZset_xlim) ÚgÚ axis_limitsZ theta_valsr1r4Z theta_ranger rrrrrrrÚ_set_axis_limits«s  rYc ! CsZt|tjƒst‚t|tdƒttjtjfƒs.t‚t|tdƒttfƒsFt‚t|t ƒsTt‚t |ƒ  t dddgƒ¡spt‚t|tdƒtfƒs†t‚t|tdƒt fƒsœt‚t|t ƒsªt‚t|tdƒt fƒsÀt‚t|ƒdkrÐdSt|tƒrät |¡}t|tjƒr|jddd…f}dd„|jDƒ} ||jkrFt|ƒdkrF|j||d k| f} n|| } |dk r`|| }g} t | ¡} ttd ƒrˆ|  tj¡n| jtjd d d d d |jkrÀ|rÀ| jt| ||d| jtjdd|  tdgdgdddddd¡|dk r,| jtd| |d|  tdgdgdddddd¡dddg} |dk r¼t|ƒdkr¼|dkrhtdƒ|  ¡}d}d}xHt |ƒD]:\}}|dkrØt!| |ƒ\}}| jt"| || ||d|  tdgdg| |d |d!¡nÞ|dkrFt#| ƒ}| $| ¡}t% &|d |d"¡}| jt'| || d"|||d#|  tdgdg| |d |d!¡np|dkr|t(| ƒ}| $|  )¡¡}t% &|d |d"¡}| jt'| || d"|||d#|  tdgdg| |d |d!¡q|Wt*| || |ƒxd| j+ ,¡D]V}|j-d$d%d&d'|rÖt.|| ƒ\}}}|t| ƒd dfkrÖ|j/| d(d)d*id+qÖW|rP| j0j1d,d-| j0 2|¡d }|r0xÈ| j+ ,¡D]º}t.|| ƒ\}}\}}||krf| 3¡| 4|¡| 5|¡t 6¡}||_6|j+ |¡| 7|¡t 8¡\}}| 9¡} | :| ¡| 3¡t ;|¡|j|¡t ;¡dS)/a½ Plot pairwise relationship for theta values, and optionally alpha-level confidence intervals and objective value contours Parameters ---------- theta_values: DataFrame, columns = variable names and (optionally) 'obj' and alpha values Theta values and (optionally) an objective value and results from leaveNout_bootstrap_test, likelihood_ratio_test, or confidence_region_test theta_star: dict or Series, keys = variable names, optional Theta* (or other individual values of theta, also used to slice higher dimensional contour intervals in 2D) alpha: float, optional Confidence interval value, if an alpha value is given and the distributions list is empty, the data will be filtered by True/False values using the column name whose value equals alpha (see results from leaveNout_bootstrap_test, likelihood_ratio_test, or confidence_region_test) distributions: list of strings, optional Statistical distribution used to define a confidence region, options = 'MVN' for multivariate_normal, 'KDE' for gaussian_kde, and 'Rect' for rectangular. Confidence interval is a 2D slice, using linear interpolation at theta*. axis_limits: dict, optional Axis limits in the format {variable: [min, max]} title: string, optional Plot title add_obj_contour: bool, optional Add a contour plot using the column 'obj' in theta_values. Contour plot is a 2D slice, using linear interpolation at theta*. add_legend: bool, optional Add a legend to the plot filename: string, optional Filename used to save the figure NZMVNZKDEZRectrz Empty datacSs,g|]$}|dkrt|tƒst|tƒs|‘qS))r!)rGÚfloatr)Ú.0r4rrrú ùs z!pairwise_plot..Tz0.11F)rJÚhistZ norm_histr!)r r0r1r)r:ÚoÚwÚthetasZ cadetblueé)Úmarkerr>r?ZmarkerfacecolorZ markersizeÚk)r>r r1ztheta*éÚrZ mediumblueZdarkgrayzptheta_star is not defined, confidence region slice will be plotted at the mean value of theta)r>r rBrCr)r>Zlwr?éd)r>r rrMrNr1Zsci)éþÿÿÿrZboth)ÚstyleZ scilimitsZaxisÚbestÚsizeé)Zhandlesr@ÚpropgÍÌÌÌÌÌì?)Útop)Úreset)?rGr$r%ÚAssertionErrorÚtypeÚdictZSeriesrrZr&ÚsetÚissubsetÚstrÚboolÚlenr@r ÚsnsZPairGridrZmap_diagZhistplotZdistplotZ map_offdiagrTr;r=r.rrArSr,Ú enumerateÚ fit_rect_distrDÚ fit_mvn_distrLrZscoreatpercentilerOÚ fit_kde_distÚ transposerYZaxesÚflattenZticklabel_formatrÚlegendrVZsubplots_adjustZsuptitleÚremoveÚ set_xlabelÚ set_ylabelÚfigureZadd_axesZsubplotsÚ get_positionZ set_positionÚcloseZ tick_paramsÚshowÚsavefig)!Ú theta_valuesr1rMÚ distributionsrXÚtitleZadd_obj_contourZ add_legendÚfilenameZ theta_namesr`Zlegend_elementsrWrFZmvn_distZkde_distÚirNZlbZubr6Zscorer rrr@Zlower_triangle_onlyrrrVÚfÚdummyZbboxrrrÚ pairwise_plotÁsÊ'              "  " &              rŽcCstt|tjƒst‚t|ttfƒs"t‚tj dd|dt |ƒd¡}|  ¡}|  ¡}|||}|||}||fS)aR Fit an alpha-level rectangular distribution to theta values Parameters ---------- theta_values: DataFrame, columns = variable names Theta values alpha: float, optional Confidence interval value Returns --------- tuple containing lower bound and upper bound for each variable rr) rGr$r%rorrZrÚtZppfrvr,r+)r‡rMZtvalÚmr:rBrCrrrryys"  rycCs,t|tjƒst‚tj| ¡| ¡dd}|S)zþ Fit a multivariate normal distribution to theta values Parameters ---------- theta_values: DataFrame, columns = variable names Theta values Returns --------- scipy.stats.multivariate_normal distribution T)Zallow_singular)rGr$r%rorZmultivariate_normalr,Zcov)r‡rNrrrrz“s  rzcCs$t|tjƒst‚t | ¡j¡}|S)zû Fit a Gaussian kernel-density distribution to theta values Parameters ---------- theta_values: DataFrame, columns = variable names Theta values Returns --------- scipy.stats.gaussian_kde distribution )rGr$r%rorrKr|r))r‡rNrrrr{¦s r{cCs||r,| ¡}| ¡}|||}|||}t |d||d|i¡}|jddd|jddidd|jd|jdd }|S) NrrT)ÚlevelÚinplaceZlevel_0rr)r r’r )Zid_varsZ value_varsÚvar_name)Zmedianr+r$ÚconcatZ reset_indexÚrenameZmeltr )Údata1Údata2Ú normalizeÚ group_namesZ data_medianZdata_stdr0rrrÚ_get_grouped_data¹s   ršr–r—cCsÔt|tjƒst‚t|tjƒs t‚t|tƒs.t‚t|tƒs sH      '   $ 7 )