Я проектирую простой графический интерфейс «структура» с виджетами и макетами. Давайте проиллюстрируем проблему на простом примере основного горизонтального макета, который помещает его детские виджеты рядом друг с другом, и если в конце осталось места, оно оставит его пустым. Вертикально все они будут растянуты до полной высоты макета. Горизонтальная планировка просит каждого ребенка взять минимально возможное пространство горизонтально. С другой стороны, измерения макета корня (которая заполняет окно приложения) известны, поэтому, если горизонтальная планировка была макетом корня, мы бы знали высоту каждого ребенка.
Dimensions layout(Dimensions minDimensions, Dimensions maxDimensions);
< /code>
Итак, для первого ребенка в горизонтальном макете это будет < /p>
child->layout(Dimensions(0, parentMinDimensions.height), parentMaxDimensions);
< /code>
Поскольку его ширина может быть произвольно мала, но не больше, чем у всей макета, и вертикально, она должна соответствовать макету, поэтому применяются те же ограничения.Dimensions layout(Dimensions minDimensions, Dimensions maxDimensions) {
int remainingWidth = maxDimensions.width;
for (Widget *child : children) {
Dimensions childDimensions = child->layout(
Dimensions(0, minDimensions.height),
Dimensions(remainingWidth, maxDimensions.height)
);
remainingWidth -= childDimensions.width;
minDimensions.height = max(minDimensions.height, childDimensions.height);
}
return Dimensions(maxDimensions.width-remainingWidth, minDimensions.height);
}
< /code>
выглядит хорошо, но есть одна проблема. Предполагалось, что макет должен растянуть всех детей вертикально до его высоты, но если горизонтальная компоновка, например, является ребенком вертикальной макета, то высота входного минима и максимальная высота, и каждый виджет может в конечном итоге с другой высотой. И вот где возникает проблема. Я не верю, что это можно решить без оценки макета каждого ребенка дважды: < /p>
Dimensions layout(Dimensions minDimensions, Dimensions maxDimensions) {
// First pass - determine height
int height = minDimensions.height;
int remainingWidth = maxDimensions.width;
for (Widget *child : children) {
Dimensions childDimensions = child->layout(
Dimensions(0, minDimensions.height),
Dimensions(remainingWidth, maxDimensions.height)
);
remainingWidth -= childDimensions.width;
height = max(height, childDimensions.height);
}
// Second pass - apply height
remainingWidth = maxDimensions.width;
for (Widget *child : children) {
Dimensions childDimensions = child->layout(
Dimensions(0, height),
Dimensions(remainingWidth, height)
);
remainingWidth -= childDimensions.width;
}
return Dimensions(maxDimensions.width-remainingWidth, height);
}
< /code>
Макеты организованы в иерархию дерева произвольного размера и глубины, а также оценивают весь поддерек в каждом узле более одного раза, что приводит к экспоненциальной сложности. Существуют некоторые сценарии, где макет должен быть быстро пересекает каждый кадр, например, когда пользователь изменяет размер окна, так что это было бы плохо. Время выполнения даже в худшем случае сценария (и без жертвы гибкости макетов).
[b] сноска [/b]
Я знаю, что вместо того, чтобы вызовать макет
дважды, я могу вместо этого иметь две функции, такие как
Dimensions measure(Dimensions minDimensions, Dimensions maxDimensions);
void layout(Dimensions exactDimensions);
< /code>
и, возможно, даже гарантирует, что первый только когда -либо пересекает дерево только один раз, но в приведенном выше примере мне все равно придется вызвать оба в функции макета для каждого ребенка, поэтому экспоненциальная сложность все еще там. Кроме того, у меня больше не было бы возможности пропускать второй раунд, если бы MIN и максимальная высота были равны, поэтому я не верю, что это даже было бы полезно во всех случаях. Экспоненциальная сложность "Big O" - это то, что меня интересует, а не постоянная оптимизация факторов.
Я проектирую простой графический интерфейс «структура» с виджетами и макетами. Давайте проиллюстрируем проблему на простом примере основного горизонтального макета, который помещает его детские виджеты рядом друг с другом, и если в конце осталось места, оно оставит его пустым. Вертикально все они будут растянуты до полной высоты макета. Горизонтальная планировка просит каждого ребенка взять минимально возможное пространство горизонтально. С другой стороны, измерения макета корня (которая заполняет окно приложения) известны, поэтому, если горизонтальная планировка была макетом корня, мы бы знали высоту каждого ребенка.[code]Dimensions layout(Dimensions minDimensions, Dimensions maxDimensions); < /code> Итак, для первого ребенка в горизонтальном макете это будет < /p> child->layout(Dimensions(0, parentMinDimensions.height), parentMaxDimensions); < /code> Поскольку его ширина может быть произвольно мала, но не больше, чем у всей макета, и вертикально, она должна соответствовать макету, поэтому применяются те же ограничения.Dimensions layout(Dimensions minDimensions, Dimensions maxDimensions) { int remainingWidth = maxDimensions.width; for (Widget *child : children) { Dimensions childDimensions = child->layout( Dimensions(0, minDimensions.height), Dimensions(remainingWidth, maxDimensions.height) ); remainingWidth -= childDimensions.width; minDimensions.height = max(minDimensions.height, childDimensions.height); } return Dimensions(maxDimensions.width-remainingWidth, minDimensions.height); } < /code> выглядит хорошо, но есть одна проблема. Предполагалось, что макет должен растянуть всех детей вертикально до его высоты, но если горизонтальная компоновка, например, является ребенком вертикальной макета, то высота входного минима и максимальная высота, и каждый виджет может в конечном итоге с другой высотой. И вот где возникает проблема. Я не верю, что это можно решить без оценки макета каждого ребенка дважды: < /p> Dimensions layout(Dimensions minDimensions, Dimensions maxDimensions) { // First pass - determine height int height = minDimensions.height; int remainingWidth = maxDimensions.width; for (Widget *child : children) { Dimensions childDimensions = child->layout( Dimensions(0, minDimensions.height), Dimensions(remainingWidth, maxDimensions.height) ); remainingWidth -= childDimensions.width; height = max(height, childDimensions.height); } // Second pass - apply height remainingWidth = maxDimensions.width; for (Widget *child : children) { Dimensions childDimensions = child->layout( Dimensions(0, height), Dimensions(remainingWidth, height) ); remainingWidth -= childDimensions.width; } return Dimensions(maxDimensions.width-remainingWidth, height); } < /code> Макеты организованы в иерархию дерева произвольного размера и глубины, а также оценивают весь поддерек в каждом узле более одного раза, что приводит к экспоненциальной сложности. Существуют некоторые сценарии, где макет должен быть быстро пересекает каждый кадр, например, когда пользователь изменяет размер окна, так что это было бы плохо. Время выполнения даже в худшем случае сценария (и без жертвы гибкости макетов). [b] сноска [/b] Я знаю, что вместо того, чтобы вызовать макет [/code] дважды, я могу вместо этого иметь две функции, такие как Dimensions measure(Dimensions minDimensions, Dimensions maxDimensions); void layout(Dimensions exactDimensions); < /code> и, возможно, даже гарантирует, что первый только когда -либо пересекает дерево только один раз, но в приведенном выше примере мне все равно придется вызвать оба в функции макета для каждого ребенка, поэтому экспоненциальная сложность все еще там. Кроме того, у меня больше не было бы возможности пропускать второй раунд, если бы MIN и максимальная высота были равны, поэтому я не верю, что это даже было бы полезно во всех случаях. Экспоненциальная сложность "Big O" - это то, что меня интересует, а не постоянная оптимизация факторов.
Я разрабатываю простую «структуру» графического пользовательского интерфейса с виджетами и макетами. Давайте проиллюстрируем проблему на простом примере базового горизонтального макета, в котором дочерние виджеты располагаются рядом друг с другом, и...
Я реализовал линейную функцию для алгоритма поиска, которая увеличивает документ в зависимости от времени, прошедшего с момента загрузки. Таким образом, чем новее документ, тем больше вероятность, что он будет представлен по данному поисковому...
Очевидно, я делаю что-то не так... Пожалуйста, взгляните на следующую программу. Он работает хорошо, но дает мне параметр лямбда для экспоненциального распределения, который далек от параметра, который я использовал для генерации случайных...
Кто-нибудь знает, как получить загрузку графического процессора (в процентах) и температуру графического процессора на видеокартах Radeon, используя API из какого-либо AMD SDK? Похоже, что в AGS SDK нет необходимого API. Например, у NVIDIA есть...
Я обучаю свою модель на удаленном сервере, используя API GridSearchCV для настройки некоторых гиперпараметров, таких как epochs, l_rate, пакетный_размер и терпение. К сожалению, при их настройке после нескольких итераций я получаю следующую ошибку:...