Створення власного графа даних
| Поле | Значення |
|---|---|
| Категорія | Графи та конвеєри |
| Складність | Середній |
| Орієнтовний час читання | 15-20 minutes |
| Мітки | graph, traversal, metadata |
Розділ 003 створив анонімний граф «Вхід → Вихід» і запустив його за допомогою позиційних викликів run(). Справжня оркестрація — розгалуження, зведення, маршрутизація для кожного потоку — потребує звернення до кінцевих точок за назвою, а не за позицією. У цьому розділі представлено цю поверхню іменованих кінцевих точок на найменшому можливому графі, щоб ви могли побачити механізми іменування та з’єднання окремо, перш ніж розділи про багатопотоковість і вбудовані моделі будуть їх розвивати.
Публічний Graph є поверхнею композиції застосунку: ви add(...) вузли, connect(...) іменовані кінцеві точки, build() один раз, щоб створити багаторазовий Run, а потім push("image", ...) і pull("out", ...) за назвою. В результаті ви передасте один тензор Sample через іменований граф і підтвердите, що його stream_id, frame_id і pts_ns залишилися незмінними — це доказ того, що середовище виконання зберігає метадані від початку до кінця.
Покроковий огляд
Складіть граф
Додайте два вузли. Input("image") оголошує точку надсилання (push endpoint) під назвою image; Output("out") оголошує точку отримання (pull endpoint) під назвою out. Назви є частиною контракту — це саме ті рядки, які ви передаватимете до push(...) і pull(...) пізніше. Надання імен точкам (замість покладання на порядок додавання) дозволяє створювати більші графи з кількома входами або виходами, що робить їх однозначними для керування.
Вузли надходять з simaai::neat::nodes::Input("image") і nodes::Output("out").
// `Graph` is the public composition type. Input("image") declares the name
// used by Run::push("image", ...). Output("out") declares the name used by
// Run::pull("out", ...).
simaai::neat::Graph graph;
graph.add(simaai::neat::nodes::Input("image"));
graph.add(simaai::neat::nodes::Output("out"));
З’єднайте кінцеві точки
connect("image", "out") оголошує ребро: кадри, що надсилаються до image, передаються до out. Маючи лише два вузли, це вся топологія, але connect(...) — це та сама функція, яку ви б використовували для створення гілок і з’єднань у більшому графі. Потім ми виводимо graph.describe(), щоб вивести створену топологію — це швидка перевірка, щоб переконатися, що граф з’єднано так, як ви й задумали, перш ніж його будувати.
graph.connect("image", "out");
std::cout << graph.describe() << "\n";
Створіть і надішліть приклад
build() (у цьому випадку не потрібен початковий зразок) реалізує опис у вигляді виконуваного Run. Потім ми створюємо один детермінований тензор Sample — RGB-зображення розміром 8×8×3, що містить відомі stream_id, frame_id та pts_ns — і передаємо його до кінцевої точки image за назвою за допомогою push(...). Метадані зразка — це те, що ми перевіримо з іншого боку.
push(...) повертає булеве значення; у разі збою ми передаємо run.last_error(). Зразок створюється за допомогою make_sample().
simaai::neat::Run run = graph.build();
if (!run.push("image", make_sample())) {
throw std::runtime_error("push failed: " + run.last_error());
}