====== 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>,...), and data from files in arbitrary formats. ===== Handling polymake objects ===== Let us take this nice example object: > $p = cube(3); To store big objects use the command > save($p,"myPolyObject.poly"); 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 > $p=load("myPolyObject.poly"); If you did not start ''%%polymake%%'' in the directory containing your object, it is necessary to add the relative or absolute path, e.g. $p=load("MyFolder/myPolyObject.poly"); 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 > $p->dont_save; 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. > $s=new Set(1,2,3,4); > save_data($s, "mySet.poly"); To load data objects from such a file use the command > $s=load_data("mySet.poly"); 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%%'': > save($p,"myPrettyObject.poly",canonical=>true); ===== 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: jreality(cube(3)->VISUAL,File=>"mycube"); To save the cube as a TiKz file named ''%%mycube.tikz%%'' that you can e.g. import in a LaTeX document, do this instead: tikz(cube(3)->VISUAL,File=>"mycube"); ===== 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: > 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; To read this file try the following: > open(INPUT, "<", "points.txt"); > while(){ > 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 ''%%%%'' 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: > open(INPUT, "<", "points.txt"); > $matrix=new Matrix(); > 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