dapps 0.0.2__tar.gz → 0.0.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. {dapps-0.0.2 → dapps-0.0.3}/.github/workflows/tag-and-release.yml +10 -9
  2. dapps-0.0.3/PKG-INFO +109 -0
  3. dapps-0.0.3/README.md +65 -0
  4. dapps-0.0.3/VERSION +1 -0
  5. {dapps-0.0.2 → dapps-0.0.3}/examples/spectrum_dapp.py +34 -6
  6. dapps-0.0.3/pyproject.toml +66 -0
  7. {dapps-0.0.2 → dapps-0.0.3}/src/visualization/templates/index.html +13 -6
  8. dapps-0.0.2/PKG-INFO +0 -83
  9. dapps-0.0.2/README.md +0 -42
  10. dapps-0.0.2/VERSION +0 -1
  11. dapps-0.0.2/pyproject.toml +0 -58
  12. {dapps-0.0.2 → dapps-0.0.3}/.github/workflows/mirror.yml +0 -0
  13. {dapps-0.0.2 → dapps-0.0.3}/.gitignore +0 -0
  14. {dapps-0.0.2 → dapps-0.0.3}/LICENSE +0 -0
  15. {dapps-0.0.2 → dapps-0.0.3}/MANIFEST.in +0 -0
  16. {dapps-0.0.2 → dapps-0.0.3}/docker/Dockerfile +0 -0
  17. {dapps-0.0.2 → dapps-0.0.3}/docker/build.sh +0 -0
  18. {dapps-0.0.2 → dapps-0.0.3}/docs/dapp_uml.txt +0 -0
  19. {dapps-0.0.2 → dapps-0.0.3}/docs/gui_uml.txt +0 -0
  20. {dapps-0.0.2 → dapps-0.0.3}/e3protocol/README.md +0 -0
  21. {dapps-0.0.2 → dapps-0.0.3}/e3protocol/build_asn.sh +0 -0
  22. {dapps-0.0.2 → dapps-0.0.3}/e3protocol/client/client.c +0 -0
  23. {dapps-0.0.2 → dapps-0.0.3}/e3protocol/dump_packets.sh +0 -0
  24. {dapps-0.0.2 → dapps-0.0.3}/e3protocol/server/server.py +0 -0
  25. {dapps-0.0.2 → dapps-0.0.3}/e3protocol/wrapper/e3.c +0 -0
  26. {dapps-0.0.2 → dapps-0.0.3}/e3protocol/wrapper/e3.h +0 -0
  27. {dapps-0.0.2 → dapps-0.0.3}/src/dapp/__init__.py +0 -0
  28. {dapps-0.0.2 → dapps-0.0.3}/src/dapp/dapp.py +0 -0
  29. {dapps-0.0.2 → dapps-0.0.3}/src/e3interface/__init__.py +0 -0
  30. {dapps-0.0.2 → dapps-0.0.3}/src/e3interface/defs/e3.asn +0 -0
  31. {dapps-0.0.2 → dapps-0.0.3}/src/e3interface/e3_connector.py +0 -0
  32. {dapps-0.0.2 → dapps-0.0.3}/src/e3interface/e3_interface.py +0 -0
  33. {dapps-0.0.2 → dapps-0.0.3}/src/e3interface/e3_logging.py +0 -0
  34. {dapps-0.0.2 → dapps-0.0.3}/src/spectrum/__init__.py +0 -0
  35. {dapps-0.0.2 → dapps-0.0.3}/src/spectrum/spectrum_dapp.py +0 -0
  36. {dapps-0.0.2 → dapps-0.0.3}/src/visualization/__init__.py +0 -0
  37. {dapps-0.0.2 → dapps-0.0.3}/src/visualization/dashboard.py +0 -0
  38. {dapps-0.0.2 → dapps-0.0.3}/src/visualization/energy.py +0 -0
  39. {dapps-0.0.2 → dapps-0.0.3}/src/visualization/grafana.py +0 -0
  40. {dapps-0.0.2 → dapps-0.0.3}/src/visualization/influx.py +0 -0
  41. {dapps-0.0.2 → dapps-0.0.3}/src/visualization/iq.py +0 -0
@@ -9,7 +9,7 @@ jobs:
9
9
  create-tag:
10
10
  runs-on: ubuntu-latest
11
11
  outputs:
12
- version: ${{ steps.set_version.outputs.version }}
12
+ version: ${{ steps.get_version.outputs.version }}
13
13
  tag_created: ${{ steps.set_output.outputs.tag_created }}
14
14
  steps:
15
15
  - name: Checkout repository
@@ -48,11 +48,6 @@ jobs:
48
48
  echo "tag_created=false" >> $GITHUB_OUTPUT
49
49
  fi
50
50
 
51
- - name: Set version output
52
- id: set_version
53
- run: |
54
- echo "version=${{ steps.get_version.outputs.version }}" >> $GITHUB_OUTPUT
55
-
56
51
  build:
57
52
  name: Build distribution 📦
58
53
  runs-on: ubuntu-latest
@@ -78,7 +73,9 @@ jobs:
78
73
 
79
74
  publish-to-pypi:
80
75
  name: Publish to PyPI
81
- needs: build
76
+ needs:
77
+ - build
78
+ - create-tag
82
79
  runs-on: ubuntu-latest
83
80
  if: ${{ needs.create-tag.outputs.tag_created == 'true' && github.repository == 'wineslab/dApp-library' }}
84
81
  environment:
@@ -97,7 +94,9 @@ jobs:
97
94
 
98
95
  github-release:
99
96
  name: Sign packages with Sigstore and upload them to GitHub Release
100
- needs: publish-to-pypi
97
+ needs:
98
+ - publish-to-pypi
99
+ - create-tag
101
100
  runs-on: ubuntu-latest
102
101
  if: ${{ needs.create-tag.outputs.tag_created == 'true' && github.repository == 'wineslab/dApp-library' }}
103
102
  permissions:
@@ -126,7 +125,9 @@ jobs:
126
125
 
127
126
  publish-to-testpypi:
128
127
  name: Publish to TestPyPI
129
- needs: build
128
+ needs:
129
+ - publish-to-pypi
130
+ - create-tag
130
131
  runs-on: ubuntu-latest
131
132
  if: ${{ needs.create-tag.outputs.tag_created == 'true' && github.repository == 'wineslab/dApp-library' }}
132
133
  environment:
