blob: 1c163aa8e2ef243324d5e1ed92a0527cc4cb924e [file] [log] [blame]
<!-- HTML header for doxygen 1.8.4-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.13"/>
<meta name="keywords" content="madlib,postgres,greenplum,machine learning,data mining,deep learning,ensemble methods,data science,market basket analysis,affinity analysis,pca,lda,regression,elastic net,huber white,proportional hazards,k-means,latent dirichlet allocation,bayes,support vector machines,svm"/>
<title>MADlib: Summary</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
$(document).ready(initResizable);
</script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
$(document).ready(function() { init_search(); });
</script>
<script type="text/x-mathjax-config">
MathJax.Hub.Config({
extensions: ["tex2jax.js", "TeX/AMSmath.js", "TeX/AMSsymbols.js"],
jax: ["input/TeX","output/HTML-CSS"],
});
</script><script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
<!-- hack in the navigation tree -->
<script type="text/javascript" src="eigen_navtree_hacks.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="madlib_extra.css" rel="stylesheet" type="text/css"/>
<!-- google analytics -->
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-45382226-1', 'madlib.apache.org');
ga('send', 'pageview');
</script>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectlogo"><a href="http://madlib.apache.org"><img alt="Logo" src="madlib.png" height="50" style="padding-left:0.5em;" border="0"/ ></a></td>
<td style="padding-left: 0.5em;">
<div id="projectname">
<span id="projectnumber">1.17.0</span>
</div>
<div id="projectbrief">User Documentation for Apache MADlib</div>
</td>
<td> <div id="MSearchBox" class="MSearchBoxInactive">
<span class="left">
<img id="MSearchSelect" src="search/mag_sel.png"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
alt=""/>
<input type="text" id="MSearchField" value="Search" accesskey="S"
onfocus="searchBox.OnSearchFieldFocus(true)"
onblur="searchBox.OnSearchFieldFocus(false)"
onkeyup="searchBox.OnSearchFieldChange(event)"/>
</span><span class="right">
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
</span>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('group__grp__summary.html','');});
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="header">
<div class="headertitle">
<div class="title">Summary<div class="ingroups"><a class="el" href="group__grp__stats.html">Statistics</a> &raquo; <a class="el" href="group__grp__desc__stats.html">Descriptive Statistics</a></div></div> </div>
</div><!--header-->
<div class="contents">
<div class="toc"><b>Contents</b> <ul>
<li>
<a href="#usage">Summary Function Syntax</a> </li>
<li>
<a href="#examples">Examples</a> </li>
<li>
<a href="#notes">Notes</a> </li>
<li>
<a href="#related">Related Topics</a> </li>
</ul>
</div><p>The MADlib <b><a class="el" href="summary_8sql__in.html#a4be51e88a1df45191a1692b95429af36">summary()</a></b> function produces summary statistics for any data table. The function invokes various methods from the MADlib library to provide the data overview.</p>
<p><a class="anchor" id="usage"></a></p><dl class="section user"><dt>Summary Function Syntax</dt><dd>The <b><a class="el" href="summary_8sql__in.html#a4be51e88a1df45191a1692b95429af36">summary()</a></b> function has the following syntax:</dd></dl>
<pre class="syntax">
summary ( source_table,
output_table,
target_cols,
grouping_cols,
get_distinct,
get_quartiles,
ntile_array,
how_many_mfv,
get_estimates,
n_cols_per_run
)
</pre><p> The <b><a class="el" href="summary_8sql__in.html#a4be51e88a1df45191a1692b95429af36">summary()</a></b> function returns a composite type containing three fields: </p><table class="output">
<tr>
<th>output_table </th><td>TEXT. The name of the output table. </td></tr>
<tr>
<th>num_col_summarized </th><td>INTEGER. The number of columns from the source table that have been summarized. </td></tr>
<tr>
<th>duration </th><td>FLOAT8. The time taken (in seconds) to compute the summary. </td></tr>
</table>
<p><b>Arguments</b> </p><dl class="arglist">
<dt>source_table </dt>
<dd><p class="startdd">TEXT. Name of the table containing the input data.</p>
<p class="enddd"></p>
</dd>
<dt>output_table </dt>
<dd><p class="startdd">TEXT. Name of the table for the output summary statistics. This table contains the following columns: </p><table class="output">
<tr>
<th>group_by </th><td>Group-by column name. NULL if none provided. </td></tr>
<tr>
<th>group_by_value </th><td>Value of the group-by column. NULL if there is no grouping. </td></tr>
<tr>
<th>target_column </th><td>Targeted column values for which summary is requested. </td></tr>
<tr>
<th>column_number </th><td>Physical column number for the target column, as described in <em>pg_attribute</em> catalog. </td></tr>
<tr>
<th>data_type </th><td>Data type of the target column. Standard GPDB type descriptors are displayed. </td></tr>
<tr>
<th>row_count </th><td>Number of rows for the target column. </td></tr>
<tr>
<th>distinct_values </th><td>Number of distinct values in the target column. If the <a class="el" href="summary_8sql__in.html#a4be51e88a1df45191a1692b95429af36">summary()</a> function is called with the <em>get_estimates</em> argument set to TRUE (default), then this is an estimated statistic based on the Flajolet-Martin distinct count estimator. If the <em>get_estimates</em> argument set to FALSE, will use PostgreSQL COUNT DISTINCT. </td></tr>
<tr>
<th>missing_values </th><td>Number of missing values in the target column. </td></tr>
<tr>
<th>blank_values </th><td>Number of blank values. Blanks are defined by this regular expression:<pre class="fragment">'^\w*$'</pre> </td></tr>
<tr>
<th>fraction_missing </th><td>Percentage of total rows that are missing, as a decimal value, e.g. 0.3. </td></tr>
<tr>
<th>fraction_blank </th><td>Percentage of total rows that are blank, as a decimal value, e.g. 0.3. </td></tr>
<tr>
<th>positive_values </th><td>Number of positive values in the target column if target is numeric, otherwise NULL. </td></tr>
<tr>
<th>negative_values </th><td>Number of negative values in the target column if target is numeric, otherwise NULL. </td></tr>
<tr>
<th>zero_values </th><td>Number of zero values in the target column if target is numeric, otherwise NULL. Note that we are reporting exact equality to 0.0 here, so even if you have a float value that is extremely small (say due to rounding), it will not be reported as a zero value. </td></tr>
<tr>
<th>mean </th><td>Mean value of target column if target is numeric, otherwise NULL. </td></tr>
<tr>
<th>variance </th><td>Variance of target column if target is numeric, otherwise NULL. </td></tr>
<tr>
<th>confidence_interval </th><td>Confidence interval (95% using z-score) of the mean value for the target column if target is numeric, otherwise NULL. Presented as an array of two elements in the form {lower bound, upper bound}. </td></tr>
<tr>
<th>min </th><td>Minimum value of target column. For strings this is the length of the shortest string. </td></tr>
<tr>
<th>max </th><td>Maximum value of target column. For strings this is the length of the longest string. </td></tr>
<tr>
<th>first_quartile </th><td>First quartile (25th percentile), only for numeric columns. (Unavailable for PostgreSQL 9.3 or lower.) </td></tr>
<tr>
<th>median </th><td>Median value of target column, if target is numeric, otherwise NULL. (Unavailable for PostgreSQL 9.3 or lower.) </td></tr>
<tr>
<th>third_quartile </th><td>Third quartile (25th percentile), only for numeric columns. (Unavailable for PostgreSQL 9.3 or lower.) </td></tr>
<tr>
<th>quantile_array </th><td>Percentile values corresponding to <em>ntile_array</em>. (Unavailable for PostgreSQL 9.3 or lower.) </td></tr>
<tr>
<th>most_frequent_values </th><td>An array containing the most frequently occurring values. The <em>how_many_mfv</em> argument determines the length of the array, which is 10 by default. If the <a class="el" href="summary_8sql__in.html#a4be51e88a1df45191a1692b95429af36">summary()</a> function is called with the <em>get_estimates</em> argument set to TRUE (default), the frequent values computation is performed using a parallel aggregation method that is faster, but in some cases may fail to detect the exact most frequent values. </td></tr>
<tr>
<th>mfv_frequencies </th><td>Array containing the frequency count for each of the most frequent values. </td></tr>
</table>
<p class="enddd"></p>
</dd>
<dt>target_columns (optional) </dt>
<dd><p class="startdd">TEXT, default NULL. A comma-separated list of columns to summarize. If NULL, summaries are produced for all columns.</p>
<p class="enddd"></p>
</dd>
<dt>grouping_cols (optional) </dt>
<dd>TEXT, default: null. A comma-separated list of columns on which to group results. If NULL, summaries are produced for the complete table. <dl class="section note"><dt>Note</dt><dd>Please note that summary statistics are calculated for each grouping column independently. That is, grouping columns are not combined together as in the regular PostgreSQL style GROUP BY directive. (This was done to reduce long run time and huge output table size which would otherwise result in the case of large input tables with a lot of grouping_cols and target_cols specified.)</dd></dl>
</dd>
<dt>get_distinct (optional) </dt>
<dd><p class="startdd">BOOLEAN, default TRUE. If true, distinct values are counted. The method for computing distinct values depends on the setting of the 'get_estimates' parameter below.</p>
<p class="enddd"></p>
</dd>
<dt>get_quartiles (optional) </dt>
<dd><p class="startdd">BOOLEAN, default TRUE. If TRUE, quartiles are computed.</p>
<p class="enddd"></p>
</dd>
<dt>ntile_array (optional) </dt>
<dd>FLOAT8[], default NULL. An array of quantile values to compute. If NULL, quantile values are not computed. <dl class="section note"><dt>Note</dt><dd>Quartile and quantile functions are not available in PostgreSQL 9.3 or lower. If you are using PostgreSQL 9.3 or lower, the output table will not contain these values, even if you set 'get_quartiles' = TRUE or provide an array of quantile values for the parameter 'ntile_array'.</dd></dl>
</dd>
<dt>how_many_mfv (optional) </dt>
<dd><p class="startdd">INTEGER, default: 10. The number of most-frequent-values to compute. The method for computing MFV depends on the setting of the 'get_estimates' parameter below.</p>
<p class="enddd"></p>
</dd>
<dt>get_estimates (optional) </dt>
<dd><p class="startdd">BOOLEAN, default TRUE. If TRUE, estimated values are produced for distinct values and most frequent values. If FALSE, exact values are calculated which will take longer to run, with the impact depending on data size.</p>
<p class="enddd"></p>
</dd>
<dt>n_cols_per_run (optional) </dt>
<dd>INTEGER, default: 15. The number of columns to collect summary statistics in one pass of the data. This parameter determines the number of passes through the data. For e.g., with a total of 40 columns to summarize and 'n_cols_per_run = 15', there will be 3 passes through the data, with each pass summarizing a maximum of 15 columns. <dl class="section note"><dt>Note</dt><dd>This parameter should be used with caution. Increasing this parameter could decrease the total run time (if number of passes decreases), but will increase the memory consumption during each run. Since PostgreSQL limits the memory available for a single aggregate run, this increased memory consumption could result in an out-of-memory termination error.</dd></dl>
</dd>
</dl>
<p><a class="anchor" id="examples"></a></p><dl class="section user"><dt>Examples</dt><dd></dd></dl>
<ol type="1">
<li>View online help for the <a class="el" href="summary_8sql__in.html#a4be51e88a1df45191a1692b95429af36">summary()</a> function. <pre class="example">
SELECT * FROM madlib.summary();
</pre></li>
<li>Create an input data table using part of the well known iris data set. <pre class="example">
DROP TABLE IF EXISTS iris;
CREATE TABLE iris (id INT, sepal_length FLOAT, sepal_width FLOAT,
petal_length FLOAT, petal_width FLOAT,
class_name text);
INSERT INTO iris VALUES
(1,5.1,3.5,1.4,0.2,'Iris-setosa'),
(2,4.9,3.0,1.4,0.2,'Iris-setosa'),
(3,4.7,3.2,1.3,0.2,'Iris-setosa'),
(4,4.6,3.1,1.5,0.2,'Iris-setosa'),
(5,5.0,3.6,1.4,0.2,'Iris-setosa'),
(6,5.4,3.9,1.7,0.4,'Iris-setosa'),
(7,4.6,3.4,1.4,0.3,'Iris-setosa'),
(8,5.0,3.4,1.5,0.2,'Iris-setosa'),
(9,4.4,2.9,1.4,0.2,'Iris-setosa'),
(10,4.9,3.1,1.5,0.1,'Iris-setosa'),
(11,7.0,3.2,4.7,1.4,'Iris-versicolor'),
(12,6.4,3.2,4.5,1.5,'Iris-versicolor'),
(13,6.9,3.1,4.9,1.5,'Iris-versicolor'),
(14,5.5,2.3,4.0,1.3,'Iris-versicolor'),
(15,6.5,2.8,4.6,1.5,'Iris-versicolor'),
(16,5.7,2.8,4.5,1.3,'Iris-versicolor'),
(17,6.3,3.3,4.7,1.6,'Iris-versicolor'),
(18,4.9,2.4,3.3,1.0,'Iris-versicolor'),
(19,6.6,2.9,4.6,1.3,'Iris-versicolor'),
(20,5.2,2.7,3.9,1.4,'Iris-versicolor'),
(21,6.3,3.3,6.0,2.5,'Iris-virginica'),
(22,5.8,2.7,5.1,1.9,'Iris-virginica'),
(23,7.1,3.0,5.9,2.1,'Iris-virginica'),
(24,6.3,2.9,5.6,1.8,'Iris-virginica'),
(25,6.5,3.0,5.8,2.2,'Iris-virginica'),
(26,7.6,3.0,6.6,2.1,'Iris-virginica'),
(27,4.9,2.5,4.5,1.7,'Iris-virginica'),
(28,7.3,2.9,6.3,1.8,'Iris-virginica'),
(29,6.7,2.5,5.8,1.8,'Iris-virginica'),
(30,7.2,3.6,6.1,2.5,'Iris-virginica');
</pre></li>
<li>Run the <b><a class="el" href="summary_8sql__in.html#a4be51e88a1df45191a1692b95429af36">summary()</a></b> function using all defaults. <pre class="example">
DROP TABLE IF EXISTS iris_summary;
SELECT * FROM madlib.summary( 'iris', -- Source table
'iris_summary' -- Output table
);
</pre> Result: <pre class="result">
output_table | num_col_summarized | duration
--------------+--------------------+-------------------
iris_summary | 6 | 0.574938058853149
(1 row)
</pre> View the summary data. <pre class="example">
-- Turn on expanded display for readability.
\x on
SELECT * FROM iris_summary;
</pre> Result (partial): <pre class="result">
...
&#160;-[ RECORD 2 ]--------+---------------------------------------------
group_by |
group_by_value |
target_column | sepal_length
column_number | 2
data_type | float8
row_count | 30
distinct_values | 22
missing_values | 0
blank_values |
fraction_missing | 0
fraction_blank |
positive_values | 30
negative_values | 0
zero_values | 0
mean | 5.84333333333333
variance | 0.929436781609188
confidence_interval | {5.49834423494374,6.18832243172292}
min | 4.4
max | 7.6
first_quartile | 4.925
median | 5.75
third_quartile | 6.575
most_frequent_values | {4.9,6.3,5,6.5,4.6,7.2,5.5,5.7,7.3,6.7}
mfv_frequencies | {4,3,2,2,2,1,1,1,1,1}
...
&#160;-[ RECORD 6 ]--------+---------------------------------------------
group_by |
group_by_value |
target_column | class_name
column_number | 6
data_type | text
row_count | 30
distinct_values | 3
missing_values | 0
blank_values | 0
fraction_missing | 0
fraction_blank | 0
positive_values |
negative_values |
zero_values |
mean |
variance |
confidence_interval |
min | 11
max | 15
first_quartile |
median |
third_quartile |
most_frequent_values | {Iris-setosa,Iris-versicolor,Iris-virginica}
mfv_frequencies | {10,10,10}
</pre> Note that for the text column in record 6, some statistics are n/a, and the min and max values represent the length of the shortest and longest strings respectively.</li>
<li>Now group by the class of iris: <pre class="example">
DROP TABLE IF EXISTS iris_summary;
SELECT * FROM madlib.summary( 'iris', -- Source table
'iris_summary', -- Output table
'sepal_length, sepal_width', -- Columns to summarize
'class_name' -- Grouping column
);
SELECT * FROM iris_summary;
</pre> Result (partial): <pre class="result">
&#160;-[ RECORD 1 ]--------+----------------------------------------
group_by | class_name
group_by_value | Iris-setosa
target_column | sepal_length
column_number | 2
data_type | float8
row_count | 10
distinct_values | 7
missing_values | 0
blank_values |
fraction_missing | 0
fraction_blank |
positive_values | 10
negative_values | 0
zero_values | 0
mean | 4.86
variance | 0.0848888888888875
confidence_interval | {4.67941507384182,5.04058492615818}
min | 4.4
max | 5.4
first_quartile | 4.625
median | 4.9
third_quartile | 5
most_frequent_values | {4.9,5,4.6,5.1,4.7,5.4,4.4}
mfv_frequencies | {2,2,2,1,1,1,1}
...
&#160;-[ RECORD 3 ]--------+----------------------------------------
group_by | class_name
group_by_value | Iris-versicolor
target_column | sepal_length
column_number | 2
data_type | float8
row_count | 10
distinct_values | 10
missing_values | 0
blank_values |
fraction_missing | 0
fraction_blank |
positive_values | 10
negative_values | 0
zero_values | 0
mean | 6.1
variance | 0.528888888888893
confidence_interval | {5.64924734548141,6.55075265451859}
min | 4.9
max | 7
first_quartile | 5.55
median | 6.35
third_quartile | 6.575
most_frequent_values | {6.9,5.5,6.5,5.7,6.3,4.9,6.6,5.2,7,6.4}
mfv_frequencies | {1,1,1,1,1,1,1,1,1,1}
...
</pre></li>
<li>Trying some other parameters: <pre class="example">
DROP TABLE IF EXISTS iris_summary;
SELECT * FROM madlib.summary( 'iris', -- Source table
'iris_summary', -- Output table
'sepal_length, sepal_width', -- Columns to summarize
NULL, -- No grouping
TRUE, -- Get distinct values
FALSE, -- Dont get quartiles
ARRAY[0.33, 0.66], -- Get ntiles
3, -- Number of MFV to compute
FALSE -- Get exact values
);
SELECT * FROM iris_summary;
</pre> Result: <pre class="result">
&#160;-[ RECORD 1 ]--------+------------------------------------
group_by |
group_by_value |
target_column | sepal_length
column_number | 2
data_type | float8
row_count | 30
distinct_values | 22
missing_values | 0
blank_values |
fraction_missing | 0
fraction_blank |
positive_values | 30
negative_values | 0
zero_values | 0
mean | 5.84333333333333
variance | 0.929436781609175
confidence_interval | {5.49834423494375,6.18832243172292}
min | 4.4
max | 7.6
quantile_array | {5.057,6.414}
most_frequent_values | {4.9,6.3,6.5}
mfv_frequencies | {4,3,2}
&#160;-[ RECORD 2 ]--------+------------------------------------
group_by |
group_by_value |
target_column | sepal_width
column_number | 3
data_type | float8
row_count | 30
distinct_values | 14
missing_values | 0
blank_values |
fraction_missing | 0
fraction_blank |
positive_values | 30
negative_values | 0
zero_values | 0
mean | 3.04
variance | 0.13903448275862
confidence_interval | {2.90656901047539,3.17343098952461}
min | 2.3
max | 3.9
quantile_array | {2.9,3.2}
most_frequent_values | {2.9,3,3.2}
mfv_frequencies | {4,4,3}
</pre></li>
</ol>
<p><a class="anchor" id="notes"></a></p><dl class="section user"><dt>Notes</dt><dd><ul>
<li>Table names can be optionally schema qualified (current_schemas() would be searched if a schema name is not provided) and table and column names should follow case-sensitivity and quoting rules per the database. (For instance, 'mytable' and 'MyTable' both resolve to the same entity, i.e. 'mytable'. If mixed-case or multi-byte characters are desired for entity names then the string should be double-quoted; in this case the input would be '"MyTable"').</li>
<li>The <em>get_estimates</em> parameter controls computation for both distinct count and most frequent values:<ul>
<li>If <em>get_estimates</em> is TRUE then the distinct value computation is estimated using Flajolet-Martin. MFV is computed using a fast method that does parallel aggregation in Greenplum Database at the expense of missing or duplicating some of the most frequent values.</li>
<li>If <em>get_estimates</em> is FALSE then the distinct values are computed in a slower but exact method using PostgreSQL COUNT DISTINCT. MFV is computed using a faithful implementation that preserves the approximation guarantees of the Cormode/Muthukrishnan method (more information at <a class="el" href="group__grp__mfvsketch.html">MFV (Most Frequent Values)</a>).</li>
</ul>
</li>
</ul>
</dd></dl>
<p><a class="anchor" id="related"></a></p><dl class="section user"><dt>Related Topics</dt><dd>File <a class="el" href="summary_8sql__in.html" title="Summary function for descriptive statistics. ">summary.sql_in</a> documenting the <b><a class="el" href="summary_8sql__in.html#a4be51e88a1df45191a1692b95429af36">summary()</a></b> function</dd></dl>
<p><a class="el" href="group__grp__fmsketch.html">FM (Flajolet-Martin)</a> <br />
<a class="el" href="group__grp__mfvsketch.html">MFV (Most Frequent Values)</a> <br />
<a class="el" href="group__grp__countmin.html">CountMin (Cormode-Muthukrishnan)</a> </p>
</div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="footer">Generated on Mon Apr 6 2020 21:46:58 for MADlib by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
</ul>
</div>
</body>
</html>