Skip to main content

Any ergonomic tools for the command line kernel?


Mathematica on the command-line (invoked by running 'wolfram' on bash shell) seems bereft of all modern usability features. I'd like a list of the best third-party packages available (if any exist) for command line work.



At a bare minimum, I'm looking for a way get a textual Monitor or ProgressIndicator to inspect non-instantaneous computation:


n = 1; Monitor[While[True, n++], n]

command line Mathematica


This trick from python of years ago might help: using the carriage return ('\r') character to return to the start of the line without advancing to the next line to achieve "dynamic" updates in the shell prompt:


for x in range(10):
print '{0}\r'.format(x),
print

Python



Perhaps something similar for Mathematica is possible?


Details:



  • I'm using Ubuntu 18 Linux MMA 11.3

  • I'd like to see an exhaustive list of symbols that require front end

  • In Python (or iPython) there are many ergonomic tools for the command line REPL like auto-completion or textual progress bars (tqmd):


Python



Answer



As I said in my comments, it is hard to implement this correctly if you aim for some advanced Dynamic features that work in the command line. However, you can surely use the carriage-return trick on the command line.



The only obstacle here is that Print puts everything on a new line. However, if you write directly to stdout, you don't have this problem. Consider the following small example:


progress[n_, max_] := WriteString["stdout", 
"\r[" <> StringJoin@Table["#", n] <>
StringJoin@Table[" ", max - n] <> "]"
]

n=0; While[n++<20, Pause[0.2];progress[n,20]]

enter image description here





Is there any way to make this sensitive to the terminals window size?



Hmm, it's difficult, because you would need feedback from your window how large it is. I don't see a way to do this from the top of my head.



Would be nice to show additional information! Like ETA, Time Taken Already, Percentage



One downside of using \r is that it doesn't delete the line and you have to ensure that your output is either of the same size or longer. Or you use another function to delete the line after an iteration.


Beside this obstacle, running time, ETA, or percentage can be implemented using a closure because you need to remember the starting time and other things.


An implementation for ETA could look like this



Module[{start = Missing, eta, iter = 0},
ETA[max_Integer] := Module[{},
If[start === Missing, start = AbsoluteTime[]];
iter++;
eta = (AbsoluteTime[] - start)/iter;
WriteString["stdout",
"\r" <> ToString[Round[max*eta - iter*eta]] <> " Seconds left"]
]
]


and is then used like this


n = 0; While[n++ < 100, ETA[100]; Pause[.1]] 

As you can see, on the first call it initializes the starting time and then, on each iteration, it updates the ETA.


An implementation for a sine-perculator can also be created but it requires that you have many, short iterations so that the display is updated often. However, I don't recommend something like this because it's hard to ensure that the progress display doesn't slow down your overall loop too much.


enter image description here


ProgressBar[] := With[{initTime = AbsoluteTime[]},
Function[
Module[{curr = AbsoluteTime[] - initTime, percolate},
percolate = Round[10*Cos[2*curr] + 10];

percolate = Append[ConstantArray[" ", percolate], "#"];
percolate =
StringJoin@
Join[percolate, ConstantArray[" ", 21 - Length[percolate]]];
Print[
TemplateApply[
"[`perc`] `time` Seconds",
<|
"perc" -> percolate,
"time" -> Round[curr, 0.1]

|>
]
]
]
]
]

pbar=ProgressBar[]; n=0; While[n++<12^4, pbar[]]

Comments

Popular posts from this blog

plotting - Plot 4D data with color as 4th dimension

I have a list of 4D data (x position, y position, amplitude, wavelength). I want to plot x, y, and amplitude on a 3D plot and have the color of the points correspond to the wavelength. I have seen many examples using functions to define color but my wavelength cannot be expressed by an analytic function. Is there a simple way to do this? Answer Here a another possible way to visualize 4D data: data = Flatten[Table[{x, y, x^2 + y^2, Sin[x - y]}, {x, -Pi, Pi,Pi/10}, {y,-Pi,Pi, Pi/10}], 1]; You can use the function Point along with VertexColors . Now the points are places using the first three elements and the color is determined by the fourth. In this case I used Hue, but you can use whatever you prefer. Graphics3D[ Point[data[[All, 1 ;; 3]], VertexColors -> Hue /@ data[[All, 4]]], Axes -> True, BoxRatios -> {1, 1, 1/GoldenRatio}]

plotting - Filling between two spheres in SphericalPlot3D

Manipulate[ SphericalPlot3D[{1, 2 - n}, {θ, 0, Pi}, {ϕ, 0, 1.5 Pi}, Mesh -> None, PlotPoints -> 15, PlotRange -> {-2.2, 2.2}], {n, 0, 1}] I cant' seem to be able to make a filling between two spheres. I've already tried the obvious Filling -> {1 -> {2}} but Mathematica doesn't seem to like that option. Is there any easy way around this or ... Answer There is no built-in filling in SphericalPlot3D . One option is to use ParametricPlot3D to draw the surfaces between the two shells: Manipulate[ Show[SphericalPlot3D[{1, 2 - n}, {θ, 0, Pi}, {ϕ, 0, 1.5 Pi}, PlotPoints -> 15, PlotRange -> {-2.2, 2.2}], ParametricPlot3D[{ r {Sin[t] Cos[1.5 Pi], Sin[t] Sin[1.5 Pi], Cos[t]}, r {Sin[t] Cos[0 Pi], Sin[t] Sin[0 Pi], Cos[t]}}, {r, 1, 2 - n}, {t, 0, Pi}, PlotStyle -> Yellow, Mesh -> {2, 15}]], {n, 0, 1}]

plotting - Mathematica: 3D plot based on combined 2D graphs

I have several sigmoidal fits to 3 different datasets, with mean fit predictions plus the 95% confidence limits (not symmetrical around the mean) and the actual data. I would now like to show these different 2D plots projected in 3D as in but then using proper perspective. In the link here they give some solutions to combine the plots using isometric perspective, but I would like to use proper 3 point perspective. Any thoughts? Also any way to show the mean points per time point for each series plus or minus the standard error on the mean would be cool too, either using points+vertical bars, or using spheres plus tubes. Below are some test data and the fit function I am using. Note that I am working on a logit(proportion) scale and that the final vertical scale is Log10(percentage). (* some test data *) data = Table[Null, {i, 4}]; data[[1]] = {{1, -5.8}, {2, -5.4}, {3, -0.8}, {4, -0.2}, {5, 4.6}, {1, -6.4}, {2, -5.6}, {3, -0.7}, {4, 0.04}, {5, 1.0}, {1, -6.8}, {2, -4.7}, {3, -1....