Apache DataSketches (incubating) is an effort undergoing incubation 
at The Apache Software Foundation (ASF), sponsored by the Apache Incubator. 

Incubation is required of all newly accepted projects until a further review 
indicates that the infrastructure, communications, and decision making process 
have stabilized in a manner consistent with other successful ASF projects.

While incubation status is not necessarily a reflection of the
completeness or stability of the code, it does indicate that the
project has yet to be fully endorsed by the ASF.

Some of the incubating project's releases may not be fully compliant
with ASF policy. For example, releases may have incomplete or
un-reviewed licensing conditions. What follows is a list of known
issues the project is currently aware of (note that this list, by
definition, is likely to be incomplete): 

 * The LICENSE and NOTICE files may not be complete and will be fixed with the next release.

If you are planning to incorporate this work into your
product or project, please be aware that you will need to conduct a
thorough licensing review to determine the overall implications of
including this work. For the current status of this project through the Apache
Incubator visit: 

http://incubator.apache.org/projects/datasketches.html
