-- full integration with mol-edit backend -- added readme -- added vqe local_computational
199 lines
6.7 KiB
Markdown
199 lines
6.7 KiB
Markdown
|
||
# 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
|
||
```
|