/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

Release v0.3.0
  First Apache release (incubating).
  Flink execution engine.
  Bagging with distributed learners.

Release v0.2.0
  NaiveBayes classitication algorithm.
  AMRules regression algorithm.
  Samza execution engine.
  Multithread execution engine.
  HDFS stream source.

Release v0.1.0
  Initial release.
  Vertical Hoeffding Tree classification algorithm.
  Clustream clustering algorithm.
  Adaptive ensembles (Bagging and Boosting).
  Local execution engine.
  Storm execution engine.
  S4 execution engine.
