Как создавать и инициализировать экземпляры записей в FICO Xpress Mosel

Я пытаюсь реструктурировать некоторый код в Mosel и использовать наборы записей для представления индексов разреженных многомерных массивов. Я хочу иметь возможность динамически заполнять свои наборы записей, поэтому я не могу использовать материал для инициализации из файла или базы данных.

У меня есть:

declarations
    myTuple = record
        index1 : string
        index2 : string
    end-record
    sparseIndex : set of myTuple
end-declarations

а затем я хочу сделать что-то вроде:

forall (a in largeListOfStrings)
    forall (b in anotherListOfStrings)
        if (someCondition(a,b)) then
            sparseIndex += { new myTuple(a, b) }

но в Мозеле нет «нового» ключевого слова или оператора, и документация в этом отношении выглядит довольно слабой, поэтому я просто не знаю, как создать новый экземпляр моей записи и инициализировать его, чтобы я мог добавить его в свой динамический набор .

В качестве альтернативы, я могу просто думать об этом неправильно - есть ли лучший способ создать набор разреженных индексов, который сохраняет доступ к компонентам разреженного индекса.


person TimChippingtonDerrick    schedule 21.08.2013    source источник


Ответы (1)


Вам не нужно определять запись для этого случая. Mosel отлично подходит для хранения информации о разреженных массивах. Вы должны сделать что-то вроде:

declarations
    largeListOfStrings, anotherListOfStrings: set of string
    mylist: dynamic array(largeListOfStrings, anotherListOfStrings) of integer 
end-declarations

forall(a in largeListOfStrings, b in anotherListOfStrings | someCondition(a,b) = true) do
    mylist(a, b) := 1
end-do

Так что отныне ваша разреженная матрица будет храниться в моем списке. Каждый раз, когда вы хотите перебрать его, вы должны использовать логику вроде:

forall(a in largeListOfStrings, b in anotherListOfStrings | exists(mylist(a,b))) do
    ! Here you will iterate
end-do
person Baykal    schedule 12.08.2014