You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hugegraph.apache.org by zh...@apache.org on 2022/11/26 12:57:40 UTC

[incubator-hugegraph-computer] branch rename_package created (now 2f13b543)

This is an automated email from the ASF dual-hosted git repository.

zhaocong pushed a change to branch rename_package
in repository https://gitbox.apache.org/repos/asf/incubator-hugegraph-computer.git


      at 2f13b543 Rename `com.baidu` to `org.apache`

This branch includes the following new commits:

     new 2f13b543 Rename `com.baidu` to `org.apache`

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[incubator-hugegraph-computer] 01/01: Rename `com.baidu` to `org.apache`

Posted by zh...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

zhaocong pushed a commit to branch rename_package
in repository https://gitbox.apache.org/repos/asf/incubator-hugegraph-computer.git

commit 2f13b543cab07456aa74c36862c4f338ad35b5a8
Author: coderzc <zh...@apache.org>
AuthorDate: Sat Nov 26 20:57:12 2022 +0800

    Rename `com.baidu` to `org.apache`
---
 README.md                                          |   2 +-
 computer-algorithm/pom.xml                         |   4 +-
 .../betweenness/BetweennessCentrality.java         | 193 -----
 .../betweenness/BetweennessCentralityParams.java   |  48 --
 .../centrality/betweenness/BetweennessMessage.java |  90 --
 .../centrality/betweenness/BetweennessValue.java   |  73 --
 .../centrality/closeness/ClosenessCentrality.java  | 169 ----
 .../closeness/ClosenessCentralityParams.java       |  47 --
 .../centrality/closeness/ClosenessMessage.java     |  89 --
 .../centrality/closeness/ClosenessValue.java       |  44 -
 .../centrality/degree/DegreeCentrality.java        | 127 ---
 .../centrality/degree/DegreeCentralityParams.java  |  47 --
 .../algorithm/centrality/pagerank/PageRank.java    | 155 ----
 .../centrality/pagerank/PageRank4Master.java       | 104 ---
 .../centrality/pagerank/PageRankParams.java        |  46 -
 .../community/cc/ClusteringCoefficient.java        |  83 --
 .../community/cc/ClusteringCoefficientOutput.java  |  64 --
 .../community/cc/ClusteringCoefficientParams.java  |  44 -
 .../community/cc/ClusteringCoefficientValue.java   |  94 ---
 .../computer/algorithm/community/kcore/Kcore.java  | 123 ---
 .../algorithm/community/kcore/KcoreParams.java     |  43 -
 .../algorithm/community/kcore/KcoreValue.java      | 103 ---
 .../computer/algorithm/community/lpa/Lpa.java      | 102 ---
 .../algorithm/community/lpa/LpaParams.java         |  40 -
 .../community/trianglecount/TriangleCount.java     | 118 ---
 .../trianglecount/TriangleCountParams.java         |  44 -
 .../trianglecount/TriangleCountValue.java          |  84 --
 .../computer/algorithm/community/wcc/Wcc.java      |  73 --
 .../algorithm/community/wcc/WccParams.java         |  43 -
 .../algorithm/path/rings/RingsDetection.java       | 116 ---
 .../algorithm/path/rings/RingsDetectionOutput.java |  50 --
 .../algorithm/path/rings/RingsDetectionParams.java |  42 -
 .../path/rings/filter/FilterDescribe.java          |  85 --
 .../path/rings/filter/RingsDetectionMessage.java   |  78 --
 .../rings/filter/RingsDetectionWithFilter.java     | 123 ---
 .../filter/RingsDetectionWithFilterParams.java     |  44 -
 .../algorithm/path/rings/filter/SpreadFilter.java  | 158 ----
 .../betweenness/BetweennessCentrality.java         | 192 +++++
 .../betweenness/BetweennessCentralityParams.java   |  48 ++
 .../centrality/betweenness/BetweennessMessage.java |  90 ++
 .../centrality/betweenness/BetweennessValue.java   |  73 ++
 .../centrality/closeness/ClosenessCentrality.java  | 168 ++++
 .../closeness/ClosenessCentralityParams.java       |  47 ++
 .../centrality/closeness/ClosenessMessage.java     |  89 ++
 .../centrality/closeness/ClosenessValue.java       |  44 +
 .../centrality/degree/DegreeCentrality.java        | 126 +++
 .../centrality/degree/DegreeCentralityParams.java  |  47 ++
 .../algorithm/centrality/pagerank/PageRank.java    | 155 ++++
 .../centrality/pagerank/PageRank4Master.java       | 103 +++
 .../centrality/pagerank/PageRankParams.java        |  46 +
 .../community/cc/ClusteringCoefficient.java        |  83 ++
 .../community/cc/ClusteringCoefficientOutput.java  |  63 ++
 .../community/cc/ClusteringCoefficientParams.java  |  44 +
 .../community/cc/ClusteringCoefficientValue.java   |  94 +++
 .../computer/algorithm/community/kcore/Kcore.java  | 124 +++
 .../algorithm/community/kcore/KcoreParams.java     |  43 +
 .../algorithm/community/kcore/KcoreValue.java      | 102 +++
 .../computer/algorithm/community/lpa/Lpa.java      | 101 +++
 .../algorithm/community/lpa/LpaParams.java         |  40 +
 .../community/trianglecount/TriangleCount.java     | 118 +++
 .../trianglecount/TriangleCountParams.java         |  44 +
 .../trianglecount/TriangleCountValue.java          |  83 ++
 .../computer/algorithm/community/wcc/Wcc.java      |  73 ++
 .../algorithm/community/wcc/WccParams.java         |  43 +
 .../algorithm/path/rings/RingsDetection.java       | 116 +++
 .../algorithm/path/rings/RingsDetectionOutput.java |  50 ++
 .../algorithm/path/rings/RingsDetectionParams.java |  42 +
 .../path/rings/filter/FilterDescribe.java          |  85 ++
 .../path/rings/filter/RingsDetectionMessage.java   |  78 ++
 .../rings/filter/RingsDetectionWithFilter.java     | 123 +++
 .../filter/RingsDetectionWithFilterParams.java     |  44 +
 .../algorithm/path/rings/filter/SpreadFilter.java  | 158 ++++
 computer-api/pom.xml                               |   2 +-
 .../computer/algorithm/AlgorithmParams.java        |  76 --
 .../computer/core/aggregator/Aggregator.java       |  93 --
 .../core/aggregator/Aggregator4Master.java         |  80 --
 .../core/aggregator/Aggregator4Worker.java         |  67 --
 .../computer/core/allocator/Allocator.java         |  34 -
 .../computer/core/allocator/Recyclable.java        |  23 -
 .../computer/core/allocator/RecyclerReference.java |  45 -
 .../hugegraph/computer/core/combiner/Combiner.java |  55 --
 .../core/combiner/DoubleValueSumCombiner.java      |  35 -
 .../core/combiner/FloatValueSumCombiner.java       |  35 -
 .../core/combiner/IntValueSumCombiner.java         |  35 -
 .../core/combiner/LongValueSumCombiner.java        |  35 -
 .../core/combiner/MergeNewPropertiesCombiner.java  |  55 --
 .../core/combiner/MergeOldPropertiesCombiner.java  |  55 --
 .../computer/core/combiner/OverwriteCombiner.java  |  35 -
 .../core/combiner/OverwritePropertiesCombiner.java |  41 -
 .../computer/core/combiner/PropertiesCombiner.java |  29 -
 .../computer/core/combiner/ValueMaxCombiner.java   |  39 -
 .../computer/core/combiner/ValueMinCombiner.java   |  39 -
 .../computer/core/common/ComputerContext.java      |  65 --
 .../hugegraph/computer/core/common/Constants.java  |  77 --
 .../hugegraph/computer/core/common/SerialEnum.java |  54 --
 .../core/common/exception/ComputerException.java   |  56 --
 .../computer/core/config/ComputerOptions.java      | 937 ---------------------
 .../hugegraph/computer/core/config/Config.java     |  52 --
 .../computer/core/config/DefaultConfig.java        | 206 -----
 .../computer/core/config/EdgeFrequency.java        |  44 -
 .../hugegraph/computer/core/config/HotConfig.java  |  51 --
 .../baidu/hugegraph/computer/core/config/Null.java |  32 -
 .../computer/core/graph/GraphFactory.java          |  78 --
 .../hugegraph/computer/core/graph/edge/Edge.java   |  46 -
 .../hugegraph/computer/core/graph/edge/Edges.java  |  27 -
 .../baidu/hugegraph/computer/core/graph/id/Id.java |  31 -
 .../computer/core/graph/id/IdFactory.java          |  92 --
 .../hugegraph/computer/core/graph/id/IdType.java   |  44 -
 .../core/graph/properties/DefaultProperties.java   | 131 ---
 .../computer/core/graph/properties/Properties.java |  43 -
 .../computer/core/graph/value/BooleanValue.java    | 111 ---
 .../computer/core/graph/value/DoubleValue.java     | 134 ---
 .../computer/core/graph/value/FloatValue.java      | 134 ---
 .../computer/core/graph/value/IdList.java          |  57 --
 .../computer/core/graph/value/IdListList.java      |  47 --
 .../hugegraph/computer/core/graph/value/IdSet.java | 113 ---
 .../computer/core/graph/value/IntValue.java        | 134 ---
 .../computer/core/graph/value/ListValue.java       | 242 ------
 .../computer/core/graph/value/LongValue.java       | 134 ---
 .../computer/core/graph/value/MapValue.java        | 169 ----
 .../computer/core/graph/value/NullValue.java       | 103 ---
 .../computer/core/graph/value/StringValue.java     | 104 ---
 .../hugegraph/computer/core/graph/value/Value.java | 108 ---
 .../computer/core/graph/value/ValueType.java       |  72 --
 .../computer/core/graph/vertex/Vertex.java         |  62 --
 .../hugegraph/computer/core/input/InputFilter.java |  34 -
 .../hugegraph/computer/core/io/BytesInput.java     |  23 -
 .../hugegraph/computer/core/io/BytesOutput.java    |  35 -
 .../computer/core/io/GraphComputeInput.java        |  39 -
 .../computer/core/io/GraphComputeOutput.java       |  39 -
 .../hugegraph/computer/core/io/GraphInput.java     |  23 -
 .../hugegraph/computer/core/io/GraphOutput.java    |  24 -
 .../computer/core/io/GraphWritebackOutput.java     |  38 -
 .../computer/core/io/RandomAccessInput.java        |  80 --
 .../computer/core/io/RandomAccessOutput.java       |  69 --
 .../baidu/hugegraph/computer/core/io/Readable.java |  27 -
 .../baidu/hugegraph/computer/core/io/Writable.java |  27 -
 .../core/master/DefaultMasterComputation.java      |  45 -
 .../computer/core/master/MasterComputation.java    |  55 --
 .../core/master/MasterComputationContext.java      |  62 --
 .../computer/core/master/MasterContext.java        |  28 -
 .../core/output/AbstractComputerOutput.java        |  55 --
 .../computer/core/output/ComputerOutput.java       |  59 --
 .../computer/core/output/hg/HugeGraphOutput.java   | 107 ---
 .../output/hg/exceptions/WriteBackException.java   |  41 -
 .../core/output/hg/metrics/LoadMetrics.java        |  49 --
 .../core/output/hg/metrics/LoadReport.java         |  42 -
 .../core/output/hg/metrics/LoadSummary.java        |  73 --
 .../computer/core/output/hg/metrics/Printer.java   |  58 --
 .../core/output/hg/task/BatchInsertTask.java       | 104 ---
 .../computer/core/output/hg/task/InsertTask.java   |  81 --
 .../core/output/hg/task/SingleInsertTask.java      |  62 --
 .../computer/core/output/hg/task/TaskManager.java  | 188 -----
 .../hugegraph/computer/core/util/BytesUtil.java    |  78 --
 .../hugegraph/computer/core/util/CoderUtil.java    | 159 ----
 .../computer/core/worker/Computation.java          | 103 ---
 .../computer/core/worker/ComputationContext.java   | 136 ---
 .../computer/core/worker/FilterComputation.java    | 113 ---
 .../computer/core/worker/ReduceComputation.java    |  99 ---
 .../computer/core/worker/WorkerContext.java        |  38 -
 .../computer/algorithm/AlgorithmParams.java        |  77 ++
 .../computer/core/aggregator/Aggregator.java       |  93 ++
 .../core/aggregator/Aggregator4Master.java         |  80 ++
 .../core/aggregator/Aggregator4Worker.java         |  67 ++
 .../computer/core/allocator/Allocator.java         |  34 +
 .../computer/core/allocator/Recyclable.java        |  23 +
 .../computer/core/allocator/RecyclerReference.java |  45 +
 .../hugegraph/computer/core/combiner/Combiner.java |  55 ++
 .../core/combiner/DoubleValueSumCombiner.java      |  35 +
 .../core/combiner/FloatValueSumCombiner.java       |  35 +
 .../core/combiner/IntValueSumCombiner.java         |  35 +
 .../core/combiner/LongValueSumCombiner.java        |  35 +
 .../core/combiner/MergeNewPropertiesCombiner.java  |  55 ++
 .../core/combiner/MergeOldPropertiesCombiner.java  |  55 ++
 .../computer/core/combiner/OverwriteCombiner.java  |  35 +
 .../core/combiner/OverwritePropertiesCombiner.java |  41 +
 .../computer/core/combiner/PropertiesCombiner.java |  29 +
 .../computer/core/combiner/ValueMaxCombiner.java   |  39 +
 .../computer/core/combiner/ValueMinCombiner.java   |  39 +
 .../computer/core/common/ComputerContext.java      |  65 ++
 .../hugegraph/computer/core/common/Constants.java  |  77 ++
 .../hugegraph/computer/core/common/SerialEnum.java |  55 ++
 .../core/common/exception/ComputerException.java   |  56 ++
 .../computer/core/config/ComputerOptions.java      | 937 +++++++++++++++++++++
 .../hugegraph/computer/core/config/Config.java     |  52 ++
 .../computer/core/config/DefaultConfig.java        | 205 +++++
 .../computer/core/config/EdgeFrequency.java        |  44 +
 .../hugegraph/computer/core/config/HotConfig.java  |  51 ++
 .../hugegraph/computer/core/config/Null.java       |  32 +
 .../computer/core/graph/GraphFactory.java          |  78 ++
 .../hugegraph/computer/core/graph/edge/Edge.java   |  46 +
 .../hugegraph/computer/core/graph/edge/Edges.java  |  27 +
 .../hugegraph/computer/core/graph/id/Id.java       |  31 +
 .../computer/core/graph/id/IdFactory.java          |  92 ++
 .../hugegraph/computer/core/graph/id/IdType.java   |  44 +
 .../core/graph/properties/DefaultProperties.java   | 131 +++
 .../computer/core/graph/properties/Properties.java |  43 +
 .../computer/core/graph/value/BooleanValue.java    | 111 +++
 .../computer/core/graph/value/DoubleValue.java     | 134 +++
 .../computer/core/graph/value/FloatValue.java      | 134 +++
 .../computer/core/graph/value/IdList.java          |  57 ++
 .../computer/core/graph/value/IdListList.java      |  47 ++
 .../hugegraph/computer/core/graph/value/IdSet.java | 112 +++
 .../computer/core/graph/value/IntValue.java        | 134 +++
 .../computer/core/graph/value/ListValue.java       | 241 ++++++
 .../computer/core/graph/value/LongValue.java       | 134 +++
 .../computer/core/graph/value/MapValue.java        | 168 ++++
 .../computer/core/graph/value/NullValue.java       | 103 +++
 .../computer/core/graph/value/StringValue.java     | 104 +++
 .../hugegraph/computer/core/graph/value/Value.java | 108 +++
 .../computer/core/graph/value/ValueType.java       |  72 ++
 .../computer/core/graph/vertex/Vertex.java         |  62 ++
 .../hugegraph/computer/core/input/InputFilter.java |  34 +
 .../hugegraph/computer/core/io/BytesInput.java     |  23 +
 .../hugegraph/computer/core/io/BytesOutput.java    |  35 +
 .../computer/core/io/GraphComputeInput.java        |  38 +
 .../computer/core/io/GraphComputeOutput.java       |  39 +
 .../hugegraph/computer/core/io/GraphInput.java     |  23 +
 .../hugegraph/computer/core/io/GraphOutput.java    |  24 +
 .../computer/core/io/GraphWritebackOutput.java     |  38 +
 .../computer/core/io/RandomAccessInput.java        |  80 ++
 .../computer/core/io/RandomAccessOutput.java       |  69 ++
 .../hugegraph/computer/core/io/Readable.java       |  27 +
 .../hugegraph/computer/core/io/Writable.java       |  27 +
 .../core/master/DefaultMasterComputation.java      |  45 +
 .../computer/core/master/MasterComputation.java    |  55 ++
 .../core/master/MasterComputationContext.java      |  62 ++
 .../computer/core/master/MasterContext.java        |  28 +
 .../core/output/AbstractComputerOutput.java        |  54 ++
 .../computer/core/output/ComputerOutput.java       |  59 ++
 .../computer/core/output/hg/HugeGraphOutput.java   | 106 +++
 .../output/hg/exceptions/WriteBackException.java   |  41 +
 .../core/output/hg/metrics/LoadMetrics.java        |  49 ++
 .../core/output/hg/metrics/LoadReport.java         |  42 +
 .../core/output/hg/metrics/LoadSummary.java        |  73 ++
 .../computer/core/output/hg/metrics/Printer.java   |  58 ++
 .../core/output/hg/task/BatchInsertTask.java       | 103 +++
 .../computer/core/output/hg/task/InsertTask.java   |  81 ++
 .../core/output/hg/task/SingleInsertTask.java      |  62 ++
 .../computer/core/output/hg/task/TaskManager.java  | 187 ++++
 .../hugegraph/computer/core/util/BytesUtil.java    |  78 ++
 .../hugegraph/computer/core/util/CoderUtil.java    | 159 ++++
 .../computer/core/worker/Computation.java          | 103 +++
 .../computer/core/worker/ComputationContext.java   | 136 +++
 .../computer/core/worker/FilterComputation.java    | 113 +++
 .../computer/core/worker/ReduceComputation.java    |  99 +++
 .../computer/core/worker/WorkerContext.java        |  38 +
 computer-core/pom.xml                              |   4 +-
 .../computer/core/aggregator/Aggregators.java      |  80 --
 .../core/aggregator/DefaultAggregator.java         | 171 ----
 .../core/aggregator/MasterAggrManager.java         | 157 ----
 .../core/aggregator/RegisterAggregators.java       |  75 --
 .../core/aggregator/WorkerAggrManager.java         | 157 ----
 .../computer/core/allocator/DefaultAllocator.java  |  83 --
 .../computer/core/allocator/RecycleHandler.java    |  37 -
 .../hugegraph/computer/core/bsp/Bsp4Master.java    | 223 -----
 .../hugegraph/computer/core/bsp/Bsp4Worker.java    | 259 ------
 .../baidu/hugegraph/computer/core/bsp/BspBase.java | 136 ---
 .../hugegraph/computer/core/bsp/BspClient.java     |  78 --
 .../hugegraph/computer/core/bsp/BspEvent.java      |  56 --
 .../hugegraph/computer/core/bsp/EtcdBspClient.java |  83 --
 .../hugegraph/computer/core/bsp/EtcdClient.java    | 484 -----------
 .../core/combiner/AbstractPointerCombiner.java     |  73 --
 .../computer/core/combiner/EdgeValueCombiner.java  |  34 -
 .../core/combiner/MessageValueCombiner.java        |  36 -
 .../computer/core/combiner/PointerCombiner.java    |  25 -
 .../core/combiner/VertexValueCombiner.java         |  67 --
 .../computer/core/common/ContainerInfo.java        | 137 ---
 .../core/common/exception/IllegalArgException.java |  45 -
 .../core/common/exception/ReadException.java       |  41 -
 .../core/common/exception/TransportException.java  |  71 --
 .../core/common/exception/WriteException.java      |  41 -
 .../computer/core/compute/ComputeManager.java      | 207 -----
 .../computer/core/compute/FileGraphPartition.java  | 446 ----------
 .../computer/core/compute/input/EdgesInput.java    | 291 -------
 .../computer/core/compute/input/MessageInput.java  | 127 ---
 .../core/compute/input/ReusablePointer.java        | 106 ---
 .../computer/core/compute/input/VertexInput.java   |  89 --
 .../computer/core/graph/BuiltinGraphFactory.java   | 201 -----
 .../computer/core/graph/SuperstepStat.java         | 172 ----
 .../computer/core/graph/edge/DefaultEdge.java      | 120 ---
 .../computer/core/graph/edge/DefaultEdges.java     |  72 --
 .../hugegraph/computer/core/graph/id/BytesId.java  | 214 -----
 .../core/graph/partition/HashPartitioner.java      |  53 --
 .../core/graph/partition/PartitionStat.java        | 153 ----
 .../computer/core/graph/partition/Partitioner.java |  41 -
 .../computer/core/graph/vertex/DefaultVertex.java  | 168 ----
 .../hugegraph/computer/core/input/EdgeFetcher.java |  31 -
 .../computer/core/input/ElementFetcher.java        |  31 -
 .../computer/core/input/GraphFetcher.java          |  33 -
 .../computer/core/input/HugeConverter.java         | 102 ---
 .../hugegraph/computer/core/input/IdUtil.java      |  67 --
 .../computer/core/input/InputSourceFactory.java    |  57 --
 .../hugegraph/computer/core/input/InputSplit.java  |  69 --
 .../computer/core/input/InputSplitFetcher.java     |  42 -
 .../computer/core/input/MasterInputHandler.java    |  67 --
 .../computer/core/input/MasterInputManager.java    |  65 --
 .../computer/core/input/VertexFetcher.java         |  31 -
 .../computer/core/input/WorkerInputManager.java    |  97 ---
 .../core/input/filter/DefaultInputFilter.java      |  39 -
 .../filter/ExtractAllPropertyInputFilter.java      |  37 -
 .../computer/core/input/hg/HugeEdgeFetcher.java    |  48 --
 .../computer/core/input/hg/HugeElementFetcher.java |  90 --
 .../computer/core/input/hg/HugeGraphFetcher.java   |  72 --
 .../core/input/hg/HugeInputSplitFetcher.java       |  82 --
 .../computer/core/input/hg/HugeVertexFetcher.java  |  49 --
 .../core/input/loader/FileEdgeFetcher.java         |  73 --
 .../core/input/loader/FileElementFetcher.java      | 142 ----
 .../computer/core/input/loader/FileInputSplit.java |  86 --
 .../core/input/loader/FileVertxFetcher.java        |  58 --
 .../input/loader/LoaderFileInputSplitFetcher.java  | 210 -----
 .../core/input/loader/LoaderGraphFetcher.java      |  66 --
 .../core/io/AbstractBufferedFileInput.java         | 163 ----
 .../core/io/AbstractBufferedFileOutput.java        | 105 ---
 .../computer/core/io/BufferedFileInput.java        | 111 ---
 .../computer/core/io/BufferedFileOutput.java       | 101 ---
 .../computer/core/io/BufferedStreamInput.java      | 182 ----
 .../computer/core/io/BufferedStreamOutput.java     | 193 -----
 .../computer/core/io/CsvStructGraphOutput.java     | 140 ---
 .../hugegraph/computer/core/io/IOFactory.java      |  90 --
 .../computer/core/io/JsonStructGraphOutput.java    | 170 ----
 .../computer/core/io/OptimizedBytesInput.java      | 237 ------
 .../computer/core/io/OptimizedBytesOutput.java     | 215 -----
 .../hugegraph/computer/core/io/OutputFormat.java   |  29 -
 .../computer/core/io/StreamGraphInput.java         | 165 ----
 .../computer/core/io/StreamGraphOutput.java        | 144 ----
 .../computer/core/io/StructGraphOutput.java        | 118 ---
 .../computer/core/io/StructRandomAccessOutput.java | 169 ----
 .../computer/core/io/UnsafeBytesInput.java         | 286 -------
 .../computer/core/io/UnsafeBytesOutput.java        | 269 ------
 .../hugegraph/computer/core/manager/Manager.java   |  78 --
 .../hugegraph/computer/core/manager/Managers.java  |  88 --
 .../computer/core/master/MasterService.java        | 491 -----------
 .../computer/core/network/ClientFactory.java       |  46 -
 .../computer/core/network/ClientHandler.java       |  29 -
 .../computer/core/network/ConnectionId.java        | 112 ---
 .../computer/core/network/DataClientManager.java   | 130 ---
 .../computer/core/network/DataServerManager.java   |  68 --
 .../hugegraph/computer/core/network/IOMode.java    |  30 -
 .../computer/core/network/MessageHandler.java      |  49 --
 .../computer/core/network/TransportClient.java     |  97 ---
 .../computer/core/network/TransportConf.java       | 216 -----
 .../computer/core/network/TransportHandler.java    |  44 -
 .../computer/core/network/TransportProvider.java   |  27 -
 .../computer/core/network/TransportServer.java     |  61 --
 .../computer/core/network/TransportState.java      |  30 -
 .../computer/core/network/TransportUtil.java       | 167 ----
 .../core/network/buffer/FileRegionBuffer.java      | 133 ---
 .../computer/core/network/buffer/NettyBuffer.java  |  77 --
 .../core/network/buffer/NetworkBuffer.java         |  75 --
 .../computer/core/network/buffer/NioBuffer.java    |  76 --
 .../core/network/connection/ConnectionManager.java |  89 --
 .../connection/TransportConnectionManager.java     | 153 ----
 .../core/network/message/AbstractMessage.java      | 198 -----
 .../computer/core/network/message/AckMessage.java  |  46 -
 .../computer/core/network/message/DataMessage.java |  71 --
 .../computer/core/network/message/FailMessage.java |  88 --
 .../core/network/message/FinishMessage.java        |  44 -
 .../computer/core/network/message/Message.java     |  67 --
 .../computer/core/network/message/MessageType.java |  74 --
 .../computer/core/network/message/PingMessage.java |  40 -
 .../computer/core/network/message/PongMessage.java |  40 -
 .../core/network/message/RequestMessage.java       |  27 -
 .../core/network/message/ResponseMessage.java      |  27 -
 .../core/network/message/StartMessage.java         |  46 -
 .../core/network/netty/AbstractNettyHandler.java   | 147 ----
 .../core/network/netty/BufAllocatorFactory.java    |  31 -
 .../netty/ChannelFutureListenerOnWrite.java        |  81 --
 .../core/network/netty/HeartbeatHandler.java       |  92 --
 .../core/network/netty/NettyClientFactory.java     | 231 -----
 .../core/network/netty/NettyClientHandler.java     | 118 ---
 .../core/network/netty/NettyEventLoopUtil.java     | 111 ---
 .../computer/core/network/netty/NettyProtocol.java | 205 -----
 .../core/network/netty/NettyServerHandler.java     | 235 ------
 .../core/network/netty/NettyTransportClient.java   | 198 -----
 .../core/network/netty/NettyTransportProvider.java |  44 -
 .../core/network/netty/NettyTransportServer.java   | 229 -----
 .../core/network/netty/ServerIdleHandler.java      |  61 --
 .../core/network/netty/codec/FrameDecoder.java     |  76 --
 .../core/network/netty/codec/MessageDecoder.java   |  99 ---
 .../core/network/netty/codec/MessageEncoder.java   |  92 --
 .../network/netty/codec/PreciseFrameDecoder.java   |  98 ---
 .../core/network/session/ClientSession.java        | 282 -------
 .../core/network/session/ServerSession.java        | 143 ----
 .../core/network/session/TransportSession.java     |  79 --
 .../computer/core/output/LimitedLogOutput.java     |  59 --
 .../hugegraph/computer/core/output/LogOutput.java  |  45 -
 .../computer/core/output/hdfs/HdfsOutput.java      | 178 ----
 .../core/output/hdfs/HdfsOutputMerger.java         |  91 --
 .../core/output/hg/HugeGraphDoubleOutput.java      |  32 -
 .../core/output/hg/HugeGraphFloatOutput.java       |  32 -
 .../computer/core/output/hg/HugeGraphIdOutput.java |  39 -
 .../core/output/hg/HugeGraphIntOutput.java         |  32 -
 .../core/output/hg/HugeGraphLongOutput.java        |  32 -
 .../core/output/hg/HugeGraphStringOutput.java      |  32 -
 .../computer/core/receiver/MessageRecvBuffers.java | 122 ---
 .../computer/core/receiver/MessageRecvManager.java | 254 ------
 .../core/receiver/MessageRecvPartition.java        | 227 -----
 .../core/receiver/MessageRecvPartitions.java       | 116 ---
 .../computer/core/receiver/MessageStat.java        |  51 --
 .../receiver/edge/EdgeMessageRecvPartition.java    |  63 --
 .../receiver/edge/EdgeMessageRecvPartitions.java   |  41 -
 .../message/ComputeMessageRecvPartition.java       |  68 --
 .../message/ComputeMessageRecvPartitions.java      |  41 -
 .../vertex/VertexMessageRecvPartition.java         |  57 --
 .../vertex/VertexMessageRecvPartitions.java        |  42 -
 .../computer/core/rpc/AggregateRpcService.java     |  39 -
 .../computer/core/rpc/InputSplitRpcService.java    |  29 -
 .../computer/core/rpc/MasterRpcManager.java        |  75 --
 .../computer/core/rpc/WorkerRpcManager.java        |  72 --
 .../computer/core/sender/MessageQueue.java         |  60 --
 .../computer/core/sender/MessageSendBuffers.java   |  77 --
 .../computer/core/sender/MessageSendManager.java   | 297 -------
 .../computer/core/sender/MessageSendPartition.java |  78 --
 .../computer/core/sender/MessageSender.java        |  42 -
 .../hugegraph/computer/core/sender/MultiQueue.java |  87 --
 .../computer/core/sender/QueuedMessage.java        |  49 --
 .../computer/core/sender/QueuedMessageSender.java  | 306 -------
 .../computer/core/sender/WriteBuffer.java          |  97 ---
 .../computer/core/sender/WriteBuffers.java         | 135 ---
 .../computer/core/sort/BufferFileSorter.java       | 107 ---
 .../computer/core/sort/DefaultSorter.java          |  85 --
 .../computer/core/sort/HgkvFileSorter.java         | 110 ---
 .../baidu/hugegraph/computer/core/sort/Sorter.java | 113 ---
 .../core/sort/flusher/CombinableSorterFlusher.java |  69 --
 .../sort/flusher/CombineKvInnerSortFlusher.java    |  44 -
 .../sort/flusher/CombineKvOuterSortFlusher.java    |  49 --
 .../sort/flusher/CombineSubKvInnerSortFlusher.java | 164 ----
 .../sort/flusher/CombineSubKvOuterSortFlusher.java | 136 ---
 .../core/sort/flusher/InnerSortFlusher.java        |  52 --
 .../core/sort/flusher/KvInnerSortFlusher.java      |  52 --
 .../core/sort/flusher/KvOuterSortFlusher.java      |  42 -
 .../core/sort/flusher/OuterSortFlusher.java        |  56 --
 .../core/sort/flusher/PeekableIterator.java        |  65 --
 .../core/sort/flusher/PeekableIteratorAdaptor.java |  77 --
 .../computer/core/sort/merge/FileMerger.java       |  42 -
 .../computer/core/sort/merge/FileMergerImpl.java   | 122 ---
 .../computer/core/sort/sorter/InputSorter.java     |  32 -
 .../computer/core/sort/sorter/InputsSorter.java    |  33 -
 .../core/sort/sorter/InputsSorterImpl.java         |  70 --
 .../computer/core/sort/sorter/JavaInputSorter.java |  50 --
 .../computer/core/sort/sorter/SubKvSorter.java     | 132 ---
 .../core/sort/sorting/AbstractInputsSorting.java   |  49 --
 .../core/sort/sorting/HeapInputsSorting.java       | 132 ---
 .../computer/core/sort/sorting/InputsSorting.java  |  24 -
 .../core/sort/sorting/LoserTreeInputsSorting.java  | 148 ----
 .../core/sort/sorting/RecvSortManager.java         |  59 --
 .../core/sort/sorting/SendSortManager.java         |  43 -
 .../computer/core/sort/sorting/SortManager.java    | 232 -----
 .../computer/core/sort/sorting/SortingFactory.java |  59 --
 .../computer/core/sort/sorting/SortingMode.java    |  29 -
 .../computer/core/store/EntryIterator.java         |  33 -
 .../computer/core/store/FileGenerator.java         |  68 --
 .../hugegraph/computer/core/store/FileManager.java | 115 ---
 .../computer/core/store/KvEntryFileReader.java     |  24 -
 .../computer/core/store/KvEntryFileWriter.java     |  39 -
 .../computer/core/store/StoreManager.java          |  23 -
 .../core/store/SuperstepFileGenerator.java         |  52 --
 .../computer/core/store/buffer/KvEntriesInput.java |  70 --
 .../store/buffer/KvEntriesWithFirstSubKvInput.java |  53 --
 .../core/store/buffer/SubKvEntriesInput.java       |  75 --
 .../computer/core/store/entry/AbstractKvEntry.java |  46 -
 .../computer/core/store/entry/CachedPointer.java   |  81 --
 .../computer/core/store/entry/DefaultKvEntry.java  |  39 -
 .../computer/core/store/entry/EntriesUtil.java     | 170 ----
 .../computer/core/store/entry/EntryInput.java      |  46 -
 .../computer/core/store/entry/EntryInputImpl.java  |  56 --
 .../computer/core/store/entry/EntryOutput.java     |  46 -
 .../computer/core/store/entry/EntryOutputImpl.java |  67 --
 .../computer/core/store/entry/InlinePointer.java   |  80 --
 .../computer/core/store/entry/KvEntry.java         |  29 -
 .../computer/core/store/entry/KvEntryReader.java   |  31 -
 .../core/store/entry/KvEntryReaderImpl.java        |  61 --
 .../core/store/entry/KvEntryWithFirstSubKv.java    |  42 -
 .../computer/core/store/entry/KvEntryWriter.java   |  31 -
 .../core/store/entry/KvEntryWriterImpl.java        | 123 ---
 .../computer/core/store/entry/Pointer.java         |  34 -
 .../hugegraph/computer/core/store/entry/Range.java |  27 -
 .../file/bufferfile/BufferFileEntryBuilder.java    |  58 --
 .../file/bufferfile/BufferFileEntryReader.java     |  89 --
 .../file/bufferfile/BufferFileSubEntryReader.java  |  83 --
 .../core/store/file/hgkvfile/AbstractHgkvFile.java |  82 --
 .../computer/core/store/file/hgkvfile/HgkvDir.java |  35 -
 .../core/store/file/hgkvfile/HgkvDirImpl.java      | 165 ----
 .../core/store/file/hgkvfile/HgkvFile.java         |  68 --
 .../core/store/file/hgkvfile/HgkvFileImpl.java     | 146 ----
 .../store/file/hgkvfile/builder/BlockBuilder.java  |  37 -
 .../hgkvfile/builder/DataBlockBuilderImpl.java     |  65 --
 .../file/hgkvfile/builder/HgkvDirBuilderImpl.java  | 110 ---
 .../file/hgkvfile/builder/HgkvFileBuilder.java     |  58 --
 .../file/hgkvfile/builder/HgkvFileBuilderImpl.java | 174 ----
 .../file/hgkvfile/builder/IndexBlockBuilder.java   |  31 -
 .../hgkvfile/builder/IndexBlockBuilderImpl.java    |  52 --
 .../hgkvfile/reader/HgkvDir4SubKvReaderImpl.java   |  71 --
 .../file/hgkvfile/reader/HgkvDirReaderImpl.java    | 138 ---
 .../file/hgkvfile/reader/HgkvFileReaderImpl.java   | 110 ---
 .../store/file/select/DefaultSelectedFiles.java    |  45 -
 .../store/file/select/DisperseEvenlySelector.java  | 200 -----
 .../core/store/file/select/InputFilesSelector.java |  41 -
 .../core/store/file/select/SelectedFiles.java      |  29 -
 .../core/store/file/seqfile/BitsFileReader.java    |  35 -
 .../store/file/seqfile/BitsFileReaderImpl.java     |  65 --
 .../core/store/file/seqfile/BitsFileWriter.java    |  44 -
 .../store/file/seqfile/BitsFileWriterImpl.java     |  75 --
 .../core/store/file/seqfile/ValueFile.java         |  80 --
 .../core/store/file/seqfile/ValueFileInput.java    | 205 -----
 .../core/store/file/seqfile/ValueFileOutput.java   | 194 -----
 .../computer/core/util/ComputerContextUtil.java    |  91 --
 .../hugegraph/computer/core/util/Consumers.java    | 217 -----
 .../hugegraph/computer/core/util/FileUtil.java     |  38 -
 .../hugegraph/computer/core/util/JsonUtil.java     |  64 --
 .../computer/core/util/SerializeUtil.java          |  86 --
 .../hugegraph/computer/core/util/ShutdownHook.java |  61 --
 .../computer/core/util/StringEncoding.java         | 171 ----
 .../computer/core/worker/WorkerService.java        | 455 ----------
 .../hugegraph/computer/core/worker/WorkerStat.java | 111 ---
 .../computer/core/worker/load/LoadService.java     | 233 -----
 .../computer/core/aggregator/Aggregators.java      |  81 ++
 .../core/aggregator/DefaultAggregator.java         | 171 ++++
 .../core/aggregator/MasterAggrManager.java         | 156 ++++
 .../core/aggregator/RegisterAggregators.java       |  75 ++
 .../core/aggregator/WorkerAggrManager.java         | 157 ++++
 .../computer/core/allocator/DefaultAllocator.java  |  83 ++
 .../computer/core/allocator/RecycleHandler.java    |  37 +
 .../hugegraph/computer/core/bsp/Bsp4Master.java    | 222 +++++
 .../hugegraph/computer/core/bsp/Bsp4Worker.java    | 258 ++++++
 .../hugegraph/computer/core/bsp/BspBase.java       | 135 +++
 .../hugegraph/computer/core/bsp/BspClient.java     |  78 ++
 .../hugegraph/computer/core/bsp/BspEvent.java      |  56 ++
 .../hugegraph/computer/core/bsp/EtcdBspClient.java |  83 ++
 .../hugegraph/computer/core/bsp/EtcdClient.java    | 484 +++++++++++
 .../core/combiner/AbstractPointerCombiner.java     |  73 ++
 .../computer/core/combiner/EdgeValueCombiner.java  |  34 +
 .../core/combiner/MessageValueCombiner.java        |  36 +
 .../computer/core/combiner/PointerCombiner.java    |  25 +
 .../core/combiner/VertexValueCombiner.java         |  67 ++
 .../computer/core/common/ContainerInfo.java        | 137 +++
 .../core/common/exception/IllegalArgException.java |  45 +
 .../core/common/exception/ReadException.java       |  41 +
 .../core/common/exception/TransportException.java  |  71 ++
 .../core/common/exception/WriteException.java      |  41 +
 .../computer/core/compute/ComputeManager.java      | 206 +++++
 .../computer/core/compute/FileGraphPartition.java  | 445 ++++++++++
 .../computer/core/compute/input/EdgesInput.java    | 291 +++++++
 .../computer/core/compute/input/MessageInput.java  | 127 +++
 .../core/compute/input/ReusablePointer.java        | 106 +++
 .../computer/core/compute/input/VertexInput.java   |  89 ++
 .../computer/core/graph/BuiltinGraphFactory.java   | 201 +++++
 .../computer/core/graph/SuperstepStat.java         | 172 ++++
 .../computer/core/graph/edge/DefaultEdge.java      | 120 +++
 .../computer/core/graph/edge/DefaultEdges.java     |  72 ++
 .../hugegraph/computer/core/graph/id/BytesId.java  | 214 +++++
 .../core/graph/partition/HashPartitioner.java      |  53 ++
 .../core/graph/partition/PartitionStat.java        | 153 ++++
 .../computer/core/graph/partition/Partitioner.java |  41 +
 .../computer/core/graph/vertex/DefaultVertex.java  | 168 ++++
 .../hugegraph/computer/core/input/EdgeFetcher.java |  31 +
 .../computer/core/input/ElementFetcher.java        |  31 +
 .../computer/core/input/GraphFetcher.java          |  33 +
 .../computer/core/input/HugeConverter.java         | 101 +++
 .../hugegraph/computer/core/input/IdUtil.java      |  68 ++
 .../computer/core/input/InputSourceFactory.java    |  57 ++
 .../hugegraph/computer/core/input/InputSplit.java  |  69 ++
 .../computer/core/input/InputSplitFetcher.java     |  42 +
 .../computer/core/input/MasterInputHandler.java    |  67 ++
 .../computer/core/input/MasterInputManager.java    |  64 ++
 .../computer/core/input/VertexFetcher.java         |  31 +
 .../computer/core/input/WorkerInputManager.java    |  97 +++
 .../core/input/filter/DefaultInputFilter.java      |  39 +
 .../filter/ExtractAllPropertyInputFilter.java      |  37 +
 .../computer/core/input/hg/HugeEdgeFetcher.java    |  48 ++
 .../computer/core/input/hg/HugeElementFetcher.java |  90 ++
 .../computer/core/input/hg/HugeGraphFetcher.java   |  72 ++
 .../core/input/hg/HugeInputSplitFetcher.java       |  82 ++
 .../computer/core/input/hg/HugeVertexFetcher.java  |  49 ++
 .../core/input/loader/FileEdgeFetcher.java         |  73 ++
 .../core/input/loader/FileElementFetcher.java      | 141 ++++
 .../computer/core/input/loader/FileInputSplit.java |  86 ++
 .../core/input/loader/FileVertxFetcher.java        |  58 ++
 .../input/loader/LoaderFileInputSplitFetcher.java  | 209 +++++
 .../core/input/loader/LoaderGraphFetcher.java      |  66 ++
 .../core/io/AbstractBufferedFileInput.java         | 163 ++++
 .../core/io/AbstractBufferedFileOutput.java        | 105 +++
 .../computer/core/io/BufferedFileInput.java        | 111 +++
 .../computer/core/io/BufferedFileOutput.java       | 101 +++
 .../computer/core/io/BufferedStreamInput.java      | 182 ++++
 .../computer/core/io/BufferedStreamOutput.java     | 193 +++++
 .../computer/core/io/CsvStructGraphOutput.java     | 140 +++
 .../hugegraph/computer/core/io/IOFactory.java      |  90 ++
 .../computer/core/io/JsonStructGraphOutput.java    | 170 ++++
 .../computer/core/io/OptimizedBytesInput.java      | 237 ++++++
 .../computer/core/io/OptimizedBytesOutput.java     | 215 +++++
 .../hugegraph/computer/core/io/OutputFormat.java   |  29 +
 .../computer/core/io/StreamGraphInput.java         | 164 ++++
 .../computer/core/io/StreamGraphOutput.java        | 144 ++++
 .../computer/core/io/StructGraphOutput.java        | 118 +++
 .../computer/core/io/StructRandomAccessOutput.java | 168 ++++
 .../computer/core/io/UnsafeBytesInput.java         | 286 +++++++
 .../computer/core/io/UnsafeBytesOutput.java        | 269 ++++++
 .../hugegraph/computer/core/manager/Manager.java   |  78 ++
 .../hugegraph/computer/core/manager/Managers.java  |  88 ++
 .../computer/core/master/MasterService.java        | 490 +++++++++++
 .../computer/core/network/ClientFactory.java       |  46 +
 .../computer/core/network/ClientHandler.java       |  29 +
 .../computer/core/network/ConnectionId.java        | 112 +++
 .../computer/core/network/DataClientManager.java   | 129 +++
 .../computer/core/network/DataServerManager.java   |  67 ++
 .../hugegraph/computer/core/network/IOMode.java    |  30 +
 .../computer/core/network/MessageHandler.java      |  49 ++
 .../computer/core/network/TransportClient.java     |  97 +++
 .../computer/core/network/TransportConf.java       | 215 +++++
 .../computer/core/network/TransportHandler.java    |  44 +
 .../computer/core/network/TransportProvider.java   |  27 +
 .../computer/core/network/TransportServer.java     |  61 ++
 .../computer/core/network/TransportState.java      |  30 +
 .../computer/core/network/TransportUtil.java       | 169 ++++
 .../core/network/buffer/FileRegionBuffer.java      | 133 +++
 .../computer/core/network/buffer/NettyBuffer.java  |  77 ++
 .../core/network/buffer/NetworkBuffer.java         |  75 ++
 .../computer/core/network/buffer/NioBuffer.java    |  76 ++
 .../core/network/connection/ConnectionManager.java |  89 ++
 .../connection/TransportConnectionManager.java     | 153 ++++
 .../core/network/message/AbstractMessage.java      | 197 +++++
 .../computer/core/network/message/AckMessage.java  |  46 +
 .../computer/core/network/message/DataMessage.java |  71 ++
 .../computer/core/network/message/FailMessage.java |  88 ++
 .../core/network/message/FinishMessage.java        |  44 +
 .../computer/core/network/message/Message.java     |  67 ++
 .../computer/core/network/message/MessageType.java |  74 ++
 .../computer/core/network/message/PingMessage.java |  40 +
 .../computer/core/network/message/PongMessage.java |  40 +
 .../core/network/message/RequestMessage.java       |  27 +
 .../core/network/message/ResponseMessage.java      |  27 +
 .../core/network/message/StartMessage.java         |  46 +
 .../core/network/netty/AbstractNettyHandler.java   | 146 ++++
 .../core/network/netty/BufAllocatorFactory.java    |  31 +
 .../netty/ChannelFutureListenerOnWrite.java        |  80 ++
 .../core/network/netty/HeartbeatHandler.java       |  91 ++
 .../core/network/netty/NettyClientFactory.java     | 230 +++++
 .../core/network/netty/NettyClientHandler.java     | 118 +++
 .../core/network/netty/NettyEventLoopUtil.java     | 111 +++
 .../computer/core/network/netty/NettyProtocol.java | 205 +++++
 .../core/network/netty/NettyServerHandler.java     | 237 ++++++
 .../core/network/netty/NettyTransportClient.java   | 198 +++++
 .../core/network/netty/NettyTransportProvider.java |  44 +
 .../core/network/netty/NettyTransportServer.java   | 228 +++++
 .../core/network/netty/ServerIdleHandler.java      |  61 ++
 .../core/network/netty/codec/FrameDecoder.java     |  75 ++
 .../core/network/netty/codec/MessageDecoder.java   |  99 +++
 .../core/network/netty/codec/MessageEncoder.java   |  92 ++
 .../network/netty/codec/PreciseFrameDecoder.java   | 100 +++
 .../core/network/session/ClientSession.java        | 281 ++++++
 .../core/network/session/ServerSession.java        | 143 ++++
 .../core/network/session/TransportSession.java     |  79 ++
 .../computer/core/output/LimitedLogOutput.java     |  58 ++
 .../hugegraph/computer/core/output/LogOutput.java  |  44 +
 .../computer/core/output/hdfs/HdfsOutput.java      | 176 ++++
 .../core/output/hdfs/HdfsOutputMerger.java         |  90 ++
 .../core/output/hg/HugeGraphDoubleOutput.java      |  32 +
 .../core/output/hg/HugeGraphFloatOutput.java       |  32 +
 .../computer/core/output/hg/HugeGraphIdOutput.java |  39 +
 .../core/output/hg/HugeGraphIntOutput.java         |  32 +
 .../core/output/hg/HugeGraphLongOutput.java        |  32 +
 .../core/output/hg/HugeGraphStringOutput.java      |  32 +
 .../computer/core/receiver/MessageRecvBuffers.java | 122 +++
 .../computer/core/receiver/MessageRecvManager.java | 253 ++++++
 .../core/receiver/MessageRecvPartition.java        | 228 +++++
 .../core/receiver/MessageRecvPartitions.java       | 115 +++
 .../computer/core/receiver/MessageStat.java        |  51 ++
 .../receiver/edge/EdgeMessageRecvPartition.java    |  63 ++
 .../receiver/edge/EdgeMessageRecvPartitions.java   |  41 +
 .../message/ComputeMessageRecvPartition.java       |  68 ++
 .../message/ComputeMessageRecvPartitions.java      |  41 +
 .../vertex/VertexMessageRecvPartition.java         |  57 ++
 .../vertex/VertexMessageRecvPartitions.java        |  42 +
 .../computer/core/rpc/AggregateRpcService.java     |  39 +
 .../computer/core/rpc/InputSplitRpcService.java    |  29 +
 .../computer/core/rpc/MasterRpcManager.java        |  75 ++
 .../computer/core/rpc/WorkerRpcManager.java        |  72 ++
 .../computer/core/sender/MessageQueue.java         |  60 ++
 .../computer/core/sender/MessageSendBuffers.java   |  77 ++
 .../computer/core/sender/MessageSendManager.java   | 296 +++++++
 .../computer/core/sender/MessageSendPartition.java |  78 ++
 .../computer/core/sender/MessageSender.java        |  42 +
 .../hugegraph/computer/core/sender/MultiQueue.java |  87 ++
 .../computer/core/sender/QueuedMessage.java        |  49 ++
 .../computer/core/sender/QueuedMessageSender.java  | 305 +++++++
 .../computer/core/sender/WriteBuffer.java          |  97 +++
 .../computer/core/sender/WriteBuffers.java         | 135 +++
 .../computer/core/sort/BufferFileSorter.java       | 107 +++
 .../computer/core/sort/DefaultSorter.java          |  85 ++
 .../computer/core/sort/HgkvFileSorter.java         | 110 +++
 .../hugegraph/computer/core/sort/Sorter.java       | 113 +++
 .../core/sort/flusher/CombinableSorterFlusher.java |  69 ++
 .../sort/flusher/CombineKvInnerSortFlusher.java    |  44 +
 .../sort/flusher/CombineKvOuterSortFlusher.java    |  49 ++
 .../sort/flusher/CombineSubKvInnerSortFlusher.java | 164 ++++
 .../sort/flusher/CombineSubKvOuterSortFlusher.java | 136 +++
 .../core/sort/flusher/InnerSortFlusher.java        |  51 ++
 .../core/sort/flusher/KvInnerSortFlusher.java      |  52 ++
 .../core/sort/flusher/KvOuterSortFlusher.java      |  42 +
 .../core/sort/flusher/OuterSortFlusher.java        |  55 ++
 .../core/sort/flusher/PeekableIterator.java        |  65 ++
 .../core/sort/flusher/PeekableIteratorAdaptor.java |  77 ++
 .../computer/core/sort/merge/FileMerger.java       |  42 +
 .../computer/core/sort/merge/FileMergerImpl.java   | 122 +++
 .../computer/core/sort/sorter/InputSorter.java     |  33 +
 .../computer/core/sort/sorter/InputsSorter.java    |  33 +
 .../core/sort/sorter/InputsSorterImpl.java         |  70 ++
 .../computer/core/sort/sorter/JavaInputSorter.java |  50 ++
 .../computer/core/sort/sorter/SubKvSorter.java     | 132 +++
 .../core/sort/sorting/AbstractInputsSorting.java   |  49 ++
 .../core/sort/sorting/HeapInputsSorting.java       | 132 +++
 .../computer/core/sort/sorting/InputsSorting.java  |  24 +
 .../core/sort/sorting/LoserTreeInputsSorting.java  | 148 ++++
 .../core/sort/sorting/RecvSortManager.java         |  59 ++
 .../core/sort/sorting/SendSortManager.java         |  43 +
 .../computer/core/sort/sorting/SortManager.java    | 231 +++++
 .../computer/core/sort/sorting/SortingFactory.java |  59 ++
 .../computer/core/sort/sorting/SortingMode.java    |  29 +
 .../computer/core/store/EntryIterator.java         |  32 +
 .../computer/core/store/FileGenerator.java         |  68 ++
 .../hugegraph/computer/core/store/FileManager.java | 114 +++
 .../computer/core/store/KvEntryFileReader.java     |  24 +
 .../computer/core/store/KvEntryFileWriter.java     |  39 +
 .../computer/core/store/StoreManager.java          |  23 +
 .../core/store/SuperstepFileGenerator.java         |  52 ++
 .../computer/core/store/buffer/KvEntriesInput.java |  70 ++
 .../store/buffer/KvEntriesWithFirstSubKvInput.java |  53 ++
 .../core/store/buffer/SubKvEntriesInput.java       |  75 ++
 .../computer/core/store/entry/AbstractKvEntry.java |  46 +
 .../computer/core/store/entry/CachedPointer.java   |  81 ++
 .../computer/core/store/entry/DefaultKvEntry.java  |  39 +
 .../computer/core/store/entry/EntriesUtil.java     | 170 ++++
 .../computer/core/store/entry/EntryInput.java      |  46 +
 .../computer/core/store/entry/EntryInputImpl.java  |  56 ++
 .../computer/core/store/entry/EntryOutput.java     |  46 +
 .../computer/core/store/entry/EntryOutputImpl.java |  67 ++
 .../computer/core/store/entry/InlinePointer.java   |  80 ++
 .../computer/core/store/entry/KvEntry.java         |  29 +
 .../computer/core/store/entry/KvEntryReader.java   |  31 +
 .../core/store/entry/KvEntryReaderImpl.java        |  61 ++
 .../core/store/entry/KvEntryWithFirstSubKv.java    |  42 +
 .../computer/core/store/entry/KvEntryWriter.java   |  31 +
 .../core/store/entry/KvEntryWriterImpl.java        | 123 +++
 .../computer/core/store/entry/Pointer.java         |  34 +
 .../hugegraph/computer/core/store/entry/Range.java |  27 +
 .../file/bufferfile/BufferFileEntryBuilder.java    |  58 ++
 .../file/bufferfile/BufferFileEntryReader.java     |  89 ++
 .../file/bufferfile/BufferFileSubEntryReader.java  |  83 ++
 .../core/store/file/hgkvfile/AbstractHgkvFile.java |  82 ++
 .../computer/core/store/file/hgkvfile/HgkvDir.java |  35 +
 .../core/store/file/hgkvfile/HgkvDirImpl.java      | 165 ++++
 .../core/store/file/hgkvfile/HgkvFile.java         |  68 ++
 .../core/store/file/hgkvfile/HgkvFileImpl.java     | 146 ++++
 .../store/file/hgkvfile/builder/BlockBuilder.java  |  37 +
 .../hgkvfile/builder/DataBlockBuilderImpl.java     |  65 ++
 .../file/hgkvfile/builder/HgkvDirBuilderImpl.java  | 109 +++
 .../file/hgkvfile/builder/HgkvFileBuilder.java     |  58 ++
 .../file/hgkvfile/builder/HgkvFileBuilderImpl.java | 174 ++++
 .../file/hgkvfile/builder/IndexBlockBuilder.java   |  31 +
 .../hgkvfile/builder/IndexBlockBuilderImpl.java    |  52 ++
 .../hgkvfile/reader/HgkvDir4SubKvReaderImpl.java   |  71 ++
 .../file/hgkvfile/reader/HgkvDirReaderImpl.java    | 138 +++
 .../file/hgkvfile/reader/HgkvFileReaderImpl.java   | 110 +++
 .../store/file/select/DefaultSelectedFiles.java    |  45 +
 .../store/file/select/DisperseEvenlySelector.java  | 201 +++++
 .../core/store/file/select/InputFilesSelector.java |  41 +
 .../core/store/file/select/SelectedFiles.java      |  29 +
 .../core/store/file/seqfile/BitsFileReader.java    |  35 +
 .../store/file/seqfile/BitsFileReaderImpl.java     |  66 ++
 .../core/store/file/seqfile/BitsFileWriter.java    |  44 +
 .../store/file/seqfile/BitsFileWriterImpl.java     |  76 ++
 .../core/store/file/seqfile/ValueFile.java         |  81 ++
 .../core/store/file/seqfile/ValueFileInput.java    | 204 +++++
 .../core/store/file/seqfile/ValueFileOutput.java   | 194 +++++
 .../computer/core/util/ComputerContextUtil.java    |  91 ++
 .../hugegraph/computer/core/util/Consumers.java    | 216 +++++
 .../hugegraph/computer/core/util/FileUtil.java     |  38 +
 .../hugegraph/computer/core/util/JsonUtil.java     |  65 ++
 .../computer/core/util/SerializeUtil.java          |  86 ++
 .../hugegraph/computer/core/util/ShutdownHook.java |  61 ++
 .../computer/core/util/StringEncoding.java         | 172 ++++
 .../computer/core/worker/WorkerService.java        | 454 ++++++++++
 .../hugegraph/computer/core/worker/WorkerStat.java | 111 +++
 .../computer/core/worker/load/LoadService.java     | 233 +++++
 computer-dist/pom.xml                              |   4 +-
 .../src/assembly/static/bin/start-computer.sh      |   2 +-
 .../src/assembly/static/conf/computer.properties   |   2 +-
 computer-dist/src/assembly/static/conf/log4j2.xml  |   2 +-
 .../hugegraph/computer/dist/HugeGraphComputer.java | 153 ----
 .../hugegraph/computer/dist/HugeGraphComputer.java | 152 ++++
 computer-driver/pom.xml                            |   4 +-
 .../hugegraph/computer/driver/ComputerDriver.java  | 106 ---
 .../computer/driver/ComputerDriverException.java   |  57 --
 .../hugegraph/computer/driver/DefaultJobState.java |  92 --
 .../hugegraph/computer/driver/JobObserver.java     |  28 -
 .../baidu/hugegraph/computer/driver/JobState.java  |  45 -
 .../baidu/hugegraph/computer/driver/JobStatus.java |  41 -
 .../hugegraph/computer/driver/SuperstepStat.java   | 122 ---
 .../computer/driver/config/DriverConfigOption.java |  75 --
 .../hugegraph/computer/driver/util/JsonUtil.java   |  60 --
 .../hugegraph/computer/driver/ComputerDriver.java  | 106 +++
 .../computer/driver/ComputerDriverException.java   |  57 ++
 .../hugegraph/computer/driver/DefaultJobState.java |  92 ++
 .../hugegraph/computer/driver/JobObserver.java     |  28 +
 .../apache/hugegraph/computer/driver/JobState.java |  44 +
 .../hugegraph/computer/driver/JobStatus.java       |  41 +
 .../hugegraph/computer/driver/SuperstepStat.java   | 122 +++
 .../computer/driver/config/DriverConfigOption.java |  75 ++
 .../hugegraph/computer/driver/util/JsonUtil.java   |  61 ++
 computer-k8s-operator/README.md                    |   6 +-
 computer-k8s-operator/crd-generate/Makefile        |   4 +-
 .../crd-generate/api/v1/groupversion_info.go       |  28 +-
 .../api/v1/hugegraphcomputerjob_types.go           | 162 ++--
 computer-k8s-operator/crd-generate/cmd/generate.go | 146 ++--
 .../crd-generate/config/crd/kustomization.yaml     |   4 +-
 .../crd-generate/config/rbac/role.yaml             |   6 +-
 computer-k8s-operator/crd-generate/go.mod          |   2 +-
 computer-k8s-operator/crd-generate/go.sum          |   2 +
 .../manifest/hugegraph-computer-crd.v1.yaml        |   4 +-
 .../manifest/hugegraph-computer-crd.v1beta1.yaml   |   4 +-
 .../manifest/hugegraph-computer-operator.yaml      |   6 +-
 computer-k8s-operator/pom.xml                      |   6 +-
 .../computer/k8s/operator/OperatorEntrypoint.java  | 254 ------
 .../k8s/operator/common/AbstractController.java    | 440 ----------
 .../computer/k8s/operator/common/MatchWithMsg.java |  41 -
 .../k8s/operator/common/OperatorRequest.java       | 114 ---
 .../k8s/operator/common/OperatorResult.java        |  60 --
 .../computer/k8s/operator/common/WorkQueue.java    | 120 ---
 .../k8s/operator/config/OperatorOptions.java       | 147 ----
 .../operator/controller/ComputerJobComponent.java  |  86 --
 .../operator/controller/ComputerJobController.java | 564 -------------
 .../operator/controller/ComputerJobDeployer.java   | 648 --------------
 .../computer/k8s/operator/OperatorEntrypoint.java  | 254 ++++++
 .../k8s/operator/common/AbstractController.java    | 440 ++++++++++
 .../computer/k8s/operator/common/MatchWithMsg.java |  41 +
 .../k8s/operator/common/OperatorRequest.java       | 113 +++
 .../k8s/operator/common/OperatorResult.java        |  60 ++
 .../computer/k8s/operator/common/WorkQueue.java    | 120 +++
 .../k8s/operator/config/OperatorOptions.java       | 147 ++++
 .../operator/controller/ComputerJobComponent.java  |  86 ++
 .../operator/controller/ComputerJobController.java | 564 +++++++++++++
 .../operator/controller/ComputerJobDeployer.java   | 648 ++++++++++++++
 .../src/main/resources/log4j2.xml                  |   2 +-
 computer-k8s/pom.xml                               |  14 +-
 computer-k8s/schema/crd-schema.json                | 108 +--
 computer-k8s/schema/enum-schema.json               |  16 +-
 .../baidu/hugegraph/computer/k8s/Constants.java    |  67 --
 .../computer/k8s/config/KubeDriverOptions.java     | 160 ----
 .../computer/k8s/config/KubeSpecOptions.java       | 214 -----
 .../k8s/crd/model/HugeGraphComputerJob.java        |  62 --
 .../k8s/crd/model/HugeGraphComputerJobList.java    |  28 -
 .../computer/k8s/driver/KubernetesDriver.java      | 578 -------------
 .../hugegraph/computer/k8s/util/KubeUtil.java      | 281 ------
 .../apache/hugegraph/computer/k8s/Constants.java   |  67 ++
 .../computer/k8s/config/KubeDriverOptions.java     | 159 ++++
 .../computer/k8s/config/KubeSpecOptions.java       | 215 +++++
 .../k8s/crd/model/HugeGraphComputerJob.java        |  62 ++
 .../k8s/crd/model/HugeGraphComputerJobList.java    |  28 +
 .../computer/k8s/driver/KubernetesDriver.java      | 577 +++++++++++++
 .../hugegraph/computer/k8s/util/KubeUtil.java      | 280 ++++++
 computer-test/conf/log4j2-test.xml                 |   2 +-
 computer-test/pom.xml                              |  18 +-
 .../computer/algorithm/AlgorithmTestBase.java      | 152 ----
 .../computer/algorithm/AlgorithmTestSuite.java     |  52 --
 .../betweenness/BetweennessCentralityTest.java     | 146 ----
 .../closeness/ClosenessCentralityTest.java         | 165 ----
 .../centrality/degree/DegreeCentralityTest.java    | 102 ---
 .../centrality/pagerank/PageRankTest.java          |  32 -
 .../community/cc/ClusteringCoefficientTest.java    | 133 ---
 .../algorithm/community/kcore/KcoreTest.java       |  32 -
 .../computer/algorithm/community/lpa/LpaTest.java  |  32 -
 .../community/trianglecount/TriangleCountTest.java | 134 ---
 .../computer/algorithm/community/wcc/WccTest.java  |  38 -
 .../algorithm/path/rings/RingsDetectionTest.java   | 136 ---
 .../path/rings/RingsDetectionWithFilterTest.java   | 136 ---
 .../core/allocator/AllocatorTestSuite.java         |  31 -
 .../core/allocator/DefaultAllocatorTest.java       | 168 ----
 .../computer/core/allocator/RecyclersTest.java     | 180 ----
 .../hugegraph/computer/core/bsp/BspEventTest.java  |  45 -
 .../hugegraph/computer/core/bsp/BspTestSuite.java  |  31 -
 .../hugegraph/computer/core/bsp/EtcdBspTest.java   | 190 -----
 .../computer/core/bsp/EtcdClientTest.java          | 268 ------
 .../computer/core/combiner/CombinerTestSuite.java  |  39 -
 .../core/combiner/DoubleValueSumCombinerTest.java  |  66 --
 .../core/combiner/FloatValueSumCombinerTest.java   |  66 --
 .../core/combiner/IntValueSumCombinerTest.java     |  66 --
 .../core/combiner/LongValueSumCombinerTest.java    |  66 --
 .../combiner/MergeNewPropertiesCombinerTest.java   |  85 --
 .../combiner/MergeOldPropertiesCombinerTest.java   |  85 --
 .../core/combiner/OverwriteCombinerTest.java       |  67 --
 .../core/combiner/PointerCombinerTest.java         | 176 ----
 .../core/combiner/ValueMaxCombinerTest.java        |  66 --
 .../core/combiner/ValueMinCombinerTest.java        |  59 --
 .../computer/core/common/CommonTestSuite.java      |  31 -
 .../computer/core/common/ContainerInfoTest.java    |  73 --
 .../computer/core/common/ExceptionTest.java        |  77 --
 .../core/common/FakeMasterComputation.java         |  48 --
 .../computer/core/compute/ComputeManagerTest.java  | 235 ------
 .../computer/core/compute/ComputeTestSuite.java    |  37 -
 .../computer/core/compute/MockComputation.java     |  85 --
 .../computer/core/compute/MockMessageSender.java   |  41 -
 .../core/compute/input/EdgesInputTest.java         | 285 -------
 .../core/compute/input/MessageInputTest.java       | 177 ----
 .../core/compute/input/ResuablePointerTest.java    |  55 --
 .../computer/core/config/ConfigTestSuite.java      |  30 -
 .../computer/core/config/DefaultConfigTest.java    | 190 -----
 .../core/graph/BuiltinGraphFactoryTest.java        | 105 ---
 .../computer/core/graph/DefaultEdgeTest.java       |  91 --
 .../computer/core/graph/DefaultPropertiesTest.java |  97 ---
 .../computer/core/graph/GraphTestSuite.java        |  71 --
 .../computer/core/graph/SuperstepStatTest.java     | 165 ----
 .../computer/core/graph/id/BytesIdTest.java        | 180 ----
 .../computer/core/graph/id/IdFactoryTest.java      |  57 --
 .../computer/core/graph/id/IdTypeTest.java         |  52 --
 .../core/graph/partition/HashPartitionerTest.java  | 211 -----
 .../core/graph/partition/PartitionStatTest.java    | 151 ----
 .../core/graph/value/BooleanValueTest.java         | 192 -----
 .../computer/core/graph/value/DoubleValueTest.java | 253 ------
 .../computer/core/graph/value/FloatValueTest.java  | 227 -----
 .../computer/core/graph/value/IdListListTest.java  | 103 ---
 .../computer/core/graph/value/IdValueListTest.java |  87 --
 .../computer/core/graph/value/IdValueTest.java     | 219 -----
 .../computer/core/graph/value/IntValueTest.java    | 259 ------
 .../computer/core/graph/value/ListValueTest.java   | 432 ----------
 .../computer/core/graph/value/LongValueTest.java   | 225 -----
 .../computer/core/graph/value/NullValueTest.java   | 152 ----
 .../computer/core/graph/value/StringValueTest.java | 161 ----
 .../computer/core/graph/value/ValueTypeTest.java   |  64 --
 .../computer/core/input/FileInputSplitTest.java    |  68 --
 .../computer/core/input/HugeConverterTest.java     | 131 ---
 .../computer/core/input/InputSplitDataTest.java    | 100 ---
 .../computer/core/input/InputSplitTest.java        |  54 --
 .../computer/core/input/InputTestSuite.java        |  33 -
 .../core/input/MockMasterInputManager.java         |  60 --
 .../computer/core/input/MockRpcClient.java         |  41 -
 .../core/input/MockWorkerInputManager.java         | 116 ---
 .../computer/core/io/BufferedFileTest.java         | 754 -----------------
 .../computer/core/io/BufferedStreamTest.java       | 410 ---------
 .../computer/core/io/CsvStructGraphOutputTest.java | 166 ----
 .../hugegraph/computer/core/io/IOTestSuite.java    |  38 -
 .../core/io/JsonStructGraphOutputTest.java         | 177 ----
 .../computer/core/io/MockRankComputation.java      |  52 --
 .../computer/core/io/OptimizedUnsafeBytesTest.java | 192 -----
 .../core/io/StreamGraphOutputInputTest.java        | 271 ------
 .../core/io/StructRandomAccessOutputTest.java      | 248 ------
 .../computer/core/io/UnsafeBytesTest.java          | 613 --------------
 .../computer/core/network/ConnectionIdTest.java    |  78 --
 .../core/network/DataServerManagerTest.java        |  82 --
 .../computer/core/network/MockClientHandler.java   |  53 --
 .../computer/core/network/MockMessageHandler.java  |  89 --
 .../computer/core/network/MockUnDecodeMessage.java |  49 --
 .../computer/core/network/NetworkTestSuite.java    |  49 --
 .../computer/core/network/TransportUtilTest.java   | 129 ---
 .../core/network/buffer/NetworkBufferTest.java     | 157 ----
 .../network/connection/ConnectionManagerTest.java  | 147 ----
 .../core/network/netty/AbstractNetworkTest.java    | 145 ----
 .../core/network/netty/HeartbeatHandlerTest.java   | 136 ---
 .../core/network/netty/NettyClientFactoryTest.java | 136 ---
 .../netty/NettyEncodeDecodeHandlerTest.java        | 171 ----
 .../network/netty/NettyTransportClientTest.java    | 380 ---------
 .../network/netty/NettyTransportServerTest.java    | 245 ------
 .../core/network/session/TransportSessionTest.java | 344 --------
 .../core/receiver/MessageRecvBuffersTest.java      | 187 ----
 .../core/receiver/MessageRecvManagerTest.java      | 165 ----
 .../computer/core/receiver/ReceiverTestSuite.java  |  38 -
 .../computer/core/receiver/ReceiverUtil.java       |  82 --
 .../edge/EdgeMessageRecvPartitionTest.java         | 280 ------
 .../message/ComputeMessageRecvPartitionTest.java   | 191 -----
 .../vertex/VertexMessageRecvPartitionTest.java     | 279 ------
 .../computer/core/sender/MessageQueueTest.java     |  66 --
 .../core/sender/MessageSendBuffersTest.java        |  66 --
 .../core/sender/MessageSendManagerTest.java        |  30 -
 .../computer/core/sender/MockTransportClient.java  |  94 ---
 .../computer/core/sender/MultiQueueTest.java       | 249 ------
 .../core/sender/QueuedMessageSenderTest.java       |  69 --
 .../computer/core/sender/QueuedMessageTest.java    |  39 -
 .../computer/core/sender/SenderTestSuite.java      |  37 -
 .../computer/core/sender/WriteBufferTest.java      | 194 -----
 .../computer/core/sender/WriteBuffersTest.java     | 262 ------
 .../computer/core/sort/SorterTestUtil.java         | 178 ----
 .../core/sort/combiner/MockIntSumCombiner.java     |  31 -
 .../core/sort/sorter/EmptyFlusherTest.java         |  50 --
 .../computer/core/sort/sorter/FlusherTest.java     | 157 ----
 .../core/sort/sorter/SortLargeDataTest.java        | 333 --------
 .../computer/core/sort/sorter/SorterTest.java      | 491 -----------
 .../computer/core/sort/sorter/SorterTestSuite.java |  33 -
 .../core/sort/sorting/InputsSortingTest.java       |  75 --
 .../core/sort/sorting/SortingTestSuite.java        |  31 -
 .../computer/core/sort/sorting/TestData.java       | 142 ----
 .../hugegraph/computer/core/store/BitFileTest.java |  95 ---
 .../computer/core/store/EntriesUtilTest.java       | 116 ---
 .../computer/core/store/EntryOutputTest.java       | 185 ----
 .../computer/core/store/FileManagerTest.java       | 110 ---
 .../hugegraph/computer/core/store/HgkvDirTest.java | 146 ----
 .../computer/core/store/HgkvFileTest.java          | 157 ----
 .../hugegraph/computer/core/store/PointerTest.java |  94 ---
 .../computer/core/store/StoreTestSuite.java        |  37 -
 .../computer/core/store/StoreTestUtil.java         | 187 ----
 .../computer/core/store/ValueFileTest.java         | 492 -----------
 .../core/util/ComputerContextUtilTest.java         |  74 --
 .../hugegraph/computer/core/util/JsonUtilTest.java |  54 --
 .../computer/core/util/SerializeUtilTest.java      |  56 --
 .../computer/core/util/UtilTestSuite.java          |  32 -
 .../computer/core/worker/MockComputation.java      | 407 ---------
 .../computer/core/worker/MockComputation2.java     |  57 --
 .../core/worker/MockComputationParams.java         |  47 --
 .../core/worker/MockMasterComputation.java         | 391 ---------
 .../core/worker/MockMasterComputation2.java        |  96 ---
 .../computer/core/worker/MockWorkerService.java    |  33 -
 .../computer/core/worker/WorkerServiceTest.java    | 269 ------
 .../computer/core/worker/WorkerStatTest.java       | 118 ---
 .../computer/core/worker/WorkerTestSuite.java      |  31 -
 .../computer/dist/ComputerDistTestSuite.java       |  29 -
 .../computer/dist/HugeGraphComputerTest.java       | 106 ---
 .../computer/driver/ComputerOptionsTest.java       |  91 --
 .../hugegraph/computer/driver/DriverTest.java      |  88 --
 .../hugegraph/computer/driver/DriverTestSuite.java |  31 -
 .../hugegraph/computer/k8s/AbstractK8sTest.java    | 216 -----
 .../baidu/hugegraph/computer/k8s/K8sTestSuite.java |  32 -
 .../computer/k8s/KubernetesDriverTest.java         | 321 -------
 .../baidu/hugegraph/computer/k8s/MiniKubeTest.java | 446 ----------
 .../baidu/hugegraph/computer/k8s/OperatorTest.java |  59 --
 .../suite/integrate/IntegrateTestSuite.java        |  57 --
 .../computer/suite/integrate/MockComputation.java  |  51 --
 .../suite/integrate/SenderIntegrateTest.java       | 431 ----------
 .../computer/suite/unit/UnitTestBase.java          | 297 -------
 .../computer/suite/unit/UnitTestSuite.java         |  71 --
 .../computer/algorithm/AlgorithmTestBase.java      | 151 ++++
 .../computer/algorithm/AlgorithmTestSuite.java     |  51 ++
 .../betweenness/BetweennessCentralityTest.java     | 144 ++++
 .../closeness/ClosenessCentralityTest.java         | 165 ++++
 .../centrality/degree/DegreeCentralityTest.java    | 102 +++
 .../centrality/pagerank/PageRankTest.java          |  31 +
 .../community/cc/ClusteringCoefficientTest.java    | 133 +++
 .../algorithm/community/kcore/KcoreTest.java       |  31 +
 .../computer/algorithm/community/lpa/LpaTest.java  |  31 +
 .../community/trianglecount/TriangleCountTest.java | 134 +++
 .../computer/algorithm/community/wcc/WccTest.java  |  37 +
 .../algorithm/path/rings/RingsDetectionTest.java   | 136 +++
 .../path/rings/RingsDetectionWithFilterTest.java   | 136 +++
 .../core/allocator/AllocatorTestSuite.java         |  31 +
 .../core/allocator/DefaultAllocatorTest.java       | 167 ++++
 .../computer/core/allocator/RecyclersTest.java     | 179 ++++
 .../hugegraph/computer/core/bsp/BspEventTest.java  |  44 +
 .../hugegraph/computer/core/bsp/BspTestSuite.java  |  31 +
 .../hugegraph/computer/core/bsp/EtcdBspTest.java   | 189 +++++
 .../computer/core/bsp/EtcdClientTest.java          | 267 ++++++
 .../computer/core/combiner/CombinerTestSuite.java  |  39 +
 .../core/combiner/DoubleValueSumCombinerTest.java  |  65 ++
 .../core/combiner/FloatValueSumCombinerTest.java   |  65 ++
 .../core/combiner/IntValueSumCombinerTest.java     |  65 ++
 .../core/combiner/LongValueSumCombinerTest.java    |  65 ++
 .../combiner/MergeNewPropertiesCombinerTest.java   |  84 ++
 .../combiner/MergeOldPropertiesCombinerTest.java   |  84 ++
 .../core/combiner/OverwriteCombinerTest.java       |  66 ++
 .../core/combiner/PointerCombinerTest.java         | 175 ++++
 .../core/combiner/ValueMaxCombinerTest.java        |  65 ++
 .../core/combiner/ValueMinCombinerTest.java        |  58 ++
 .../computer/core/common/CommonTestSuite.java      |  31 +
 .../computer/core/common/ContainerInfoTest.java    |  72 ++
 .../computer/core/common/ExceptionTest.java        |  76 ++
 .../core/common/FakeMasterComputation.java         |  48 ++
 .../computer/core/compute/ComputeManagerTest.java  | 234 +++++
 .../computer/core/compute/ComputeTestSuite.java    |  36 +
 .../computer/core/compute/MockComputation.java     |  84 ++
 .../computer/core/compute/MockMessageSender.java   |  41 +
 .../core/compute/input/EdgesInputTest.java         | 284 +++++++
 .../core/compute/input/MessageInputTest.java       | 176 ++++
 .../core/compute/input/ResuablePointerTest.java    |  54 ++
 .../computer/core/config/ConfigTestSuite.java      |  30 +
 .../computer/core/config/DefaultConfigTest.java    | 189 +++++
 .../core/graph/BuiltinGraphFactoryTest.java        | 104 +++
 .../computer/core/graph/DefaultEdgeTest.java       |  90 ++
 .../computer/core/graph/DefaultPropertiesTest.java |  96 +++
 .../computer/core/graph/GraphTestSuite.java        |  70 ++
 .../computer/core/graph/SuperstepStatTest.java     | 164 ++++
 .../computer/core/graph/id/BytesIdTest.java        | 179 ++++
 .../computer/core/graph/id/IdFactoryTest.java      |  56 ++
 .../computer/core/graph/id/IdTypeTest.java         |  51 ++
 .../core/graph/partition/HashPartitionerTest.java  | 210 +++++
 .../core/graph/partition/PartitionStatTest.java    | 150 ++++
 .../core/graph/value/BooleanValueTest.java         | 191 +++++
 .../computer/core/graph/value/DoubleValueTest.java | 252 ++++++
 .../computer/core/graph/value/FloatValueTest.java  | 226 +++++
 .../computer/core/graph/value/IdListListTest.java  | 103 +++
 .../computer/core/graph/value/IdValueListTest.java |  87 ++
 .../computer/core/graph/value/IdValueTest.java     | 218 +++++
 .../computer/core/graph/value/IntValueTest.java    | 258 ++++++
 .../computer/core/graph/value/ListValueTest.java   | 431 ++++++++++
 .../computer/core/graph/value/LongValueTest.java   | 224 +++++
 .../computer/core/graph/value/NullValueTest.java   | 151 ++++
 .../computer/core/graph/value/StringValueTest.java | 160 ++++
 .../computer/core/graph/value/ValueTypeTest.java   |  63 ++
 .../computer/core/input/FileInputSplitTest.java    |  67 ++
 .../computer/core/input/HugeConverterTest.java     | 131 +++
 .../computer/core/input/InputSplitDataTest.java    |  99 +++
 .../computer/core/input/InputSplitTest.java        |  53 ++
 .../computer/core/input/InputTestSuite.java        |  33 +
 .../core/input/MockMasterInputManager.java         |  60 ++
 .../computer/core/input/MockRpcClient.java         |  41 +
 .../core/input/MockWorkerInputManager.java         | 116 +++
 .../computer/core/io/BufferedFileTest.java         | 753 +++++++++++++++++
 .../computer/core/io/BufferedStreamTest.java       | 409 +++++++++
 .../computer/core/io/CsvStructGraphOutputTest.java | 165 ++++
 .../hugegraph/computer/core/io/IOTestSuite.java    |  38 +
 .../core/io/JsonStructGraphOutputTest.java         | 176 ++++
 .../computer/core/io/MockRankComputation.java      |  52 ++
 .../computer/core/io/OptimizedUnsafeBytesTest.java | 191 +++++
 .../core/io/StreamGraphOutputInputTest.java        | 270 ++++++
 .../core/io/StructRandomAccessOutputTest.java      | 247 ++++++
 .../computer/core/io/UnsafeBytesTest.java          | 612 ++++++++++++++
 .../computer/core/network/ConnectionIdTest.java    |  77 ++
 .../core/network/DataServerManagerTest.java        |  81 ++
 .../computer/core/network/MockClientHandler.java   |  52 ++
 .../computer/core/network/MockMessageHandler.java  |  88 ++
 .../computer/core/network/MockUnDecodeMessage.java |  49 ++
 .../computer/core/network/NetworkTestSuite.java    |  48 ++
 .../computer/core/network/TransportUtilTest.java   | 128 +++
 .../core/network/buffer/NetworkBufferTest.java     | 156 ++++
 .../network/connection/ConnectionManagerTest.java  | 146 ++++
 .../core/network/netty/AbstractNetworkTest.java    | 144 ++++
 .../core/network/netty/HeartbeatHandlerTest.java   | 135 +++
 .../core/network/netty/NettyClientFactoryTest.java | 135 +++
 .../netty/NettyEncodeDecodeHandlerTest.java        | 170 ++++
 .../network/netty/NettyTransportClientTest.java    | 379 +++++++++
 .../network/netty/NettyTransportServerTest.java    | 244 ++++++
 .../core/network/session/TransportSessionTest.java | 343 ++++++++
 .../core/receiver/MessageRecvBuffersTest.java      | 186 ++++
 .../core/receiver/MessageRecvManagerTest.java      | 164 ++++
 .../computer/core/receiver/ReceiverTestSuite.java  |  37 +
 .../computer/core/receiver/ReceiverUtil.java       |  82 ++
 .../edge/EdgeMessageRecvPartitionTest.java         | 279 ++++++
 .../message/ComputeMessageRecvPartitionTest.java   | 190 +++++
 .../vertex/VertexMessageRecvPartitionTest.java     | 278 ++++++
 .../computer/core/sender/MessageQueueTest.java     |  65 ++
 .../core/sender/MessageSendBuffersTest.java        |  65 ++
 .../core/sender/MessageSendManagerTest.java        |  30 +
 .../computer/core/sender/MockTransportClient.java  |  94 +++
 .../computer/core/sender/MultiQueueTest.java       | 249 ++++++
 .../core/sender/QueuedMessageSenderTest.java       |  69 ++
 .../computer/core/sender/QueuedMessageTest.java    |  38 +
 .../computer/core/sender/SenderTestSuite.java      |  37 +
 .../computer/core/sender/WriteBufferTest.java      | 194 +++++
 .../computer/core/sender/WriteBuffersTest.java     | 262 ++++++
 .../computer/core/sort/SorterTestUtil.java         | 178 ++++
 .../core/sort/combiner/MockIntSumCombiner.java     |  31 +
 .../core/sort/sorter/EmptyFlusherTest.java         |  49 ++
 .../computer/core/sort/sorter/FlusherTest.java     | 157 ++++
 .../core/sort/sorter/SortLargeDataTest.java        | 333 ++++++++
 .../computer/core/sort/sorter/SorterTest.java      | 492 +++++++++++
 .../computer/core/sort/sorter/SorterTestSuite.java |  33 +
 .../core/sort/sorting/InputsSortingTest.java       |  75 ++
 .../core/sort/sorting/SortingTestSuite.java        |  31 +
 .../computer/core/sort/sorting/TestData.java       | 143 ++++
 .../hugegraph/computer/core/store/BitFileTest.java |  94 +++
 .../computer/core/store/EntriesUtilTest.java       | 115 +++
 .../computer/core/store/EntryOutputTest.java       | 185 ++++
 .../computer/core/store/FileManagerTest.java       | 109 +++
 .../hugegraph/computer/core/store/HgkvDirTest.java | 146 ++++
 .../computer/core/store/HgkvFileTest.java          | 157 ++++
 .../hugegraph/computer/core/store/PointerTest.java |  93 ++
 .../computer/core/store/StoreTestSuite.java        |  37 +
 .../computer/core/store/StoreTestUtil.java         | 186 ++++
 .../computer/core/store/ValueFileTest.java         | 491 +++++++++++
 .../core/util/ComputerContextUtilTest.java         |  74 ++
 .../hugegraph/computer/core/util/JsonUtilTest.java |  53 ++
 .../computer/core/util/SerializeUtilTest.java      |  56 ++
 .../computer/core/util/UtilTestSuite.java          |  32 +
 .../computer/core/worker/MockComputation.java      | 407 +++++++++
 .../computer/core/worker/MockComputation2.java     |  57 ++
 .../core/worker/MockComputationParams.java         |  47 ++
 .../core/worker/MockMasterComputation.java         | 391 +++++++++
 .../core/worker/MockMasterComputation2.java        |  96 +++
 .../computer/core/worker/MockWorkerService.java    |  33 +
 .../computer/core/worker/WorkerServiceTest.java    | 268 ++++++
 .../computer/core/worker/WorkerStatTest.java       | 117 +++
 .../computer/core/worker/WorkerTestSuite.java      |  31 +
 .../computer/dist/ComputerDistTestSuite.java       |  29 +
 .../computer/dist/HugeGraphComputerTest.java       | 105 +++
 .../computer/driver/ComputerOptionsTest.java       |  90 ++
 .../hugegraph/computer/driver/DriverTest.java      |  87 ++
 .../hugegraph/computer/driver/DriverTestSuite.java |  31 +
 .../hugegraph/computer/k8s/AbstractK8sTest.java    | 215 +++++
 .../hugegraph/computer/k8s/K8sTestSuite.java       |  32 +
 .../computer/k8s/KubernetesDriverTest.java         | 320 +++++++
 .../hugegraph/computer/k8s/MiniKubeTest.java       | 446 ++++++++++
 .../hugegraph/computer/k8s/OperatorTest.java       |  58 ++
 .../suite/integrate/IntegrateTestSuite.java        |  56 ++
 .../computer/suite/integrate/MockComputation.java  |  51 ++
 .../suite/integrate/SenderIntegrateTest.java       | 430 ++++++++++
 .../computer/suite/unit/UnitTestBase.java          | 296 +++++++
 .../computer/suite/unit/UnitTestSuite.java         |  71 ++
 .../src/main/resources/computer.properties         |   8 +-
 computer-test/src/main/resources/log4j2.xml        |   2 +-
 computer-yarn/pom.xml                              |   2 +-
 pom.xml                                            |   4 +-
 1198 files changed, 64870 insertions(+), 65016 deletions(-)

diff --git a/README.md b/README.md
index db1430c7..73f1e7a1 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# hugegraph-computer
+# Apache HugeGraph Computer
 
 [![License](https://img.shields.io/badge/license-Apache%202-0E78BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html)
 [![Build Status](https://github.com/apache/hugegraph-computer/actions/workflows/ci.yml/badge.svg)](https://github.com/apache/hugegraph-computer/actions/workflows/ci.yml)
diff --git a/computer-algorithm/pom.xml b/computer-algorithm/pom.xml
index b35c7eed..abbf0525 100644
--- a/computer-algorithm/pom.xml
+++ b/computer-algorithm/pom.xml
@@ -20,7 +20,7 @@
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <artifactId>hugegraph-computer</artifactId>
-        <groupId>com.baidu.hugegraph</groupId>
+        <groupId>org.apache.hugegraph</groupId>
         <version>0.1.4</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
@@ -29,7 +29,7 @@
 
     <dependencies>
         <dependency>
-            <groupId>com.baidu.hugegraph</groupId>
+            <groupId>org.apache.hugegraph</groupId>
             <artifactId>computer-api</artifactId>
             <version>${version}</version>
             <scope>provided</scope>
diff --git a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/centrality/betweenness/BetweennessCentrality.java b/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/centrality/betweenness/BetweennessCentrality.java
deleted file mode 100644
index 094f3ea8..00000000
--- a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/centrality/betweenness/BetweennessCentrality.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.algorithm.centrality.betweenness;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.slf4j.Logger;
-
-import com.baidu.hugegraph.computer.core.common.exception.ComputerException;
-import com.baidu.hugegraph.computer.core.config.Config;
-import com.baidu.hugegraph.computer.core.graph.edge.Edge;
-import com.baidu.hugegraph.computer.core.graph.id.Id;
-import com.baidu.hugegraph.computer.core.graph.value.DoubleValue;
-import com.baidu.hugegraph.computer.core.graph.value.IdList;
-import com.baidu.hugegraph.computer.core.graph.value.IdSet;
-import com.baidu.hugegraph.computer.core.graph.vertex.Vertex;
-import com.baidu.hugegraph.computer.core.worker.Computation;
-import com.baidu.hugegraph.computer.core.worker.ComputationContext;
-import org.apache.hugegraph.util.Log;
-
-public class BetweennessCentrality implements Computation<BetweennessMessage> {
-
-    private static final Logger LOG = Log.logger(BetweennessCentrality.class);
-
-    public static final String OPTION_SAMPLE_RATE =
-                               "betweenness_centrality.sample_rate";
-
-    private double sampleRate;
-    /*
-     * Record the number of shortest paths for intermediate vertex, suppose
-     * there are two shortest paths from A(source vertex) to E(current vertex),
-     * [A -> B -> C -> E] and [A -> B -> D -> E]
-     *
-     * The saved data is as follows
-     * A: B:2
-     *    C:1
-     *    D:1
-     *    totalCount:2
-     */
-    private Map<Id, SeqCount> seqTable;
-
-    @Override
-    public String name() {
-        return "betweenness_centrality";
-    }
-
-    @Override
-    public String category() {
-        return "centrality";
-    }
-
-    @Override
-    public void init(Config config) {
-        this.sampleRate = config.getDouble(OPTION_SAMPLE_RATE, 1.0D);
-        if (this.sampleRate <= 0.0D || this.sampleRate > 1.0D) {
-            throw new ComputerException("The param %s must be in (0.0, 1.0], " +
-                                        "actual got '%s'",
-                                        OPTION_SAMPLE_RATE, this.sampleRate);
-        }
-        this.seqTable = new HashMap<>();
-    }
-
-    @Override
-    public void close(Config config) {
-        // pass
-    }
-
-    @Override
-    public void compute0(ComputationContext context, Vertex vertex) {
-        // First superstep is special, we just send vertex id to its neighbors
-        BetweennessValue initialValue = new BetweennessValue(0.0D);
-        initialValue.arrivedVertices().add(vertex.id());
-        vertex.value(initialValue);
-        if (vertex.numEdges() == 0) {
-            return;
-        }
-
-        IdList sequence = new IdList();
-        sequence.add(vertex.id());
-        context.sendMessageToAllEdges(vertex, new BetweennessMessage(sequence));
-        LOG.info("Finished compute-0 step");
-    }
-
-    @Override
-    public void compute(ComputationContext context, Vertex vertex,
-                        Iterator<BetweennessMessage> messages) {
-        BetweennessValue value = vertex.value();
-        // The betweenness value to be updated
-        DoubleValue betweenness = value.betweenness();
-        // Collect the vertices sent here this time
-        IdSet arrivingVertices = new IdSet();
-        while (messages.hasNext()) {
-            BetweennessMessage message = messages.next();
-            // The value contributed to the intermediate node on the path
-            DoubleValue vote = message.vote();
-            betweenness.value(betweenness.value() + vote.value());
-
-            this.forward(context, vertex, message.sequence(), arrivingVertices);
-        }
-        value.arrivedVertices().addAll(arrivingVertices);
-
-        boolean active = !this.seqTable.isEmpty();
-        if (active) {
-            this.sendMessage(context);
-            this.seqTable.clear();
-        } else {
-            vertex.inactivate();
-        }
-    }
-
-    private void forward(ComputationContext context, Vertex vertex,
-                         IdList sequence, IdSet arrivingVertices) {
-        if (sequence.size() == 0) {
-            return;
-        }
-
-        BetweennessValue value = vertex.value();
-        IdSet arrivedVertices = value.arrivedVertices();
-        Id source = sequence.get(0);
-        // The source vertex is arriving at first time
-        if (!arrivedVertices.contains(source)) {
-            arrivingVertices.add(source);
-
-            SeqCount seqCount = this.seqTable.computeIfAbsent(
-                    source, k -> new SeqCount());
-            seqCount.totalCount++;
-            // Accumulate the number of shortest paths for intermediate vertices
-            for (int i = 1; i < sequence.size(); i++) {
-                Id id = sequence.get(i);
-                Map<Id, Integer> idCounts = seqCount.idCount;
-                idCounts.put(id, idCounts.getOrDefault(id, 0) + 1);
-            }
-
-            Id selfId = vertex.id();
-            sequence.add(selfId);
-            BetweennessMessage newMessage = new BetweennessMessage(sequence);
-            for (Edge edge : vertex.edges()) {
-                Id targetId = edge.targetId();
-                if (this.sample(selfId, targetId, edge) &&
-                    !sequence.contains(targetId)) {
-                    context.sendMessage(targetId, newMessage);
-                }
-            }
-        }
-    }
-
-    private void sendMessage(ComputationContext context) {
-        for (SeqCount seqCount : this.seqTable.values()) {
-            for (Map.Entry<Id, Integer> entry : seqCount.idCount.entrySet()) {
-                double vote = (double) entry.getValue() / seqCount.totalCount;
-                BetweennessMessage voteMessage = new BetweennessMessage(
-                                                 new DoubleValue(vote));
-
-                context.sendMessage(entry.getKey(), voteMessage);
-            }
-        }
-    }
-
-    private boolean sample(Id sourceId, Id targetId, Edge edge) {
-        // Now just use the simplest way
-        return Math.random() <= this.sampleRate;
-    }
-
-    private static class SeqCount {
-
-        private final Map<Id, Integer> idCount;
-        private int totalCount;
-
-        public SeqCount() {
-            this.idCount = new HashMap<>();
-            this.totalCount = 0;
-        }
-    }
-}
diff --git a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/centrality/betweenness/BetweennessCentralityParams.java b/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/centrality/betweenness/BetweennessCentralityParams.java
deleted file mode 100644
index 87a26bed..00000000
--- a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/centrality/betweenness/BetweennessCentralityParams.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.algorithm.centrality.betweenness;
-
-import java.util.Map;
-
-import com.baidu.hugegraph.computer.algorithm.AlgorithmParams;
-import com.baidu.hugegraph.computer.algorithm.centrality.closeness.ClosenessCentrality;
-import com.baidu.hugegraph.computer.core.config.ComputerOptions;
-import com.baidu.hugegraph.computer.core.master.DefaultMasterComputation;
-
-public class BetweennessCentralityParams implements AlgorithmParams {
-
-    @Override
-    public void setAlgorithmParameters(Map<String, String> params) {
-        this.setIfAbsent(params, ComputerOptions.MASTER_COMPUTATION_CLASS,
-                         DefaultMasterComputation.class.getName());
-        this.setIfAbsent(params, ComputerOptions.WORKER_COMPUTATION_CLASS,
-                         BetweennessCentrality.class.getName());
-        this.setIfAbsent(params, ComputerOptions.ALGORITHM_RESULT_CLASS,
-                         BetweennessValue.class.getName());
-        this.setIfAbsent(params, ComputerOptions.ALGORITHM_MESSAGE_CLASS,
-                         BetweennessMessage.class.getName());
-        this.setIfAbsent(params, ComputerOptions.OUTPUT_CLASS,
-                         HUGEGRAPH_DOUBLE_OUTPUT_CLASS_NAME);
-        this.setIfAbsent(params, ComputerOptions.INPUT_FILTER_CLASS,
-                         EXTRACTALLPROPERTYINPUTFILTER_CLASS_NAME);
-        this.setIfAbsent(params, ClosenessCentrality.OPTION_SAMPLE_RATE,
-                         "0.5D");
-    }
-}
diff --git a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/centrality/betweenness/BetweennessMessage.java b/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/centrality/betweenness/BetweennessMessage.java
deleted file mode 100644
index 9503fcfe..00000000
--- a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/centrality/betweenness/BetweennessMessage.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.algorithm.centrality.betweenness;
-
-import java.io.IOException;
-
-import com.baidu.hugegraph.computer.core.graph.id.Id;
-import com.baidu.hugegraph.computer.core.graph.value.DoubleValue;
-import com.baidu.hugegraph.computer.core.graph.value.IdList;
-import com.baidu.hugegraph.computer.core.graph.value.Value;
-import com.baidu.hugegraph.computer.core.graph.value.Value.CustomizeValue;
-import com.baidu.hugegraph.computer.core.io.RandomAccessInput;
-import com.baidu.hugegraph.computer.core.io.RandomAccessOutput;
-import org.apache.hugegraph.util.E;
-
-public class BetweennessMessage implements CustomizeValue<BetweennessMessage> {
-
-    private final IdList sequence;
-    private final DoubleValue vote;
-
-    public BetweennessMessage() {
-        this.sequence = new IdList();
-        this.vote = new DoubleValue(0.0D);
-    }
-
-    public BetweennessMessage(IdList sequence) {
-        this.sequence = sequence;
-        this.vote = new DoubleValue();
-    }
-
-    public BetweennessMessage(DoubleValue betweenness) {
-        this.sequence = new IdList();
-        this.vote = betweenness;
-    }
-
-    public IdList sequence() {
-        return this.sequence;
-    }
-
-    public DoubleValue vote() {
-        return this.vote;
-    }
-
-    @Override
-    public BetweennessMessage value() {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public void read(RandomAccessInput in) throws IOException {
-        this.sequence.read(in);
-        this.vote.read(in);
-    }
-
-    @Override
-    public void write(RandomAccessOutput out) throws IOException {
-        this.sequence.write(out);
-        this.vote.write(out);
-    }
-
-    @Override
-    public int compareTo(Value value) {
-        E.checkArgument(value instanceof BetweennessMessage,
-                        "The BetweennessMessage can't compare with class '%s'",
-                        value.getClass());
-        BetweennessMessage other = (BetweennessMessage) value;
-        E.checkArgument(this.sequence.size() != 0, "Sequence can't be empty");
-        E.checkArgument(other.sequence.size() != 0, "Sequence can't be empty");
-        Id selfSourceId = this.sequence.get(0);
-        Id otherSourceId = other.sequence.get(0);
-        return selfSourceId.compareTo(otherSourceId);
-    }
-}
diff --git a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/centrality/betweenness/BetweennessValue.java b/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/centrality/betweenness/BetweennessValue.java
deleted file mode 100644
index 210cb7c2..00000000
--- a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/centrality/betweenness/BetweennessValue.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.algorithm.centrality.betweenness;
-
-import java.io.IOException;
-
-import com.baidu.hugegraph.computer.core.graph.value.DoubleValue;
-import com.baidu.hugegraph.computer.core.graph.value.IdSet;
-import com.baidu.hugegraph.computer.core.graph.value.Value.CustomizeValue;
-import com.baidu.hugegraph.computer.core.io.RandomAccessInput;
-import com.baidu.hugegraph.computer.core.io.RandomAccessOutput;
-
-public class BetweennessValue implements CustomizeValue<Double> {
-
-    private final DoubleValue betweenness;
-    private final IdSet arrivedVertices;
-
-    public BetweennessValue() {
-        this(0.0D);
-    }
-
-    public BetweennessValue(double betweenness) {
-        this.betweenness = new DoubleValue(betweenness);
-        this.arrivedVertices = new IdSet();
-    }
-
-    public DoubleValue betweenness() {
-        return this.betweenness;
-    }
-
-    public IdSet arrivedVertices() {
-        return this.arrivedVertices;
-    }
-
-    @Override
-    public void read(RandomAccessInput in) throws IOException {
-        this.betweenness.read(in);
-        this.arrivedVertices.read(in);
-    }
-
-    @Override
-    public void write(RandomAccessOutput out) throws IOException {
-        this.betweenness.write(out);
-        this.arrivedVertices.write(out);
-    }
-
-    @Override
-    public Double value() {
-        return this.betweenness.value();
-    }
-
-    @Override
-    public String string() {
-        return this.value().toString();
-    }
-}
diff --git a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/centrality/closeness/ClosenessCentrality.java b/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/centrality/closeness/ClosenessCentrality.java
deleted file mode 100644
index 965462e0..00000000
--- a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/centrality/closeness/ClosenessCentrality.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.algorithm.centrality.closeness;
-
-import java.util.Iterator;
-
-import org.slf4j.Logger;
-
-import com.baidu.hugegraph.computer.core.common.exception.ComputerException;
-import com.baidu.hugegraph.computer.core.config.Config;
-import com.baidu.hugegraph.computer.core.graph.edge.Edge;
-import com.baidu.hugegraph.computer.core.graph.id.Id;
-import com.baidu.hugegraph.computer.core.graph.value.DoubleValue;
-import com.baidu.hugegraph.computer.core.graph.value.Value;
-import com.baidu.hugegraph.computer.core.graph.vertex.Vertex;
-import com.baidu.hugegraph.computer.core.worker.Computation;
-import com.baidu.hugegraph.computer.core.worker.ComputationContext;
-import org.apache.hugegraph.util.Log;
-import org.apache.hugegraph.util.NumericUtil;
-
-public class ClosenessCentrality implements Computation<ClosenessMessage> {
-
-    private static final Logger LOG = Log.logger(ClosenessCentrality.class);
-
-    public static final String OPTION_WEIGHT_PROPERTY =
-                               "closeness_centrality.weight_property";
-    public static final String OPTION_SAMPLE_RATE =
-                               "closeness_centrality.sample_rate";
-
-    private String weightProp;
-    private double sampleRate;
-
-    @Override
-    public String name() {
-        return "closeness_centrality";
-    }
-
-    @Override
-    public String category() {
-        return "centrality";
-    }
-
-    @Override
-    public void init(Config config) {
-        this.weightProp = config.getString(OPTION_WEIGHT_PROPERTY, "");
-        this.sampleRate = config.getDouble(OPTION_SAMPLE_RATE, 1.0D);
-        if (this.sampleRate <= 0.0D || this.sampleRate > 1.0D) {
-            throw new ComputerException("The param %s must be in (0.0, 1.0], " +
-                                        "actual got '%s'",
-                                        OPTION_SAMPLE_RATE, this.sampleRate);
-        }
-    }
-
-    @Override
-    public void close(Config config) {
-        // pass
-    }
-
-    @Override
-    public void compute0(ComputationContext context, Vertex vertex) {
-        // Set empty map as initial value
-        vertex.value(new ClosenessValue());
-
-        // Send messages to adjacent edges
-        for (Edge edge : vertex.edges()) {
-            Id senderId = vertex.id();
-            // Get property value
-            double value = this.weightValue(edge.property(this.weightProp));
-            DoubleValue distance = new DoubleValue(value);
-            ClosenessMessage message = new ClosenessMessage(senderId, senderId,
-                                                            distance);
-            context.sendMessage(edge.targetId(), message);
-        }
-    }
-
-    @Override
-    public void compute(ComputationContext context, Vertex vertex,
-                        Iterator<ClosenessMessage> messages) {
-        Id selfId = vertex.id();
-        // Save the distance from other vertices to self
-        ClosenessValue localValue = vertex.value();
-        boolean active = false;
-        while (messages.hasNext()) {
-            active = true;
-            ClosenessMessage message = messages.next();
-            Id senderId = message.senderId();
-            // In theory, it won't happen, defensive programming
-            if (selfId.equals(senderId)) {
-                continue;
-            }
-            Id startId = message.startId();
-            if (selfId.equals(startId)) {
-                continue;
-            }
-
-            DoubleValue oldValue = localValue.get(startId);
-            DoubleValue newValue = message.distance();
-            // If the id already exists and the new value >= old value, skip it
-            if (oldValue != null && newValue.compareTo(oldValue) >= 0) {
-                continue;
-            }
-            // Update local saved values (take smaller value)
-            localValue.put(startId, newValue);
-            // Send this smaller value to neighbors
-            this.sendMessage(context, vertex, senderId, startId, newValue);
-        }
-        if (!active) {
-            vertex.inactivate();
-        }
-    }
-
-    private void sendMessage(ComputationContext context, Vertex vertex,
-                             Id senderId, Id startId, DoubleValue newValue) {
-        Id selfId = vertex.id();
-        double baseNewValue = this.weightValue(newValue);
-        for (Edge edge : vertex.edges()) {
-            Id targetId = edge.targetId();
-            if (senderId.equals(targetId) || startId.equals(targetId)) {
-                continue;
-            }
-            if (!sample(selfId, targetId, edge)) {
-                continue;
-            }
-            // Update distance information
-            double updatedValue = baseNewValue + this.weightValue(edge.property(
-                                                 this.weightProp));
-            DoubleValue newDistance = new DoubleValue(updatedValue);
-            ClosenessMessage message = new ClosenessMessage(selfId, startId,
-                                                            newDistance);
-            context.sendMessage(targetId, message);
-        }
-    }
-
-    private boolean sample(Id sourceId, Id targetId, Edge edge) {
-        // Now just use the simplest way
-        return Math.random() <= this.sampleRate;
-    }
-
-    private double weightValue(Value rawValue) {
-        if (rawValue == null) {
-            return 1.0D;
-        }
-        if (rawValue.isNumber()) {
-            return NumericUtil.convertToNumber(rawValue).doubleValue();
-        } else {
-            throw new ComputerException("The weight property can only be " +
-                                        "either Long or Int or Double or " +
-                                        "Float, but got %s",
-                                        rawValue.valueType());
-        }
-    }
-}
diff --git a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/centrality/closeness/ClosenessCentralityParams.java b/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/centrality/closeness/ClosenessCentralityParams.java
deleted file mode 100644
index 9fbf58f9..00000000
--- a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/centrality/closeness/ClosenessCentralityParams.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.algorithm.centrality.closeness;
-
-import java.util.Map;
-
-import com.baidu.hugegraph.computer.algorithm.AlgorithmParams;
-import com.baidu.hugegraph.computer.core.config.ComputerOptions;
-import com.baidu.hugegraph.computer.core.master.DefaultMasterComputation;
-
-public class ClosenessCentralityParams implements AlgorithmParams {
-
-    @Override
-    public void setAlgorithmParameters(Map<String, String> params) {
-        this.setIfAbsent(params, ComputerOptions.MASTER_COMPUTATION_CLASS,
-                         DefaultMasterComputation.class.getName());
-        this.setIfAbsent(params, ComputerOptions.WORKER_COMPUTATION_CLASS,
-                         ClosenessCentrality.class.getName());
-        this.setIfAbsent(params, ComputerOptions.ALGORITHM_RESULT_CLASS,
-                         ClosenessValue.class.getName());
-        this.setIfAbsent(params, ComputerOptions.ALGORITHM_MESSAGE_CLASS,
-                         ClosenessMessage.class.getName());
-        this.setIfAbsent(params, ComputerOptions.OUTPUT_CLASS,
-                         HUGEGRAPH_DOUBLE_OUTPUT_CLASS_NAME);
-        this.setIfAbsent(params, ComputerOptions.INPUT_FILTER_CLASS,
-                         EXTRACTALLPROPERTYINPUTFILTER_CLASS_NAME);
-        this.setIfAbsent(params, ClosenessCentrality.OPTION_SAMPLE_RATE,
-                         "0.5D");
-    }
-}
diff --git a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/centrality/closeness/ClosenessMessage.java b/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/centrality/closeness/ClosenessMessage.java
deleted file mode 100644
index 7251640e..00000000
--- a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/centrality/closeness/ClosenessMessage.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.algorithm.centrality.closeness;
-
-import java.io.IOException;
-
-import com.baidu.hugegraph.computer.core.common.ComputerContext;
-import com.baidu.hugegraph.computer.core.graph.GraphFactory;
-import com.baidu.hugegraph.computer.core.graph.id.Id;
-import com.baidu.hugegraph.computer.core.graph.id.IdFactory;
-import com.baidu.hugegraph.computer.core.graph.value.DoubleValue;
-import com.baidu.hugegraph.computer.core.graph.value.Value.CustomizeValue;
-import com.baidu.hugegraph.computer.core.graph.value.ValueType;
-import com.baidu.hugegraph.computer.core.io.RandomAccessInput;
-import com.baidu.hugegraph.computer.core.io.RandomAccessOutput;
-
-public class ClosenessMessage implements CustomizeValue<ClosenessMessage> {
-
-    private final GraphFactory graphFactory;
-
-    private Id senderId;
-    private Id startId;
-    private DoubleValue distance;
-
-    public ClosenessMessage() {
-        this(IdFactory.createId(), IdFactory.createId(), new DoubleValue(0.0D));
-    }
-
-    public ClosenessMessage(Id senderId, Id startId, DoubleValue distance) {
-        this.graphFactory = ComputerContext.instance().graphFactory();
-        this.senderId = senderId;
-        this.startId = startId;
-        this.distance = distance;
-    }
-
-    public Id senderId() {
-        return this.senderId;
-    }
-
-    public Id startId() {
-        return this.startId;
-    }
-
-    public DoubleValue distance() {
-        return this.distance;
-    }
-
-    @Override
-    public ClosenessMessage value() {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public void read(RandomAccessInput in) throws IOException {
-        this.senderId = this.graphFactory.createId();
-        this.senderId.read(in);
-
-        this.startId = this.graphFactory.createId();
-        this.startId.read(in);
-
-        this.distance = (DoubleValue) this.graphFactory.createValue(
-                                      ValueType.DOUBLE);
-        this.distance.read(in);
-    }
-
-    @Override
-    public void write(RandomAccessOutput out) throws IOException {
-        this.senderId.write(out);
-        this.startId.write(out);
-        this.distance.write(out);
-    }
-}
diff --git a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/centrality/closeness/ClosenessValue.java b/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/centrality/closeness/ClosenessValue.java
deleted file mode 100644
index ace25316..00000000
--- a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/centrality/closeness/ClosenessValue.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.algorithm.centrality.closeness;
-
-import java.util.Map;
-
-import com.baidu.hugegraph.computer.core.graph.id.Id;
-import com.baidu.hugegraph.computer.core.graph.value.DoubleValue;
-import com.baidu.hugegraph.computer.core.graph.value.MapValue;
-
-public class ClosenessValue extends MapValue<DoubleValue> {
-
-    @Override
-    public Double value() {
-        // Cumulative distance
-        double centrality = 0;
-        for (Map.Entry<Id, DoubleValue> entry : this.entrySet()) {
-            centrality += 1.0D / entry.getValue().value();
-        }
-        return centrality;
-    }
-
-    @Override
-    public String string() {
-        return this.value().toString();
-    }
-}
diff --git a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/centrality/degree/DegreeCentrality.java b/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/centrality/degree/DegreeCentrality.java
deleted file mode 100644
index d5289a9d..00000000
--- a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/centrality/degree/DegreeCentrality.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.algorithm.centrality.degree;
-
-import java.util.Iterator;
-
-import org.apache.commons.lang.StringUtils;
-
-import com.baidu.hugegraph.computer.core.common.exception.ComputerException;
-import com.baidu.hugegraph.computer.core.config.Config;
-import com.baidu.hugegraph.computer.core.graph.edge.Edge;
-import com.baidu.hugegraph.computer.core.graph.value.DoubleValue;
-import com.baidu.hugegraph.computer.core.graph.value.NullValue;
-import com.baidu.hugegraph.computer.core.graph.value.Value;
-import com.baidu.hugegraph.computer.core.graph.vertex.Vertex;
-import com.baidu.hugegraph.computer.core.worker.Computation;
-import com.baidu.hugegraph.computer.core.worker.ComputationContext;
-import com.baidu.hugegraph.computer.core.worker.WorkerContext;
-import org.apache.hugegraph.util.NumericUtil;
-
-public class DegreeCentrality implements Computation<NullValue> {
-
-    public static final String OPTION_WEIGHT_PROPERTY = "degree_centrality.weight_property";
-
-    private boolean calculateByWeightProperty;
-    private String weightProperty;
-
-    @Override
-    public String name() {
-        return "degree_centrality";
-    }
-
-    @Override
-    public String category() {
-        return "centrality";
-    }
-
-    @Override
-    public void compute0(ComputationContext context, Vertex vertex) {
-        if (!this.calculateByWeightProperty) {
-            vertex.value(new DoubleValue(vertex.numEdges()));
-        } else {
-            /*
-             *  TODO: Here we use doubleValue type now, we will use BigDecimal
-             *  and output "BigDecimalValue" to resolve double type overflow
-             *  int the future;
-             */
-            double totalWeight = 0.0;
-            for (Edge edge : vertex.edges()) {
-                double weight = weightValue(edge.property(this.weightProperty));
-                totalWeight += weight;
-                if (Double.isInfinite(totalWeight)) {
-                    throw new ComputerException("Calculate weight overflow, " +
-                                                "current is %s, edge '%s' " +
-                                                "is %s", totalWeight, edge, weight);
-                }
-            }
-            vertex.value(new DoubleValue(totalWeight));
-        }
-        vertex.inactivate();
-    }
-
-    private static double weightValue(Value value) {
-        if (value == null) {
-            return 1.0;
-        }
-
-        switch (value.valueType()) {
-            case LONG:
-            case INT:
-            case DOUBLE:
-            case FLOAT:
-                return NumericUtil.convertToNumber(value).doubleValue();
-            default:
-                throw new ComputerException("The weight property can only be " +
-                                            "either Long or Int or Double or " +
-                                            "Float, but got %s",
-                                            value.valueType());
-        }
-    }
-
-    @Override
-    public void compute(ComputationContext context, Vertex vertex,
-                        Iterator<NullValue> messages) {
-        // pass
-    }
-
-    @Override
-    public void init(Config config) {
-        this.weightProperty = config.getString(
-                              OPTION_WEIGHT_PROPERTY, "");
-        this.calculateByWeightProperty = StringUtils.isNotEmpty(
-                                         this.weightProperty);
-    }
-
-    @Override
-    public void close(Config config) {
-        // pass
-    }
-
-    @Override
-    public void beforeSuperstep(WorkerContext context) {
-        // pass
-    }
-
-    @Override
-    public void afterSuperstep(WorkerContext context) {
-        // pass
-    }
-}
diff --git a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/centrality/degree/DegreeCentralityParams.java b/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/centrality/degree/DegreeCentralityParams.java
deleted file mode 100644
index 04fc08ef..00000000
--- a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/centrality/degree/DegreeCentralityParams.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.algorithm.centrality.degree;
-
-import java.util.Map;
-
-import com.baidu.hugegraph.computer.algorithm.AlgorithmParams;
-import com.baidu.hugegraph.computer.core.combiner.DoubleValueSumCombiner;
-import com.baidu.hugegraph.computer.core.config.ComputerOptions;
-import com.baidu.hugegraph.computer.core.graph.value.DoubleValue;
-import com.baidu.hugegraph.computer.core.master.DefaultMasterComputation;
-
-public class DegreeCentralityParams implements AlgorithmParams {
-
-    @Override
-    public void setAlgorithmParameters(Map<String, String> params) {
-        this.setIfAbsent(params, ComputerOptions.MASTER_COMPUTATION_CLASS,
-                         DefaultMasterComputation.class.getName());
-        this.setIfAbsent(params, ComputerOptions.WORKER_COMPUTATION_CLASS,
-                         DegreeCentrality.class.getName());
-        this.setIfAbsent(params, ComputerOptions.ALGORITHM_RESULT_CLASS,
-                         DoubleValue.class.getName());
-        this.setIfAbsent(params, ComputerOptions.ALGORITHM_MESSAGE_CLASS,
-                         DoubleValue.class.getName());
-        this.setIfAbsent(params, ComputerOptions.WORKER_COMBINER_CLASS,
-                         DoubleValueSumCombiner.class.getName());
-        this.setIfAbsent(params, ComputerOptions.OUTPUT_CLASS,
-                         HUGEGRAPH_DOUBLE_OUTPUT_CLASS_NAME);
-    }
-}
diff --git a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/centrality/pagerank/PageRank.java b/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/centrality/pagerank/PageRank.java
deleted file mode 100644
index b37ba4d0..00000000
--- a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/centrality/pagerank/PageRank.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.algorithm.centrality.pagerank;
-
-import java.util.Iterator;
-
-import com.baidu.hugegraph.computer.core.aggregator.Aggregator;
-import com.baidu.hugegraph.computer.core.combiner.Combiner;
-import com.baidu.hugegraph.computer.core.config.Config;
-import com.baidu.hugegraph.computer.core.graph.value.DoubleValue;
-import com.baidu.hugegraph.computer.core.graph.value.LongValue;
-import com.baidu.hugegraph.computer.core.graph.vertex.Vertex;
-import com.baidu.hugegraph.computer.core.worker.Computation;
-import com.baidu.hugegraph.computer.core.worker.ComputationContext;
-import com.baidu.hugegraph.computer.core.worker.WorkerContext;
-
-public class PageRank implements Computation<DoubleValue> {
-
-    public static final String OPTION_ALPHA = "page_rank.alpha";
-
-    public static final double ALPHA_DEFAULT_VALUE = 0.15;
-
-    private double alpha;
-    private double danglingRank;
-    private double initialRankInSuperstep;
-    private double cumulativeRank;
-
-    private Aggregator<DoubleValue> l1DiffAggr;
-    private Aggregator<DoubleValue> cumulativeRankAggr;
-    private Aggregator<LongValue> danglingVertexNumAggr;
-    private Aggregator<DoubleValue> danglingCumulativeAggr;
-
-    // Initial value in superstep 0.
-    private DoubleValue initialValue;
-    private DoubleValue contribValue;
-
-    @Override
-    public String name() {
-        return "page_rank";
-    }
-
-    @Override
-    public String category() {
-        return "centrality";
-    }
-
-    @Override
-    public void compute0(ComputationContext context, Vertex vertex) {
-        vertex.value(this.initialValue);
-        this.cumulativeRankAggr.aggregateValue(this.initialValue.value());
-        int edgeCount = vertex.numEdges();
-        if (edgeCount == 0) {
-            this.danglingVertexNumAggr.aggregateValue(1L);
-            this.danglingCumulativeAggr.aggregateValue(
-                                        this.initialValue.value());
-        } else {
-            this.contribValue.value(this.initialValue.value() / edgeCount);
-            context.sendMessageToAllEdges(vertex, this.contribValue);
-        }
-    }
-
-    @Override
-    public void compute(ComputationContext context, Vertex vertex,
-                        Iterator<DoubleValue> messages) {
-        DoubleValue message = Combiner.combineAll(context.combiner(), messages);
-        double rankFromNeighbors = 0.0;
-        if (message != null) {
-            rankFromNeighbors = message.value();
-        }
-        double rank = (this.danglingRank + rankFromNeighbors) *
-                      (1.0 - this.alpha) + this.initialRankInSuperstep;
-        rank /= this.cumulativeRank;
-        DoubleValue oldRank = vertex.value();
-        vertex.value(new DoubleValue(rank));
-        this.l1DiffAggr.aggregateValue(Math.abs(oldRank.value() - rank));
-        this.cumulativeRankAggr.aggregateValue(rank);
-        int edgeCount = vertex.numEdges();
-        if (edgeCount == 0) {
-            this.danglingVertexNumAggr.aggregateValue(1L);
-            this.danglingCumulativeAggr.aggregateValue(rank);
-        } else {
-            this.contribValue.value(rank / edgeCount);
-            context.sendMessageToAllEdges(vertex, this.contribValue);
-        }
-    }
-
-    @Override
-    public void init(Config config) {
-        this.alpha = config.getDouble(OPTION_ALPHA, ALPHA_DEFAULT_VALUE);
-        this.contribValue = new DoubleValue();
-    }
-
-    @Override
-    public void close(Config config) {
-        // pass
-    }
-
-    @Override
-    public void beforeSuperstep(WorkerContext context) {
-        // Get aggregator values for computation
-        DoubleValue danglingTotalRank = context.aggregatedValue(
-                    PageRank4Master.AGGR_COMULATIVE_DANGLING_PROBABILITY);
-        DoubleValue cumulativeRank = context.aggregatedValue(
-                    PageRank4Master.AGGR_COMULATIVE_PROBABILITY);
-        long totalVertex = context.totalVertexCount();
-
-        this.danglingRank = danglingTotalRank.value() / totalVertex;
-        this.initialRankInSuperstep = this.alpha / totalVertex;
-        this.cumulativeRank = cumulativeRank.value();
-        this.initialValue = new DoubleValue(1.0 / totalVertex);
-
-        // Create aggregators
-        this.l1DiffAggr = context.createAggregator(
-                          PageRank4Master.AGGR_L1_NORM_DIFFERENCE_KEY);
-        this.cumulativeRankAggr = context.createAggregator(
-                                  PageRank4Master.AGGR_COMULATIVE_PROBABILITY);
-        this.danglingVertexNumAggr = context.createAggregator(
-             PageRank4Master.AGGR_DANGLING_VERTICES_NUM);
-        this.danglingCumulativeAggr = context.createAggregator(
-             PageRank4Master.AGGR_COMULATIVE_DANGLING_PROBABILITY);
-    }
-
-    @Override
-    public void afterSuperstep(WorkerContext context) {
-        context.aggregateValue(
-                PageRank4Master.AGGR_COMULATIVE_PROBABILITY,
-                this.cumulativeRankAggr.aggregatedValue());
-        context.aggregateValue(
-                PageRank4Master.AGGR_L1_NORM_DIFFERENCE_KEY,
-                this.l1DiffAggr.aggregatedValue());
-        context.aggregateValue(
-                PageRank4Master.AGGR_DANGLING_VERTICES_NUM,
-                this.danglingVertexNumAggr.aggregatedValue());
-        context.aggregateValue(
-                PageRank4Master.AGGR_COMULATIVE_DANGLING_PROBABILITY,
-                this.danglingCumulativeAggr.aggregatedValue());
-    }
-}
diff --git a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/centrality/pagerank/PageRank4Master.java b/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/centrality/pagerank/PageRank4Master.java
deleted file mode 100644
index f7aeb306..00000000
--- a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/centrality/pagerank/PageRank4Master.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.algorithm.centrality.pagerank;
-
-import org.slf4j.Logger;
-
-import com.baidu.hugegraph.computer.core.combiner.DoubleValueSumCombiner;
-import com.baidu.hugegraph.computer.core.combiner.LongValueSumCombiner;
-import com.baidu.hugegraph.computer.core.graph.value.DoubleValue;
-import com.baidu.hugegraph.computer.core.graph.value.LongValue;
-import com.baidu.hugegraph.computer.core.graph.value.ValueType;
-import com.baidu.hugegraph.computer.core.master.MasterComputation;
-import com.baidu.hugegraph.computer.core.master.MasterComputationContext;
-import com.baidu.hugegraph.computer.core.master.MasterContext;
-import org.apache.hugegraph.util.Log;
-
-public class PageRank4Master implements MasterComputation {
-
-    private static final Logger LOG = Log.logger(PageRank4Master.class);
-
-    public static final String CONF_L1_NORM_DIFFERENCE_THRESHOLD_KEY =
-                               "pagerank.l1DiffThreshold";
-    public static final double CONF_L1_DIFF_THRESHOLD_DEFAULT = 0.00001D;
-
-    public static final String AGGR_L1_NORM_DIFFERENCE_KEY =
-                               "pagerank.aggr_l1_norm_difference";
-    public static final String AGGR_DANGLING_VERTICES_NUM =
-                               "pagerank.dangling_vertices_num";
-    public static final String AGGR_COMULATIVE_DANGLING_PROBABILITY =
-                               "pagerank.comulative_dangling_probability";
-    public static final String AGGR_COMULATIVE_PROBABILITY =
-                               "pagerank.comulative_probability";
-
-    private double l1DiffThreshold;
-
-    @Override
-    public void init(MasterContext context) {
-        this.l1DiffThreshold = context.config().getDouble(
-                               CONF_L1_NORM_DIFFERENCE_THRESHOLD_KEY,
-                               CONF_L1_DIFF_THRESHOLD_DEFAULT);
-        context.registerAggregator(AGGR_DANGLING_VERTICES_NUM,
-                                   ValueType.LONG,
-                                   LongValueSumCombiner.class);
-        context.registerAggregator(AGGR_COMULATIVE_DANGLING_PROBABILITY,
-                                   ValueType.DOUBLE,
-                                   DoubleValueSumCombiner.class);
-        context.registerAggregator(AGGR_COMULATIVE_PROBABILITY,
-                                   ValueType.DOUBLE,
-                                   DoubleValueSumCombiner.class);
-        context.registerAggregator(AGGR_L1_NORM_DIFFERENCE_KEY,
-                                   ValueType.DOUBLE,
-                                   DoubleValueSumCombiner.class);
-    }
-
-    @Override
-    public void close(MasterContext context) {
-        // pass
-    }
-
-    @Override
-    public boolean compute(MasterComputationContext context) {
-        LongValue danglingVerticesNum = context.aggregatedValue(
-                                        AGGR_DANGLING_VERTICES_NUM);
-        DoubleValue danglingProbability = context.aggregatedValue(
-                                          AGGR_COMULATIVE_DANGLING_PROBABILITY);
-        DoubleValue cumulativeProbability = context.aggregatedValue(
-                                            AGGR_COMULATIVE_PROBABILITY);
-        DoubleValue l1NormDifference = context.aggregatedValue(
-                                       AGGR_L1_NORM_DIFFERENCE_KEY);
-
-        StringBuilder sb = new StringBuilder();
-        sb.append("[Superstep ").append(context.superstep()).append("]")
-          .append(", dangling vertices num = ").append(danglingVerticesNum)
-          .append(", cumulative dangling probability = ")
-          .append(danglingProbability.value())
-          .append(", cumulative probability = ").append(cumulativeProbability)
-          .append(", l1 norm difference = ").append(l1NormDifference.value());
-
-        LOG.info("PageRank running status: {}", sb);
-        double l1Diff = l1NormDifference.value();
-        if (context.superstep() > 1 && l1Diff <= this.l1DiffThreshold) {
-            return false;
-        } else {
-            return true;
-        }
-    }
-}
diff --git a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/centrality/pagerank/PageRankParams.java b/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/centrality/pagerank/PageRankParams.java
deleted file mode 100644
index a10018c7..00000000
--- a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/centrality/pagerank/PageRankParams.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.algorithm.centrality.pagerank;
-
-import java.util.Map;
-
-import com.baidu.hugegraph.computer.algorithm.AlgorithmParams;
-import com.baidu.hugegraph.computer.core.combiner.DoubleValueSumCombiner;
-import com.baidu.hugegraph.computer.core.config.ComputerOptions;
-import com.baidu.hugegraph.computer.core.graph.value.DoubleValue;
-
-public class PageRankParams implements AlgorithmParams {
-
-    @Override
-    public void setAlgorithmParameters(Map<String, String> params) {
-        this.setIfAbsent(params, ComputerOptions.MASTER_COMPUTATION_CLASS,
-                         PageRank4Master.class.getName());
-        this.setIfAbsent(params, ComputerOptions.WORKER_COMPUTATION_CLASS,
-                         PageRank.class.getName());
-        this.setIfAbsent(params, ComputerOptions.ALGORITHM_RESULT_CLASS,
-                         DoubleValue.class.getName());
-        this.setIfAbsent(params, ComputerOptions.ALGORITHM_MESSAGE_CLASS,
-                         DoubleValue.class.getName());
-        this.setIfAbsent(params, ComputerOptions.WORKER_COMBINER_CLASS,
-                         DoubleValueSumCombiner.class.getName());
-        this.setIfAbsent(params, ComputerOptions.OUTPUT_CLASS,
-                         HUGEGRAPH_DOUBLE_OUTPUT_CLASS_NAME);
-    }
-}
diff --git a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/community/cc/ClusteringCoefficient.java b/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/community/cc/ClusteringCoefficient.java
deleted file mode 100644
index 9cec92ef..00000000
--- a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/community/cc/ClusteringCoefficient.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.algorithm.community.cc;
-
-import java.util.Iterator;
-
-import com.baidu.hugegraph.computer.algorithm.community.trianglecount.TriangleCount;
-import com.baidu.hugegraph.computer.core.config.Config;
-import com.baidu.hugegraph.computer.core.graph.value.IdList;
-import com.baidu.hugegraph.computer.core.graph.value.IdSet;
-import com.baidu.hugegraph.computer.core.graph.vertex.Vertex;
-import com.baidu.hugegraph.computer.core.worker.ComputationContext;
-
-/**
- * ClusteringCoefficient(CC) algorithm could calculate local & the whole graph:
- * 1. local cc: get triangles & degree for current vertex, calculate them
- * 2. whole cc have 2 ways to get the result: (NOT SUPPORTED NOW)
- * - sum all open & closed triangles in graph, and calculate the result
- * - sum all local cc for each vertex, and use avg as the whole graph result
- * <p>
- * And we have 2 ways to count local cc:
- * 1. if we already saved the triangles in each vertex, we can calculate only
- * in superstep0/compute0 to get the result
- * <p>
- * The formula of local CC is: C(v) = 2T / Dv(Dv - 1)
- * v represents one vertex, T represents the triangles of current vertex,
- * D represents the degree of current vertex
- */
-public class ClusteringCoefficient extends TriangleCount {
-
-    @Override
-    public String name() {
-        return "clustering_coefficient";
-    }
-
-    @Override
-    public String category() {
-        return "community";
-    }
-
-    @Override
-    public void init(Config config) {
-        // Reuse triangle count later
-    }
-
-    @Override
-    public void compute0(ComputationContext context, Vertex vertex) {
-        IdList selfId = new IdList();
-        selfId.add(vertex.id());
-
-        context.sendMessageToAllEdgesIf(vertex, selfId, (ids, targetId) -> {
-            return !ids.get(0).equals(targetId);
-        });
-        vertex.value(new ClusteringCoefficientValue());
-    }
-
-    @Override
-    public void compute(ComputationContext context, Vertex vertex, Iterator<IdList> messages) {
-        IdSet neighbors = ((ClusteringCoefficientValue) vertex.value()).idSet();
-        Integer count = super.triangleCount(context, vertex, messages, neighbors);
-        if (count != null) {
-            ((ClusteringCoefficientValue) vertex.value()).count(count);
-            vertex.inactivate();
-        }
-    }
-}
diff --git a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/community/cc/ClusteringCoefficientOutput.java b/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/community/cc/ClusteringCoefficientOutput.java
deleted file mode 100644
index 0d7ed78f..00000000
--- a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/community/cc/ClusteringCoefficientOutput.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.algorithm.community.cc;
-
-import org.apache.hugegraph.structure.constant.WriteType;
-
-import com.baidu.hugegraph.computer.core.graph.vertex.Vertex;
-import com.baidu.hugegraph.computer.core.output.hg.HugeGraphOutput;
-
-/**
- * Offer 2 ways to output: write-back + hdfs-file(TODO)
- */
-public class ClusteringCoefficientOutput extends HugeGraphOutput<Float> {
-
-    @Override
-    public String name() {
-        return "clustering_coefficient";
-    }
-
-    @Override
-    public void prepareSchema() {
-        this.client().schema().propertyKey(this.name())
-            .asFloat()
-            .writeType(WriteType.OLAP_RANGE)
-            .ifNotExist()
-            .create();
-    }
-
-    @Override
-    protected org.apache.hugegraph.structure.graph.Vertex constructHugeVertex(Vertex vertex) {
-        org.apache.hugegraph.structure.graph.Vertex hugeVertex =
-                new org.apache.hugegraph.structure.graph.Vertex(null);
-        hugeVertex.id(vertex.id().asObject());
-        float triangle = ((ClusteringCoefficientValue) vertex.value()).count();
-        int degree = ((ClusteringCoefficientValue) vertex.value()).idSet().value().size();
-        hugeVertex.property(this.name(), 2 * triangle / degree / (degree - 1));
-        return hugeVertex;
-    }
-
-    /* TODO: enhance it
-    @Override
-    protected Float value(Vertex vertex) {
-        float triangle = ((ClusteringCoefficientValue) vertex.value()).count();
-        int degree = ((ClusteringCoefficientValue) vertex.value()).idList().size();
-        return 2 * triangle / degree / (degree - 1);
-    }*/
-}
diff --git a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/community/cc/ClusteringCoefficientParams.java b/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/community/cc/ClusteringCoefficientParams.java
deleted file mode 100644
index 8a310469..00000000
--- a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/community/cc/ClusteringCoefficientParams.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.algorithm.community.cc;
-
-import java.util.Map;
-
-import com.baidu.hugegraph.computer.algorithm.AlgorithmParams;
-import com.baidu.hugegraph.computer.core.config.ComputerOptions;
-import com.baidu.hugegraph.computer.core.config.EdgeFrequency;
-import com.baidu.hugegraph.computer.core.graph.value.IdList;
-
-public class ClusteringCoefficientParams implements AlgorithmParams {
-
-    @Override
-    public void setAlgorithmParameters(Map<String, String> params) {
-        this.setIfAbsent(params, ComputerOptions.WORKER_COMPUTATION_CLASS,
-                         ClusteringCoefficient.class.getName());
-        this.setIfAbsent(params, ComputerOptions.ALGORITHM_MESSAGE_CLASS,
-                         IdList.class.getName());
-        this.setIfAbsent(params, ComputerOptions.ALGORITHM_RESULT_CLASS,
-                         ClusteringCoefficientValue.class.getName());
-        this.setIfAbsent(params, ComputerOptions.OUTPUT_CLASS,
-                         ClusteringCoefficientOutput.class.getName());
-        this.setIfAbsent(params, ComputerOptions.INPUT_EDGE_FREQ.name(),
-                         EdgeFrequency.SINGLE.name());
-    }
-}
diff --git a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/community/cc/ClusteringCoefficientValue.java b/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/community/cc/ClusteringCoefficientValue.java
deleted file mode 100644
index 16c9f776..00000000
--- a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/community/cc/ClusteringCoefficientValue.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.algorithm.community.cc;
-
-import java.io.IOException;
-
-import com.baidu.hugegraph.computer.core.graph.value.IdSet;
-import com.baidu.hugegraph.computer.core.graph.value.IntValue;
-import com.baidu.hugegraph.computer.core.graph.value.Value;
-import com.baidu.hugegraph.computer.core.io.RandomAccessInput;
-import com.baidu.hugegraph.computer.core.io.RandomAccessOutput;
-
-/**
- * TODO: We could reuse triangle's result to simplify it (and avoid logical differences)
- */
-public class ClusteringCoefficientValue implements Value.CustomizeValue<Integer> {
-
-    private IdSet idSet;
-    private IntValue count;
-    private final IntValue degree;
-
-    public ClusteringCoefficientValue() {
-        this.idSet = new IdSet();
-        this.count = new IntValue();
-        this.degree = new IntValue();
-    }
-
-    public IdSet idSet() {
-        return this.idSet;
-    }
-
-    public int count() {
-        return this.count.intValue();
-    }
-
-    public void count(Integer count) {
-        this.count.value(count);
-    }
-
-    public int degree() {
-        return this.degree.value();
-    }
-
-    public void degree(Integer degree) {
-        this.degree.value(degree);
-    }
-
-    @Override
-    public ClusteringCoefficientValue copy() {
-        ClusteringCoefficientValue ccValue = new ClusteringCoefficientValue();
-        ccValue.idSet = this.idSet.copy();
-        ccValue.count = this.count.copy();
-        return ccValue;
-    }
-
-    @Override
-    public Integer value() {
-        return this.count.value();
-    }
-
-    @Override
-    public void read(RandomAccessInput in) throws IOException {
-        this.idSet.read(in);
-        this.count.read(in);
-    }
-
-    @Override
-    public void write(RandomAccessOutput out) throws IOException {
-        this.idSet.write(out);
-        this.count.write(out);
-    }
-
-    @Override
-    public String toString() {
-        return String.valueOf(count);
-    }
-}
diff --git a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/community/kcore/Kcore.java b/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/community/kcore/Kcore.java
deleted file mode 100644
index f11ad534..00000000
--- a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/community/kcore/Kcore.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.algorithm.community.kcore;
-
-import java.util.Iterator;
-
-import com.baidu.hugegraph.computer.core.combiner.Combiner;
-import com.baidu.hugegraph.computer.core.config.Config;
-import com.baidu.hugegraph.computer.core.graph.id.Id;
-import com.baidu.hugegraph.computer.core.graph.vertex.Vertex;
-import com.baidu.hugegraph.computer.core.worker.Computation;
-import com.baidu.hugegraph.computer.core.worker.ComputationContext;
-import com.google.common.collect.Iterators;
-
-public class Kcore implements Computation<Id> {
-
-    public static final String OPTION_K = "kcore.k";
-    public static final int K_DEFAULT_VALUE = 3;
-
-    private final KcoreValue initValue = new KcoreValue();
-
-    private int k = 0;
-
-    @Override
-    public String name() {
-        return "kcore";
-    }
-
-    @Override
-    public String category() {
-        return "community";
-    }
-
-    @Override
-    public void init(Config config) {
-        this.k = config.getInt(OPTION_K, K_DEFAULT_VALUE);
-    }
-
-    @Override
-    public void compute0(ComputationContext context, Vertex vertex) {
-        KcoreValue value = this.initValue;
-        value.core((Id) vertex.id().copy());
-        vertex.value(value);
-
-        if (vertex.numEdges() < this.k) {
-            value.degree(0);
-            /*
-             * TODO: send int type message at phase 1, it's different from id
-             * type of phase 2 (wcc message), need support switch message type.
-             */
-            context.sendMessageToAllEdges(vertex, vertex.id());
-            vertex.inactivate();
-        } else {
-            value.degree(vertex.numEdges());
-            assert vertex.active();
-        }
-    }
-
-    @Override
-    public void compute(ComputationContext context, Vertex vertex,
-                        Iterator<Id> messages) {
-        KcoreValue value = vertex.value();
-        if (!value.active()) {
-            // Ignore messages of deleted vertex
-            vertex.inactivate();
-            return;
-        }
-
-        int superstep = context.superstep();
-        if (superstep <= 2) {
-            int deleted = Iterators.size(messages);
-            assert value.active();
-            if (value.decreaseDegree(deleted) < this.k) {
-                // From active to inactive, delete self vertex
-                value.degree(0);
-                if (superstep == 1) {
-                    context.sendMessageToAllEdges(vertex, vertex.id());
-                }
-                vertex.inactivate();
-            } else {
-                // From active to active, do wcc from superstep 2
-                if (superstep == 2) {
-                    // Start wcc
-                    context.sendMessageToAllEdgesIf(vertex, vertex.id(),
-                                                    (source, target) -> {
-                        return source.compareTo(target) < 0;
-                    });
-                    vertex.inactivate();
-                } else {
-                    // Keep active at superstep 1 to continue superstep 2
-                    assert superstep == 1;
-                    assert vertex.active();
-                }
-            }
-        } else {
-            // Do wcc
-            assert superstep > 2;
-            Id message = Combiner.combineAll(context.combiner(), messages);
-            if (value.core().compareTo(message) > 0) {
-                value.core(message);
-                context.sendMessageToAllEdges(vertex, message);
-            }
-            vertex.inactivate();
-        }
-    }
-}
diff --git a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/community/kcore/KcoreParams.java b/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/community/kcore/KcoreParams.java
deleted file mode 100644
index bdd4b155..00000000
--- a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/community/kcore/KcoreParams.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.algorithm.community.kcore;
-
-import java.util.Map;
-
-import com.baidu.hugegraph.computer.algorithm.AlgorithmParams;
-import com.baidu.hugegraph.computer.core.combiner.ValueMinCombiner;
-import com.baidu.hugegraph.computer.core.config.ComputerOptions;
-
-public class KcoreParams implements AlgorithmParams {
-
-    @Override
-    public void setAlgorithmParameters(Map<String, String> params) {
-        this.setIfAbsent(params, ComputerOptions.WORKER_COMPUTATION_CLASS,
-                         Kcore.class.getName());
-        this.setIfAbsent(params, ComputerOptions.ALGORITHM_RESULT_CLASS,
-                         KcoreValue.class.getName());
-        this.setIfAbsent(params, ComputerOptions.ALGORITHM_MESSAGE_CLASS,
-                         BYTESID_CLASS_NAME);
-        this.setIfAbsent(params, ComputerOptions.WORKER_COMBINER_CLASS,
-                         ValueMinCombiner.class.getName());
-        this.setIfAbsent(params, ComputerOptions.OUTPUT_CLASS,
-                         HUGEGRAPH_ID_OUTPUT_CLASS_NAME);
-    }
-}
diff --git a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/community/kcore/KcoreValue.java b/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/community/kcore/KcoreValue.java
deleted file mode 100644
index 04b51626..00000000
--- a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/community/kcore/KcoreValue.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.algorithm.community.kcore;
-
-import java.io.IOException;
-
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.hugegraph.util.E;
-
-import com.baidu.hugegraph.computer.core.graph.id.Id;
-import com.baidu.hugegraph.computer.core.graph.id.IdFactory;
-import com.baidu.hugegraph.computer.core.graph.value.Value.CustomizeValue;
-import com.baidu.hugegraph.computer.core.io.RandomAccessInput;
-import com.baidu.hugegraph.computer.core.io.RandomAccessOutput;
-
-public class KcoreValue implements CustomizeValue<Object> {
-
-    private int degree;
-    private Id core;
-
-    public KcoreValue() {
-        this.degree = 0;
-        this.core = IdFactory.createId();
-    }
-
-    public void degree(int degree) {
-        assert degree >= 0;
-        this.degree = degree;
-    }
-
-    public int degree() {
-        return this.degree;
-    }
-
-    public int decreaseDegree(int decrease) {
-        assert decrease <= this.degree;
-        this.degree -= decrease;
-        return this.degree;
-    }
-
-    public boolean active() {
-        return this.degree > 0;
-    }
-
-    public void core(Id core) {
-        this.core = core;
-    }
-
-    public Id core() {
-        E.checkNotNull(this.core, "core");
-        return this.core;
-    }
-
-    @Override
-    public KcoreValue copy() {
-        KcoreValue kcoreValue = new KcoreValue();
-        kcoreValue.core = (Id) this.core.copy();
-        kcoreValue.degree = this.degree;
-        return kcoreValue;
-    }
-
-    @Override
-    public void read(RandomAccessInput in) throws IOException {
-        this.core.read(in);
-        this.degree = in.readInt();
-    }
-
-    @Override
-    public void write(RandomAccessOutput out) throws IOException {
-        this.core.write(out);
-        out.writeInt(this.degree);
-    }
-
-    @Override
-    public String toString() {
-        return new ToStringBuilder(this)
-                   .append("core", this.core)
-                   .append("degree", this.degree)
-                   .toString();
-    }
-
-    @Override
-    public Object value() {
-        return this.core.value();
-    }
-}
diff --git a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/community/lpa/Lpa.java b/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/community/lpa/Lpa.java
deleted file mode 100644
index bdc8abb2..00000000
--- a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/community/lpa/Lpa.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.algorithm.community.lpa;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Random;
-
-import org.apache.commons.lang3.mutable.MutableInt;
-
-import com.baidu.hugegraph.computer.core.graph.id.Id;
-import com.baidu.hugegraph.computer.core.graph.vertex.Vertex;
-import com.baidu.hugegraph.computer.core.worker.Computation;
-import com.baidu.hugegraph.computer.core.worker.ComputationContext;
-
-public class Lpa implements Computation<Id> {
-
-    private final Random random = new Random();
-
-    @Override
-    public String name() {
-        return "lpa";
-    }
-
-    @Override
-    public String category() {
-        return "community";
-    }
-
-    @Override
-    public void compute0(ComputationContext context, Vertex vertex) {
-        Id value = vertex.id();
-        vertex.value(value);
-        vertex.inactivate();
-        context.sendMessageToAllEdges(vertex, value);
-    }
-
-    @Override
-    public void compute(ComputationContext context, Vertex vertex,
-                        Iterator<Id> messages) {
-        Id label = this.voteLabel(messages);
-        Id value = vertex.value();
-        if (!value.equals(label)) {
-            vertex.value(label);
-            context.sendMessageToAllEdges(vertex, label);
-        }
-        vertex.inactivate();
-    }
-
-    private Id voteLabel(Iterator<Id> messages) {
-        // Calculate label frequency
-        Map<Id, MutableInt> labels = new HashMap<>();
-        assert messages.hasNext();
-        while (messages.hasNext()) {
-            Id label = messages.next();
-            MutableInt labelCount = labels.get(label);
-            if (labelCount != null) {
-                labelCount.increment();
-            } else {
-                labels.put(label, new MutableInt(1));
-            }
-        }
-
-        // Calculate the labels with maximum frequency
-        List<Id> maxLabels = new ArrayList<>();
-        int maxFreq = 1;
-        for (Map.Entry<Id, MutableInt> e : labels.entrySet()) {
-            int value = e.getValue().intValue();
-            if (value > maxFreq) {
-                maxFreq = value;
-                maxLabels.clear();
-            }
-            if (value == maxFreq) {
-                maxLabels.add(e.getKey());
-            }
-        }
-
-        // Random choice
-        int selected = this.random.nextInt(maxLabels.size());
-        return maxLabels.get(selected);
-    }
-}
diff --git a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/community/lpa/LpaParams.java b/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/community/lpa/LpaParams.java
deleted file mode 100644
index 9839f2b2..00000000
--- a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/community/lpa/LpaParams.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.algorithm.community.lpa;
-
-import java.util.Map;
-
-import com.baidu.hugegraph.computer.algorithm.AlgorithmParams;
-import com.baidu.hugegraph.computer.core.config.ComputerOptions;
-
-public class LpaParams implements AlgorithmParams {
-
-    @Override
-    public void setAlgorithmParameters(Map<String, String> params) {
-        this.setIfAbsent(params, ComputerOptions.WORKER_COMPUTATION_CLASS,
-                         Lpa.class.getName());
-        this.setIfAbsent(params, ComputerOptions.ALGORITHM_RESULT_CLASS,
-                         BYTESID_CLASS_NAME);
-        this.setIfAbsent(params, ComputerOptions.ALGORITHM_MESSAGE_CLASS,
-                         BYTESID_CLASS_NAME);
-        this.setIfAbsent(params, ComputerOptions.OUTPUT_CLASS,
-                         HUGEGRAPH_ID_OUTPUT_CLASS_NAME);
-    }
-}
diff --git a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/community/trianglecount/TriangleCount.java b/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/community/trianglecount/TriangleCount.java
deleted file mode 100644
index 7fa082d0..00000000
--- a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/community/trianglecount/TriangleCount.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.algorithm.community.trianglecount;
-
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import com.baidu.hugegraph.computer.core.graph.edge.Edge;
-import com.baidu.hugegraph.computer.core.graph.edge.Edges;
-import com.baidu.hugegraph.computer.core.graph.id.Id;
-import com.baidu.hugegraph.computer.core.graph.value.IdList;
-import com.baidu.hugegraph.computer.core.graph.value.IdSet;
-import com.baidu.hugegraph.computer.core.graph.vertex.Vertex;
-import com.baidu.hugegraph.computer.core.worker.Computation;
-import com.baidu.hugegraph.computer.core.worker.ComputationContext;
-
-public class TriangleCount implements Computation<IdList> {
-
-    @Override
-    public String name() {
-        return "triangle_count";
-    }
-
-    @Override
-    public String category() {
-        return "community";
-    }
-
-    @Override
-    public void compute0(ComputationContext context, Vertex vertex) {
-        IdSet selfId = new IdSet();
-        selfId.add(vertex.id());
-
-        context.sendMessageToAllEdgesIf(vertex, selfId, (ids, targetId) -> {
-            return !vertex.id().equals(targetId);
-        });
-        vertex.value(new TriangleCountValue());
-    }
-
-    @Override
-    public void compute(ComputationContext context, Vertex vertex,
-                        Iterator<IdList> messages) {
-        IdSet neighbors = ((TriangleCountValue) vertex.value()).idSet();
-        Integer count = this.triangleCount(context, vertex, messages, neighbors);
-        if (count != null) {
-            ((TriangleCountValue) vertex.value()).count(count);
-            vertex.inactivate();
-        }
-    }
-
-    protected Integer triangleCount(ComputationContext context, Vertex vertex,
-                                    Iterator<IdList> messages, IdSet neighbors) {
-        if (context.superstep() == 1) {
-            // Collect outgoing neighbors
-            Set<Id> outNeighbors = getOutNeighbors(vertex);
-            neighbors.addAll(outNeighbors);
-
-            // Collect incoming neighbors
-            while (messages.hasNext()) {
-                IdList idList = messages.next();
-                assert idList.size() == 1;
-                Id inId = idList.get(0);
-                if (!outNeighbors.contains(inId)) {
-                    neighbors.add(inId);
-                }
-            }
-
-            // Send all neighbors to neighbors
-            for (Id targetId : neighbors.value()) {
-                context.sendMessage(targetId, neighbors);
-            }
-        } else if (context.superstep() == 2) {
-            int count = 0;
-
-            while (messages.hasNext()) {
-                IdList twoDegreeNeighbors = messages.next();
-                for (Id twoDegreeNeighbor : twoDegreeNeighbors.values()) {
-                    if (neighbors.contains(twoDegreeNeighbor)) {
-                        count++;
-                    }
-                }
-            }
-
-            return count >> 1;
-        }
-        return null;
-    }
-
-    private static Set<Id> getOutNeighbors(Vertex vertex) {
-        Set<Id> outNeighbors = new HashSet<>();
-        Edges edges = vertex.edges();
-        for (Edge edge : edges) {
-            Id targetId = edge.targetId();
-            if (!vertex.id().equals(targetId)) {
-                outNeighbors.add(targetId);
-            }
-        }
-        return outNeighbors;
-    }
-}
diff --git a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/community/trianglecount/TriangleCountParams.java b/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/community/trianglecount/TriangleCountParams.java
deleted file mode 100644
index 799da979..00000000
--- a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/community/trianglecount/TriangleCountParams.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.algorithm.community.trianglecount;
-
-import java.util.Map;
-
-import com.baidu.hugegraph.computer.algorithm.AlgorithmParams;
-import com.baidu.hugegraph.computer.core.config.ComputerOptions;
-import com.baidu.hugegraph.computer.core.config.EdgeFrequency;
-import com.baidu.hugegraph.computer.core.graph.value.IdList;
-
-public class TriangleCountParams implements AlgorithmParams {
-
-    @Override
-    public void setAlgorithmParameters(Map<String, String> params) {
-        this.setIfAbsent(params, ComputerOptions.WORKER_COMPUTATION_CLASS,
-                         TriangleCount.class.getName());
-        this.setIfAbsent(params, ComputerOptions.ALGORITHM_MESSAGE_CLASS,
-                         IdList.class.getName());
-        this.setIfAbsent(params, ComputerOptions.ALGORITHM_RESULT_CLASS,
-                         TriangleCountValue.class.getName());
-        this.setIfAbsent(params, ComputerOptions.OUTPUT_CLASS,
-                         HUGEGRAPH_INT_OUTPUT_CLASS_NAME);
-        this.setIfAbsent(params, ComputerOptions.INPUT_EDGE_FREQ.name(),
-                         EdgeFrequency.SINGLE.name());
-    }
-}
diff --git a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/community/trianglecount/TriangleCountValue.java b/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/community/trianglecount/TriangleCountValue.java
deleted file mode 100644
index b50007d0..00000000
--- a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/community/trianglecount/TriangleCountValue.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.algorithm.community.trianglecount;
-
-import java.io.IOException;
-
-import org.apache.commons.lang3.builder.ToStringBuilder;
-
-import com.baidu.hugegraph.computer.core.graph.value.IdSet;
-import com.baidu.hugegraph.computer.core.graph.value.IntValue;
-import com.baidu.hugegraph.computer.core.graph.value.Value.CustomizeValue;
-import com.baidu.hugegraph.computer.core.io.RandomAccessInput;
-import com.baidu.hugegraph.computer.core.io.RandomAccessOutput;
-
-public class TriangleCountValue implements CustomizeValue<Integer> {
-
-    private IdSet idSet;
-    private IntValue count;
-
-    public TriangleCountValue() {
-        this.idSet = new IdSet();
-        this.count = new IntValue();
-    }
-
-    public IdSet idSet() {
-        return this.idSet;
-    }
-
-    public int count() {
-        return this.count.intValue();
-    }
-
-    public void count(int count) {
-        this.count.value(count);
-    }
-
-    @Override
-    public TriangleCountValue copy() {
-        TriangleCountValue triangleCountValue = new TriangleCountValue();
-        triangleCountValue.idSet = this.idSet.copy();
-        triangleCountValue.count = this.count.copy();
-        return triangleCountValue;
-    }
-
-    @Override
-    public void read(RandomAccessInput in) throws IOException {
-        this.idSet.read(in);
-        this.count.read(in);
-    }
-
-    @Override
-    public void write(RandomAccessOutput out) throws IOException {
-        this.idSet.write(out);
-        this.count.write(out);
-    }
-
-    @Override
-    public String toString() {
-        return new ToStringBuilder(this).append("idSet", this.idSet)
-                                        .append("count", this.count).toString();
-    }
-
-    @Override
-    public Integer value() {
-        return this.count.value();
-    }
-}
diff --git a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/community/wcc/Wcc.java b/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/community/wcc/Wcc.java
deleted file mode 100644
index 071af0e7..00000000
--- a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/community/wcc/Wcc.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.algorithm.community.wcc;
-
-import java.util.Iterator;
-
-import com.baidu.hugegraph.computer.core.combiner.Combiner;
-import com.baidu.hugegraph.computer.core.graph.edge.Edge;
-import com.baidu.hugegraph.computer.core.graph.id.Id;
-import com.baidu.hugegraph.computer.core.graph.vertex.Vertex;
-import com.baidu.hugegraph.computer.core.worker.Computation;
-import com.baidu.hugegraph.computer.core.worker.ComputationContext;
-
-/**
- * Wcc stands for Weak Connected Component.
- */
-public class Wcc implements Computation<Id> {
-
-    @Override
-    public String name() {
-        return "wcc";
-    }
-
-    @Override
-    public String category() {
-        return "community";
-    }
-
-    @Override
-    public void compute0(ComputationContext context, Vertex vertex) {
-        Id min = vertex.id();
-        for (Edge edge : vertex.edges()) {
-            if (edge.targetId().compareTo(min) < 0) {
-                min = edge.targetId();
-            }
-        }
-        Id value = min;
-        vertex.value(value);
-        vertex.inactivate();
-        context.sendMessageToAllEdgesIf(vertex, value, (result, target) -> {
-            return result.compareTo(target) < 0;
-        });
-    }
-
-    @Override
-    public void compute(ComputationContext context, Vertex vertex,
-                        Iterator<Id> messages) {
-        Id message = Combiner.combineAll(context.combiner(), messages);
-        Id value = vertex.value();
-        if (value.compareTo(message) > 0) {
-            vertex.value(message);
-            context.sendMessageToAllEdges(vertex, message);
-        }
-        vertex.inactivate();
-    }
-}
diff --git a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/community/wcc/WccParams.java b/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/community/wcc/WccParams.java
deleted file mode 100644
index 192169bd..00000000
--- a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/community/wcc/WccParams.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.algorithm.community.wcc;
-
-import java.util.Map;
-
-import com.baidu.hugegraph.computer.algorithm.AlgorithmParams;
-import com.baidu.hugegraph.computer.core.combiner.ValueMinCombiner;
-import com.baidu.hugegraph.computer.core.config.ComputerOptions;
-
-public class WccParams implements AlgorithmParams {
-
-    @Override
-    public void setAlgorithmParameters(Map<String, String> params) {
-        this.setIfAbsent(params, ComputerOptions.WORKER_COMPUTATION_CLASS,
-                         Wcc.class.getName());
-        this.setIfAbsent(params, ComputerOptions.ALGORITHM_RESULT_CLASS,
-                         BYTESID_CLASS_NAME);
-        this.setIfAbsent(params, ComputerOptions.ALGORITHM_MESSAGE_CLASS,
-                         BYTESID_CLASS_NAME);
-        this.setIfAbsent(params, ComputerOptions.WORKER_COMBINER_CLASS,
-                         ValueMinCombiner.class.getName());
-        this.setIfAbsent(params, ComputerOptions.OUTPUT_CLASS,
-                         HUGEGRAPH_ID_OUTPUT_CLASS_NAME);
-    }
-}
diff --git a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/path/rings/RingsDetection.java b/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/path/rings/RingsDetection.java
deleted file mode 100644
index 4527065a..00000000
--- a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/path/rings/RingsDetection.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.algorithm.path.rings;
-
-import java.util.Iterator;
-
-import com.baidu.hugegraph.computer.core.graph.edge.Edge;
-import com.baidu.hugegraph.computer.core.graph.id.Id;
-import com.baidu.hugegraph.computer.core.graph.value.IdList;
-import com.baidu.hugegraph.computer.core.graph.value.IdListList;
-import com.baidu.hugegraph.computer.core.graph.vertex.Vertex;
-import com.baidu.hugegraph.computer.core.worker.Computation;
-import com.baidu.hugegraph.computer.core.worker.ComputationContext;
-
-public class RingsDetection implements Computation<IdList> {
-
-    @Override
-    public String name() {
-        return "rings";
-    }
-
-    @Override
-    public String category() {
-        return "path";
-    }
-
-    @Override
-    public void compute0(ComputationContext context, Vertex vertex) {
-        vertex.value(new IdListList());
-        if (vertex.edges().size() == 0) {
-            return;
-        }
-
-        // Init path
-        Id id = vertex.id();
-        IdList path = new IdList();
-        path.add(id);
-
-        for (Edge edge : vertex.edges()) {
-            /*
-             * Only send path to vertex whose id is larger than
-             * or equals current vertex id
-             */
-            if (id.compareTo(edge.targetId()) <= 0) {
-                context.sendMessage(edge.targetId(), path);
-            }
-        }
-    }
-
-    @Override
-    public void compute(ComputationContext context, Vertex vertex,
-                        Iterator<IdList> messages) {
-        Id id = vertex.id();
-        boolean halt = true;
-        while (messages.hasNext()) {
-            halt = false;
-            IdList sequence = messages.next();
-            if (id.equals(sequence.get(0))) {
-                // Use the smallest vertex record ring
-                boolean isMin = true;
-                for (int i = 1; i < sequence.size(); i++) {
-                    Id pathVertexValue = sequence.get(i);
-                    if (id.compareTo(pathVertexValue) > 0) {
-                        isMin = false;
-                        break;
-                    }
-                }
-                if (isMin) {
-                    sequence.add(id);
-                    IdListList sequences = vertex.value();
-                    sequences.add(sequence);
-                }
-            } else {
-                boolean contains = false;
-                // Drop sequence if path contains this vertex
-                for (int i = 0; i < sequence.size(); i++) {
-                    Id pathVertexValue = sequence.get(i);
-                    if (pathVertexValue.equals(vertex.id())) {
-                        contains = true;
-                        break;
-                    }
-                }
-                // Field ringId is smallest vertex id in path
-                Id ringId = sequence.get(0);
-                if (!contains) {
-                    sequence.add(vertex.id());
-                    for (Edge edge : vertex.edges()) {
-                        if (ringId.compareTo(edge.targetId()) <= 0) {
-                            context.sendMessage(edge.targetId(), sequence);
-                        }
-                    }
-                }
-            }
-        }
-        if (halt) {
-            vertex.inactivate();
-        }
-    }
-}
diff --git a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/path/rings/RingsDetectionOutput.java b/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/path/rings/RingsDetectionOutput.java
deleted file mode 100644
index d74ec6f2..00000000
--- a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/path/rings/RingsDetectionOutput.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.algorithm.path.rings;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import com.baidu.hugegraph.computer.core.graph.value.IdListList;
-import com.baidu.hugegraph.computer.core.graph.vertex.Vertex;
-import com.baidu.hugegraph.computer.core.output.hg.HugeGraphOutput;
-
-public class RingsDetectionOutput extends HugeGraphOutput<List<String>> {
-
-    @Override
-    protected void prepareSchema() {
-        this.client().schema().propertyKey(this.name())
-                     .asText()
-                     .writeType(this.writeType())
-                     .valueList()
-                     .ifNotExist()
-                     .create();
-    }
-
-    @Override
-    protected List<String> value(Vertex vertex) {
-        IdListList value = vertex.value();
-        List<String> propValues = new ArrayList<>();
-        for (int i = 0; i < value.size(); i++) {
-            propValues.add(value.get(i).toString());
-        }
-        return propValues;
-    }
-}
diff --git a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/path/rings/RingsDetectionParams.java b/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/path/rings/RingsDetectionParams.java
deleted file mode 100644
index 55ded11e..00000000
--- a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/path/rings/RingsDetectionParams.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.algorithm.path.rings;
-
-import java.util.Map;
-
-import com.baidu.hugegraph.computer.algorithm.AlgorithmParams;
-import com.baidu.hugegraph.computer.core.config.ComputerOptions;
-import com.baidu.hugegraph.computer.core.graph.value.IdList;
-import com.baidu.hugegraph.computer.core.graph.value.IdListList;
-
-public class RingsDetectionParams implements AlgorithmParams {
-
-    @Override
-    public void setAlgorithmParameters(Map<String, String> params) {
-        this.setIfAbsent(params, ComputerOptions.WORKER_COMPUTATION_CLASS,
-                         RingsDetection.class.getName());
-        this.setIfAbsent(params, ComputerOptions.ALGORITHM_MESSAGE_CLASS,
-                         IdList.class.getName());
-        this.setIfAbsent(params, ComputerOptions.ALGORITHM_RESULT_CLASS,
-                         IdListList.class.getName());
-        this.setIfAbsent(params, ComputerOptions.OUTPUT_CLASS,
-                         RingsDetectionOutput.class.getName());
-    }
-}
diff --git a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/path/rings/filter/FilterDescribe.java b/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/path/rings/filter/FilterDescribe.java
deleted file mode 100644
index 38dbc41b..00000000
--- a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/path/rings/filter/FilterDescribe.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.algorithm.path.rings.filter;
-
-import java.util.List;
-
-import org.apache.commons.collections.CollectionUtils;
-
-import org.apache.hugegraph.util.JsonUtil;
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.collect.ImmutableList;
-
-public class FilterDescribe {
-
-    private final List<DescribeItem> vertexFilter;
-    private final List<DescribeItem> edgeFilter;
-
-    @JsonCreator
-    private FilterDescribe(@JsonProperty("vertex_filter")
-                           List<DescribeItem> vertexFilter,
-                           @JsonProperty("edge_filter")
-                           List<DescribeItem> edgeFilter) {
-        this.vertexFilter = CollectionUtils.isEmpty(vertexFilter) ?
-                            ImmutableList.of() :
-                            ImmutableList.copyOf(vertexFilter);
-        this.edgeFilter = CollectionUtils.isEmpty(edgeFilter) ?
-                          ImmutableList.of() :
-                          ImmutableList.copyOf(edgeFilter);
-    }
-
-    public static FilterDescribe of(String describe) {
-        return JsonUtil.fromJson(describe, FilterDescribe.class);
-    }
-
-    public List<DescribeItem> vertexFilter() {
-        return this.vertexFilter;
-    }
-
-    public List<DescribeItem> edgeFilter() {
-        return this.edgeFilter;
-    }
-
-    public static class DescribeItem {
-
-        private final String label;
-        private final String propertyFilter;
-
-        @JsonCreator
-        private DescribeItem(@JsonProperty(value = "label",
-                                           required = true)
-                             String label,
-                             @JsonProperty(value = "property_filter",
-                                           required = true)
-                             String propertyFilter) {
-            this.label = label;
-            this.propertyFilter = propertyFilter;
-        }
-
-        public String label() {
-            return this.label;
-        }
-
-        public String propertyFilter() {
-            return this.propertyFilter;
-        }
-    }
-}
diff --git a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/path/rings/filter/RingsDetectionMessage.java b/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/path/rings/filter/RingsDetectionMessage.java
deleted file mode 100644
index 31649a47..00000000
--- a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/path/rings/filter/RingsDetectionMessage.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.algorithm.path.rings.filter;
-
-import java.io.IOException;
-import java.util.List;
-
-import com.baidu.hugegraph.computer.core.common.ComputerContext;
-import com.baidu.hugegraph.computer.core.graph.GraphFactory;
-import com.baidu.hugegraph.computer.core.graph.properties.DefaultProperties;
-import com.baidu.hugegraph.computer.core.graph.properties.Properties;
-import com.baidu.hugegraph.computer.core.graph.value.IdList;
-import com.baidu.hugegraph.computer.core.graph.value.Value.CustomizeValue;
-import com.baidu.hugegraph.computer.core.graph.vertex.Vertex;
-import com.baidu.hugegraph.computer.core.io.RandomAccessInput;
-import com.baidu.hugegraph.computer.core.io.RandomAccessOutput;
-
-public class RingsDetectionMessage implements CustomizeValue<List<Object>> {
-
-    private final IdList path;
-    private Properties walkEdgeProps;
-
-    public RingsDetectionMessage() {
-        GraphFactory graphFactory = ComputerContext.instance().graphFactory();
-        this.path = new IdList();
-        this.walkEdgeProps = new DefaultProperties(graphFactory);
-    }
-
-    @Override
-    public void read(RandomAccessInput in) throws IOException {
-        this.path.read(in);
-        this.walkEdgeProps.read(in);
-    }
-
-    @Override
-    public void write(RandomAccessOutput out) throws IOException {
-        this.path.write(out);
-        this.walkEdgeProps.write(out);
-    }
-
-    public IdList path() {
-        return this.path;
-    }
-
-    public void addPath(Vertex vertex) {
-        this.path.add(vertex.id());
-    }
-
-    public Properties walkEdgeProp() {
-        return this.walkEdgeProps;
-    }
-
-    public void walkEdgeProp(Properties properties) {
-        this.walkEdgeProps = properties;
-    }
-
-    @Override
-    public List<Object> value() {
-        return this.path.value();
-    }
-}
diff --git a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/path/rings/filter/RingsDetectionWithFilter.java b/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/path/rings/filter/RingsDetectionWithFilter.java
deleted file mode 100644
index 8e349357..00000000
--- a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/path/rings/filter/RingsDetectionWithFilter.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.algorithm.path.rings.filter;
-
-import java.util.Iterator;
-
-import com.baidu.hugegraph.computer.core.config.Config;
-import com.baidu.hugegraph.computer.core.graph.edge.Edge;
-import com.baidu.hugegraph.computer.core.graph.id.Id;
-import com.baidu.hugegraph.computer.core.graph.value.IdList;
-import com.baidu.hugegraph.computer.core.graph.value.IdListList;
-import com.baidu.hugegraph.computer.core.graph.vertex.Vertex;
-import com.baidu.hugegraph.computer.core.worker.Computation;
-import com.baidu.hugegraph.computer.core.worker.ComputationContext;
-
-public class RingsDetectionWithFilter
-       implements Computation<RingsDetectionMessage> {
-
-    public static final String OPTION_FILTER = "rings.property_filter";
-
-    private SpreadFilter filter;
-
-    @Override
-    public String name() {
-        return "rings_with_filter";
-    }
-
-    @Override
-    public String category() {
-        return "path";
-    }
-
-    @Override
-    public void init(Config config) {
-        this.filter = new SpreadFilter(config.getString(OPTION_FILTER, "{}"));
-    }
-
-    @Override
-    public void compute0(ComputationContext context, Vertex vertex) {
-        vertex.value(new IdListList());
-        if (vertex.edges().size() == 0 || !this.filter.filter(vertex)) {
-            return;
-        }
-
-        RingsDetectionMessage message = new RingsDetectionMessage();
-        message.addPath(vertex);
-        for (Edge edge : vertex.edges()) {
-            if (this.filter.filter(edge)) {
-                message.walkEdgeProp(edge.properties());
-                context.sendMessage(edge.targetId(), message);
-            }
-        }
-    }
-
-    @Override
-    public void compute(ComputationContext context, Vertex vertex,
-                        Iterator<RingsDetectionMessage> messages) {
-        boolean halt = true;
-        if (this.filter.filter(vertex)) {
-            Id vertexId = vertex.id();
-            while (messages.hasNext()) {
-                halt = false;
-                RingsDetectionMessage message = messages.next();
-                IdList path = message.path();
-                if (vertexId.equals(path.get(0))) {
-                    // Use the smallest vertex record ring
-                    boolean isMin = true;
-                    for (int i = 0; i < path.size(); i++) {
-                        Id pathVertexValue = path.get(i);
-                        if (vertexId.compareTo(pathVertexValue) > 0) {
-                            isMin = false;
-                            break;
-                        }
-                    }
-                    if (isMin) {
-                        path.add(vertexId);
-                        IdListList value = vertex.value();
-                        value.add(path.copy());
-                    }
-                } else {
-                    boolean contains = false;
-                    // Drop sequence if path contains this vertex
-                    for (int i = 0; i < path.size(); i++) {
-                        Id pathVertexValue = path.get(i);
-                        if (pathVertexValue.equals(vertex.id())) {
-                            contains = true;
-                            break;
-                        }
-                    }
-                    if (!contains) {
-                        path.add(vertex.id());
-                        for (Edge edge : vertex.edges()) {
-                            if (this.filter.filter(edge, message)) {
-                                message.walkEdgeProp(edge.properties());
-                                context.sendMessage(edge.targetId(), message);
-                            }
-                        }
-                    }
-                }
-            }
-        }
-        if (halt) {
-            vertex.inactivate();
-        }
-    }
-}
diff --git a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/path/rings/filter/RingsDetectionWithFilterParams.java b/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/path/rings/filter/RingsDetectionWithFilterParams.java
deleted file mode 100644
index 35571243..00000000
--- a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/path/rings/filter/RingsDetectionWithFilterParams.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.algorithm.path.rings.filter;
-
-import java.util.Map;
-
-import com.baidu.hugegraph.computer.algorithm.AlgorithmParams;
-import com.baidu.hugegraph.computer.algorithm.path.rings.RingsDetectionOutput;
-import com.baidu.hugegraph.computer.core.config.ComputerOptions;
-import com.baidu.hugegraph.computer.core.graph.value.IdListList;
-
-public class RingsDetectionWithFilterParams implements AlgorithmParams {
-
-    @Override
-    public void setAlgorithmParameters(Map<String, String> params) {
-        this.setIfAbsent(params, ComputerOptions.WORKER_COMPUTATION_CLASS,
-                         RingsDetectionWithFilter.class.getName());
-        this.setIfAbsent(params, ComputerOptions.ALGORITHM_RESULT_CLASS,
-                         IdListList.class.getName());
-        this.setIfAbsent(params, ComputerOptions.ALGORITHM_MESSAGE_CLASS,
-                         RingsDetectionMessage.class.getName());
-        this.setIfAbsent(params, ComputerOptions.OUTPUT_CLASS,
-                         RingsDetectionOutput.class.getName());
-        this.setIfAbsent(params, ComputerOptions.INPUT_FILTER_CLASS,
-                         EXTRACTALLPROPERTYINPUTFILTER_CLASS_NAME);
-    }
-}
diff --git a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/path/rings/filter/SpreadFilter.java b/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/path/rings/filter/SpreadFilter.java
deleted file mode 100644
index fa197b58..00000000
--- a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/path/rings/filter/SpreadFilter.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.algorithm.path.rings.filter;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.function.Predicate;
-
-import org.mvel2.MVEL;
-
-import com.baidu.hugegraph.computer.core.graph.edge.Edge;
-import com.baidu.hugegraph.computer.core.graph.value.Value;
-import com.baidu.hugegraph.computer.core.graph.vertex.Vertex;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-
-public class SpreadFilter {
-
-    private static final String ALL = "*";
-    private static final String MESSAGE = "$message";
-    private static final String ELEMENT = "$element";
-    private static final List<Serializable> PASS = ImmutableList.of();
-
-    private final Map<String, Serializable> vertexFilter;
-    private final Map<String, Serializable> edgeSpreadFilter;
-    private final Map<String, Serializable> edgeFilter;
-
-    public SpreadFilter(String describe) {
-        FilterDescribe des = FilterDescribe.of(describe);
-
-        this.vertexFilter = new HashMap<>();
-        this.edgeSpreadFilter = new HashMap<>();
-        this.edgeFilter = new HashMap<>();
-
-        this.init(this.vertexFilter, des.vertexFilter(), expression -> true);
-        this.init(this.edgeSpreadFilter, des.edgeFilter(), expression -> true);
-        // TODO: Use a better scheme to parse expressions with only $element
-        this.init(this.edgeFilter, des.edgeFilter(), expression -> {
-            return !expression.contains(MESSAGE);
-        });
-    }
-
-    private void init(Map<String, Serializable> filter,
-                      List<FilterDescribe.DescribeItem> describes,
-                      Predicate<? super String> predicate) {
-        for (FilterDescribe.DescribeItem describe : describes) {
-            String labelName = describe.label();
-            String propertyFilter = describe.propertyFilter();
-            if (predicate.test(propertyFilter) || ALL.equals(labelName)) {
-                Serializable expression = MVEL.compileExpression(
-                                               describe.propertyFilter());
-                filter.put(labelName, expression);
-            }
-        }
-    }
-
-    public boolean filter(Vertex vertex) {
-        String label = vertex.label();
-        List<Serializable> expressions = expressions(this.vertexFilter, label);
-
-        if (expressions == PASS) {
-            return true;
-        }
-
-        Map<String, Map<String, Value>> params =
-                    ImmutableMap.of(ELEMENT, vertex.properties().get());
-        return filter(params, expressions);
-    }
-
-    public boolean filter(Edge edge) {
-        String label = edge.label();
-        List<Serializable> expressions = expressions(this.edgeFilter, label);
-
-        if (expressions == PASS) {
-            return true;
-        }
-
-        Map<String, Map<String, Value>> params =
-                    ImmutableMap.of(ELEMENT, edge.properties().get());
-        return filter(params, expressions);
-    }
-
-    public boolean filter(Edge edge, RingsDetectionMessage message) {
-        String label = edge.label();
-        List<Serializable> expressions = expressions(this.edgeSpreadFilter,
-                                                     label);
-
-        if (expressions == PASS) {
-            return true;
-        }
-
-        Map<String, Map<String, Value>> params =
-                    ImmutableMap.of(ELEMENT, edge.properties().get(),
-                                    MESSAGE, message.walkEdgeProp().get());
-        return filter(params, expressions);
-    }
-
-    private static boolean filter(Map<String, Map<String, Value>> params,
-                                  List<Serializable> expressions) {
-        Map<String, Object> map = convertParamsValueToObject(params);
-        return expressions.stream()
-                          .allMatch(expression -> {
-                              return (Boolean) MVEL.executeExpression(
-                                                    expression, map);
-                          });
-    }
-
-    private static List<Serializable> expressions(
-                                      Map<String, Serializable> filter,
-                                      String label) {
-        if (filter.size() == 0) {
-            return PASS;
-        }
-        List<Serializable> expressions = new ArrayList<>();
-        if (filter.containsKey(ALL)) {
-            expressions.add(filter.get(ALL));
-        }
-        if (filter.containsKey(label)) {
-            expressions.add(filter.get(label));
-        }
-
-        return expressions;
-    }
-
-    private static Map<String, Object> convertParamsValueToObject(
-                   Map<String, Map<String, Value>> params) {
-        Map<String, Object> result = new HashMap<>();
-        for (Map.Entry<String, Map<String, Value>> entry : params.entrySet()) {
-            Map<String, Object> subKv = new HashMap<>();
-            Map<String, Value> param = entry.getValue();
-            for (Map.Entry<String, Value> paramItem : param.entrySet()) {
-                subKv.put(paramItem.getKey(), paramItem.getValue().value());
-            }
-            result.put(entry.getKey(), subKv);
-        }
-        return result;
-    }
-}
diff --git a/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/centrality/betweenness/BetweennessCentrality.java b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/centrality/betweenness/BetweennessCentrality.java
new file mode 100644
index 00000000..12d7bd86
--- /dev/null
+++ b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/centrality/betweenness/BetweennessCentrality.java
@@ -0,0 +1,192 @@
+/*
+ * Copyright 2017 HugeGraph Authors
+ *
+ * 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.
+ */
+
+package org.apache.hugegraph.computer.algorithm.centrality.betweenness;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.apache.hugegraph.computer.core.common.exception.ComputerException;
+import org.apache.hugegraph.computer.core.config.Config;
+import org.apache.hugegraph.computer.core.graph.edge.Edge;
+import org.apache.hugegraph.computer.core.graph.id.Id;
+import org.apache.hugegraph.computer.core.graph.value.DoubleValue;
+import org.apache.hugegraph.computer.core.graph.value.IdList;
+import org.apache.hugegraph.computer.core.graph.value.IdSet;
+import org.apache.hugegraph.computer.core.graph.vertex.Vertex;
+import org.apache.hugegraph.computer.core.worker.Computation;
+import org.apache.hugegraph.computer.core.worker.ComputationContext;
+import org.apache.hugegraph.util.Log;
+import org.slf4j.Logger;
+
+public class BetweennessCentrality implements Computation<BetweennessMessage> {
+
+    private static final Logger LOG = Log.logger(BetweennessCentrality.class);
+
+    public static final String OPTION_SAMPLE_RATE =
+                               "betweenness_centrality.sample_rate";
+
+    private double sampleRate;
+    /*
+     * Record the number of shortest paths for intermediate vertex, suppose
+     * there are two shortest paths from A(source vertex) to E(current vertex),
+     * [A -> B -> C -> E] and [A -> B -> D -> E]
+     *
+     * The saved data is as follows
+     * A: B:2
+     *    C:1
+     *    D:1
+     *    totalCount:2
+     */
+    private Map<Id, SeqCount> seqTable;
+
+    @Override
+    public String name() {
+        return "betweenness_centrality";
+    }
+
+    @Override
+    public String category() {
+        return "centrality";
+    }
+
+    @Override
+    public void init(Config config) {
+        this.sampleRate = config.getDouble(OPTION_SAMPLE_RATE, 1.0D);
+        if (this.sampleRate <= 0.0D || this.sampleRate > 1.0D) {
+            throw new ComputerException("The param %s must be in (0.0, 1.0], " +
+                                        "actual got '%s'",
+                                        OPTION_SAMPLE_RATE, this.sampleRate);
+        }
+        this.seqTable = new HashMap<>();
+    }
+
+    @Override
+    public void close(Config config) {
+        // pass
+    }
+
+    @Override
+    public void compute0(ComputationContext context, Vertex vertex) {
+        // First superstep is special, we just send vertex id to its neighbors
+        BetweennessValue initialValue = new BetweennessValue(0.0D);
+        initialValue.arrivedVertices().add(vertex.id());
+        vertex.value(initialValue);
+        if (vertex.numEdges() == 0) {
+            return;
+        }
+
+        IdList sequence = new IdList();
+        sequence.add(vertex.id());
+        context.sendMessageToAllEdges(vertex, new BetweennessMessage(sequence));
+        LOG.info("Finished compute-0 step");
+    }
+
+    @Override
+    public void compute(ComputationContext context, Vertex vertex,
+                        Iterator<BetweennessMessage> messages) {
+        BetweennessValue value = vertex.value();
+        // The betweenness value to be updated
+        DoubleValue betweenness = value.betweenness();
+        // Collect the vertices sent here this time
+        IdSet arrivingVertices = new IdSet();
+        while (messages.hasNext()) {
+            BetweennessMessage message = messages.next();
+            // The value contributed to the intermediate node on the path
+            DoubleValue vote = message.vote();
+            betweenness.value(betweenness.value() + vote.value());
+
+            this.forward(context, vertex, message.sequence(), arrivingVertices);
+        }
+        value.arrivedVertices().addAll(arrivingVertices);
+
+        boolean active = !this.seqTable.isEmpty();
+        if (active) {
+            this.sendMessage(context);
+            this.seqTable.clear();
+        } else {
+            vertex.inactivate();
+        }
+    }
+
+    private void forward(ComputationContext context, Vertex vertex,
+                         IdList sequence, IdSet arrivingVertices) {
+        if (sequence.size() == 0) {
+            return;
+        }
+
+        BetweennessValue value = vertex.value();
+        IdSet arrivedVertices = value.arrivedVertices();
+        Id source = sequence.get(0);
+        // The source vertex is arriving at first time
+        if (!arrivedVertices.contains(source)) {
+            arrivingVertices.add(source);
+
+            SeqCount seqCount = this.seqTable.computeIfAbsent(
+                    source, k -> new SeqCount());
+            seqCount.totalCount++;
+            // Accumulate the number of shortest paths for intermediate vertices
+            for (int i = 1; i < sequence.size(); i++) {
+                Id id = sequence.get(i);
+                Map<Id, Integer> idCounts = seqCount.idCount;
+                idCounts.put(id, idCounts.getOrDefault(id, 0) + 1);
+            }
+
+            Id selfId = vertex.id();
+            sequence.add(selfId);
+            BetweennessMessage newMessage = new BetweennessMessage(sequence);
+            for (Edge edge : vertex.edges()) {
+                Id targetId = edge.targetId();
+                if (this.sample(selfId, targetId, edge) &&
+                    !sequence.contains(targetId)) {
+                    context.sendMessage(targetId, newMessage);
+                }
+            }
+        }
+    }
+
+    private void sendMessage(ComputationContext context) {
+        for (SeqCount seqCount : this.seqTable.values()) {
+            for (Map.Entry<Id, Integer> entry : seqCount.idCount.entrySet()) {
+                double vote = (double) entry.getValue() / seqCount.totalCount;
+                BetweennessMessage voteMessage = new BetweennessMessage(
+                                                 new DoubleValue(vote));
+
+                context.sendMessage(entry.getKey(), voteMessage);
+            }
+        }
+    }
+
+    private boolean sample(Id sourceId, Id targetId, Edge edge) {
+        // Now just use the simplest way
+        return Math.random() <= this.sampleRate;
+    }
+
+    private static class SeqCount {
+
+        private final Map<Id, Integer> idCount;
+        private int totalCount;
+
+        public SeqCount() {
+            this.idCount = new HashMap<>();
+            this.totalCount = 0;
+        }
+    }
+}
diff --git a/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/centrality/betweenness/BetweennessCentralityParams.java b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/centrality/betweenness/BetweennessCentralityParams.java
new file mode 100644
index 00000000..bb7d288e
--- /dev/null
+++ b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/centrality/betweenness/BetweennessCentralityParams.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2017 HugeGraph Authors
+ *
+ * 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.
+ */
+
+package org.apache.hugegraph.computer.algorithm.centrality.betweenness;
+
+import java.util.Map;
+
+import org.apache.hugegraph.computer.algorithm.AlgorithmParams;
+import org.apache.hugegraph.computer.algorithm.centrality.closeness.ClosenessCentrality;
+import org.apache.hugegraph.computer.core.config.ComputerOptions;
+import org.apache.hugegraph.computer.core.master.DefaultMasterComputation;
+
+public class BetweennessCentralityParams implements AlgorithmParams {
+
+    @Override
+    public void setAlgorithmParameters(Map<String, String> params) {
+        this.setIfAbsent(params, ComputerOptions.MASTER_COMPUTATION_CLASS,
+                         DefaultMasterComputation.class.getName());
+        this.setIfAbsent(params, ComputerOptions.WORKER_COMPUTATION_CLASS,
+                         BetweennessCentrality.class.getName());
+        this.setIfAbsent(params, ComputerOptions.ALGORITHM_RESULT_CLASS,
+                         BetweennessValue.class.getName());
+        this.setIfAbsent(params, ComputerOptions.ALGORITHM_MESSAGE_CLASS,
+                         BetweennessMessage.class.getName());
+        this.setIfAbsent(params, ComputerOptions.OUTPUT_CLASS,
+                         HUGEGRAPH_DOUBLE_OUTPUT_CLASS_NAME);
+        this.setIfAbsent(params, ComputerOptions.INPUT_FILTER_CLASS,
+                         EXTRACTALLPROPERTYINPUTFILTER_CLASS_NAME);
+        this.setIfAbsent(params, ClosenessCentrality.OPTION_SAMPLE_RATE,
+                         "0.5D");
+    }
+}
diff --git a/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/centrality/betweenness/BetweennessMessage.java b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/centrality/betweenness/BetweennessMessage.java
new file mode 100644
index 00000000..436c0808
--- /dev/null
+++ b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/centrality/betweenness/BetweennessMessage.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2017 HugeGraph Authors
+ *
+ * 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.
+ */
+
+package org.apache.hugegraph.computer.algorithm.centrality.betweenness;
+
+import java.io.IOException;
+
+import org.apache.hugegraph.computer.core.graph.id.Id;
+import org.apache.hugegraph.computer.core.graph.value.DoubleValue;
+import org.apache.hugegraph.computer.core.graph.value.IdList;
+import org.apache.hugegraph.computer.core.graph.value.Value;
+import org.apache.hugegraph.computer.core.graph.value.Value.CustomizeValue;
+import org.apache.hugegraph.computer.core.io.RandomAccessInput;
+import org.apache.hugegraph.computer.core.io.RandomAccessOutput;
+import org.apache.hugegraph.util.E;
+
+public class BetweennessMessage implements CustomizeValue<BetweennessMessage> {
+
+    private final IdList sequence;
+    private final DoubleValue vote;
+
+    public BetweennessMessage() {
+        this.sequence = new IdList();
+        this.vote = new DoubleValue(0.0D);
+    }
+
+    public BetweennessMessage(IdList sequence) {
+        this.sequence = sequence;
+        this.vote = new DoubleValue();
+    }
+
+    public BetweennessMessage(DoubleValue betweenness) {
+        this.sequence = new IdList();
+        this.vote = betweenness;
+    }
+
+    public IdList sequence() {
+        return this.sequence;
+    }
+
+    public DoubleValue vote() {
+        return this.vote;
+    }
+
+    @Override
+    public BetweennessMessage value() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void read(RandomAccessInput in) throws IOException {
+        this.sequence.read(in);
+        this.vote.read(in);
+    }
+
+    @Override
+    public void write(RandomAccessOutput out) throws IOException {
+        this.sequence.write(out);
+        this.vote.write(out);
+    }
+
+    @Override
+    public int compareTo(Value value) {
+        E.checkArgument(value instanceof BetweennessMessage,
+                        "The BetweennessMessage can't compare with class '%s'",
+                        value.getClass());
+        BetweennessMessage other = (BetweennessMessage) value;
+        E.checkArgument(this.sequence.size() != 0, "Sequence can't be empty");
+        E.checkArgument(other.sequence.size() != 0, "Sequence can't be empty");
+        Id selfSourceId = this.sequence.get(0);
+        Id otherSourceId = other.sequence.get(0);
+        return selfSourceId.compareTo(otherSourceId);
+    }
+}
diff --git a/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/centrality/betweenness/BetweennessValue.java b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/centrality/betweenness/BetweennessValue.java
new file mode 100644
index 00000000..2ebf9525
--- /dev/null
+++ b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/centrality/betweenness/BetweennessValue.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2017 HugeGraph Authors
+ *
+ * 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.
+ */
+
+package org.apache.hugegraph.computer.algorithm.centrality.betweenness;
+
+import java.io.IOException;
+
+import org.apache.hugegraph.computer.core.graph.value.DoubleValue;
+import org.apache.hugegraph.computer.core.graph.value.IdSet;
+import org.apache.hugegraph.computer.core.graph.value.Value.CustomizeValue;
+import org.apache.hugegraph.computer.core.io.RandomAccessInput;
+import org.apache.hugegraph.computer.core.io.RandomAccessOutput;
+
+public class BetweennessValue implements CustomizeValue<Double> {
+
+    private final DoubleValue betweenness;
+    private final IdSet arrivedVertices;
+
+    public BetweennessValue() {
+        this(0.0D);
+    }
+
+    public BetweennessValue(double betweenness) {
+        this.betweenness = new DoubleValue(betweenness);
+        this.arrivedVertices = new IdSet();
+    }
+
+    public DoubleValue betweenness() {
+        return this.betweenness;
+    }
+
+    public IdSet arrivedVertices() {
+        return this.arrivedVertices;
+    }
+
+    @Override
+    public void read(RandomAccessInput in) throws IOException {
+        this.betweenness.read(in);
+        this.arrivedVertices.read(in);
+    }
+
+    @Override
+    public void write(RandomAccessOutput out) throws IOException {
+        this.betweenness.write(out);
+        this.arrivedVertices.write(out);
+    }
+
+    @Override
+    public Double value() {
+        return this.betweenness.value();
+    }
+
+    @Override
+    public String string() {
+        return this.value().toString();
+    }
+}
diff --git a/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/centrality/closeness/ClosenessCentrality.java b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/centrality/closeness/ClosenessCentrality.java
new file mode 100644
index 00000000..db6be5d6
--- /dev/null
+++ b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/centrality/closeness/ClosenessCentrality.java
@@ -0,0 +1,168 @@
+/*
+ * Copyright 2017 HugeGraph Authors
+ *
+ * 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.
+ */
+
+package org.apache.hugegraph.computer.algorithm.centrality.closeness;
+
+import java.util.Iterator;
+
+import org.apache.hugegraph.computer.core.common.exception.ComputerException;
+import org.apache.hugegraph.computer.core.config.Config;
+import org.apache.hugegraph.computer.core.graph.edge.Edge;
+import org.apache.hugegraph.computer.core.graph.id.Id;
+import org.apache.hugegraph.computer.core.graph.value.DoubleValue;
+import org.apache.hugegraph.computer.core.graph.value.Value;
+import org.apache.hugegraph.computer.core.graph.vertex.Vertex;
+import org.apache.hugegraph.computer.core.worker.Computation;
+import org.apache.hugegraph.computer.core.worker.ComputationContext;
+import org.apache.hugegraph.util.Log;
+import org.apache.hugegraph.util.NumericUtil;
+import org.slf4j.Logger;
+
+public class ClosenessCentrality implements Computation<ClosenessMessage> {
+
+    private static final Logger LOG = Log.logger(ClosenessCentrality.class);
+
+    public static final String OPTION_WEIGHT_PROPERTY =
+                               "closeness_centrality.weight_property";
+    public static final String OPTION_SAMPLE_RATE =
+                               "closeness_centrality.sample_rate";
+
+    private String weightProp;
+    private double sampleRate;
+
+    @Override
+    public String name() {
+        return "closeness_centrality";
+    }
+
+    @Override
+    public String category() {
+        return "centrality";
+    }
+
+    @Override
+    public void init(Config config) {
+        this.weightProp = config.getString(OPTION_WEIGHT_PROPERTY, "");
+        this.sampleRate = config.getDouble(OPTION_SAMPLE_RATE, 1.0D);
+        if (this.sampleRate <= 0.0D || this.sampleRate > 1.0D) {
+            throw new ComputerException("The param %s must be in (0.0, 1.0], " +
+                                        "actual got '%s'",
+                                        OPTION_SAMPLE_RATE, this.sampleRate);
+        }
+    }
+
+    @Override
+    public void close(Config config) {
+        // pass
+    }
+
+    @Override
+    public void compute0(ComputationContext context, Vertex vertex) {
+        // Set empty map as initial value
+        vertex.value(new ClosenessValue());
+
+        // Send messages to adjacent edges
+        for (Edge edge : vertex.edges()) {
+            Id senderId = vertex.id();
+            // Get property value
+            double value = this.weightValue(edge.property(this.weightProp));
+            DoubleValue distance = new DoubleValue(value);
+            ClosenessMessage message = new ClosenessMessage(senderId, senderId,
+                                                            distance);
+            context.sendMessage(edge.targetId(), message);
+        }
+    }
+
+    @Override
+    public void compute(ComputationContext context, Vertex vertex,
+                        Iterator<ClosenessMessage> messages) {
+        Id selfId = vertex.id();
+        // Save the distance from other vertices to self
+        ClosenessValue localValue = vertex.value();
+        boolean active = false;
+        while (messages.hasNext()) {
+            active = true;
+            ClosenessMessage message = messages.next();
+            Id senderId = message.senderId();
+            // In theory, it won't happen, defensive programming
+            if (selfId.equals(senderId)) {
+                continue;
+            }
+            Id startId = message.startId();
+            if (selfId.equals(startId)) {
+                continue;
+            }
+
+            DoubleValue oldValue = localValue.get(startId);
+            DoubleValue newValue = message.distance();
+            // If the id already exists and the new value >= old value, skip it
+            if (oldValue != null && newValue.compareTo(oldValue) >= 0) {
+                continue;
+            }
+            // Update local saved values (take smaller value)
+            localValue.put(startId, newValue);
+            // Send this smaller value to neighbors
+            this.sendMessage(context, vertex, senderId, startId, newValue);
+        }
+        if (!active) {
+            vertex.inactivate();
+        }
+    }
+
+    private void sendMessage(ComputationContext context, Vertex vertex,
+                             Id senderId, Id startId, DoubleValue newValue) {
+        Id selfId = vertex.id();
+        double baseNewValue = this.weightValue(newValue);
+        for (Edge edge : vertex.edges()) {
+            Id targetId = edge.targetId();
+            if (senderId.equals(targetId) || startId.equals(targetId)) {
+                continue;
+            }
+            if (!sample(selfId, targetId, edge)) {
+                continue;
+            }
+            // Update distance information
+            double updatedValue = baseNewValue + this.weightValue(edge.property(
+                                                 this.weightProp));
+            DoubleValue newDistance = new DoubleValue(updatedValue);
+            ClosenessMessage message = new ClosenessMessage(selfId, startId,
+                                                            newDistance);
+            context.sendMessage(targetId, message);
+        }
+    }
+
+    private boolean sample(Id sourceId, Id targetId, Edge edge) {
+        // Now just use the simplest way
+        return Math.random() <= this.sampleRate;
+    }
+
+    private double weightValue(Value rawValue) {
+        if (rawValue == null) {
+            return 1.0D;
+        }
+        if (rawValue.isNumber()) {
+            return NumericUtil.convertToNumber(rawValue).doubleValue();
+        } else {
+            throw new ComputerException("The weight property can only be " +
+                                        "either Long or Int or Double or " +
+                                        "Float, but got %s",
+                                        rawValue.valueType());
+        }
+    }
+}
diff --git a/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/centrality/closeness/ClosenessCentralityParams.java b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/centrality/closeness/ClosenessCentralityParams.java
new file mode 100644
index 00000000..d62d1bf8
--- /dev/null
+++ b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/centrality/closeness/ClosenessCentralityParams.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2017 HugeGraph Authors
+ *
+ * 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.
+ */
+
+package org.apache.hugegraph.computer.algorithm.centrality.closeness;
+
+import java.util.Map;
+
+import org.apache.hugegraph.computer.algorithm.AlgorithmParams;
+import org.apache.hugegraph.computer.core.config.ComputerOptions;
+import org.apache.hugegraph.computer.core.master.DefaultMasterComputation;
+
+public class ClosenessCentralityParams implements AlgorithmParams {
+
+    @Override
+    public void setAlgorithmParameters(Map<String, String> params) {
+        this.setIfAbsent(params, ComputerOptions.MASTER_COMPUTATION_CLASS,
+                         DefaultMasterComputation.class.getName());
+        this.setIfAbsent(params, ComputerOptions.WORKER_COMPUTATION_CLASS,
+                         ClosenessCentrality.class.getName());
+        this.setIfAbsent(params, ComputerOptions.ALGORITHM_RESULT_CLASS,
+                         ClosenessValue.class.getName());
+        this.setIfAbsent(params, ComputerOptions.ALGORITHM_MESSAGE_CLASS,
+                         ClosenessMessage.class.getName());
+        this.setIfAbsent(params, ComputerOptions.OUTPUT_CLASS,
+                         HUGEGRAPH_DOUBLE_OUTPUT_CLASS_NAME);
+        this.setIfAbsent(params, ComputerOptions.INPUT_FILTER_CLASS,
+                         EXTRACTALLPROPERTYINPUTFILTER_CLASS_NAME);
+        this.setIfAbsent(params, ClosenessCentrality.OPTION_SAMPLE_RATE,
+                         "0.5D");
+    }
+}
diff --git a/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/centrality/closeness/ClosenessMessage.java b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/centrality/closeness/ClosenessMessage.java
new file mode 100644
index 00000000..4c15baf7
--- /dev/null
+++ b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/centrality/closeness/ClosenessMessage.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2017 HugeGraph Authors
+ *
+ * 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.
+ */
+
+package org.apache.hugegraph.computer.algorithm.centrality.closeness;
+
+import java.io.IOException;
+
+import org.apache.hugegraph.computer.core.common.ComputerContext;
+import org.apache.hugegraph.computer.core.graph.GraphFactory;
+import org.apache.hugegraph.computer.core.graph.id.Id;
+import org.apache.hugegraph.computer.core.graph.id.IdFactory;
+import org.apache.hugegraph.computer.core.graph.value.DoubleValue;
+import org.apache.hugegraph.computer.core.graph.value.Value.CustomizeValue;
+import org.apache.hugegraph.computer.core.graph.value.ValueType;
+import org.apache.hugegraph.computer.core.io.RandomAccessInput;
+import org.apache.hugegraph.computer.core.io.RandomAccessOutput;
+
+public class ClosenessMessage implements CustomizeValue<ClosenessMessage> {
+
+    private final GraphFactory graphFactory;
+
+    private Id senderId;
+    private Id startId;
+    private DoubleValue distance;
+
+    public ClosenessMessage() {
+        this(IdFactory.createId(), IdFactory.createId(), new DoubleValue(0.0D));
+    }
+
+    public ClosenessMessage(Id senderId, Id startId, DoubleValue distance) {
+        this.graphFactory = ComputerContext.instance().graphFactory();
+        this.senderId = senderId;
+        this.startId = startId;
+        this.distance = distance;
+    }
+
+    public Id senderId() {
+        return this.senderId;
+    }
+
+    public Id startId() {
+        return this.startId;
+    }
+
+    public DoubleValue distance() {
+        return this.distance;
+    }
+
+    @Override
+    public ClosenessMessage value() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void read(RandomAccessInput in) throws IOException {
+        this.senderId = this.graphFactory.createId();
+        this.senderId.read(in);
+
+        this.startId = this.graphFactory.createId();
+        this.startId.read(in);
+
+        this.distance = (DoubleValue) this.graphFactory.createValue(
+                                      ValueType.DOUBLE);
+        this.distance.read(in);
+    }
+
+    @Override
+    public void write(RandomAccessOutput out) throws IOException {
+        this.senderId.write(out);
+        this.startId.write(out);
+        this.distance.write(out);
+    }
+}
diff --git a/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/centrality/closeness/ClosenessValue.java b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/centrality/closeness/ClosenessValue.java
new file mode 100644
index 00000000..4e167407
--- /dev/null
+++ b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/centrality/closeness/ClosenessValue.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2017 HugeGraph Authors
+ *
+ * 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.
+ */
+
+package org.apache.hugegraph.computer.algorithm.centrality.closeness;
+
+import java.util.Map;
+
+import org.apache.hugegraph.computer.core.graph.id.Id;
+import org.apache.hugegraph.computer.core.graph.value.DoubleValue;
+import org.apache.hugegraph.computer.core.graph.value.MapValue;
+
+public class ClosenessValue extends MapValue<DoubleValue> {
+
+    @Override
+    public Double value() {
+        // Cumulative distance
+        double centrality = 0;
+        for (Map.Entry<Id, DoubleValue> entry : this.entrySet()) {
+            centrality += 1.0D / entry.getValue().value();
+        }
+        return centrality;
+    }
+
+    @Override
+    public String string() {
+        return this.value().toString();
+    }
+}
diff --git a/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/centrality/degree/DegreeCentrality.java b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/centrality/degree/DegreeCentrality.java
new file mode 100644
index 00000000..105746ef
--- /dev/null
+++ b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/centrality/degree/DegreeCentrality.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2017 HugeGraph Authors
+ *
+ * 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.
+ */
+
+package org.apache.hugegraph.computer.algorithm.centrality.degree;
+
+import java.util.Iterator;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.hugegraph.computer.core.common.exception.ComputerException;
+import org.apache.hugegraph.computer.core.config.Config;
+import org.apache.hugegraph.computer.core.graph.edge.Edge;
+import org.apache.hugegraph.computer.core.graph.value.DoubleValue;
+import org.apache.hugegraph.computer.core.graph.value.NullValue;
+import org.apache.hugegraph.computer.core.graph.value.Value;
+import org.apache.hugegraph.computer.core.graph.vertex.Vertex;
+import org.apache.hugegraph.computer.core.worker.Computation;
+import org.apache.hugegraph.computer.core.worker.ComputationContext;
+import org.apache.hugegraph.computer.core.worker.WorkerContext;
+import org.apache.hugegraph.util.NumericUtil;
+
+public class DegreeCentrality implements Computation<NullValue> {
+
+    public static final String OPTION_WEIGHT_PROPERTY = "degree_centrality.weight_property";
+
+    private boolean calculateByWeightProperty;
+    private String weightProperty;
+
+    @Override
+    public String name() {
+        return "degree_centrality";
+    }
+
+    @Override
+    public String category() {
+        return "centrality";
+    }
+
+    @Override
+    public void compute0(ComputationContext context, Vertex vertex) {
+        if (!this.calculateByWeightProperty) {
+            vertex.value(new DoubleValue(vertex.numEdges()));
+        } else {
+            /*
+             *  TODO: Here we use doubleValue type now, we will use BigDecimal
+             *  and output "BigDecimalValue" to resolve double type overflow
+             *  int the future;
+             */
+            double totalWeight = 0.0;
+            for (Edge edge : vertex.edges()) {
+                double weight = weightValue(edge.property(this.weightProperty));
+                totalWeight += weight;
+                if (Double.isInfinite(totalWeight)) {
+                    throw new ComputerException("Calculate weight overflow, " +
+                                                "current is %s, edge '%s' " +
+                                                "is %s", totalWeight, edge, weight);
+                }
+            }
+            vertex.value(new DoubleValue(totalWeight));
+        }
+        vertex.inactivate();
+    }
+
+    private static double weightValue(Value value) {
+        if (value == null) {
+            return 1.0;
+        }
+
+        switch (value.valueType()) {
+            case LONG:
+            case INT:
+            case DOUBLE:
+            case FLOAT:
+                return NumericUtil.convertToNumber(value).doubleValue();
+            default:
+                throw new ComputerException("The weight property can only be " +
+                                            "either Long or Int or Double or " +
+                                            "Float, but got %s",
+                                            value.valueType());
+        }
+    }
+
+    @Override
+    public void compute(ComputationContext context, Vertex vertex,
+                        Iterator<NullValue> messages) {
+        // pass
+    }
+
+    @Override
+    public void init(Config config) {
+        this.weightProperty = config.getString(
+                              OPTION_WEIGHT_PROPERTY, "");
+        this.calculateByWeightProperty = StringUtils.isNotEmpty(
+                                         this.weightProperty);
+    }
+
+    @Override
+    public void close(Config config) {
+        // pass
+    }
+
+    @Override
+    public void beforeSuperstep(WorkerContext context) {
+        // pass
+    }
+
+    @Override
+    public void afterSuperstep(WorkerContext context) {
+        // pass
+    }
+}
diff --git a/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/centrality/degree/DegreeCentralityParams.java b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/centrality/degree/DegreeCentralityParams.java
new file mode 100644
index 00000000..4b5744ac
--- /dev/null
+++ b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/centrality/degree/DegreeCentralityParams.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2017 HugeGraph Authors
+ *
+ * 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.
+ */
+
+package org.apache.hugegraph.computer.algorithm.centrality.degree;
+
+import java.util.Map;
+
+import org.apache.hugegraph.computer.algorithm.AlgorithmParams;
+import org.apache.hugegraph.computer.core.combiner.DoubleValueSumCombiner;
+import org.apache.hugegraph.computer.core.config.ComputerOptions;
+import org.apache.hugegraph.computer.core.graph.value.DoubleValue;
+import org.apache.hugegraph.computer.core.master.DefaultMasterComputation;
+
+public class DegreeCentralityParams implements AlgorithmParams {
+
+    @Override
+    public void setAlgorithmParameters(Map<String, String> params) {
+        this.setIfAbsent(params, ComputerOptions.MASTER_COMPUTATION_CLASS,
+                         DefaultMasterComputation.class.getName());
+        this.setIfAbsent(params, ComputerOptions.WORKER_COMPUTATION_CLASS,
+                         DegreeCentrality.class.getName());
+        this.setIfAbsent(params, ComputerOptions.ALGORITHM_RESULT_CLASS,
+                         DoubleValue.class.getName());
+        this.setIfAbsent(params, ComputerOptions.ALGORITHM_MESSAGE_CLASS,
+                         DoubleValue.class.getName());
+        this.setIfAbsent(params, ComputerOptions.WORKER_COMBINER_CLASS,
+                         DoubleValueSumCombiner.class.getName());
+        this.setIfAbsent(params, ComputerOptions.OUTPUT_CLASS,
+                         HUGEGRAPH_DOUBLE_OUTPUT_CLASS_NAME);
+    }
+}
diff --git a/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/centrality/pagerank/PageRank.java b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/centrality/pagerank/PageRank.java
new file mode 100644
index 00000000..27891b3e
--- /dev/null
+++ b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/centrality/pagerank/PageRank.java
@@ -0,0 +1,155 @@
+/*
+ * Copyright 2017 HugeGraph Authors
+ *
+ * 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.
+ */
+
+package org.apache.hugegraph.computer.algorithm.centrality.pagerank;
+
+import java.util.Iterator;
+
+import org.apache.hugegraph.computer.core.aggregator.Aggregator;
+import org.apache.hugegraph.computer.core.combiner.Combiner;
+import org.apache.hugegraph.computer.core.config.Config;
+import org.apache.hugegraph.computer.core.graph.value.DoubleValue;
+import org.apache.hugegraph.computer.core.graph.value.LongValue;
+import org.apache.hugegraph.computer.core.graph.vertex.Vertex;
+import org.apache.hugegraph.computer.core.worker.Computation;
+import org.apache.hugegraph.computer.core.worker.ComputationContext;
+import org.apache.hugegraph.computer.core.worker.WorkerContext;
+
+public class PageRank implements Computation<DoubleValue> {
+
+    public static final String OPTION_ALPHA = "page_rank.alpha";
+
+    public static final double ALPHA_DEFAULT_VALUE = 0.15;
+
+    private double alpha;
+    private double danglingRank;
+    private double initialRankInSuperstep;
+    private double cumulativeRank;
+
+    private Aggregator<DoubleValue> l1DiffAggr;
+    private Aggregator<DoubleValue> cumulativeRankAggr;
+    private Aggregator<LongValue> danglingVertexNumAggr;
+    private Aggregator<DoubleValue> danglingCumulativeAggr;
+
+    // Initial value in superstep 0.
+    private DoubleValue initialValue;
+    private DoubleValue contribValue;
+
+    @Override
+    public String name() {
+        return "page_rank";
+    }
+
+    @Override
+    public String category() {
+        return "centrality";
+    }
+
+    @Override
+    public void compute0(ComputationContext context, Vertex vertex) {
+        vertex.value(this.initialValue);
+        this.cumulativeRankAggr.aggregateValue(this.initialValue.value());
+        int edgeCount = vertex.numEdges();
+        if (edgeCount == 0) {
+            this.danglingVertexNumAggr.aggregateValue(1L);
+            this.danglingCumulativeAggr.aggregateValue(
+                                        this.initialValue.value());
+        } else {
+            this.contribValue.value(this.initialValue.value() / edgeCount);
+            context.sendMessageToAllEdges(vertex, this.contribValue);
+        }
+    }
+
+    @Override
+    public void compute(ComputationContext context, Vertex vertex,
+                        Iterator<DoubleValue> messages) {
+        DoubleValue message = Combiner.combineAll(context.combiner(), messages);
+        double rankFromNeighbors = 0.0;
+        if (message != null) {
+            rankFromNeighbors = message.value();
+        }
+        double rank = (this.danglingRank + rankFromNeighbors) *
+                      (1.0 - this.alpha) + this.initialRankInSuperstep;
+        rank /= this.cumulativeRank;
+        DoubleValue oldRank = vertex.value();
+        vertex.value(new DoubleValue(rank));
+        this.l1DiffAggr.aggregateValue(Math.abs(oldRank.value() - rank));
+        this.cumulativeRankAggr.aggregateValue(rank);
+        int edgeCount = vertex.numEdges();
+        if (edgeCount == 0) {
+            this.danglingVertexNumAggr.aggregateValue(1L);
+            this.danglingCumulativeAggr.aggregateValue(rank);
+        } else {
+            this.contribValue.value(rank / edgeCount);
+            context.sendMessageToAllEdges(vertex, this.contribValue);
+        }
+    }
+
+    @Override
+    public void init(Config config) {
+        this.alpha = config.getDouble(OPTION_ALPHA, ALPHA_DEFAULT_VALUE);
+        this.contribValue = new DoubleValue();
+    }
+
+    @Override
+    public void close(Config config) {
+        // pass
+    }
+
+    @Override
+    public void beforeSuperstep(WorkerContext context) {
+        // Get aggregator values for computation
+        DoubleValue danglingTotalRank = context.aggregatedValue(
+                    PageRank4Master.AGGR_COMULATIVE_DANGLING_PROBABILITY);
+        DoubleValue cumulativeRank = context.aggregatedValue(
+                    PageRank4Master.AGGR_COMULATIVE_PROBABILITY);
+        long totalVertex = context.totalVertexCount();
+
+        this.danglingRank = danglingTotalRank.value() / totalVertex;
+        this.initialRankInSuperstep = this.alpha / totalVertex;
+        this.cumulativeRank = cumulativeRank.value();
+        this.initialValue = new DoubleValue(1.0 / totalVertex);
+
+        // Create aggregators
+        this.l1DiffAggr = context.createAggregator(
+                          PageRank4Master.AGGR_L1_NORM_DIFFERENCE_KEY);
+        this.cumulativeRankAggr = context.createAggregator(
+                                  PageRank4Master.AGGR_COMULATIVE_PROBABILITY);
+        this.danglingVertexNumAggr = context.createAggregator(
+             PageRank4Master.AGGR_DANGLING_VERTICES_NUM);
+        this.danglingCumulativeAggr = context.createAggregator(
+             PageRank4Master.AGGR_COMULATIVE_DANGLING_PROBABILITY);
+    }
+
+    @Override
+    public void afterSuperstep(WorkerContext context) {
+        context.aggregateValue(
+                PageRank4Master.AGGR_COMULATIVE_PROBABILITY,
+                this.cumulativeRankAggr.aggregatedValue());
+        context.aggregateValue(
+                PageRank4Master.AGGR_L1_NORM_DIFFERENCE_KEY,
+                this.l1DiffAggr.aggregatedValue());
+        context.aggregateValue(
+                PageRank4Master.AGGR_DANGLING_VERTICES_NUM,
+                this.danglingVertexNumAggr.aggregatedValue());
+        context.aggregateValue(
+                PageRank4Master.AGGR_COMULATIVE_DANGLING_PROBABILITY,
+                this.danglingCumulativeAggr.aggregatedValue());
+    }
+}
diff --git a/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/centrality/pagerank/PageRank4Master.java b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/centrality/pagerank/PageRank4Master.java
new file mode 100644
index 00000000..13a052e5
--- /dev/null
+++ b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/centrality/pagerank/PageRank4Master.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright 2017 HugeGraph Authors
+ *
+ * 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.
+ */
+
+package org.apache.hugegraph.computer.algorithm.centrality.pagerank;
+
+import org.apache.hugegraph.computer.core.combiner.DoubleValueSumCombiner;
+import org.apache.hugegraph.computer.core.combiner.LongValueSumCombiner;
+import org.apache.hugegraph.computer.core.graph.value.DoubleValue;
+import org.apache.hugegraph.computer.core.graph.value.LongValue;
+import org.apache.hugegraph.computer.core.graph.value.ValueType;
+import org.apache.hugegraph.computer.core.master.MasterComputation;
+import org.apache.hugegraph.computer.core.master.MasterComputationContext;
+import org.apache.hugegraph.computer.core.master.MasterContext;
+import org.apache.hugegraph.util.Log;
+import org.slf4j.Logger;
+
+public class PageRank4Master implements MasterComputation {
+
+    private static final Logger LOG = Log.logger(PageRank4Master.class);
+
+    public static final String CONF_L1_NORM_DIFFERENCE_THRESHOLD_KEY =
+                               "pagerank.l1DiffThreshold";
+    public static final double CONF_L1_DIFF_THRESHOLD_DEFAULT = 0.00001D;
+
+    public static final String AGGR_L1_NORM_DIFFERENCE_KEY =
+                               "pagerank.aggr_l1_norm_difference";
+    public static final String AGGR_DANGLING_VERTICES_NUM =
+                               "pagerank.dangling_vertices_num";
+    public static final String AGGR_COMULATIVE_DANGLING_PROBABILITY =
+                               "pagerank.comulative_dangling_probability";
+    public static final String AGGR_COMULATIVE_PROBABILITY =
+                               "pagerank.comulative_probability";
+
+    private double l1DiffThreshold;
+
+    @Override
+    public void init(MasterContext context) {
+        this.l1DiffThreshold = context.config().getDouble(
+                               CONF_L1_NORM_DIFFERENCE_THRESHOLD_KEY,
+                               CONF_L1_DIFF_THRESHOLD_DEFAULT);
+        context.registerAggregator(AGGR_DANGLING_VERTICES_NUM,
+                                   ValueType.LONG,
+                                   LongValueSumCombiner.class);
+        context.registerAggregator(AGGR_COMULATIVE_DANGLING_PROBABILITY,
+                                   ValueType.DOUBLE,
+                                   DoubleValueSumCombiner.class);
+        context.registerAggregator(AGGR_COMULATIVE_PROBABILITY,
+                                   ValueType.DOUBLE,
+                                   DoubleValueSumCombiner.class);
+        context.registerAggregator(AGGR_L1_NORM_DIFFERENCE_KEY,
+                                   ValueType.DOUBLE,
+                                   DoubleValueSumCombiner.class);
+    }
+
+    @Override
+    public void close(MasterContext context) {
+        // pass
+    }
+
+    @Override
+    public boolean compute(MasterComputationContext context) {
+        LongValue danglingVerticesNum = context.aggregatedValue(
+                                        AGGR_DANGLING_VERTICES_NUM);
+        DoubleValue danglingProbability = context.aggregatedValue(
+                                          AGGR_COMULATIVE_DANGLING_PROBABILITY);
+        DoubleValue cumulativeProbability = context.aggregatedValue(
+                                            AGGR_COMULATIVE_PROBABILITY);
+        DoubleValue l1NormDifference = context.aggregatedValue(
+                                       AGGR_L1_NORM_DIFFERENCE_KEY);
+
+        StringBuilder sb = new StringBuilder();
+        sb.append("[Superstep ").append(context.superstep()).append("]")
+          .append(", dangling vertices num = ").append(danglingVerticesNum)
+          .append(", cumulative dangling probability = ")
+          .append(danglingProbability.value())
+          .append(", cumulative probability = ").append(cumulativeProbability)
+          .append(", l1 norm difference = ").append(l1NormDifference.value());
+
+        LOG.info("PageRank running status: {}", sb);
+        double l1Diff = l1NormDifference.value();
+        if (context.superstep() > 1 && l1Diff <= this.l1DiffThreshold) {
+            return false;
+        } else {
+            return true;
+        }
+    }
+}
diff --git a/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/centrality/pagerank/PageRankParams.java b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/centrality/pagerank/PageRankParams.java
new file mode 100644
index 00000000..eb1c9302
--- /dev/null
+++ b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/centrality/pagerank/PageRankParams.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2017 HugeGraph Authors
+ *
+ * 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.
+ */
+
+package org.apache.hugegraph.computer.algorithm.centrality.pagerank;
+
+import java.util.Map;
+
+import org.apache.hugegraph.computer.algorithm.AlgorithmParams;
+import org.apache.hugegraph.computer.core.combiner.DoubleValueSumCombiner;
+import org.apache.hugegraph.computer.core.config.ComputerOptions;
+import org.apache.hugegraph.computer.core.graph.value.DoubleValue;
+
+public class PageRankParams implements AlgorithmParams {
+
+    @Override
+    public void setAlgorithmParameters(Map<String, String> params) {
+        this.setIfAbsent(params, ComputerOptions.MASTER_COMPUTATION_CLASS,
+                         PageRank4Master.class.getName());
+        this.setIfAbsent(params, ComputerOptions.WORKER_COMPUTATION_CLASS,
+                         PageRank.class.getName());
+        this.setIfAbsent(params, ComputerOptions.ALGORITHM_RESULT_CLASS,
+                         DoubleValue.class.getName());
+        this.setIfAbsent(params, ComputerOptions.ALGORITHM_MESSAGE_CLASS,
+                         DoubleValue.class.getName());
+        this.setIfAbsent(params, ComputerOptions.WORKER_COMBINER_CLASS,
+                         DoubleValueSumCombiner.class.getName());
+        this.setIfAbsent(params, ComputerOptions.OUTPUT_CLASS,
+                         HUGEGRAPH_DOUBLE_OUTPUT_CLASS_NAME);
+    }
+}
diff --git a/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/community/cc/ClusteringCoefficient.java b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/community/cc/ClusteringCoefficient.java
new file mode 100644
index 00000000..9f9ba5e3
--- /dev/null
+++ b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/community/cc/ClusteringCoefficient.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2017 HugeGraph Authors
+ *
+ * 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.
+ */
+
+package org.apache.hugegraph.computer.algorithm.community.cc;
+
+import java.util.Iterator;
+
+import org.apache.hugegraph.computer.algorithm.community.trianglecount.TriangleCount;
+import org.apache.hugegraph.computer.core.config.Config;
+import org.apache.hugegraph.computer.core.graph.value.IdList;
+import org.apache.hugegraph.computer.core.graph.value.IdSet;
+import org.apache.hugegraph.computer.core.graph.vertex.Vertex;
+import org.apache.hugegraph.computer.core.worker.ComputationContext;
+
+/**
+ * ClusteringCoefficient(CC) algorithm could calculate local & the whole graph:
+ * 1. local cc: get triangles & degree for current vertex, calculate them
+ * 2. whole cc have 2 ways to get the result: (NOT SUPPORTED NOW)
+ * - sum all open & closed triangles in graph, and calculate the result
+ * - sum all local cc for each vertex, and use avg as the whole graph result
+ * <p>
+ * And we have 2 ways to count local cc:
+ * 1. if we already saved the triangles in each vertex, we can calculate only
+ * in superstep0/compute0 to get the result
+ * <p>
+ * The formula of local CC is: C(v) = 2T / Dv(Dv - 1)
+ * v represents one vertex, T represents the triangles of current vertex,
+ * D represents the degree of current vertex
+ */
+public class ClusteringCoefficient extends TriangleCount {
+
+    @Override
+    public String name() {
+        return "clustering_coefficient";
+    }
+
+    @Override
+    public String category() {
+        return "community";
+    }
+
+    @Override
+    public void init(Config config) {
+        // Reuse triangle count later
+    }
+
+    @Override
+    public void compute0(ComputationContext context, Vertex vertex) {
+        IdList selfId = new IdList();
+        selfId.add(vertex.id());
+
+        context.sendMessageToAllEdgesIf(vertex, selfId, (ids, targetId) -> {
+            return !ids.get(0).equals(targetId);
+        });
+        vertex.value(new ClusteringCoefficientValue());
+    }
+
+    @Override
+    public void compute(ComputationContext context, Vertex vertex, Iterator<IdList> messages) {
+        IdSet neighbors = ((ClusteringCoefficientValue) vertex.value()).idSet();
+        Integer count = super.triangleCount(context, vertex, messages, neighbors);
+        if (count != null) {
+            ((ClusteringCoefficientValue) vertex.value()).count(count);
+            vertex.inactivate();
+        }
+    }
+}
diff --git a/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/community/cc/ClusteringCoefficientOutput.java b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/community/cc/ClusteringCoefficientOutput.java
new file mode 100644
index 00000000..a24dd408
--- /dev/null
+++ b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/community/cc/ClusteringCoefficientOutput.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2017 HugeGraph Authors
+ *
+ * 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.
+ */
+
+package org.apache.hugegraph.computer.algorithm.community.cc;
+
+import org.apache.hugegraph.computer.core.graph.vertex.Vertex;
+import org.apache.hugegraph.computer.core.output.hg.HugeGraphOutput;
+import org.apache.hugegraph.structure.constant.WriteType;
+
+/**
+ * Offer 2 ways to output: write-back + hdfs-file(TODO)
+ */
+public class ClusteringCoefficientOutput extends HugeGraphOutput<Float> {
+
+    @Override
+    public String name() {
+        return "clustering_coefficient";
+    }
+
+    @Override
+    public void prepareSchema() {
+        this.client().schema().propertyKey(this.name())
+            .asFloat()
+            .writeType(WriteType.OLAP_RANGE)
+            .ifNotExist()
+            .create();
+    }
+
+    @Override
+    protected org.apache.hugegraph.structure.graph.Vertex constructHugeVertex(Vertex vertex) {
+        org.apache.hugegraph.structure.graph.Vertex hugeVertex =
+                new org.apache.hugegraph.structure.graph.Vertex(null);
+        hugeVertex.id(vertex.id().asObject());
+        float triangle = ((ClusteringCoefficientValue) vertex.value()).count();
+        int degree = ((ClusteringCoefficientValue) vertex.value()).idSet().value().size();
+        hugeVertex.property(this.name(), 2 * triangle / degree / (degree - 1));
+        return hugeVertex;
+    }
+
+    /* TODO: enhance it
+    @Override
+    protected Float value(Vertex vertex) {
+        float triangle = ((ClusteringCoefficientValue) vertex.value()).count();
+        int degree = ((ClusteringCoefficientValue) vertex.value()).idList().size();
+        return 2 * triangle / degree / (degree - 1);
+    }*/
+}
diff --git a/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/community/cc/ClusteringCoefficientParams.java b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/community/cc/ClusteringCoefficientParams.java
new file mode 100644
index 00000000..3106672c
--- /dev/null
+++ b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/community/cc/ClusteringCoefficientParams.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2017 HugeGraph Authors
+ *
+ * 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.
+ */
+
+package org.apache.hugegraph.computer.algorithm.community.cc;
+
+import java.util.Map;
+
+import org.apache.hugegraph.computer.algorithm.AlgorithmParams;
+import org.apache.hugegraph.computer.core.config.ComputerOptions;
+import org.apache.hugegraph.computer.core.config.EdgeFrequency;
+import org.apache.hugegraph.computer.core.graph.value.IdList;
+
+public class ClusteringCoefficientParams implements AlgorithmParams {
+
+    @Override
+    public void setAlgorithmParameters(Map<String, String> params) {
+        this.setIfAbsent(params, ComputerOptions.WORKER_COMPUTATION_CLASS,
+                         ClusteringCoefficient.class.getName());
+        this.setIfAbsent(params, ComputerOptions.ALGORITHM_MESSAGE_CLASS,
+                         IdList.class.getName());
+        this.setIfAbsent(params, ComputerOptions.ALGORITHM_RESULT_CLASS,
+                         ClusteringCoefficientValue.class.getName());
+        this.setIfAbsent(params, ComputerOptions.OUTPUT_CLASS,
+                         ClusteringCoefficientOutput.class.getName());
+        this.setIfAbsent(params, ComputerOptions.INPUT_EDGE_FREQ.name(),
+                         EdgeFrequency.SINGLE.name());
+    }
+}
diff --git a/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/community/cc/ClusteringCoefficientValue.java b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/community/cc/ClusteringCoefficientValue.java
new file mode 100644
index 00000000..50d6b9cb
--- /dev/null
+++ b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/community/cc/ClusteringCoefficientValue.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2017 HugeGraph Authors
+ *
+ * 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.
+ */
+
+package org.apache.hugegraph.computer.algorithm.community.cc;
+
+import java.io.IOException;
+
+import org.apache.hugegraph.computer.core.graph.value.IdSet;
+import org.apache.hugegraph.computer.core.graph.value.IntValue;
+import org.apache.hugegraph.computer.core.graph.value.Value;
+import org.apache.hugegraph.computer.core.io.RandomAccessInput;
+import org.apache.hugegraph.computer.core.io.RandomAccessOutput;
+
+/**
+ * TODO: We could reuse triangle's result to simplify it (and avoid logical differences)
+ */
+public class ClusteringCoefficientValue implements Value.CustomizeValue<Integer> {
+
+    private IdSet idSet;
+    private IntValue count;
+    private final IntValue degree;
+
+    public ClusteringCoefficientValue() {
+        this.idSet = new IdSet();
+        this.count = new IntValue();
+        this.degree = new IntValue();
+    }
+
+    public IdSet idSet() {
+        return this.idSet;
+    }
+
+    public int count() {
+        return this.count.intValue();
+    }
+
+    public void count(Integer count) {
+        this.count.value(count);
+    }
+
+    public int degree() {
+        return this.degree.value();
+    }
+
+    public void degree(Integer degree) {
+        this.degree.value(degree);
+    }
+
+    @Override
+    public ClusteringCoefficientValue copy() {
+        ClusteringCoefficientValue ccValue = new ClusteringCoefficientValue();
+        ccValue.idSet = this.idSet.copy();
+        ccValue.count = this.count.copy();
+        return ccValue;
+    }
+
+    @Override
+    public Integer value() {
+        return this.count.value();
+    }
+
+    @Override
+    public void read(RandomAccessInput in) throws IOException {
+        this.idSet.read(in);
+        this.count.read(in);
+    }
+
+    @Override
+    public void write(RandomAccessOutput out) throws IOException {
+        this.idSet.write(out);
+        this.count.write(out);
+    }
+
+    @Override
+    public String toString() {
+        return String.valueOf(count);
+    }
+}
diff --git a/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/community/kcore/Kcore.java b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/community/kcore/Kcore.java
new file mode 100644
index 00000000..df590a18
--- /dev/null
+++ b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/community/kcore/Kcore.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright 2017 HugeGraph Authors
+ *
+ * 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.
+ */
+
+package org.apache.hugegraph.computer.algorithm.community.kcore;
+
+import java.util.Iterator;
+
+import org.apache.hugegraph.computer.core.combiner.Combiner;
+import org.apache.hugegraph.computer.core.config.Config;
+import org.apache.hugegraph.computer.core.graph.id.Id;
+import org.apache.hugegraph.computer.core.graph.vertex.Vertex;
+import org.apache.hugegraph.computer.core.worker.Computation;
+import org.apache.hugegraph.computer.core.worker.ComputationContext;
+
+import com.google.common.collect.Iterators;
+
+public class Kcore implements Computation<Id> {
+
+    public static final String OPTION_K = "kcore.k";
+    public static final int K_DEFAULT_VALUE = 3;
+
+    private final KcoreValue initValue = new KcoreValue();
+
+    private int k = 0;
+
+    @Override
+    public String name() {
+        return "kcore";
+    }
+
+    @Override
+    public String category() {
+        return "community";
+    }
+
+    @Override
+    public void init(Config config) {
+        this.k = config.getInt(OPTION_K, K_DEFAULT_VALUE);
+    }
+
+    @Override
+    public void compute0(ComputationContext context, Vertex vertex) {
+        KcoreValue value = this.initValue;
+        value.core((Id) vertex.id().copy());
+        vertex.value(value);
+
+        if (vertex.numEdges() < this.k) {
+            value.degree(0);
+            /*
+             * TODO: send int type message at phase 1, it's different from id
+             * type of phase 2 (wcc message), need support switch message type.
+             */
+            context.sendMessageToAllEdges(vertex, vertex.id());
+            vertex.inactivate();
+        } else {
+            value.degree(vertex.numEdges());
+            assert vertex.active();
+        }
+    }
+
+    @Override
+    public void compute(ComputationContext context, Vertex vertex,
+                        Iterator<Id> messages) {
+        KcoreValue value = vertex.value();
+        if (!value.active()) {
+            // Ignore messages of deleted vertex
+            vertex.inactivate();
+            return;
+        }
+
+        int superstep = context.superstep();
+        if (superstep <= 2) {
+            int deleted = Iterators.size(messages);
+            assert value.active();
+            if (value.decreaseDegree(deleted) < this.k) {
+                // From active to inactive, delete self vertex
+                value.degree(0);
+                if (superstep == 1) {
+                    context.sendMessageToAllEdges(vertex, vertex.id());
+                }
+                vertex.inactivate();
+            } else {
+                // From active to active, do wcc from superstep 2
+                if (superstep == 2) {
+                    // Start wcc
+                    context.sendMessageToAllEdgesIf(vertex, vertex.id(),
+                                                    (source, target) -> {
+                        return source.compareTo(target) < 0;
+                    });
+                    vertex.inactivate();
+                } else {
+                    // Keep active at superstep 1 to continue superstep 2
+                    assert superstep == 1;
+                    assert vertex.active();
+                }
+            }
+        } else {
+            // Do wcc
+            assert superstep > 2;
+            Id message = Combiner.combineAll(context.combiner(), messages);
+            if (value.core().compareTo(message) > 0) {
+                value.core(message);
+                context.sendMessageToAllEdges(vertex, message);
+            }
+            vertex.inactivate();
+        }
+    }
+}
diff --git a/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/community/kcore/KcoreParams.java b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/community/kcore/KcoreParams.java
new file mode 100644
index 00000000..0e7a3def
--- /dev/null
+++ b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/community/kcore/KcoreParams.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2017 HugeGraph Authors
+ *
+ * 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.
+ */
+
+package org.apache.hugegraph.computer.algorithm.community.kcore;
+
+import java.util.Map;
+
+import org.apache.hugegraph.computer.algorithm.AlgorithmParams;
+import org.apache.hugegraph.computer.core.combiner.ValueMinCombiner;
+import org.apache.hugegraph.computer.core.config.ComputerOptions;
+
+public class KcoreParams implements AlgorithmParams {
+
+    @Override
+    public void setAlgorithmParameters(Map<String, String> params) {
+        this.setIfAbsent(params, ComputerOptions.WORKER_COMPUTATION_CLASS,
+                         Kcore.class.getName());
+        this.setIfAbsent(params, ComputerOptions.ALGORITHM_RESULT_CLASS,
+                         KcoreValue.class.getName());
+        this.setIfAbsent(params, ComputerOptions.ALGORITHM_MESSAGE_CLASS,
+                         BYTESID_CLASS_NAME);
+        this.setIfAbsent(params, ComputerOptions.WORKER_COMBINER_CLASS,
+                         ValueMinCombiner.class.getName());
+        this.setIfAbsent(params, ComputerOptions.OUTPUT_CLASS,
+                         HUGEGRAPH_ID_OUTPUT_CLASS_NAME);
+    }
+}
diff --git a/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/community/kcore/KcoreValue.java b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/community/kcore/KcoreValue.java
new file mode 100644
index 00000000..17b6c79b
--- /dev/null
+++ b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/community/kcore/KcoreValue.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2017 HugeGraph Authors
+ *
+ * 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.
+ */
+
+package org.apache.hugegraph.computer.algorithm.community.kcore;
+
+import java.io.IOException;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.hugegraph.computer.core.graph.id.Id;
+import org.apache.hugegraph.computer.core.graph.id.IdFactory;
+import org.apache.hugegraph.computer.core.graph.value.Value.CustomizeValue;
+import org.apache.hugegraph.computer.core.io.RandomAccessInput;
+import org.apache.hugegraph.computer.core.io.RandomAccessOutput;
+import org.apache.hugegraph.util.E;
+
+public class KcoreValue implements CustomizeValue<Object> {
+
+    private int degree;
+    private Id core;
+
+    public KcoreValue() {
+        this.degree = 0;
+        this.core = IdFactory.createId();
+    }
+
+    public void degree(int degree) {
+        assert degree >= 0;
+        this.degree = degree;
+    }
+
+    public int degree() {
+        return this.degree;
+    }
+
+    public int decreaseDegree(int decrease) {
+        assert decrease <= this.degree;
+        this.degree -= decrease;
+        return this.degree;
+    }
+
+    public boolean active() {
+        return this.degree > 0;
+    }
+
+    public void core(Id core) {
+        this.core = core;
+    }
+
+    public Id core() {
+        E.checkNotNull(this.core, "core");
+        return this.core;
+    }
+
+    @Override
+    public KcoreValue copy() {
+        KcoreValue kcoreValue = new KcoreValue();
+        kcoreValue.core = (Id) this.core.copy();
+        kcoreValue.degree = this.degree;
+        return kcoreValue;
+    }
+
+    @Override
+    public void read(RandomAccessInput in) throws IOException {
+        this.core.read(in);
+        this.degree = in.readInt();
+    }
+
+    @Override
+    public void write(RandomAccessOutput out) throws IOException {
+        this.core.write(out);
+        out.writeInt(this.degree);
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this)
+                   .append("core", this.core)
+                   .append("degree", this.degree)
+                   .toString();
+    }
+
+    @Override
+    public Object value() {
+        return this.core.value();
+    }
+}
diff --git a/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/community/lpa/Lpa.java b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/community/lpa/Lpa.java
new file mode 100644
index 00000000..bdc5b954
--- /dev/null
+++ b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/community/lpa/Lpa.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2017 HugeGraph Authors
+ *
+ * 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.
+ */
+
+package org.apache.hugegraph.computer.algorithm.community.lpa;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+
+import org.apache.commons.lang3.mutable.MutableInt;
+import org.apache.hugegraph.computer.core.graph.id.Id;
+import org.apache.hugegraph.computer.core.graph.vertex.Vertex;
+import org.apache.hugegraph.computer.core.worker.Computation;
+import org.apache.hugegraph.computer.core.worker.ComputationContext;
+
+public class Lpa implements Computation<Id> {
+
+    private final Random random = new Random();
+
+    @Override
+    public String name() {
+        return "lpa";
+    }
+
+    @Override
+    public String category() {
+        return "community";
+    }
+
+    @Override
+    public void compute0(ComputationContext context, Vertex vertex) {
+        Id value = vertex.id();
+        vertex.value(value);
+        vertex.inactivate();
+        context.sendMessageToAllEdges(vertex, value);
+    }
+
+    @Override
+    public void compute(ComputationContext context, Vertex vertex,
+                        Iterator<Id> messages) {
+        Id label = this.voteLabel(messages);
+        Id value = vertex.value();
+        if (!value.equals(label)) {
+            vertex.value(label);
+            context.sendMessageToAllEdges(vertex, label);
+        }
+        vertex.inactivate();
+    }
+
+    private Id voteLabel(Iterator<Id> messages) {
+        // Calculate label frequency
+        Map<Id, MutableInt> labels = new HashMap<>();
+        assert messages.hasNext();
+        while (messages.hasNext()) {
+            Id label = messages.next();
+            MutableInt labelCount = labels.get(label);
+            if (labelCount != null) {
+                labelCount.increment();
+            } else {
+                labels.put(label, new MutableInt(1));
+            }
+        }
+
+        // Calculate the labels with maximum frequency
+        List<Id> maxLabels = new ArrayList<>();
+        int maxFreq = 1;
+        for (Map.Entry<Id, MutableInt> e : labels.entrySet()) {
+            int value = e.getValue().intValue();
+            if (value > maxFreq) {
+                maxFreq = value;
+                maxLabels.clear();
+            }
+            if (value == maxFreq) {
+                maxLabels.add(e.getKey());
+            }
+        }
+
+        // Random choice
+        int selected = this.random.nextInt(maxLabels.size());
+        return maxLabels.get(selected);
+    }
+}
diff --git a/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/community/lpa/LpaParams.java b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/community/lpa/LpaParams.java
new file mode 100644
index 00000000..48004866
--- /dev/null
+++ b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/community/lpa/LpaParams.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2017 HugeGraph Authors
+ *
+ * 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.
+ */
+
+package org.apache.hugegraph.computer.algorithm.community.lpa;
+
+import java.util.Map;
+
+import org.apache.hugegraph.computer.algorithm.AlgorithmParams;
+import org.apache.hugegraph.computer.core.config.ComputerOptions;
+
+public class LpaParams implements AlgorithmParams {
+
+    @Override
+    public void setAlgorithmParameters(Map<String, String> params) {
+        this.setIfAbsent(params, ComputerOptions.WORKER_COMPUTATION_CLASS,
+                         Lpa.class.getName());
+        this.setIfAbsent(params, ComputerOptions.ALGORITHM_RESULT_CLASS,
+                         BYTESID_CLASS_NAME);
+        this.setIfAbsent(params, ComputerOptions.ALGORITHM_MESSAGE_CLASS,
+                         BYTESID_CLASS_NAME);
+        this.setIfAbsent(params, ComputerOptions.OUTPUT_CLASS,
+                         HUGEGRAPH_ID_OUTPUT_CLASS_NAME);
+    }
+}
diff --git a/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/community/trianglecount/TriangleCount.java b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/community/trianglecount/TriangleCount.java
new file mode 100644
index 00000000..bda124aa
--- /dev/null
+++ b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/community/trianglecount/TriangleCount.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright 2017 HugeGraph Authors
+ *
+ * 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.
+ */
+
+package org.apache.hugegraph.computer.algorithm.community.trianglecount;
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+import org.apache.hugegraph.computer.core.graph.edge.Edge;
+import org.apache.hugegraph.computer.core.graph.edge.Edges;
+import org.apache.hugegraph.computer.core.graph.id.Id;
+import org.apache.hugegraph.computer.core.graph.value.IdList;
+import org.apache.hugegraph.computer.core.graph.value.IdSet;
+import org.apache.hugegraph.computer.core.graph.vertex.Vertex;
+import org.apache.hugegraph.computer.core.worker.Computation;
+import org.apache.hugegraph.computer.core.worker.ComputationContext;
+
+public class TriangleCount implements Computation<IdList> {
+
+    @Override
+    public String name() {
+        return "triangle_count";
+    }
+
+    @Override
+    public String category() {
+        return "community";
+    }
+
+    @Override
+    public void compute0(ComputationContext context, Vertex vertex) {
+        IdSet selfId = new IdSet();
+        selfId.add(vertex.id());
+
+        context.sendMessageToAllEdgesIf(vertex, selfId, (ids, targetId) -> {
+            return !vertex.id().equals(targetId);
+        });
+        vertex.value(new TriangleCountValue());
+    }
+
+    @Override
+    public void compute(ComputationContext context, Vertex vertex,
+                        Iterator<IdList> messages) {
+        IdSet neighbors = ((TriangleCountValue) vertex.value()).idSet();
+        Integer count = this.triangleCount(context, vertex, messages, neighbors);
+        if (count != null) {
+            ((TriangleCountValue) vertex.value()).count(count);
+            vertex.inactivate();
+        }
+    }
+
+    protected Integer triangleCount(ComputationContext context, Vertex vertex,
+                                    Iterator<IdList> messages, IdSet neighbors) {
+        if (context.superstep() == 1) {
+            // Collect outgoing neighbors
+            Set<Id> outNeighbors = getOutNeighbors(vertex);
+            neighbors.addAll(outNeighbors);
+
+            // Collect incoming neighbors
+            while (messages.hasNext()) {
+                IdList idList = messages.next();
+                assert idList.size() == 1;
+                Id inId = idList.get(0);
+                if (!outNeighbors.contains(inId)) {
+                    neighbors.add(inId);
+                }
+            }
+
+            // Send all neighbors to neighbors
+            for (Id targetId : neighbors.value()) {
+                context.sendMessage(targetId, neighbors);
+            }
+        } else if (context.superstep() == 2) {
+            int count = 0;
+
+            while (messages.hasNext()) {
+                IdList twoDegreeNeighbors = messages.next();
+                for (Id twoDegreeNeighbor : twoDegreeNeighbors.values()) {
+                    if (neighbors.contains(twoDegreeNeighbor)) {
+                        count++;
+                    }
+                }
+            }
+
+            return count >> 1;
+        }
+        return null;
+    }
+
+    private static Set<Id> getOutNeighbors(Vertex vertex) {
+        Set<Id> outNeighbors = new HashSet<>();
+        Edges edges = vertex.edges();
+        for (Edge edge : edges) {
+            Id targetId = edge.targetId();
+            if (!vertex.id().equals(targetId)) {
+                outNeighbors.add(targetId);
+            }
+        }
+        return outNeighbors;
+    }
+}
diff --git a/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/community/trianglecount/TriangleCountParams.java b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/community/trianglecount/TriangleCountParams.java
new file mode 100644
index 00000000..b87c1f3e
--- /dev/null
+++ b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/community/trianglecount/TriangleCountParams.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2017 HugeGraph Authors
+ *
+ * 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.
+ */
+
+package org.apache.hugegraph.computer.algorithm.community.trianglecount;
+
+import java.util.Map;
+
+import org.apache.hugegraph.computer.algorithm.AlgorithmParams;
+import org.apache.hugegraph.computer.core.config.ComputerOptions;
+import org.apache.hugegraph.computer.core.config.EdgeFrequency;
+import org.apache.hugegraph.computer.core.graph.value.IdList;
+
+public class TriangleCountParams implements AlgorithmParams {
+
+    @Override
+    public void setAlgorithmParameters(Map<String, String> params) {
+        this.setIfAbsent(params, ComputerOptions.WORKER_COMPUTATION_CLASS,
+                         TriangleCount.class.getName());
+        this.setIfAbsent(params, ComputerOptions.ALGORITHM_MESSAGE_CLASS,
+                         IdList.class.getName());
+        this.setIfAbsent(params, ComputerOptions.ALGORITHM_RESULT_CLASS,
+                         TriangleCountValue.class.getName());
+        this.setIfAbsent(params, ComputerOptions.OUTPUT_CLASS,
+                         HUGEGRAPH_INT_OUTPUT_CLASS_NAME);
+        this.setIfAbsent(params, ComputerOptions.INPUT_EDGE_FREQ.name(),
+                         EdgeFrequency.SINGLE.name());
+    }
+}
diff --git a/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/community/trianglecount/TriangleCountValue.java b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/community/trianglecount/TriangleCountValue.java
new file mode 100644
index 00000000..ca6a0dc9
--- /dev/null
+++ b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/community/trianglecount/TriangleCountValue.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2017 HugeGraph Authors
+ *
+ * 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.
+ */
+
+package org.apache.hugegraph.computer.algorithm.community.trianglecount;
+
+import java.io.IOException;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.hugegraph.computer.core.graph.value.IdSet;
+import org.apache.hugegraph.computer.core.graph.value.IntValue;
+import org.apache.hugegraph.computer.core.graph.value.Value.CustomizeValue;
+import org.apache.hugegraph.computer.core.io.RandomAccessInput;
+import org.apache.hugegraph.computer.core.io.RandomAccessOutput;
+
+public class TriangleCountValue implements CustomizeValue<Integer> {
+
+    private IdSet idSet;
+    private IntValue count;
+
+    public TriangleCountValue() {
+        this.idSet = new IdSet();
+        this.count = new IntValue();
+    }
+
+    public IdSet idSet() {
+        return this.idSet;
+    }
+
+    public int count() {
+        return this.count.intValue();
+    }
+
+    public void count(int count) {
+        this.count.value(count);
+    }
+
+    @Override
+    public TriangleCountValue copy() {
+        TriangleCountValue triangleCountValue = new TriangleCountValue();
+        triangleCountValue.idSet = this.idSet.copy();
+        triangleCountValue.count = this.count.copy();
+        return triangleCountValue;
+    }
+
+    @Override
+    public void read(RandomAccessInput in) throws IOException {
+        this.idSet.read(in);
+        this.count.read(in);
+    }
+
+    @Override
+    public void write(RandomAccessOutput out) throws IOException {
+        this.idSet.write(out);
+        this.count.write(out);
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this).append("idSet", this.idSet)
+                                        .append("count", this.count).toString();
+    }
+
+    @Override
+    public Integer value() {
+        return this.count.value();
+    }
+}
diff --git a/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/community/wcc/Wcc.java b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/community/wcc/Wcc.java
new file mode 100644
index 00000000..778b4b7c
--- /dev/null
+++ b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/community/wcc/Wcc.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2017 HugeGraph Authors
+ *
+ * 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.
+ */
+
+package org.apache.hugegraph.computer.algorithm.community.wcc;
+
+import java.util.Iterator;
+
+import org.apache.hugegraph.computer.core.combiner.Combiner;
+import org.apache.hugegraph.computer.core.graph.edge.Edge;
+import org.apache.hugegraph.computer.core.graph.id.Id;
+import org.apache.hugegraph.computer.core.graph.vertex.Vertex;
+import org.apache.hugegraph.computer.core.worker.Computation;
+import org.apache.hugegraph.computer.core.worker.ComputationContext;
+
+/**
+ * Wcc stands for Weak Connected Component.
+ */
+public class Wcc implements Computation<Id> {
+
+    @Override
+    public String name() {
+        return "wcc";
+    }
+
+    @Override
+    public String category() {
+        return "community";
+    }
+
+    @Override
+    public void compute0(ComputationContext context, Vertex vertex) {
+        Id min = vertex.id();
+        for (Edge edge : vertex.edges()) {
+            if (edge.targetId().compareTo(min) < 0) {
+                min = edge.targetId();
+            }
+        }
+        Id value = min;
+        vertex.value(value);
+        vertex.inactivate();
+        context.sendMessageToAllEdgesIf(vertex, value, (result, target) -> {
+            return result.compareTo(target) < 0;
+        });
+    }
+
+    @Override
+    public void compute(ComputationContext context, Vertex vertex,
+                        Iterator<Id> messages) {
+        Id message = Combiner.combineAll(context.combiner(), messages);
+        Id value = vertex.value();
+        if (value.compareTo(message) > 0) {
+            vertex.value(message);
+            context.sendMessageToAllEdges(vertex, message);
+        }
+        vertex.inactivate();
+    }
+}
diff --git a/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/community/wcc/WccParams.java b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/community/wcc/WccParams.java
new file mode 100644
index 00000000..0638cbab
--- /dev/null
+++ b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/community/wcc/WccParams.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2017 HugeGraph Authors
+ *
+ * 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.
+ */
+
+package org.apache.hugegraph.computer.algorithm.community.wcc;
+
+import java.util.Map;
+
+import org.apache.hugegraph.computer.algorithm.AlgorithmParams;
+import org.apache.hugegraph.computer.core.combiner.ValueMinCombiner;
+import org.apache.hugegraph.computer.core.config.ComputerOptions;
+
+public class WccParams implements AlgorithmParams {
+
+    @Override
+    public void setAlgorithmParameters(Map<String, String> params) {
+        this.setIfAbsent(params, ComputerOptions.WORKER_COMPUTATION_CLASS,
+                         Wcc.class.getName());
+        this.setIfAbsent(params, ComputerOptions.ALGORITHM_RESULT_CLASS,
+                         BYTESID_CLASS_NAME);
+        this.setIfAbsent(params, ComputerOptions.ALGORITHM_MESSAGE_CLASS,
+                         BYTESID_CLASS_NAME);
+        this.setIfAbsent(params, ComputerOptions.WORKER_COMBINER_CLASS,
+                         ValueMinCombiner.class.getName());
+        this.setIfAbsent(params, ComputerOptions.OUTPUT_CLASS,
+                         HUGEGRAPH_ID_OUTPUT_CLASS_NAME);
+    }
+}
diff --git a/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/path/rings/RingsDetection.java b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/path/rings/RingsDetection.java
new file mode 100644
index 00000000..33bb755e
--- /dev/null
+++ b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/path/rings/RingsDetection.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright 2017 HugeGraph Authors
+ *
+ * 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.
+ */
+
+package org.apache.hugegraph.computer.algorithm.path.rings;
+
+import java.util.Iterator;
+
+import org.apache.hugegraph.computer.core.graph.edge.Edge;
+import org.apache.hugegraph.computer.core.graph.id.Id;
+import org.apache.hugegraph.computer.core.graph.value.IdList;
+import org.apache.hugegraph.computer.core.graph.value.IdListList;
+import org.apache.hugegraph.computer.core.graph.vertex.Vertex;
+import org.apache.hugegraph.computer.core.worker.Computation;
+import org.apache.hugegraph.computer.core.worker.ComputationContext;
+
+public class RingsDetection implements Computation<IdList> {
+
+    @Override
+    public String name() {
+        return "rings";
+    }
+
+    @Override
+    public String category() {
+        return "path";
+    }
+
+    @Override
+    public void compute0(ComputationContext context, Vertex vertex) {
+        vertex.value(new IdListList());
+        if (vertex.edges().size() == 0) {
+            return;
+        }
+
+        // Init path
+        Id id = vertex.id();
+        IdList path = new IdList();
+        path.add(id);
+
+        for (Edge edge : vertex.edges()) {
+            /*
+             * Only send path to vertex whose id is larger than
+             * or equals current vertex id
+             */
+            if (id.compareTo(edge.targetId()) <= 0) {
+                context.sendMessage(edge.targetId(), path);
+            }
+        }
+    }
+
+    @Override
+    public void compute(ComputationContext context, Vertex vertex,
+                        Iterator<IdList> messages) {
+        Id id = vertex.id();
+        boolean halt = true;
+        while (messages.hasNext()) {
+            halt = false;
+            IdList sequence = messages.next();
+            if (id.equals(sequence.get(0))) {
+                // Use the smallest vertex record ring
+                boolean isMin = true;
+                for (int i = 1; i < sequence.size(); i++) {
+                    Id pathVertexValue = sequence.get(i);
+                    if (id.compareTo(pathVertexValue) > 0) {
+                        isMin = false;
+                        break;
+                    }
+                }
+                if (isMin) {
+                    sequence.add(id);
+                    IdListList sequences = vertex.value();
+                    sequences.add(sequence);
+                }
+            } else {
+                boolean contains = false;
+                // Drop sequence if path contains this vertex
+                for (int i = 0; i < sequence.size(); i++) {
+                    Id pathVertexValue = sequence.get(i);
+                    if (pathVertexValue.equals(vertex.id())) {
+                        contains = true;
+                        break;
+                    }
+                }
+                // Field ringId is smallest vertex id in path
+                Id ringId = sequence.get(0);
+                if (!contains) {
+                    sequence.add(vertex.id());
+                    for (Edge edge : vertex.edges()) {
+                        if (ringId.compareTo(edge.targetId()) <= 0) {
+                            context.sendMessage(edge.targetId(), sequence);
+                        }
+                    }
+                }
+            }
+        }
+        if (halt) {
+            vertex.inactivate();
+        }
+    }
+}
diff --git a/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/path/rings/RingsDetectionOutput.java b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/path/rings/RingsDetectionOutput.java
new file mode 100644
index 00000000..a35f2f50
--- /dev/null
+++ b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/path/rings/RingsDetectionOutput.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2017 HugeGraph Authors
+ *
+ * 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.
+ */
+
+package org.apache.hugegraph.computer.algorithm.path.rings;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.hugegraph.computer.core.graph.value.IdListList;
+import org.apache.hugegraph.computer.core.graph.vertex.Vertex;
+import org.apache.hugegraph.computer.core.output.hg.HugeGraphOutput;
+
+public class RingsDetectionOutput extends HugeGraphOutput<List<String>> {
+
+    @Override
+    protected void prepareSchema() {
+        this.client().schema().propertyKey(this.name())
+                     .asText()
+                     .writeType(this.writeType())
+                     .valueList()
+                     .ifNotExist()
+                     .create();
+    }
+
+    @Override
+    protected List<String> value(Vertex vertex) {
+        IdListList value = vertex.value();
+        List<String> propValues = new ArrayList<>();
+        for (int i = 0; i < value.size(); i++) {
+            propValues.add(value.get(i).toString());
+        }
+        return propValues;
+    }
+}
diff --git a/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/path/rings/RingsDetectionParams.java b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/path/rings/RingsDetectionParams.java
new file mode 100644
index 00000000..4a8928e3
--- /dev/null
+++ b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/path/rings/RingsDetectionParams.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2017 HugeGraph Authors
+ *
+ * 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.
+ */
+
+package org.apache.hugegraph.computer.algorithm.path.rings;
+
+import java.util.Map;
+
+import org.apache.hugegraph.computer.algorithm.AlgorithmParams;
+import org.apache.hugegraph.computer.core.config.ComputerOptions;
+import org.apache.hugegraph.computer.core.graph.value.IdList;
+import org.apache.hugegraph.computer.core.graph.value.IdListList;
+
+public class RingsDetectionParams implements AlgorithmParams {
+
+    @Override
+    public void setAlgorithmParameters(Map<String, String> params) {
+        this.setIfAbsent(params, ComputerOptions.WORKER_COMPUTATION_CLASS,
+                         RingsDetection.class.getName());
+        this.setIfAbsent(params, ComputerOptions.ALGORITHM_MESSAGE_CLASS,
+                         IdList.class.getName());
+        this.setIfAbsent(params, ComputerOptions.ALGORITHM_RESULT_CLASS,
+                         IdListList.class.getName());
+        this.setIfAbsent(params, ComputerOptions.OUTPUT_CLASS,
+                         RingsDetectionOutput.class.getName());
+    }
+}
diff --git a/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/path/rings/filter/FilterDescribe.java b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/path/rings/filter/FilterDescribe.java
new file mode 100644
index 00000000..c916e97e
--- /dev/null
+++ b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/path/rings/filter/FilterDescribe.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2017 HugeGraph Authors
+ *
+ * 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.
+ */
+
+package org.apache.hugegraph.computer.algorithm.path.rings.filter;
+
+import java.util.List;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.hugegraph.util.JsonUtil;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.collect.ImmutableList;
+
+public class FilterDescribe {
+
+    private final List<DescribeItem> vertexFilter;
+    private final List<DescribeItem> edgeFilter;
+
+    @JsonCreator
+    private FilterDescribe(@JsonProperty("vertex_filter")
+                           List<DescribeItem> vertexFilter,
+                           @JsonProperty("edge_filter")
+                           List<DescribeItem> edgeFilter) {
+        this.vertexFilter = CollectionUtils.isEmpty(vertexFilter) ?
+                            ImmutableList.of() :
+                            ImmutableList.copyOf(vertexFilter);
+        this.edgeFilter = CollectionUtils.isEmpty(edgeFilter) ?
+                          ImmutableList.of() :
+                          ImmutableList.copyOf(edgeFilter);
+    }
+
+    public static FilterDescribe of(String describe) {
+        return JsonUtil.fromJson(describe, FilterDescribe.class);
+    }
+
+    public List<DescribeItem> vertexFilter() {
+        return this.vertexFilter;
+    }
+
+    public List<DescribeItem> edgeFilter() {
+        return this.edgeFilter;
+    }
+
+    public static class DescribeItem {
+
+        private final String label;
+        private final String propertyFilter;
+
+        @JsonCreator
+        private DescribeItem(@JsonProperty(value = "label",
+                                           required = true)
+                             String label,
+                             @JsonProperty(value = "property_filter",
+                                           required = true)
+                             String propertyFilter) {
+            this.label = label;
+            this.propertyFilter = propertyFilter;
+        }
+
+        public String label() {
+            return this.label;
+        }
+
+        public String propertyFilter() {
+            return this.propertyFilter;
+        }
+    }
+}
diff --git a/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/path/rings/filter/RingsDetectionMessage.java b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/path/rings/filter/RingsDetectionMessage.java
new file mode 100644
index 00000000..cd1c6165
--- /dev/null
+++ b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/path/rings/filter/RingsDetectionMessage.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2017 HugeGraph Authors
+ *
+ * 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.
+ */
+
+package org.apache.hugegraph.computer.algorithm.path.rings.filter;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.apache.hugegraph.computer.core.common.ComputerContext;
+import org.apache.hugegraph.computer.core.graph.GraphFactory;
+import org.apache.hugegraph.computer.core.graph.properties.DefaultProperties;
+import org.apache.hugegraph.computer.core.graph.properties.Properties;
+import org.apache.hugegraph.computer.core.graph.value.IdList;
+import org.apache.hugegraph.computer.core.graph.value.Value.CustomizeValue;
+import org.apache.hugegraph.computer.core.graph.vertex.Vertex;
+import org.apache.hugegraph.computer.core.io.RandomAccessInput;
+import org.apache.hugegraph.computer.core.io.RandomAccessOutput;
+
+public class RingsDetectionMessage implements CustomizeValue<List<Object>> {
+
+    private final IdList path;
+    private Properties walkEdgeProps;
+
+    public RingsDetectionMessage() {
+        GraphFactory graphFactory = ComputerContext.instance().graphFactory();
+        this.path = new IdList();
+        this.walkEdgeProps = new DefaultProperties(graphFactory);
+    }
+
+    @Override
+    public void read(RandomAccessInput in) throws IOException {
+        this.path.read(in);
+        this.walkEdgeProps.read(in);
+    }
+
+    @Override
+    public void write(RandomAccessOutput out) throws IOException {
+        this.path.write(out);
+        this.walkEdgeProps.write(out);
+    }
+
+    public IdList path() {
+        return this.path;
+    }
+
+    public void addPath(Vertex vertex) {
+        this.path.add(vertex.id());
+    }
+
+    public Properties walkEdgeProp() {
+        return this.walkEdgeProps;
+    }
+
+    public void walkEdgeProp(Properties properties) {
+        this.walkEdgeProps = properties;
+    }
+
+    @Override
+    public List<Object> value() {
+        return this.path.value();
+    }
+}
diff --git a/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/path/rings/filter/RingsDetectionWithFilter.java b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/path/rings/filter/RingsDetectionWithFilter.java
new file mode 100644
index 00000000..f9c6d6bc
--- /dev/null
+++ b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/path/rings/filter/RingsDetectionWithFilter.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright 2017 HugeGraph Authors
+ *
+ * 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.
+ */
+
+package org.apache.hugegraph.computer.algorithm.path.rings.filter;
+
+import java.util.Iterator;
+
+import org.apache.hugegraph.computer.core.config.Config;
+import org.apache.hugegraph.computer.core.graph.edge.Edge;
+import org.apache.hugegraph.computer.core.graph.id.Id;
+import org.apache.hugegraph.computer.core.graph.value.IdList;
+import org.apache.hugegraph.computer.core.graph.value.IdListList;
+import org.apache.hugegraph.computer.core.graph.vertex.Vertex;
+import org.apache.hugegraph.computer.core.worker.Computation;
+import org.apache.hugegraph.computer.core.worker.ComputationContext;
+
+public class RingsDetectionWithFilter
+       implements Computation<RingsDetectionMessage> {
+
+    public static final String OPTION_FILTER = "rings.property_filter";
+
+    private SpreadFilter filter;
+
+    @Override
+    public String name() {
+        return "rings_with_filter";
+    }
+
+    @Override
+    public String category() {
+        return "path";
+    }
+
+    @Override
+    public void init(Config config) {
+        this.filter = new SpreadFilter(config.getString(OPTION_FILTER, "{}"));
+    }
+
+    @Override
+    public void compute0(ComputationContext context, Vertex vertex) {
+        vertex.value(new IdListList());
+        if (vertex.edges().size() == 0 || !this.filter.filter(vertex)) {
+            return;
+        }
+
+        RingsDetectionMessage message = new RingsDetectionMessage();
+        message.addPath(vertex);
+        for (Edge edge : vertex.edges()) {
+            if (this.filter.filter(edge)) {
+                message.walkEdgeProp(edge.properties());
+                context.sendMessage(edge.targetId(), message);
+            }
+        }
+    }
+
+    @Override
+    public void compute(ComputationContext context, Vertex vertex,
+                        Iterator<RingsDetectionMessage> messages) {
+        boolean halt = true;
+        if (this.filter.filter(vertex)) {
+            Id vertexId = vertex.id();
+            while (messages.hasNext()) {
+                halt = false;
+                RingsDetectionMessage message = messages.next();
+                IdList path = message.path();
+                if (vertexId.equals(path.get(0))) {
+                    // Use the smallest vertex record ring
+                    boolean isMin = true;
+                    for (int i = 0; i < path.size(); i++) {
+                        Id pathVertexValue = path.get(i);
+                        if (vertexId.compareTo(pathVertexValue) > 0) {
+                            isMin = false;
+                            break;
+                        }
+                    }
+                    if (isMin) {
+                        path.add(vertexId);
+                        IdListList value = vertex.value();
+                        value.add(path.copy());
+                    }
+                } else {
+                    boolean contains = false;
+                    // Drop sequence if path contains this vertex
+                    for (int i = 0; i < path.size(); i++) {
+                        Id pathVertexValue = path.get(i);
+                        if (pathVertexValue.equals(vertex.id())) {
+                            contains = true;
+                            break;
+                        }
+                    }
+                    if (!contains) {
+                        path.add(vertex.id());
+                        for (Edge edge : vertex.edges()) {
+                            if (this.filter.filter(edge, message)) {
+                                message.walkEdgeProp(edge.properties());
+                                context.sendMessage(edge.targetId(), message);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        if (halt) {
+            vertex.inactivate();
+        }
+    }
+}
diff --git a/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/path/rings/filter/RingsDetectionWithFilterParams.java b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/path/rings/filter/RingsDetectionWithFilterParams.java
new file mode 100644
index 00000000..e41768ca
--- /dev/null
+++ b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/path/rings/filter/RingsDetectionWithFilterParams.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2017 HugeGraph Authors
+ *
+ * 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.
+ */
+
+package org.apache.hugegraph.computer.algorithm.path.rings.filter;
+
+import java.util.Map;
+
+import org.apache.hugegraph.computer.algorithm.AlgorithmParams;
+import org.apache.hugegraph.computer.algorithm.path.rings.RingsDetectionOutput;
+import org.apache.hugegraph.computer.core.config.ComputerOptions;
+import org.apache.hugegraph.computer.core.graph.value.IdListList;
+
+public class RingsDetectionWithFilterParams implements AlgorithmParams {
+
+    @Override
+    public void setAlgorithmParameters(Map<String, String> params) {
+        this.setIfAbsent(params, ComputerOptions.WORKER_COMPUTATION_CLASS,
+                         RingsDetectionWithFilter.class.getName());
+        this.setIfAbsent(params, ComputerOptions.ALGORITHM_RESULT_CLASS,
+                         IdListList.class.getName());
+        this.setIfAbsent(params, ComputerOptions.ALGORITHM_MESSAGE_CLASS,
+                         RingsDetectionMessage.class.getName());
+        this.setIfAbsent(params, ComputerOptions.OUTPUT_CLASS,
+                         RingsDetectionOutput.class.getName());
+        this.setIfAbsent(params, ComputerOptions.INPUT_FILTER_CLASS,
+                         EXTRACTALLPROPERTYINPUTFILTER_CLASS_NAME);
+    }
+}
diff --git a/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/path/rings/filter/SpreadFilter.java b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/path/rings/filter/SpreadFilter.java
new file mode 100644
index 00000000..32c111f2
--- /dev/null
+++ b/computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/path/rings/filter/SpreadFilter.java
@@ -0,0 +1,158 @@
+/*
+ * Copyright 2017 HugeGraph Authors
+ *
+ * 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.
+ */
+
+package org.apache.hugegraph.computer.algorithm.path.rings.filter;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Predicate;
+
+import org.apache.hugegraph.computer.core.graph.edge.Edge;
+import org.apache.hugegraph.computer.core.graph.value.Value;
+import org.apache.hugegraph.computer.core.graph.vertex.Vertex;
+import org.mvel2.MVEL;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+
+public class SpreadFilter {
+
+    private static final String ALL = "*";
+    private static final String MESSAGE = "$message";
+    private static final String ELEMENT = "$element";
+    private static final List<Serializable> PASS = ImmutableList.of();
+
+    private final Map<String, Serializable> vertexFilter;
+    private final Map<String, Serializable> edgeSpreadFilter;
+    private final Map<String, Serializable> edgeFilter;
+
+    public SpreadFilter(String describe) {
+        FilterDescribe des = FilterDescribe.of(describe);
+
+        this.vertexFilter = new HashMap<>();
+        this.edgeSpreadFilter = new HashMap<>();
+        this.edgeFilter = new HashMap<>();
+
+        this.init(this.vertexFilter, des.vertexFilter(), expression -> true);
+        this.init(this.edgeSpreadFilter, des.edgeFilter(), expression -> true);
+        // TODO: Use a better scheme to parse expressions with only $element
+        this.init(this.edgeFilter, des.edgeFilter(), expression -> {
+            return !expression.contains(MESSAGE);
+        });
+    }
+
+    private void init(Map<String, Serializable> filter,
+                      List<FilterDescribe.DescribeItem> describes,
+                      Predicate<? super String> predicate) {
+        for (FilterDescribe.DescribeItem describe : describes) {
+            String labelName = describe.label();
+            String propertyFilter = describe.propertyFilter();
+            if (predicate.test(propertyFilter) || ALL.equals(labelName)) {
+                Serializable expression = MVEL.compileExpression(
+                                               describe.propertyFilter());
+                filter.put(labelName, expression);
+            }
+        }
+    }
+
+    public boolean filter(Vertex vertex) {
+        String label = vertex.label();
+        List<Serializable> expressions = expressions(this.vertexFilter, label);
+
+        if (expressions == PASS) {
+            return true;
+        }
+
+        Map<String, Map<String, Value>> params =
+                    ImmutableMap.of(ELEMENT, vertex.properties().get());
+        return filter(params, expressions);
+    }
+
+    public boolean filter(Edge edge) {
+        String label = edge.label();
+        List<Serializable> expressions = expressions(this.edgeFilter, label);
+
+        if (expressions == PASS) {
+            return true;
+        }
+
+        Map<String, Map<String, Value>> params =
+                    ImmutableMap.of(ELEMENT, edge.properties().get());
+        return filter(params, expressions);
+    }
+
+    public boolean filter(Edge edge, RingsDetectionMessage message) {
+        String label = edge.label();
+        List<Serializable> expressions = expressions(this.edgeSpreadFilter,
+                                                     label);
+
+        if (expressions == PASS) {
+            return true;
+        }
+
+        Map<String, Map<String, Value>> params =
+                    ImmutableMap.of(ELEMENT, edge.properties().get(),
+                                    MESSAGE, message.walkEdgeProp().get());
+        return filter(params, expressions);
+    }
+
+    private static boolean filter(Map<String, Map<String, Value>> params,
+                                  List<Serializable> expressions) {
+        Map<String, Object> map = convertParamsValueToObject(params);
+        return expressions.stream()
+                          .allMatch(expression -> {
+                              return (Boolean) MVEL.executeExpression(
+                                                    expression, map);
+                          });
+    }
+
+    private static List<Serializable> expressions(
+                                      Map<String, Serializable> filter,
+                                      String label) {
+        if (filter.size() == 0) {
+            return PASS;
+        }
+        List<Serializable> expressions = new ArrayList<>();
+        if (filter.containsKey(ALL)) {
+            expressions.add(filter.get(ALL));
+        }
+        if (filter.containsKey(label)) {
+            expressions.add(filter.get(label));
+        }
+
+        return expressions;
+    }
+
+    private static Map<String, Object> convertParamsValueToObject(
+                   Map<String, Map<String, Value>> params) {
+        Map<String, Object> result = new HashMap<>();
+        for (Map.Entry<String, Map<String, Value>> entry : params.entrySet()) {
+            Map<String, Object> subKv = new HashMap<>();
+            Map<String, Value> param = entry.getValue();
+            for (Map.Entry<String, Value> paramItem : param.entrySet()) {
+                subKv.put(paramItem.getKey(), paramItem.getValue().value());
+            }
+            result.put(entry.getKey(), subKv);
+        }
+        return result;
+    }
+}
diff --git a/computer-api/pom.xml b/computer-api/pom.xml
index 3b3e2e9d..d5267e04 100644
--- a/computer-api/pom.xml
+++ b/computer-api/pom.xml
@@ -20,7 +20,7 @@
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <artifactId>hugegraph-computer</artifactId>
-        <groupId>com.baidu.hugegraph</groupId>
+        <groupId>org.apache.hugegraph</groupId>
         <version>0.1.4</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
diff --git a/computer-api/src/main/java/com/baidu/hugegraph/computer/algorithm/AlgorithmParams.java b/computer-api/src/main/java/com/baidu/hugegraph/computer/algorithm/AlgorithmParams.java
deleted file mode 100644
index 6937593f..00000000
--- a/computer-api/src/main/java/com/baidu/hugegraph/computer/algorithm/AlgorithmParams.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.algorithm;
-
-import static com.baidu.hugegraph.computer.core.config.ComputerOptions.COMPUTER_PROHIBIT_USER_OPTIONS;
-
-import java.util.Map;
-
-import org.apache.hugegraph.config.ConfigOption;
-import org.apache.hugegraph.util.Log;
-import org.slf4j.Logger;
-
-public interface AlgorithmParams {
-
-    Logger LOG = Log.logger(AlgorithmParams.class);
-
-    String BYTESID_CLASS_NAME = "com.baidu.hugegraph.computer.core.graph.id.BytesId";
-    String HUGEGRAPH_ID_OUTPUT_CLASS_NAME = "com.baidu.hugegraph.computer.core" +
-                                            ".output.hg.HugeGraphIdOutput";
-    String LOG_OUTPUT_CLASS_NAME = "com.baidu.hugegraph.computer.core.output.LogOutput";
-    String HUGEGRAPH_DOUBLE_OUTPUT_CLASS_NAME = "com.baidu.hugegraph.computer.core" +
-                                                ".output.hg.HugeGraphDoubleOutput";
-    String HUGEGRAPH_FLOAT_OUTPUT_CLASS_NAME = "com.baidu.hugegraph.computer.core" +
-                                               ".output.hg.HugeGraphFloatOutput";
-    String HUGEGRAPH_INT_OUTPUT_CLASS_NAME = "com.baidu.hugegraph.computer.core" +
-                                             ".output.hg.HugeGraphIntOutput";
-    String HUGEGRAPH_LONG_OUTPUT_CLASS_NAME = "com.baidu.hugegraph.computer.core" +
-                                              ".output.hg.HugeGraphLongOutput";
-    String HUGEGRAPH_STRING_OUTPUT_CLASS_NAME = "com.baidu.hugegraph.computer.core" +
-                                                ".output.hg.HugeGraphStringOutput";
-    String HUGEGRAPH_LIST_OUTPUT_CLASS_NAME = "com.baidu.hugegraph.computer.core" +
-                                                ".output.hg.HugeGraphListOutput";
-    String DEFAULTINPUTFILTER_CLASS_NAME = "com.baidu.hugegraph.computer" +
-                                           ".core.input.filter" +
-                                           ".DefaultInputFilter";
-    String EXTRACTALLPROPERTYINPUTFILTER_CLASS_NAME = "com.baidu.hugegraph.computer" +
-                                                      ".core.input.filter" +
-                                                      ".ExtractAllPropertyInputFilter";
-
-    /**
-     * set algorithm's specific configuration
-     * @param params
-     */
-    void setAlgorithmParameters(Map<String, String> params);
-
-    default void setIfAbsent(Map<String, String> params, String key,
-                             String value) {
-        if (!params.containsKey(key) && !COMPUTER_PROHIBIT_USER_OPTIONS.contains(key)) {
-            LOG.debug("Put parameters key={}, value={}", key, value);
-            params.put(key, value);
-        }
-    }
-
-    default void setIfAbsent(Map<String, String> params,
-                             ConfigOption<?> keyOption,
-                             String value) {
-        this.setIfAbsent(params, keyOption.name(), value);
-    }
-}
diff --git a/computer-api/src/main/java/com/baidu/hugegraph/computer/core/aggregator/Aggregator.java b/computer-api/src/main/java/com/baidu/hugegraph/computer/core/aggregator/Aggregator.java
deleted file mode 100644
index ee19cb57..00000000
--- a/computer-api/src/main/java/com/baidu/hugegraph/computer/core/aggregator/Aggregator.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.core.aggregator;
-
-import com.baidu.hugegraph.computer.core.common.ComputerContext;
-import com.baidu.hugegraph.computer.core.common.exception.ComputerException;
-import com.baidu.hugegraph.computer.core.graph.value.Value;
-
-public interface Aggregator<V extends Value> {
-
-    /**
-     * Used by worker to aggregate a new value when compute a vertex.
-     * The combination method needs to be commutative and associative.
-     * Can be called in worker computation compute() or afterSuperstep().
-     * @param value The value to be aggregated
-     */
-    void aggregateValue(V value);
-
-    /**
-     * Used by worker to aggregate an int value. For performance reasons, it
-     * can aggregate without create an IntValue object.
-     */
-    default void aggregateValue(int value) {
-        throw new ComputerException("Not implemented: aggregateValue(int)");
-    }
-
-    /**
-     * Used by worker to aggregate a long value. For performance reasons, it
-     * can aggregate without create a LongValue object.
-     */
-    default void aggregateValue(long value) {
-        throw new ComputerException("Not implemented: aggregateValue(long)");
-    }
-
-    /**
-     * Used by worker to aggregate a float value. For performance reasons, it
-     * can aggregate without create a FloatValue object.
-     */
-    default void aggregateValue(float value) {
-        throw new ComputerException("Not implemented: aggregateValue(float)");
-    }
-
-    /**
-     * Used by worker to aggregate a double value. For performance reasons,
-     * it can aggregate without create a DoubleValue object.
-     */
-    default void aggregateValue(double value) {
-        throw new ComputerException("Not implemented: aggregateValue(double)");
-    }
-
-    /**
-     * Used by worker or master to get the aggregated value. The worker
-     * get an aggregated value of previous superstep in current superstep.
-     * The master can get an aggregated value of current superstep when
-     * master-computation compute().
-     */
-    V aggregatedValue();
-
-    /**
-     * Used by worker or master to set current aggregated value directly. The
-     * worker set aggregated value and then send to master for further
-     * aggregation. The master set aggregated value and then used by workers in
-     * the next superstep.
-     */
-    void aggregatedValue(V value);
-
-    /**
-     * Return cloned object of this instance.
-     */
-    Aggregator<V> copy();
-
-    /**
-     * Repair the object because some fields may not be deserialized.
-     */
-    void repair(ComputerContext context);
-}
diff --git a/computer-api/src/main/java/com/baidu/hugegraph/computer/core/aggregator/Aggregator4Master.java b/computer-api/src/main/java/com/baidu/hugegraph/computer/core/aggregator/Aggregator4Master.java
deleted file mode 100644
index 9a15cd1a..00000000
--- a/computer-api/src/main/java/com/baidu/hugegraph/computer/core/aggregator/Aggregator4Master.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.core.aggregator;
-
-import com.baidu.hugegraph.computer.core.combiner.Combiner;
-import com.baidu.hugegraph.computer.core.graph.value.Value;
-import com.baidu.hugegraph.computer.core.graph.value.ValueType;
-
-/**
- * Aggregator4Master used by algorithm's master-computation. The master must
- * register all aggregators before all supersteps start. Then the workers can
- * aggregate aggregators in superstep, send the aggregators to master when
- * superstep finish. The master aggregates the aggregators sent by workers.
- * The workers can get the aggregated values master aggregated at next
- * superstep. These values are identical among all workers.
- */
-public interface Aggregator4Master {
-
-    /**
-     * Register the aggregator with specified name. The name must be unique.
-     * Used by algorithm's master-computation init() to register aggregators.
-     */
-    <V extends Value, C extends Aggregator<V>>
-    void registerAggregator(String name, Class<C> aggregator);
-
-    /**
-     * Register aggregator with specified value type and a combiner which can
-     * combine values with specified value type. The name must be unique.
-     * Used by algorithm's master-computation init() to register aggregators.
-     */
-    <V extends Value, C extends Combiner<V>>
-    void registerAggregator(String name, ValueType type, Class<C> combiner);
-
-    /**
-     * Register aggregator with specified default value(include type) and
-     * a combiner which can combine values with specified value type.
-     * The name must be unique.
-     * Used by algorithm's master-computation init() to register aggregators.
-     */
-    <V extends Value, C extends Combiner<V>>
-    void registerAggregator(String name, V defaultValue, Class<C> combiner);
-
-    /**
-     * Set the aggregated value by master-computation, generally users may not
-     * need to explicitly set a aggregated value.
-     * If the value is set, it will be received by workers at next superstep.
-     * Throws ComputerException if master-computation does not register
-     * aggregator with specified name.
-     */
-    <V extends Value> void aggregatedValue(String name, V value);
-
-    /**
-     * Get the aggregated value. Each worker aggregate the aggregator value
-     * locally, then submit to master, then master aggregate the aggregators
-     * value from all workers. master-computation can get the aggregated value
-     * in master compute(), and worker-computation can get the aggregated value
-     * in the next superstep.
-     * Used by algorithm's master-computation compute()
-     * Throws ComputerException if master-computation does not register
-     * aggregator with the specified name.
-     */
-    <V extends Value> V aggregatedValue(String name);
-}
diff --git a/computer-api/src/main/java/com/baidu/hugegraph/computer/core/aggregator/Aggregator4Worker.java b/computer-api/src/main/java/com/baidu/hugegraph/computer/core/aggregator/Aggregator4Worker.java
deleted file mode 100644
index d1053312..00000000
--- a/computer-api/src/main/java/com/baidu/hugegraph/computer/core/aggregator/Aggregator4Worker.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.core.aggregator;
-
-import com.baidu.hugegraph.computer.core.graph.value.Value;
-
-/**
- * Aggregator4Worker used by algorithm's computation. The computation can
- * only use the aggregator with specified name the master registered.
- * See {@link Aggregator4Master} for detailed information about aggregation
- * process.
- */
-public interface Aggregator4Worker {
-
-    /**
-     * Create aggregator by name in worker-computation, the aggregator is
-     * registered by master-computation.
-     * Used by algorithm's worker-computation beforeSuperstep(), can be called
-     * in each superstep.
-     * Throws ComputerException if master-computation does not register
-     * aggregator with the specified name.
-     */
-    <V extends Value> Aggregator<V> createAggregator(String name);
-
-    /**
-     * Set aggregate value in worker. The value of aggregator will be
-     * aggregated locally in worker first, and it would be sent to master when
-     * the current superstep finish.
-     * Used by algorithm's worker-computation afterSuperstep(), can be called
-     * in each superstep.
-     * Throws ComputerException if master-computation does not register
-     * aggregator with the specified name.
-     * @param value The value to be aggregated
-     */
-    <V extends Value> void aggregateValue(String name, V value);
-
-    /**
-     * Get the aggregated value in worker-computation, the value is aggregated
-     * by master at previous superstep, it won't be changed in a superstep.
-     * Each worker aggregate an aggregator value locally, then submit to master,
-     * then master aggregate the aggregator values from all workers.
-     * master-computation can get the aggregated value in master compute(), and
-     * worker-computation can get the aggregated value in the next superstep.
-     * Used by algorithm's worker-computation compute(), can be called in
-     * each superstep.
-     * Throws ComputerException if master-computation does not register
-     * aggregator with the specified name.
-     */
-    <V extends Value> V aggregatedValue(String name);
-}
diff --git a/computer-api/src/main/java/com/baidu/hugegraph/computer/core/allocator/Allocator.java b/computer-api/src/main/java/com/baidu/hugegraph/computer/core/allocator/Allocator.java
deleted file mode 100644
index 3bd94453..00000000
--- a/computer-api/src/main/java/com/baidu/hugegraph/computer/core/allocator/Allocator.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.core.allocator;
-
-import com.baidu.hugegraph.computer.core.graph.edge.Edge;
-import com.baidu.hugegraph.computer.core.graph.vertex.Vertex;
-
-public interface Allocator {
-
-    RecyclerReference<Vertex> newVertex();
-
-    void freeVertex(RecyclerReference<Vertex> reference);
-
-    RecyclerReference<Edge> newEdge();
-
-    void freeEdge(RecyclerReference<Edge> reference);
-}
diff --git a/computer-api/src/main/java/com/baidu/hugegraph/computer/core/allocator/Recyclable.java b/computer-api/src/main/java/com/baidu/hugegraph/computer/core/allocator/Recyclable.java
deleted file mode 100644
index ddae4232..00000000
--- a/computer-api/src/main/java/com/baidu/hugegraph/computer/core/allocator/Recyclable.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.core.allocator;
-
-public interface Recyclable {
-}
diff --git a/computer-api/src/main/java/com/baidu/hugegraph/computer/core/allocator/RecyclerReference.java b/computer-api/src/main/java/com/baidu/hugegraph/computer/core/allocator/RecyclerReference.java
deleted file mode 100644
index 30b89126..00000000
--- a/computer-api/src/main/java/com/baidu/hugegraph/computer/core/allocator/RecyclerReference.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.core.allocator;
-
-import java.lang.ref.SoftReference;
-
-public class RecyclerReference<T extends Recyclable> extends SoftReference<T>
-       implements AutoCloseable {
-
-    private final Handle<RecyclerReference<T>> handle;
-
-    // TODO: create interface here and make parameter a interface.
-    public RecyclerReference(T referent,
-                             Handle<RecyclerReference<T>> handle) {
-        super(referent);
-        this.handle = handle;
-    }
-
-    @Override
-    public void close() {
-        this.handle.recycle(this);
-    }
-
-    // Copy from io.netty.util.Recycler.Handle
-    public interface Handle<O> {
-        void recycle(O object);
-    }
-}
diff --git a/computer-api/src/main/java/com/baidu/hugegraph/computer/core/combiner/Combiner.java b/computer-api/src/main/java/com/baidu/hugegraph/computer/core/combiner/Combiner.java
deleted file mode 100644
index 0cd27151..00000000
--- a/computer-api/src/main/java/com/baidu/hugegraph/computer/core/combiner/Combiner.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.core.combiner;
-
-import java.util.Iterator;
-
-import com.baidu.hugegraph.computer.core.graph.value.Value;
-
-public interface Combiner<T> {
-
-    /**
-     * @return The name of the combiner.
-     * @return class name by default.
-     */
-    default String name() {
-        return this.getClass().getName();
-    }
-
-    /**
-     * Combine v1 and v2 to result. The combined value may
-     * take use v1 or v2. The value of v1 and v2 may be updated. Should not
-     * use v1 and v2 after combine them.
-     */
-    void combine(T v1, T v2, T result);
-
-    @SuppressWarnings("unchecked")
-    static <T extends Value> T combineAll(Combiner<T> combiner,
-                                          Iterator<T> values) {
-        if (!values.hasNext()) {
-            return null;
-        }
-        T result = (T) values.next().copy();
-        while (values.hasNext()) {
-            combiner.combine(result, values.next(), result);
-        }
-        return result;
-    }
-}
diff --git a/computer-api/src/main/java/com/baidu/hugegraph/computer/core/combiner/DoubleValueSumCombiner.java b/computer-api/src/main/java/com/baidu/hugegraph/computer/core/combiner/DoubleValueSumCombiner.java
deleted file mode 100644
index bbc6bc6d..00000000
--- a/computer-api/src/main/java/com/baidu/hugegraph/computer/core/combiner/DoubleValueSumCombiner.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.core.combiner;
-
-import com.baidu.hugegraph.computer.core.graph.value.DoubleValue;
-import org.apache.hugegraph.util.E;
-
-public class DoubleValueSumCombiner implements Combiner<DoubleValue> {
-
-    @Override
-    public void combine(DoubleValue v1, DoubleValue v2, DoubleValue result) {
-        E.checkArgumentNotNull(v1, "The combine parameter v1 can't be null");
-        E.checkArgumentNotNull(v2, "The combine parameter v2 can't be null");
-        E.checkArgumentNotNull(result,
-                               "The combine parameter result can't be null");
-        result.value(v1.doubleValue() + v2.doubleValue());
-    }
-}
diff --git a/computer-api/src/main/java/com/baidu/hugegraph/computer/core/combiner/FloatValueSumCombiner.java b/computer-api/src/main/java/com/baidu/hugegraph/computer/core/combiner/FloatValueSumCombiner.java
deleted file mode 100644
index d6238866..00000000
--- a/computer-api/src/main/java/com/baidu/hugegraph/computer/core/combiner/FloatValueSumCombiner.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.core.combiner;
-
-import com.baidu.hugegraph.computer.core.graph.value.FloatValue;
-import org.apache.hugegraph.util.E;
-
-public class FloatValueSumCombiner implements Combiner<FloatValue> {
-
-    @Override
-    public void combine(FloatValue v1, FloatValue v2, FloatValue result) {
-        E.checkArgumentNotNull(v1, "The combine parameter v1 can't be null");
-        E.checkArgumentNotNull(v2, "The combine parameter v2 can't be null");
-        E.checkArgumentNotNull(result,
-                               "The combine parameter result can't be null");
-        result.value(v1.floatValue() + v2.floatValue());
-    }
-}
diff --git a/computer-api/src/main/java/com/baidu/hugegraph/computer/core/combiner/IntValueSumCombiner.java b/computer-api/src/main/java/com/baidu/hugegraph/computer/core/combiner/IntValueSumCombiner.java
deleted file mode 100644
index 0395b6f6..00000000
--- a/computer-api/src/main/java/com/baidu/hugegraph/computer/core/combiner/IntValueSumCombiner.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.core.combiner;
-
-import com.baidu.hugegraph.computer.core.graph.value.IntValue;
-import org.apache.hugegraph.util.E;
-
-public class IntValueSumCombiner implements Combiner<IntValue> {
-
-    @Override
-    public void combine(IntValue v1, IntValue v2, IntValue result) {
-        E.checkArgumentNotNull(v1, "The combine parameter v1 can't be null");
-        E.checkArgumentNotNull(v2, "The combine parameter v2 can't be null");
-        E.checkArgumentNotNull(result,
-                               "The combine parameter result can't be null");
-        result.value(v1.intValue() + v2.intValue());
-    }
-}
diff --git a/computer-api/src/main/java/com/baidu/hugegraph/computer/core/combiner/LongValueSumCombiner.java b/computer-api/src/main/java/com/baidu/hugegraph/computer/core/combiner/LongValueSumCombiner.java
deleted file mode 100644
index 4fa72f4e..00000000
--- a/computer-api/src/main/java/com/baidu/hugegraph/computer/core/combiner/LongValueSumCombiner.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.core.combiner;
-
-import com.baidu.hugegraph.computer.core.graph.value.LongValue;
-import org.apache.hugegraph.util.E;
-
-public class LongValueSumCombiner implements Combiner<LongValue> {
-
-    @Override
-    public void combine(LongValue v1, LongValue v2, LongValue result) {
-        E.checkArgumentNotNull(v1, "The combine parameter v1 can't be null");
-        E.checkArgumentNotNull(v2, "The combine parameter v2 can't be null");
-        E.checkArgumentNotNull(result,
-                               "The combine parameter result can't be null");
-        result.value(v1.longValue() + v2.longValue());
-    }
-}
diff --git a/computer-api/src/main/java/com/baidu/hugegraph/computer/core/combiner/MergeNewPropertiesCombiner.java b/computer-api/src/main/java/com/baidu/hugegraph/computer/core/combiner/MergeNewPropertiesCombiner.java
deleted file mode 100644
index e9eb8a76..00000000
--- a/computer-api/src/main/java/com/baidu/hugegraph/computer/core/combiner/MergeNewPropertiesCombiner.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.core.combiner;
-
-import java.util.Map;
-
-import com.baidu.hugegraph.computer.core.graph.properties.Properties;
-import com.baidu.hugegraph.computer.core.graph.value.Value;
-import org.apache.hugegraph.util.E;
-
-public class MergeNewPropertiesCombiner implements PropertiesCombiner {
-
-    /**
-     * Merge properties v2 and v1 into result. If a property exists in both v1
-     * and v2, remain the value in v1.
-     */
-    @Override
-    public void combine(Properties v1, Properties v2, Properties result) {
-        E.checkArgumentNotNull(v1, "The combine parameter v1 can't be null");
-        E.checkArgumentNotNull(v2, "The combine parameter v2 can't be null");
-        E.checkArgumentNotNull(result,
-                               "The combine parameter result can't be null");
-        E.checkArgument(v1 != result && v2 != result,
-                        "The combine parameter result " +
-                        "can't same with v1 or v2");
-
-        result.clear();
-
-        Map<String, Value> v1Map = v1.get();
-        for (Map.Entry<String, Value> entry : v1Map.entrySet()) {
-            result.put(entry.getKey(), entry.getValue());
-        }
-        Map<String, Value> v2Map = v2.get();
-        for (Map.Entry<String, Value> entry : v2Map.entrySet()) {
-             result.putIfAbsent(entry.getKey(), entry.getValue());
-        }
-    }
-}
diff --git a/computer-api/src/main/java/com/baidu/hugegraph/computer/core/combiner/MergeOldPropertiesCombiner.java b/computer-api/src/main/java/com/baidu/hugegraph/computer/core/combiner/MergeOldPropertiesCombiner.java
deleted file mode 100644
index 6ea81a23..00000000
--- a/computer-api/src/main/java/com/baidu/hugegraph/computer/core/combiner/MergeOldPropertiesCombiner.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.core.combiner;
-
-import java.util.Map;
-
-import com.baidu.hugegraph.computer.core.graph.properties.Properties;
-import com.baidu.hugegraph.computer.core.graph.value.Value;
-import org.apache.hugegraph.util.E;
-
-public class MergeOldPropertiesCombiner implements PropertiesCombiner {
-
-    /**
-     * Merge properties v1 and v2 into result. If a property exists in both v1
-     * and v2, remain the value in v2.
-     */
-    @Override
-    public void combine(Properties v1, Properties v2, Properties result) {
-        E.checkArgumentNotNull(v1, "The combine parameter v1 can't be null");
-        E.checkArgumentNotNull(v2, "The combine parameter v2 can't be null");
-        E.checkArgumentNotNull(result,
-                               "The combine parameter result can't be null");
-        E.checkArgument(v1 != result && v2 != result,
-                        "The combine parameter result " +
-                        "can't same with v1 or v2");
-
-        result.clear();
-
-        Map<String, Value> v2Map = v2.get();
-        for (Map.Entry<String, Value> entry : v2Map.entrySet()) {
-            result.put(entry.getKey(), entry.getValue());
-        }
-        Map<String, Value> v1Map = v1.get();
-        for (Map.Entry<String, Value> entry : v1Map.entrySet()) {
-            result.putIfAbsent(entry.getKey(), entry.getValue());
-        }
-    }
-}
diff --git a/computer-api/src/main/java/com/baidu/hugegraph/computer/core/combiner/OverwriteCombiner.java b/computer-api/src/main/java/com/baidu/hugegraph/computer/core/combiner/OverwriteCombiner.java
deleted file mode 100644
index 0b0f1c28..00000000
--- a/computer-api/src/main/java/com/baidu/hugegraph/computer/core/combiner/OverwriteCombiner.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.core.combiner;
-
-import com.baidu.hugegraph.computer.core.graph.value.Value;
-import org.apache.hugegraph.util.E;
-
-public class OverwriteCombiner<T extends Value> implements Combiner<T> {
-
-    @Override
-    public void combine(T v1, T v2, T result) {
-        E.checkArgumentNotNull(v1, "The combine parameter v1 can't be null");
-        E.checkArgumentNotNull(v2, "The combine parameter v2 can't be null");
-        E.checkArgumentNotNull(result,
-                               "The combine parameter result can't be null");
-        result.assign(v2);
-    }
-}
diff --git a/computer-api/src/main/java/com/baidu/hugegraph/computer/core/combiner/OverwritePropertiesCombiner.java b/computer-api/src/main/java/com/baidu/hugegraph/computer/core/combiner/OverwritePropertiesCombiner.java
deleted file mode 100644
index c9baac7d..00000000
--- a/computer-api/src/main/java/com/baidu/hugegraph/computer/core/combiner/OverwritePropertiesCombiner.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.core.combiner;
-
-import com.baidu.hugegraph.computer.core.graph.properties.Properties;
-import org.apache.hugegraph.util.E;
-
-public class OverwritePropertiesCombiner implements PropertiesCombiner {
-
-    @Override
-    public void combine(Properties v1, Properties v2, Properties result) {
-        E.checkArgumentNotNull(v1, "The combine parameter v1 can't be null");
-        E.checkArgumentNotNull(v2, "The combine parameter v2 can't be null");
-        E.checkArgumentNotNull(result,
-                               "The combine parameter result can't be null");
-
-        E.checkArgument(v1 != result && v2 != result,
-                        "The combine parameter result " +
-                        "can't same with v1 or v2");
-
-        result.clear();
-        result.putAll(v2.get());
-    }
-}
diff --git a/computer-api/src/main/java/com/baidu/hugegraph/computer/core/combiner/PropertiesCombiner.java b/computer-api/src/main/java/com/baidu/hugegraph/computer/core/combiner/PropertiesCombiner.java
deleted file mode 100644
index fee77167..00000000
--- a/computer-api/src/main/java/com/baidu/hugegraph/computer/core/combiner/PropertiesCombiner.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.core.combiner;
-
-import com.baidu.hugegraph.computer.core.graph.properties.Properties;
-
-/**
- * When vertex properties with the same vertex id are loaded, this class
- * specifies how to combine their properties.
- */
-public interface PropertiesCombiner extends Combiner<Properties> {
-}
diff --git a/computer-api/src/main/java/com/baidu/hugegraph/computer/core/combiner/ValueMaxCombiner.java b/computer-api/src/main/java/com/baidu/hugegraph/computer/core/combiner/ValueMaxCombiner.java
deleted file mode 100644
index 41c36e74..00000000
--- a/computer-api/src/main/java/com/baidu/hugegraph/computer/core/combiner/ValueMaxCombiner.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.core.combiner;
-
-import com.baidu.hugegraph.computer.core.graph.value.Value;
-import org.apache.hugegraph.util.E;
-
-public class ValueMaxCombiner<T extends Value> implements Combiner<T> {
-
-    @Override
-    public void combine(T v1, T v2, T result) {
-        E.checkArgumentNotNull(v1, "The combine parameter v1 can't be null");
-        E.checkArgumentNotNull(v2, "The combine parameter v2 can't be null");
-        E.checkArgumentNotNull(result,
-                               "The combine parameter result can't be null");
-        if (v1.compareTo(v2) >= 0) {
-            result.assign(v1);
-        } else {
-            result.assign(v2);
-        }
-    }
-}
diff --git a/computer-api/src/main/java/com/baidu/hugegraph/computer/core/combiner/ValueMinCombiner.java b/computer-api/src/main/java/com/baidu/hugegraph/computer/core/combiner/ValueMinCombiner.java
deleted file mode 100644
index c21c68fa..00000000
--- a/computer-api/src/main/java/com/baidu/hugegraph/computer/core/combiner/ValueMinCombiner.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.core.combiner;
-
-import com.baidu.hugegraph.computer.core.graph.value.Value;
-import org.apache.hugegraph.util.E;
-
-public class ValueMinCombiner<T extends Value> implements Combiner<T> {
-
-    @Override
-    public void combine(T v1, T v2, T result) {
-        E.checkArgumentNotNull(v1, "The combine parameter v1 can't be null");
-        E.checkArgumentNotNull(v2, "The combine parameter v2 can't be null");
-        E.checkArgumentNotNull(result,
-                               "The combine parameter result can't be null");
-        if (v1.compareTo(v2) <= 0) {
-            result.assign(v1);
-        } else {
-            result.assign(v2);
-        }
-    }
-}
diff --git a/computer-api/src/main/java/com/baidu/hugegraph/computer/core/common/ComputerContext.java b/computer-api/src/main/java/com/baidu/hugegraph/computer/core/common/ComputerContext.java
deleted file mode 100644
index f7530045..00000000
--- a/computer-api/src/main/java/com/baidu/hugegraph/computer/core/common/ComputerContext.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.core.common;
-
-import com.baidu.hugegraph.computer.core.allocator.Allocator;
-import com.baidu.hugegraph.computer.core.config.Config;
-import com.baidu.hugegraph.computer.core.graph.GraphFactory;
-import org.apache.hugegraph.util.E;
-
-public final class ComputerContext {
-
-    private static volatile ComputerContext INSTANCE;
-
-    private final Config config;
-    private final GraphFactory graphFactory;
-    private final Allocator allocator;
-
-    private ComputerContext(Config config,
-                            GraphFactory graphFactory,
-                            Allocator allocator) {
-        this.config = config;
-        this.graphFactory = graphFactory;
-        this.allocator = allocator;
-    }
-
-    public static synchronized void initContext(Config config,
-                                                GraphFactory graphFactory,
-                                                Allocator allocator) {
-        INSTANCE = new ComputerContext(config, graphFactory, allocator);
-    }
-
-    public static ComputerContext instance() {
-        E.checkNotNull(INSTANCE, "ComputerContext INSTANCE");
-        return INSTANCE;
-    }
-
-    public Config config() {
-        return this.config;
-    }
-
-    public GraphFactory graphFactory() {
-        return this.graphFactory;
-    }
-
-    public Allocator allocator() {
-        return this.allocator;
-    }
-}
diff --git a/computer-api/src/main/java/com/baidu/hugegraph/computer/core/common/Constants.java b/computer-api/src/main/java/com/baidu/hugegraph/computer/core/common/Constants.java
deleted file mode 100644
index 62534a6b..00000000
--- a/computer-api/src/main/java/com/baidu/hugegraph/computer/core/common/Constants.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.core.common;
-
-import org.apache.hugegraph.util.Bytes;
-
-public final class Constants {
-
-    public static final byte[] EMPTY_BYTES = new byte[0];
-
-    public static final int BOOLEAN_LEN = 1;
-    public static final int BYTE_LEN = Byte.BYTES;
-    public static final int SHORT_LEN = Short.BYTES;
-    public static final int INT_LEN = Integer.BYTES;
-    public static final int LONG_LEN = Long.BYTES;
-    public static final int CHAR_LEN = Character.BYTES;
-    public static final int FLOAT_LEN = Float.BYTES;
-    public static final int DOUBLE_LEN = Double.BYTES;
-
-    public static final int UINT8_MAX = 0xff;
-    public static final int UINT16_MAX = 0xffff;
-    public static final long UINT32_MAX = 0xffffffffL;
-
-    /*
-     * The small buffer size for buffered input & output,
-     * mainly used in input & output of memory
-     */
-    public static final int SMALL_BUF_SIZE = 32;
-
-    /*
-     * The big buffer size for buffered input & output,
-     * mainly used in input & output of file and stream
-     */
-    public static final int BIG_BUF_SIZE = (int) Bytes.KB * 8;
-
-    /*
-     * The capacity of message queue
-     */
-    public static final int QUEUE_CAPACITY = 128;
-
-    /*
-     * The timeout in second for asynchronous tasks
-     */
-    public static final int FUTURE_TIMEOUT = 300;
-
-    /*
-     * The timeout in millisecond for threadpool shutdown
-     */
-    public static final long SHUTDOWN_TIMEOUT = 5000L;
-
-    // The mode to read a file
-    public static final String FILE_MODE_READ = "r";
-
-    // The mode to write a file
-    public static final String FILE_MODE_WRITE = "rw";
-
-    public static final String EMPTY_STR = "";
-
-    public static final int INPUT_SUPERSTEP = -1;
-}
diff --git a/computer-api/src/main/java/com/baidu/hugegraph/computer/core/common/SerialEnum.java b/computer-api/src/main/java/com/baidu/hugegraph/computer/core/common/SerialEnum.java
deleted file mode 100644
index 8d073c0d..00000000
--- a/computer-api/src/main/java/com/baidu/hugegraph/computer/core/common/SerialEnum.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.core.common;
-
-import com.baidu.hugegraph.computer.core.common.exception.ComputerException;
-import org.apache.hugegraph.util.CollectionUtil;
-import com.google.common.collect.HashBasedTable;
-import com.google.common.collect.Table;
-
-public interface SerialEnum {
-
-    byte code();
-
-    Table<Class<?>, Byte, SerialEnum> TABLE = HashBasedTable.create();
-
-    static void register(Class<? extends SerialEnum> clazz) {
-        Object enums;
-        try {
-            enums = clazz.getMethod("values").invoke(null);
-        } catch (Exception e) {
-            throw new ComputerException("Call method values() error", e);
-        }
-        for (SerialEnum e : CollectionUtil.<SerialEnum>toList(enums)) {
-            TABLE.put(clazz, e.code(), e);
-        }
-    }
-
-    static <T extends SerialEnum> T fromCode(Class<T> clazz, byte code) {
-        @SuppressWarnings("unchecked")
-        T value = (T) TABLE.get(clazz, code);
-        if (value == null) {
-            throw new ComputerException("Can't construct %s from code %s",
-                                        clazz.getSimpleName(), code);
-        }
-        return value;
-    }
-}
diff --git a/computer-api/src/main/java/com/baidu/hugegraph/computer/core/common/exception/ComputerException.java b/computer-api/src/main/java/com/baidu/hugegraph/computer/core/common/exception/ComputerException.java
deleted file mode 100644
index 2f001018..00000000
--- a/computer-api/src/main/java/com/baidu/hugegraph/computer/core/common/exception/ComputerException.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.core.common.exception;
-
-/**
- * The base class for all exception types
- */
-public class ComputerException extends RuntimeException {
-
-    private static final long serialVersionUID = 3621207523020113277L;
-
-    public ComputerException(String message) {
-        super(message);
-    }
-
-    public ComputerException(String message, Throwable cause) {
-        super(message, cause);
-    }
-
-    public ComputerException(String message, Object... args) {
-        super(String.format(message, args));
-    }
-
-    public ComputerException(String message, Throwable cause, Object... args) {
-        super(String.format(message, args), cause);
-    }
-
-    public Throwable rootCause() {
-        return rootCause(this);
-    }
-
-    public static Throwable rootCause(Throwable e) {
-        Throwable cause = e;
-        while (cause.getCause() != null) {
-            cause = cause.getCause();
-        }
-        return cause;
-    }
-}
diff --git a/computer-api/src/main/java/com/baidu/hugegraph/computer/core/config/ComputerOptions.java b/computer-api/src/main/java/com/baidu/hugegraph/computer/core/config/ComputerOptions.java
deleted file mode 100644
index 85f699ca..00000000
--- a/computer-api/src/main/java/com/baidu/hugegraph/computer/core/config/ComputerOptions.java
+++ /dev/null
@@ -1,937 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.core.config;
-
-import static com.baidu.hugegraph.computer.algorithm.AlgorithmParams.DEFAULTINPUTFILTER_CLASS_NAME;
-import static com.baidu.hugegraph.computer.algorithm.AlgorithmParams.LOG_OUTPUT_CLASS_NAME;
-import static org.apache.hugegraph.config.OptionChecker.allowValues;
-import static org.apache.hugegraph.config.OptionChecker.disallowEmpty;
-import static org.apache.hugegraph.config.OptionChecker.nonNegativeInt;
-import static org.apache.hugegraph.config.OptionChecker.positiveInt;
-
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.hugegraph.config.ConfigConvOption;
-import org.apache.hugegraph.config.ConfigListOption;
-import org.apache.hugegraph.config.ConfigOption;
-import org.apache.hugegraph.config.OptionHolder;
-import org.apache.hugegraph.structure.constant.Direction;
-import org.apache.hugegraph.util.Bytes;
-import org.apache.hugegraph.util.Log;
-import org.slf4j.Logger;
-
-import com.baidu.hugegraph.computer.core.combiner.OverwritePropertiesCombiner;
-import com.baidu.hugegraph.computer.core.master.DefaultMasterComputation;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-
-public class ComputerOptions extends OptionHolder {
-
-    private static final Logger LOG = Log.logger(ComputerOptions.class);
-
-    public static final int TRANSPORT_DEFAULT_THREADS = 4;
-    public static final String RPC_SERVER_HOST_NAME = "rpc.server_host";
-    public static final String RPC_SERVER_PORT_NAME = "rpc.server_port";
-    public static final String RPC_REMOTE_URL_NAME = "rpc.remote_url";
-
-    private ComputerOptions() {
-        super();
-    }
-
-    private static volatile ComputerOptions INSTANCE;
-
-    public static synchronized ComputerOptions instance() {
-        if (INSTANCE == null) {
-            INSTANCE = new ComputerOptions();
-            // Should initialize all static members first, then register.
-            INSTANCE.registerOptions();
-        }
-        return INSTANCE;
-    }
-
-    public static final ConfigOption<Class<?>> ALGORITHM_PARAMS_CLASS =
-            new ConfigOption<>(
-                    "algorithm.params_class",
-                    "The class used to transfer algorithms' parameters " +
-                    "before algorithm been run.",
-                    disallowEmpty(),
-                    Null.class
-            );
-
-    public static final ConfigOption<Class<?>> ALGORITHM_RESULT_CLASS =
-            new ConfigOption<>(
-                    "algorithm.result_class",
-                    "The class of vertex's value, the instance is used to " +
-                    "store computation result for the vertex.",
-                    disallowEmpty(),
-                    Null.class
-            );
-
-    public static final ConfigOption<Class<?>> ALGORITHM_MESSAGE_CLASS =
-            new ConfigOption<>(
-                    "algorithm.message_class",
-                    "The class of message passed when compute vertex.",
-                    disallowEmpty(),
-                    Null.class
-            );
-
-    public static final ConfigOption<String> INPUT_SOURCE_TYPE =
-            new ConfigOption<>(
-                    "input.source_type",
-                    "The source type to load input data",
-                    allowValues("hugegraph-server", "hugegraph-loader"),
-                    "hugegraph-server"
-            );
-
-    public static final ConfigOption<Integer> INPUT_SPLIT_FETCH_TIMEOUT =
-            new ConfigOption<>(
-                    "input.split_fetch_timeout",
-                    "The timeout in seconds to fetch input splits",
-                    positiveInt(),
-                    300
-            );
-
-    public static final ConfigOption<Long> INPUT_SPLITS_SIZE =
-            new ConfigOption<>(
-                    "input.split_size",
-                    "The input split size in bytes",
-                    positiveInt(),
-                    1024 * 1024L
-            );
-
-    public static final ConfigOption<Integer> INPUT_MAX_SPLITS =
-            new ConfigOption<>(
-                    "input.split_max_splits",
-                    "The maximum number of input splits",
-                    positiveInt(),
-                    10_000_000
-            );
-
-    public static final ConfigOption<Integer> INPUT_SPLIT_PAGE_SIZE =
-            new ConfigOption<>(
-                    "input.split_page_size",
-                    "The page size for streamed load input split data",
-                    positiveInt(),
-                    500
-            );
-
-    public static final ConfigOption<Class<?>> INPUT_FILTER_CLASS =
-            new ConfigOption<>(
-                    "input.filter_class",
-                    "The class to create input-filter object, " +
-                    "input-filter is used to Filter vertex edges " +
-                    "according to user needs.",
-                    disallowEmpty(),
-                    loadClass(DEFAULTINPUTFILTER_CLASS_NAME)
-            );
-
-    public static final ConfigConvOption<String, Direction>
-            INPUT_EDGE_DIRECTION = new ConfigConvOption<>(
-                    "input.edge_direction",
-                    "The data of the edge in which direction is loaded, " +
-                    "when the value is BOTH, the edges in both OUT and IN " +
-                    "direction will be loaded.",
-                    allowValues("OUT", "IN", "BOTH"),
-                    Direction::valueOf,
-                    "OUT"
-            );
-
-    public static final ConfigConvOption<String, EdgeFrequency>
-            INPUT_EDGE_FREQ = new ConfigConvOption<>(
-                    "input.edge_freq",
-                    "The frequency of edges can exist between a pair of " +
-                    "vertices, allowed values: [SINGLE, SINGLE_PER_LABEL, " +
-                    "MULTIPLE]. SINGLE means that only one edge can exist " +
-                    "between a pair of vertices, use sourceId + targetId to " +
-                    "identify it; SINGLE_PER_LABEL means that each edge " +
-                    "label can exist one edge between a pair of vertices, " +
-                    "use sourceId + edgelabel + targetId to identify it; " +
-                    "MULTIPLE means that many edge can exist between a pair " +
-                    "of vertices, use sourceId + edgelabel + sortValues + " +
-                    "targetId to identify it.",
-                    allowValues("SINGLE", "SINGLE_PER_LABEL", "MULTIPLE"),
-                    EdgeFrequency::valueOf,
-                    "MULTIPLE"
-            );
-
-    public static final ConfigOption<Integer> INPUT_MAX_EDGES_IN_ONE_VERTEX =
-            new ConfigOption<>(
-                    "input.max_edges_in_one_vertex",
-                    "The maximum number of adjacent edges allowed to be " +
-                    "attached to a vertex, the adjacent edges will be " +
-                    "stored and transferred together as a batch unit.",
-                    positiveInt(),
-                    200
-            );
-
-    public static final ConfigOption<String> INPUT_LOADER_STRUCT_PATH =
-            new ConfigOption<>(
-                    "input.loader_struct_path",
-                    "The struct path of loader input, only takes effect when " +
-                    "the input.source_type=loader is enabled",
-                    null,
-                    ""
-            );
-
-    public static final ConfigOption<String> INPUT_LOADER_SCHEMA_PATH =
-            new ConfigOption<>(
-                    "input.loader_schema_path",
-                    "The schema path of loader input, only takes effect when " +
-                    "the input.source_type=loader is enabled",
-                    null,
-                    ""
-            );
-
-    public static final ConfigOption<Integer> SORT_THREAD_NUMS =
-            new ConfigOption<>(
-                    "sort.thread_nums",
-                    "The number of threads performing internal sorting.",
-                    positiveInt(),
-                    4
-            );
-
-    public static final ConfigOption<Class<?>> OUTPUT_CLASS =
-            new ConfigOption<>(
-                    "output.output_class",
-                    "The class to output the computation result of each " +
-                    "vertex. Be called after iteration computation.",
-                    disallowEmpty(),
-                    loadClass(LOG_OUTPUT_CLASS_NAME)
-            );
-
-    public static final ConfigOption<String> OUTPUT_RESULT_NAME =
-            new ConfigOption<>(
-                    "output.result_name",
-                    "The value is assigned dynamically by #name() of " +
-                    "instance created by WORKER_COMPUTATION_CLASS.",
-                    disallowEmpty(),
-                    "value"
-            );
-
-    public static final ConfigOption<Boolean> OUTPUT_WITH_ADJACENT_EDGES =
-            new ConfigOption<>(
-                    "output.with_adjacent_edges",
-                    "Output the adjacent edges of the vertex or not",
-                    allowValues(true, false),
-                    false
-            );
-
-    public static final ConfigOption<Boolean> OUTPUT_WITH_VERTEX_PROPERTIES =
-            new ConfigOption<>(
-                    "output.with_vertex_properties",
-                    "Output the properties of the vertex or not",
-                    allowValues(true, false),
-                    false
-            );
-
-    public static final ConfigOption<Boolean> OUTPUT_WITH_EDGE_PROPERTIES =
-            new ConfigOption<>(
-                    "output.with_edge_properties",
-                    "Output the properties of the edge or not",
-                    allowValues(true, false),
-                    false
-            );
-
-    public static final ConfigOption<String> OUTPUT_RESULT_WRITE_TYPE =
-            new ConfigOption<>(
-                    "output.result_write_type",
-                    "The result write-type to output to hugegraph, " +
-                    "allowed values are: " +
-                    "[OLAP_COMMON, OLAP_SECONDARY, OLAP_RANGE].",
-                    allowValues("OLAP_COMMON", "OLAP_SECONDARY", "OLAP_RANGE"),
-                    "OLAP_COMMON"
-            );
-
-    public static final ConfigOption<Integer> OUTPUT_BATCH_SIZE =
-            new ConfigOption<>(
-                    "output.batch_size",
-                    "The batch size of output",
-                    positiveInt(),
-                    500
-            );
-
-    public static final ConfigOption<Integer> OUTPUT_BATCH_THREADS =
-            new ConfigOption<>(
-                    "output.batch_threads",
-                    "The threads number used to batch output",
-                    positiveInt(),
-                    1
-            );
-
-    public static final ConfigOption<Integer> OUTPUT_SINGLE_THREADS =
-            new ConfigOption<>(
-                    "output.single_threads",
-                    "The threads number used to single output",
-                    positiveInt(),
-                    1
-            );
-
-    public static final ConfigOption<Integer>
-            OUTPUT_THREAD_POOL_SHUTDOWN_TIMEOUT =
-            new ConfigOption<>(
-                    "output.thread_pool_shutdown_timeout",
-                    "The timeout seconds of output threads pool shutdown",
-                    positiveInt(),
-                    60
-            );
-
-    public static final ConfigOption<Integer> OUTPUT_RETRY_TIMES =
-            new ConfigOption<>(
-                    "output.retry_times",
-                    "The retry times when output failed",
-                    positiveInt(),
-                    3
-            );
-
-    public static final ConfigOption<Integer> OUTPUT_RETRY_INTERVAL =
-            new ConfigOption<>(
-                    "output.retry_interval",
-                    "The retry interval when output failed",
-                    positiveInt(),
-                    10
-            );
-
-    public static final ConfigOption<String> OUTPUT_HDFS_URL =
-            new ConfigOption<>(
-                    "output.hdfs_url",
-                    "The hdfs url of output.",
-                    disallowEmpty(),
-                    "hdfs://127.0.0.1:9000"
-            );
-
-    public static final ConfigOption<String> OUTPUT_HDFS_USER =
-            new ConfigOption<>(
-                    "output.hdfs_user",
-                    "The hdfs user of output.",
-                    disallowEmpty(),
-                    "hadoop"
-            );
-
-    public static final ConfigOption<String> OUTPUT_HDFS_CORE_SITE_PATH =
-            new ConfigOption<>(
-                    "output.hdfs_core_site_path",
-                    "The hdfs core site path.",
-                    null,
-                    ""
-            );
-
-    public static final ConfigOption<String> OUTPUT_HDFS_SITE_PATH =
-            new ConfigOption<>(
-                    "output.hdfs_site_path",
-                    "The hdfs site path.",
-                    null,
-                    ""
-            );
-
-    public static final ConfigOption<Short> OUTPUT_HDFS_REPLICATION =
-            new ConfigOption<>(
-                    "output.hdfs_replication",
-                    "The replication number of hdfs.",
-                    positiveInt(),
-                    (short) 3
-            );
-
-    public static final ConfigOption<String> OUTPUT_HDFS_DIR =
-            new ConfigOption<>(
-                    "output.hdfs_path_prefix",
-                    "The directory of hdfs output result.",
-                    disallowEmpty(),
-                    "/hugegraph-computer/results"
-            );
-
-    public static final ConfigOption<String> OUTPUT_HDFS_DELIMITER =
-            new ConfigOption<>(
-                    "output.hdfs_delimiter",
-                    "The delimiter of hdfs output.",
-                    disallowEmpty(),
-                    ","
-            );
-
-    public static final ConfigOption<Boolean> OUTPUT_HDFS_MERGE =
-            new ConfigOption<>(
-                    "output.hdfs_merge_partitions",
-                    "Whether merge output files of multiple partitions.",
-                    allowValues(true, false),
-                    true
-            );
-
-    public static final ConfigOption<Boolean> OUTPUT_HDFS_KERBEROS_ENABLE =
-            new ConfigOption<>(
-                    "output.hdfs_kerberos_enable",
-                    "Is Kerberos authentication enabled for Hdfs.",
-                    allowValues(true, false),
-                    false
-            );
-
-    public static final ConfigOption<String> OUTPUT_HDFS_KRB5_CONF =
-            new ConfigOption<>(
-                    "output.hdfs_krb5_conf",
-                    "Kerberos configuration file.",
-                    disallowEmpty(),
-                    "/etc/krb5.conf"
-            );
-
-    public static final ConfigOption<String> OUTPUT_HDFS_KERBEROS_PRINCIPAL =
-            new ConfigOption<>(
-                    "output.hdfs_kerberos_principal",
-                    "The Hdfs's principal for kerberos authentication.",
-                    null,
-                    ""
-            );
-
-    public static final ConfigOption<String> OUTPUT_HDFS_KERBEROS_KEYTAB =
-            new ConfigOption<>(
-                    "output.hdfs_kerberos_keytab",
-                    "The Hdfs's key tab file for kerberos authentication.",
-                    null,
-                    ""
-            );
-
-    public static final ConfigOption<Integer>
-           ALLOCATOR_MAX_VERTICES_PER_THREAD = new ConfigOption<>(
-                    "allocator.max_vertices_per_thread",
-                    "Maximum number of vertices per thread processed " +
-                    "in each memory allocator",
-                    positiveInt(),
-                    10000
-            );
-
-    public static final ConfigOption<String> JOB_ID =
-            new ConfigOption<>(
-                    "job.id",
-                    "The job id on Yarn cluster or K8s cluster.",
-                    disallowEmpty(),
-                    "local_0001"
-            );
-
-    public static final ConfigOption<Integer> JOB_WORKERS_COUNT =
-            new ConfigOption<>(
-                    "job.workers_count",
-                    "The workers count for computing one graph " +
-                    "algorithm job.",
-                    positiveInt(),
-                    1
-            );
-
-    public static final ConfigOption<Integer> JOB_PARTITIONS_COUNT =
-            new ConfigOption<>(
-                    "job.partitions_count",
-                    "The partitions count for computing one graph " +
-                    "algorithm job.",
-                    positiveInt(),
-                    1
-            );
-
-    public static final ConfigOption<Integer> PARTITIONS_COMPUTE_THREAD_NUMS =
-            new ConfigOption<>(
-                    "job.partitions_thread_nums",
-                    "The number of threads for partition parallel compute.",
-                    positiveInt(),
-                    4
-            );
-
-    public static final ConfigOption<Integer> BSP_MAX_SUPER_STEP =
-            new ConfigOption<>(
-                    "bsp.max_super_step",
-                    "The max super step of the algorithm.",
-                    positiveInt(),
-                    10
-            );
-
-    public static final ConfigOption<String> BSP_ETCD_ENDPOINTS =
-            new ConfigOption<>(
-                    "bsp.etcd_endpoints",
-                    "The end points to access etcd.",
-                    disallowEmpty(),
-                    "http://localhost:2379"
-            );
-
-    public static final ConfigOption<Long> BSP_REGISTER_TIMEOUT =
-            new ConfigOption<>(
-                    "bsp.register_timeout",
-                    "The max timeout to wait for master and works to register.",
-                    positiveInt(),
-                    TimeUnit.MINUTES.toMillis(5L)
-            );
-
-    public static final ConfigOption<Long> BSP_WAIT_WORKERS_TIMEOUT =
-            new ConfigOption<>(
-                    "bsp.wait_workers_timeout",
-                    "The max timeout to wait for workers bsp event.",
-                    positiveInt(),
-                    TimeUnit.HOURS.toMillis(24L)
-            );
-
-    public static final ConfigOption<Long> BSP_WAIT_MASTER_TIMEOUT =
-            new ConfigOption<>(
-                    "bsp.wait_master_timeout",
-                    "The max timeout(in ms) to wait for master bsp event.",
-                    positiveInt(),
-                    TimeUnit.HOURS.toMillis(24L)
-            );
-
-    public static final ConfigOption<Long> BSP_LOG_INTERVAL =
-            new ConfigOption<>(
-                    "bsp.log_interval",
-                    "The log interval(in ms) to print the log while " +
-                    "waiting bsp event.",
-                    positiveInt(),
-                    TimeUnit.SECONDS.toMillis(30L)
-            );
-
-    public static final ConfigOption<Class<?>> WORKER_PARTITIONER =
-            new ConfigOption<>(
-                    "worker.partitioner",
-                    "The partitioner that decides which partition a vertex " +
-                    "should be in, and which worker a partition should be in.",
-                    disallowEmpty(),
-                    loadClass("com.baidu.hugegraph.computer.core.graph.partition.HashPartitioner")
-            );
-
-    public static final ConfigOption<Class<?>> WORKER_COMPUTATION_CLASS =
-            new ConfigOption<>(
-                    "worker.computation_class",
-                    "The class to create worker-computation object, " +
-                    "worker-computation is used to compute each vertex " +
-                    "in each superstep.",
-                    disallowEmpty(),
-                    Null.class
-            );
-
-    public static final ConfigOption<Class<?>> WORKER_COMBINER_CLASS =
-            new ConfigOption<>(
-                    "worker.combiner_class",
-                    "Combiner can combine messages into one value for a " +
-                    "vertex, for example page-rank algorithm can combine " +
-                    "messages of a vertex to a sum value.",
-                    disallowEmpty(),
-                    Null.class
-            );
-
-    public static final ConfigOption<Class<?>>
-            WORKER_VERTEX_PROPERTIES_COMBINER_CLASS =
-            new ConfigOption<>(
-                    "worker.vertex_properties_combiner_class",
-                    "The combiner can combine several properties of the same " +
-                    "vertex into one properties at inputstep.",
-                    disallowEmpty(),
-                    OverwritePropertiesCombiner.class
-            );
-
-    public static final ConfigOption<Class<?>>
-            WORKER_EDGE_PROPERTIES_COMBINER_CLASS =
-            new ConfigOption<>(
-                    "worker.edge_properties_combiner_class",
-                    "The combiner can combine several properties of the same " +
-                    "edge into one properties at inputstep.",
-                    disallowEmpty(),
-                    OverwritePropertiesCombiner.class
-            );
-
-    public static final ConfigOption<Long> WORKER_RECEIVED_BUFFERS_BYTES_LIMIT =
-            new ConfigOption<>(
-                    "worker.received_buffers_bytes_limit",
-                    "The limit bytes of buffers of received data, " +
-                    "the total size of all buffers can't excess this limit. " +
-                    "If received buffers reach this limit, they will be " +
-                    "merged into a file.",
-                    positiveInt(),
-                    100 * Bytes.MB
-            );
-
-    public static final ConfigOption<Long> WORKER_WAIT_SORT_TIMEOUT =
-            new ConfigOption<>(
-                    "worker.wait_sort_timeout",
-                    "The max timeout(in ms) message-handler wait for " +
-                    "sort-thread to sort one batch of buffers.",
-                    positiveInt(),
-                    TimeUnit.MINUTES.toMillis(10)
-            );
-
-    public static final ConfigOption<Long> WORKER_WAIT_FINISH_MESSAGES_TIMEOUT =
-            new ConfigOption<>(
-                    "worker.wait_finish_messages_timeout",
-                    "The max timeout(in ms) message-handler wait for " +
-                    "finish-message of all workers.",
-                    positiveInt(),
-                    TimeUnit.HOURS.toMillis(24)
-            );
-
-    public static final ConfigListOption<String> WORKER_DATA_DIRS =
-            new ConfigListOption<>(
-                    "worker.data_dirs",
-                    true,
-                    "The directories separated by ',' that received " +
-                    "vertices and messages can persist into.",
-                    disallowEmpty(),
-                    String.class,
-                    ImmutableList.of("jobs")
-            );
-
-    public static final ConfigOption<Integer> WORKER_WRITE_BUFFER_THRESHOLD =
-            new ConfigOption<>(
-                    "worker.write_buffer_threshold",
-                    "The threshold of write buffer, exceeding it will " +
-                    "trigger sorting, the write buffer is used to store " +
-                    "vertex or message.",
-                    positiveInt(),
-                    (int) (50 * Bytes.MB)
-            );
-
-    public static final ConfigOption<Integer>
-            WORKER_WRITE_BUFFER_INIT_CAPACITY = new ConfigOption<>(
-                    "worker.write_buffer_capacity",
-                    "The initial size of write buffer that used to store " +
-                    "vertex or message.",
-                    positiveInt(),
-                    (int) (50 * Bytes.MB)
-            );
-
-    public static final ConfigOption<Class<?>> MASTER_COMPUTATION_CLASS =
-            new ConfigOption<>(
-                    "master.computation_class",
-                    "Master-computation is computation that can determine " +
-                    "whether to continue next superstep. It runs at the end " +
-                    "of each superstep on master.",
-                    disallowEmpty(),
-                    DefaultMasterComputation.class
-            );
-
-    public static final ConfigOption<String> HUGEGRAPH_URL =
-            new ConfigOption<>(
-                    "hugegraph.url",
-                    "The hugegraph url to load data and write results back.",
-                    disallowEmpty(),
-                    "http://127.0.0.1:8080"
-            );
-
-    public static final ConfigOption<String> HUGEGRAPH_GRAPH_NAME =
-            new ConfigOption<>(
-                    "hugegraph.name",
-                    "The graph name to load data and write results back.",
-                    disallowEmpty(),
-                    "hugegraph"
-            );
-
-    public static final ConfigOption<String> TRANSPORT_SERVER_HOST =
-            new ConfigOption<>(
-                    "transport.server_host",
-                    "The server hostname or ip to listen on to transfer data.",
-                    disallowEmpty(),
-                    "127.0.0.1"
-            );
-
-    public static final ConfigOption<Integer> TRANSPORT_SERVER_PORT =
-            new ConfigOption<>(
-                    "transport.server_port",
-                    "The server port to listen on to transfer data. " +
-                    "The system will assign a random port if it's set to 0.",
-                    nonNegativeInt(),
-                    0
-            );
-
-    public static final ConfigOption<Integer> TRANSPORT_SERVER_THREADS =
-            new ConfigOption<>(
-                    "transport.server_threads",
-                    "The number of transport threads for server.",
-                    positiveInt(),
-                    TRANSPORT_DEFAULT_THREADS
-            );
-
-    public static final ConfigOption<Integer> TRANSPORT_CLIENT_THREADS =
-            new ConfigOption<>(
-                    "transport.client_threads",
-                    "The number of transport threads for client.",
-                    positiveInt(),
-                    TRANSPORT_DEFAULT_THREADS
-            );
-
-    public static final ConfigOption<Class<?>> TRANSPORT_PROVIDER_CLASS =
-            new ConfigOption<>(
-                    "transport.provider_class",
-                    "The transport provider, currently only supports Netty.",
-                    disallowEmpty(),
-                    loadClass("com.baidu.hugegraph.computer.core.network.netty" +
-                              ".NettyTransportProvider")
-            );
-
-    public static final ConfigOption<String> TRANSPORT_IO_MODE =
-            new ConfigOption<>(
-                    "transport.io_mode",
-                    "The network IO Mode, either 'NIO', 'EPOLL', 'AUTO', the " +
-                    "'AUTO' means selecting the property mode automatically.",
-                    allowValues("NIO", "EPOLL", "AUTO"),
-                    "AUTO"
-            );
-
-    public static final ConfigOption<Boolean> TRANSPORT_EPOLL_LT =
-            new ConfigOption<>(
-                    "transport.transport_epoll_lt",
-                    "Whether enable EPOLL level-trigger.",
-                    allowValues(true, false),
-                    false
-            );
-
-    public static final ConfigOption<Boolean> TRANSPORT_RECV_FILE_MODE =
-            new ConfigOption<>(
-                    "transport.recv_file_mode",
-                    "Whether enable receive buffer-file mode, it will " +
-                    "receive buffer write file from socket by " +
-                    "zero-copy if enable.",
-                    allowValues(true, false),
-                    true
-            );
-
-    public static final ConfigOption<Boolean> TRANSPORT_TCP_KEEP_ALIVE =
-            new ConfigOption<>(
-                    "transport.tcp_keep_alive",
-                    "Whether enable TCP keep-alive.",
-                    allowValues(true, false),
-                    true
-            );
-
-    public static final ConfigOption<Integer> TRANSPORT_MAX_SYN_BACKLOG =
-            new ConfigOption<>(
-                    "transport.max_syn_backlog",
-                    "The capacity of SYN queue on server side, 0 means using " +
-                    "system default value.",
-                    nonNegativeInt(),
-                    511
-            );
-
-    public static final ConfigOption<Integer> TRANSPORT_RECEIVE_BUFFER_SIZE =
-            new ConfigOption<>(
-                    "transport.receive_buffer_size",
-                    "The size of socket receive-buffer in bytes, 0 means " +
-                    "using system default value.",
-                    nonNegativeInt(),
-                    0
-            );
-
-    public static final ConfigOption<Integer> TRANSPORT_SEND_BUFFER_SIZE =
-            new ConfigOption<>(
-                    "transport.send_buffer_size",
-                    "The size of socket send-buffer in bytes, 0 means using " +
-                    "system default value.",
-                    nonNegativeInt(),
-                    // TODO: Test to get an best value
-                    0
-            );
-
-    public static final ConfigOption<Long> TRANSPORT_CLIENT_CONNECT_TIMEOUT =
-            new ConfigOption<>(
-                    "transport.client_connect_timeout",
-                    "The timeout(in ms) of client connect to server.",
-                    positiveInt(),
-                    3000L
-            );
-
-    public static final ConfigOption<Long> TRANSPORT_CLOSE_TIMEOUT =
-            new ConfigOption<>(
-                    "transport.close_timeout",
-                    "The timeout(in ms) of close server or close client.",
-                    positiveInt(),
-                    10_000L
-            );
-
-    public static final ConfigOption<Long> TRANSPORT_SYNC_REQUEST_TIMEOUT =
-            new ConfigOption<>(
-                    "transport.sync_request_timeout",
-                    "The timeout(in ms) to wait response after " +
-                    "sending sync-request.",
-                    positiveInt(),
-                    10_000L
-            );
-
-    public static final ConfigOption<Long> TRANSPORT_FINISH_SESSION_TIMEOUT =
-            new ConfigOption<>(
-                    "transport.finish_session_timeout",
-                    "The timeout(in ms) to finish session, " +
-                    "0 means using (transport.sync_request_timeout * " +
-                    "transport.max_pending_requests).",
-                    nonNegativeInt(),
-                    0L
-            );
-
-    public static final ConfigOption<Long> TRANSPORT_WRITE_SOCKET_TIMEOUT =
-            new ConfigOption<>(
-                    "transport.write_socket_timeout",
-                    "The timeout(in ms) to write data to socket buffer.",
-                    positiveInt(),
-                    3000L
-            );
-
-    public static final ConfigOption<Integer> TRANSPORT_NETWORK_RETRIES =
-            new ConfigOption<>(
-                    "transport.network_retries",
-                    "The number of retry attempts for network communication," +
-                    "if network unstable.",
-                    nonNegativeInt(),
-                    3
-            );
-
-    public static final ConfigOption<Integer> TRANSPORT_WRITE_BUFFER_HIGH_MARK =
-            new ConfigOption<>(
-                    "transport.write_buffer_high_mark",
-                    "The high water mark for write buffer in bytes, " +
-                    "it will trigger the sending unavailable if the number " +
-                    "of queued bytes > write_buffer_high_mark.",
-                    nonNegativeInt(),
-                    64 * (int) Bytes.MB
-            );
-
-    public static final ConfigOption<Integer> TRANSPORT_WRITE_BUFFER_LOW_MARK =
-            new ConfigOption<>(
-                    "transport.write_buffer_low_mark",
-                    "The low water mark for write buffer in bytes, it will " +
-                    "trigger the sending available if the number of queued " +
-                    "bytes < write_buffer_low_mark." +
-                    nonNegativeInt(),
-                    32 * (int) Bytes.MB
-            );
-
-    public static final ConfigOption<Integer> TRANSPORT_MAX_PENDING_REQUESTS =
-            new ConfigOption<>(
-                    "transport.max_pending_requests",
-                    "The max number of client unreceived ack, " +
-                    "it will trigger the sending unavailable if the number " +
-                    "of unreceived ack >= max_pending_requests.",
-                    positiveInt(),
-                    8
-            );
-
-    public static final ConfigOption<Integer> TRANSPORT_MIN_PENDING_REQUESTS =
-            new ConfigOption<>(
-                    "transport.min_pending_requests",
-                    "The minimum number of client unreceived ack, " +
-                    "it will trigger the sending available if the number of " +
-                    "unreceived ack < min_pending_requests.",
-                    positiveInt(),
-                    6
-            );
-
-    public static final ConfigOption<Long> TRANSPORT_MIN_ACK_INTERVAL =
-            new ConfigOption<>(
-                    "transport.min_ack_interval",
-                    "The minimum interval(in ms) of server reply ack.",
-                    positiveInt(),
-                    200L
-            );
-
-    public static final ConfigOption<Long> TRANSPORT_SERVER_IDLE_TIMEOUT =
-            new ConfigOption<>(
-                    "transport.server_idle_timeout",
-                    "The max timeout(in ms) of server idle.",
-                    positiveInt(),
-                    360_000L
-            );
-
-    public static final ConfigOption<Long> TRANSPORT_HEARTBEAT_INTERVAL =
-            new ConfigOption<>(
-                    "transport.heartbeat_interval",
-                    "The minimum interval(in ms) between heartbeats on " +
-                    "client side.",
-                    positiveInt(),
-                    20_000L
-            );
-
-    public static final ConfigOption<Integer>
-            TRANSPORT_MAX_TIMEOUT_HEARTBEAT_COUNT =
-            new ConfigOption<>(
-                    "transport.max_timeout_heartbeat_count",
-                    "The maximum times of timeout heartbeat on client side, " +
-                    "if the number of timeouts waiting for heartbeat " +
-                    "response continuously > max_heartbeat_timeouts the " +
-                    "channel will be closed from client side.",
-                    positiveInt(),
-                    120
-            );
-
-    public static final ConfigOption<Long> HGKV_MAX_FILE_SIZE =
-            new ConfigOption<>(
-                    "hgkv.max_file_size",
-                    "The max number of bytes in each hgkv-file.",
-                    positiveInt(),
-                    Bytes.GB * 2
-            );
-
-    public static final ConfigOption<Long> HGKV_DATABLOCK_SIZE =
-            new ConfigOption<>(
-                    "hgkv.max_data_block_size",
-                    "The max byte size of hgkv-file data block.",
-                    positiveInt(),
-                    Bytes.KB * 64
-            );
-
-    public static final ConfigOption<Integer> HGKV_MERGE_FILES_NUM =
-            new ConfigOption<>(
-                    "hgkv.max_merge_files",
-                    "The max number of files to merge at one time.",
-                    positiveInt(),
-                    // TODO: test if the default value is appropriate.
-                    10
-            );
-
-    public static final ConfigOption<String> HGKV_TEMP_DIR =
-            new ConfigOption<>(
-                    "hgkv.temp_file_dir",
-                    "This folder is used to store temporary files, temporary " +
-                    "files will be generated during the file merging process.",
-                    disallowEmpty(),
-                    "/tmp/hgkv"
-            );
-
-    public static final ConfigOption<Long> VALUE_FILE_MAX_SEGMENT_SIZE =
-            new ConfigOption<>(
-                    "valuefile.max_segment_size",
-                    "The max number of bytes in each segment of value-file.",
-                    positiveInt(),
-                    Bytes.GB
-            );
-
-    public static Set<String> REQUIRED_OPTIONS = ImmutableSet.of(
-    );
-
-    public static final Set<String> COMPUTER_PROHIBIT_USER_OPTIONS =
-            ImmutableSet.of(
-                    ComputerOptions.BSP_ETCD_ENDPOINTS.name(),
-                    ComputerOptions.TRANSPORT_SERVER_HOST.name(),
-                    ComputerOptions.TRANSPORT_SERVER_PORT.name(),
-                    ComputerOptions.JOB_ID.name(),
-                    ComputerOptions.JOB_WORKERS_COUNT.name(),
-                    ComputerOptions.RPC_SERVER_HOST_NAME,
-                    ComputerOptions.RPC_SERVER_PORT_NAME,
-                    ComputerOptions.RPC_REMOTE_URL_NAME
-            );
-
-    public static final Set<String> COMPUTER_REQUIRED_USER_OPTIONS = ImmutableSet.of(
-            ComputerOptions.ALGORITHM_PARAMS_CLASS.name()
-    );
-
-    private static Class<?> loadClass(String className) {
-        try {
-            return Class.forName(className);
-        } catch (ClassNotFoundException e) {
-            LOG.warn("Load class {} failed, use Null.class", className);
-            return Null.class;
-        }
-    }
-}
diff --git a/computer-api/src/main/java/com/baidu/hugegraph/computer/core/config/Config.java b/computer-api/src/main/java/com/baidu/hugegraph/computer/core/config/Config.java
deleted file mode 100644
index dddea7e4..00000000
--- a/computer-api/src/main/java/com/baidu/hugegraph/computer/core/config/Config.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.core.config;
-
-import org.apache.hugegraph.config.ConfigOption;
-import org.apache.hugegraph.config.HugeConfig;
-import org.apache.hugegraph.config.TypedOption;
-
-public interface Config {
-
-    HugeConfig hugeConfig();
-
-    <R> R get(TypedOption<?, R> option);
-
-    boolean getBoolean(String key, boolean defaultValue);
-
-    int getInt(String key, int defaultValue);
-
-    long getLong(String key, long defaultValue);
-
-    double getDouble(String key, double defaultValue);
-
-    String getString(String key, String defaultValue);
-
-    <T> T createObject(ConfigOption<Class<?>> clazzOption);
-
-    <T> T createObject(ConfigOption<Class<?>> clazzOption,
-                       boolean requiredNotNull);
-
-    Boolean outputVertexAdjacentEdges();
-
-    Boolean outputVertexProperties();
-
-    Boolean outputEdgeProperties();
-}
diff --git a/computer-api/src/main/java/com/baidu/hugegraph/computer/core/config/DefaultConfig.java b/computer-api/src/main/java/com/baidu/hugegraph/computer/core/config/DefaultConfig.java
deleted file mode 100644
index b74b02cb..00000000
--- a/computer-api/src/main/java/com/baidu/hugegraph/computer/core/config/DefaultConfig.java
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * Copyright 2017 HugeGraph Authors
- *
- * 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.
- */
-
-package com.baidu.hugegraph.computer.core.config;
-
-import java.util.Map;
-
-import org.apache.commons.collections.CollectionUtils;
-import org.apache.commons.configuration2.MapConfiguration;
-import org.apache.hugegraph.config.ConfigOption;
-import org.apache.hugegraph.config.HugeConfig;
-import org.apache.hugegraph.config.TypedOption;
-import org.apache.hugegraph.util.E;
-
-import com.baidu.hugegraph.computer.core.common.exception.ComputerException;
-
-public final class DefaultConfig implements Config {
-
-    private final HugeConfig allConfig;
-    private final HotConfig hotConfig;
-
-    public DefaultConfig(Map<String, String> options) {
-        this.allConfig = this.parseOptions(options);
-        this.hotConfig = this.extractHotConfig(this.allConfig);
-        this.checkOptions();
-    }
-
-    private HugeConfig parseOptions(Map<String, String> options) {
-        if (!options.keySet().containsAll(ComputerOptions.REQUIRED_OPTIONS)) {
-            E.checkArgument(false,
-                            "All required options must be setted, " +
-                            "but missing these %s",
-                            CollectionUtils.subtract(
-                            ComputerOptions.REQUIRED_OPTIONS,
-                            options.keySet()));
-        }
-        MapConfiguration mapConfig = new MapConfiguration(options);
-        return new HugeConfig(mapConfig);
-    }
-
-    private HotConfig extractHotConfig(HugeConfig allConfig) {
-        // Populate high frequency accessed options into HotConfig
-        HotConfig hotConfig = new HotConfig();
-
-        hotConfig.outputVertexAdjacentEdges(
... 128824 lines suppressed ...