dapps-0.0.3/PKG-INFO ADDED
@@ -0,0 +1,109 @@
1
+ Metadata-Version: 2.4
2
+ Name: dapps
3
+ Version: 0.0.3
4
+ Summary: A library for creating and connecting dApps to Open RAN units.
5
+ Project-URL: Homepage, https://openrangym.com/o-ran-frameworks/dapps
6
+ Project-URL: Package, https://pypi.org/project/dapps/
7
+ Project-URL: Source, https://github.com/wineslab/dApp-library
8
+ Project-URL: Bug Tracker, https://github.com/wineslab/dApp-library/issues
9
+ Author-email: Andrea Lacava <thecave003@gmail.com>
10
+ License-File: LICENSE
11
+ Keywords: 5G,O-RAN,cellular,dApps,networks
12
+ Classifier: Development Status :: 4 - Beta
13
+ Classifier: Programming Language :: Python
14
+ Classifier: Programming Language :: Python :: 3.8
15
+ Classifier: Programming Language :: Python :: 3.9
16
+ Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Programming Language :: Python :: Implementation :: CPython
20
+ Classifier: Programming Language :: Python :: Implementation :: PyPy
21
+ Requires-Python: >=3.8
22
+ Requires-Dist: asn1tools
23
+ Requires-Dist: numpy
24
+ Requires-Dist: pyzmq
25
+ Requires-Dist: typing-extensions
26
+ Provides-Extra: all
27
+ Requires-Dist: flask; extra == 'all'
28
+ Requires-Dist: flask-socketio; extra == 'all'
29
+ Requires-Dist: influxdb-client; extra == 'all'
30
+ Requires-Dist: libiq; extra == 'all'
31
+ Requires-Dist: matplotlib; extra == 'all'
32
+ Requires-Dist: pysctp; extra == 'all'
33
+ Provides-Extra: api
34
+ Requires-Dist: influxdb-client; extra == 'api'
35
+ Provides-Extra: cnn
36
+ Requires-Dist: libiq; extra == 'cnn'
37
+ Provides-Extra: gui
38
+ Requires-Dist: flask; extra == 'gui'
39
+ Requires-Dist: flask-socketio; extra == 'gui'
40
+ Requires-Dist: matplotlib; extra == 'gui'
41
+ Provides-Extra: network
42
+ Requires-Dist: pysctp; extra == 'network'
43
+ Description-Content-Type: text/markdown
44
+
45
+ # dApp Library
46
+
47
+ A complete tutorial on how to deploy a dApp can be found on the [OpenRAN Gym website](https://openrangym.com/tutorials/dapps-oai). Please refer to that guide to instrument your system.
48
+
49
+ ## Installation
50
+
51
+ ### Python package installation
52
+
53
+ ```
54
+ pip3 install dapps[all]
55
+ ```
56
+
57
+ ### Manual installation
58
+ Clone the repository and install it manually
59
+
60
+ ```
61
+ hatch build
62
+ pip3 install dist/*.tar.gz
63
+ ```
64
+
65
+ ### Launch the Spectrum Sharing dApp
66
+
67
+ OAI should start _before_ running the dApp
68
+
69
+ ```python
70
+ python3 examples/spectrum_dapp.py
71
+ ```
72
+
73
+ This dApp implements a spectrum sharing use case discussed in [our paper](https://arxiv.org/pdf/2501.16502).
74
+
75
+
76
+ The dApp can be controlled through the following command-line arguments:
77
+
78
+ - `--ota` (store_true, default: False): Specify if this is OTA or on Colosseum
79
+ - `--link` (str, default: 'zmq', choices: [layer.value for layer in E3LinkLayer]): Specify the link layer to be used
80
+ - `--transport` (str, default: 'ipc', choices: [layer.value for layer in E3TransportLayer]): Specify the transport layer to be used
81
+ - `--save-iqs` (store_true, default: False): Specify if this is data collection run or not. In the first case I/Q samples will be saved
82
+ - `--control` (store_true, default: False): Set whether to perform control of PRB
83
+ - `--energy-gui` (store_true, default: False): Set whether to enable the energy GUI
84
+ - `--iq-plotter-gui` (store_true, default: False): Set whether to enable the IQ Plotter GUI
85
+ - `--demo-gui` (store_true, default: False): Set whether to enable the Demo GUI
86
+ - `--timed` (store_true, default: False): Run with a 5-minute time limit
87
+ - `--model` (str, default: ''): Path to the CNN model file to be used
88
+ - `--time-window` (int, default: 5): Number of input vectors to pass to the CNN model
89
+ - `--input-vector` (int, default: 1536): Number of I/Q samples per input vector
90
+ - `--moving-avg-window` (int, default: 30): Window size (in samples) for the moving average used to detect energy peaks in the spectrum
91
+ - `--extraction-window` (int, default: 600): Number of samples to retain after detecting an energy peak
92
+
93
+
94
+ If you use the dApp concept and/or the framework to develop your own dApps, please cite the following paper:
95
+
96
+ ```text
97
+ @article{LACAVA2025111342,
98
+ title = {{dApps: Enabling Real-Time AI-based Open RAN Control}},
99
+ journal = {Computer Networks},
100
+ pages = {111342},
101
+ year = {2025},
102
+ issn = {1389-1286},
103
+ doi = {https://doi.org/10.1016/j.comnet.2025.111342},
104
+ url = {https://www.sciencedirect.com/science/article/pii/S1389128625003093},
105
+ author = {Andrea Lacava and Leonardo Bonati and Niloofar Mohamadi and Rajeev Gangula and Florian Kaltenberger and Pedram Johari and Salvatore D’Oro and Francesca Cuomo and Michele Polese and Tommaso Melodia},
106
+ keywords = {Open RAN, dApps, Real-time control loops, Radio Resource Management (RRM), Spectrum sharing, Positioning, Integrated Sensing and Communication (ISAC)},
107
+ abstract = {Open Radio Access Networks (RANs) leverage disaggregated and programmable RAN functions and open interfaces to enable closed-loop, data-driven radio resource management. This is performed through custom intelligent applications on the RAN Intelligent Controllers (RICs), optimizing RAN policy scheduling, network slicing, user session management, and medium access control, among others. In this context, we have proposed dApps as a key extension of the O-RAN architecture into the real-time and user-plane domains. Deployed directly on RAN nodes, dApps access data otherwise unavailable to RICs due to privacy or timing constraints, enabling the execution of control actions within shorter time intervals. In this paper, we propose for the first time a reference architecture for dApps, defining their life cycle from deployment by the Service Management and Orchestration (SMO) to real-time control loop interactions with the RAN nodes where they are hosted. We introduce a new dApp interface, E3, along with an Application Protocol (AP) that supports structured message exchanges and extensible communication for various service models. By bridging E3 with the existing O-RAN E2 interface, we enable dApps, xApps, and rApps to coexist and coordinate. These applications can then collaborate on complex use cases and employ hierarchical control to resolve shared resource conflicts. Finally, we present and open-source a dApp framework based on OpenAirInterface (OAI). We benchmark its performance in two real-time control use cases, i.e., spectrum sharing and positioning in a 5th generation (5G) Next Generation Node Base (gNB) scenario. Our experimental results show that standardized real-time control loops via dApps are feasible, achieving average control latency below 450microseconds and allowing optimal use of shared spectral resources.}
108
+ }
109
+ ```
dapps-0.0.3/README.md ADDED
@@ -0,0 +1,65 @@
1
+ # dApp Library
2
+
3
+ A complete tutorial on how to deploy a dApp can be found on the [OpenRAN Gym website](https://openrangym.com/tutorials/dapps-oai). Please refer to that guide to instrument your system.
4
+
5
+ ## Installation
6
+
7
+ ### Python package installation
8
+
9
+ ```
10
+ pip3 install dapps[all]
11
+ ```
12
+
13
+ ### Manual installation
14
+ Clone the repository and install it manually
15
+
16
+ ```
17
+ hatch build
18
+ pip3 install dist/*.tar.gz
19
+ ```
20
+
21
+ ### Launch the Spectrum Sharing dApp
22
+
23
+ OAI should start _before_ running the dApp
24
+
25
+ ```python
26
+ python3 examples/spectrum_dapp.py
27
+ ```
28
+
29
+ This dApp implements a spectrum sharing use case discussed in [our paper](https://arxiv.org/pdf/2501.16502).
30
+
31
+
32
+ The dApp can be controlled through the following command-line arguments:
33
+
34
+ - `--ota` (store_true, default: False): Specify if this is OTA or on Colosseum
35
+ - `--link` (str, default: 'zmq', choices: [layer.value for layer in E3LinkLayer]): Specify the link layer to be used
36
+ - `--transport` (str, default: 'ipc', choices: [layer.value for layer in E3TransportLayer]): Specify the transport layer to be used
37
+ - `--save-iqs` (store_true, default: False): Specify if this is data collection run or not. In the first case I/Q samples will be saved
38
+ - `--control` (store_true, default: False): Set whether to perform control of PRB
39
+ - `--energy-gui` (store_true, default: False): Set whether to enable the energy GUI
40
+ - `--iq-plotter-gui` (store_true, default: False): Set whether to enable the IQ Plotter GUI
41
+ - `--demo-gui` (store_true, default: False): Set whether to enable the Demo GUI
42
+ - `--timed` (store_true, default: False): Run with a 5-minute time limit
43
+ - `--model` (str, default: ''): Path to the CNN model file to be used
44
+ - `--time-window` (int, default: 5): Number of input vectors to pass to the CNN model
45
+ - `--input-vector` (int, default: 1536): Number of I/Q samples per input vector
46
+ - `--moving-avg-window` (int, default: 30): Window size (in samples) for the moving average used to detect energy peaks in the spectrum
47
+ - `--extraction-window` (int, default: 600): Number of samples to retain after detecting an energy peak
48
+
49
+
50
+ If you use the dApp concept and/or the framework to develop your own dApps, please cite the following paper:
51
+
52
+ ```text
53
+ @article{LACAVA2025111342,
54
+ title = {{dApps: Enabling Real-Time AI-based Open RAN Control}},
55
+ journal = {Computer Networks},
56
+ pages = {111342},
57
+ year = {2025},
58
+ issn = {1389-1286},
59
+ doi = {https://doi.org/10.1016/j.comnet.2025.111342},
60
+ url = {https://www.sciencedirect.com/science/article/pii/S1389128625003093},
61
+ author = {Andrea Lacava and Leonardo Bonati and Niloofar Mohamadi and Rajeev Gangula and Florian Kaltenberger and Pedram Johari and Salvatore D’Oro and Francesca Cuomo and Michele Polese and Tommaso Melodia},
62
+ keywords = {Open RAN, dApps, Real-time control loops, Radio Resource Management (RRM), Spectrum sharing, Positioning, Integrated Sensing and Communication (ISAC)},
63
+ abstract = {Open Radio Access Networks (RANs) leverage disaggregated and programmable RAN functions and open interfaces to enable closed-loop, data-driven radio resource management. This is performed through custom intelligent applications on the RAN Intelligent Controllers (RICs), optimizing RAN policy scheduling, network slicing, user session management, and medium access control, among others. In this context, we have proposed dApps as a key extension of the O-RAN architecture into the real-time and user-plane domains. Deployed directly on RAN nodes, dApps access data otherwise unavailable to RICs due to privacy or timing constraints, enabling the execution of control actions within shorter time intervals. In this paper, we propose for the first time a reference architecture for dApps, defining their life cycle from deployment by the Service Management and Orchestration (SMO) to real-time control loop interactions with the RAN nodes where they are hosted. We introduce a new dApp interface, E3, along with an Application Protocol (AP) that supports structured message exchanges and extensible communication for various service models. By bridging E3 with the existing O-RAN E2 interface, we enable dApps, xApps, and rApps to coexist and coordinate. These applications can then collaborate on complex use cases and employ hierarchical control to resolve shared resource conflicts. Finally, we present and open-source a dApp framework based on OpenAirInterface (OAI). We benchmark its performance in two real-time control use cases, i.e., spectrum sharing and positioning in a 5th generation (5G) Next Generation Node Base (gNB) scenario. Our experimental results show that standardized real-time control loops via dApps are feasible, achieving average control latency below 450microseconds and allowing optimal use of shared spectral resources.}
64
+ }
65
+ ```
dapps-0.0.3/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.3
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env python3
2
2
  """
3
- Usage example for the Spectrum Sharing dApp
3
+ Example script to showcase the Spectrum Sharing dApp
4
4
  """
5
5
 
6
6
  import argparse
@@ -24,6 +24,19 @@ def main(args, time_to_wait: float = 60.0):
24
24
  # with open(f"{LOG_DIR}/busy.txt", "w") as f:
25
25
  # f.close()
26
26
 
27
+ if args.model:
28
+ try:
29
+ from libiq.classifier.cnn import Classifier
30
+ except ModuleNotFoundError:
31
+ print(
32
+ "Optional dependencies to run this example are not installed.\n"
33
+ "Fix this by running:\n\n"
34
+ " pip install libiq # OR\n"
35
+ " pip install dapps[cnn] (minimal) # OR\n"
36
+ " pip install dapps[all] (preferred)\n"
37
+ )
38
+ exit(-1)
39
+
27
40
  if args.ota:
28
41
  print(f'Using OTA configuration')
29
42
  noise_floor_threshold = 20 # this really depends on the RF conditions and should be carefully calibrated
@@ -32,9 +45,20 @@ def main(args, time_to_wait: float = 60.0):
32
45
  noise_floor_threshold = 53
33
46
 
34
47
  print(f'Threshold {noise_floor_threshold}')
35
-
48
+
49
+ classifier = None
50
+ if args.model:
51
+ classifier = Classifier(
52
+ time_window = args.time_window,
53
+ input_vector = args.input_vector,
54
+ moving_avg_window = args.moving_avg_window,
55
+ extraction_window = args.extraction_window,
56
+ model_path = args.model
57
+ )
58
+
36
59
  dapp = SpectrumSharingDApp(noise_floor_threshold=noise_floor_threshold, save_iqs=args.save_iqs, control=args.control, link=args.link, transport=args.transport,
37
- energyGui=args.energy_gui, iqPlotterGui=args.iq_plotter_gui, dashboard=args.demo_gui)
60
+ energyGui=args.energy_gui, iqPlotterGui=args.iq_plotter_gui, dashboard=args.demo_gui, classifier=classifier)
61
+
38
62
  dapp.setup_connection()
39
63
 
40
64
  if args.timed:
@@ -51,19 +75,23 @@ def main(args, time_to_wait: float = 60.0):
51
75
 
52
76
 
53
77
  if __name__ == "__main__":
54
- parser = argparse.ArgumentParser(description="dApp example")
78
+ parser = argparse.ArgumentParser(description="Example of a dApp for Spectrum Sharing")
55
79
  parser.add_argument('--ota', action='store_true', default=False, help="Specify if this is OTA or on Colosseum")
56
80
  parser.add_argument('--link', type=str, default='zmq', choices=[layer.value for layer in E3LinkLayer], help="Specify the link layer to be used")
57
- parser.add_argument('--transport', type=str, default='ipc', choices=[layer.value for layer in E3TransportLayer], help="Specify the transport layer to be used")
81
+ parser.add_argument('--transport', type=str, default='ipc', choices=[layer.value for layer in E3TransportLayer], help="Specify the transport layer to be used")
58
82
  parser.add_argument('--save-iqs', action='store_true', default=False, help="Specify if this is data collection run or not. In the first case I/Q samples will be saved")
59
83
  parser.add_argument('--control', action='store_true', default=False, help="Set whether to perform control of PRB")
60
84
  parser.add_argument('--energy-gui', action='store_true', default=False, help="Set whether to enable the energy GUI")
61
85
  parser.add_argument('--iq-plotter-gui', action='store_true', default=False, help="Set whether to enable the IQ Plotter GUI")
62
86
  parser.add_argument('--demo-gui', action='store_true', default=False, help="Set whether to enable the Demo GUI")
63
87
  parser.add_argument('--timed', action='store_true', default=False, help="Run with a 5-minute time limit")
88
+ parser.add_argument('--model', type=str, default='', help="Path to the CNN model file to be used")
89
+ parser.add_argument('--time-window', type=int, default=5, help="Number of input vectors to pass to the CNN model.")
90
+ parser.add_argument('--input-vector', type=int, default=1536, help="Number of I/Q samples per input vector.")
91
+ parser.add_argument('--moving-avg-window', type=int, default=30, help="Window size (in samples) for the moving average used to detect energy peaks in the spectrum.")
92
+ parser.add_argument('--extraction-window', type=int, default=600, help="Number of samples to retain after detecting an energy peak.")
64
93
 
65
94
  args = parser.parse_args()
66
-
67
95
  print("Start dApp")
68
96
 
69
97
  main(args)
@@ -0,0 +1,66 @@
1
+ [build-system]
2
+ requires = [ "hatchling" ]
3
+ build-backend = "hatchling.build"
4
+
5
+
6
+ [project]
7
+ name = "dapps"
8
+ dynamic = [ "version" ]
9
+ description = "A library for creating and connecting dApps to Open RAN units."
10
+ readme = "README.md"
11
+ requires-python = ">=3.8"
12
+ keywords = [ "dApps", "O-RAN", "5G", "cellular", "networks" ]
13
+ classifiers = [
14
+ "Development Status :: 4 - Beta",
15
+ "Programming Language :: Python",
16
+ "Programming Language :: Python :: 3.8",
17
+ "Programming Language :: Python :: 3.9",
18
+ "Programming Language :: Python :: 3.10",
19
+ "Programming Language :: Python :: 3.11",
20
+ "Programming Language :: Python :: 3.12",
21
+ "Programming Language :: Python :: Implementation :: CPython",
22
+ "Programming Language :: Python :: Implementation :: PyPy"
23
+ ]
24
+ dependencies = [ "asn1tools", "typing_extensions", "numpy", "pyzmq" ]
25
+
26
+
27
+ [[project.authors]]
28
+ name = "Andrea Lacava"
29
+ email = "thecave003@gmail.com"
30
+
31
+
32
+ [project.urls]
33
+ Homepage = "https://openrangym.com/o-ran-frameworks/dapps"
34
+ Package = "https://pypi.org/project/dapps/"
35
+ Source = "https://github.com/wineslab/dApp-library"
36
+ "Bug Tracker" = "https://github.com/wineslab/dApp-library/issues"
37
+
38
+
39
+ [project.optional-dependencies]
40
+ api = [ "influxdb_client" ]
41
+ cnn = [ "libiq" ]
42
+ gui = [ "flask", "flask-socketio", "matplotlib" ]
43
+ network = [ "pysctp" ]
44
+ all = [
45
+ "pysctp",
46
+ "flask",
47
+ "flask-socketio",
48
+ "matplotlib",
49
+ "influxdb_client",
50
+ "libiq"
51
+ ]
52
+
53
+
54
+ [tool.hatch.version]
55
+ path = "VERSION"
56
+ pattern = "(?P<version>\\d+\\.\\d+\\.\\d+)"
57
+
58
+
59
+ [tool.hatch.build.targets.wheel]
60
+ packages = [
61
+ "src/dapp",
62
+ "src/e3interface",
63
+ "src/spectrum",
64
+ "src/visualization"
65
+ ]
66
+ sources = [ "src" ]
@@ -17,13 +17,20 @@
17
17
  var waterfall = [{
18
18
  z: [],
19
19
  type: 'heatmap',
20
- colorscale: "Viridis"
20
+ colorscale: "Viridis",
21
+ colorbar: {
22
+ title:{
23
+ text: "Magnitude [dB]",
24
+ side: 'right'
25
+ },
26
+ orientation: 'h'
27
+ }
21
28
  }];
22
29
 
23
30
  var waterfallLayout = {
24
- title: "Magnitude of the Sensed Spectrum",
31
+ title: "Sensed Spectrum",
25
32
  xaxis: {
26
- title: "Subcarriers of the OFDM Symbol"
33
+ title: "OFDM Symbol Subcarriers"
27
34
  },
28
35
  yaxis: {
29
36
  title: "Time samples",
@@ -155,7 +162,7 @@
155
162
 
156
163
  var classifierLayout = {
157
164
  title: {
158
- text: "Predicted Label: N/A",
165
+ text: "RFI Predicted: N/A",
159
166
  font: { size: 24 }
160
167
  },
161
168
  xaxis: { visible: false },
@@ -199,9 +206,9 @@
199
206
  data.prb_list.forEach(index => prbs_buffer[0][index] = 1);
200
207
  Plotly.restyle('prbs', { z: [prbs_buffer] });
201
208
  } else if ('predicted_label' in data) {
202
- console.log("Predicted label is: ", data.predicted_label);
209
+ console.log("RFI Predicted is ", data.predicted_label);
203
210
  Plotly.relayout('predicted_label', {
204
- 'title.text': `Predicted Label: ${data.predicted_label}`
211
+ 'title.text': `RFI Predicted: ${data.predicted_label}`
205
212
  });
206
213
  } else {
207
214
  console.error('Error unknown values in data ', data);
dapps-0.0.2/PKG-INFO DELETED
@@ -1,83 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: dapps
3
- Version: 0.0.2
4
- Summary: A library for creating and connecting dApps to Open RAN units.
5
- Project-URL: Homepage, https://openrangym.com/ran-frameworks/dapps
6
- Project-URL: Package, https://pypi.org/project/dapps/
7
- Project-URL: Source, https://github.com/wineslab/dApp-library
8
- Project-URL: Bug Tracker, https://github.com/wineslab/dApp-library/issues
9
- Author-email: Andrea Lacava <thecave003@gmail.com>
10
- License-File: LICENSE
11
- Keywords: 5g,dApps,o-ran
12
- Classifier: Development Status :: 4 - Beta
13
- Classifier: Programming Language :: Python
14
- Classifier: Programming Language :: Python :: 3.8
15
- Classifier: Programming Language :: Python :: 3.9
16
- Classifier: Programming Language :: Python :: 3.10
17
- Classifier: Programming Language :: Python :: 3.11
18
- Classifier: Programming Language :: Python :: 3.12
19
- Classifier: Programming Language :: Python :: Implementation :: CPython
20
- Classifier: Programming Language :: Python :: Implementation :: PyPy
21
- Requires-Python: >=3.8
22
- Requires-Dist: asn1tools
23
- Requires-Dist: numpy
24
- Requires-Dist: pyzmq
25
- Requires-Dist: typing-extensions
26
- Provides-Extra: all
27
- Requires-Dist: flask; extra == 'all'
28
- Requires-Dist: flask-socketio; extra == 'all'
29
- Requires-Dist: influxdb-client; extra == 'all'
30
- Requires-Dist: matplotlib; extra == 'all'
31
- Requires-Dist: pysctp; extra == 'all'
32
- Provides-Extra: api
33
- Requires-Dist: influxdb-client; extra == 'api'
34
- Provides-Extra: gui
35
- Requires-Dist: flask; extra == 'gui'
36
- Requires-Dist: flask-socketio; extra == 'gui'
37
- Requires-Dist: matplotlib; extra == 'gui'
38
- Provides-Extra: network
39
- Requires-Dist: pysctp; extra == 'network'
40
- Description-Content-Type: text/markdown
41
-
42
- # dApp Library
43
-
44
- A complete tutorial on how to deploy a dApp can be found on the [OpenRAN Gym website](https://openrangym.com/tutorials/dapps-oai). Please refer to that guide to instrument your system.
45
-
46
- ## Installation
47
-
48
- Clone the repository
49
-
50
- ```
51
- hatch build
52
- pip3 install dist/*.tar.gz
53
- ```
54
-
55
- ### Launch the Spectrum Sharing dApp
56
-
57
- OAI should start _before_ running the dApp
58
-
59
- ```python
60
- python3 examples/spectrum_dapp.py
61
- ```
62
-
63
- This dApp implements a spectrum sharing use case discussed in [our paper](https://arxiv.org/pdf/2501.16502).
64
-
65
- The dApp can be controlled through the following command-line arguments:
66
- - `ota` bool (false): If true, use the OAI and spectrum configurations for OTA else use the ones of Colosseum
67
- - `control` bool (false): If set to true, performs the PRB masking
68
- - `energy-gui` bool (false): If set to true, creates and show the energy spectrum
69
- - `iq-plotter-gui` bool (false): If set to true, creates and show the sensed spectrum
70
- - `save-iqs` bool (false): Specify if this is data collection run or not. In the first case I/Q samples will be saved
71
- - `timed` bool (false): Run with a 5-minute time limit
72
-
73
-
74
- If you use the dApp concept and/or the framework to develop your own dApps, please cite the following paper:
75
-
76
- ```text
77
- @ARTICLE{lacava2025dApps,
78
- author={Andrea Lacava and Leonardo Bonati and Niloofar Mohamadi and Rajeev Gangula and Florian Kaltenberger and Pedram Johari and Salvatore D'Oro and Francesca Cuomo and Michele Polese and Tommaso Melodia},
79
- title: {dApps: Enabling Real-Time AI-Based Open RAN Control},
80
- url={https://arxiv.org/pdf/2501.16502},
81
- year={2025}
82
- }
83
- ```
dapps-0.0.2/README.md DELETED
@@ -1,42 +0,0 @@
1
- # dApp Library
2
-
3
- A complete tutorial on how to deploy a dApp can be found on the [OpenRAN Gym website](https://openrangym.com/tutorials/dapps-oai). Please refer to that guide to instrument your system.
4
-
5
- ## Installation
6
-
7
- Clone the repository
8
-
9
- ```
10
- hatch build
11
- pip3 install dist/*.tar.gz
12
- ```
13
-
14
- ### Launch the Spectrum Sharing dApp
15
-
16
- OAI should start _before_ running the dApp
17
-
18
- ```python
19
- python3 examples/spectrum_dapp.py
20
- ```
21
-
22
- This dApp implements a spectrum sharing use case discussed in [our paper](https://arxiv.org/pdf/2501.16502).
23
-
24
- The dApp can be controlled through the following command-line arguments:
25
- - `ota` bool (false): If true, use the OAI and spectrum configurations for OTA else use the ones of Colosseum
26
- - `control` bool (false): If set to true, performs the PRB masking
27
- - `energy-gui` bool (false): If set to true, creates and show the energy spectrum
28
- - `iq-plotter-gui` bool (false): If set to true, creates and show the sensed spectrum
29
- - `save-iqs` bool (false): Specify if this is data collection run or not. In the first case I/Q samples will be saved
30
- - `timed` bool (false): Run with a 5-minute time limit
31
-
32
-
33
- If you use the dApp concept and/or the framework to develop your own dApps, please cite the following paper:
34
-
35
- ```text
36
- @ARTICLE{lacava2025dApps,
37
- author={Andrea Lacava and Leonardo Bonati and Niloofar Mohamadi and Rajeev Gangula and Florian Kaltenberger and Pedram Johari and Salvatore D'Oro and Francesca Cuomo and Michele Polese and Tommaso Melodia},
38
- title: {dApps: Enabling Real-Time AI-Based Open RAN Control},
39
- url={https://arxiv.org/pdf/2501.16502},
40
- year={2025}
41
- }
42
- ```
dapps-0.0.2/VERSION DELETED
@@ -1 +0,0 @@
1
- 0.0.2
@@ -1,58 +0,0 @@
1
- [build-system]
2
- requires = ["hatchling"]
3
- build-backend = "hatchling.build"
4
-
5
- [project]
6
- name = "dapps"
7
- dynamic = ["version"]
8
- description = 'A library for creating and connecting dApps to Open RAN units.'
9
- readme = "README.md"
10
- requires-python = ">=3.8"
11
- keywords = ["dApps", "o-ran", "5g"]
12
- authors = [
13
- { name = "Andrea Lacava", email = "thecave003@gmail.com" },
14
- ]
15
- classifiers = [
16
- "Development Status :: 4 - Beta",
17
- "Programming Language :: Python",
18
- "Programming Language :: Python :: 3.8",
19
- "Programming Language :: Python :: 3.9",
20
- "Programming Language :: Python :: 3.10",
21
- "Programming Language :: Python :: 3.11",
22
- "Programming Language :: Python :: 3.12",
23
- "Programming Language :: Python :: Implementation :: CPython",
24
- "Programming Language :: Python :: Implementation :: PyPy",
25
- ]
26
-
27
- dependencies = [
28
- "asn1tools",
29
- "typing_extensions",
30
- "numpy",
31
- "pyzmq"
32
- ]
33
-
34
- [project.urls]
35
- Homepage = "https://openrangym.com/ran-frameworks/dapps"
36
- Package = "https://pypi.org/project/dapps/"
37
- Source = "https://github.com/wineslab/dApp-library"
38
- "Bug Tracker" = "https://github.com/wineslab/dApp-library/issues"
39
-
40
- [tool.hatch.version]
41
- path = "VERSION"
42
- pattern = "(?P<version>\\d+\\.\\d+\\.\\d+)"
43
-
44
- [tool.hatch.build.targets.wheel]
45
- packages = ['src/dapp', 'src/e3interface', 'src/spectrum','src/visualization']
46
- sources = ["src"]
47
-
48
- [project.optional-dependencies]
49
- network = ["pysctp"]
50
- gui = ["flask", "flask-socketio", "matplotlib"]
51
- api = ["influxdb_client"]
52
- all = [
53
- "pysctp",
54
- "flask",
55
- "flask-socketio",
56
- "matplotlib",
57
- "influxdb_client"
58
- ]
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes