From 4e0f716775169e69f6f77dd85f20861ddb4cced4 Mon Sep 17 00:00:00 2001 From: HansBug Date: Sun, 19 Jun 2022 12:06:24 +0800 Subject: [PATCH 1/7] doc(hansbug): save the current half-completed version --- README.md | 145 +++++++++++++++++++++------ docs/source/_static/title-banner.png | Bin 0 -> 42053 bytes docs/source/_static/wechat.png | Bin 0 -> 39022 bytes 3 files changed, 117 insertions(+), 28 deletions(-) create mode 100644 docs/source/_static/title-banner.png create mode 100644 docs/source/_static/wechat.png diff --git a/README.md b/README.md index 55ed83c9d8..e4d5e5b4fc 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,22 @@ -# treevalue +
+ +
+--- + +[![Twitter](https://img.shields.io/twitter/url?style=social&url=https%3A%2F%2Ftwitter.com%2Fopendilab)](https://twitter.com/opendilab) [![PyPI](https://img.shields.io/pypi/v/treevalue)](https://pypi.org/project/treevalue/) ![PyPI - Python Version](https://img.shields.io/pypi/pyversions/treevalue) ![Loc](https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/HansBug/ff0bc026423888cd7c4f287eaed4b3f5/raw/loc.json) ![Comments](https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/HansBug/ff0bc026423888cd7c4f287eaed4b3f5/raw/comments.json) - [![Docs Deploy](https://github.com/opendilab/treevalue/workflows/Docs%20Deploy/badge.svg)](https://github.com/opendilab/treevalue/actions?query=workflow%3A%22Docs+Deploy%22) [![Code Test](https://github.com/opendilab/treevalue/workflows/Code%20Test/badge.svg)](https://github.com/opendilab/treevalue/actions?query=workflow%3A%22Code+Test%22) [![Badge Creation](https://github.com/opendilab/treevalue/workflows/Badge%20Creation/badge.svg)](https://github.com/opendilab/treevalue/actions?query=workflow%3A%22Badge+Creation%22) [![Package Release](https://github.com/opendilab/treevalue/workflows/Package%20Release/badge.svg)](https://github.com/opendilab/treevalue/actions?query=workflow%3A%22Package+Release%22) [![codecov](https://codecov.io/gh/opendilab/treevalue/branch/main/graph/badge.svg?token=XJVDP4EFAT)](https://codecov.io/gh/opendilab/treevalue) +![GitHub Org's stars](https://img.shields.io/github/stars/opendilab) [![GitHub stars](https://img.shields.io/github/stars/opendilab/treevalue)](https://github.com/opendilab/treevalue/stargazers) [![GitHub forks](https://img.shields.io/github/forks/opendilab/treevalue)](https://github.com/opendilab/treevalue/network) ![GitHub commit activity](https://img.shields.io/github/commit-activity/m/opendilab/treevalue) @@ -24,7 +29,34 @@ Almost all the operation can be supported in form of trees in a convenient way to simplify the structure processing when the calculation is tree-based. -## Installation + + +## Outline + +* Overview +* Getting Started + * Prerequisite + * Installation + * Quick Usage + * Tutorials +* Change Log +* Join and Contribute +* Citation +* License + +## Overview + + + +## Getting Started + +### Prerequisite + +`treevalue` has been tested in the Linux environment and with multiple Python versions, and it works properly on both macOS and Windows platforms (unit testing has not been carried out). + +However, **`treevalue` currently does not support PyPy**, so just pay attention to this when using. + +### Installation You can simply install it with `pip` command line from the official PyPI site. @@ -32,15 +64,22 @@ You can simply install it with `pip` command line from the official PyPI site. pip install treevalue ``` -For more information about installation, you can refer to the [installation guide](https://opendilab.github.io/treevalue/main/tutorials/installation/index.html). +Or just from the source code on github + +```shell +pip install git+https://github.com/opendilab/treevalue.git@main +``` -## Documentation +For more information about installation, you can refer to the [installation guide](https://opendilab.github.io/treevalue/main/tutorials/installation/index.html). -The detailed documentation are hosted on [https://opendilab.github.io/treevalue](https://opendilab.github.io/treevalue/). +After this, you can check if the installation is processed properly with the following code -Only english version is provided now, the chinese documentation is still under development. +```python +from treevalue import __version__ +print('TreeValue version is', __version__) +``` -## Quick Start +### Quick Usage You can easily create a tree value object based on `FastTreeValue`. @@ -140,11 +179,35 @@ print(1 + (t - 0.8) ** 2 * 1.5) # math operators # [1.0782, 1.0037, 1.5075, 1.0658]]) ``` -For more quick start explanation and further usage, take a look at: + + +### Tutorials + +For more examples, explanations and further usages, take a look at: * [Quick Start](https://opendilab.github.io/treevalue/main/tutorials/quick_start/index.html) + * [Create a Simplest Tree](https://opendilab.github.io/treevalue/main/tutorials/quick_start/index.html#create-a-simplest-tree) + * [Create a Slightly Complex Tree](https://opendilab.github.io/treevalue/main/tutorials/quick_start/index.html#create-a-slightly-complex-tree) * [Basic Usage](https://opendilab.github.io/treevalue/main/tutorials/basic_usage/index.html) + * [Create a Tree](https://opendilab.github.io/treevalue/main/tutorials/basic_usage/index.html#create-a-tree) + * [Edit a Tree](https://opendilab.github.io/treevalue/main/tutorials/basic_usage/index.html#edit-the-tree) + * [Do Index or Slice Calculation on The Tree](https://opendilab.github.io/treevalue/main/tutorials/basic_usage/index.html#do-index-or-slice-calculation-on-the-tree) + * [Do Math Calculation on The Tree](https://opendilab.github.io/treevalue/main/tutorials/basic_usage/index.html#do-calculation-on-the-tree) + * [Make Function Tree-Supported](https://opendilab.github.io/treevalue/main/tutorials/basic_usage/index.html#make-function-tree-supported) * [Advanced Usage](https://opendilab.github.io/treevalue/main/tutorials/advanced_usage/index.html) + * [Function Modes](https://opendilab.github.io/treevalue/main/tutorials/advanced_usage/index.html#function-modes) + * [Inheriting on Trees](https://opendilab.github.io/treevalue/main/tutorials/advanced_usage/index.html#inheriting-on-trees) + * [Process Missing Values](https://opendilab.github.io/treevalue/main/tutorials/advanced_usage/index.html#process-missing-values) + * [Functional Utilities](https://opendilab.github.io/treevalue/main/tutorials/advanced_usage/index.html#functional-utilities) + * [Structural Utilities](https://opendilab.github.io/treevalue/main/tutorials/advanced_usage/index.html#structural-utilities) + * [Tree Utilities](https://opendilab.github.io/treevalue/main/tutorials/advanced_usage/index.html#tree-utilities) + * [Flatten Utilities](https://opendilab.github.io/treevalue/main/tutorials/advanced_usage/index.html#flatten-utilities) + * [IO Utilities](https://opendilab.github.io/treevalue/main/tutorials/advanced_usage/index.html#io-utilities) + * [Object Oriented Usage](https://opendilab.github.io/treevalue/main/tutorials/advanced_usage/index.html#object-oriented-usage) + * [Costumize My TreeValue Class](https://opendilab.github.io/treevalue/main/tutorials/advanced_usage/index.html#diy-treevalue-class) + * [Visualization of TreeValue](https://opendilab.github.io/treevalue/main/tutorials/advanced_usage/index.html#draw-graph-for-treevalue) + + ## Speed Performance @@ -197,36 +260,62 @@ Test benchmark code can be found here: * [Comparison with jax-libtree](https://github.com/opendilab/treevalue/blob/main/test/compare/jax/test_jax.py) * [Comparison with tianshou Batch](https://github.com/opendilab/treevalue/blob/main/test/compare/tianshou/test_tianshou_batch.py) -## Extension -If you need to translate `treevalue` object to runnable source code, you may use the [potc-treevalue](https://github.com/potc-dev/potc-treevalue) plugin with the installation command below -```shell -pip install potc-treevalue -``` +## Change Log -Or just install it with `treevalue` itself +
Version History [click to expand] +
+ +* 2022-05-03 + 1.3.1: Change definition of getitem, setitem and delitem; add pop method for TreeValue class. +* 2022-03-15 + 1.3.0: Add getitem, setitem and delitem for adding, editing and removing items in TreeValue class. +* 2022-02-22 + 1.2.2: Optimize union function; add walk utility method. +* 2022-01-26 + 1.2.1: Update tree printing; add keys, values, items on TreeValue; add comparision to facebook nest library. +* 2022-01-04 + 1.2.0: Add flatten_values and flatten_keys; fix problem in mapping function; add support for potc. +* 2021-12-03 + 1.1.0: Add version information; fix bug of default value; add flatten and unflatten; optimization speed performance. +* 2021-10-24 + 1.0.0: Greatly optimize the speed performance using cython, overhead has been reduced to a negligible level. +
+
-```shell -pip install treevalue[potc] -``` -In potc, you can translate the objects to runnable python source code, which can be loaded to objects afterwards by the python interpreter, like the following graph +## Join and Contribute -![potc system](docs/source/_static/potc-doing.svg) +Welcome to **OpenDILab** community - treevalue! -For more information, you can refer to +Scan the QR code and add us on Wechat: +
+ +
-* [potc-dev/potc](https://github.com/potc-dev/potc) -* [potc-dev/potc-treevalue](https://github.com/potc-dev/potc-treevalue) -* [Potc Plugin Installation](https://opendilab.github.io/treevalue/main/tutorials/plugins/index.html#potc-support) +Or contact us on [our slack channel](https://opendilab.slack.com/join/shared_invite/zt-v9tmv4fp-nUBAQEH1_Kuyu_q4plBssQ#/shared-invite/email):(这里我不知道该咋弄,github上我没见过搞出文档卡片的) -## Contribution +Please check [Contributing Guidances](https://github.com/opendilab/treevalue/blob/main/CONTRIBUTING.md). -We appreciate all contributions to improve treevalue, both logic and system designs. Please refer to CONTRIBUTING.md for more guides. +Thanks to the following contributors! -And users can join our [slack communication channel](https://join.slack.com/t/opendilab/shared_invite/zt-v9tmv4fp-nUBAQEH1_Kuyu_q4plBssQ), or contact the core developer [HansBug](https://github.com/HansBug) for more detailed discussion. + + + + +## Citation + +``` +@misc{treevalue, + title={{TreeValue} - Tree-Structure Computing Solution}, + author={TreeValue Contributors}, + publisher = {GitHub}, + howpublished = {\url{https://github.com/opendilab/treevalue}}, + year={2021}, +} +``` ## License -`treevalue` released under the Apache 2.0 license. +`treevalue` released under the Apache 2.0 license. See the [LICENSE](./LICENSE) file for details. diff --git a/docs/source/_static/title-banner.png b/docs/source/_static/title-banner.png new file mode 100644 index 0000000000000000000000000000000000000000..c987167ed363dc8a62de33e080cf4e8f03538a98 GIT binary patch literal 42053 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 T_C&Qi=-_eL$P!aya4q3~eq|c_ literal 0 HcmV?d00001 From 1cf761277bcdc161b252e9e4ace0acd1e721a467 Mon Sep 17 00:00:00 2001 From: HansBug Date: Sun, 19 Jun 2022 12:40:36 +0800 Subject: [PATCH 2/7] dev(hansbug): first complete the README.md --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index e4d5e5b4fc..3da0a33562 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@
- +
--- @@ -29,8 +29,6 @@ Almost all the operation can be supported in form of trees in a convenient way to simplify the structure processing when the calculation is tree-based. - - ## Outline * Overview @@ -46,7 +44,13 @@ Almost all the operation can be supported in form of trees in a convenient way t ## Overview +When we build a complex nested structure, we need to model it as a tree structure, and the native list and dict in Python are often used to solve this problem. However, it takes a lot of codes and some complex and non-intuitive calculation logics, which is not easy to modify and extend related code and data, and parallelization is more impossible. +Therefore, we need a kind of more proper data container, named `TreeValue`. It is designed for solving the follow problems: + +- **Ease of Use**: When the existing operations are applied to tree structures such as dict, they will become completely unrecognizable, with really low readability and maintainability. +- **Diversity of Data**: In the tree structure operation, various abnormal conditions (structure mismatch, missing key value, type mismatch, etc.) occur from time to time, and the code will be more complicated if it needs to be handled properly. +- **Scalability and Parallelization**: When any multivariate operation is performed, the calculation logic needs to be redesigned under the native Python code implementation, and the processing will be more complicated and confusing, and the code quality is difficult to control. ## Getting Started @@ -207,8 +211,6 @@ For more examples, explanations and further usages, take a look at: * [Costumize My TreeValue Class](https://opendilab.github.io/treevalue/main/tutorials/advanced_usage/index.html#diy-treevalue-class) * [Visualization of TreeValue](https://opendilab.github.io/treevalue/main/tutorials/advanced_usage/index.html#draw-graph-for-treevalue) - - ## Speed Performance Here is the speed performance of all the operations in `FastTreeValue`, the following table is the performance comparison result with [dm-tree](https://github.com/deepmind/tree). @@ -260,8 +262,6 @@ Test benchmark code can be found here: * [Comparison with jax-libtree](https://github.com/opendilab/treevalue/blob/main/test/compare/jax/test_jax.py) * [Comparison with tianshou Batch](https://github.com/opendilab/treevalue/blob/main/test/compare/tianshou/test_tianshou_batch.py) - - ## Change Log
Version History [click to expand] From 602931bf51d5c191ead264218d988e729f8df9b2 Mon Sep 17 00:00:00 2001 From: HansBug Date: Sun, 19 Jun 2022 14:49:40 +0800 Subject: [PATCH 3/7] doc(hansbug): add link for outline part --- README.md | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 3da0a33562..09101f3e9b 100644 --- a/README.md +++ b/README.md @@ -31,16 +31,17 @@ Almost all the operation can be supported in form of trees in a convenient way t ## Outline -* Overview -* Getting Started - * Prerequisite - * Installation - * Quick Usage - * Tutorials -* Change Log -* Join and Contribute -* Citation -* License +* [Overview](#overview) +* [Getting Started](#getting-started) + * [Prerequisite](#prerequisite) + * [Installation](#installation) + * [Quick Usage](#quick-usage) + * [Tutorials](#tutorials) +* [Speed Performance](#speed-performance) +* [Change Log](#change-log) +* [Join and Contribute](#join-and-contribute) +* [Citation](#citation) +* [License](#license) ## Overview @@ -56,7 +57,7 @@ Therefore, we need a kind of more proper data container, named `TreeValue`. It i ### Prerequisite -`treevalue` has been tested in the Linux environment and with multiple Python versions, and it works properly on both macOS and Windows platforms (unit testing has not been carried out). +`treevalue` has been fully tested in the Linux and macOS environment and with multiple Python versions, and it works properly on Windows platforms (unit testing has not been carried out). However, **`treevalue` currently does not support PyPy**, so just pay attention to this when using. From 3806dc12055daa4d45d29ccc2e07fc33cbe80889 Mon Sep 17 00:00:00 2001 From: HansBug Date: Mon, 20 Jun 2022 17:24:45 +0800 Subject: [PATCH 4/7] doc(hansbug): update for the suggestions --- README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 09101f3e9b..0f85d70bed 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ Almost all the operation can be supported in form of trees in a convenient way t * [Tutorials](#tutorials) * [Speed Performance](#speed-performance) * [Change Log](#change-log) -* [Join and Contribute](#join-and-contribute) +* [Feedback and Contribute](#feedback-and-contribute) * [Citation](#citation) * [License](#license) @@ -285,17 +285,19 @@ Test benchmark code can be found here:
- -## Join and Contribute +## Feedback and Contribute Welcome to **OpenDILab** community - treevalue! +If you meet some problem or have some brilliant ideas, you can [file an issue](https://github.com/opendilab/treevalue/issues/new/choose). + Scan the QR code and add us on Wechat: +
-Or contact us on [our slack channel](https://opendilab.slack.com/join/shared_invite/zt-v9tmv4fp-nUBAQEH1_Kuyu_q4plBssQ#/shared-invite/email):(这里我不知道该咋弄,github上我没见过搞出文档卡片的) +Or just contact us with [slack](https://opendilab.slack.com/join/shared_invite/zt-v9tmv4fp-nUBAQEH1_Kuyu_q4plBssQ#/shared-invite/email) or email (opendilab.contact@gmail.com). Please check [Contributing Guidances](https://github.com/opendilab/treevalue/blob/main/CONTRIBUTING.md). From 3e999431ff2829c1ecc8c762a4778f97b8b3a005 Mon Sep 17 00:00:00 2001 From: HansBug Date: Tue, 21 Jun 2022 10:22:44 +0800 Subject: [PATCH 5/7] doc(hansbug): now all the platform has been checked --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0f85d70bed..e3cbcb4c0d 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ Therefore, we need a kind of more proper data container, named `TreeValue`. It i ### Prerequisite -`treevalue` has been fully tested in the Linux and macOS environment and with multiple Python versions, and it works properly on Windows platforms (unit testing has not been carried out). +`treevalue` has been fully tested in the Linux, macOS and Windows environment and with multiple Python versions, and it works properly on all these platforms. However, **`treevalue` currently does not support PyPy**, so just pay attention to this when using. From 744827ec7e1f780f812242122c673c1e5d38967b Mon Sep 17 00:00:00 2001 From: HansBug Date: Tue, 21 Jun 2022 18:07:42 +0800 Subject: [PATCH 6/7] doc(hansbug): add external part for DI-treetensor project --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index e3cbcb4c0d..a36cbdc98b 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,7 @@ Almost all the operation can be supported in form of trees in a convenient way t * [Installation](#installation) * [Quick Usage](#quick-usage) * [Tutorials](#tutorials) + * [External](#external) * [Speed Performance](#speed-performance) * [Change Log](#change-log) * [Feedback and Contribute](#feedback-and-contribute) @@ -212,6 +213,12 @@ For more examples, explanations and further usages, take a look at: * [Costumize My TreeValue Class](https://opendilab.github.io/treevalue/main/tutorials/advanced_usage/index.html#diy-treevalue-class) * [Visualization of TreeValue](https://opendilab.github.io/treevalue/main/tutorials/advanced_usage/index.html#draw-graph-for-treevalue) +### External + +We provide an official treevalue-based-wrapper for numpy and torch called [DI-treetensor](https://github.com/opendilab/DI-treetensor) since the `treevalue` is often used with libraries like `numpy` and `torch`. It will actually be useful while working with AI fields. + + + ## Speed Performance Here is the speed performance of all the operations in `FastTreeValue`, the following table is the performance comparison result with [dm-tree](https://github.com/deepmind/tree). From a241169766afd10bfcb2840d9429611b0d0a61f8 Mon Sep 17 00:00:00 2001 From: HansBug Date: Thu, 23 Jun 2022 15:14:12 +0800 Subject: [PATCH 7/7] fix(hansbug): fix plenty of grammar mistake, thanks to yefan --- README.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index a36cbdc98b..9a9254a0fe 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ `TreeValue` is a generalized tree-based data structure mainly developed by [OpenDILab Contributors](https://github.com/opendilab). -Almost all the operation can be supported in form of trees in a convenient way to simplify the structure processing when the calculation is tree-based. +Almost all the operations can be supported in the form of trees in a convenient way to simplify the structure processing when the calculation is tree-based. ## Outline @@ -46,21 +46,21 @@ Almost all the operation can be supported in form of trees in a convenient way t ## Overview -When we build a complex nested structure, we need to model it as a tree structure, and the native list and dict in Python are often used to solve this problem. However, it takes a lot of codes and some complex and non-intuitive calculation logics, which is not easy to modify and extend related code and data, and parallelization is more impossible. +When we build a complex nested structure, we need to model it as a tree structure, and the native list and dict in Python are often used to solve this problem. However, it takes a lot of codes and some complex and non-intuitive calculation logic, which is not easy to modify and extend related code and data, and parallelization is impossible. -Therefore, we need a kind of more proper data container, named `TreeValue`. It is designed for solving the follow problems: +Therefore, we need a kind of more proper data container, named `TreeValue`. It is designed for solving the following problems: - **Ease of Use**: When the existing operations are applied to tree structures such as dict, they will become completely unrecognizable, with really low readability and maintainability. -- **Diversity of Data**: In the tree structure operation, various abnormal conditions (structure mismatch, missing key value, type mismatch, etc.) occur from time to time, and the code will be more complicated if it needs to be handled properly. +- **Diversity of Data**: In the tree structure operation, various abnormal conditions (structure mismatch, missing key-value, type mismatch, etc.) occur from time to time, and the code will be more complicated if it needs to be handled properly. - **Scalability and Parallelization**: When any multivariate operation is performed, the calculation logic needs to be redesigned under the native Python code implementation, and the processing will be more complicated and confusing, and the code quality is difficult to control. ## Getting Started ### Prerequisite -`treevalue` has been fully tested in the Linux, macOS and Windows environment and with multiple Python versions, and it works properly on all these platforms. +`treevalue` has been fully tested in the Linux, macOS and Windows environments and with multiple Python versions, and it works properly on all these platforms. -However, **`treevalue` currently does not support PyPy**, so just pay attention to this when using. +However, **`treevalue` currently does not support PyPy**, so just pay attention to this when using it. ### Installation @@ -215,13 +215,13 @@ For more examples, explanations and further usages, take a look at: ### External -We provide an official treevalue-based-wrapper for numpy and torch called [DI-treetensor](https://github.com/opendilab/DI-treetensor) since the `treevalue` is often used with libraries like `numpy` and `torch`. It will actually be useful while working with AI fields. +We provide an official treevalue-based-wrapper for numpy and torch called [DI-treetensor](https://github.com/opendilab/DI-treetensor) since the `treevalue` is often used with libraries like `numpy` and `torch`. It will actually be helpful while working with AI fields. ## Speed Performance -Here is the speed performance of all the operations in `FastTreeValue`, the following table is the performance comparison result with [dm-tree](https://github.com/deepmind/tree). +Here is the speed performance of all the operations in `FastTreeValue`; the following table is the performance comparison result with [dm-tree](https://github.com/deepmind/tree). | | flatten | flatten(with path) | mapping | mapping(with path) | | --------------------------------------------------- | :--------------: | :-------------------: | :-------------------: | :-------------------------: | @@ -256,7 +256,7 @@ The following table is the performance comparison result with [tianshou Batch](h | [treevalue](https://github.com/opendilab/treevalue) | 51.6 ns ± 0.609 ns | **64.4 ns ± 0.564 ns** | **750 ns ± 14.2 ns** | **88.9 µs ± 887 ns** | **50.2 µs ± 771 ns** | **40.3 µs ± 1.08 µs** | **62 µs ± 1.2 µs** | | [tianshou Batch](https://github.com/thu-ml/tianshou) | **43.2 ns ± 0.698 ns** | 396 ns ± 8.99 ns | 11.1 µs ± 277 ns | 89 µs ± 1.42 µs | 119 µs ± 1.1 µs | 194 µs ± 1.81 µs | 653 µs ± 17.8 µs | -And this is the comparison between tianshou Batch and us, with `cat` , `stack` and `split` operations (**lower value means less time cost and runs faster**) +And this is the comparison between Tianshou Batch and us, with `cat` , `stack` and `split` operations (**lower value means less time cost and runs faster**) ![Time cost of cat operation](docs/source/_static/Time%20cost%20of%20cat%20operation.svg)