Skip to main content

programming - Workflow in the Mathematica and Workbench IDE


After visiting one of the Wolfram presentations, I started writing code for my number theory research project in Mathematica because I found it to be faster than Sage. I downloaded Workbench and Mathematica, watched the video tutorials on the Wolfram website and read the tutorials in the manual. Then I started coding. After being at it for a week, I find the whole experience to be extremely clumsy as I can not figure out any reasonable workflow. What I do now is this:


I open Workbench which in turn starts Mathematica notebook. I write a procedure spread over multiple cells in the notebook. When I am happy with the result, I copy the code into the workbench .m file where I make it into a function. Afterwards, I start using the function in the notebook to do my calculations or to use it in other procedures.


I am very happy with the control I have over each step in the notebook and coding in workbench feels quite smooth. What really bugs me is the transition between the two. I just can not figure out how to achieve the smooth workflow I am used from IDEs like IntelijIdea in Workbench.


Truth is, when I was downloading Workbench, I was expecting it to replace the notebook environment of Mathematica with more serious IDE. Yet it just launches Mathematica and the notebook each time I run the project anyway.


So my question is this: What is the proper way to use Workbench to write code? Or is it just my inexperience that makes me think I am doing something wrong? The closest question I found was this: Working in a team in Workbench which talks mainly about version control (which I wanna look at in the next step as git does not seem to cut it). Links to articles or tutorials describing proper workflow in Workbench would be much appreciated as well.



Answer



I'll try to answer this as objectively as possible, but note that this answer is shaped by my experiences, so there is a certain subjective flavour to it.


Before you try to figure out a workflow for a non-interactive IDE for Mathematica such as the WorkBench/vim/IntelliJ/Eclipse (henceforth, IDE) and the Mathematica notebook (NB), you should evaluate and determine if your project/package really needs the IDE.


As a simple example:




  • Are you designing something small and quick?

  • Are you primarily finding your way through the project/topic by trial and error/exploration?

  • Is your work heavy on graphics/interactive features?

  • Does it require a styled notebook for it to work?

  • Are you a beginner in Mathematica?


If you answered yes to any of the above, then you're better off working with an NB than an IDE. A typical IDE is not really suited for these (no interactivity, no graphics, cannot display notebook styles, requires you to create a new project file and folder, etc.) and is geared towards a different audience.


As you've already experienced, these IDEs do not (yet) offer you the convenience of the kernel and interactive evaluations. That means that you, the programmer, should be familiar enough with Mathematica to know the syntax well, be reasonably well versed in the documentation (at least for the basic functions), have a decent grip on operator precedences, be familiar with the scoping rules, levels, etc. Fluency in the language will enable you to continue developing your package without having to stop every second line to cross-check the output of your code (especially the trivial parts) by evaluating it in the kernel. Of course, you should extensively unit test everything you write, but it's good to be able to write freely initially.


Once you start writing medium-large size packages, you'll realize that a good deal of time is spent on the organization and design of the package, in addition to the implementation details. Having a good code structure and organization is important to minimizing the amount of code-reuse and simplifying future maintenance and extensions. An IDE will help you in getting most of this mundane stuff out of the way. The debugging, profiling, refactoring and deploying tools provided by the IDE will greatly help you in streamlining your code and your workflow, and you'll use the NB mostly to test/develop the implementation details, which can then be incorporated back into the package when complete. Again, the IDE can help you here in writing unit tests for the different functions in your package.



Most IDEs also provide good version control features and support most of the common VCS tools. Package .m files are generally easier to version and share (in teams) than a notebook since they're free of metadata and other front-end box stuff, unlike notebooks.


If your project has no use for any of these features or if you aren't able to utilize them, then it would be overkill to use an IDE.




So my point really is that your IDE + NB workflow is not all that atypical for a Mathematica programmer. However, your project should have the right requirements and you should be sufficiently fluent in the language in order to be able to use them harmoniously,


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....