hqde 0.1.3__py3-none-any.whl → 0.1.5__py3-none-any.whl
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.
- hqde/core/hqde_system.py +71 -16
- hqde-0.1.5.dist-info/METADATA +445 -0
- {hqde-0.1.3.dist-info → hqde-0.1.5.dist-info}/RECORD +6 -6
- {hqde-0.1.3.dist-info → hqde-0.1.5.dist-info}/WHEEL +1 -1
- hqde-0.1.3.dist-info/METADATA +0 -237
- {hqde-0.1.3.dist-info → hqde-0.1.5.dist-info}/licenses/LICENSE +0 -0
- {hqde-0.1.3.dist-info → hqde-0.1.5.dist-info}/top_level.txt +0 -0
hqde/core/hqde_system.py
CHANGED
|
@@ -152,23 +152,61 @@ class DistributedEnsembleManager:
|
|
|
152
152
|
print(f"Running in simulated mode with {num_workers} workers (Ray not available)")
|
|
153
153
|
|
|
154
154
|
def create_ensemble_workers(self, model_class, model_kwargs: Dict[str, Any]):
|
|
155
|
-
"""Create distributed ensemble workers."""
|
|
156
|
-
|
|
155
|
+
"""Create diverse distributed ensemble workers with different configurations."""
|
|
156
|
+
# Calculate GPU fraction per worker (divide available GPUs among workers)
|
|
157
|
+
num_gpus = torch.cuda.device_count() if torch.cuda.is_available() else 0
|
|
158
|
+
gpu_per_worker = num_gpus / self.num_workers if num_gpus > 0 else 0
|
|
159
|
+
|
|
160
|
+
# ✅ FIX #6: ADD DIVERSITY - Different learning rates and dropout for each worker
|
|
161
|
+
learning_rates = [0.001, 0.0008, 0.0012, 0.0009][:self.num_workers]
|
|
162
|
+
dropout_rates = [0.15, 0.18, 0.12, 0.16][:self.num_workers]
|
|
163
|
+
|
|
164
|
+
# Extend if more workers than predefined configs
|
|
165
|
+
while len(learning_rates) < self.num_workers:
|
|
166
|
+
learning_rates.append(0.001)
|
|
167
|
+
dropout_rates.append(0.15)
|
|
168
|
+
|
|
169
|
+
@ray.remote(num_gpus=gpu_per_worker)
|
|
157
170
|
class EnsembleWorker:
|
|
158
|
-
def __init__(self, model_class, model_kwargs):
|
|
171
|
+
def __init__(self, model_class, model_kwargs, worker_id=0, learning_rate=0.001, dropout_rate=0.15):
|
|
172
|
+
# ✅ FIX #3: INJECT LOWER DROPOUT RATE
|
|
173
|
+
if 'dropout_rate' not in model_kwargs:
|
|
174
|
+
model_kwargs['dropout_rate'] = dropout_rate
|
|
175
|
+
|
|
159
176
|
self.model = model_class(**model_kwargs)
|
|
160
177
|
self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
|
|
161
178
|
self.model.to(self.device)
|
|
162
179
|
self.efficiency_score = 1.0
|
|
163
180
|
self.quantizer = AdaptiveQuantizer()
|
|
164
181
|
self.optimizer = None
|
|
182
|
+
self.scheduler = None
|
|
165
183
|
self.criterion = None
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
184
|
+
self.learning_rate = learning_rate
|
|
185
|
+
self.worker_id = worker_id
|
|
186
|
+
|
|
187
|
+
def setup_training(self, learning_rate=None):
|
|
188
|
+
"""Setup optimizer, scheduler, and criterion for training."""
|
|
189
|
+
if learning_rate is None:
|
|
190
|
+
learning_rate = self.learning_rate
|
|
191
|
+
|
|
169
192
|
self.optimizer = torch.optim.Adam(self.model.parameters(), lr=learning_rate)
|
|
193
|
+
|
|
194
|
+
# ✅ FIX #5: ADD LEARNING RATE SCHEDULING
|
|
195
|
+
self.scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(
|
|
196
|
+
self.optimizer,
|
|
197
|
+
T_max=50, # Will be adjusted based on total epochs
|
|
198
|
+
eta_min=1e-6
|
|
199
|
+
)
|
|
200
|
+
|
|
170
201
|
self.criterion = torch.nn.CrossEntropyLoss()
|
|
171
202
|
return True
|
|
203
|
+
|
|
204
|
+
def step_scheduler(self):
|
|
205
|
+
"""Step the learning rate scheduler (call once per epoch)."""
|
|
206
|
+
if self.scheduler is not None:
|
|
207
|
+
self.scheduler.step()
|
|
208
|
+
return self.optimizer.param_groups[0]['lr']
|
|
209
|
+
return self.learning_rate
|
|
172
210
|
|
|
173
211
|
def train_step(self, data_batch, targets=None):
|
|
174
212
|
# Perform actual training step using instance optimizer and criterion
|
|
@@ -183,6 +221,10 @@ class DistributedEnsembleManager:
|
|
|
183
221
|
outputs = self.model(data_batch)
|
|
184
222
|
loss = self.criterion(outputs, targets)
|
|
185
223
|
loss.backward()
|
|
224
|
+
|
|
225
|
+
# ✅ GRADIENT CLIPPING for stability
|
|
226
|
+
torch.nn.utils.clip_grad_norm_(self.model.parameters(), max_norm=1.0)
|
|
227
|
+
|
|
186
228
|
self.optimizer.step()
|
|
187
229
|
|
|
188
230
|
# Update efficiency score based on actual loss
|
|
@@ -218,8 +260,17 @@ class DistributedEnsembleManager:
|
|
|
218
260
|
outputs = self.model(data_batch)
|
|
219
261
|
return outputs.cpu() # Move back to CPU for aggregation
|
|
220
262
|
|
|
221
|
-
|
|
222
|
-
|
|
263
|
+
# Create workers with diversity
|
|
264
|
+
self.workers = []
|
|
265
|
+
for worker_id in range(self.num_workers):
|
|
266
|
+
worker = EnsembleWorker.remote(
|
|
267
|
+
model_class,
|
|
268
|
+
model_kwargs.copy(), # Copy to avoid mutation
|
|
269
|
+
worker_id=worker_id,
|
|
270
|
+
learning_rate=learning_rates[worker_id],
|
|
271
|
+
dropout_rate=dropout_rates[worker_id]
|
|
272
|
+
)
|
|
273
|
+
self.workers.append(worker)
|
|
223
274
|
|
|
224
275
|
def setup_workers_training(self, learning_rate=0.001):
|
|
225
276
|
"""Setup training for all workers."""
|
|
@@ -261,7 +312,7 @@ class DistributedEnsembleManager:
|
|
|
261
312
|
ray.get(futures)
|
|
262
313
|
|
|
263
314
|
def train_ensemble(self, data_loader, num_epochs: int = 10):
|
|
264
|
-
"""Train the ensemble using distributed workers."""
|
|
315
|
+
"""Train the ensemble using distributed workers with FedAvg-style aggregation."""
|
|
265
316
|
# Setup training for all workers
|
|
266
317
|
self.setup_workers_training()
|
|
267
318
|
|
|
@@ -294,15 +345,19 @@ class DistributedEnsembleManager:
|
|
|
294
345
|
batch_losses = ray.get(training_futures)
|
|
295
346
|
epoch_losses.extend([loss for loss in batch_losses if loss is not None])
|
|
296
347
|
|
|
297
|
-
#
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
348
|
+
# ✅ FIX #1: AGGREGATE WEIGHTS AFTER EACH EPOCH (FedAvg style)
|
|
349
|
+
aggregated_weights = self.aggregate_weights()
|
|
350
|
+
if aggregated_weights:
|
|
351
|
+
self.broadcast_weights(aggregated_weights)
|
|
352
|
+
self.logger.info(f" → Weights aggregated and synchronized at epoch {epoch + 1}")
|
|
353
|
+
|
|
354
|
+
# ✅ FIX #5: STEP LEARNING RATE SCHEDULERS
|
|
355
|
+
scheduler_futures = [worker.step_scheduler.remote() for worker in self.workers]
|
|
356
|
+
current_lrs = ray.get(scheduler_futures)
|
|
357
|
+
avg_lr = np.mean(current_lrs) if current_lrs else 0.001
|
|
303
358
|
|
|
304
359
|
avg_loss = np.mean(epoch_losses) if epoch_losses else 0.0
|
|
305
|
-
print(f"Epoch {epoch + 1}/{num_epochs}, Average Loss: {avg_loss:.4f}")
|
|
360
|
+
print(f"Epoch {epoch + 1}/{num_epochs}, Average Loss: {avg_loss:.4f}, LR: {avg_lr:.6f}")
|
|
306
361
|
|
|
307
362
|
def shutdown(self):
|
|
308
363
|
"""Shutdown the distributed ensemble manager."""
|
|
@@ -0,0 +1,445 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: hqde
|
|
3
|
+
Version: 0.1.5
|
|
4
|
+
Summary: Hierarchical Quantum-Distributed Ensemble Learning Framework
|
|
5
|
+
Author-email: HQDE Team <hqde@example.com>
|
|
6
|
+
Maintainer-email: HQDE Team <hqde@example.com>
|
|
7
|
+
License: MIT
|
|
8
|
+
Project-URL: Homepage, https://github.com/Prathmesh333/Hierarchical-Quantum-Distributed-Ensemble-Learning
|
|
9
|
+
Project-URL: Repository, https://github.com/Prathmesh333/Hierarchical-Quantum-Distributed-Ensemble-Learning
|
|
10
|
+
Project-URL: Documentation, https://github.com/Prathmesh333/Hierarchical-Quantum-Distributed-Ensemble-Learning/blob/main/HOW_TO_RUN.md
|
|
11
|
+
Project-URL: Bug Reports, https://github.com/Prathmesh333/Hierarchical-Quantum-Distributed-Ensemble-Learning/issues
|
|
12
|
+
Keywords: machine-learning,quantum,distributed,ensemble,deep-learning,pytorch,ray
|
|
13
|
+
Classifier: Development Status :: 4 - Beta
|
|
14
|
+
Classifier: Intended Audience :: Science/Research
|
|
15
|
+
Classifier: Intended Audience :: Developers
|
|
16
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
17
|
+
Classifier: Operating System :: OS Independent
|
|
18
|
+
Classifier: Programming Language :: Python :: 3
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
23
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
24
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
25
|
+
Requires-Python: >=3.9
|
|
26
|
+
Description-Content-Type: text/markdown
|
|
27
|
+
License-File: LICENSE
|
|
28
|
+
Requires-Dist: numpy>=2.0.2
|
|
29
|
+
Requires-Dist: torch>=2.8.0
|
|
30
|
+
Requires-Dist: torchvision>=0.23.0
|
|
31
|
+
Requires-Dist: ray[default]>=2.49.2
|
|
32
|
+
Requires-Dist: scikit-learn>=1.6.1
|
|
33
|
+
Requires-Dist: psutil>=7.1.0
|
|
34
|
+
Provides-Extra: dev
|
|
35
|
+
Requires-Dist: pytest>=8.4.2; extra == "dev"
|
|
36
|
+
Requires-Dist: ipython>=8.18.1; extra == "dev"
|
|
37
|
+
Requires-Dist: matplotlib>=3.9.4; extra == "dev"
|
|
38
|
+
Requires-Dist: pandas>=2.3.2; extra == "dev"
|
|
39
|
+
Requires-Dist: seaborn>=0.13.2; extra == "dev"
|
|
40
|
+
Requires-Dist: tqdm>=4.67.1; extra == "dev"
|
|
41
|
+
Dynamic: license-file
|
|
42
|
+
|
|
43
|
+
# HQDE - Hierarchical Quantum-Distributed Ensemble Learning
|
|
44
|
+
|
|
45
|
+
[](https://www.python.org/downloads/)
|
|
46
|
+
[](https://pytorch.org/)
|
|
47
|
+
[](https://ray.io/)
|
|
48
|
+
[](LICENSE)
|
|
49
|
+
|
|
50
|
+
A production-ready framework for distributed ensemble learning with quantum-inspired algorithms and adaptive quantization.
|
|
51
|
+
|
|
52
|
+
HQDE combines quantum-inspired algorithms with distributed computing to deliver superior machine learning performance with significantly reduced memory usage and training time.
|
|
53
|
+
|
|
54
|
+
## Table of Contents
|
|
55
|
+
|
|
56
|
+
- [Key Features](#key-features)
|
|
57
|
+
- [Installation](#installation)
|
|
58
|
+
- [Quick Start](#quick-start)
|
|
59
|
+
- [Architecture Overview](#architecture-overview)
|
|
60
|
+
- [Quantum-Inspired Algorithms](#quantum-inspired-algorithms)
|
|
61
|
+
- [Distributed Computing](#distributed-computing)
|
|
62
|
+
- [Adaptive Quantization](#adaptive-quantization)
|
|
63
|
+
- [Configuration](#configuration)
|
|
64
|
+
- [API Reference](#api-reference)
|
|
65
|
+
- [Performance Benchmarks](#performance-benchmarks)
|
|
66
|
+
- [Documentation](#documentation)
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## Key Features
|
|
71
|
+
|
|
72
|
+
| Feature | Description |
|
|
73
|
+
|---------|-------------|
|
|
74
|
+
| **4x Faster Training** | Quantum-optimized algorithms with distributed workers |
|
|
75
|
+
| **4x Memory Reduction** | Adaptive 4-16 bit quantization based on weight importance |
|
|
76
|
+
| **Production-Ready** | Byzantine fault tolerance and dynamic load balancing |
|
|
77
|
+
| **Quantum-Inspired** | Superposition aggregation, entanglement simulation, QUBO optimization |
|
|
78
|
+
| **Distributed** | Ray-based MapReduce with O(log n) hierarchical aggregation |
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Installation
|
|
83
|
+
|
|
84
|
+
### From PyPI (Recommended)
|
|
85
|
+
```bash
|
|
86
|
+
pip install hqde
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### From Source
|
|
90
|
+
```bash
|
|
91
|
+
git clone https://github.com/Prathmesh333/HQDE-PyPI.git
|
|
92
|
+
cd HQDE-PyPI
|
|
93
|
+
pip install -e .
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## Quick Start
|
|
99
|
+
|
|
100
|
+
```python
|
|
101
|
+
from hqde import create_hqde_system
|
|
102
|
+
import torch.nn as nn
|
|
103
|
+
|
|
104
|
+
# Define your PyTorch model
|
|
105
|
+
class MyModel(nn.Module):
|
|
106
|
+
def __init__(self, num_classes=10):
|
|
107
|
+
super().__init__()
|
|
108
|
+
self.layers = nn.Sequential(
|
|
109
|
+
nn.Conv2d(3, 32, 3, padding=1),
|
|
110
|
+
nn.ReLU(),
|
|
111
|
+
nn.MaxPool2d(2),
|
|
112
|
+
nn.Conv2d(32, 64, 3, padding=1),
|
|
113
|
+
nn.ReLU(),
|
|
114
|
+
nn.AdaptiveAvgPool2d(1),
|
|
115
|
+
nn.Flatten(),
|
|
116
|
+
nn.Linear(64, num_classes)
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
def forward(self, x):
|
|
120
|
+
return self.layers(x)
|
|
121
|
+
|
|
122
|
+
# Create HQDE system with 4 distributed workers
|
|
123
|
+
hqde_system = create_hqde_system(
|
|
124
|
+
model_class=MyModel,
|
|
125
|
+
model_kwargs={'num_classes': 10},
|
|
126
|
+
num_workers=4
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
# Train the ensemble
|
|
130
|
+
metrics = hqde_system.train(train_loader, num_epochs=10)
|
|
131
|
+
|
|
132
|
+
# Make predictions (ensemble voting)
|
|
133
|
+
predictions = hqde_system.predict(test_loader)
|
|
134
|
+
|
|
135
|
+
# Cleanup resources
|
|
136
|
+
hqde_system.cleanup()
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
**Examples:**
|
|
140
|
+
```bash
|
|
141
|
+
python examples/quick_start.py # Quick demo
|
|
142
|
+
python examples/cifar10_synthetic_test.py # CIFAR-10 benchmark
|
|
143
|
+
python examples/cifar10_test.py # Real CIFAR-10 dataset
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## Architecture Overview
|
|
149
|
+
|
|
150
|
+
```
|
|
151
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
152
|
+
│ HQDE SYSTEM ARCHITECTURE │
|
|
153
|
+
├─────────────────────────────────────────────────────────────────┤
|
|
154
|
+
│ │
|
|
155
|
+
│ ┌─────────────┐ ┌─────────────────┐ ┌────────────────┐ │
|
|
156
|
+
│ │ QUANTUM │ │ DISTRIBUTED │ │ ADAPTIVE │ │
|
|
157
|
+
│ │ INSPIRED │───▶│ ENSEMBLE │───▶│ QUANTIZATION │ │
|
|
158
|
+
│ │ ALGORITHMS │ │ LEARNING │ │ │ │
|
|
159
|
+
│ └─────────────┘ └─────────────────┘ └────────────────┘ │
|
|
160
|
+
│ │
|
|
161
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### Project Structure
|
|
165
|
+
|
|
166
|
+
```
|
|
167
|
+
hqde/
|
|
168
|
+
├── core/
|
|
169
|
+
│ └── hqde_system.py # Main system, workers, quantization
|
|
170
|
+
├── quantum/
|
|
171
|
+
│ ├── quantum_aggregator.py # Superposition and entanglement
|
|
172
|
+
│ ├── quantum_noise.py # Quantum noise generation
|
|
173
|
+
│ └── quantum_optimization.py # QUBO and quantum annealing
|
|
174
|
+
├── distributed/
|
|
175
|
+
│ ├── mapreduce_ensemble.py # MapReduce pattern
|
|
176
|
+
│ ├── hierarchical_aggregator.py # Tree aggregation
|
|
177
|
+
│ ├── fault_tolerance.py # Byzantine fault tolerance
|
|
178
|
+
│ └── load_balancer.py # Dynamic load balancing
|
|
179
|
+
└── utils/
|
|
180
|
+
└── performance_monitor.py # System monitoring
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## Quantum-Inspired Algorithms
|
|
186
|
+
|
|
187
|
+
**Note:** HQDE uses quantum-inspired algorithms on classical hardware, not actual quantum computers.
|
|
188
|
+
|
|
189
|
+
### Quantum Superposition Aggregation
|
|
190
|
+
|
|
191
|
+
Combines ensemble predictions using quantum amplitude-like weights:
|
|
192
|
+
|
|
193
|
+
```python
|
|
194
|
+
# Confidence scores converted to quantum amplitudes
|
|
195
|
+
amplitudes = sqrt(softmax(confidence_scores))
|
|
196
|
+
|
|
197
|
+
# Superposition combination
|
|
198
|
+
superposition = sum(amplitude_i * prediction_i)
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
**Location:** `hqde/quantum/quantum_aggregator.py`
|
|
202
|
+
|
|
203
|
+
### Entanglement-Based Correlation
|
|
204
|
+
|
|
205
|
+
Models correlations between ensemble members using an entanglement matrix:
|
|
206
|
+
|
|
207
|
+
```python
|
|
208
|
+
# Symmetric entanglement matrix
|
|
209
|
+
entanglement_matrix[i,j] = correlation(model_i, model_j) * strength
|
|
210
|
+
|
|
211
|
+
# Weight models by their entanglement with others
|
|
212
|
+
entangled_weights = softmax(cosine_similarity @ entanglement_matrix)
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
**Location:** `hqde/quantum/quantum_aggregator.py`
|
|
216
|
+
|
|
217
|
+
### Quantum Annealing Optimization
|
|
218
|
+
|
|
219
|
+
Uses QUBO (Quadratic Unconstrained Binary Optimization) for ensemble selection:
|
|
220
|
+
|
|
221
|
+
```python
|
|
222
|
+
# QUBO formulation for selecting optimal models
|
|
223
|
+
qubo_matrix = formulate_qubo(candidate_models, constraints)
|
|
224
|
+
|
|
225
|
+
# Solve using simulated quantum annealing
|
|
226
|
+
solution = quantum_annealing_solve(qubo_matrix)
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
**Location:** `hqde/quantum/quantum_optimization.py`
|
|
230
|
+
|
|
231
|
+
---
|
|
232
|
+
|
|
233
|
+
## Distributed Computing
|
|
234
|
+
|
|
235
|
+
HQDE uses Ray for distributed computing with several patterns:
|
|
236
|
+
|
|
237
|
+
### Ray Worker Architecture
|
|
238
|
+
|
|
239
|
+
```python
|
|
240
|
+
# GPUs are automatically divided among workers
|
|
241
|
+
@ray.remote(num_gpus=gpu_per_worker)
|
|
242
|
+
class EnsembleWorker:
|
|
243
|
+
def train_step(self, data_batch, targets):
|
|
244
|
+
# Each worker trains its own model copy
|
|
245
|
+
...
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
### MapReduce Weight Aggregation
|
|
249
|
+
|
|
250
|
+
```
|
|
251
|
+
MAP → SHUFFLE → REDUCE
|
|
252
|
+
Workers Group by Aggregate
|
|
253
|
+
weights parameter weights
|
|
254
|
+
name
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
**Location:** `hqde/distributed/mapreduce_ensemble.py`
|
|
258
|
+
|
|
259
|
+
### Hierarchical Tree Aggregation
|
|
260
|
+
|
|
261
|
+
Communication Complexity: **O(log n)**
|
|
262
|
+
|
|
263
|
+
```
|
|
264
|
+
Level 0 (Root): [AGG]
|
|
265
|
+
/ \
|
|
266
|
+
Level 1: [AGG] [AGG]
|
|
267
|
+
/ \ / \
|
|
268
|
+
Level 2: [W1] [W2] [W3] [W4]
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
**Location:** `hqde/distributed/hierarchical_aggregator.py`
|
|
272
|
+
|
|
273
|
+
### Byzantine Fault Tolerance
|
|
274
|
+
|
|
275
|
+
Tolerates up to 33% faulty or malicious workers:
|
|
276
|
+
|
|
277
|
+
- **Outlier Detection:** Median Absolute Deviation (MAD)
|
|
278
|
+
- **Robust Aggregation:** Geometric median
|
|
279
|
+
- **Reliability Tracking:** Source reputation scores
|
|
280
|
+
|
|
281
|
+
**Location:** `hqde/distributed/fault_tolerance.py`
|
|
282
|
+
|
|
283
|
+
### Dynamic Load Balancing
|
|
284
|
+
|
|
285
|
+
Multi-factor node selection scoring:
|
|
286
|
+
- 40% success rate
|
|
287
|
+
- 30% current load
|
|
288
|
+
- 20% execution speed
|
|
289
|
+
- 10% capability match
|
|
290
|
+
|
|
291
|
+
**Location:** `hqde/distributed/load_balancer.py`
|
|
292
|
+
|
|
293
|
+
---
|
|
294
|
+
|
|
295
|
+
## Adaptive Quantization
|
|
296
|
+
|
|
297
|
+
Dynamically adjusts precision based on weight importance:
|
|
298
|
+
|
|
299
|
+
| Weight Importance | Bits | Compression |
|
|
300
|
+
|------------------|------|-------------|
|
|
301
|
+
| High (critical) | 16 | 2x |
|
|
302
|
+
| Medium (default) | 8 | 4x |
|
|
303
|
+
| Low (redundant) | 4 | 8x |
|
|
304
|
+
|
|
305
|
+
**Importance Score = 70% × |weight| + 30% × |gradient|**
|
|
306
|
+
|
|
307
|
+
```python
|
|
308
|
+
quantization_config = {
|
|
309
|
+
'base_bits': 8, # Default precision
|
|
310
|
+
'min_bits': 4, # High compression for unimportant weights
|
|
311
|
+
'max_bits': 16 # High precision for critical weights
|
|
312
|
+
}
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
**Location:** `hqde/core/hqde_system.py`
|
|
316
|
+
|
|
317
|
+
---
|
|
318
|
+
|
|
319
|
+
## Configuration
|
|
320
|
+
|
|
321
|
+
### Full Configuration Example
|
|
322
|
+
|
|
323
|
+
```python
|
|
324
|
+
from hqde import create_hqde_system
|
|
325
|
+
|
|
326
|
+
# Quantization settings
|
|
327
|
+
quantization_config = {
|
|
328
|
+
'base_bits': 8,
|
|
329
|
+
'min_bits': 4,
|
|
330
|
+
'max_bits': 16
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
# Quantum aggregation settings
|
|
334
|
+
aggregation_config = {
|
|
335
|
+
'noise_scale': 0.005,
|
|
336
|
+
'exploration_factor': 0.1,
|
|
337
|
+
'entanglement_strength': 0.1
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
# Create system
|
|
341
|
+
hqde_system = create_hqde_system(
|
|
342
|
+
model_class=YourModel,
|
|
343
|
+
model_kwargs={'num_classes': 10},
|
|
344
|
+
num_workers=8,
|
|
345
|
+
quantization_config=quantization_config,
|
|
346
|
+
aggregation_config=aggregation_config
|
|
347
|
+
)
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
---
|
|
351
|
+
|
|
352
|
+
## API Reference
|
|
353
|
+
|
|
354
|
+
### Core Classes
|
|
355
|
+
|
|
356
|
+
| Class | Description | Location |
|
|
357
|
+
|-------|-------------|----------|
|
|
358
|
+
| `HQDESystem` | Main entry point | `hqde/core/hqde_system.py` |
|
|
359
|
+
| `DistributedEnsembleManager` | Manages Ray workers | `hqde/core/hqde_system.py` |
|
|
360
|
+
| `AdaptiveQuantizer` | Weight compression | `hqde/core/hqde_system.py` |
|
|
361
|
+
|
|
362
|
+
### Quantum Classes
|
|
363
|
+
|
|
364
|
+
| Class | Description | Location |
|
|
365
|
+
|-------|-------------|----------|
|
|
366
|
+
| `QuantumEnsembleAggregator` | Superposition/entanglement aggregation | `hqde/quantum/quantum_aggregator.py` |
|
|
367
|
+
| `QuantumNoiseGenerator` | Exploration noise | `hqde/quantum/quantum_noise.py` |
|
|
368
|
+
| `QuantumEnsembleOptimizer` | QUBO-based selection | `hqde/quantum/quantum_optimization.py` |
|
|
369
|
+
|
|
370
|
+
### Distributed Classes
|
|
371
|
+
|
|
372
|
+
| Class | Description | Location |
|
|
373
|
+
|-------|-------------|----------|
|
|
374
|
+
| `MapReduceEnsembleManager` | MapReduce pattern | `hqde/distributed/mapreduce_ensemble.py` |
|
|
375
|
+
| `HierarchicalAggregator` | Tree aggregation | `hqde/distributed/hierarchical_aggregator.py` |
|
|
376
|
+
| `ByzantineFaultTolerantAggregator` | Fault tolerance | `hqde/distributed/fault_tolerance.py` |
|
|
377
|
+
| `DynamicLoadBalancer` | Work distribution | `hqde/distributed/load_balancer.py` |
|
|
378
|
+
|
|
379
|
+
### Factory Function
|
|
380
|
+
|
|
381
|
+
```python
|
|
382
|
+
def create_hqde_system(
|
|
383
|
+
model_class, # PyTorch model class
|
|
384
|
+
model_kwargs, # Model initialization parameters
|
|
385
|
+
num_workers=4, # Number of distributed workers
|
|
386
|
+
quantization_config=None,
|
|
387
|
+
aggregation_config=None
|
|
388
|
+
) -> HQDESystem
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
---
|
|
392
|
+
|
|
393
|
+
## Performance Benchmarks
|
|
394
|
+
|
|
395
|
+
| Metric | Traditional Ensemble | HQDE | Improvement |
|
|
396
|
+
|--------|---------------------|------|-------------|
|
|
397
|
+
| Memory Usage | 2.4 GB | 0.6 GB | 4x reduction |
|
|
398
|
+
| Training Time | 45 min | 12 min | 3.75x faster |
|
|
399
|
+
| Communication | 800 MB | 100 MB | 8x less data |
|
|
400
|
+
| Test Accuracy | 91.2% | 93.7% | +2.5% |
|
|
401
|
+
|
|
402
|
+
---
|
|
403
|
+
|
|
404
|
+
## Documentation
|
|
405
|
+
|
|
406
|
+
- [HOW_TO_RUN.md](HOW_TO_RUN.md) - Detailed setup and usage guide
|
|
407
|
+
- [docs/](docs/) - Technical documentation
|
|
408
|
+
- [examples/](examples/) - Working code examples
|
|
409
|
+
|
|
410
|
+
---
|
|
411
|
+
|
|
412
|
+
## Contributing
|
|
413
|
+
|
|
414
|
+
1. Fork the repository
|
|
415
|
+
2. Create a feature branch (`git checkout -b feature/new-feature`)
|
|
416
|
+
3. Commit your changes (`git commit -m 'Add new feature'`)
|
|
417
|
+
4. Push to the branch (`git push origin feature/new-feature`)
|
|
418
|
+
5. Open a Pull Request
|
|
419
|
+
|
|
420
|
+
---
|
|
421
|
+
|
|
422
|
+
## License
|
|
423
|
+
|
|
424
|
+
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
|
|
425
|
+
|
|
426
|
+
---
|
|
427
|
+
|
|
428
|
+
## Citation
|
|
429
|
+
|
|
430
|
+
```bibtex
|
|
431
|
+
@software{hqde2025,
|
|
432
|
+
title={HQDE: Hierarchical Quantum-Distributed Ensemble Learning},
|
|
433
|
+
author={Prathamesh Nikam},
|
|
434
|
+
year={2025},
|
|
435
|
+
url={https://github.com/Prathmesh333/HQDE-PyPI}
|
|
436
|
+
}
|
|
437
|
+
```
|
|
438
|
+
|
|
439
|
+
---
|
|
440
|
+
|
|
441
|
+
## Support
|
|
442
|
+
|
|
443
|
+
- **Bug Reports:** [Create an issue](https://github.com/Prathmesh333/HQDE-PyPI/issues)
|
|
444
|
+
- **Feature Requests:** [Create an issue](https://github.com/Prathmesh333/HQDE-PyPI/issues)
|
|
445
|
+
- **Questions:** [Start a discussion](https://github.com/Prathmesh333/HQDE-PyPI/issues)
|
|
@@ -2,7 +2,7 @@ hqde/__init__.py,sha256=jxetUxE9gTqHOpxYDx2ZwcJKIkHa7eMIprl9dGuqiBI,1353
|
|
|
2
2
|
hqde/__main__.py,sha256=6Dozsi53MxYGWL_vFJaH4KuTVJu_RtcD0Tjpn1bGiF0,3054
|
|
3
3
|
hqde/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
4
4
|
hqde/core/__init__.py,sha256=ZLB6uBaJKyfTaSeHckiyW21HUzKcDGo52hdj0gJzL1U,499
|
|
5
|
-
hqde/core/hqde_system.py,sha256=
|
|
5
|
+
hqde/core/hqde_system.py,sha256=D2-26bvuwQHKynIRAR9-yAY4hER-WcEwenUbblasf4A,22273
|
|
6
6
|
hqde/distributed/__init__.py,sha256=qOzxRxTJejXGiNwv2Ibts5m4pSLt8KtzLWu0RgEQnuU,584
|
|
7
7
|
hqde/distributed/fault_tolerance.py,sha256=TMfLCXL14BO0TYL834r41oKoZ9dxxTp99Ux1d6hBMfw,14801
|
|
8
8
|
hqde/distributed/hierarchical_aggregator.py,sha256=UbtB2qU1ws70594woK_bJhvbjN6PA9XAWxggT8F00rY,15790
|
|
@@ -17,8 +17,8 @@ hqde/utils/config_manager.py,sha256=GY_uFBwj6qJ_ESkopIjR_vQwLIcILNqdNj2o_GFFAdg,
|
|
|
17
17
|
hqde/utils/data_utils.py,sha256=2CVHULh45Usf9zcvM7i3qeZkpLNzRSEPDQ4vCjHk14E,264
|
|
18
18
|
hqde/utils/performance_monitor.py,sha256=J4VntvwnBwMRAArtuVDr13oKcVjr4y5WWowW1dm21rI,16644
|
|
19
19
|
hqde/utils/visualization.py,sha256=NwiUrgMQFBeqrIblp2qFWl71bFNG58FZKESK2-GB8eM,185
|
|
20
|
-
hqde-0.1.
|
|
21
|
-
hqde-0.1.
|
|
22
|
-
hqde-0.1.
|
|
23
|
-
hqde-0.1.
|
|
24
|
-
hqde-0.1.
|
|
20
|
+
hqde-0.1.5.dist-info/licenses/LICENSE,sha256=ACTIUEzMwldWiL-H94KKJaGyUNxu_L5EQylXnagPamE,1065
|
|
21
|
+
hqde-0.1.5.dist-info/METADATA,sha256=w5yNPRW_SEM6Qn3UhKWdaxv8b6TEPkwHK-MKGDi97_Y,13989
|
|
22
|
+
hqde-0.1.5.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
23
|
+
hqde-0.1.5.dist-info/top_level.txt,sha256=lDNw5jGWRhvYQohaYu7Cm4F7vd3YFPIwoLULxJNopqc,5
|
|
24
|
+
hqde-0.1.5.dist-info/RECORD,,
|
hqde-0.1.3.dist-info/METADATA
DELETED
|
@@ -1,237 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: hqde
|
|
3
|
-
Version: 0.1.3
|
|
4
|
-
Summary: Hierarchical Quantum-Distributed Ensemble Learning Framework
|
|
5
|
-
Author-email: HQDE Team <hqde@example.com>
|
|
6
|
-
Maintainer-email: HQDE Team <hqde@example.com>
|
|
7
|
-
License: MIT
|
|
8
|
-
Project-URL: Homepage, https://github.com/Prathmesh333/Hierarchical-Quantum-Distributed-Ensemble-Learning
|
|
9
|
-
Project-URL: Repository, https://github.com/Prathmesh333/Hierarchical-Quantum-Distributed-Ensemble-Learning
|
|
10
|
-
Project-URL: Documentation, https://github.com/Prathmesh333/Hierarchical-Quantum-Distributed-Ensemble-Learning/blob/main/HOW_TO_RUN.md
|
|
11
|
-
Project-URL: Bug Reports, https://github.com/Prathmesh333/Hierarchical-Quantum-Distributed-Ensemble-Learning/issues
|
|
12
|
-
Keywords: machine-learning,quantum,distributed,ensemble,deep-learning,pytorch,ray
|
|
13
|
-
Classifier: Development Status :: 4 - Beta
|
|
14
|
-
Classifier: Intended Audience :: Science/Research
|
|
15
|
-
Classifier: Intended Audience :: Developers
|
|
16
|
-
Classifier: License :: OSI Approved :: MIT License
|
|
17
|
-
Classifier: Operating System :: OS Independent
|
|
18
|
-
Classifier: Programming Language :: Python :: 3
|
|
19
|
-
Classifier: Programming Language :: Python :: 3.9
|
|
20
|
-
Classifier: Programming Language :: Python :: 3.10
|
|
21
|
-
Classifier: Programming Language :: Python :: 3.11
|
|
22
|
-
Classifier: Programming Language :: Python :: 3.12
|
|
23
|
-
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
24
|
-
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
25
|
-
Requires-Python: >=3.9
|
|
26
|
-
Description-Content-Type: text/markdown
|
|
27
|
-
License-File: LICENSE
|
|
28
|
-
Requires-Dist: numpy>=2.0.2
|
|
29
|
-
Requires-Dist: torch>=2.8.0
|
|
30
|
-
Requires-Dist: torchvision>=0.23.0
|
|
31
|
-
Requires-Dist: ray[default]>=2.49.2
|
|
32
|
-
Requires-Dist: scikit-learn>=1.6.1
|
|
33
|
-
Requires-Dist: psutil>=7.1.0
|
|
34
|
-
Provides-Extra: dev
|
|
35
|
-
Requires-Dist: pytest>=8.4.2; extra == "dev"
|
|
36
|
-
Requires-Dist: ipython>=8.18.1; extra == "dev"
|
|
37
|
-
Requires-Dist: matplotlib>=3.9.4; extra == "dev"
|
|
38
|
-
Requires-Dist: pandas>=2.3.2; extra == "dev"
|
|
39
|
-
Requires-Dist: seaborn>=0.13.2; extra == "dev"
|
|
40
|
-
Requires-Dist: tqdm>=4.67.1; extra == "dev"
|
|
41
|
-
Dynamic: license-file
|
|
42
|
-
|
|
43
|
-
# HQDE - Hierarchical Quantum-Distributed Ensemble Learning
|
|
44
|
-
|
|
45
|
-
[](https://www.python.org/downloads/)
|
|
46
|
-
[](https://pytorch.org/)
|
|
47
|
-
[](https://ray.io/)
|
|
48
|
-
[](LICENSE)
|
|
49
|
-
|
|
50
|
-
> **A production-ready framework for distributed ensemble learning with quantum-inspired algorithms and adaptive quantization.**
|
|
51
|
-
|
|
52
|
-
HQDE combines cutting-edge quantum-inspired algorithms with distributed computing to deliver superior machine learning performance with significantly reduced memory usage and training time.
|
|
53
|
-
|
|
54
|
-
## ✨ Why HQDE?
|
|
55
|
-
|
|
56
|
-
- **🚀 4x faster training** with quantum-optimized algorithms
|
|
57
|
-
- **💾 4x memory reduction** through adaptive quantization
|
|
58
|
-
- **🔧 Production-ready** with fault tolerance and load balancing
|
|
59
|
-
- **🧠 Quantum-inspired** ensemble aggregation methods
|
|
60
|
-
- **🌐 Distributed** processing with automatic scaling
|
|
61
|
-
|
|
62
|
-
## 📦 Installation
|
|
63
|
-
|
|
64
|
-
### Option 1: Install from PyPI (Recommended)
|
|
65
|
-
```bash
|
|
66
|
-
pip install hqde
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
### Option 2: Install from Source
|
|
70
|
-
```bash
|
|
71
|
-
git clone https://github.com/Prathmesh333/HQDE-PyPI.git
|
|
72
|
-
cd HQDE-PyPI
|
|
73
|
-
pip install -e .
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
## 🚀 Quick Start
|
|
77
|
-
|
|
78
|
-
```python
|
|
79
|
-
from hqde import create_hqde_system
|
|
80
|
-
import torch.nn as nn
|
|
81
|
-
|
|
82
|
-
# Define your PyTorch model
|
|
83
|
-
class MyModel(nn.Module):
|
|
84
|
-
def __init__(self, num_classes=10):
|
|
85
|
-
super().__init__()
|
|
86
|
-
self.layers = nn.Sequential(
|
|
87
|
-
nn.Conv2d(3, 32, 3, padding=1),
|
|
88
|
-
nn.ReLU(),
|
|
89
|
-
nn.MaxPool2d(2),
|
|
90
|
-
nn.Conv2d(32, 64, 3, padding=1),
|
|
91
|
-
nn.ReLU(),
|
|
92
|
-
nn.AdaptiveAvgPool2d(1),
|
|
93
|
-
nn.Flatten(),
|
|
94
|
-
nn.Linear(64, num_classes)
|
|
95
|
-
)
|
|
96
|
-
|
|
97
|
-
def forward(self, x):
|
|
98
|
-
return self.layers(x)
|
|
99
|
-
|
|
100
|
-
# Create HQDE system (it's that simple!)
|
|
101
|
-
hqde_system = create_hqde_system(
|
|
102
|
-
model_class=MyModel,
|
|
103
|
-
model_kwargs={'num_classes': 10},
|
|
104
|
-
num_workers=4 # Use 4 distributed workers
|
|
105
|
-
)
|
|
106
|
-
|
|
107
|
-
# Train your ensemble
|
|
108
|
-
metrics = hqde_system.train(train_loader, num_epochs=10)
|
|
109
|
-
|
|
110
|
-
# Make predictions
|
|
111
|
-
predictions = hqde_system.predict(test_loader)
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
## 🧪 Try the Examples
|
|
115
|
-
|
|
116
|
-
```bash
|
|
117
|
-
# Quick demo (30 seconds)
|
|
118
|
-
python examples/quick_start.py
|
|
119
|
-
|
|
120
|
-
# CIFAR-10 benchmark test
|
|
121
|
-
python examples/cifar10_synthetic_test.py
|
|
122
|
-
|
|
123
|
-
# Real CIFAR-10 dataset
|
|
124
|
-
python examples/cifar10_test.py
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
### Expected Results
|
|
128
|
-
```
|
|
129
|
-
=== HQDE CIFAR-10 Test Results ===
|
|
130
|
-
Training Time: 18.29 seconds
|
|
131
|
-
Test Accuracy: 86.10%
|
|
132
|
-
Memory Usage: 0.094 MB
|
|
133
|
-
Ensemble Diversity: 96.8%
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
## ⚙️ Key Features
|
|
137
|
-
|
|
138
|
-
### 🧠 Quantum-Inspired Algorithms
|
|
139
|
-
- **Quantum Superposition Aggregation**: Advanced ensemble combination
|
|
140
|
-
- **Entanglement-Based Correlation**: Sophisticated member coordination
|
|
141
|
-
- **Quantum Noise Injection**: Enhanced exploration and generalization
|
|
142
|
-
|
|
143
|
-
### 📊 Adaptive Quantization
|
|
144
|
-
- **Dynamic Bit Allocation**: 4-16 bit precision based on importance
|
|
145
|
-
- **Real-time Optimization**: Automatic compression without accuracy loss
|
|
146
|
-
- **Memory Efficiency**: Up to 20x reduction vs traditional methods
|
|
147
|
-
|
|
148
|
-
### 🌐 Distributed Processing
|
|
149
|
-
- **MapReduce Architecture**: Scalable with Ray framework
|
|
150
|
-
- **Byzantine Fault Tolerance**: Robust against node failures
|
|
151
|
-
- **Hierarchical Aggregation**: O(log n) communication complexity
|
|
152
|
-
|
|
153
|
-
## 📈 Performance Benchmarks
|
|
154
|
-
|
|
155
|
-
| Metric | Traditional Ensemble | HQDE | Improvement |
|
|
156
|
-
|--------|---------------------|------|-------------|
|
|
157
|
-
| Memory Usage | 2.4 GB | 0.6 GB | **4x reduction** |
|
|
158
|
-
| Training Time | 45 min | 12 min | **3.75x faster** |
|
|
159
|
-
| Communication | 800 MB | 100 MB | **8x less data** |
|
|
160
|
-
| Test Accuracy | 91.2% | 93.7% | **+2.5% better** |
|
|
161
|
-
|
|
162
|
-
## 🔧 Configuration
|
|
163
|
-
|
|
164
|
-
Customize HQDE for your needs:
|
|
165
|
-
|
|
166
|
-
```python
|
|
167
|
-
# Fine-tune quantization
|
|
168
|
-
quantization_config = {
|
|
169
|
-
'base_bits': 8, # Default precision
|
|
170
|
-
'min_bits': 4, # High compression
|
|
171
|
-
'max_bits': 16 # High precision
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
# Adjust quantum parameters
|
|
175
|
-
aggregation_config = {
|
|
176
|
-
'noise_scale': 0.005, # Quantum noise level
|
|
177
|
-
'exploration_factor': 0.1, # Exploration strength
|
|
178
|
-
'entanglement_strength': 0.1 # Ensemble correlation
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
# Scale distributed processing
|
|
182
|
-
hqde_system = create_hqde_system(
|
|
183
|
-
model_class=YourModel,
|
|
184
|
-
num_workers=8, # Scale up for larger datasets
|
|
185
|
-
quantization_config=quantization_config,
|
|
186
|
-
aggregation_config=aggregation_config
|
|
187
|
-
)
|
|
188
|
-
```
|
|
189
|
-
|
|
190
|
-
## 📚 Documentation
|
|
191
|
-
|
|
192
|
-
- **[HOW_TO_RUN.md](HOW_TO_RUN.md)** - Detailed setup and usage guide
|
|
193
|
-
- **[Examples](examples/)** - Working code examples and demos
|
|
194
|
-
- **[API Reference](hqde/)** - Complete module documentation
|
|
195
|
-
|
|
196
|
-
## 🤝 Contributing
|
|
197
|
-
|
|
198
|
-
We welcome contributions! Please:
|
|
199
|
-
|
|
200
|
-
1. Fork the repository
|
|
201
|
-
2. Create a feature branch (`git checkout -b feature/amazing-feature`)
|
|
202
|
-
3. Commit your changes (`git commit -m 'Add amazing feature'`)
|
|
203
|
-
4. Push to the branch (`git push origin feature/amazing-feature`)
|
|
204
|
-
5. Open a Pull Request
|
|
205
|
-
|
|
206
|
-
## 📄 License
|
|
207
|
-
|
|
208
|
-
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
|
|
209
|
-
|
|
210
|
-
## 🔗 Citation
|
|
211
|
-
|
|
212
|
-
If you use HQDE in your research, please cite:
|
|
213
|
-
|
|
214
|
-
```bibtex
|
|
215
|
-
@software{hqde2025,
|
|
216
|
-
title={HQDE: Hierarchical Quantum-Distributed Ensemble Learning},
|
|
217
|
-
author={Prathamesh Nikam},
|
|
218
|
-
year={2025},
|
|
219
|
-
url={https://github.com/Prathmesh333/HQDE-PyPI}
|
|
220
|
-
}
|
|
221
|
-
```
|
|
222
|
-
|
|
223
|
-
## 🆘 Support
|
|
224
|
-
|
|
225
|
-
- **🐛 Bug Reports**: [Create an issue](https://github.com/Prathmesh333/HQDE-PyPI/issues)
|
|
226
|
-
- **💡 Feature Requests**: [Create an issue](https://github.com/Prathmesh333/HQDE-PyPI/issues)
|
|
227
|
-
- **💬 Questions**: [Start a discussion](https://github.com/Prathmesh333/HQDE-PyPI/issues)
|
|
228
|
-
|
|
229
|
-
---
|
|
230
|
-
|
|
231
|
-
<div align="center">
|
|
232
|
-
|
|
233
|
-
**Built with ❤️ for the machine learning community**
|
|
234
|
-
|
|
235
|
-
[⭐ Star](https://github.com/Prathmesh333/HQDE-PyPI/stargazers) • [🍴 Fork](https://github.com/Prathmesh333/HQDE-PyPI/fork) • [📝 Issues](https://github.com/Prathmesh333/HQDE-PyPI/issues)
|
|
236
|
-
|
|
237
|
-
</div>
|
|
File without changes
|
|
File without changes
|