bonsai icon indicating copy to clipboard operation
bonsai copied to clipboard

Ещё одна ошибка генерации генеалогического дерева

Open Katarn opened this issue 4 years ago • 13 comments

Поставил ползунок качества генерации дерева на 100%. Получаю:

2020-07-28T11:38:21.759370414Z [11:38:21 INF] Tree layout started: 274 people, 274 rels, 1 subtrees.
2020-07-28T11:46:16.260175410Z [11:46:16 ERR] Failed to generate a tree layout.
2020-07-28T11:46:16.260258084Z System.Net.Http.HttpRequestException: An error occurred while sending the request.
2020-07-28T11:46:16.260345705Z  ---> System.IO.IOException: The response ended prematurely.
2020-07-28T11:46:16.260360221Z    at System.Net.Http.HttpConnection.FillAsync()
2020-07-28T11:46:16.260847960Z    at System.Net.Http.HttpConnection.ReadNextResponseHeaderLineAsync(Boolean foldedHeadersAllowed)
2020-07-28T11:46:16.260901186Z    at System.Net.Http.HttpConnection.SendAsyncCore(HttpRequestMessage request, CancellationToken cancellationToken)
2020-07-28T11:46:16.260962181Z    --- End of inner exception stack trace ---
2020-07-28T11:46:16.261255874Z    at System.Net.Http.HttpConnection.SendAsyncCore(HttpRequestMessage request, CancellationToken cancellationToken)
2020-07-28T11:46:16.261516531Z    at System.Net.Http.HttpConnectionPool.SendWithNtConnectionAuthAsync(HttpConnection connection, HttpRequestMessage request, Boolean doRequestAuth, CancellationToken cancellationToken)
2020-07-28T11:46:16.261541067Z    at System.Net.Http.HttpConnectionPool.SendWithRetryAsync(HttpRequestMessage request, Boolean doRequestAuth, CancellationToken cancellationToken)
2020-07-28T11:46:16.261812801Z    at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
2020-07-28T11:46:16.261842028Z    at System.Net.Http.HttpClient.FinishSendAsyncBuffered(Task`1 sendTask, HttpRequestMessage request, CancellationTokenSource cts, Boolean disposeCts)
2020-07-28T11:46:16.262145686Z    at Microsoft.AspNetCore.NodeServices.HostingModels.HttpNodeInstance.InvokeExportAsync[T](NodeInvocationInfo invocationInfo, CancellationToken cancellationToken)
2020-07-28T11:46:16.262415143Z    at Microsoft.AspNetCore.NodeServices.HostingModels.OutOfProcessNodeInstance.InvokeExportAsync[T](CancellationToken cancellationToken, String moduleName, String exportNameOrNull, Object[] args)
2020-07-28T11:46:16.262440607Z    at Microsoft.AspNetCore.NodeServices.NodeServicesImpl.InvokeExportWithPossibleRetryAsync[T](String moduleName, String exportedFunctionName, Object[] args, Boolean allowRetry, CancellationToken cancellationToken)
2020-07-28T11:46:16.262749652Z    at Bonsai.Areas.Admin.Logic.TreeLayoutService.RenderTree(INodeServices js, TreeLayoutVM tree) in /build/Bonsai/Areas/Admin/Logic/TreeLayoutService.cs:line 295
2020-07-28T11:46:16.263031200Z    at Bonsai.Areas.Admin.Logic.TreeLayoutService.ProcessAsync(IServiceProvider services) in /build/Bonsai/Areas/Admin/Logic/TreeLayoutService.cs:line 86

Сегодня обновил все контейнеры (предыдущий раз обновлял зимой), так что версии актуальны на данный момент.

#158

Katarn avatar Jul 28 '20 11:07 Katarn

Второй случай, уменьшил до 80%:

2020-07-28T11:53:07.435658447Z [11:53:07 INF] Tree layout started: 274 people, 274 rels, 1 subtrees.
2020-07-28T11:58:06.312691860Z [11:58:06 ERR] Failed to generate a tree layout.

Третий случай, уменьшил до 70%:

2020-07-28T12:00:29.941553343Z [12:00:29 INF] Tree layout started: 274 people, 274 rels, 1 subtrees.
2020-07-28T12:03:45.211528752Z [12:03:45 ERR] Failed to generate a tree layout.

Четвёртый случай, уменьшил до 65%:

2020-07-28T12:04:40.307415531Z [12:04:40 INF] Tree layout started: 274 people, 274 rels, 1 subtrees.
2020-07-28T12:07:01.222539695Z [12:07:01 ERR] Failed to generate a tree layout.

Пятый случай, уменьшил до 60%:

2020-07-28T12:07:40.283269821Z [12:07:40 INF] Tree layout started: 274 people, 274 rels, 1 subtrees.
2020-07-28T12:09:19.605431809Z [12:09:19 INF] Tree layout completed.

И всё что меньше 60% - генерируется нормально.

Katarn avatar Jul 28 '20 12:07 Katarn

Кстати, не совсем про баг, но тоже в тему: сейчас дерево генерируется ну очень криво, невозможно разобраться куда ведут связи, практически любая пересекается с другой и так далее. Я сейчас говорю о настройке 60%, большей пока не имел возможности проверить (о том и issue). Я читал про сложности создания дерева на Хабре. На всякий случай поинтересуюсь, если настройка в 100% не поможет, есть ещё какие-то варианты по улучшению генерации дерева или это предел адекватных трудозатрат для такого pet project?

Katarn avatar Jul 28 '20 12:07 Katarn

На 100% качество графика значительно выше, чем на 50 (особенно если в базе 200+ людей). У меня в базе порядка сотни страниц, и разница очень ярко видна. Если же на вашей базе и 100% не даст достаточно хорошего результата - увы, готового решения для такого случая у меня нет.

К сожалению, похоже что проблема вызвана багом в самом ASP.NET Core, про который поговорили, но никто пока не пофиксил: https://github.com/dotnet/aspnetcore/issues/8447 Единственный гарантированный вариант исправить ее - отправить им PR с исправлением самому. Я попробую этим заняться на досуге, если автор тикета не откликнется.

impworks avatar Jul 28 '20 12:07 impworks

Понял, спасибо за разъяснение.

Katarn avatar Jul 28 '20 12:07 Katarn

Стоит посмотреть в сторону алгоритма HOLA. Дает довольно приличные результаты:

https://www.cs.ubc.ca/~tmm/courses/547-15/slides/emily-hola.pdf https://ialab.it.monash.edu/~dwyer/papers/hola2015.pdf

Ссылка на репозиторий: https://github.com/mjwybrow/adaptagrams/

Сходу видно несколько потенциальных проблем:

  1. Есть две реализации - Python и C++. Взаимодействие с обоими - задача нетривиальная
  2. Довольно скудная документация
  3. Неизвестно, будет ли оно работать быстрее \ качественнее
  4. Лицензия LGPL - следует изучить, совместима ли она с нашей

@DiverOfDark не хочешь поисследовать? :)

impworks avatar Aug 01 '20 18:08 impworks

Извините за мой французский, но ё* твою мать поисследовал на час :)

  1. Библиотека с автогенерацией биндингов от SWIG - якобы C# тоже поддерживается им.

Пункт 2 можно не читать: редактор Dunnart сырой и никуда не годится.

  1. Жаль, но типично. Хотя вроде один из авторов как пример использовал либы в его PoC редакторе графов Dunnart (ссылка в репе) - может можно пощупать. Попытка раз: на Windows падает до запуска (который Dunnart 2.0 nighly). Попытка два: в Linux билде не хватает либ (libicu18n.so.52 (!)) ... По традиции: завёл сборку проекта с пинком. Редактор очень забагованный. Либы в репозитории редактора 5-7 летней давности, вручную обновлять уже не хочется. Один только раз получилось добиться нормального "строгого" графа, в остальном по настройкам видно, что библиотеки фич имеют достаточно (например vert/horiz alignment двух нод) О состоянии библиотек это, думаю, ничего не говорит, только то, что у автора нет желания/времени обновить свой редактор и версии либ.

  2. Посмотрел презентацию, paper не читал. Имхо: графы тоже понравились, но кмк лучше было бы какое-то представление посередине между yFiles (слишком "строгое" компьютеризованное представление) и HOLA (больше походит на mindmap).

Всё же: HOLA приятнее глазу, разрастается наружу (особенность алгоритма - сделали так по результатам наблюдения). Сферический человек в вакууме с континента на буквы С-А проще находит цель в графе построенным HOLA (см. презентация стр. 37)

Тесты скорости: стр. 9 из публикации. При 170 nodes + density=1.1 - 12s. При намного меньшем кол-ве nodes=90 и при density=15 - 23s. Смотря на график можно сказать, что время отрисовки взрывается по экспоненте при таких параметрах намного раньше. Графы для тестов - рандомные. yFiles стабильно очень быстрый в отличие от.

  1. LGPL в качестве подключаемой либы требует минимум: взаимозаменяемость либы как компонента работающей программы и оставшиеся, маловлияющие на включение, заморочки GPL (copyright notice etc.)

VADemon avatar Aug 02 '20 06:08 VADemon

Ой, сразу не заметил, простите за флуд: https://github.com/tgdwyer/WebCola - JS и лицензия MIT (один из соавторов, так что всё легально). Можно извернуться :) Но libcola - лишь один из компонентов из всех их Adaptagrams.

VADemon avatar Aug 02 '20 06:08 VADemon

@VADemon спасибо за проделанный анализ. Однако тут все несколько сложнее:

  1. Способов взаимодействия между приложениями на разных языках довольно много. Например, Bonsai общается с нативным ffmpeg, просто вызывая исполняемый файл и читая его вывод в консоль. В дотнете также есть встроенный и кроссплатформенный P/Invoke. И да, еще есть некий SWIG, про который лично я до этого ничего не слышал. Но проблема совсем не во взаимодействии, а в человеческом ресурсе. С тем же ffmpeg можно всегда быть уверенным, что есть достаточное число мейнтейнеров, предоставляющих стабильные билды под любые архитектуры и платформы, то с HOLA это не так, и ковыряться придется самому.

  2. Поддерживаю мысль о том, что библиотека может быть хорошей, а вот на обвязку вокруг нее сил уже не хватило.

  3. Ниша узкая и сложная, а требования специфичные. Найти движок лэйаута, который бы одновременно работал быстро, красиво и еще и по лицензии подходил, невозможно. Приходится довольствоваться тем, что есть. Но если он еще медленнее, чем использующийся сейчас ELK - то это грустно.

impworks avatar Aug 16 '20 13:08 impworks

@Katarn, я наконец-то смог убрать таймаут для генерации дерева. Если есть возможность - проверьте пожалуйста на самой последней версии, будет ли оно создаваться. Советую начать с точности в 80%, т.к. на максимальной с вашим числом записей генерация может занять очень много времени

impworks avatar Jun 29 '21 11:06 impworks

Спасибо, проверю на днях. Давно не запускал дерево, а на днях обнаружил, что xip.io отвалился, сначала разберусь с ним.

Katarn avatar Jul 01 '21 20:07 Katarn

Потестировал, больше не падает. Спасибо! Циферки тоже собрал, если интересно. Дерево с тех пор не изменялось. При настройке 80%, генерируется за 5,5 минут, 100% - 7. На 100% само дерево получилось не сильно лучше, чем было на 60%. Но тут я помню, у вас возможности как-то улучшить ситуацию нет.

Katarn avatar Dec 02 '21 10:12 Katarn

Спасибо за проверку!

Улучшить общее дерево действительно не получится, но я планирую помимо одного большого дерева добавить на каждую страницу по несколько маленьких. Например "предки" - только вверх от выбранного человека на 3 уровня, или "потомки" - аналогично, но вниз. Данных на таких деревьях будет значительно меньше, благодаря чему они будут рисоваться быстрее и выглядеть чище.

impworks avatar Dec 02 '21 11:12 impworks

Да, кажется по такому принципу работают сайты типа MyHeritage (хотя я его лет 100 назад смотрел, могу и напутать).

Katarn avatar Dec 02 '21 14:12 Katarn

Теперь поддерживается 4 типа деревьев: общее, потомки, предки и "близкая семья". Можно включить любую комбинацию в настройках (или даже выключить генерацию деревьев насовсем). Индивидуальные деревья генерируются очень быстро, по 20-30 штук в секунду, поэтому для баз с числом записей более 70 я бы советовал включить их и отключить общее.

impworks avatar Jan 12 '24 16:01 impworks