ICustomTypeDescriptor, TypeDescriptionProvider, TypeConverter и UITypeEditor

Аргумент ... для slsqp позволяет передавать произвольные аргументы в целевую функцию. Итак, определите новую целевую функцию, которая принимает indices в качестве аргумента:

eval_f2 <- function(x,indices){
  return(sum(x[indices]^2))
}

... и включает в себя indices=c(4,7,9) (в соответствии с определением вашей предыдущей целевой функции):

res2 <- slsqp(x0=x0,fn=eval_f2, hin = hin,heq = heq, indices=c(4,7,9))
[1116 ] Проверьте решение:

all.equal(res$par,res2$par) ## TRUE

фабрики

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

eval_factory <- function(indices) {
    fun <- function(x) {
        return(sum(x[indices]^2))
    }
    return(fun)
}

res3 <- slsqp(x0=x0, fn=eval_factory(indices=c(4,7,9)),
              hin = hin,heq = heq)
all.equal(res$par,res3$par) ## TRUE

фабрика хин

hin_factory <- function(A,b) {
    fun <- function(x) {
        return((A %*% x) + b)
    }
    return(fun)
}

A0 <- matrix(c(1, -1,  0, 1,-1,  0, 0, 0, 0,
               1,  0, -1, 1, 0, -1, 0, 0, 0,
               0,  1, -1, 0, 1, -1, 0, 0, 0,
              -1,  1,  0, 0, 0,  0,-1, 1, 0,
               0,  1, -1, 0, 0,  0, 0, 1, -1,
               1,  0, -1, 0, 0,  0, 1, 0, -1),
             byrow=TRUE,ncol=9)

all.equal(c(hin_factory(A0,-0.01)(x0)),hin(x0))

res4 <- slsqp(x0=x0, fn=eval_factory(indices=c(4,7,9)),
              hin = hin_factory(A0,b=-0.01), heq = heq)

all.equal(res$par, res4$par)
38
задан Eric Anastas 14 April 2009 в 22:05
поделиться

1 ответ

Настройки:

  • TypeDescriptionProvider

    • все еще заменяет метаданные (не расширяются)
    • также может быть добавлено в TypeDescriptor.AddProvider
    • может применяться как для каждого типа, так и для каждого экземпляра, что позволяет применять к спискам без необходимости реализации ITypedList
  • TypeConverter

    • для PropertyGrid это также механизм, используемый для получения метаданных; обратите внимание, что ExpandableObjectConverter просто делегирует TypeDescriptor.GetProperties , но это не всегда так
    • , также ответственный за воссоздание неизменных объектов (таких как структуры) с изменениями
  • UITypeEditor

    • также отвечает за рисование окна предварительного просмотра в PropertyGrid

Дополнительно:

  • IExtenderProvider - добавляет свойства ; это может быть тем, что вы запутались с TypeDescriptionProvider
  • ITypedList - в целом близнец ICustomTypeDescriptor , но для списков; можно избежать, используя TypeDescriptionProvider и не объектный индексатор на любом IList , то есть public T this [int index] {get;}
  • IListSource - обеспечивает перенаправление между источником данных и данными; например, DataTable реализует IListSource , возвращая DefaultView при запросе
38
ответ дан Marc Gravell 27 November 2019 в 03:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: