Как преобразовать двоичный файл дампа Mathematica в список определений? - PullRequest
7 голосов
/ 05 августа 2011

Как сказано в документации, «DumpSave записывает определения в двоичном формате, который оптимизирован для ввода Mathematica ». Есть ли способ преобразовать двоичный файл дампа Mathematica обратно в список определений без их оценки? Import["file.mx","HeldExpression"] не работает ...

Ответы [ 2 ]

6 голосов
/ 05 августа 2011

DumpSave хранит значения, связанные с символом, т.е. OwnValues, DownValues, UpValues, SubValues, DefaultValues, NValues, FormatValues.

Вся оценка была сделана в сеансе на Mathematica, а затем DumpSave сохранил результат.

Эти значения хранятся во внутреннем формальном. Чтение файлов MX создает только символы и заполняет их этими значениями, считывая этот внутренний формат обратно, минуя оценщик.

Может быть, вы могли бы поделиться проблемой, которая побудила вас задать этот вопрос.


[ПРАВИТЬ] Разъяснение вопроса, поднятого Алексеем. Файлы MX сохраняют внутреннее представление определений символов. Похоже, что Mathematica внутренне отслеживает:
f[x_Real] := x^2 + 1
DumpSave[FileNameJoin[{$HomeDirectory, "Desktop", "set_delayed.mx"}], 
  f];
Remove[f]
f[x_Real] = x^2 + 1;
DumpSave[FileNameJoin[{$HomeDirectory, "Desktop", "set.mx"}], f];
setBytes = 
  Import[FileNameJoin[{$HomeDirectory, "Desktop", "set.mx"}], "Byte"];
setDelayedBytes = 
  Import[FileNameJoin[{$HomeDirectory, "Desktop", "set_delayed.mx"}], 
   "Byte"];

Затем можно использовать SequenceAlignment[setBytes, setDelayedBytes], чтобы увидеть разницу. Я не знаю, почему это так, но моя точка зрения остается верной. Вся оценка значений, построенных с использованием Set, уже была выполнена в сеансе Mathematica до того, как они были сохранены с помощью DumpSave. При чтении файла MX внутреннее представление считывается обратно в сеансы Mathematica, и оценка загруженных определений фактически не выполняется.

1 голос
/ 03 марта 2016

Вы можете назначить Rule s вместо RuleDelayed s для DownValues, что эквивалентно непосредственным определениям. Правая часть назначения остается неоцененной и копируется буквально, поэтому команда, соответствующая

Clear[f]; 
f[x_Real] = x^2 + 1;
DumpSave["f.mx", f];
Clear[f];
f = a;
<< f.mx;
Definition[f]

будет

Clear[f];
f = a;
DownValues[f] := {f[x_Real] -> x^2 + 1}
Definition[f]

f = a

f [x_Real] = x ^ 2 + 1

(ср. С вашим примером Clear[f]; f = a; f[x_Real] = x^2 + 1; Definition[f], который не работает, вместо этого присваивая правило для a[x_Real]). Это верно и для предыдущих назначений x.


Редактировать : Это не устойчиво к побочным эффектам с правой стороны, как показывает пример в комментариях ниже Чтобы назначить понижающее значение, избегая любой оценки, можно использовать недокументированное System`Private`ValueList, как показано ниже:

Clear[f];
f := Print["f is evaluated!"];
DownValues[f] := System`Private`ValueList[f[x_Real] -> Print["definition is evaluated!"]];

(без вывода)


Обратите внимание, что назначение, по-видимому, преобразовано в отложенные правила:

DownValues[f]

{HoldPattern [f [x_Real]]:> x ^ 2 + 1}

, но DefinitionSave) показывают, что отличие от := внутренне сохранено. Я не знаю, почему DownValues не показывает правду.

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

...