v1.0
-- full integration with mol-edit backend -- added readme -- added vqe local_computational
This commit is contained in:
198
README.md
Normal file
198
README.md
Normal file
@@ -0,0 +1,198 @@
|
||||
|
||||
# Quantum Compute Modules
|
||||
|
||||
Репозиторий содержит набор модулей для распределённой системы квантовых вычислений. Каждый модуль представляет собой тип эксперимента, который может быть выполнен на локальных вычислительных системах.
|
||||
|
||||
|
||||
## Архитектура модуля
|
||||
|
||||
Каждый модуль состоит из двух независимых компонентов:
|
||||
|
||||
| Компонент | Назначение |
|
||||
|-----------|------------|
|
||||
| **Frontend** | Пользовательский интерфейс. React SPA, компилируется в HTML, встраивается в iframe на центральном сервере. |
|
||||
| **Executor** | Python модуль, который скачивается и выполняется на локальной вычислительной системе. |
|
||||
|
||||
## Frontend
|
||||
|
||||
### Режимы работы
|
||||
|
||||
Frontend поддерживает два режима отображения:
|
||||
|
||||
| Режим | Когда используется | Что показывает |
|
||||
|-------|-------------------|----------------|
|
||||
| `List` | В списке задач эксперимента | Краткая информация (карточка) |
|
||||
| `Editor` | На странице отдельной задачи | Полный редактор с параметрами |
|
||||
|
||||
### API взаимодействия (postMessage)
|
||||
|
||||
#### Получение данных от системы
|
||||
|
||||
```javascript
|
||||
window.addEventListener("message", (event) => {
|
||||
const { type, data } = event.data;
|
||||
|
||||
if (type === "plugin-data") {
|
||||
// data.taskData — JSON строка с данными задачи
|
||||
// data.mode — "List" или "Editor"
|
||||
// data.theme — "light" или "dark"
|
||||
// data.simProgress — прогресс выполнения (если есть)
|
||||
}
|
||||
|
||||
if (type === "update") {
|
||||
// Сигнал обновить UI (после сохранения)
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
#### Отправка данных в систему
|
||||
|
||||
```javascript
|
||||
// При изменении данных задачи
|
||||
window.parent.postMessage({
|
||||
type: "plugin-update",
|
||||
data: JSON.stringify(taskData), // Данные задачи
|
||||
qubits_needed: number // Требуемое количество кубит
|
||||
}, "*");
|
||||
|
||||
// Сигнал готовности (отправляется после загрузки)
|
||||
window.parent.postMessage({ type: "plugin-ready" }, "*");
|
||||
```
|
||||
|
||||
### Обязательные экспорты
|
||||
|
||||
React приложение должно экспортировать компоненты с интерфейсом:
|
||||
|
||||
```typescript
|
||||
interface TaskData {
|
||||
// Определяется для каждого модуля
|
||||
}
|
||||
|
||||
interface TaskEditorProps {
|
||||
data: TaskData | undefined;
|
||||
setData: (data: TaskData, qubits_needed: number) => void;
|
||||
counter: number; // Инкрементируется при обновлении данных извне
|
||||
simProgress: any; // Прогресс выполнения (conn.send из executor)
|
||||
}
|
||||
```
|
||||
|
||||
### Сборка
|
||||
|
||||
```bash
|
||||
npm run build
|
||||
# Результат: dist/index.html — один файл со встроенными CSS/JS
|
||||
```
|
||||
|
||||
## Executor
|
||||
|
||||
Python модуль, который скачивается с сервера и выполняется на локальной ВС. Должен содержать две функции:
|
||||
|
||||
### prepare_data
|
||||
|
||||
Валидация и предобработка данных задачи. Вызывается на сервере перед помещением задачи в очередь.
|
||||
|
||||
```python
|
||||
def prepare_data(data: dict, system_info: dict) -> dict:
|
||||
```
|
||||
|
||||
Результаты, возвращаемые функцией, передаются затем в run_computation.
|
||||
|
||||
В случае ошибки в данных, функция должны поднять ошибку.
|
||||
|
||||
### run_computation
|
||||
|
||||
Выполнение вычислений на локальной ВС.
|
||||
|
||||
```python
|
||||
def run_computation(conn, dev, data):
|
||||
"""
|
||||
Args:
|
||||
conn: Connection объект для отправки прогресса
|
||||
conn.send(dict) — отправляет сообщение на сервер
|
||||
(сообщения сохраняются в simulation_result.result_data)
|
||||
|
||||
dev: PennyLane устройство
|
||||
qml.device(dev['name'], wires=dev['wires'])
|
||||
|
||||
data: processed_data из prepare_data
|
||||
|
||||
Returns: None
|
||||
"""
|
||||
```
|
||||
|
||||
### Пример executor'а
|
||||
|
||||
```python
|
||||
def prepare_data(data: dict, system_info: dict) -> dict:
|
||||
# Валидация входных данных
|
||||
if "my_param" not in data:
|
||||
return {
|
||||
"valid": False,
|
||||
"error_message": "Отсутствует параметр my_param"
|
||||
}
|
||||
|
||||
return {
|
||||
"valid": True,
|
||||
"processed_data": data,
|
||||
"qubits_required": data.get("qubits", 10)
|
||||
}
|
||||
|
||||
|
||||
def run_computation(conn, dev, data):
|
||||
import numpy as np
|
||||
|
||||
for step in range(data.get("steps", 100)):
|
||||
# ... вычисления ...
|
||||
|
||||
# Отправка прогресса
|
||||
conn.send({
|
||||
"step": step,
|
||||
"current_value": current_value
|
||||
})
|
||||
|
||||
return
|
||||
```
|
||||
|
||||
## Создание нового модуля
|
||||
|
||||
### Шаг 1: Создание Frontend
|
||||
|
||||
1. Скопируйте шаблон `new_module/` или создайте React приложение с нуля
|
||||
2. Реализуйте компоненты `ListItem` и `EditorPage`
|
||||
3. Реализуйте `wrapper.tsx` с обработкой postMessage
|
||||
4. Соберите проект: `npm run build`
|
||||
|
||||
### Шаг 2: Создание Executor
|
||||
|
||||
1. Создайте файл `executor.py`
|
||||
2. Реализуйте функцию `prepare_data`
|
||||
3. Реализуйте функцию `run_computation`
|
||||
|
||||
### Шаг 3: Регистрация модуля
|
||||
|
||||
Через API центрального сервера:
|
||||
|
||||
```bash
|
||||
curl -X POST https://quantum-backend/experiment/types \
|
||||
-F "name=Название модуля" \
|
||||
-F "description=Описание модуля" \
|
||||
-F "file_frontend=@dist/index.html" \
|
||||
-F "file_comp_system=@executor.py"
|
||||
```
|
||||
|
||||
|
||||
## Список модулей
|
||||
|
||||
| Модуль | Описание | Статус |
|
||||
|--------|----------|--------|
|
||||
| `vqe` | Расчёт энергии основного состояния молекул | ✅ Готов |
|
||||
|
||||
## Шаблон нового модуля
|
||||
|
||||
```bash
|
||||
git clone https://git.deowl.ru/vkrb/vqe_module
|
||||
cd quantum-modules
|
||||
cp -r new_module my_module
|
||||
# Редактируем frontend и executor
|
||||
# Регистрируем через API
|
||||
```
|
||||
Reference in New Issue
Block a user