<div align="center">
<img src="res/logo.png" alt="logo" style="width: 40%;">
<strong>rapid evolutionary multi-objective community detection</strong>



[](https://pypistats.org/packages/re_mocd)
<hr>
</div>
> [!NOTE]
> **This project is in its early stages.** Performance and results may not be optimal yet.
## Overview
**re-mocd** is a Rust-based library designed for efficient and high-performance community detection in graphs. By leveraging the speed and memory safety of Rust, the project aims to handle large-scale graphs while addressing limitations in traditional algorithms, such as Louvain.
---
## Installation
### Via PyPI
Install the library using pip:
```bash
pip install re-mocd
```
---
## Usage
### From `networkx.Graph()`
Using **re-mocd** with a `networkx.Graph()` is simple. For example:
```python
import networkx as nx
import re_mocd
# Create a graph
G = nx.Graph([
(0, 1), (0, 3), (0, 7),
(1, 2), (1, 3), (1, 5),
(2, 3),
(3, 6),
(4, 5), (4, 6),
(5, 6),
(7, 8)
])
# detect from a networkx.Graph()
partition = re_mocd.from_nx(G)
# Check modularity
mod = re_mocd.get_modularity(G, partition)
```
### From an Edge List File
Prepare an edge list file formatted as:
```plaintext
0,1,{'weight': 4}
0,2,{'weight': 5}
0,3,{'weight': 3}
...
0,10,{'weight': 2}
```
The `weight` attribute is optional and can be omitted (`{}`). Save your `networkx` graph as an edge list:
```python
nx.write_edgelist(G, file_path, delimiter=",", data=False)
```
Run the algorithm:
```python
import re_mocd
edgelist_file = "my.edgelist"
partition = re_mocd.from_file(edgelist_file)
```
### Examples
- [Plotting Example](tests/python/example.py)
- [Comparison with Other Algorithms](tests/python/main.py)
- [Modularity ring problem](tests/python/benchmarks/ring.py)
- [Single file test](tests/python/benchmarks/single.py)
---
<center>
<img src="res/example.png" alt="Example Plot" width="600">
</center>
---
## Running from Scratch
### Build and Run
1. Clone the repository:
```bash
git clone https://github.com/0l1ve1r4/re_mocd
cd re_mocd
```
2. Compile and execute the algorithm:
```bash
cargo run --release mygraph.edgelist
```
### Debug Mode
Use the `-d` flag for additional debug output:
```bash
cargo run --release mygraph.edgelist -d
```
Debug mode helps troubleshoot and monitor the algorithm's progress effectively.
---
### Contributing
Contributions are welcome! Feel free to submit issues, feature requests, or pull requests to improve the project.
**License:** GPL-3.0 or later
**Author:** [Guilherme Santos](https://github.com/0l1ve1r4)
Raw data
{
"_id": null,
"home_page": null,
"name": "re-mocd",
"maintainer": null,
"docs_url": null,
"requires_python": null,
"maintainer_email": null,
"keywords": "rust, python, community detection, multi-objective optimization, graph analysis",
"author": "Guilherme Santos",
"author_email": "Guilherme Santos <gs.oliveira.dev@gmail.com>",
"download_url": "https://files.pythonhosted.org/packages/de/75/f665e248af6842c764d8d26946258140c35ef3cafbb45230ae02f1c72b83/re_mocd-0.2.2.tar.gz",
"platform": null,
"description": "<div align=\"center\">\n <img src=\"res/logo.png\" alt=\"logo\" style=\"width: 40%;\"> \n\n <strong>rapid evolutionary multi-objective community detection</strong>\n\n\n\n\n[](https://pypistats.org/packages/re_mocd)\n\n<hr>\n\n</div>\n\n> [!NOTE] \n> **This project is in its early stages.** Performance and results may not be optimal yet.\n\n## Overview \n\n**re-mocd** is a Rust-based library designed for efficient and high-performance community detection in graphs. By leveraging the speed and memory safety of Rust, the project aims to handle large-scale graphs while addressing limitations in traditional algorithms, such as Louvain. \n\n---\n\n## Installation \n\n### Via PyPI \n\nInstall the library using pip: \n```bash\npip install re-mocd\n```\n\n---\n\n## Usage \n\n### From `networkx.Graph()` \n\nUsing **re-mocd** with a `networkx.Graph()` is simple. For example: \n```python\nimport networkx as nx \nimport re_mocd\n\n# Create a graph\nG = nx.Graph([\n (0, 1), (0, 3), (0, 7), \n (1, 2), (1, 3), (1, 5), \n (2, 3), \n (3, 6), \n (4, 5), (4, 6), \n (5, 6), \n (7, 8)\n])\n\n# detect from a networkx.Graph()\npartition = re_mocd.from_nx(G)\n\n# Check modularity\nmod = re_mocd.get_modularity(G, partition)\n```\n\n### From an Edge List File \n\nPrepare an edge list file formatted as: \n```plaintext\n0,1,{'weight': 4}\n0,2,{'weight': 5}\n0,3,{'weight': 3}\n...\n0,10,{'weight': 2}\n```\n\nThe `weight` attribute is optional and can be omitted (`{}`). Save your `networkx` graph as an edge list: \n```python\nnx.write_edgelist(G, file_path, delimiter=\",\", data=False)\n```\n\nRun the algorithm: \n```python\nimport re_mocd\n\nedgelist_file = \"my.edgelist\"\npartition = re_mocd.from_file(edgelist_file)\n```\n\n### Examples \n\n- [Plotting Example](tests/python/example.py) \n- [Comparison with Other Algorithms](tests/python/main.py) \n- [Modularity ring problem](tests/python/benchmarks/ring.py)\n- [Single file test](tests/python/benchmarks/single.py)\n\n---\n\n<center> \n<img src=\"res/example.png\" alt=\"Example Plot\" width=\"600\"> \n</center> \n\n---\n\n## Running from Scratch \n\n### Build and Run \n\n1. Clone the repository: \n ```bash\n git clone https://github.com/0l1ve1r4/re_mocd\n cd re_mocd\n ```\n\n2. Compile and execute the algorithm: \n ```bash\n cargo run --release mygraph.edgelist\n ```\n\n### Debug Mode \n\nUse the `-d` flag for additional debug output: \n```bash\ncargo run --release mygraph.edgelist -d\n```\n\nDebug mode helps troubleshoot and monitor the algorithm's progress effectively. \n\n---\n\n### Contributing \n\nContributions are welcome! Feel free to submit issues, feature requests, or pull requests to improve the project. \n\n**License:** GPL-3.0 or later \n**Author:** [Guilherme Santos](https://github.com/0l1ve1r4) \n\n",
"bugtrack_url": null,
"license": "GPL-3.0-or-later",
"summary": "Rapid multi-objective community detection with parallel computation and caching to efficiently handle large-scale graphs. With networkx compatibilityy",
"version": "0.2.2",
"project_urls": {
"Issues": "https://github.com/0l1ve1r4/re_mocd/issues",
"Repository": "https://github.com/0l1ve1r4/re_mocd"
},
"split_keywords": [
"rust",
" python",
" community detection",
" multi-objective optimization",
" graph analysis"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "8b38ade3cb959d1687ae89f2e3cac99f9f05519492856229794edffd82d8a1ed",
"md5": "b5c88549e2eaec21bdd6b34452ad4829",
"sha256": "c57df9543e16fd8cc6cee1e9ddb811dffd6f0c19c5cdfb2f117d5faea5b9ae6a"
},
"downloads": -1,
"filename": "re_mocd-0.2.2-cp310-cp310-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "b5c88549e2eaec21bdd6b34452ad4829",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": null,
"size": 366427,
"upload_time": "2025-02-08T21:07:06",
"upload_time_iso_8601": "2025-02-08T21:07:06.866613Z",
"url": "https://files.pythonhosted.org/packages/8b/38/ade3cb959d1687ae89f2e3cac99f9f05519492856229794edffd82d8a1ed/re_mocd-0.2.2-cp310-cp310-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "585ef3c7ae95648fb211b2defa78bf102b30a982942dcbbb5b8a3a9290a002eb",
"md5": "4b9dce17a5ad031441699940d80960c5",
"sha256": "1eca6b79babc1f4f597aac069a7d353da9cd92eafb1f06bc4e5bb355c02ef909"
},
"downloads": -1,
"filename": "re_mocd-0.2.2-cp310-cp310-manylinux_2_34_x86_64.whl",
"has_sig": false,
"md5_digest": "4b9dce17a5ad031441699940d80960c5",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": null,
"size": 419650,
"upload_time": "2025-02-08T21:07:08",
"upload_time_iso_8601": "2025-02-08T21:07:08.910994Z",
"url": "https://files.pythonhosted.org/packages/58/5e/f3c7ae95648fb211b2defa78bf102b30a982942dcbbb5b8a3a9290a002eb/re_mocd-0.2.2-cp310-cp310-manylinux_2_34_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "0f964219649f1c13bea132f829077c4c1b0f191016a0c8ade3589b2a75e148df",
"md5": "ca2bbadcd98a44af6de6d98f13004b8a",
"sha256": "381453208c21277f15e02d1abbdada2045c6e2feec2474561b0e01409fe1543d"
},
"downloads": -1,
"filename": "re_mocd-0.2.2-cp310-cp310-win_amd64.whl",
"has_sig": false,
"md5_digest": "ca2bbadcd98a44af6de6d98f13004b8a",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": null,
"size": 329393,
"upload_time": "2025-02-08T21:07:10",
"upload_time_iso_8601": "2025-02-08T21:07:10.798311Z",
"url": "https://files.pythonhosted.org/packages/0f/96/4219649f1c13bea132f829077c4c1b0f191016a0c8ade3589b2a75e148df/re_mocd-0.2.2-cp310-cp310-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "31ac34a7af842503c7c45e8286c3a42cbefad61f4c8515daafecfda3fddc77c6",
"md5": "abe5d0de27db845813ea32178284fdd7",
"sha256": "af388d7ba7643d99537f3d7dcdf301df5636957684d7ef0b971643c0df703723"
},
"downloads": -1,
"filename": "re_mocd-0.2.2-cp311-cp311-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "abe5d0de27db845813ea32178284fdd7",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": null,
"size": 366587,
"upload_time": "2025-02-08T21:07:12",
"upload_time_iso_8601": "2025-02-08T21:07:12.091412Z",
"url": "https://files.pythonhosted.org/packages/31/ac/34a7af842503c7c45e8286c3a42cbefad61f4c8515daafecfda3fddc77c6/re_mocd-0.2.2-cp311-cp311-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "bfde05a5e2f70cb30db800f33ec83293da69dfc4e2cb970052ada46d544b3b0a",
"md5": "51d127e204e92bf40a8f1a1415eb0439",
"sha256": "40e8796a34591769ecdfa3581a1eb2bd591bba848a3705562c73d96a1a46cf5b"
},
"downloads": -1,
"filename": "re_mocd-0.2.2-cp311-cp311-manylinux_2_34_x86_64.whl",
"has_sig": false,
"md5_digest": "51d127e204e92bf40a8f1a1415eb0439",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": null,
"size": 419520,
"upload_time": "2025-02-08T21:07:14",
"upload_time_iso_8601": "2025-02-08T21:07:14.079747Z",
"url": "https://files.pythonhosted.org/packages/bf/de/05a5e2f70cb30db800f33ec83293da69dfc4e2cb970052ada46d544b3b0a/re_mocd-0.2.2-cp311-cp311-manylinux_2_34_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "55ece8f6b909f8d2a58532e46570dcfed682220c345afb310a9445c598464afe",
"md5": "ecffb26e6cc761d370718eb9841e844d",
"sha256": "b9d8670a86e0fff0b09ad1368f569cc9c474a3aa9535a16247fe141ebd3e4232"
},
"downloads": -1,
"filename": "re_mocd-0.2.2-cp311-cp311-win_amd64.whl",
"has_sig": false,
"md5_digest": "ecffb26e6cc761d370718eb9841e844d",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": null,
"size": 329427,
"upload_time": "2025-02-08T21:07:15",
"upload_time_iso_8601": "2025-02-08T21:07:15.466336Z",
"url": "https://files.pythonhosted.org/packages/55/ec/e8f6b909f8d2a58532e46570dcfed682220c345afb310a9445c598464afe/re_mocd-0.2.2-cp311-cp311-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "471247063f984e31806dfc029ca779055ca807425349d6153cad863072af6106",
"md5": "5e0563789088a0a91fe3032b400122da",
"sha256": "d99237bc00da0148de09ac4bf5026e6dc1b7843d901f68b97d9838801178fc91"
},
"downloads": -1,
"filename": "re_mocd-0.2.2-cp312-cp312-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "5e0563789088a0a91fe3032b400122da",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": null,
"size": 365780,
"upload_time": "2025-02-08T21:07:17",
"upload_time_iso_8601": "2025-02-08T21:07:17.453411Z",
"url": "https://files.pythonhosted.org/packages/47/12/47063f984e31806dfc029ca779055ca807425349d6153cad863072af6106/re_mocd-0.2.2-cp312-cp312-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "b2983918e459f1a2688e01ec84899506a8a5c1518eb2145636d480eaaadbe361",
"md5": "8ea89ed965af0033bda71bd8c8d6b651",
"sha256": "0c3fee9fc7b196c3e229650aa4208192ae374ca8ba9a4d92bd0151006d70742a"
},
"downloads": -1,
"filename": "re_mocd-0.2.2-cp312-cp312-manylinux_2_34_x86_64.whl",
"has_sig": false,
"md5_digest": "8ea89ed965af0033bda71bd8c8d6b651",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": null,
"size": 419834,
"upload_time": "2025-02-08T21:07:19",
"upload_time_iso_8601": "2025-02-08T21:07:19.530891Z",
"url": "https://files.pythonhosted.org/packages/b2/98/3918e459f1a2688e01ec84899506a8a5c1518eb2145636d480eaaadbe361/re_mocd-0.2.2-cp312-cp312-manylinux_2_34_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "dcab02b379dfb7804b8ceb9add0ac825cd4c4b032df986f9276bae28d3b4fc2b",
"md5": "2ab282ec34b36c8b590a7693fc3afb60",
"sha256": "4a0c07d7d8cb3e1067547ec90fd0c356c9aad34ed3657956338ee210ccdbee9e"
},
"downloads": -1,
"filename": "re_mocd-0.2.2-cp312-cp312-win_amd64.whl",
"has_sig": false,
"md5_digest": "2ab282ec34b36c8b590a7693fc3afb60",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": null,
"size": 329473,
"upload_time": "2025-02-08T21:07:21",
"upload_time_iso_8601": "2025-02-08T21:07:21.612297Z",
"url": "https://files.pythonhosted.org/packages/dc/ab/02b379dfb7804b8ceb9add0ac825cd4c4b032df986f9276bae28d3b4fc2b/re_mocd-0.2.2-cp312-cp312-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "b8ba52335d2e4c6a165767ce1b27bb292d0055d54f5db5646ddce4f845c89478",
"md5": "ce3f599b29c2f50f990ff0ed4ac51439",
"sha256": "241f8acff42c513b42512969ac084c36c4c03c086ad6fb0bb14781ad404330b1"
},
"downloads": -1,
"filename": "re_mocd-0.2.2-cp38-cp38-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "ce3f599b29c2f50f990ff0ed4ac51439",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": null,
"size": 366454,
"upload_time": "2025-02-08T21:07:23",
"upload_time_iso_8601": "2025-02-08T21:07:23.661998Z",
"url": "https://files.pythonhosted.org/packages/b8/ba/52335d2e4c6a165767ce1b27bb292d0055d54f5db5646ddce4f845c89478/re_mocd-0.2.2-cp38-cp38-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "0dbc4bfc19644ef3b9c6145093f007498270f5b62bd31af0b8959cf6e7e436b6",
"md5": "9860befcb481b562c3e7d6979791dd87",
"sha256": "a31c7d9de9f45b11bf8a3c034aacc46e30081271633e86933bc4bcfe581e3ae6"
},
"downloads": -1,
"filename": "re_mocd-0.2.2-cp38-cp38-manylinux_2_34_x86_64.whl",
"has_sig": false,
"md5_digest": "9860befcb481b562c3e7d6979791dd87",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": null,
"size": 419819,
"upload_time": "2025-02-08T21:07:25",
"upload_time_iso_8601": "2025-02-08T21:07:25.630425Z",
"url": "https://files.pythonhosted.org/packages/0d/bc/4bfc19644ef3b9c6145093f007498270f5b62bd31af0b8959cf6e7e436b6/re_mocd-0.2.2-cp38-cp38-manylinux_2_34_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "0dec4adfff4e389cf03fccd244f09d9c0ad35d8a32607f442a97259d4054f005",
"md5": "db7f0ac9a75c53b51071a0e35b01754c",
"sha256": "0aee2b5db49bfc1aec961bf80d1b53ef0e1e3f29f5d18c89d7c2105ca5df5873"
},
"downloads": -1,
"filename": "re_mocd-0.2.2-cp38-cp38-win_amd64.whl",
"has_sig": false,
"md5_digest": "db7f0ac9a75c53b51071a0e35b01754c",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": null,
"size": 329872,
"upload_time": "2025-02-08T21:07:27",
"upload_time_iso_8601": "2025-02-08T21:07:27.562584Z",
"url": "https://files.pythonhosted.org/packages/0d/ec/4adfff4e389cf03fccd244f09d9c0ad35d8a32607f442a97259d4054f005/re_mocd-0.2.2-cp38-cp38-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "7e93437b7810b8448be13e9d18ff3b3c022e054ba1c3ffdc3b3cd665467e7747",
"md5": "778a273e3a97203e28765c4a3aac30b5",
"sha256": "b991a52bdf6f324df15d4ed7b5738bddeec015413e946e168fad37421ad1604e"
},
"downloads": -1,
"filename": "re_mocd-0.2.2-cp39-cp39-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "778a273e3a97203e28765c4a3aac30b5",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": null,
"size": 366467,
"upload_time": "2025-02-08T21:07:28",
"upload_time_iso_8601": "2025-02-08T21:07:28.806608Z",
"url": "https://files.pythonhosted.org/packages/7e/93/437b7810b8448be13e9d18ff3b3c022e054ba1c3ffdc3b3cd665467e7747/re_mocd-0.2.2-cp39-cp39-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "aac350a0e22f63f013a627ba93ea2c5448c9265d61147aeb5f657bcc94d55ca0",
"md5": "0d5af8b994280646a07e9b2b1b5fdeb7",
"sha256": "d8ab7d6bfaa4b7785ac08f1a489befa8e82097f0b1e69254181e0cd966cc573b"
},
"downloads": -1,
"filename": "re_mocd-0.2.2-cp39-cp39-manylinux_2_34_x86_64.whl",
"has_sig": false,
"md5_digest": "0d5af8b994280646a07e9b2b1b5fdeb7",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": null,
"size": 420183,
"upload_time": "2025-02-08T21:07:29",
"upload_time_iso_8601": "2025-02-08T21:07:29.971082Z",
"url": "https://files.pythonhosted.org/packages/aa/c3/50a0e22f63f013a627ba93ea2c5448c9265d61147aeb5f657bcc94d55ca0/re_mocd-0.2.2-cp39-cp39-manylinux_2_34_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "4387fe4b7bf8c52d1855aa881d0904905bd299ed32737e7e8bc48c49aa4622de",
"md5": "bfbae9bbe6cb4be71d6947ac3cbe6337",
"sha256": "20fb8174a60cf79548e22bc95a24318c02a582a90544046b2297498e1a1a5e44"
},
"downloads": -1,
"filename": "re_mocd-0.2.2-cp39-cp39-win_amd64.whl",
"has_sig": false,
"md5_digest": "bfbae9bbe6cb4be71d6947ac3cbe6337",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": null,
"size": 329870,
"upload_time": "2025-02-08T21:07:31",
"upload_time_iso_8601": "2025-02-08T21:07:31.929579Z",
"url": "https://files.pythonhosted.org/packages/43/87/fe4b7bf8c52d1855aa881d0904905bd299ed32737e7e8bc48c49aa4622de/re_mocd-0.2.2-cp39-cp39-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "de75f665e248af6842c764d8d26946258140c35ef3cafbb45230ae02f1c72b83",
"md5": "fb436b16b17fe3b1f27597ee61e7bbcb",
"sha256": "cbeea694e4513c6cba8738f6278a4e7bad4b93e971992f7c3d1ed70c1420ee67"
},
"downloads": -1,
"filename": "re_mocd-0.2.2.tar.gz",
"has_sig": false,
"md5_digest": "fb436b16b17fe3b1f27597ee61e7bbcb",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 384491,
"upload_time": "2025-02-08T21:07:33",
"upload_time_iso_8601": "2025-02-08T21:07:33.077765Z",
"url": "https://files.pythonhosted.org/packages/de/75/f665e248af6842c764d8d26946258140c35ef3cafbb45230ae02f1c72b83/re_mocd-0.2.2.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-02-08 21:07:33",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "0l1ve1r4",
"github_project": "re_mocd",
"github_not_found": true,
"lcname": "re-mocd"
}