diff --git a/pdm.lock b/pdm.lock index 7607253..20f19b6 100644 --- a/pdm.lock +++ b/pdm.lock @@ -5,59 +5,7 @@ groups = ["default", "notebooks", "trials", "trails", "dev"] strategy = ["cross_platform", "inherit_metadata"] lock_version = "4.4.2" -content_hash = "sha256:5c4c7b58272b6a8845865dde1fc6c953611f3e9424823eea35682da5cb6e112c" - -[[package]] -name = "alph" -version = "0.4.10" -requires_python = "<4.0,>=3.9" -summary = "alph" -groups = ["trials"] -dependencies = [ - "altair>=5.0.1", - "networkx>=2.6.3", - "pandas>=1.3.5", - "scikit-network>=0.27.1", -] -files = [ - {file = "alph-0.4.10-py3-none-any.whl", hash = "sha256:47649ef9d12ac7bddaa9cfc7510ab333e7fe1c76d4da4d1b09629bbd174fbe63"}, - {file = "alph-0.4.10.tar.gz", hash = "sha256:a2cfe932c7a6a973c718f8c5bc1b1dbc7a1d18a122cb5e438db5ea3a61d6b5c3"}, -] - -[[package]] -name = "alph" -version = "0.4.10" -extras = ["graphviz"] -requires_python = "<4.0,>=3.9" -summary = "alph" -groups = ["trials"] -dependencies = [ - "alph==0.4.10", - "pygraphviz>=1.10", -] -files = [ - {file = "alph-0.4.10-py3-none-any.whl", hash = "sha256:47649ef9d12ac7bddaa9cfc7510ab333e7fe1c76d4da4d1b09629bbd174fbe63"}, - {file = "alph-0.4.10.tar.gz", hash = "sha256:a2cfe932c7a6a973c718f8c5bc1b1dbc7a1d18a122cb5e438db5ea3a61d6b5c3"}, -] - -[[package]] -name = "altair" -version = "5.3.0" -requires_python = ">=3.8" -summary = "Vega-Altair: A declarative statistical visualization library for Python." -groups = ["trials"] -dependencies = [ - "jinja2", - "jsonschema>=3.0", - "numpy", - "packaging", - "pandas>=0.25", - "toolz", -] -files = [ - {file = "altair-5.3.0-py3-none-any.whl", hash = "sha256:7084a1dab4d83c5e7e5246b92dc1b4451a6c68fd057f3716ee9d315c8980e59a"}, - {file = "altair-5.3.0.tar.gz", hash = "sha256:5a268b1a0983b23d8f9129f819f956174aa7aea2719ed55a52eba9979b9f6675"}, -] +content_hash = "sha256:a9f1cc71f6ee89d2f0572ef7254c9f0be702dbd1a4957b2f0d00d3b83ccc20d4" [[package]] name = "annotated-types" @@ -188,7 +136,7 @@ name = "attrs" version = "23.2.0" requires_python = ">=3.7" summary = "Classes Without Boilerplate" -groups = ["notebooks", "trials"] +groups = ["notebooks"] files = [ {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, @@ -210,7 +158,7 @@ name = "backoff" version = "2.2.1" requires_python = ">=3.7,<4.0" summary = "Function decoration for backoff and retry" -groups = ["trials"] +groups = ["default"] files = [ {file = "backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8"}, {file = "backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba"}, @@ -294,7 +242,7 @@ name = "certifi" version = "2024.2.2" requires_python = ">=3.6" summary = "Python package for providing Mozilla's CA Bundle." -groups = ["default", "notebooks", "trials"] +groups = ["default", "notebooks"] files = [ {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, @@ -339,7 +287,7 @@ name = "chardet" version = "5.2.0" requires_python = ">=3.7" summary = "Universal encoding detector for Python 3" -groups = ["trials"] +groups = ["default"] files = [ {file = "chardet-5.2.0-py3-none-any.whl", hash = "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970"}, {file = "chardet-5.2.0.tar.gz", hash = "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7"}, @@ -350,7 +298,7 @@ name = "charset-normalizer" version = "3.3.2" requires_python = ">=3.7.0" summary = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -groups = ["default", "notebooks", "trials"] +groups = ["default", "notebooks"] files = [ {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, @@ -427,7 +375,7 @@ files = [ name = "colorbrewer" version = "0.2.0" summary = "constants from Cynthia Brewer's ColorBrewer" -groups = ["trials"] +groups = ["default"] dependencies = [ "six", ] @@ -440,7 +388,7 @@ files = [ name = "colour" version = "0.1.5" summary = "converts and manipulates various color representation (HSL, RVB, web, X11, ...)" -groups = ["trials"] +groups = ["default"] files = [ {file = "colour-0.1.5-py2.py3-none-any.whl", hash = "sha256:33f6db9d564fadc16e59921a56999b79571160ce09916303d35346dddc17978c"}, {file = "colour-0.1.5.tar.gz", hash = "sha256:af20120fefd2afede8b001fbef2ea9da70ad7d49fafdb6489025dae8745c3aee"}, @@ -523,7 +471,7 @@ files = [ [[package]] name = "dash" -version = "2.17.0" +version = "2.17.1" requires_python = ">=3.8" summary = "A Python framework for building reactive web-apps. Developed by Plotly." groups = ["default"] @@ -542,8 +490,8 @@ dependencies = [ "typing-extensions>=4.1.1", ] files = [ - {file = "dash-2.17.0-py3-none-any.whl", hash = "sha256:2421569023b2cd46ea2d4b2c14fe72c71b7436527a3102219b2265fa361e7c67"}, - {file = "dash-2.17.0.tar.gz", hash = "sha256:d065cd88771e45d0485993be0d27565e08918cb7edd18e31ee1c5b41252fc2fa"}, + {file = "dash-2.17.1-py3-none-any.whl", hash = "sha256:3eefc9ac67003f93a06bc3e500cae0a6787c48e6c81f6f61514239ae2da414e4"}, + {file = "dash-2.17.1.tar.gz", hash = "sha256:ee2d9c319de5dcc1314085710b72cd5fa63ff994d913bf72979b7130daeea28e"}, ] [[package]] @@ -558,7 +506,7 @@ files = [ [[package]] name = "dash-cytoscape" -version = "1.0.1" +version = "1.0.2" requires_python = ">=3.8" summary = "A Component Library for Dash aimed at facilitating network visualization in Python, wrapped around Cytoscape.js" groups = ["default"] @@ -566,7 +514,7 @@ dependencies = [ "dash", ] files = [ - {file = "dash_cytoscape-1.0.1.tar.gz", hash = "sha256:1bcd1587b2d8b432945585e2295e76393d3eb829f606c198693cd2b45bea6adc"}, + {file = "dash_cytoscape-1.0.2.tar.gz", hash = "sha256:a61019d2184d63a2b3b5c06d056d3b867a04223a674cc3c7cf900a561a9a59aa"}, ] [[package]] @@ -613,7 +561,7 @@ name = "decorator" version = "5.1.1" requires_python = ">=3.5" summary = "Decorators for Humans" -groups = ["notebooks", "trials"] +groups = ["default", "notebooks"] files = [ {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, @@ -771,7 +719,7 @@ name = "idna" version = "3.7" requires_python = ">=3.5" summary = "Internationalized Domain Names in Applications (IDNA)" -groups = ["default", "notebooks", "trials"] +groups = ["default", "notebooks"] files = [ {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, @@ -782,7 +730,7 @@ name = "igraph" version = "0.11.5" requires_python = ">=3.8" summary = "High performance graph data structures and algorithms" -groups = ["trials"] +groups = ["default"] dependencies = [ "texttable>=1.6.2", ] @@ -848,7 +796,7 @@ files = [ [[package]] name = "ipykernel" -version = "6.29.4" +version = "6.29.5" requires_python = ">=3.8" summary = "IPython Kernel for Jupyter" groups = ["notebooks"] @@ -868,13 +816,13 @@ dependencies = [ "traitlets>=5.4.0", ] files = [ - {file = "ipykernel-6.29.4-py3-none-any.whl", hash = "sha256:1181e653d95c6808039c509ef8e67c4126b3b3af7781496c7cbfb5ed938a27da"}, - {file = "ipykernel-6.29.4.tar.gz", hash = "sha256:3d44070060f9475ac2092b760123fadf105d2e2493c24848b6691a7c4f42af5c"}, + {file = "ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5"}, + {file = "ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215"}, ] [[package]] name = "ipython" -version = "8.24.0" +version = "8.26.0" requires_python = ">=3.10" summary = "IPython: Productive Interactive Computing" groups = ["notebooks"] @@ -891,26 +839,26 @@ dependencies = [ "typing-extensions>=4.6; python_version < \"3.12\"", ] files = [ - {file = "ipython-8.24.0-py3-none-any.whl", hash = "sha256:d7bf2f6c4314984e3e02393213bab8703cf163ede39672ce5918c51fe253a2a3"}, - {file = "ipython-8.24.0.tar.gz", hash = "sha256:010db3f8a728a578bb641fdd06c063b9fb8e96a9464c63aec6310fbcb5e80501"}, + {file = "ipython-8.26.0-py3-none-any.whl", hash = "sha256:e6b347c27bdf9c32ee9d31ae85defc525755a1869f14057e900675b9e8d6e6ff"}, + {file = "ipython-8.26.0.tar.gz", hash = "sha256:1cec0fbba8404af13facebe83d04436a7434c7400e59f47acf467c64abd0956c"}, ] [[package]] name = "ipywidgets" -version = "8.1.2" +version = "8.1.3" requires_python = ">=3.7" summary = "Jupyter interactive widgets" groups = ["notebooks"] dependencies = [ "comm>=0.1.3", "ipython>=6.1.0", - "jupyterlab-widgets~=3.0.10", + "jupyterlab-widgets~=3.0.11", "traitlets>=4.3.1", - "widgetsnbextension~=4.0.10", + "widgetsnbextension~=4.0.11", ] files = [ - {file = "ipywidgets-8.1.2-py3-none-any.whl", hash = "sha256:bbe43850d79fb5e906b14801d6c01402857996864d1e5b6fa62dd2ee35559f60"}, - {file = "ipywidgets-8.1.2.tar.gz", hash = "sha256:d0b9b41e49bae926a866e613a39b0f0097745d2b9f1f3dd406641b4a57ec42c9"}, + {file = "ipywidgets-8.1.3-py3-none-any.whl", hash = "sha256:efafd18f7a142248f7cb0ba890a68b96abd4d6e88ddbda483c9130d12667eaf2"}, + {file = "ipywidgets-8.1.3.tar.gz", hash = "sha256:f5f9eeaae082b1823ce9eac2575272952f40d748893972956dc09700a6392d9c"}, ] [[package]] @@ -957,7 +905,7 @@ name = "jinja2" version = "3.1.4" requires_python = ">=3.7" summary = "A very fast and expressive template engine." -groups = ["default", "notebooks", "trials"] +groups = ["default", "notebooks"] dependencies = [ "MarkupSafe>=2.0", ] @@ -1004,7 +952,7 @@ name = "jsonschema" version = "4.22.0" requires_python = ">=3.8" summary = "An implementation of JSON Schema validation for Python" -groups = ["notebooks", "trials"] +groups = ["notebooks"] dependencies = [ "attrs>=22.2.0", "jsonschema-specifications>=2023.03.6", @@ -1021,7 +969,7 @@ name = "jsonschema-specifications" version = "2023.12.1" requires_python = ">=3.8" summary = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" -groups = ["notebooks", "trials"] +groups = ["notebooks"] dependencies = [ "referencing>=0.31.0", ] @@ -1055,7 +1003,7 @@ files = [ [[package]] name = "jupyter-client" -version = "8.6.1" +version = "8.6.2" requires_python = ">=3.8" summary = "Jupyter protocol implementation and client libraries" groups = ["notebooks"] @@ -1067,8 +1015,8 @@ dependencies = [ "traitlets>=5.3", ] files = [ - {file = "jupyter_client-8.6.1-py3-none-any.whl", hash = "sha256:3b7bd22f058434e3b9a7ea4b1500ed47de2713872288c0d511d19926f99b459f"}, - {file = "jupyter_client-8.6.1.tar.gz", hash = "sha256:e842515e2bab8e19186d89fdfea7abd15e39dd581f94e399f00e2af5a1652d3f"}, + {file = "jupyter_client-8.6.2-py3-none-any.whl", hash = "sha256:50cbc5c66fd1b8f65ecb66bc490ab73217993632809b6e505687de18e9dea39f"}, + {file = "jupyter_client-8.6.2.tar.gz", hash = "sha256:2bda14d55ee5ba58552a8c53ae43d215ad9868853489213f37da060ced54d8df"}, ] [[package]] @@ -1123,7 +1071,7 @@ files = [ [[package]] name = "jupyter-server" -version = "2.14.0" +version = "2.14.2" requires_python = ">=3.8" summary = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." groups = ["notebooks"] @@ -1149,8 +1097,8 @@ dependencies = [ "websocket-client>=1.7", ] files = [ - {file = "jupyter_server-2.14.0-py3-none-any.whl", hash = "sha256:fb6be52c713e80e004fac34b35a0990d6d36ba06fd0a2b2ed82b899143a64210"}, - {file = "jupyter_server-2.14.0.tar.gz", hash = "sha256:659154cea512083434fd7c93b7fe0897af7a2fd0b9dd4749282b42eaac4ae677"}, + {file = "jupyter_server-2.14.2-py3-none-any.whl", hash = "sha256:47ff506127c2f7851a17bf4713434208fc490955d0e8632e95014a9a9afbeefd"}, + {file = "jupyter_server-2.14.2.tar.gz", hash = "sha256:66095021aa9638ced276c248b1d81862e4c50f292d575920bbe960de1c56b12b"}, ] [[package]] @@ -1170,7 +1118,7 @@ files = [ [[package]] name = "jupyterlab" -version = "4.2.0" +version = "4.2.3" requires_python = ">=3.8" summary = "JupyterLab computational environment" groups = ["notebooks"] @@ -1185,12 +1133,13 @@ dependencies = [ "jupyterlab-server<3,>=2.27.1", "notebook-shim>=0.2", "packaging", + "setuptools>=40.1.0", "tornado>=6.2.0", "traitlets", ] files = [ - {file = "jupyterlab-4.2.0-py3-none-any.whl", hash = "sha256:0dfe9278e25a145362289c555d9beb505697d269c10e99909766af7c440ad3cc"}, - {file = "jupyterlab-4.2.0.tar.gz", hash = "sha256:356e9205a6a2ab689c47c8fe4919dba6c076e376d03f26baadc05748c2435dd5"}, + {file = "jupyterlab-4.2.3-py3-none-any.whl", hash = "sha256:0b59d11808e84bb84105c73364edfa867dd475492429ab34ea388a52f2e2e596"}, + {file = "jupyterlab-4.2.3.tar.gz", hash = "sha256:df6e46969ea51d66815167f23d92f105423b7f1f06fa604d4f44aeb018c82c7b"}, ] [[package]] @@ -1206,7 +1155,7 @@ files = [ [[package]] name = "jupyterlab-server" -version = "2.27.1" +version = "2.27.3" requires_python = ">=3.8" summary = "A set of server components for JupyterLab and JupyterLab like applications." groups = ["notebooks"] @@ -1220,19 +1169,19 @@ dependencies = [ "requests>=2.31", ] files = [ - {file = "jupyterlab_server-2.27.1-py3-none-any.whl", hash = "sha256:f5e26156e5258b24d532c84e7c74cc212e203bff93eb856f81c24c16daeecc75"}, - {file = "jupyterlab_server-2.27.1.tar.gz", hash = "sha256:097b5ac709b676c7284ac9c5e373f11930a561f52cd5a86e4fc7e5a9c8a8631d"}, + {file = "jupyterlab_server-2.27.3-py3-none-any.whl", hash = "sha256:e697488f66c3db49df675158a77b3b017520d772c6e1548c7d9bcc5df7944ee4"}, + {file = "jupyterlab_server-2.27.3.tar.gz", hash = "sha256:eb36caca59e74471988f0ae25c77945610b887f777255aa21f8065def9e51ed4"}, ] [[package]] name = "jupyterlab-widgets" -version = "3.0.10" +version = "3.0.11" requires_python = ">=3.7" summary = "Jupyter interactive widgets for JupyterLab" groups = ["notebooks"] files = [ - {file = "jupyterlab_widgets-3.0.10-py3-none-any.whl", hash = "sha256:dd61f3ae7a5a7f80299e14585ce6cf3d6925a96c9103c978eda293197730cb64"}, - {file = "jupyterlab_widgets-3.0.10.tar.gz", hash = "sha256:04f2ac04976727e4f9d0fa91cdc2f1ab860f965e504c29dbd6a65c882c9d04c0"}, + {file = "jupyterlab_widgets-3.0.11-py3-none-any.whl", hash = "sha256:78287fd86d20744ace330a61625024cf5521e1c012a352ddc0a3cdc2348becd0"}, + {file = "jupyterlab_widgets-3.0.11.tar.gz", hash = "sha256:dd5ac679593c969af29c9bed054c24f26842baa51352114736756bc035deee27"}, ] [[package]] @@ -1325,7 +1274,7 @@ name = "markupsafe" version = "2.1.5" requires_python = ">=3.7" summary = "Safely add untrusted strings to HTML/XML markup." -groups = ["default", "notebooks", "trials"] +groups = ["default", "notebooks"] files = [ {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, @@ -1501,7 +1450,7 @@ name = "networkx" version = "3.3" requires_python = ">=3.10" summary = "Python package for creating and manipulating graphs and networks" -groups = ["default", "trials"] +groups = ["default"] files = [ {file = "networkx-3.3-py3-none-any.whl", hash = "sha256:28575580c6ebdaf4505b22c6256a2b9de86b316dc63ba9e93abde3d78dfdbcf2"}, {file = "networkx-3.3.tar.gz", hash = "sha256:0c127d8b2f4865f59ae9cb8aafcd60b5c70f3241ebd66f7defad7c4ab90126c9"}, @@ -1526,7 +1475,7 @@ name = "numpy" version = "1.26.4" requires_python = ">=3.9" summary = "Fundamental package for array computing in Python" -groups = ["default", "trials"] +groups = ["default"] files = [ {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, @@ -1720,7 +1669,7 @@ name = "packaging" version = "24.0" requires_python = ">=3.7" summary = "Core utilities for Python packages" -groups = ["default", "notebooks", "trials"] +groups = ["default", "notebooks"] files = [ {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, @@ -1731,7 +1680,7 @@ name = "pandas" version = "2.2.2" requires_python = ">=3.9" summary = "Powerful data structures for data analysis, time series, and statistics" -groups = ["default", "trials"] +groups = ["default"] dependencies = [ "numpy>=1.23.2; python_version == \"3.11\"", "numpy>=1.26.0; python_version >= \"3.12\"", @@ -1967,7 +1916,7 @@ name = "py4cytoscape" version = "1.9.0" requires_python = ">=3.8" summary = "Cytoscape Automation API" -groups = ["trials"] +groups = ["default"] dependencies = [ "backoff", "chardet", @@ -2077,22 +2026,12 @@ files = [ {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, ] -[[package]] -name = "pygraphviz" -version = "1.13" -requires_python = ">=3.10" -summary = "Python interface to Graphviz" -groups = ["trials"] -files = [ - {file = "pygraphviz-1.13.tar.gz", hash = "sha256:6ad8aa2f26768830a5a1cfc8a14f022d13df170a8f6fdfd68fd1aa1267000964"}, -] - [[package]] name = "python-dateutil" version = "2.9.0.post0" requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" summary = "Extensions to the standard Python datetime module" -groups = ["default", "notebooks", "trials"] +groups = ["default", "notebooks"] dependencies = [ "six>=1.5", ] @@ -2116,7 +2055,7 @@ files = [ name = "pytz" version = "2024.1" summary = "World timezone definitions, modern and historical" -groups = ["default", "trials"] +groups = ["default"] files = [ {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, @@ -2238,7 +2177,7 @@ name = "referencing" version = "0.35.1" requires_python = ">=3.8" summary = "JSON Referencing + Python" -groups = ["notebooks", "trials"] +groups = ["notebooks"] dependencies = [ "attrs>=22.2.0", "rpds-py>=0.7.0", @@ -2293,7 +2232,7 @@ name = "requests" version = "2.31.0" requires_python = ">=3.7" summary = "Python HTTP for Humans." -groups = ["default", "notebooks", "trials"] +groups = ["default", "notebooks"] dependencies = [ "certifi>=2017.4.17", "charset-normalizer<4,>=2", @@ -2348,7 +2287,7 @@ name = "rpds-py" version = "0.18.1" requires_python = ">=3.8" summary = "Python bindings to Rust's persistent data structures (rpds)" -groups = ["notebooks", "trials"] +groups = ["notebooks"] files = [ {file = "rpds_py-0.18.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6b5ff7e1d63a8281654b5e2896d7f08799378e594f09cf3674e832ecaf396ce8"}, {file = "rpds_py-0.18.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8927638a4d4137a289e41d0fd631551e89fa346d6dbcfc31ad627557d03ceb6d"}, @@ -2499,29 +2438,12 @@ files = [ {file = "scikit_learn-1.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:d762070980c17ba3e9a4a1e043ba0518ce4c55152032f1af0ca6f39b376b5928"}, ] -[[package]] -name = "scikit-network" -version = "0.32.1" -requires_python = ">=3.8" -summary = "Graph algorithms" -groups = ["trials"] -dependencies = [ - "numpy>=1.22.4", - "scipy>=1.7.3", -] -files = [ - {file = "scikit_network-0.32.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6228326cc5a813f4a7c031b64f1276d9cc1d5ccff082e62fb176f1e53ae2cc46"}, - {file = "scikit_network-0.32.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d634aab1e379702134c877c8c4a6803b7d7ba4efc103198474b7e896ec37e242"}, - {file = "scikit_network-0.32.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e32e247728815750b12b950279cae6b12041a0c4bf95d1accdd273b0c1a6ea1"}, - {file = "scikit_network-0.32.1-cp311-cp311-win_amd64.whl", hash = "sha256:c7016dce37120aa527fcff4254985360f164306ed060c496a6cf296a6d0fd2c3"}, -] - [[package]] name = "scipy" version = "1.13.0" requires_python = ">=3.9" summary = "Fundamental algorithms for scientific computing in Python" -groups = ["default", "trials"] +groups = ["default"] dependencies = [ "numpy<2.3,>=1.22.4", ] @@ -2578,7 +2500,7 @@ name = "setuptools" version = "69.5.1" requires_python = ">=3.8" summary = "Easily download, build, install, upgrade, and uninstall Python packages" -groups = ["default"] +groups = ["default", "notebooks"] files = [ {file = "setuptools-69.5.1-py3-none-any.whl", hash = "sha256:c636ac361bc47580504644275c9ad802c50415c7522212252c033bd15f301f32"}, {file = "setuptools-69.5.1.tar.gz", hash = "sha256:6c1fccdac05a97e598fb0ae3bbed5904ccb317337a51139dcd51453611bbb987"}, @@ -2589,7 +2511,7 @@ name = "six" version = "1.16.0" requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" summary = "Python 2 and 3 compatibility utilities" -groups = ["default", "notebooks", "trials"] +groups = ["default", "notebooks"] files = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, @@ -2630,7 +2552,7 @@ files = [ [[package]] name = "spacy" -version = "3.7.4" +version = "3.7.5" requires_python = ">=3.7" summary = "Industrial-strength Natural Language Processing (NLP) in Python" groups = ["default"] @@ -2646,28 +2568,27 @@ dependencies = [ "pydantic!=1.8,!=1.8.1,<3.0.0,>=1.7.4", "requests<3.0.0,>=2.13.0", "setuptools", - "smart-open<7.0.0,>=5.2.1", "spacy-legacy<3.1.0,>=3.0.11", "spacy-loggers<2.0.0,>=1.0.0", "srsly<3.0.0,>=2.4.3", "thinc<8.3.0,>=8.2.2", "tqdm<5.0.0,>=4.38.0", - "typer<0.10.0,>=0.3.0", + "typer<1.0.0,>=0.3.0", "wasabi<1.2.0,>=0.9.1", - "weasel<0.4.0,>=0.1.0", + "weasel<0.5.0,>=0.1.0", ] files = [ - {file = "spacy-3.7.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e82b9da21853d4aee46811804dc7e136895f087fda25c7585172d95eb9b70833"}, - {file = "spacy-3.7.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:07ffedf51899441070fb70432f8f873696f39e0e31c9ce7403101c459f8a1281"}, - {file = "spacy-3.7.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba57bcc111eca7b086ee33a9636df775cfd4b14302f7d0ffbc11e95ac0fb3f0e"}, - {file = "spacy-3.7.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7580d1565f4d1ccbee9a18531f993a5b9b37ced96f145153dd4e98ceec607a55"}, - {file = "spacy-3.7.4-cp311-cp311-win_amd64.whl", hash = "sha256:df99c6f0085b1ec8e88beb5fd96d4371cef6fc19c202c41fc4fadc2afd55a157"}, - {file = "spacy-3.7.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b982ebab417189346acb4722637c573830d62e157ba336c3eb6c417249344be1"}, - {file = "spacy-3.7.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e7c29e152d8ea060af60da9410fa8ef038f3c9068a206905ee5c704de78f6e87"}, - {file = "spacy-3.7.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:023c9a008328f55c4717c56c4f8a28073b9961547f7d38a9405c967a52e66d59"}, - {file = "spacy-3.7.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1969d3d0fd0c811b7485438460f0ae8cfe16d46b54bcb8d1c26e70914e67e3d"}, - {file = "spacy-3.7.4-cp312-cp312-win_amd64.whl", hash = "sha256:040f7df5096c817450820eaaa426d54ed266254d16974e9a707a32f5b0f139ae"}, - {file = "spacy-3.7.4.tar.gz", hash = "sha256:525f2ced2e40761562c8cace93ef6a1e6e8c483f27bd564bc1b15f608efbe85b"}, + {file = "spacy-3.7.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cd93c34bf2a02bbed7df73d42aed8df5e3eb9688c4ea84ec576f740ba939cce5"}, + {file = "spacy-3.7.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:190ba0032a5efdb138487c587c0ebb7a98f86adb917f464b252ee8766b8eec4a"}, + {file = "spacy-3.7.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38de1c9bbb73b8cdfea2dd6e57450f093c1a1af47515870c1c8640b85b35ab16"}, + {file = "spacy-3.7.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3dad4853950a2fe6c7a0bdfd791a762d1f8cedd2915c4ae41b2e0ca3a850eefc"}, + {file = "spacy-3.7.5-cp311-cp311-win_amd64.whl", hash = "sha256:4e00d076871af784c2e43185a71ee676b58893853a05c5b81717b8af2b666c07"}, + {file = "spacy-3.7.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:bf54c3c2425428b328b53a65913d47eb4cb27a1429aa4e8ed979ffc97d4663e0"}, + {file = "spacy-3.7.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4145cea7f9814fa7d86b2028c2dd83e02f13f80d5ac604a400b2f7d7b26a0e8c"}, + {file = "spacy-3.7.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:262f8ebb71f7ed5ffe8e4f384b2594b7a296be50241ce9fbd9277b5da2f46f38"}, + {file = "spacy-3.7.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:faa1e2b6234ae33c0b1f8dfa5a8dcb66fb891f19231725dfcff4b2666125c250"}, + {file = "spacy-3.7.5-cp312-cp312-win_amd64.whl", hash = "sha256:07677e270a6d729453cc04b5e2247a96a86320b8845e6428d9f90f217eff0f56"}, + {file = "spacy-3.7.5.tar.gz", hash = "sha256:a648c6cbf2acc7a55a69ee9e7fa4f22bdf69aa828a587a1bc5cfff08cf3c2dd3"}, ] [[package]] @@ -2755,7 +2676,7 @@ files = [ [[package]] name = "spacy" -version = "3.7.4" +version = "3.7.5" extras = ["lookups", "transformers"] requires_python = ">=3.7" summary = "Industrial-strength Natural Language Processing (NLP) in Python" @@ -2763,20 +2684,20 @@ groups = ["default"] dependencies = [ "spacy-lookups-data<1.1.0,>=1.0.3", "spacy-transformers<1.4.0,>=1.1.2", - "spacy==3.7.4", + "spacy==3.7.5", ] files = [ - {file = "spacy-3.7.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e82b9da21853d4aee46811804dc7e136895f087fda25c7585172d95eb9b70833"}, - {file = "spacy-3.7.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:07ffedf51899441070fb70432f8f873696f39e0e31c9ce7403101c459f8a1281"}, - {file = "spacy-3.7.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba57bcc111eca7b086ee33a9636df775cfd4b14302f7d0ffbc11e95ac0fb3f0e"}, - {file = "spacy-3.7.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7580d1565f4d1ccbee9a18531f993a5b9b37ced96f145153dd4e98ceec607a55"}, - {file = "spacy-3.7.4-cp311-cp311-win_amd64.whl", hash = "sha256:df99c6f0085b1ec8e88beb5fd96d4371cef6fc19c202c41fc4fadc2afd55a157"}, - {file = "spacy-3.7.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b982ebab417189346acb4722637c573830d62e157ba336c3eb6c417249344be1"}, - {file = "spacy-3.7.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e7c29e152d8ea060af60da9410fa8ef038f3c9068a206905ee5c704de78f6e87"}, - {file = "spacy-3.7.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:023c9a008328f55c4717c56c4f8a28073b9961547f7d38a9405c967a52e66d59"}, - {file = "spacy-3.7.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1969d3d0fd0c811b7485438460f0ae8cfe16d46b54bcb8d1c26e70914e67e3d"}, - {file = "spacy-3.7.4-cp312-cp312-win_amd64.whl", hash = "sha256:040f7df5096c817450820eaaa426d54ed266254d16974e9a707a32f5b0f139ae"}, - {file = "spacy-3.7.4.tar.gz", hash = "sha256:525f2ced2e40761562c8cace93ef6a1e6e8c483f27bd564bc1b15f608efbe85b"}, + {file = "spacy-3.7.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cd93c34bf2a02bbed7df73d42aed8df5e3eb9688c4ea84ec576f740ba939cce5"}, + {file = "spacy-3.7.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:190ba0032a5efdb138487c587c0ebb7a98f86adb917f464b252ee8766b8eec4a"}, + {file = "spacy-3.7.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38de1c9bbb73b8cdfea2dd6e57450f093c1a1af47515870c1c8640b85b35ab16"}, + {file = "spacy-3.7.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3dad4853950a2fe6c7a0bdfd791a762d1f8cedd2915c4ae41b2e0ca3a850eefc"}, + {file = "spacy-3.7.5-cp311-cp311-win_amd64.whl", hash = "sha256:4e00d076871af784c2e43185a71ee676b58893853a05c5b81717b8af2b666c07"}, + {file = "spacy-3.7.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:bf54c3c2425428b328b53a65913d47eb4cb27a1429aa4e8ed979ffc97d4663e0"}, + {file = "spacy-3.7.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4145cea7f9814fa7d86b2028c2dd83e02f13f80d5ac604a400b2f7d7b26a0e8c"}, + {file = "spacy-3.7.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:262f8ebb71f7ed5ffe8e4f384b2594b7a296be50241ce9fbd9277b5da2f46f38"}, + {file = "spacy-3.7.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:faa1e2b6234ae33c0b1f8dfa5a8dcb66fb891f19231725dfcff4b2666125c250"}, + {file = "spacy-3.7.5-cp312-cp312-win_amd64.whl", hash = "sha256:07677e270a6d729453cc04b5e2247a96a86320b8845e6428d9f90f217eff0f56"}, + {file = "spacy-3.7.5.tar.gz", hash = "sha256:a648c6cbf2acc7a55a69ee9e7fa4f22bdf69aa828a587a1bc5cfff08cf3c2dd3"}, ] [[package]] @@ -2875,7 +2796,7 @@ files = [ name = "texttable" version = "1.7.0" summary = "module to create simple ASCII tables" -groups = ["trials"] +groups = ["default"] files = [ {file = "texttable-1.7.0-py2.py3-none-any.whl", hash = "sha256:72227d592c82b3d7f672731ae73e4d1f88cd8e2ef5b075a7a7f01a23a3743917"}, {file = "texttable-1.7.0.tar.gz", hash = "sha256:2d2068fb55115807d3ac77a4ca68fa48803e84ebb0ee2340f858107a36522638"}, @@ -3014,17 +2935,6 @@ files = [ {file = "tokenizers-0.15.2.tar.gz", hash = "sha256:e6e9c6e019dd5484be5beafc775ae6c925f4c69a3487040ed09b45e13df2cb91"}, ] -[[package]] -name = "toolz" -version = "0.12.1" -requires_python = ">=3.7" -summary = "List processing tools and functional utilities" -groups = ["trials"] -files = [ - {file = "toolz-0.12.1-py3-none-any.whl", hash = "sha256:d22731364c07d72eea0a0ad45bafb2c2937ab6fd38a3507bf55eae8744aa7d85"}, - {file = "toolz-0.12.1.tar.gz", hash = "sha256:ecca342664893f177a13dac0e6b41cbd8ac25a358e5f215316d43e2100224f4d"}, -] - [[package]] name = "torch" version = "2.3.0" @@ -3187,7 +3097,7 @@ name = "tzdata" version = "2024.1" requires_python = ">=2" summary = "Provider of IANA time zone data" -groups = ["default", "trials"] +groups = ["default"] files = [ {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, @@ -3209,7 +3119,7 @@ name = "urllib3" version = "2.2.1" requires_python = ">=3.8" summary = "HTTP library with thread-safe connection pooling, file post, and more." -groups = ["default", "notebooks", "trials"] +groups = ["default", "notebooks"] files = [ {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, @@ -3309,13 +3219,13 @@ files = [ [[package]] name = "widgetsnbextension" -version = "4.0.10" +version = "4.0.11" requires_python = ">=3.7" summary = "Jupyter interactive widgets for Jupyter Notebook" groups = ["notebooks"] files = [ - {file = "widgetsnbextension-4.0.10-py3-none-any.whl", hash = "sha256:d37c3724ec32d8c48400a435ecfa7d3e259995201fbefa37163124a9fcb393cc"}, - {file = "widgetsnbextension-4.0.10.tar.gz", hash = "sha256:64196c5ff3b9a9183a8e699a4227fb0b7002f252c814098e66c4d1cd0644688f"}, + {file = "widgetsnbextension-4.0.11-py3-none-any.whl", hash = "sha256:55d4d6949d100e0d08b94948a42efc3ed6dfdc0e9468b2c4b128c9a2ce3a7a36"}, + {file = "widgetsnbextension-4.0.11.tar.gz", hash = "sha256:8b22a8f1910bfd188e596fe7fc05dcbd87e810c8a4ba010bdb3da86637398474"}, ] [[package]] diff --git a/pyproject.toml b/pyproject.toml index be30fa2..27cd55f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,12 +10,13 @@ dependencies = [ "networkx>=3.3", "spacy[lookups,transformers]>=3.7.4", "sentence-transformers>=2.7.0", - "numpy>=1.26.4", + "numpy<=1.26.4", "pip>=24.0", "typing-extensions>=4.12.2", "plotly>=5.22.0", "dash>=2.17.0", "dash-cytoscape>=1.0.1", + "py4cytoscape>=1.9.0", ] requires-python = ">=3.11" readme = "README.md" @@ -40,8 +41,6 @@ notebooks = [ # files. This information is provided by extra options. # --config-setting="--global-option=build_ext" --config-setting="--global-option=-IC:\Program Files\Graphviz\include" --config-setting="--global-option=-LC:\Program Files\Graphviz\lib" trials = [ - "alph[graphviz]>=0.4.10", - "py4cytoscape>=1.9.0", ] dev = [ "cython>=3.0.10", diff --git a/scripts/analyse_dataset.py b/scripts/analyse_dataset.py index 2a9738d..45824ad 100644 --- a/scripts/analyse_dataset.py +++ b/scripts/analyse_dataset.py @@ -3,12 +3,17 @@ from typing import cast from pandas import DataFrame -from lang_main.analysis.graphs import Graph, TokenGraph, save_to_GraphML +from lang_main.analysis.graphs import ( + Graph, + TokenGraph, + save_to_GraphML, +) from lang_main.constants import ( PATH_TO_DATASET, SAVE_PATH_FOLDER, SKIP_GRAPH_POSTPROCESSING, SKIP_GRAPH_RESCALING, + SKIP_GRAPH_STATIC_RENDERING, SKIP_PREPROCESSING, SKIP_TIME_ANALYSIS, SKIP_TOKEN_ANALYSIS, @@ -21,7 +26,8 @@ from lang_main.pipelines.predefined import ( build_timeline_pipe, build_tk_graph_pipe, build_tk_graph_post_pipe, - build_tk_graph_rescaling, + build_tk_graph_rendering_pipe, + build_tk_graph_rescaling_pipe, ) from lang_main.types import ( EntryPoints, @@ -36,7 +42,8 @@ pipe_target_feat = build_base_target_feature_pipe() pipe_merge = build_merge_duplicates_pipe() pipe_token_analysis = build_tk_graph_pipe() pipe_graph_postprocessing = build_tk_graph_post_pipe() -pipe_graph_rescaling = build_tk_graph_rescaling() +pipe_graph_rescaling = build_tk_graph_rescaling_pipe() +pipe_static_graph_rendering = build_tk_graph_rendering_pipe() pipe_timeline = build_timeline_pipe() @@ -61,7 +68,7 @@ def run_token_analysis() -> None: loaded_results = cast(tuple[DataFrame], load_pickle(entry_point_path)) preprocessed_data = loaded_results[0] # build token graph - (tk_graph, docs_mapping) = typing.cast( + (tk_graph, _) = typing.cast( tuple[TokenGraph, dict[PandasIndex, SpacyDoc] | None], pipe_token_analysis.run(starting_values=(preprocessed_data,)), ) @@ -94,14 +101,33 @@ def run_graph_edge_rescaling() -> None: ret = cast( tuple[TokenGraph, Graph], pipe_graph_rescaling.run(starting_values=(tk_graph,)) ) - undirected_rescaled_graph = ret[1] + tk_graph_rescaled = ret[0] + tk_graph_rescaled_undirected = ret[1] + tk_graph_rescaled.to_GraphML( + SAVE_PATH_FOLDER, filename='TokenGraph-directed-rescaled', directed=False + ) save_to_GraphML( - undirected_rescaled_graph, + tk_graph_rescaled_undirected, saving_path=SAVE_PATH_FOLDER, filename='TokenGraph-undirected-rescaled', ) +def run_static_graph_rendering() -> None: + entry_point_path = get_entry_point( + SAVE_PATH_FOLDER, + EntryPoints.TK_GRAPH_ANALYSIS_RESCALED, + ) + loaded_results = cast( + tuple[TokenGraph, Graph], + load_pickle(entry_point_path), + ) + tk_graph_rescaled = loaded_results[0] + tk_graph_rescaled_undirected = loaded_results[1] + + _ = pipe_static_graph_rendering.run(starting_values=(tk_graph_rescaled_undirected,)) + + # ** time analysis def run_time_analysis() -> None: # load entry point @@ -123,6 +149,7 @@ def build_pipeline_container() -> PipelineContainer: container.add(run_token_analysis, skip=SKIP_TOKEN_ANALYSIS) container.add(run_graph_postprocessing, skip=SKIP_GRAPH_POSTPROCESSING) container.add(run_graph_edge_rescaling, skip=SKIP_GRAPH_RESCALING) + container.add(run_static_graph_rendering, skip=SKIP_GRAPH_STATIC_RENDERING) container.add(run_time_analysis, skip=SKIP_TIME_ANALYSIS) return container diff --git a/scripts/lang_main_config.toml b/scripts/lang_main_config.toml index fbd99b0..14699c6 100644 --- a/scripts/lang_main_config.toml +++ b/scripts/lang_main_config.toml @@ -13,9 +13,10 @@ dataset = '../data/02_202307/Export4.csv' # be fully executed [control] preprocessing_skip = true -token_analysis_skip = false -graph_postprocessing_skip = false -graph_rescaling_skip = false +token_analysis_skip = true +graph_postprocessing_skip = true +graph_rescaling_skip = true +graph_static_rendering_skip = false time_analysis_skip = true #[export_filenames] diff --git a/src/lang_main/__init__.py b/src/lang_main/__init__.py index c9b2122..6d1d346 100644 --- a/src/lang_main/__init__.py +++ b/src/lang_main/__init__.py @@ -6,8 +6,17 @@ from pathlib import Path from time import gmtime from typing import Any, Final +import py4cytoscape as p4c + from lang_main.io import load_toml_config +# ** py4cytoscape config +p4c.set_summary_logger(False) +p4c.py4cytoscape_logger.detail_logger.setLevel('ERROR') +p4c.py4cytoscape_logger.detail_logger.removeHandler(p4c.py4cytoscape_logger.detail_handler) +p4c.py4cytoscape_logger.detail_logger.addHandler(logging.NullHandler()) + +# ** lang-main config logging.Formatter.converter = gmtime LOG_FMT: Final[str] = '%(asctime)s | %(module)s:%(levelname)s | %(message)s' LOG_DATE_FMT: Final[str] = '%Y-%m-%d %H:%M:%S +0000' @@ -18,13 +27,13 @@ logging.basicConfig( ) CONFIG_FILENAME: Final[str] = 'lang_main_config.toml' +CYTO_STYLESHEET_FILENAME: Final[str] = r'cytoscape_config/lang_main.xml' USE_INTERNAL_CONFIG: Final[bool] = False pkg_dir = Path(__file__).parent cfg_path_internal = (pkg_dir / CONFIG_FILENAME).resolve() -# caller_file = Path(inspect.stack()[-1].filename) -# CALLER_PATH: Final[Path] = caller_file.parent.resolve() +cyto_stylesheet_path = (pkg_dir / CYTO_STYLESHEET_FILENAME).resolve() -# load config data: internal/external +# ** load config data: internal/external if USE_INTERNAL_CONFIG: loaded_cfg = load_toml_config(path_to_toml=cfg_path_internal) else: @@ -43,6 +52,17 @@ else: CONFIG: Final[dict[str, Any]] = loaded_cfg.copy() +# ** Cytoscape configuration +# stylesheet +if not cyto_stylesheet_path.exists(): + raise FileNotFoundError( + f'Visual stylesheet for Cytoscape not found under: >>{cyto_stylesheet_path}<<' + ) + +CYTO_PATH_STYLESHEET: Final[Path] = cyto_stylesheet_path + + +# TODO check removal # append Graphviz binary folder to system path if not already contained if sys.platform == 'win32': path = Path(r'C:\Program Files\Graphviz\bin') diff --git a/src/lang_main/analysis/graphs.py b/src/lang_main/analysis/graphs.py index bcf1578..cbc6097 100644 --- a/src/lang_main/analysis/graphs.py +++ b/src/lang_main/analysis/graphs.py @@ -13,7 +13,10 @@ import numpy.typing as npt from networkx import DiGraph, Graph from pandas import DataFrame -from lang_main.constants import EDGE_WEIGHT_DECIMALS +from lang_main.constants import ( + EDGE_WEIGHT_DECIMALS, + PROPERTY_NAME_DEGREE_WEIGHTED, +) from lang_main.errors import EdgePropertyNotContainedError from lang_main.io import load_pickle, save_pickle from lang_main.loggers import logger_graphs as logger @@ -233,9 +236,7 @@ def filter_graph_by_edge_weight( if bound_upper is not None and weight > bound_upper: filtered_graph.remove_edge(edge[0], edge[1]) - if filtered_graph._undirected is not None: - filtered_graph.to_undirected(inplace=True, logging=False) - + filtered_graph.to_undirected(inplace=True, logging=False) filtered_graph.update_metadata(logging=False) return filtered_graph @@ -275,15 +276,77 @@ def filter_graph_by_node_degree( if bound_upper is not None and degree > bound_upper: filtered_graph.remove_node(node) - if filtered_graph._undirected is not None: - filtered_graph.to_undirected(inplace=True, logging=False) - + filtered_graph.to_undirected(inplace=True, logging=False) filtered_graph.update_metadata(logging=False) return filtered_graph -def apply_rescaling_to_graph( +def add_weighted_degree( + graph: DiGraph | Graph, + edge_weight_property: str = 'weight', + property_name: str = PROPERTY_NAME_DEGREE_WEIGHTED, +) -> None: + """adds the weighted degree as property to each node of the given graph + Operation is performed inplace. + + Parameters + ---------- + graph : DiGraph | Graph + Graph with weighted degree as node property added inplace + edge_weight_property : str, optional + property of the edges which contains the weight information, by default 'weight' + property_name : str, optional + target name for the property containing the weighted degree in nodes, + by default 'degree_weighted' + """ + node_degree_mapping = cast( + dict[str, float], + dict(graph.degree(weight=edge_weight_property)), # type: ignore + ) + nx.set_node_attributes( + graph, + node_degree_mapping, + name=property_name, + ) + + +def static_graph_analysis( + graph: TokenGraph, +) -> tuple[TokenGraph]: + """helper function to allow the calculation of static metrics in pipelines + + Parameters + ---------- + tk_graph_directed : TokenGraph + token graph (directed) and with rescaled edge weights + tk_graph_undirected : Graph + token graph (undirected) and with rescaled edge weights + + Returns + ------- + tuple[TokenGraph, Graph] + token graph (directed) and undirected version with added weighted degree + """ + graph = graph.copy() + graph.perform_static_analysis() + + return (graph,) + + +def pipe_add_graph_metrics( + *graphs: DiGraph | Graph, +) -> tuple[DiGraph | Graph, ...]: + collection: list[DiGraph | Graph] = [] + for graph in graphs: + graph_copy = copy.deepcopy(graph) + add_weighted_degree(graph_copy) + collection.append(graph_copy) + + return tuple(collection) + + +def pipe_rescale_graph_edge_weights( graph: TokenGraph, ) -> tuple[TokenGraph, Graph]: """helper function to allow calls in pipelines @@ -298,6 +361,8 @@ def apply_rescaling_to_graph( tuple[TokenGraph, Graph] token graph (directed) and undirected version with rescaled edge weights """ + graph = graph.copy() + return graph.rescale_edge_weights() @@ -542,7 +607,7 @@ class TokenGraph(DiGraph): the underlying `to_undirected` method of the directed and rescaled TokenGraph instance is called the weights are not rescaled again. Thus, the maximum edge weight can exceed the theoretical maximum value of 1. To - ensure consistent behaviour across different application of the conversion to + ensure consistent behaviour across different applications of the conversion to undirected graphs new instances are returned, especially for the undirected graph. In contrast, the new directed TokenGraph contains an undirected version without @@ -554,14 +619,24 @@ class TokenGraph(DiGraph): tuple[TokenGraph, Graph] directed and undirected instances """ + self.to_undirected(inplace=True, logging=False) token_graph = rescale_edge_weights(self.directed) token_graph.rescaled_weights = True - token_graph.to_undirected(inplace=True, logging=False) token_graph.update_metadata(logging=False) undirected = rescale_edge_weights(self.undirected) return token_graph, undirected + def perform_static_analysis(self): + """calculate different metrics directly on the data of the underlying graphs + (directed and undirected) + + Current operations: + - adding weighted degree + """ + add_weighted_degree(self) + add_weighted_degree(self.undirected) + def _save_prepare( self, path: Path, diff --git a/src/lang_main/analysis/tokens.py b/src/lang_main/analysis/tokens.py index eef07dc..aaf0534 100644 --- a/src/lang_main/analysis/tokens.py +++ b/src/lang_main/analysis/tokens.py @@ -226,6 +226,7 @@ def build_token_graph( graph.update_metadata() # convert to undirected graph.to_undirected(logging=False) + graph.perform_static_analysis() return graph, docs_mapping diff --git a/src/lang_main/constants.py b/src/lang_main/constants.py index f15dd4f..2fda715 100644 --- a/src/lang_main/constants.py +++ b/src/lang_main/constants.py @@ -5,8 +5,13 @@ import spacy from sentence_transformers import SentenceTransformer from spacy.language import Language as GermanSpacyModel -from lang_main import CONFIG -from lang_main.types import STFRDeviceTypes +from lang_main import CONFIG, CYTO_PATH_STYLESHEET +from lang_main.types import CytoLayoutProperties, CytoLayouts, STFRDeviceTypes + +__all__ = [ + 'CONFIG', + 'CYTO_PATH_STYLESHEET', +] # ** paths input_path_conf = Path.cwd() / Path(CONFIG['paths']['inputs']) @@ -28,8 +33,10 @@ SKIP_PREPROCESSING: Final[bool] = CONFIG['control']['preprocessing_skip'] SKIP_TOKEN_ANALYSIS: Final[bool] = CONFIG['control']['token_analysis_skip'] SKIP_GRAPH_POSTPROCESSING: Final[bool] = CONFIG['control']['graph_postprocessing_skip'] SKIP_GRAPH_RESCALING: Final[bool] = CONFIG['control']['graph_rescaling_skip'] +SKIP_GRAPH_STATIC_RENDERING: Final[bool] = CONFIG['control']['graph_static_rendering_skip'] SKIP_TIME_ANALYSIS: Final[bool] = CONFIG['control']['time_analysis_skip'] + # ** models # ** sentence_transformers STFR_DEVICE: Final[STFRDeviceTypes] = STFRDeviceTypes.CPU @@ -55,6 +62,26 @@ THRESHOLD_SIMILARITY: Final[float] = CONFIG['preprocess']['threshold_similarity' # ** graph postprocessing EDGE_WEIGHT_DECIMALS: Final[int] = 4 THRESHOLD_EDGE_WEIGHT: Final[int] = CONFIG['graph_postprocessing']['threshold_edge_weight'] +PROPERTY_NAME_DEGREE_WEIGHTED: Final[str] = 'degree_weighted' + +# ** graph exports (Cytoscape) +CYTO_COLLECTION_NAME: Final[str] = 'lang_main' +CYTO_BASE_NETWORK_NAME: Final[str] = 'token_graph' +CYTO_LAYOUT_NAME: Final[CytoLayouts] = 'force-directed' +CYTO_LAYOUT_PROPERTIES: Final[CytoLayoutProperties] = { + 'numIterations': 1000, + 'defaultSpringCoefficient': 1e-4, + 'defaultSpringLength': 45, + 'defaultNodeMass': 11, + 'isDeterministic': True, + 'singlePartition': False, +} +CYTO_STYLESHEET_NAME: Final[str] = 'lang_main' +# name for property, on which selection is done +CYTO_SELECTION_PROPERTY: Final[str] = 'node_selection' +CYTO_NUMBER_SUBGRAPHS: Final[int] = 5 +CYTO_ITER_NEIGHBOUR_DEPTH: Final[int] = 2 + # ** time analysis.uniqueness THRESHOLD_UNIQUE_TEXTS: Final[int] = CONFIG['time_analysis']['uniqueness'][ 'threshold_unique_texts' diff --git a/src/lang_main/cytoscape_config/lang_main.xml b/src/lang_main/cytoscape_config/lang_main.xml new file mode 100644 index 0000000..93adff8 --- /dev/null +++ b/src/lang_main/cytoscape_config/lang_main.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/lang_main/cytoscape_config/template_test.cys b/src/lang_main/cytoscape_config/template_test.cys index e5e3b15..ee1eb00 100644 Binary files a/src/lang_main/cytoscape_config/template_test.cys and b/src/lang_main/cytoscape_config/template_test.cys differ diff --git a/src/lang_main/lang_main_config.toml b/src/lang_main/lang_main_config.toml index fbd99b0..3c00289 100644 --- a/src/lang_main/lang_main_config.toml +++ b/src/lang_main/lang_main_config.toml @@ -16,6 +16,7 @@ preprocessing_skip = true token_analysis_skip = false graph_postprocessing_skip = false graph_rescaling_skip = false +graph_static_rendering_skip = false time_analysis_skip = true #[export_filenames] diff --git a/src/lang_main/pipelines/base.py b/src/lang_main/pipelines/base.py index 1dfd427..fb17250 100644 --- a/src/lang_main/pipelines/base.py +++ b/src/lang_main/pipelines/base.py @@ -185,13 +185,16 @@ class Pipeline(BasePipeline): def add( self, action: Callable, - action_kwargs: dict[str, Any] = {}, + action_kwargs: dict[str, Any] | None = None, save_result: bool = False, load_result: bool = False, filename: str | None = None, ) -> None: # check explicitly for function type # if isinstance(action, FunctionType): + if action_kwargs is None: + action_kwargs = {} + if isinstance(action, Callable): self.actions.append(action) self.action_names.append(action.__name__) @@ -272,7 +275,7 @@ class Pipeline(BasePipeline): @override def logic( self, - starting_values: tuple[Any, ...], + starting_values: tuple[Any, ...] | None = None, ) -> tuple[Any, ...]: for idx, (action, action_kwargs) in enumerate(zip(self.actions, self.actions_kwargs)): # loading @@ -287,11 +290,21 @@ class Pipeline(BasePipeline): continue # calculation if idx == 0: - ret = action(*starting_values, **action_kwargs) + args = starting_values + # ret = action(*starting_values, **action_kwargs) else: - ret = action(*ret, **action_kwargs) + args = ret - if not isinstance(ret, tuple): + if args is not None and action_kwargs: + ret = action(*args, **action_kwargs) + elif args is not None: + ret = action(*args) + elif args is None and action_kwargs: + ret = action(**action_kwargs) + else: + ret = action() + + if ret is not None and not isinstance(ret, tuple): ret = (ret,) ret = cast(tuple[Any, ...], ret) # save intermediate result diff --git a/src/lang_main/pipelines/predefined.py b/src/lang_main/pipelines/predefined.py index 86ec4e8..f2f2cbf 100644 --- a/src/lang_main/pipelines/predefined.py +++ b/src/lang_main/pipelines/predefined.py @@ -19,6 +19,7 @@ from lang_main.analysis.tokens import build_token_graph from lang_main.constants import ( ACTIVITY_FEATURE, ACTIVITY_TYPES, + CYTO_BASE_NETWORK_NAME, DATE_COLS, FEATURE_NAME_OBJ_ID, MODEL_INPUT_FEATURES, @@ -34,6 +35,7 @@ from lang_main.constants import ( UNIQUE_CRITERION_FEATURE, ) from lang_main.pipelines.base import Pipeline +from lang_main.render import cytoscape as cyto from lang_main.types import EntryPoints @@ -156,6 +158,9 @@ def build_tk_graph_post_pipe() -> Pipeline: 'bound_lower': 1, 'bound_upper': None, }, + ) + pipe_graph_postprocessing.add( + graphs.static_graph_analysis, save_result=True, filename=EntryPoints.TK_GRAPH_ANALYSIS, ) @@ -163,10 +168,13 @@ def build_tk_graph_post_pipe() -> Pipeline: return pipe_graph_postprocessing -def build_tk_graph_rescaling() -> Pipeline: +def build_tk_graph_rescaling_pipe() -> Pipeline: pipe_graph_rescaling = Pipeline(name='Graph_Rescaling', working_dir=SAVE_PATH_FOLDER) pipe_graph_rescaling.add( - graphs.apply_rescaling_to_graph, + graphs.pipe_rescale_graph_edge_weights, + ) + pipe_graph_rescaling.add( + graphs.pipe_add_graph_metrics, save_result=True, filename=EntryPoints.TK_GRAPH_ANALYSIS_RESCALED, ) @@ -174,6 +182,27 @@ def build_tk_graph_rescaling() -> Pipeline: return pipe_graph_rescaling +def build_tk_graph_rendering_pipe() -> Pipeline: + pipe_graph_rendering = Pipeline( + name='Graph_Static-Rendering', + working_dir=SAVE_PATH_FOLDER, + ) + pipe_graph_rendering.add(cyto.import_to_cytoscape) + pipe_graph_rendering.add(cyto.layout_network) + pipe_graph_rendering.add(cyto.apply_style_to_network) + pipe_graph_rendering.add( + cyto.export_network_to_image, + {'filename': CYTO_BASE_NETWORK_NAME}, + ) + pipe_graph_rendering.add(cyto.get_subgraph_node_selection) + pipe_graph_rendering.add( + cyto.build_subnetworks, + {'export_image': True}, + ) + + return pipe_graph_rendering + + # ** timeline analysis def build_timeline_pipe() -> Pipeline: pipe_timeline = Pipeline(name='Timeline_Analysis', working_dir=SAVE_PATH_FOLDER) diff --git a/src/lang_main/render/__init__.py b/src/lang_main/render/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/lang_main/render/cytoscape.py b/src/lang_main/render/cytoscape.py new file mode 100644 index 0000000..7560ce6 --- /dev/null +++ b/src/lang_main/render/cytoscape.py @@ -0,0 +1,159 @@ +import time +from collections.abc import Iterable +from pathlib import Path +from typing import cast + +import py4cytoscape as p4c +from networkx import DiGraph, Graph + +from lang_main.constants import ( + CYTO_BASE_NETWORK_NAME, + CYTO_COLLECTION_NAME, + CYTO_ITER_NEIGHBOUR_DEPTH, + CYTO_LAYOUT_NAME, + CYTO_LAYOUT_PROPERTIES, + CYTO_NUMBER_SUBGRAPHS, + CYTO_PATH_STYLESHEET, + CYTO_SELECTION_PROPERTY, + CYTO_STYLESHEET_NAME, + PROPERTY_NAME_DEGREE_WEIGHTED, + SAVE_PATH_FOLDER, +) +from lang_main.types import ( + CytoExportFileTypes, + CytoExportPageSizes, + CytoLayoutProperties, + CytoLayouts, + CytoNodeID, +) + + +# ** Cytoscape API related, using py4cytoscape +def import_to_cytoscape( + graph: DiGraph | Graph, +) -> None: + p4c.delete_all_networks() + p4c.create_network_from_networkx( + graph, + title=CYTO_BASE_NETWORK_NAME, + collection=CYTO_COLLECTION_NAME, + ) + p4c.analyze_network(directed=False) + + +def reset_current_network_to_base() -> None: + p4c.set_current_network(CYTO_BASE_NETWORK_NAME) + + +def export_network_to_image( + filename: str, + filetype: CytoExportFileTypes = 'SVG', + network_name: str = CYTO_BASE_NETWORK_NAME, + pdf_export_page_size: CytoExportPageSizes = 'A4', +) -> None: + # target_folder = Path.cwd() / 'results' + target_folder = SAVE_PATH_FOLDER + if not target_folder.exists(): + target_folder.mkdir(parents=True) + file_pth = target_folder / filename + + text_as_font = True + if filetype == 'SVG': + text_as_font = False + + p4c.export_image( + filename=str(file_pth), + type=filetype, + network=network_name, + overwrite_file=True, + all_graphics_details=True, + export_text_as_font=text_as_font, + page_size=pdf_export_page_size, + ) + + +def layout_network( + layout_name: CytoLayouts = CYTO_LAYOUT_NAME, + layout_properties: CytoLayoutProperties = CYTO_LAYOUT_PROPERTIES, + network_name: str = CYTO_BASE_NETWORK_NAME, +) -> None: + p4c.set_layout_properties(layout_name, layout_properties) + p4c.layout_network(layout_name=layout_name, network=network_name) + p4c.fit_content(selected_only=False, network=network_name) + + +def apply_style_to_network( + pth_to_stylesheet: Path = CYTO_PATH_STYLESHEET, + network_name: str = CYTO_BASE_NETWORK_NAME, +) -> None: + styles_avail = cast(list[str], p4c.get_visual_style_names()) + if CYTO_STYLESHEET_NAME not in styles_avail: + if not pth_to_stylesheet.exists(): + # existence for standard path verified at import, but not for other + # provided paths + raise FileNotFoundError( + f'Visual stylesheet for Cytoscape not found under: >>{pth_to_stylesheet}<<' + ) + p4c.import_visual_styles(str(pth_to_stylesheet)) + + p4c.set_visual_style(CYTO_STYLESHEET_NAME, network=network_name) + time.sleep(1) # if not waited image export could be without applied style + p4c.fit_content(selected_only=False, network=network_name) + + +def get_subgraph_node_selection( + network_name: str = CYTO_BASE_NETWORK_NAME, + property_degree_weighted: str = PROPERTY_NAME_DEGREE_WEIGHTED, +) -> list[CytoNodeID]: + node_table = p4c.get_table_columns(network=network_name) + node_table['stress_norm'] = node_table['Stress'] / node_table['Stress'].max() + node_table[CYTO_SELECTION_PROPERTY] = ( + node_table[property_degree_weighted] + * node_table['BetweennessCentrality'] + * node_table['stress_norm'] + ) + node_table = node_table.sort_values(by=CYTO_SELECTION_PROPERTY, ascending=False) + node_table_choice = node_table.iloc[:CYTO_NUMBER_SUBGRAPHS, :] + + return node_table_choice['SUID'].to_list() + + +def select_neighbours_of_node( + node: CytoNodeID, + network_name: str = CYTO_BASE_NETWORK_NAME, +) -> None: + p4c.clear_selection(network=network_name) + p4c.select_nodes(node, network=network_name) + + for _ in range(CYTO_ITER_NEIGHBOUR_DEPTH): + _ = p4c.select_first_neighbors(network=network_name) + + _ = p4c.select_edges_connecting_selected_nodes() + + +def make_subnetwork( + index: int, + network_name: str = CYTO_BASE_NETWORK_NAME, + export_image: bool = True, +) -> None: + subnetwork_name = network_name + f'_sub_{index+1}' + p4c.create_subnetwork( + nodes='selected', + edges='selected', + subnetwork_name=subnetwork_name, + network=network_name, + ) + p4c.set_current_network(subnetwork_name) + p4c.fit_content(selected_only=False, network=subnetwork_name) + if export_image: + export_network_to_image(filename=subnetwork_name, network_name=subnetwork_name) + + +def build_subnetworks( + nodes_to_analyse: Iterable[CytoNodeID], + network_name: str = CYTO_BASE_NETWORK_NAME, + export_image: bool = True, +) -> None: + for idx, node in enumerate(nodes_to_analyse): + select_neighbours_of_node(node=node, network_name=network_name) + make_subnetwork(index=idx, network_name=network_name, export_image=export_image) diff --git a/src/lang_main/types.py b/src/lang_main/types.py index 69130b0..dfcd371 100644 --- a/src/lang_main/types.py +++ b/src/lang_main/types.py @@ -1,5 +1,10 @@ import enum -from typing import Required, TypeAlias, TypedDict +from typing import ( + Literal, + Required, + TypeAlias, + TypedDict, +) import numpy as np from spacy.tokens.doc import Doc as SpacyDoc @@ -42,6 +47,43 @@ Embedding: TypeAlias = SpacyDoc | Tensor # ** graphs NodeTitle: TypeAlias = str EdgeWeight: TypeAlias = int +CytoExportFileTypes: TypeAlias = Literal[ + 'JPEG', + 'PDF', + 'PNG', + 'PS', + 'SVG', +] +CytoExportPageSizes: TypeAlias = Literal[ + 'A0', + 'A1', + 'A2', + 'A3', + 'A4', + 'A5', + 'Auto', + 'Legal', + 'Letter', + 'Tabloid', +] +CytoLayouts: TypeAlias = Literal[ + 'attribute-circle', + 'attribute-grid', + 'attributes-layout', + 'circular', + 'cose', + 'degree-circle', + 'force-directed', + 'force-directed-cl', + 'fruchterman-rheingold', + 'grid', + 'hierarchical', + 'isom', + 'kamada-kawai', + 'stacked-node-layout', +] +CytoLayoutProperties: TypeAlias = dict[str, float | bool] +CytoNodeID: TypeAlias = int class NodeData(TypedDict): diff --git a/test-notebooks/image.png b/test-notebooks/image.png index 9bb2abf..c8863fd 100644 Binary files a/test-notebooks/image.png and b/test-notebooks/image.png differ diff --git a/test-notebooks/lang_main.xml b/test-notebooks/lang_main.xml new file mode 100644 index 0000000..93adff8 --- /dev/null +++ b/test-notebooks/lang_main.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test-notebooks/lang_main_config.toml b/test-notebooks/lang_main_config.toml index fbd99b0..3c00289 100644 --- a/test-notebooks/lang_main_config.toml +++ b/test-notebooks/lang_main_config.toml @@ -16,6 +16,7 @@ preprocessing_skip = true token_analysis_skip = false graph_postprocessing_skip = false graph_rescaling_skip = false +graph_static_rendering_skip = false time_analysis_skip = true #[export_filenames] diff --git a/test-notebooks/misc.ipynb b/test-notebooks/misc.ipynb index 5713d08..a1a04ad 100644 --- a/test-notebooks/misc.ipynb +++ b/test-notebooks/misc.ipynb @@ -3,6 +3,17 @@ { "cell_type": "code", "execution_count": 1, + "id": "c930ce7b-e060-4021-b97c-192045f17122", + "metadata": {}, + "outputs": [], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2" + ] + }, + { + "cell_type": "code", + "execution_count": 5, "id": "af118d77-d87a-4687-be5b-e810a24c403e", "metadata": {}, "outputs": [ @@ -10,7 +21,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "2024-07-10 11:42:23 +0000 | io:INFO | Loaded TOML config file successfully.\n" + "2024-07-17 16:02:39 +0000 | io:INFO | Loaded TOML config file successfully.\n" ] }, { @@ -41,20 +52,21 @@ "from logging import NullHandler\n", "\n", "import numpy as np\n", + "import networkx as nx\n", "\n", "import py4cytoscape as p4c\n", - "import py4cytoscape.py4cytoscape_logger_settings as p4c_logging\n", - "p4c.set_summary_logger(False)\n", + "#import py4cytoscape.py4cytoscape_logger_settings as p4c_logging\n", + "#p4c.set_summary_logger(False)\n", "#p4c_logging._SUMMARY_LOG_LEVEL = 'ERROR'\n", "# p4c_logging._DETAIL_LOG_LEVEL = 'ERROR'\n", - "p4c.py4cytoscape_logger.detail_logger.setLevel('ERROR')\n", - "p4c.py4cytoscape_logger.detail_logger.removeHandler(p4c.py4cytoscape_logger.detail_handler)\n", - "p4c.py4cytoscape_logger.detail_logger.addHandler(NullHandler())" + "#p4c.py4cytoscape_logger.detail_logger.setLevel('ERROR')\n", + "#p4c.py4cytoscape_logger.detail_logger.removeHandler(p4c.py4cytoscape_logger.detail_handler)\n", + "#p4c.py4cytoscape_logger.detail_logger.addHandler(NullHandler())" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 6, "id": "4256081a-6364-4e8f-8cfd-799912ca6b94", "metadata": {}, "outputs": [], @@ -65,7 +77,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 7, "id": "e9a92ad6-5e63-49c4-b9e7-9f81da8549fe", "metadata": {}, "outputs": [], @@ -78,7 +90,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 8, "id": "c2421d89-ed8c-41dd-b363-ad5b5b716704", "metadata": {}, "outputs": [ @@ -86,7 +98,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "2024-07-10 11:01:10 +0000 | io:INFO | Loaded file successfully.\n" + "2024-07-17 16:02:46 +0000 | io:INFO | Loaded file successfully.\n" ] } ], @@ -127,17 +139,28 @@ }, { "cell_type": "code", - "execution_count": 19, - "id": "0d65a960-c17a-4710-9dc0-5ca0b6c16680", + "execution_count": 8, + "id": "66901689-8b95-400a-b2fb-11d3ea215512", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "tkg.rescaled_weights = False" + "tkg.rescaled_weights" ] }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 9, "id": "842e01fa-29cd-4028-9461-c7af24e01c33", "metadata": {}, "outputs": [ @@ -147,7 +170,7 @@ "{}" ] }, - "execution_count": 20, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -166,7 +189,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 10, "id": "1e61aca3-efea-4e38-8174-5ca4b2585256", "metadata": {}, "outputs": [], @@ -179,7 +202,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 11, "id": "5d83c04c-03ab-4086-a4e9-ae430e4c6090", "metadata": {}, "outputs": [ @@ -187,7 +210,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "2024-07-10 08:16:41 +0000 | io:INFO | Loaded file successfully.\n" + "2024-07-17 06:04:17 +0000 | io:INFO | Loaded file successfully.\n" ] } ], @@ -197,7 +220,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 12, "id": "4718b54e-0891-4f70-8c67-90c439bc8bfd", "metadata": {}, "outputs": [], @@ -207,17 +230,17 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 13, "id": "ddcb4ff0-eac4-45ba-9c6e-83ada4b0276c", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "TokenGraph(name: TokenGraph, number of nodes: 6028, number of edges: 17950)" + "TokenGraph(name: TokenGraph, number of nodes: 6859, number of edges: 25499)" ] }, - "execution_count": 24, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -327,14 +350,6 @@ "get_graph_metadata(undirected)" ] }, - { - "cell_type": "code", - "execution_count": null, - "id": "5c2934c5-2e19-4a33-b7bf-262993e3fabc", - "metadata": {}, - "outputs": [], - "source": [] - }, { "cell_type": "code", "execution_count": 12, @@ -771,7 +786,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 93, "id": "2a3be1eb-b289-46ab-8d70-53110ad2806c", "metadata": {}, "outputs": [], @@ -784,7 +799,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 94, "id": "64d8ba18-b1e2-470d-8bf5-9dd7cfec31de", "metadata": {}, "outputs": [ @@ -792,7 +807,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "2024-07-10 11:42:39 +0000 | io:INFO | Loaded file successfully.\n" + "2024-07-17 07:15:34 +0000 | io:INFO | Loaded file successfully.\n" ] } ], @@ -802,7 +817,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 95, "id": "d80522a0-c13a-42d3-af9d-8e10914c7831", "metadata": {}, "outputs": [], @@ -812,7 +827,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 96, "id": "4a19d096-27f8-4626-97ee-31c0f84a294f", "metadata": {}, "outputs": [ @@ -828,7 +843,7 @@ " 'total_memory': 20492}" ] }, - "execution_count": 6, + "execution_count": 96, "metadata": {}, "output_type": "execute_result" } @@ -837,17 +852,271 @@ "get_graph_metadata(tk_resc)" ] }, + { + "cell_type": "code", + "execution_count": 97, + "id": "86fe9b96-2e96-4a6c-a511-6a9c16b8fd63", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Wartungstätigkeit 3.1190000474452972\n", + "Vorgabe 4.145399987697601\n", + "Maschinenhersteller 2.0\n", + "Sichtkontrolle 0.8227999806404114\n", + "Reinigung 1.7093999981880188\n", + "Überprüfung 2.0071999728679657\n", + "Ölabscheider 0.7318999767303467\n", + "Kontrolle 6.2471999898552895\n", + "C-Anlage 0.6929000020027161\n", + "Stabbreithalter 0.5758000016212463\n" + ] + } + ], + "source": [ + "break_early = True\n", + "n = 10\n", + "\n", + "for idx, (node, weighted_degree) in enumerate(tk_resc.degree(weight='weight')):\n", + " if break_early and idx == n:\n", + " break\n", + " print(node, weighted_degree)" + ] + }, + { + "cell_type": "code", + "execution_count": 312, + "id": "420fd2db-98d0-48df-8a01-b4355778a6e9", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'Wartungstätigkeit': 3.1190000474452972,\n", + " 'Vorgabe': 4.145399987697601,\n", + " 'Maschinenhersteller': 2.0,\n", + " 'Sichtkontrolle': 0.8227999806404114,\n", + " 'Reinigung': 1.7093999981880188,\n", + " 'Überprüfung': 2.0071999728679657,\n", + " 'Ölabscheider': 0.7318999767303467,\n", + " 'Kontrolle': 6.2471999898552895,\n", + " 'C-Anlage': 0.6929000020027161,\n", + " 'Stabbreithalter': 0.5758000016212463,\n", + " 'Scharniere': 0.7002999782562256,\n", + " '--': 0.7002999782562256,\n", + " 'Schließvorrichtung': 0.7059999704360962,\n", + " 'Schloß': 0.7059999704360962,\n", + " 'Kompressorstation': 0.5514000058174133,\n", + " 'Wasseraufbereitungsanlage': 0.5105999708175659,\n", + " 'Heizungsanlage': 0.5101000070571899,\n", + " 'Druckkontrolle': 1.140199989080429,\n", + " 'bar': 1.2935999631881714,\n", + " 'machen': 1.4854000210762024,\n", + " 'gegebenenfalls': 0.4934000074863434,\n", + " 'Filter': 0.4934000074863434,\n", + " 'sauber': 0.4986000061035156,\n", + " 'Leiter': 0.6482000052928925,\n", + " 'Analyse': 0.42980000376701355,\n", + " 'Kesselwasser': 0.42980000376701355,\n", + " 'überprüfen': 0.42980000376701355,\n", + " 'Wasserverbrauch': 0.42980000376701355,\n", + " 'auffüllen': 0.7113999724388123,\n", + " 'Desifektionsmittel': 0.35569998621940613,\n", + " 'Aschenbecher': 0.7113999724388123,\n", + " 'leeren': 0.35569998621940613,\n", + " 'Wartung': 0.46550001204013824,\n", + " 'Toilette': 0.2621000111103058,\n", + " 'Wartungsplan': 2.1448000073432922,\n", + " 'sehen': 3.650799944996834,\n", + " 'Extradatum': 3.2020999789237976,\n", + " 'Kompensator': 0.20739999413490295,\n", + " 'Verschleiß': 0.6553999930620193,\n", + " 'Dichtigkeit': 0.4373999983072281,\n", + " 'Kühlturm': 0.20340000092983246,\n", + " 'schmieren': 1.4377999901771545,\n", + " 'Rieme': 0.4068000018596649,\n", + " 'Maschinenbediener': 0.5580000281333923,\n", + " 'Laserabteilung': 0.5580000281333923,\n", + " 'Arbeitsplan': 0.7273000031709671,\n", + " 'abarbeiten': 0.7170000076293945,\n", + " 'Küsters-Anlage': 0.6922999918460846,\n", + " 'Anlage': 0.6487999856472015,\n", + " 'Leckage': 0.7812000215053558,\n", + " 'prüfen': 1.5511000156402588,\n", + " 'abschmieren': 0.4147999882698059,\n", + " 'Lager': 0.4318999946117401,\n", + " 'Campen-Aufwickler': 0.20739999413490295,\n", + " 'Linearkugellager': 0.4399999976158142,\n", + " 'Campen-Abwickler': 0.20739999413490295,\n", + " 'Wumag-Trockner': 0.20739999413490295,\n", + " 'Gesamtanlage': 0.3847000002861023,\n", + " 'Beschädigung': 0.8136000037193298,\n", + " 'usw.': 0.8136000037193298,\n", + " 'Stand': 0.9007999897003174,\n", + " 'Stöppel': 0.6636999845504761,\n", + " '-Leiterprüfung': 0.8335999846458435,\n", + " 'Herr': 5.480200096964836,\n", + " 'Buschmann': 1.108900010585785,\n", + " 'derzeit': 1.4514999985694885,\n", + " 'Förster': 1.411899983882904,\n", + " 'terminieren': 0.44359999895095825,\n", + " 'reparieren': 0.1459999978542328,\n", + " 'Akku': 0.1282999962568283,\n", + " 'Firma': 3.6372000351548195,\n", + " 'Hawker': 0.1282999962568283,\n", + " 'Prüfung': 0.23270000517368317,\n", + " 'V': 0.1177000030875206,\n", + " 'Erste-Hilfe-Koffer': 0.11500000208616257,\n", + " 'orange': 0.11500000208616257,\n", + " 'Blombe': 0.46000000834465027,\n", + " 'vorhanden': 0.11500000208616257,\n", + " 'bitte': 0.11500000208616257,\n", + " 'Ticket': 0.48810001462697983,\n", + " 'Magazin': 0.48810001462697983,\n", + " 'Leiterprüfung': 0.19040000438690186,\n", + " 'Arbeit': 0.09520000219345093,\n", + " 'Abteilungsleiter': 0.48180001229047775,\n", + " 'Email': 1.6289000436663628,\n", + " 'Eigenverantwortlichkeit': 1.9827000498771667,\n", + " 'Mithilfe': 1.7449000477790833,\n", + " 'Graf': 1.884600043296814,\n", + " 'informieren': 0.5197000131011009,\n", + " 'Pflasterschrank': 0.11500000208616257,\n", + " 'Bedarf': 0.8617000207304955,\n", + " 'Verbandsmaterial': 0.3450000062584877,\n", + " 'Auflistung': 0.23000000417232513,\n", + " 'finden': 0.5750000104308128,\n", + " 'Extradate': 0.3450000062584877,\n", + " 'intern': 0.23000000417232513,\n", + " 'Objekt': 0.23000000417232513,\n", + " 'Wartungsarbeit': 0.4415999948978424,\n", + " 'Einrichtung': 0.2759999930858612,\n", + " 'Luftdruckkontrolle': 0.2759999930858612,\n", + " 'Abschmierung': 0.49140000343322754,\n", + " 'Ventilator': 0.49140000343322754,\n", + " 'Motor': 0.9828000068664551,\n", + " 'durchführen': 0.24570000171661377,\n", + " 'Monat': 0.4219000041484833,\n", + " 'Erledigungsdatum': 0.24570000171661377,\n", + " 'anschreiben': 0.24570000171661377,\n", + " 'Wechseln': 0.504800021648407,\n", + " 'V-Röhre': 0.2524000108242035,\n", + " 'Betriebsstunde': 0.2524000108242035,\n", + " 'Wäscherkontrolle': 0.49140000343322754,\n", + " 'Sitz': 0.15800000727176666,\n", + " 'Verschmutzung': 0.1256999969482422,\n", + " 'Sicherstellung': 0.1256999969482422,\n", + " 'Ausblasöffnung': 0.1256999969482422,\n", + " 'Fremdkörper': 0.1256999969482422,\n", + " 'anfragen': 0.45570001006126404,\n", + " 'Termin': 0.45570001006126404,\n", + " 'Menzel': 0.5950000286102295,\n", + " 'Vorbelegung': 1.5947999954223633,\n", + " 'Stehlagergehäuse': 0.4966000020503998,\n", + " 'M': 0.1177000030875206,\n", + " 'Moser': 0.2371000051498413,\n", + " 'Lagerung': 1.2455999702215195,\n", + " 'Palette': 0.6974999904632568,\n", + " 'Fach': 0.5480999797582626,\n", + " 'Hochregal': 0.5480999797582626,\n", + " 'Halle': 0.5480999797582626,\n", + " 'so': 0.5480999797582626,\n", + " 'zulässig': 0.5480999797582626,\n", + " 'tauschen': 0.22450000047683716,\n", + " 'reinigen': 0.530799999833107,\n", + " 'Rauwalze': 1.255899965763092,\n", + " 'Einziehwalze': 1.2551999688148499,\n", + " 'neu': 2.048299953341484,\n", + " 'überziehen': 0.573199987411499,\n", + " 'erfolgen': 0.11500000208616257,\n", + " 'Absprache': 0.09809999912977219,\n", + " 'Baugruppe': 0.704800009727478,\n", + " 'Pos.-Nr': 0.352400004863739,\n", + " 'Nr.': 0.5286000072956085,\n", + " 'Stückliste': 0.5286000072956085,\n", + " 'E-Nummer': 0.1762000024318695,\n", + " 'Bezeichnung': 0.1762000024318695,\n", + " 'verbauen': 0.352400004863739,\n", + " 'Hersteller': 0.1762000024318695,\n", + " 'Anzahl': 0.1762000024318695,\n", + " 'Schmierstoffmenge': 0.1762000024318695,\n", + " 'max.': 0.1762000024318695,\n", + " 'Wartungsintervall': 0.1762000024318695,\n", + " 'Wechselintervall': 0.1762000024318695,\n", + " 'Rollenkette-zweifach': 0.1762000024318695,\n", + " 'Öl': 0.1762000024318695,\n", + " 'E50': 0.1762000024318695,\n", + " 'Woche': 0.1762000024318695,\n", + " 'Kettbaum': 0.6245999932289124,\n", + " 'Gewind': 0.6347000002861023,\n", + " 'nachschneiden': 0.6347000002861023}" + ] + }, + "execution_count": 312, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dict(tk_resc.degree(weight='weight'))" + ] + }, + { + "cell_type": "code", + "execution_count": 98, + "id": "cafbd812-3292-4610-8fb4-0e230a3e63f4", + "metadata": {}, + "outputs": [], + "source": [ + "nx.set_node_attributes(tk_resc, dict(tk_resc.degree(weight='weight')), name='weight_degree')" + ] + }, + { + "cell_type": "code", + "execution_count": 102, + "id": "fac462a9-4fe0-408b-9fea-9bf3b05ac7a2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'weight_degree': 3.1190000474452972}\n", + "{'weight_degree': 4.145399987697601}\n", + "{'weight_degree': 2.0}\n", + "{'weight_degree': 0.8227999806404114}\n", + "{'weight_degree': 1.7093999981880188}\n", + "{'weight_degree': 2.0071999728679657}\n", + "{'weight_degree': 0.7318999767303467}\n", + "{'weight_degree': 6.2471999898552895}\n", + "{'weight_degree': 0.6929000020027161}\n", + "{'weight_degree': 0.5758000016212463}\n" + ] + } + ], + "source": [ + "break_early = True\n", + "n = 10\n", + "\n", + "for idx, node in enumerate(tk_resc.nodes):\n", + " if break_early and idx == n:\n", + " break\n", + " print(tk_resc.nodes[node])" + ] + }, { "cell_type": "code", "execution_count": null, - "id": "2272d230-6fe0-4ade-9a09-9f4277d9b58c", + "id": "86699c31-5679-4baa-a52a-d7e97dd77761", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 103, "id": "781d2906-f2cb-447a-b8b9-c82d9ae7e29f", "metadata": {}, "outputs": [ @@ -864,7 +1133,7 @@ "'You are connected to Cytoscape!'" ] }, - "execution_count": 7, + "execution_count": 103, "metadata": {}, "output_type": "execute_result" } @@ -876,7 +1145,99 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 164, + "id": "2262166f-8fc6-468d-a808-1ff79ac0a70a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['lang_main']" + ] + }, + "execution_count": 164, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "p4c.get_collection_list()" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "635ef0b3-0e22-4565-92ba-c1e50ff1c6ac", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "''" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "p4c.networks.delete_all_networks()" + ] + }, + { + "cell_type": "code", + "execution_count": 182, + "id": "2db0ecc6-15aa-49a7-baca-bee8a3faa27e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "''" + ] + }, + "execution_count": 182, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "p4c.networks.delete_network('test3')" + ] + }, + { + "cell_type": "code", + "execution_count": 207, + "id": "986a01f1-1b98-4d6b-bf4b-83d0ef306425", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 208, + "id": "fcc82b82-1bb5-484f-9d49-75de18ebddd4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "''" + ] + }, + "execution_count": 208, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "p4c.networks.delete_all_networks()" + ] + }, + { + "cell_type": "code", + "execution_count": 209, "id": "28b25e27-ed77-4c23-84d5-e3dec004e4fe", "metadata": {}, "outputs": [ @@ -891,55 +1252,1586 @@ { "data": { "text/plain": [ - "17998" + "20743" ] }, - "execution_count": 16, + "execution_count": 209, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "p4c.create_network_from_networkx(tk_resc, title='test', collection='lang_main')" + "\n", + "p4c.create_network_from_networkx(tk_resc, title=BASE_NAME, collection='lang_main')" ] }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 210, + "id": "a4871473-83b3-44ed-a6b0-45453975cdd6", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'networkTitle': 'test (undirected)',\n", + " 'nodeCount': '158',\n", + " 'edgeCount': '189',\n", + " 'avNeighbors': '2.3684210526315788',\n", + " 'diameter': '10',\n", + " 'radius': '5',\n", + " 'avSpl': '3.7965860597439547',\n", + " 'cc': '0.3375',\n", + " 'density': '0.06401137980085347',\n", + " 'heterogeneity': '1.0891156226526975',\n", + " 'centralization': '0.38888888888888895',\n", + " 'ncc': '27',\n", + " 'time': '0.003'}" + ] + }, + "execution_count": 210, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "p4c.tools.analyze_network(directed=False)" + ] + }, + { + "cell_type": "markdown", + "id": "9c0dc5a0-0686-459b-9e98-50ab8238ecb2", + "metadata": {}, + "source": [ + "---" + ] + }, + { + "cell_type": "code", + "execution_count": 282, + "id": "70104956-06d4-461b-ab4d-312d868f6e98", + "metadata": {}, + "outputs": [], + "source": [ + "BASE_NETWORK_NAME = 'test'\n", + "\n", + "def import_to_cytoscape(graph):\n", + " p4c.networks.delete_all_networks()\n", + " p4c.create_network_from_networkx(graph, title=BASE_NETWORK_NAME, collection='lang_main')\n", + " p4c.tools.analyze_network(directed=False)\n", + "\n", + "\n", + "def reset_current_network_to_base():\n", + " p4c.set_current_network(BASE_NETWORK_NAME)\n", + "\n", + "\n", + "def export_network_to_image(filename, filetype='SVG', network_name=BASE_NETWORK_NAME):\n", + " target_folder = Path.cwd() / 'results'\n", + " if not target_folder.exists():\n", + " target_folder.mkdir(parents=True)\n", + " file_pth = target_folder / filename\n", + "\n", + " text_as_font = True\n", + " if filetype == 'SVG':\n", + " text_as_font = False\n", + "\n", + " p4c.export_image(filename=str(file_pth), type=filetype, network=network_name, overwrite_file=True, all_graphics_details=True, export_text_as_font=text_as_font, page_size='A4')" + ] + }, + { + "cell_type": "code", + "execution_count": 283, + "id": "2c240f53-0f6c-4de3-adcb-7be4f051ca2a", + "metadata": {}, + "outputs": [], + "source": [ + "LAYOUT_NAME = 'force-directed'\n", + "LAYOUT_PROPERTIES = {\n", + " 'numIterations': 1000,\n", + " 'defaultSpringCoefficient': 1e-4,\n", + " 'defaultSpringLength': 45,\n", + " 'defaultNodeMass': 11,\n", + " 'isDeterministic': True,\n", + " 'singlePartition': False,\n", + "}\n", + "PATH_STYLESHEET = Path('lang_main.xml')\n", + "STYLESHEET_NAME = 'lang_main'\n", + "\n", + "def layout_network(layout_name=LAYOUT_NAME, layout_properties=LAYOUT_PROPERTIES, network_name=BASE_NETWORK_NAME):\n", + " p4c.set_layout_properties(layout_name, layout_properties)\n", + " p4c.layout_network(layout_name=layout_name, network=network_name)\n", + " p4c.fit_content(selected_only=False, network=network_name)\n", + "\n", + "\n", + "def apply_style_to_network(pth_to_stylesheet=PATH_STYLESHEET, network_name=BASE_NETWORK_NAME):\n", + " styles_avail = p4c.get_visual_style_names()\n", + " if STYLESHEET_NAME not in styles_avail:\n", + " p4c.import_visual_styles(pth_to_stylesheet)\n", + "\n", + " p4c.set_visual_style(STYLESHEET_NAME, network=network_name)\n", + " p4c.fit_content(selected_only=False, network=network_name)" + ] + }, + { + "cell_type": "code", + "execution_count": 304, + "id": "9759f36d-761f-45fc-a9d2-157aef08c1bf", + "metadata": {}, + "outputs": [], + "source": [ + "SELECTION_PROPERTY = 'node_selection'\n", + "SELECTION_NUMBER = 5\n", + "ITER_NEIGHBOUR_DEPTH = 2\n", + "\n", + "def get_sub_node_selection(network_name=BASE_NETWORK_NAME):\n", + " node_table = p4c.get_table_columns(network=network_name)\n", + " node_table['stress_norm'] = node_table['Stress'] / node_table['Stress'].max()\n", + " node_table[SELECTION_PROPERTY] = node_table['weight_degree'] * node_table['BetweennessCentrality'] * node_table['stress_norm']\n", + " node_table = node_table.sort_values(by=SELECTION_PROPERTY, ascending=False)\n", + " node_table_choice = node_table.iloc[:SELECTION_NUMBER,:]\n", + "\n", + " return node_table_choice['SUID'].to_list()\n", + "\n", + "\n", + "def select_neighbours_of_node(node, network_name=BASE_NETWORK_NAME):\n", + " p4c.clear_selection(network=network_name)\n", + " p4c.select_nodes(node, network=network_name)\n", + "\n", + " for _ in range(ITER_NEIGHBOUR_DEPTH):\n", + " _ = p4c.select_first_neighbors(network=network_name)\n", + "\n", + " _ = p4c.select_edges_connecting_selected_nodes()\n", + "\n", + "\n", + "def make_subnetwork(index, network_name=BASE_NETWORK_NAME, export_image=True):\n", + " subnetwork_name = network_name + f'_sub_{index+1}'\n", + " p4c.create_subnetwork(nodes='selected', edges='selected', subnetwork_name=subnetwork_name, network=network_name)\n", + " p4c.set_current_network(subnetwork_name)\n", + " p4c.fit_content(selected_only=False, network=network_name)\n", + " if export_image:\n", + " export_network_to_image(filename=subnetwork_name, network_name=subnetwork_name)\n", + "\n", + "\n", + "def build_subnetworks(nodes_to_analyse, network_name=BASE_NETWORK_NAME, export_image=True):\n", + " for idx, node in enumerate(nodes_to_analyse):\n", + " select_neighbours_of_node(node=node, network_name=network_name)\n", + " make_subnetwork(index=idx, network_name=network_name, export_image=export_image)" + ] + }, + { + "cell_type": "markdown", + "id": "facae316-6acb-4094-9eef-19bead44a813", + "metadata": {}, + "source": [ + "---\n", + "\n", + "1. import network\n", + "2. layouting\n", + "3. apply styles\n", + "4. export image\n", + "5. build subgraphs\n", + " 1. get candidates\n", + " 2. build subnetwork\n", + " 3. export subnetwork" + ] + }, + { + "cell_type": "code", + "execution_count": 305, + "id": "583d304d-571f-43f5-b8eb-905a01ddaec4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Applying default style...\n", + "Applying preferred layout\n" + ] + } + ], + "source": [ + "import_to_cytoscape(tk_resc)" + ] + }, + { + "cell_type": "code", + "execution_count": 306, + "id": "b13f2eb2-fa1e-495c-8e77-e992f78a69b6", + "metadata": {}, + "outputs": [], + "source": [ + "layout_network()" + ] + }, + { + "cell_type": "code", + "execution_count": 307, + "id": "60c1ca0f-ac73-4545-bffa-7eb656ade8fa", + "metadata": {}, + "outputs": [], + "source": [ + "apply_style_to_network()" + ] + }, + { + "cell_type": "code", + "execution_count": 308, + "id": "8cc5f1c0-0bb4-4e77-ba70-83ef449f37c8", + "metadata": {}, + "outputs": [], + "source": [ + "export_network_to_image(filename=BASE_NETWORK_NAME)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "040c4439-3c46-4d48-92ed-af9614f90cb0", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 309, + "id": "da0f7a3f-c7e5-4c50-85d9-16a90ff69011", + "metadata": {}, + "outputs": [], + "source": [ + "nodes_to_analyse = get_sub_node_selection()" + ] + }, + { + "cell_type": "code", + "execution_count": 310, + "id": "27a9cbc3-d852-4f5d-a6ee-92f97cf10db1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "No nodes selected.\n", + "No nodes selected.\n", + "No nodes selected.\n", + "No nodes selected.\n" + ] + } + ], + "source": [ + "build_subnetworks(nodes_to_analyse=nodes_to_analyse, export_image=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "74749a78-1afb-4158-8ab4-05b18b59e39e", + "metadata": {}, + "outputs": [], + "source": [ + "test = dict()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "9ec4f934-8ea5-401f-9f2f-86de478cec01", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "jo\n" + ] + } + ], + "source": [ + "if not test:\n", + " print('jo')" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "97905d05-483c-4e9a-b88d-00353ada870b", + "metadata": {}, + "outputs": [], + "source": [ + "from lang_main.render.cytoscape import layout_network" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "900868b3-7e3a-44c7-bef4-53c5a3e63e63", + "metadata": {}, + "outputs": [], + "source": [ + "layout_network()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d3369d18-0e29-4dc3-a7ba-bab8b356282f", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 296, + "id": "1dbbf2a3-6de3-4557-8966-40f12c55d755", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "41497" + ] + }, + "execution_count": 296, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "IDX = 0\n", + "nodes_to_select[IDX]" + ] + }, + { + "cell_type": "code", + "execution_count": 297, + "id": "3b3eebe1-90e8-429d-8099-96f6e59f7e18", + "metadata": {}, + "outputs": [], + "source": [ + "select_neighbours_of_node(nodes_to_select[IDX])" + ] + }, + { + "cell_type": "code", + "execution_count": 300, + "id": "c1b46f42-5837-4a77-9d7c-5780bd5057be", + "metadata": {}, + "outputs": [], + "source": [ + "build_subnetwork(IDX)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0558b387-e1c4-43b8-aa3c-4d3a182856f4", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3f215f7a-2cec-4ea8-8fc7-6b217fb3df7f", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "de481ea5-db5d-46ba-9eed-e7da476d895f", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "261bf119-4757-4840-a0b9-0d3d4fb77dd9", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8b5dfc7f-44fd-4f7b-a8a8-0cd3c73449b4", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 190, + "id": "2ce067f3-9647-489d-934e-fcdf1a2561f1", + "metadata": {}, + "outputs": [], + "source": [ + "node_table = p4c.get_table_columns(network=BASE_NAME)" + ] + }, + { + "cell_type": "code", + "execution_count": 191, + "id": "f4490242-0aac-46af-a913-08a627815587", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "pandas.core.frame.DataFrame" + ] + }, + "execution_count": 191, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(node_table)" + ] + }, + { + "cell_type": "code", + "execution_count": 192, + "id": "9bf840a7-e533-42e2-936a-2678f6bfc4ca", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
SUIDshared namenameselectedidweight_degreeAverageShortestPathLengthClusteringCoefficientClosenessCentralityIsSingleNode...SelfLoopsEccentricityStressDegreeBetweennessCentralityNeighborhoodConnectivityNumberOfDirectedEdgesNumberOfUndirectedEdgesRadialityTopologicalCoefficient
1861018610KontrolleKontrolleFalseKontrolle6.24722.2702700.0250000.440476False...051062160.7972971.8125000160.9206080.091346
1877818778HerrHerrFalseHerr5.48023.1142860.2948720.321101False...16962150.4028574.6923080140.8373630.329670
1879918799FirmaFirmaFalseFirma3.63723.5714290.1272730.280000False...071328110.4016812.8181820110.8021980.223140
1869418694sehensehenFalsesehen3.65083.1142860.3333330.321101False...06103470.2817934.571429070.8373630.268908
1871218712schmierenschmierenFalseschmieren1.43782.6216220.0666670.381443False...0662660.4699704.333333060.8986490.183333
..................................................................
1904819048E50E50FalseE500.17624.2432430.0000000.235669False...08010.0000004.000000010.7972970.000000
1904519045ÖlÖlFalseÖl0.17621.0000000.0000001.000000False...01010.0000001.000000011.0000000.000000
1904219042Rollenkette-zweifachRollenkette-zweifachFalseRollenkette-zweifach0.17621.0000000.0000001.000000False...01010.0000001.000000011.0000000.000000
1903919039WechselintervallWechselintervallFalseWechselintervall0.17621.0000000.0000001.000000False...01010.0000001.000000011.0000000.000000
1894318943MenzelMenzelFalseMenzel0.59504.5428570.0000000.220126False...08010.00000011.000000010.7274730.000000
\n", + "

158 rows × 21 columns

\n", + "
" + ], + "text/plain": [ + " SUID shared name name selected \\\n", + "18610 18610 Kontrolle Kontrolle False \n", + "18778 18778 Herr Herr False \n", + "18799 18799 Firma Firma False \n", + "18694 18694 sehen sehen False \n", + "18712 18712 schmieren schmieren False \n", + "... ... ... ... ... \n", + "19048 19048 E50 E50 False \n", + "19045 19045 Öl Öl False \n", + "19042 19042 Rollenkette-zweifach Rollenkette-zweifach False \n", + "19039 19039 Wechselintervall Wechselintervall False \n", + "18943 18943 Menzel Menzel False \n", + "\n", + " id weight_degree AverageShortestPathLength \\\n", + "18610 Kontrolle 6.2472 2.270270 \n", + "18778 Herr 5.4802 3.114286 \n", + "18799 Firma 3.6372 3.571429 \n", + "18694 sehen 3.6508 3.114286 \n", + "18712 schmieren 1.4378 2.621622 \n", + "... ... ... ... \n", + "19048 E50 0.1762 4.243243 \n", + "19045 Öl 0.1762 1.000000 \n", + "19042 Rollenkette-zweifach 0.1762 1.000000 \n", + "19039 Wechselintervall 0.1762 1.000000 \n", + "18943 Menzel 0.5950 4.542857 \n", + "\n", + " ClusteringCoefficient ClosenessCentrality IsSingleNode ... \\\n", + "18610 0.025000 0.440476 False ... \n", + "18778 0.294872 0.321101 False ... \n", + "18799 0.127273 0.280000 False ... \n", + "18694 0.333333 0.321101 False ... \n", + "18712 0.066667 0.381443 False ... \n", + "... ... ... ... ... \n", + "19048 0.000000 0.235669 False ... \n", + "19045 0.000000 1.000000 False ... \n", + "19042 0.000000 1.000000 False ... \n", + "19039 0.000000 1.000000 False ... \n", + "18943 0.000000 0.220126 False ... \n", + "\n", + " SelfLoops Eccentricity Stress Degree BetweennessCentrality \\\n", + "18610 0 5 1062 16 0.797297 \n", + "18778 1 6 962 15 0.402857 \n", + "18799 0 7 1328 11 0.401681 \n", + "18694 0 6 1034 7 0.281793 \n", + "18712 0 6 626 6 0.469970 \n", + "... ... ... ... ... ... \n", + "19048 0 8 0 1 0.000000 \n", + "19045 0 1 0 1 0.000000 \n", + "19042 0 1 0 1 0.000000 \n", + "19039 0 1 0 1 0.000000 \n", + "18943 0 8 0 1 0.000000 \n", + "\n", + " NeighborhoodConnectivity NumberOfDirectedEdges \\\n", + "18610 1.812500 0 \n", + "18778 4.692308 0 \n", + "18799 2.818182 0 \n", + "18694 4.571429 0 \n", + "18712 4.333333 0 \n", + "... ... ... \n", + "19048 4.000000 0 \n", + "19045 1.000000 0 \n", + "19042 1.000000 0 \n", + "19039 1.000000 0 \n", + "18943 11.000000 0 \n", + "\n", + " NumberOfUndirectedEdges Radiality TopologicalCoefficient \n", + "18610 16 0.920608 0.091346 \n", + "18778 14 0.837363 0.329670 \n", + "18799 11 0.802198 0.223140 \n", + "18694 7 0.837363 0.268908 \n", + "18712 6 0.898649 0.183333 \n", + "... ... ... ... \n", + "19048 1 0.797297 0.000000 \n", + "19045 1 1.000000 0.000000 \n", + "19042 1 1.000000 0.000000 \n", + "19039 1 1.000000 0.000000 \n", + "18943 1 0.727473 0.000000 \n", + "\n", + "[158 rows x 21 columns]" + ] + }, + "execution_count": 192, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "node_table.sort_values(by='Degree', ascending=False)" + ] + }, + { + "cell_type": "markdown", + "id": "b4ebe14c-2b23-4da2-8be6-2223add935af", + "metadata": {}, + "source": [ + "---" + ] + }, + { + "cell_type": "code", + "execution_count": 193, + "id": "7386bd66-1924-4199-84d2-a6d1a66def40", + "metadata": {}, + "outputs": [], + "source": [ + "node_table['stress_norm'] = node_table['Stress'] / node_table['Stress'].max()" + ] + }, + { + "cell_type": "code", + "execution_count": 194, + "id": "9422c085-e30e-4418-8c74-26d89edf0ad4", + "metadata": {}, + "outputs": [], + "source": [ + "node_table['w_deg with betweenness'] = node_table['weight_degree'] * node_table['BetweennessCentrality'] * node_table['stress_norm']" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e9795c94-cb76-452e-9eda-2285d050fd1b", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 195, + "id": "a2fb09ff-bf2e-48d1-9ceb-777efe0b0b40", + "metadata": {}, + "outputs": [], + "source": [ + "node_table_sorted = node_table.sort_values(by='w_deg with betweenness', ascending=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 196, + "id": "6ae4b7b9-75db-4b80-bd46-53ea25b06829", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
SUIDshared namenameselectedidweight_degreeAverageShortestPathLengthClusteringCoefficientClosenessCentralityIsSingleNode...StressDegreeBetweennessCentralityNeighborhoodConnectivityNumberOfDirectedEdgesNumberOfUndirectedEdgesRadialityTopologicalCoefficientstress_normw_deg with betweenness
1861018610KontrolleKontrolleFalseKontrolle6.24722.2702700.0250000.440476False...1062160.7972971.8125000160.9206080.0913460.6040963.008925
1858518585WartungstätigkeitWartungstätigkeitFalseWartungstätigkeit3.11902.7142860.1333330.368421False...175860.5714293.000000060.8681320.2424241.0000001.782286
1877818778HerrHerrFalseHerr5.48023.1142860.2948720.321101False...962150.4028574.6923080140.8373630.3296700.5472131.208102
1879918799FirmaFirmaFalseFirma3.63723.5714290.1272730.280000False...1328110.4016812.8181820110.8021980.2231400.7554041.103640
1859218592VorgabeVorgabeFalseVorgabe4.14542.8857140.4000000.346535False...110650.3154064.600000050.8549450.3833330.6291240.822570
\n", + "

5 rows × 23 columns

\n", + "
" + ], + "text/plain": [ + " SUID shared name name selected \\\n", + "18610 18610 Kontrolle Kontrolle False \n", + "18585 18585 Wartungstätigkeit Wartungstätigkeit False \n", + "18778 18778 Herr Herr False \n", + "18799 18799 Firma Firma False \n", + "18592 18592 Vorgabe Vorgabe False \n", + "\n", + " id weight_degree AverageShortestPathLength \\\n", + "18610 Kontrolle 6.2472 2.270270 \n", + "18585 Wartungstätigkeit 3.1190 2.714286 \n", + "18778 Herr 5.4802 3.114286 \n", + "18799 Firma 3.6372 3.571429 \n", + "18592 Vorgabe 4.1454 2.885714 \n", + "\n", + " ClusteringCoefficient ClosenessCentrality IsSingleNode ... Stress \\\n", + "18610 0.025000 0.440476 False ... 1062 \n", + "18585 0.133333 0.368421 False ... 1758 \n", + "18778 0.294872 0.321101 False ... 962 \n", + "18799 0.127273 0.280000 False ... 1328 \n", + "18592 0.400000 0.346535 False ... 1106 \n", + "\n", + " Degree BetweennessCentrality NeighborhoodConnectivity \\\n", + "18610 16 0.797297 1.812500 \n", + "18585 6 0.571429 3.000000 \n", + "18778 15 0.402857 4.692308 \n", + "18799 11 0.401681 2.818182 \n", + "18592 5 0.315406 4.600000 \n", + "\n", + " NumberOfDirectedEdges NumberOfUndirectedEdges Radiality \\\n", + "18610 0 16 0.920608 \n", + "18585 0 6 0.868132 \n", + "18778 0 14 0.837363 \n", + "18799 0 11 0.802198 \n", + "18592 0 5 0.854945 \n", + "\n", + " TopologicalCoefficient stress_norm w_deg with betweenness \n", + "18610 0.091346 0.604096 3.008925 \n", + "18585 0.242424 1.000000 1.782286 \n", + "18778 0.329670 0.547213 1.208102 \n", + "18799 0.223140 0.755404 1.103640 \n", + "18592 0.383333 0.629124 0.822570 \n", + "\n", + "[5 rows x 23 columns]" + ] + }, + "execution_count": 196, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "node_table_sorted.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 197, + "id": "a5f22fd0-e002-43ec-8dc3-99eb52f8bcd2", + "metadata": {}, + "outputs": [], + "source": [ + "node_table_choice = node_table_sorted.iloc[:5,:]" + ] + }, + { + "cell_type": "code", + "execution_count": 198, + "id": "c123cdd7-f000-4a60-9dc2-73b8a4410e31", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
SUIDshared namenameselectedidweight_degreeAverageShortestPathLengthClusteringCoefficientClosenessCentralityIsSingleNode...StressDegreeBetweennessCentralityNeighborhoodConnectivityNumberOfDirectedEdgesNumberOfUndirectedEdgesRadialityTopologicalCoefficientstress_normw_deg with betweenness
1861018610KontrolleKontrolleFalseKontrolle6.24722.2702700.0250000.440476False...1062160.7972971.8125000160.9206080.0913460.6040963.008925
1858518585WartungstätigkeitWartungstätigkeitFalseWartungstätigkeit3.11902.7142860.1333330.368421False...175860.5714293.000000060.8681320.2424241.0000001.782286
1877818778HerrHerrFalseHerr5.48023.1142860.2948720.321101False...962150.4028574.6923080140.8373630.3296700.5472131.208102
1879918799FirmaFirmaFalseFirma3.63723.5714290.1272730.280000False...1328110.4016812.8181820110.8021980.2231400.7554041.103640
1859218592VorgabeVorgabeFalseVorgabe4.14542.8857140.4000000.346535False...110650.3154064.600000050.8549450.3833330.6291240.822570
\n", + "

5 rows × 23 columns

\n", + "
" + ], + "text/plain": [ + " SUID shared name name selected \\\n", + "18610 18610 Kontrolle Kontrolle False \n", + "18585 18585 Wartungstätigkeit Wartungstätigkeit False \n", + "18778 18778 Herr Herr False \n", + "18799 18799 Firma Firma False \n", + "18592 18592 Vorgabe Vorgabe False \n", + "\n", + " id weight_degree AverageShortestPathLength \\\n", + "18610 Kontrolle 6.2472 2.270270 \n", + "18585 Wartungstätigkeit 3.1190 2.714286 \n", + "18778 Herr 5.4802 3.114286 \n", + "18799 Firma 3.6372 3.571429 \n", + "18592 Vorgabe 4.1454 2.885714 \n", + "\n", + " ClusteringCoefficient ClosenessCentrality IsSingleNode ... Stress \\\n", + "18610 0.025000 0.440476 False ... 1062 \n", + "18585 0.133333 0.368421 False ... 1758 \n", + "18778 0.294872 0.321101 False ... 962 \n", + "18799 0.127273 0.280000 False ... 1328 \n", + "18592 0.400000 0.346535 False ... 1106 \n", + "\n", + " Degree BetweennessCentrality NeighborhoodConnectivity \\\n", + "18610 16 0.797297 1.812500 \n", + "18585 6 0.571429 3.000000 \n", + "18778 15 0.402857 4.692308 \n", + "18799 11 0.401681 2.818182 \n", + "18592 5 0.315406 4.600000 \n", + "\n", + " NumberOfDirectedEdges NumberOfUndirectedEdges Radiality \\\n", + "18610 0 16 0.920608 \n", + "18585 0 6 0.868132 \n", + "18778 0 14 0.837363 \n", + "18799 0 11 0.802198 \n", + "18592 0 5 0.854945 \n", + "\n", + " TopologicalCoefficient stress_norm w_deg with betweenness \n", + "18610 0.091346 0.604096 3.008925 \n", + "18585 0.242424 1.000000 1.782286 \n", + "18778 0.329670 0.547213 1.208102 \n", + "18799 0.223140 0.755404 1.103640 \n", + "18592 0.383333 0.629124 0.822570 \n", + "\n", + "[5 rows x 23 columns]" + ] + }, + "execution_count": 198, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "node_table_choice" + ] + }, + { + "cell_type": "code", + "execution_count": 199, + "id": "6f68b890-6c80-4750-a35c-ee29b594462d", + "metadata": {}, + "outputs": [], + "source": [ + "nodes_to_select = node_table_choice['SUID'].to_list()" + ] + }, + { + "cell_type": "code", + "execution_count": 200, + "id": "6d94b18f-2590-4d1b-b165-300466bfd1b1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "''" + ] + }, + "execution_count": 200, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "p4c.clear_selection()" + ] + }, + { + "cell_type": "code", + "execution_count": 239, + "id": "62cf521b-e709-4086-9f3d-3e3f8dd9faaa", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{}" + ] + }, + "execution_count": 239, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "p4c.select_nodes(nodes_to_select[0])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdeeccd4-3e7c-4c76-a024-f45540142c4a", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 202, + "id": "a371ce7a-d9b9-4158-a0cb-797834a16f97", + "metadata": {}, + "outputs": [], + "source": [ + "iter_depth = 2\n", + "\n", + "for _ in range(iter_depth):\n", + " _ = p4c.select_first_neighbors()" + ] + }, + { + "cell_type": "code", + "execution_count": 203, + "id": "cce979e2-65f1-4896-8758-659ff21c315b", + "metadata": {}, + "outputs": [], + "source": [ + "_ = p4c.select_edges_connecting_selected_nodes()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "23157e10-02c6-4adb-8a36-4bdbfe5f9f4b", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 206, + "id": "2038fd62-b75f-4ba1-b258-53789b4665b7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "20402" + ] + }, + "execution_count": 206, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "p4c.create_subnetwork(nodes='selected', edges='selected', subnetwork_name='test_sub_1')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "12828271-fea9-4e4a-98c3-87860992a6db", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f367b253-2172-4dce-9379-a3ed95f3368e", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "49ad6a55-2a12-44c4-a193-2fbb3da84bcf", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 205, + "id": "7de95550-c077-467f-a962-5e84ddf430c7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{}" + ] + }, + "execution_count": 205, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "p4c.fit_content(selected_only=False)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b73934d1-f16a-4ef9-8969-b1be8e7310f5", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "783cb7d6-c6b1-4a9b-8019-02ce2628dde9", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 314, "id": "697647da-3b8b-4029-bec9-af2e2bb6984a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'Attribute Grid Layout': 'attribute-grid',\n", - " 'Degree Sorted Circle Layout': 'degree-circle',\n", - " 'Group Attributes Layout': 'attributes-layout',\n", - " 'Edge-weighted Spring Embedded Layout': 'kamada-kawai',\n", - " 'Prefuse Force Directed Layout': 'force-directed',\n", - " 'Compound Spring Embedder (CoSE)': 'cose',\n", - " 'Hierarchical Layout': 'hierarchical',\n", - " 'Attribute Circle Layout': 'attribute-circle',\n", - " 'Stacked Node Layout': 'stacked-node-layout',\n", - " 'Circular Layout': 'circular',\n", - " 'Grid Layout': 'grid',\n", - " 'Edge-weighted Force directed (BioLayout)': 'fruchterman-rheingold',\n", - " 'Inverted Self-Organizing Map Layout': 'isom',\n", - " 'Prefuse Force Directed OpenCL Layout': 'force-directed-cl'}" + "['attribute-circle',\n", + " 'attribute-grid',\n", + " 'attributes-layout',\n", + " 'circular',\n", + " 'cose',\n", + " 'degree-circle',\n", + " 'force-directed',\n", + " 'force-directed-cl',\n", + " 'fruchterman-rheingold',\n", + " 'grid',\n", + " 'hierarchical',\n", + " 'isom',\n", + " 'kamada-kawai',\n", + " 'stacked-node-layout']" ] }, - "execution_count": 17, + "execution_count": 314, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "p4c.get_layout_name_mapping()" + "sorted(list(p4c.get_layout_name_mapping().values()))" ] }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 186, "id": "fa15c057-d453-4c7e-8af2-18220ea90651", "metadata": {}, "outputs": [ @@ -954,7 +2846,7 @@ " 'singlePartition']" ] }, - "execution_count": 18, + "execution_count": 186, "metadata": {}, "output_type": "execute_result" } @@ -965,24 +2857,25 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 259, "id": "6f48d9cc-f527-4b33-9477-60636a480371", "metadata": {}, "outputs": [], "source": [ - "layout_props = {\n", + "LAYOUT_NAME = 'force-directed'\n", + "LAYOUT_PROPERTIES = {\n", " 'numIterations': 1000,\n", - " 'defaultSpringCoefficient': 1e-4,\n", - " 'defaultSpringLength': 45,\n", - " 'defaultNodeMass': 12,\n", - " 'isDeterministic': True,\n", - " 'singlePartition': False,\n", + " 'defaultSpringCoefficient': 1e-4,\n", + " 'defaultSpringLength': 45,\n", + " 'defaultNodeMass': 11,\n", + " 'isDeterministic': True,\n", + " 'singlePartition': False,\n", "}" ] }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 188, "id": "d542b2ea-11d5-4802-b1b9-65e5e12f6d38", "metadata": {}, "outputs": [ @@ -992,39 +2885,27 @@ "''" ] }, - "execution_count": 20, + "execution_count": 188, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "p4c.set_layout_properties('force-directed', layout_props)" + "p4c.set_layout_properties('force-directed', layout_props)\n", + "#p4c.get_layout_property_type('kamada-kawai', 'randomize')" ] }, { "cell_type": "code", - "execution_count": 31, - "id": "514e3f07-061e-4488-a770-02ef13b56dcd", + "execution_count": null, + "id": "8eb62660-27a6-43a0-be19-4c4479eac8d7", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'boolean'" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "p4c.get_layout_property_type('kamada-kawai', 'randomize')" - ] + "outputs": [], + "source": [] }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 189, "id": "c1069996-b638-4bfa-8ad4-f750a33022d6", "metadata": {}, "outputs": [ @@ -1034,29 +2915,117 @@ "{}" ] }, - "execution_count": 21, + "execution_count": 189, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "p4c.layout_network('force-directed', 'test')" + "p4c.layout_network(layout_name='force-directed', network='test3')" ] }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, + "id": "c7f5c1e6-8e32-4e90-b531-38611fef85ce", + "metadata": {}, + "outputs": [], + "source": [ + "p4c.fit_content(selected_only=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "8802c969-c3f4-433a-8cab-c6704fa03039", + "metadata": {}, + "outputs": [], + "source": [ + "# visual style gets always imported with increasing index,\n", + "# later check if style in Cytoscape is already available\n", + "styles_avail = p4c.get_visual_style_names()" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "1b6023ef-b4a2-4cf3-92ef-01419fc5258a", + "metadata": {}, + "outputs": [], + "source": [ + "if 'lang_main' not in styles_avail:\n", + " p4c.import_visual_styles('lang_main.xml')" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "3e27695b-5b26-4176-9bc9-adb91d848025", + "metadata": {}, + "outputs": [], + "source": [ + "assert 'lang_main' in p4c.get_visual_style_names()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4083b72d-f321-4489-be19-6167f13ab226", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "59234fed-cc38-4ee3-9ef8-9180e7785ea5", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'message': 'Visual Style applied.'}" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "p4c.set_visual_style('lang_main')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2653d1af-b3a5-4da7-9066-0940cb913dab", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fd5fd222-75fd-4523-8401-a4a37c6010fd", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 79, "id": "d972ff5a-e695-43b6-b8c5-ab295fd5de3d", "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "iVBORw0KGgoAAAANSUhEUgAABBcAAAHoCAYAAAASQAdaAACAAElEQVR4Xuzd+VNjWZYn+P53ammrmenpsun5oarHqqfNembMuju7y9q6pm2mrdbMya7MrM6tsjIyKjIyY/GI8Ihwj/A93ME3cMBxnH1fxSqxCARIQiuSEAIh9sVZz+h7CeHiPQECSSDE94ePAfc9iU3Lu+eee84/2RARIiIiIiIiIqKz+ifaASIiIiIiIiKi02BwgYiIiIiIiIhSwuACEREREREREaWEwQUiIiIiIiIiSgmDC0RERERERESUEgYXiIiIiIiIiCglDC4QERERERERUUoYXCAiIiIiIiKilDC4QEREREREREQpYXCBiIiIiIiIiFLC4AIRERERERERpYTBBSIiIiIiIiJKCYMLRERERERERJQSBheIiIiIiIiIKCUMLhARERERERFRShhcICIiIiIiIqKUMLhARERERERERClhcIGIiIiIiIiIUsLgAhERERERERGlhMEFIiIiIiIiIkoJgwtERERERERElBIGF4iIiIiIiIgoJQwuEBEREREREVFKGFwgIiIiIiIiopQwuEBEREREREREKWFwgYiIiIiIiIhSwuACEREREREREaWEwYWo5b0NmduJyLrs6Y4RERERXQaLuyuysLuoGyeiw1b23nx77b+rO0aXD1738PqnHc91a3tb6nG8uretO3ZRrnxwYWlvTbyOWxJu+654Voy640RERETZbnZnRgKD/yih3p9IcNunO05E+xBYcHseylzLX4l7yaA7TpcLXu/wuofXP7wOao/nqjXZEWfwpcw1/4U4ZyuzZpH8ygcXZrdDsljzn2Xv3u+I25unO05ERESU7SY3J2Tryf8iuw9+X1yr/brjRLQPK72YkOHa32u/qTtOl8Pa7p4MTARkZKZTve7h9Q+vg9rzctXS7pqEen+qHsdTA+/Kyt6m7pyLcOWDC0gjsc7UqReX4LZfd5yIiIgo23nnQzLhKxT3ZL5EdhZ0x+ky2lMT4cXd1QTH6KzGfCEZDTWL1/qFBDZduuOU3cJrG/K81iQPXnWKYdgtM5sRcXry1evfVdoaMTY5I+ZQp3jHr4tv3aI7flGufHAB7pXup0St7+7K0sbGkZY3syMiRERERBTv3kuDzL/ZUp+vbm/rrmFi1veyI3WWDlvc3BbHdEStxA45pxTXyqjM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dNy7Li03PpP6d14Tb2eDjDY+sLyXiIiIiIiIyIkYXCiw+dVVmV9elvmVFSm/ck2ik2H1eunFC8t7iYiIiIiIiJyIwYUietrjlS5PxLKciIiIiIiIyMkYXCii5Y1NOXO7ybKciIiIiIiIyMkYXCiyzyoYXCAiIiIiIqKDhcGFIrte3SXRpVXLciIiIiIiIiKnYnChyJ50emQkErMsJyIiIiIiInIqBheKrHkwKD3ecctyIiIiIiIiIqdicKHIOt1haXOFLMuJiIiIiIiInIrBhSLjsAgiIiIiIiI6aBhcKLKyJz1M6EhEREREREQHCoMLRYapKFe3rMuJiIiIiIiInIrBhSJa2dySM7ebLMuJiIiIiIiInIzBhSLCLBF1PV7LciIiIiIiIiInY3ChiE7erJfF9Q3LciIiIiIiIiInY3ChSFzhmFQ2DlqWExERERERETkdgwsFFtuIid9/WtyRMpldX7KsJyIiIiIiInI6BhcKzDdXK1unviLPrv22RNb8lvVERERERERETsfgQoGFX3hlqvF1CfW/LTMbcct6IiIiIiIiIqdjcKEI4huzsrC5IqtbW7KysbEvvE//DiIiIiIiIiK7YnChiKKzszIZje4L79M/S0RERERERGRXDC4Ukafhvox21Il/oF1CXpd4mh7JaEuN9N46LeGgV3zdzTLS8EAmwgHLZ4mIiIiIiIjsisGFIhp5ele6rnwkrcd/ZLyulM4Lh6X7xnEZqLosI3X3pPP8Yem5fkxGmx9ZPktERERERERkVwwuFBHyKSy9eCFLa2vbkl8nwfv0zxIRERERERHZFYMLRERERERERJQTBheIiIiIiIiIKCcMLhARERERERFRThhcICIiIiIiIqKcMLhARERERERERDlhcIGIiIiIiIiIcsLgAhERERERERHlhMEFIiIiIiIiIsoJgwtERERERERElBMGF4iIiIiIiIgoJwwuEBEREREREVFOGFwgIiIiIiIiopwwuEBEREREREREOWFwgYiIiIiIiIhywuACEREREREREeWEwQUiIiIiIiIiygmDC0RERERERESUEwYXiIiIiIiIiCgnDC4QERERERERUU4YXCAiIiIiIiKinDC4QEREREREREQ5YXCBiIiIiIiIiHLC4AIRERERERER5YTBBSIiIiIiIiLKyf8HvdS365Byg7wAAAAASUVORK5CYII=", "text/plain": [ "" ] }, - "execution_count": 22, + "execution_count": 79, "metadata": {}, "output_type": "execute_result" } @@ -1066,12 +3035,14 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "b2209508-dd98-4d10-8efc-099e2cd0ab50", + "cell_type": "markdown", + "id": "a45fce84-bbb9-476a-8be3-5eb7b082afed", "metadata": {}, - "outputs": [], - "source": [] + "source": [ + "- graph properties in Cytoscape or pre-calculated?\n", + "- node sizes depending on graph properties\n", + "- edge width depending on graph properties" + ] }, { "cell_type": "code", diff --git a/test-notebooks/styles_template.xml b/test-notebooks/styles_template.xml new file mode 100644 index 0000000..a2090a9 --- /dev/null +++ b/test-notebooks/styles_template.xml @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +