Набор инструментов для решения инкрементальных ограничений
Cassowary — это набор инструментов для решения инкрементальных ограничений , который эффективно решает системы линейных равенств и неравенств . Ограничения могут быть как требованиями, так и предпочтениями. Клиентский код указывает ограничения, которые необходимо поддерживать, а решатель обновляет ограниченные переменные, чтобы они имели значения, удовлетворяющие ограничениям.
Cassowary был разработан Грегом Дж. Бадросом, Аланом Борнингом и Питером Дж. Стаки и был оптимизирован для приложений пользовательского интерфейса. [1] Бадрос использовал Cassowary среди прочего для реализации каскадных таблиц стилей Constraint Cascading Style Sheets (CCSS), расширения каскадных таблиц стилей (CSS). CCSS добавляет поддержку ограничений макета . Они позволяют дизайнерам описывать макет веб-страницы более гибко. Cassowary используется для решения этих ограничений и расчета окончательного макета.
Первоначальный дистрибутив, [2] не поддерживаемый с 2000 года, включал реализации Smalltalk , C++ и Java , а также привязки для GNU Guile , Python и STk. Существуют сторонние реализации для JavaScript , [3] Dart , [4] Squeak , [5] Python , [6] [7] .NET Framework , [8] и Rust . [9]
Приложения
По состоянию на сентябрь 2014 года GSS, язык и движок макетов для веб-сайтов, разрабатывается The Grid. [10] Это современное расширение CCSS. [11]
Layx — язык верстки для веб-сайтов, разработанный с учетом простоты использования. [12]
^ Kiwi, замена Casuarius/Cassowary. Новый решатель устраняет это узкое место. Он по-прежнему использует тот же алгоритм Cassowary, но это реализация алгоритма с нуля, основанная на статье Cassowary, а не на существующем исходном коде Cassowary. Хотя алгоритм Cassowary хорош, существующая реализация C++ имеет много неэффективностей. Новый решатель где-то в 12–500 раз быстрее в зависимости от задачи (обычно в 40 раз) и использует примерно в 5 раз меньше памяти. И, как я обычно делаю, я решил написать привязки Python вручную на C++, а не использовать Cython. Результирующий код быстрее, и теперь у нас на одну внешнюю зависимость меньше.