user_guide:tutorials:latest:data

no way to compare when less than two revisions

Differences

This shows you the differences between two versions of the page.


user_guide:tutorials:latest:data [2023/11/06 10:57] (current) – created - external edit 127.0.0.1
Line 1: Line 1:
 +====== Save and load data in polymake ======
 +
 +In polymake there are different ways to save and load data depending on the type and the format of the data. We distinguish between `big' objects (Polytope, Matroid,...), complex data types (Set, Matrix, Array<Vector<html><Rational></html>>,...), and data from files in arbitrary formats.
 +
 +===== Handling polymake objects =====
 +
 +Let us take this nice example object:
 +
 +<code perl>
 +> $p = cube(3);
 +</code>
 +To store big objects use the command
 +
 +<code perl>
 +> save($p,"myPolyObject.poly");
 +</code>
 +This will create a file in JSON format. An existing files will be silently overwritten.
 +
 +To load a big object from such a file use the command
 +
 +<code perl>
 +> $p=load("myPolyObject.poly");
 +</code>
 +If you did not start ''%%polymake%%'' in the directory containing your object, it is necessary to add the relative or absolute path, e.g.
 +
 +<code perl>
 +$p=load("MyFolder/myPolyObject.poly");
 +</code>
 +TAB completion like in a usual UNIX shell supports you in navigating through the file system.
 +
 +**Note:** If you load a polymake object and compute new properties, these properties will automatically be added to the original file at the end of the session. You can suppress this with the command
 +
 +<code perl>
 +> $p->dont_save;
 +</code>
 +called prior to leaving the session (but after the last computation with $p).
 +
 +If you want to store a collection of objects into a single file, there is an [[tarballs|extra tutorial]] for you.
 +
 +===== Handling complex data types =====
 +
 +Apart from big objects, you can also persistently store arbitrary data structures like matrices or graphs format via ''%%save_data%%'', e.g.
 +
 +<code perl>
 +> $s=new Set<Int>(1,2,3,4);
 +> save_data($s, "mySet.poly");
 +</code>
 +To load data objects from such a file use the command
 +
 +<code perl>
 +> $s=load_data("mySet.poly");
 +</code>
 +In fact, the command pairs ''%%load%%''/''%%save%%'' and ''%%load_data%%''/''%%save_data%%'' are almost equivalent. The only difference is in filename handling: ''%%load%%'' can find a data file by trying to append file suffixes configured for the current application, while ''%%save%%'' by default overwrites the file the object was initially loaded from. ''%%load_data%%'' and ''%%save_data%%'' always require full file name and do not try to guess anything.
 +
 +===== Pretty formatting of JSON files =====
 +
 +Files produced by ''%%save%%'' and ''%%save_data%%'' are very dense, they don't contain line breaks and other redundant whitespaces. The order of properties in a big object is random, they can be arbitrarily reshuffled with every new ''%%save%%'' operation. If you are going to keep your data files under version control like git, or just want to have a look into such file, create it with an option ''%%canonical%%'':
 +
 +<code perl>
 +> save($p,"myPrettyObject.poly",canonical=>true);
 +</code>
 +===== Saving visualized objects =====
 +
 +Furthermore, most visualization methods provide an option to save the visualized object in a suitable format. Consult the [[user_guide:intro_tutorial#getting_help|F1 help]] for information on the file format and further options.
 +
 +To save the cube visualized via JReality in a new file called ''%%mycube.bsh%%'', do this:
 +
 +<code perl>
 +jreality(cube(3)->VISUAL,File=>"mycube");
 +</code>
 +To save the cube as a TiKz file named ''%%mycube.tikz%%'' that you can e.g. import in a LaTeX document, do this instead:
 +
 +<code perl>
 +tikz(cube(3)->VISUAL,File=>"mycube");
 +</code>
 +===== Handling arbitrary files =====
 +
 +Of course, it is also possible to load data from files in other formats. For this purpose use the standard Perl functions for reading and writing. Here is an example:
 +
 +Assume you want to load some points stored in the file points.txt which looks like this: 1 0 0 0 1 1 0 0 1 0 1 0 1 1 1 0 1 0 0 1 1 1 0 1 1 0 1 1 1 1 1 1 For the sake of the example, let's create this file:
 +
 +<code perl>
 +> open(my $f, ">", "points.txt"); print $f "1 0 0 0\n1 1 0 0\n1 0 1 0\n1 1 1 0\n1 0 0 1\n1 1 0 1\n1 0 1 1\n1 1 1 1\n"; close $f;
 +</code>
 +To read this file try the following:
 +
 +<code perl>
 +> open(INPUT, "<", "points.txt");
 +> while(<INPUT>){
 +>   print $_;
 +> }
 +> close(INPUT);
 +1 0 0 0
 +1 1 0 0
 +1 0 1 0
 +1 1 1 0
 +1 0 0 1
 +1 1 0 1
 +1 0 1 1
 +1 1 1 1
 +</code>
 +''%%<INPUT>%%'' is a perl input iterator reading the file line by line. Variable ''%%$_%%'' refers to the current line within this loop; it has a plain string value.
 +
 +A reasonable task could be to store the points from the file as a matrix. This can be done immediately, because the matrix constructor called with a list of values interprets each value as a matrix line:
 +
 +<code perl>
 +> open(INPUT, "<", "points.txt");
 +> $matrix=new Matrix<Rational>(<INPUT>);
 +> close(INPUT);
 +> print $matrix;
 +1 0 0 0
 +1 1 0 0
 +1 0 1 0
 +1 1 1 0
 +1 0 0 1
 +1 1 0 1
 +1 0 1 1
 +1 1 1 1
 +</code>
 +
  
  • user_guide/tutorials/latest/data.txt
  • Last modified: 2023/11/06 10:57
  • by 127.0.0.1