We’re pleased that despite the coronavirus pandemic and its impact on so many people and businesses we’re still able to launch today as planned… (Thanks to our dedicated team and the fact that remote working has been part of our company for decades…)

The Biggest .1 Release Ever

It’s always an interesting time. We’re getting ready to wrap up a .1 version—to release the latest fruits of our research and development efforts. “Is it going to be a big release?”, I wonder. Of course, I know we’ve done a lot of work since we released Version 12.0 last April. All those design reviews (many livestreamed). All those new things we’ve built and figured out.

But then we start actually making the list for the new version. And—OMG—it goes on and on. Different teams are delivering on this or that project that started X years ago. A new function is being added for this. There’s some new innovation about that. Etc.

We started this journey a third of a century ago when we began the development of Version 1.0. And after all these years, it’s amazing how the energy of each new release seems to be ever greater.

And as we went on making the list for Version 12.1 we wondered, “Will it actually be our biggest .1 release ever?”. We finally got the answer: “Yes! And by a lot”.

Counting functions isn’t always the best measure, but it’s an indication. And in Version 12.1 there are a total of 182 completely new functions—as well as updates and enhancements to many hundreds more.

Look at It Now: HiDPI

Back in 1988 when we released Version 1.0 a typical computer display was maybe 640 pixels across (oh, and it was a CRT). And I was recently using some notebooks of mine from the 1990s (yes, they still work, which is spectacular!), and I was amazed at what a small window size they were made for. But as I write this today, I’m looking at two 3000-pixel displays. And 4k displays aren’t uncommon. So one of the things we’ve done for Version 12.1 is to add systemwide support for the new world of very-high-resolution displays.

One might think that would be easy, and would just “come with the operating system”. But actually it’s taken two years of hard work to deliver full HiDPI support. Well over a thousand carefully designed icons and other assets went from being bitmaps to being work-at-any-size algorithmic graphics. Everything about rasterization (not just for Rasterize , but for 3D graphics textures, etc. etc.) had to be redone. Sizes of things—and their interactions with the tower of kludges that operating systems have introduced over the years—had to be respecified and rethought.

But now it’s done. And we’re ready for displays of any resolution:

By the way, talking of displays, another “infrastructure” enhancement in Version 12.1 is moving to Metal and Direct3D 11 for 3D graphics rendering on macOS and Windows. Right now these just make 3D graphics modestly faster. But they also lay the groundwork for full multithreaded rendering, as well as VR, AR and more.

The Beginning of Video Computation

We’ve been working towards it for nearly 15 years… but finally it’s here: computation with video! We introduced images into the language in 2008; audio in 2016. But now in Version 12.1 we for the first time have computation with video. There’ll be lots more coming in future releases, but there’s already quite a bit in 12.1.

So… just like Image and Audio , which symbolically represent images and audio, we now have Video .

This asks for five frames from a video:

✕ VideoFrameList[ Video["ExampleData/Caminandes.mp4", Appearance -> Automatic, AudioOutputDevice -> Automatic, SoundVolume -> Automatic], 5]

This asks to make a time series of the mean color of every frame:

✕ VideoTimeSeries[Mean, Video["ExampleData/Caminandes.mp4", Appearance -> Automatic, AudioOutputDevice -> Automatic, SoundVolume -> Automatic]]

And then one can just plot the time series:

✕ DateListPlot[%, PlotStyle -> {RGBColor[1, 0, 0], RGBColor[0, 1, 0], RGBColor[ 0, 0, 1]}]

Video is a complicated area, with lots of different encodings optimized for different purposes. In Version 12.1 we’re supporting more than 250 of them, for import, export and transcoding. You can refer to a video on the web as well:

✕ Video["http://exampledata.wolfram.com/cars.avi"]

And the big thing is that video is now getting integrated into everything. So, for example, you can immediately use image processing or audio processing or machine learning functions on video. Here’s an example plotting the location of cars in the video above:

✕ v = Video["http://exampledata.wolfram.com/cars.avi"]

✕ ts = VideoTimeSeries[Point[ImagePosition[#, Entity["Word", "car"]]] &, v]

✕ HighlightImage[ VideoExtractFrames[v, Quantity[5, "Seconds"]], {PointSize[Medium], Values[ts]}]

Let’s say you’ve got a Manipulate , or an animation (say from ListAnimate ). Well, now you can just immediately make a video of it:

✕ Video[CloudGet["https://wolfr.am/L9r00rk5"]]

You can add an audio track, then export the whole thing directly to a file, the cloud, etc.

So is this new video capability really industrial strength? I’ve been recording hundreds of hours of video in connection with a new project I’m working on. So I decided to try our new capabilities on it. It’s spectacular! I could take a 4-hour video, and immediately extract a bunch of sample frames from it, and then—yes, in a few hours of CPU time—“summarize the whole video”, using SpeechRecognize to do speech-to-text on everything that was said and then generating a word cloud:

Speaking of audio, there’s new stuff in Version 12.1 there too. We’ve redone the GUI for in-notebook Audio objects. And we’ve introduced SpeechInterpreter , which is the spoken analog of the Interpreter function, here taking an audio object and returning what airline name was said in it:

✕ SpeechInterpreter["Airline"][CloudGet["https://wolfr.am/L9r410jA"]]

In Version 12.0 we introduced the important function TextCases for extracting from text hundreds of kinds of entities and “text content types” (which as of 12.1 now have their own documentation pages). In 12.1 we’re also introducing SpeechCases , which does the same kind of thing for audio speech.

A Computer Science Story: DataStructure

One of our major long-term projects is the creation of a full compiler for the Wolfram Language, targeting native machine code. Version 12.0 was the first exposure of this project. In Version 12.1 there’s now a spinoff from the project—which is actually a very important project in its own right: the new DataStructure function.

We’ve curated many kinds of things in the past: chemicals, equations, movies, foods, import-export formats, units, APIs, etc. And in each case we’ve made the things seamlessly computable as part of the Wolfram Language. Well, now we’re adding another category: data structures.

Think about all those data structures that get mentioned in textbooks, papers, libraries, etc. Our goal is to have all of them seamlessly usable directly in the Wolfram Language, and accessible in compiled code, etc. Of course it’s huge that we already have a universal “data structure”: the symbolic expressions in the Wolfram Language. And internal to the Wolfram Language we’ve always used all sorts of data structures, optimized for different purposes, and automatically selected by our algorithms and meta-algorithms.

But now with DataStructure there’s something new. If you have a particular kind of data structure you want to use, you can just ask for it by name, and use it.

Here’s how you create a linked list data structure:

✕ ds = CreateDataStructure["LinkedList"]

Append a million random integers to the linked list (it takes 380 ms on my machine):

✕ Do[ds["Append", RandomInteger[]], 10^6]

Now there’s immediate visualization of the structure:

✕ ds["Visualization"]

Here’s the numerical mean of all the values:

✕ Mean[N[Normal[ds]]]

Like so much of what we do DataStructure is set up to span from small scale and pedagogical to large scale and full industrial strength. Teaching a course about data structures? Now you can immediately use the Wolfram Language, storing everything you do in notebooks, automatically visualizing your data structures, etc. Building large-scale production code? Now you can have complete control over optimizing the data structures you’re using.

How does DataStructure work? Well, it’s all written in the Wolfram Language, and compiled using the compiler (which itself is also written in the Wolfram Language).

In Version 12.1 we’ve got most of the basic data structures covered, with various kinds of lists, arrays, sets, stacks, queues, hash tables, trees, and more. And here’s an important point: each one is documented with the running time for its various operations (“O(n)”, “O(n log(n))”, etc.), and the code ensures that that’s correct.

It’s pretty neat to see classic algorithms written directly for DataStructure .

Create a binary tree data structure (and visualize it):

✕ (ds = CreateDataStructure["BinaryTree", 3 -> {1 -> {0, Null}, Null}])["Visualization"]

Here’s a function for rebalancing the tree:

✕ RightRotate[y_] := Module[{x, tmp}, x = y["Left"]; tmp = x["Right"]; x["SetRight", y]; y["SetLeft", tmp]; x]

Now do it, and visualize the result:

✕ RightRotate[ds]["Visualization"]

The Asymptotic Superfunction

You’ve got a symbolic math expression and you want to figure out its rough value. If it’s a number you just use N to get a numerical approximation. But how do you get a symbolic approximation?

Ever since Version 1.0—and, in the history of math, ever since the 1600s—there’s been the idea of power series: find an essentially polynomial-like approximation to a function, as Series does. But not every mathematical expression can be reasonably approximated that way. It’s difficult math, but it’s very useful if one can make it work. We started introducing “asymptotic approximation” functions for specific cases (like integrals) in Version 11.3, but now in 12.1 we’re introducing the asymptotic superfunction Asymptotic .

Consider this inverse Laplace transform:

✕ InverseLaplaceTransform[1/(s Sqrt[s^3 + 1]), s, t]

There’s no exact symbolic solution for it. But there is an asymptotic approximation when t is close to 0:

✕ Asymptotic[InverseLaplaceTransform[1/(s Sqrt[s^3 + 1]), s, t], t -> 0]

Sometimes it’s convenient to not even try to evaluate something exactly—but just to leave it inactive until you give it to Asymptotic :

✕ Asymptotic[ DSolveValue[Sin[x]^2 y''[x] + x y[x] == 0, y[x], x], {x, 0, 5}]

Asymptotic deals with functions of continuous variables. In Version 12.1 there’s also DiscreteAsymptotic . Here we’re asking for the asymptotic behavior of the Prime function:

✕ DiscreteAsymptotic[Prime[n], n -> Infinity]

Or the factorial:

✕ DiscreteAsymptotic[n!, n -> Infinity]

We can ask for more terms if we want:

✕ DiscreteAsymptotic[n!, n -> Infinity, SeriesTermGoal -> 5]

Sometimes even quite simple functions can lead to quite exotic asymptotic approximations:

✕ DiscreteAsymptotic[BellB[n], n -> Infinity]

More Math, As Always

Math is big, and math is important. And for the Wolfram Language (which also means for Mathematica) we’re always pushing the frontiers of what’s computable in math.

One long-term story has to do with special functions. Back in Version 1.0 we already had 70 special functions. We covered univariate hypergeometric functions—adding the general p F q case in Version 3.0. Over the years we’ve gradually added a few other kinds of hypergeometric functions (as well as 250 other new kinds of special functions). Typical hypergeometric functions are solutions to differential equations with three regular singular points. But in Version 12.1 we’ve generalized that. And now we have Heun functions, that solve equations with four regular singular points. That might not sound like a big deal, but actually they’re quite a mathematical jungle—for example with 192 known special cases. And they’re very much in vogue now, because they show up in the mathematics of black holes, quantum mechanics and conformal field theory. And, yes, Heun functions have a lot of arguments:

✕ Series[HeunG[a, q, \[Alpha], \[Beta], \[Gamma], \[Delta], z], {z, 0, 3}]

By the way, when we “support a special function” these days, there’s a lot we do. It’s not just a question of evaluating the function to arbitrary precision anywhere in the complex plane (though that’s often hard enough). We also need to be able to compute asymptotic approximations, simplifications, singularities, etc. And we have to make sure the function can get produced in the results of functions like Integrate , DSolve and Sum .

One of our consistent goals in dealing with superfunctions like DSolve is to make them “handbook complete”. To be sure that the algorithms we have—that are built to handle arbitrary cases—successfully cover as much as possible of the cases that appear anywhere in the literature, or in any handbook. Realistically, over the years, we’ve done very well on this. But in Version 12.1 we’ve made a new, big push, particularly for DSolve .

Here’s an example (oh, and, yes, it happens to need Heun functions):

✕ DSolveValue[(d + c x + b x^2) y[x] + a x y'[x] + (-1 + x^2) y''[x] == 0, y[x], x]

There’s a famous book from the 1940s that’s usually just called Kamke, and that’s a huge collection of solutions to differential equations, some extremely exotic. Well, we’ll soon be able to do 100% of the (concrete) equations in this book (we’re still testing the last few…).

In Version 12.0 we introduced functions like ComplexPlot and ComplexPlot3D for plotting complex functions of complex variables. In Version 12.1 we now also have complex contour plotting. Here we’re getting two sets of contours—from the Abs and the Arg of a complex function:

✕ ComplexContourPlot[ AbsArg[(z^2 - I)/(z^3 + I)], {z, -3 - 3 I, 3 + 3 I}, Contours -> 30]

Also new in 12.1 is ComplexRegionPlot , which effectively solves equations and inequalities in the complex plane. Like here’s the (very much branch-cut-informed) solution to an equation whose analog would be trivial over the reals:

✕ ComplexRegionPlot[Sqrt[z^(2 + 2 I)] == z^(1 + I), {z, 10}]

In a very different area of mathematics, another new function in Version 12.1 is CategoricalDistribution . We introduced the idea of symbolic representations of statistical distributions back in Version 6—with things like NormalDistribution and PoissonDistribution —and the idea has been extremely successful. But so far all our distributions have been distributions over numbers. In 12.1 we have our first distribution where the possible outcomes don’t need to be numbers.

Here’s a distribution where there are outcomes x, y, z with the specified probabilities:

✕ dist = CategoricalDistribution[{x, y, z}, {.1, .2, .7}]

Given this distribution, one can do things like generate random variates:

✕ RandomVariate[dist, 10]

Here’s a 3D categorical distribution:

✕ dist = CategoricalDistribution[{{"A", "B", "C"}, {"D", "E"}, {"X", "Y"}}, {{{2, 4}, {2, 1}}, {{2, 2}, {3, 2}}, {{4, 3}, {1, 3}}}]

Now we can work out the PDF of the distribution, asking in this case what the probability to get A , D , Y is:

✕ PDF[dist, {"A", "D", "Y"}]

By the way, if you want to “see the distribution” you can either click the + on the summary box, or explicitly use Information :

✕ Information[dist, "ProbabilityTable"]

There are lots of uses of CategoricalDistribution , for example in machine learning. Here we’re creating a classifier:

✕ cf = Classify[{1, 2, 3, 4} -> {a, a, b, b}]

If we just give it input 2.3, the classifier will give its best guess for the corresponding output:

✕ cf[2.3]

But in 12.1 we can also ask for the distribution—and the result is a CategoricalDistribution :

✕ cf[2.3, "Distribution"]

✕ Information[%, "ProbabilityTable"]

The Leading Edge of Optimization

In Version 12.0 we introduced industrial-scale convex optimization. We covered most of the usual problem classes (like linear, semidefinite, quadratic and conic). But there was one straggler: geometric optimization. And now we’re adding that for 12.1:

✕ GeometricOptimization[\[Pi] r (r + Sqrt[h^2 + r^2]), {1 <= \[Pi]/ 3 h r^2 }, {h, r}]

✕ GeometricOptimization[ 1/(h w d), {h <= 2 w, d <= 2 w, h*w + h*d <= 50, 2 w*d <= 20}, {h, w, d}]

You can solve all sorts of practical problems with GeometricOptimization —with thousands of variables if need be. As one example, consider laying out rectangles of certain sizes with a certain partial ordering in x and y. To specify the problem, you give a bunch of inequalities:

✕ With[{c1 = 0.25, c2 = 0.618}, ineqs = {{c1 + w[1] + x[1] <= x[2], c1 + w[1] + x[1] <= x[3], c1 + w[1] + x[1] <= x[4], c1 + w[1] + x[1] <= x[5], c1 + w[1] + x[1] <= x[6], c1 + w[1] + x[1] <= x[7], c1 + w[2] + x[2] <= x[3], c1 + w[4] + x[4] <= x[5], c1 + w[2] + x[2] <= x[3], c1 + w[2] + x[2] <= x[5], c1 + w[2] + x[2] <= x[7], c1 + w[4] + x[4] <= x[3], c1 + w[4] + x[4] <= x[5], c1 + w[4] + x[4] <= x[7], c1 + w[6] + x[6] <= x[5], c1 + w[8] + x[8] <= x[4], c1 + w[9] + x[9] <= x[4], c1 + w[10] + x[10] <= x[4], c1 + w[10] + x[10] <= x[6], c1 + w[6] + x[6] <= x[7], c1 + w[8] + x[8] <= x[9], c1 + w[8] + x[8] <= x[10], x[1] >= 0, x[8] >= 0, w[3] + x[3] <= \[ScriptW], w[5] + x[5] <= \[ScriptW], w[7] + x[7] <= \[ScriptW]}, {c1 + h[1] + y[1] <= y[6], c1 + h[1] + y[1] <= y[7], c1 + h[1] + y[1] <= y[8], c1 + h[1] + y[1] <= y[9], c1 + h[1] + y[1] <= y[10], c1 + h[2] + y[2] <= y[4], c1 + h[2] + y[2] <= y[9], c1 + h[4] + y[4] <= y[6], c1 + h[3] + y[3] <= y[5], c1 + h[5] + y[5] <= y[7], c1 + h[9] + y[9] <= y[6], c1 + h[9] + y[9] <= y[10], y[1] >= 0, y[2] >= 0, y[3] >= 0, h[6] + y[6] <= \[ScriptH], h[7] + y[7] <= \[ScriptH], h[8] + y[8] <= \[ScriptH], h[10] + y[10] <= \[ScriptH]}, {c2 <= h[1]/w[1] <= (1 + c2), c2 <= h[2]/w[2] <= (1 + c2), c2 <= h[3]/w[3] <= (1 + c2), c2 <= h[4]/w[4] <= (1 + c2), c2 <= h[5]/w[5] <= (1 + c2), c2 <= h[6]/w[6] <= (1 + c2), c2 <= h[7]/w[7] <= (1 + c2), c2 <= h[8]/w[8] <= (1 + c2), c2 <= h[9]/w[9] <= (1 + c2), c2 <= h[10]/w[10] <= (1 + c2)}, {h[1] w[1] == 1, h[2] w[2] == 2, h[3] w[3] == 3, h[4] w[4] == 4, h[5] w[5] == 5, h[6] w[6] == 6, h[7] w[7] == 7, h[8] w[8] == 8, h[9] w[9] == 9, h[10] w[10] == 10}}];

It then takes only about a second to generate an optimal solution:

In optimization, there are usually two broad types: continuous and discrete. Our convex optimization functions in 12.0 handled the case of continuous variables. But a major new feature—and innovation—in 12.1 is the addition of support for discrete (i.e. integer) variables, and for mixed discrete and continuous variables.

Here’s a very simple example:

✕ QuadraticOptimization[ 2 x^2 + 20 y^2 + 6 x y + 5 x, -x + y >= 2, {x \[Element] Integers, y \[Element] Reals}]

If x wasn’t constrained to be an integer, the result would be different:

✕ QuadraticOptimization[ 2 x^2 + 20 y^2 + 6 x y + 5 x, -x + y >= 2, {x, y}]

But—as with our other optimization capabilities—this can be scaled up, though the combinatorial optimization that’s involved is fundamentally more computationally difficult (and for example it’s often NP-complete). And actually the only reason we can do large-scale problems of this kind at all is that we’ve implemented a novel iteration-based technique that successfully unlocks mixed convex optimization.

Cracking the Vector-Plotting Problem

I’ve been trying to make good vector plots for about 40 years, but in the past it just never worked. If the vectors got too short, you couldn’t see their direction—and if you made them longer they crashed into each other. But particularly after our success in Version 12.0 in cracking the ComplexPlot problem (which had also been languishing for a long time) we decided for Version 12.1 to try to solve the vector-plotting problem once and for all. And, I’m happy to say, we seem to have been able to do that.

So now, you can just ask VectorPlot (and all sorts of related functions) to make a vector plot, and you’ll automatically get something that’s a good representation of your vector field:

✕ VectorPlot[{2 x^2 - y^2, 3 x y}, {x, -5, 5}, {y, -5, 5}]

✕ VectorPlot[{2 x^2 - y^2, 3 x y}, {x, -5, 5}, {y, -5, 5}, VectorPoints -> 30]

What’s the trick? It’s basically about placing vectors on a hexagonal grid so they’re packed better, and are visually more uniform. (You can also make other choices if you want to.) And then it’s about using appropriately scaled color to represent vector magnitudes.

There are all sorts of other challenges too. Like being able to draw vectors in a region:

✕ VectorPlot[{2 x^2 - y^2, 3 x y}, {x, y} \[Element] Disk[{0, 0}, 3]]

And putting together our complex-number-plotting capabilities with our new vector plotting, we also in 12.1 have ComplexVectorPlot :

✕ ComplexVectorPlot[z^ Log[z], {z, 6}, PlotLegends -> Automatic]

Cross-Hatching & All That

Before there were gray scales, there were things like cross-hatching. Look at a book from a century ago (or less), and you’ll see all sorts of diagrams elegantly drawn with things like cross-hatching. Well, now we can do that too.

✕ Graphics[Style[RegularPolygon[5], HatchFilling[]]]

✕ Plot[{Sin[x], Cos[x]}, {x, 0, 10}, Filling -> Axis, FillingStyle -> HatchFilling[]]

Of course, everything is computable:

✕ Graphics[Table[ Style[Disk[RandomReal[10, 2]], HatchFilling[RandomReal[{0, 2 \[Pi]}]]], 50]]

We also have an important generalization of cross-hatching: PatternFilling . Here are examples with named patterns:

✕ Graphics[Style[Disk[], PatternFilling["DiamondBox"]]]

✕ Graphics[Style[Disk[], PatternFilling[{"Checkerboard", Red, Black}]]]

You can use any image as a pattern too:

✕ GeoGraphics[ Style[Polygon[Entity["Country", "UnitedStates"]], PatternFilling[CloudGet["https://wolfr.am/L9r9AL5O"], 270]]]

Version 12.1 also has what one can think of as 3D generalizations of these kinds of textures:

✕ Graphics3D[Style[Icosahedron[], HatchShading[]]]

It looks pretty good even in black and white:

✕ Graphics3D[Style[Icosahedron[], HatchShading[]], Lighting -> "Accent"]

There’s stipple shading too:

✕ Plot3D[Exp[-(x^2 + y^2)], {x, -2, 2}, {y, -2, 2}, PlotStyle -> {White, StippleShading[]}, Mesh -> None, Lighting -> "Accent"]

The Beginning of Computational Topology

In the past few versions, we’ve introduced deeper and deeper coverage of computational geometry. In coming versions, we’re going to be covering more and more of computational topology too. Things like EulerCharacteristic and PolyhedronGenus were already in Version 12.0. In Version 12.1 we’re introducing several powerful functions for dealing with the topology of simplicial complexes, of the kind that are for example used in representing meshes.

This makes a connectivity graph for the dimension-0 components of a dodecahedron, i.e. its corners:

✕ MeshConnectivityGraph[Dodecahedron[], 0]

Here’s the corresponding result for the connectivity of lines to lines in the dodecahedron:

✕ MeshConnectivityGraph[Dodecahedron[], 1]

And here’s the connectivity of corners to faces:

✕ MeshConnectivityGraph[Dodecahedron[], {0, 2}]

It’s a very general function. Here are the graphs for different dimensional cells of a Menger sponge:

✕ Table[MeshConnectivityGraph[MengerMesh[2, 3], d], {d, 0, 3}]

Given a mesh, it’s often useful to do what amounts to a topological search. For example, here’s a random Voronoi mesh:

✕ vm = VoronoiMesh[RandomReal[1, {200, 2}]]

Here are the 10 closest mesh cells to position {.5, .5} (the 2 before each index indicates that these are dimension-2 cells):

✕ NearestMeshCells[vm, {.5, .5}, 10]

Now highlight these cells:

✕ HighlightMesh[vm, %]

Tabular Data: Computing & Editing

Dataset has been a big success in the six years since it was first introduced in Version 10.0. Version 12.1 has the beginning of a major project to upgrade and extend the functionality of Dataset .

The first thing is something you might not notice, because now it “just works”. When you see a Dataset in a notebook, you’re just seeing its displayed form. But often there is lots of additional data that you’d get to by scrolling or drilling down. In Version 12.1 Dataset automatically stores that additional data directly in the notebook (at least up to a size specified by $NotebookInlineStorageLimit ) so when you open the notebook again later, the Dataset is all there, and all ready to compute with.

In Version 12.1 a lot has been done with the formatting of Dataset . Something basic is that you can now say how many rows and columns to display by default:

✕ Dataset[CloudGet["https://wolfr.am/L9o1Pb7V"], MaxItems -> {4, 3}]

In Version 12.1 there are many options that allow detailed programmatic control over the appearance of a display Dataset . Here’s a simple example:

✕ Dataset[CloudGet["https://wolfr.am/L9o1Pb7V"], MaxItems -> 5, HeaderBackground -> LightGreen, Background -> {{{LightBlue, LightOrange}}}, ItemDisplayFunction -> {"sex" -> (If[# === "female", \[Venus], \[Mars]] &)} ]

A major new feature is “right-click” interactivity (which works on rows, columns and individual items):

Dataset is a powerful construct for displaying and computing with tabular data of any depth. But sometimes you just want to enter or edit simple 2D tabular data—and the user interface requirements for this are rather different from those for Dataset . So in Version 12.1 we’re introducing a new experimental function called TableView , which is a user interface for entering—and viewing—purely two-dimensional tabular data:

✕ TableView[{{5, 6}, {7, 3}}]

Like a typical spreadsheet, TableView has fixed-width columns that you can manually adjust. It can efficiently handle large-scale data (think millions of items). The items can (by default) be either numbers or strings.

When you’ve finished editing a TableView , you can just ask for Normal and you’ll get lists of data out. (You can also feed it directly into a Dataset .) Like in a typical spreadsheet, TableView lets you put data wherever you want; if there’s a “hole”, it’ll show up as Null in lists you generate.

TableView is actually a dynamic control. So, for example, with TableView[Dynamic[x]] you can edit a TableView , and have its payload automatically be the value of some variable x . (And, yes, all of this is done efficiently, with minimal updates being made to the expression representing the value of x .)

GANs, BERT, GPT-2, ONNX, …: The Latest in Machine Learning

Machine learning is all the rage these days. Of course, we were involved with it even a very long time ago. We introduced the first versions of our flagship highly automated machine-learning functions Classify and Predict back in 2014, and we introduced our first explicitly neural-net-based function— ImageIdentify —in early 2015.

And in the years since then we’ve built a very strong system for machine learning in general, and for neural nets in particular. Several things about it stand out. First, we’ve emphasized high automation—using machine learning to automate machine learning wherever possible, so that even non-experts can immediately make use of leading-edge capabilities. The second big thing is that we’ve been curating neural nets, just like we curate so many other things. So that means that we have pretrained classifiers and predictors and feature extractors that you can immediately and seamlessly use. And the other big thing is that our whole neural net system is symbolic—in the sense that neural nets are specified as computable, symbolic constructs that can be programmatically manipulated, visualized, etc.

In Version 12.1 we’ve continued our leading-edge development in machine learning. There are 25 new types of neural nets in our Wolfram Neural Net Repository, including ones like BERT and GPT-2. And the way things are set up, it’s immediate to use any of these nets. (Also, in Version 12.1 there’s support for the new ONNX neural net specification standard, which makes it easier to import the very latest neural nets that are being published in almost any format.)

This gets the symbolic representation of GPT-2 from our repository:

✕ gpt2 = NetModel["GPT-2 Transformer Trained on WebText Data", "Task" -> "LanguageModeling"]

If you want to see what’s inside, just click—and keep clicking to drill down into more and more details:

Now you can immediately use GPT-2, for example progressively generating a random piece of text one token at a time:

✕ Nest[StringJoin[#, gpt2[#, "RandomSample"]] &, "Stephen Wolfram is", 20]

Hmmmm. I wonder what that was trained on….

By the way, people sometimes talk about machine learning and neural nets as being in opposition to traditional programming language code. And in a way, that’s correct. A neural net just learns from real-world examples or experience, whereas a traditional programming language is about giving a precise abstract specification of what in detail a computer should do. We’re in a wonderful position with the Wolfram Language, because what we have is something that already spans these worlds: we have a full-scale computational language that takes advantage of all those precise computation capabilities, yet can meaningfully represent and compute about things in the real world.

So it’s been very satisfying in the past few years to see how modern machine learning can be integrated into the Wolfram Language. We’ve been particularly interested in new superfunctions—like Predict , Classify , AnomalyDetection , LearnDistribution and SynthesizeMissingValues —that do “symbolically specified” operations, but do them using neural nets and modern machine learning.

In Version 12.1 we’re continuing in this direction, and moving towards superfunctions that use more elaborate neural net workflows, like GANs. In particular, Version 12.1 introduces the symbolic NetGANOperator , as well as the new option TrainingUpdateSchedule . And it turns out these are the only things we had to change to allow our general NetTrain function to work with GANs.

A typical GAN setup is quite complicated (and that’s why we’re working on devising superfunctions that conveniently deliver applications of GANs). But here’s an example of a GAN in action in Version 12.1:

The Calculus of Annotations

How do you add metadata annotations to something you’re computing with? For Version 12.1 we’ve begun rolling out a general framework for making annotations—and then computing with and from them.

Let’s talk first about the example of graphs. You can have both annotations that you can immediately “see in the graph” (like vertex colors), and ones that you can’t (like edge weights).

Here’s an example where we’re explicitly constructing a graph with annotations:

✕ Graph[{Annotation[1 -> 2, EdgeStyle -> Red], Annotation[2 -> 1, EdgeStyle -> Blue]}]

Here we’re annotating the vertices:

✕ Graph[{Annotation[x, VertexStyle -> Red], Annotation[y, VertexStyle -> Blue]}, {x -> y, y -> x, y -> y}, VertexSize -> .2]

AnnotationValue lets you query values of annotations:

✕ AnnotationValue[{%, x}, VertexStyle]

Something important about AnnotationValue is that you can assign it. Set g to be the graph:

✕ g = CloudGet["https://wolfr.am/L9rgvixl"];

Now do an assignment to an annotation value:

✕ AnnotationValue[{g, x}, VertexStyle] = Green

Now the graph has changed:

✕ g

You can always delete the annotation if you want:

✕ AnnotationDelete[{g, x}, VertexStyle]

If you don’t want to permanently modify a graph, you can just use Annotate to produce a new graph with annotations added ( 3 and 5 are names of vertices):

✕ Annotate[{CloudGet["https://wolfr.am/L9rpqPJ0"], {3, 5}}, VertexSize -> .3]

Some annotations are important for actual computations on graphs. An example is edge weighting. This puts edge-weight annotations into a graph—though by default they don’t get displayed:

✕ Graph[Catenate[ Table[Annotation[i -> j, EdgeWeight -> GCD[i, j]], {i, 5}, {j, 5}]]]

This displays the edge weights:

✕ Graph[%, EdgeLabels -> "EdgeWeight"]

And this actually does a computation that includes the weights:

✕ WeightedAdjacencyMatrix[ CloudGet["https://wolfr.am/L9rtJdd9"]] // MatrixForm

You can use your own custom annotations too:

✕ Graph[{Annotation[x, "age" -> 10], Annotation[y, "age" -> 20]}, {x -> y, y -> x, y -> y}]

This retrieves the value of the annotation:

✕ AnnotationValue[{CloudGet["https://wolfr.am/L9rx8Mxe"], x}, "age"]

Annotations are ultimately stored in an AnnotationRules option:

✕ Options[CloudGet["https://wolfr.am/L9rx8Mxe"], AnnotationRules]

You can always give all annotations as a setting for this option.

A major complexity with annotations is when in a computation they should be preserved—or combined—and when they should be dropped. We always try to keep annotations whenever it makes sense:

✕ TransitiveReductionGraph[CloudGet["https://wolfr.am/L9rBdIZt"]]

Annotations are something quite general, that apply not only to graphs, but to an increasing number of other constructs too. But in Version 12.1 we’ve added something else that’s specific to graphs, and that handles a complicated case there. It has to do with multigraphs, i.e. graphs with multiple edges between the same vertices. Take the graph:

✕ Graph[{1 -> 2, 1 -> 2}]

How do you distinguish these two edges? It’s not a question of annotation; you actually want these edges to be distinct, just like the vertices in the graph are distinct. Well, in Version 12.1, you can give names (or “tags”) to edges, just like you give names to vertices:

✕ EdgeTaggedGraph[{1 -> 2, 1 -> 2} -> {a, b}]

In the edge list for this graph the edges are shown “tagged”:

✕ EdgeList[%]

The tags are part of the edge specification:

✕ InputForm[%]

But back to annotations. Another kind of structure that can be annotated just like graphs is a mesh. This is saying to annotate dimension-0 boundary cells with a style:

✕ Annotate[{MengerMesh[2], {0, "Boundary"}}, MeshCellStyle -> Red]

A completely different kind of structure that can also use annotations is audio. This annotates an Audio object with information about where there’s voice activity in the audio:

✕ AudioAnnotate[ExampleData[{"Audio", "MaleVoice"}], "Voiced"]

This retrieves the value of the annotation:

✕ AnnotationValue[%, "Voiced"] // TimelinePlot

We’ll be rolling out annotations in lots of other things too. One that’s coming is images. But in preparation for that, in Version 12.1 we’ve added some new capabilities to HighlightImage .

Use machine learning to find what’s in the picture:

✕ ImageBoundingBoxes[CloudGet["https://wolfr.am/L9qz1zu4"]]

Now HighlightImage can use the annotation information:

✕ HighlightImage[CloudGet["https://wolfr.am/L9qz1zu4"], %]

Language Innovations & Extensions

Nothing has been a big success:

✕ {a, b, Nothing, c, Nothing}

Before Nothing , you always had to poke at a list from the outside to get elements in it deleted. But Nothing is a symbolic way of specifying deletion that “works from the inside”.

Pretty much as soon as we’d invented Nothing , we realized we also wanted another piece of functionality: a symbolic object that would somehow automatically disgorge its contents into a list. People had been using idioms like Sequence@@ … to do this. But Sequence is a slippery construct, and this idiom is fragile and ugly.

The functionality of our auto-inserter was easy to define. But what were we going to call it? For several years this very useful piece of functionality languished for want of a name. It came up several times in our livestreamed design reviews. Every time we would discuss it for a while—and often our viewers would offer good suggestions. But we were never happy with the name.

Finally, though, we decided we had to solve the problem. It was a painful naming process, culminating in a 90-minute livestream whose net effect was a change in one letter in the name. But in the end, we’re pretty happy with the name: Splice . Splice is a splice, like for film, or DNA—and it’s something that gets inserted. So now, as of Version 12.1 we have it:

✕ {a, b, Splice[{x, y, z}], c, d}

Of course, the more common case is something like:

✕ {a, b, x, c, d} /. x -> Splice[{p, q, r}]

There’s a lot of strange (and potentially buggy) Flatten operations that are going to be avoided by Splice .

One of the things we’re always trying to do in developing Wolfram Language is to identify important “lumps of computation” that we can conveniently encapsulate into functions (and where we can give those functions good names!). In Version 12.1 there’s a family of new functions that handle computations around subsets of elements in lists:

✕ SubsetCases[{a, b, a, b, a, c}, {x_, y_, x_}, Overlaps -> True]

I must have written special cases of these functions a zillion times. But now we’ve got general functions that anyone can just use. These functions come up in lots of places. And actually we first implemented general versions of them in connection with semantic-query-type computations.

But on the theory that any sufficiently well-designed function eventually gets a very wide range of uses, I can report that I’ve recently found a most unexpected but spectacular use for SubsetReplace in the context of fundamental physics. But much more on that in a little while…

Talking about physics brings me to something else in 12.1: new functions for handling time. DateInterval now provides a symbolic representation for an interval of time. And there’s an interesting algebra of ordering that needs to be defined for it. Which includes the need for the symbols InfinitePast and InfiniteFuture :

✕ Today < InfiniteFuture

Functional Programming Adverbs & More

We’re always working to make the Wolfram Language easier and more elegant to use, and Version 12.1 contains the latest in an idea we’ve been developing for symbolic functional programming. If you think of a built-in function as a verb, what we’re adding are adverbs: constructs that modify the operation of the verb.

A first example is OperatorApplied . Here’s the basic version of what it does:

✕ OperatorApplied[f][x][y]

Why is this useful? Many functions have “operator forms”. For example, instead of

✕ Select[{1, 2, 3, 4}, PrimeQ]

you can say

✕ Select[PrimeQ][{1, 2, 3, 4}]

and that means you can just “pick up” the modified function and do things with it:

✕ Map[Select[PrimeQ], {{6, 7, 8}, {11, 12, 13, 14}}]

or (using the operator form of Map ):

✕ Map[Select[PrimeQ]][{{6, 7, 8}, {11, 12, 13, 14}}]

OK, so what does OperatorApplied do? Basically it lets you create an operator form of any function.

Let’s say you have a function f that—like Select —usually takes two arguments. Well, then

✕ OperatorApplied[f][y]

is a function that takes a single argument, and forms f[x,y] from it:

✕ OperatorApplied[f][y][x]

OperatorApplied allows for some elegant programming, and often lets one avoid having to insert pure functions with # and & etc.

At first, OperatorApplied may seem like a very abstract “higher-order” construct. But it quickly becomes natural, and is particularly convenient when, for example, one has to provide a function for something—like as a setting for an option, the first argument to Outer , and so on.

By default, OperatorApplied[f][y] creates an operator form to be applied to an expression which will become the first argument of f . There’s a generalized form in which one specifies exactly how arguments should be knitted together, as in:

✕ OperatorApplied[f, 4 -> {3, 2, 1, 4}][x][y][z][u][v]

CurryApplied is in a sense a “purer” variant of OperatorApplied , in which one specifies up front the number of arguments to expect, and then (unless specified otherwise) these arguments are always used in the order they appear. So, for example, this makes a function that expects two arguments:

✕ CurryApplied[f, 2][x][y]

✕ CurryApplied[f, 2][x][y][z][u][v]

Needless to say—given that it’s a purer construct— CurryApplied is itself curryable: it has an operator form in which one just gives the number of arguments to expect:

✕ CurryApplied[2][f][x][y][z][u][v]

In Version 12.1, there’s another convenient adverb that we’ve introduced: ReverseApplied . As its name suggests, it specifies that a function should be applied in a reverse way:

✕ ReverseApplied[f][x, y, z]

This is particularly convenient when you’re doing things like specifying sorting functions:

✕ Sort[{5, 6, 1, 7, 3, 7, 3}, ReverseApplied[NumericalOrder]]

All of this symbolic functional programming emphasizes the importance of thinking about symbolic expressions structurally. And one new function to help with this is ExpressionGraph , which turns the tree structure (think TreeForm ) of an expression into an actual graph that can be manipulated:

✕ ExpressionGraph[{{a, b}, {c, d, e}}]

✕ ExpressionGraph[{{a, b}, {c, d, e}}, VertexLabels -> Automatic]

While we’re talking about the niceties of programming, one additional feature of Version 12.1 is TimeRemaining , which, as the name suggests, tells you how much time you have left in a computation before a time constraint hits you. So, for example, here TimeConstrained said the computation should be allocated 5 seconds. But after the Pause used about 1 second, there was a little less than 4 seconds remaining:

✕ TimeConstrained[Pause[1]; TimeRemaining[], 5]

If you’re writing sophisticated code, it’s very useful to be able to find out how much “temporal headroom” you have, to see for example whether it’s worth trying a different strategy, etc.

Now We Can Prove That Socrates Is Mortal

In using the Wolfram Language the emphasis is usually on what the result of a computation is, not why it is that. But in Version 11.3 we introduced FindEquationalProof , which generates proofs of assertions given axioms.

AxiomaticTheory provides a collection of standard axiom systems. One of them is an axiom system for group theory:

✕ axioms = AxiomaticTheory[{"GroupAxioms", "Multiplication" -> p, "Identity" -> e}]

This axiom system is sufficient to allow proofs of general results about groups. For example, we can show that—even though the axioms only asserted that e is a right identity—it is possible to prove from the axioms that it is also a left identity:

✕ FindEquationalProof[p[e, x] == x, axioms]

This dataset shows the actual steps in our automatically generated proof:

✕ Dataset[%["ProofDataset"], MaxItems -> {6, 1}]

But if you want to prove a result not about groups in general, but about a specific finite group, then you need to add to the axioms the particular defining relations for your group. You can get these from FiniteGroupData —which has been much extended in 12.1. Here are the axioms for the quaternion group, given in a default notation:

✕ FiniteGroupData["Quaternion", "DefiningRelations"]

To use these axioms in FindEquationalProof , we need to merge their notation with the notation we use for the underlying group axioms. In Version 12.1, you can do this directly in AxiomaticTheory :

✕ AxiomaticTheory[{"GroupAxioms", "Quaternion", "Multiplication" -> p, "Identity" -> e}]

But to use the most common notation for quaternions, we have to specify a little more:

✕ AxiomaticTheory[{"GroupAxioms", "Quaternion", <|"Multiplication" -> p, "Inverse" -> inv, "Identity" -> e, "Generators" -> {i, j}|>}]

But now we can prove theorems about the quaternions. This generates a 54-step proof that the 4th power of the generator we have called i is the identity:

✕ FindEquationalProof[p[i, p[i, p[i, i]]] == e, %]

In addition to doing mathematical proofs, we can now use FindEquationalProof in Version 12.1 to do general proofs with arbitrary predicates (or, more specifically, general first-order logic). Here’s a famous example of a syllogism, based on the predicates mortal and man . FindEquationalProof gives a proof of the assertion that Socrates is mortal:

✕ FindEquationalProof[ mortal[socrates], {ForAll[x, Implies[man[x], mortal[x]]], man[socrates]}]

I think it’s pretty neat that this is possible, but it must be admitted that the actual proof generated (which is 53 steps long in this case) is a bit hard to read, not least because it involves conversion to equational logic.

Still, FindEquationalProof can successfully automate lots of proofs. Here it’s solving a logic puzzle given by Lewis Carroll, that establishes (here with a 100-step proof) that babies cannot manage crocodiles:

✕ FindEquationalProof[ Not[Exists[x, And[baby[x], manageCrocodile[x]]]], {ForAll[x, Implies[baby[x], Not[logical[x]]]], ForAll[x, Implies[manageCrocodile[x], Not[despised[x]]]], ForAll[x, Implies[Not[logical[x]], despised[x]]]}]

Geo-Everything

The Wolfram Language knows about many things. One of them is geography. And in Version 12.1 we’ve substantially updated and expanded our sources of geographic data (as well as upgrading our server-based algorithms). So, for example, the level of detail available in typical maps has increased substantially:

For many years now we’ve had outstanding geodetic computation in the Wolfram Language. And we also have excellent computational geometry for doing all sorts of computations on regions in Euclidean space. But of course the Earth is not flat, and one of the achievements of Version 12.1 is to bring our region-computation capabilities to the geo domain, handling non-flat regions.

It’s an interesting exercise in geometry. We have things like the polygon of the United States defined in geo coordinates—as a lat-long region on the Earth. But to use our computational geometry capabilities we need to make it something purely Euclidean. But we can do that by using our geodesy capabilities to embed it in full 3D space.

So now we can just compute the centroid of the region that is the US:

✕ RegionCentroid[Polygon[Entity["Country", "UnitedStates"]]]

That third element in the geo position is a depth (in meters), and reflects the curvature of the US polygon. And, actually, we can see this directly too:

✕ DiscretizeRegion[Entity["Country", "UnitedStates"]["Polygon"]]

This is a 3D object, so we can rotate it to see the curvature more clearly:

We can also work the other way around: taking geo regions and projecting them onto a flat map, then computing with them. One knows that Greenland looks very different sizes with different map projections. Here’s its “map area” in the Mercator projection (in units of degrees-squared):

✕ Area[GeoGridPosition[Entity["Country", "Greenland"]["Polygon"], "Mercator"]]

But here it is (also in degrees-squared) in an area-preserving projection:

✕ Area[GeoGridPosition[Entity["Country", "Greenland"]["Polygon"], "CylindricalEqualArea"]]

And as part of the effort to make “geo everything”, Version 12.1 also includes GeoDensityPlot and GeoContourPlot .

Advance of the Knowledgebase

Every second of every day there is new data flowing into the Wolfram Knowledgebase that powers Wolfram|Alpha and Wolfram Language. Needless to say, it takes a lot of effort to keep everything as correct and up to date as possible. But beyond this, we continue to push to cover more and more domains, with the goal of making as many things in the world as possible computable.

I mentioned earlier in this piece how we’re extending our computational knowledge by curating one particular new domain: different types of data structures. But we’ve been covering a lot of different new areas as well. I was trying to think of something as different from data structures as possible to use as an example. I think we have one in Version 12.1: goat breeds. As people who’ve watched our livestreamed design reviews have commented, I tend to use (with a thought of the Babylonian astrologers who in a sense originated what is now our scientific enterprise) “entrails of the goat” as a metaphor for details that I don’t think should be exposed to users. But this is not why we have goats in Version 12.1.

For nearly a decade we’ve had some coverage of a few million species. We’ve gradually been deepening this coverage, essentially mining the natural history literature, where the most recent “result” on the number of teeth that a particular species of snail has might be from sometime in the 1800s. But we’ve also had a project to cover at much greater depth those species—and subspecies—of particular relevance to our primary species of users (i.e. us humans). And so it is that in Version 12.1 we’ve added coverage of (among many other things) breeds of goats:

✕ Entity["GoatBreed", "OberhasliGoat"]["Image"]

✕ EntityList[ EntityClass["GoatBreed", "Origin" -> Entity["Country", "Spain"]]]

It may seem a long way from the origins of the Wolfram Language and Mathematica in the domain of mathematical and technical computing, but one of our great realizations over the past thirty years is just how much in the world can be put in computable form. One example of an area that we’ve been covering at great depth—and with excellent results—is food. We’ve already got coverage of hundreds of thousands of foods—packaged, regional, and as-you’d-see-it-on-menu. In Version 12.1 we’ve added for example computable data about cooking times (and temperatures, etc.):

✕ Entity["FoodType", "Potato"][ EntityProperty["FoodType", "ApproximateCookingTimes"]]

ExternalIdentifier, Wikidata & More

Books have ISBNs. Chemicals have CAS numbers. Academic papers have DOIs. Movies have ISANs. The world is full of standardized identifiers. And in Version 12.1 we’ve introduced the new symbolic construct ExternalIdentifier as a way to refer to external things that have identifiers—and to link them up, both among themselves, and to the entities and entity types that we have built into the Wolfram Language.

So, for example, here’s how my magnum opus shows up in ISBN space:

✕ ExternalIdentifier["ISBN10", "1-57955-008-8"]

Right now we support 46 types of external identifiers, and our coverage will grow broader and deeper in the coming years. One particularly nice example that we’re already covering in some depth is Wikidata identifiers. This leverages both the structure of our built-in knowledgebase, and the work that we’ve done in areas like SPARQL support.

Let’s find our symbolic representation for me:

✕ \!\(\*NamespaceBox["LinguisticAssistant", DynamicModuleBox[{Typeset`query$$ = "stephen wolfram", Typeset`boxes$$ = TemplateBox[{"\"Stephen Wolfram\"", RowBox[{"Entity", "[", RowBox[{"\"Person\"", ",", "\"StephenWolfram::j276d\""}], "]"}], "\"Entity[\\\"Person\\\", \\\"StephenWolfram::j276d\ \\\"]\"", "\"person\""}, "Entity"], Typeset`allassumptions$$ = {}, Typeset`assumptions$$ = {}, Typeset`open$$ = {1}, Typeset`querystate$$ = {"Online" -> True, "Allowed" -> True, "mparse.jsp" -> 0.488214`6.140155222562331, "Messages" -> {}}}, DynamicBox[ ToBoxes[AlphaIntegration`LinguisticAssistantBoxes["", 4, Automatic, Dynamic[Typeset`query$$], Dynamic[Typeset`boxes$$], Dynamic[Typeset`allassumptions$$], Dynamic[Typeset`assumptions$$], Dynamic[Typeset`open$$], Dynamic[Typeset`querystate$$]], StandardForm], ImageSizeCache -> {117., {7., 16.}}, TrackedSymbols :> {Typeset`query$$, Typeset`boxes$$, Typeset`allassumptions$$, Typeset`assumptions$$, Typeset`open$$, Typeset`querystate$$}], DynamicModuleValues :> {}, UndoTrackedVariables :> {Typeset`open$$}], BaseStyle -> {"Deploy"}, DeleteWithContents -> True, Editable -> False, SelectWithContents -> True]\)

Now we can use the WikidataData function to get my WikidataID:

✕ WikidataData[Entity["Person", "StephenWolfram::j276d"], "WikidataID"]

✕ InputForm[%]

Let’s ask what Wikidata classes I’m a member of:

✕ WikidataData[Entity["Person", "StephenWolfram::j276d"], "Classes"]

Not that deep, but correct so far as I know.

There’s lots of data that’s been put into Wikidata over the past few years. Some of it is good; some of it is not. But with WikidataData in Version 12.1 you can systematically study what’s there.

As one example, let’s look at something that we’re unlikely to curate in the foreseeable future: famous hoaxes. First, let’s use WikidataSearch to search for hoaxes:

✕ WikidataSearch["hoax"]

Hover over each of these to see more detail about what it is:

✕ WikidataSearch["hoax"]

OK, the first one seems to be the category of hoaxes. So now we can take this and for example make a dataset of information about what’s in this entity class:

✕ WikidataData[ EntityClass[ ExternalIdentifier["WikidataID", "Q190084", "hoax", "Description" -> "deliberately fabricated falsehood made to masquerade as the truth"|>], All], "WikidataID"]

We could use the Wikidata ExternalIdentifier that represents geo location, then ask for the locations of these hoaxes. Not too many have locations given, and I’m pretty suspicious about that one at Null Island (maybe it’s a hoax?):

✕ GeoListPlot[ Flatten[WikidataData[ EntityClass[ ExternalIdentifier["WikidataID", "Q190084", <|"Label" -> "hoax", "Description" -> "deliberately fabricated falsehood made to masquerade as the \ truth"|>], All], ExternalIdentifier["WikidataID", "P625", <|"Label" -> "coordinate location", "Description" -> "geocoordinates of the subject. For Earth, please note that \ only WGS84 coordinating system is supported at the moment"|>]]]]

As another example, which gets a little more elaborate in terms of semantic querying, let’s ask for the opposites of things studied by philosophy, giving the result as an association:

✕ WikidataData[ EntityClass[All, ExternalIdentifier["WikidataID", "P2579", <|"Label" -> "studied by", "Description" -> "subject is studied by this science or domain"|>] -> ExternalIdentifier["WikidataID", "Q5891", <|"Label" -> "philosophy", "Description" -> "intellectual and/or logical study of general and fundamental \ problems"|>]], ExternalIdentifier["WikidataID", "P461", <|"Label" -> "opposite of", "Description" -> "item that is the opposite of this item"|>], "Association"]

What Is That Molecule? Advances in Chemical Computation

You have an image of a molecular structure diagram, say from a paper. But how can you get the molecule it represents in a computable form? Well, with Version 12.1 all you need do is use MoleculeRecognize :

✕ MoleculeRecognize[CloudGet["https://wolfr.am/L9rL9B2K"]]

It’s the analog of TextRecognize , but for molecules. And what it produces is a Wolfram Language symbolic representation of the molecule. So, for example, you can then generate a 3D structure:

✕ mol = MoleculeRecognize[CloudGet["https://wolfr.am/L9rL9B2K"]];

✕ MoleculePlot3D[mol]

Or you can compute the distribution of torsion angles of the structure:

✕ Histogram[MoleculeValue[mol, "TorsionAngle"], 360]

You can also connect to the world of external identifiers:

✕ MoleculeValue[mol, "PubChemCompoundID"]

But what’s really useful about MoleculeRecognize is that it can be used programmatically. Take all the images of chemicals from a paper, “molecule OCR” them—then do things like check whether the molecules are equivalent, or make a word cloud of their 3D structures:

✕ WordCloud[ MoleculePlot3D /@ DeleteDuplicates[MoleculeRecognize[{\!\(\* GraphicsBox[ TagBox[RasterBox[CompressedData[" 1:eJzt3Qm4VVX5BvBSTGwSM8vUTEzTUjOHDNEyVDSaQ8kUS0HAqBwCC9RSaZJM Tc1GrTSFQrFBDQQtpcxyaLCyOacsxyybbF5/f+v/LJ7t6XI498K5Z59zv/d5 Tsa955y799rrXd/7DetbIycfNX7aGo95zGNmDn/kf8ZPmjVmxoxJx+434pF/ TDhy5vTDj5w6ZdyRx0w9fOqMUZPXfOSH8x953fvIa9gjrxQIBAKBQCAQCAQC gUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAg EAi0gH//+9/pb3/7W/rNb36Tbrnllvy69dZb00MPPZT+85//dPryAoEhCxy8 6aab0oIFC9LZZ5+dZs2alSZPnpxfRx99dDrzzDPTV77ylfTTn/40Pfzww52+ 3EBgSOHOO+9M5513XjrggAPSNttskzbccMO07rrrpic+8Yn59eQnPzltvPHG aeedd07Tp09PixYtSg8++GCnLzsQGBK4//7701lnnZVe8IIXZD4OGzYsbbLJ JmnXXXdN48aNS/vuu2964QtfmJ7+9Kenxz3ucWm99dZLY8eOTQsXLkx//vOf O335gUBPg9950UUXZT6utdZa2Xbutttuac6cOenLX/5y+s53vpO+9a1vZT4e f/zxaaeddkrDhw9P66yzTnrVq16VvvnNb4aPGgi0ET/4wQ/SG97whsw7NvS1 r31t5uY999yT+fvPf/4z/eMf/0h//etf0913350uuOCC9JKXvCStvfbamc94 e++993b6NgKBnoT47TnnnJM233zzpO3wqFGjluvX//73v//zfj/74x//mD75 yU+mrbfeOj32sY9No0ePTkuXLu3A1QcCvY8//OEPaebMmdmGsov+/+9+97um n8HTX//61+nQQw/Nvilbesopp2Q7GwgEVi9+9rOfpQkTJmR7KGZ77rnnZtu6 MtC/c+fOTeuvv37+7BFHHJF++9vfDsIVBwJDC1dffXXaY489luvcJUuWtPzZ 888/P2255Zb5s/I1P/7xj9t4pYHA0MTixYszN/Hsla98Zbrhhhta/qxaBjFe nx0zZkxatmxZG680EBia+PrXv77cju65557pG9/4RsufvfDCC3PcqPD7xhtv bOOVBgJDE3KfL3vZyzLP1BZ98YtfbOlzfNYPfvCD6SlPeUr+7GGHHZZuu+22 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 nXdemjhxYq4/kAviC6utsBbccccd/1NPISbE3rKdahfoWlrYZ+bNm5evudOx rkBgsIBHagJxyT6YffbZJ2tfelIsh/4Vd+1vLQAbt2TJkpyXVfvObuKZ73R+ ON+4MV5rPWAf9UJjb2lh17LnnnvmOt2+ahcCgaEC8159wxVXXJH9Rb5fqb2j Ndkv9emt1D+Ix4pN7b333lmf4udee+2VuadOmF/aqGvFhNRd2FPnb6otEhti 3xctWpT/dujawFAH/qkToD/Vw4qhbrXVVpljciJymPIbfMdmXBWTYgf5uKX2 ffHixbl2tsoz+vaBBx7I68LMmTPT9ttvn2O84rXqjORY7A+t1i4EAoH/5yr9 q8aB7Rs7dmyufdhoo41ynQDdSZOuSP/Ke6q1ZY/V4/k3nlV9TraUhnZ2GxtL 14oL4fapp56afWEx6KhDCARWjKJ/1arPnj07x29oUHaOX+lMJ/mSxviNf9Om YsO4XvUfcU5NLhu5//775++iqdUWz5gxI1111VVRhxAI9ANF/6p9XbBgQa6n pV/xSq5G3YEaJnmSqs3zuSrH/H/7WEu9k5p3Gtp32GvGF2Vvow4hEBgYSvzX +Z5yKfanqt+T61QLrCaCH9pXrRKbKu4jn6N2QS6FrnXmQ6mvFa8NXRsIrDpw FZ/0/OKX0qv2muCrGkO1P0X/lvpD78NjfObTqpfnq1brawOBwOoFDorTqtNT z77TTjtl+4ivkyZNyrnWM844I02ZMiXnUOw1UyPB51THr1d16NpAoL3AL1yV 23TesDpCNfKlDpdtLTVCBx98cPY5xYsaa3IDgUB7UfTvzTffnGO9fFW9QXGT /pVLiRqhQKDzEPOhf/mqdC6+0sLiueFzBgL1QNG/4rvsZjf0HwwEAoFAIBAI BAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKB QCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUCg2/F/bm+/Rg== "], {{0, 166.}, { 233., 0}}, {0, 255}, ColorFunction->RGBColor, ImageResolution->72], BoxForm`ImageTag["Byte", ColorSpace -> "RGB", Interleaving -> True], Selectable->False], DefaultBaseStyle->"ImageGraphics", ImageSize->Automatic, ImageSizeRaw->{233., 166.}, PlotRange->{{0, 233.}, {0, 166.}}]\), \!\(\* GraphicsBox[ TagBox[RasterBox[CompressedData[" 1:eJzt3Qm8pWMdB3BbkrZJlKJEUVKKRqgQ2caEzDSUtZkYkQyzYWYoCQmlkdRM JaVNG7JFImU3pdFqaZH2sqRN25Pv4/Ncr+OuM/eee973/H+fzzHjzjnnvs/7 Pv/t91+etadMmzB1uWWWWWbGSg/9Z8LkI7aePn3yURPHPPQ/kw6dcdCBhx6w /7hDZx5w4AHTN5uy/EM/PPuh1zLLLrPMCg/9kQKBQCAQCAQCgUAgEAgEAoFA IBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUBgCfHf//43Pfjg g+mf//xnfv373/8e9Of+9a9/pf/85z8jfIUjh//97395DWXt/u5nTYdnZ71/ +ctf0j333JNf9913X/r73/+e/y3QbHjGDzzwQPrNb36TfvKTn6Qbb7wxXXPN Nfm1ePHidPfdd6d77703y0NvICPec/PNN6c77rgj/eMf/+j39/meP/7xj+mX v/xl+t3vfjfg+0cSrt0+//3vf5+vfdGiRT1r/973vpd+/vOf52slH00DXX3/ /fen22+/PV133XXpvPPOS2effXZ+ff7zn0/f/OY3837485//3OezD9Qb9v7P fvazdOGFF6bjjz8+ve1tb0t77LFH2m233fJr8uTJ6Zhjjkmf+tSn0ve///2s J1pt4t/+9rf873vuuWd617velX7wgx/0+zvJmj02Y8aMNH/+/LzHRgNkms67 6qqr0qmnnpoOPfTQtNdee/WsfZ999kmzZ89OZ555ZpYPdrEp9tBzv/POO9OX vvSlNHPmzPTGN74xbbXVVukVr3hF2njjjdPmm2+eXv/616e3v/3t6eMf/3h+ pj4TaA48z29/+9tp7ty56XWve11aY4010lOf+tS02mqrpWc+85lplVVWSU95 ylPy38eOHZsOOeSQ9PWvfz37AlUd8Ktf/Sq99a1vTcsvv3xaf/3107nnntvv 7yXv5GzllVdOW265Zf7OdoM9o8/IPVlfe+2105gxY9LTn/70vF5/Wvuqq66a XvziF2dd8LnPfS79+te/rr0OsHY+3rx589JrXvOavMYnP/nJ6VnPelZ6/vOf n+/F6quvntfv9fKXvzxNnz4975XQAc2AuP6GG27Icmu/P/7xj8/P33444IAD 0qxZs9KUKVPS1ltvnffDE57whCwTEyZMyL7CX//6157vIs98BuPOnv3sZ2d7 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 T1QDghMTF5V8nhqTuug3elqOAi+J38R1FIT8dweqssnus99DiVMHU/9TzrH3 Hryg+LIuIOO9yT/7717Jm+GExYv4ozrY/AL+Pn+Oz9d65nbIf3dgsPn/vjAY +Rcjqw3wHrnUTqiLHizIvzncrfJf8kby32qd6lj/Qc+reZPXUIOsL7Ag5L87 0A7518dWfkfd4n+5MLkLnB4/pmlg//EXrWdu0mulriPkv7loh/yXc+zrKP/s o5ofHKjahaahyL/8hjrAgir/H/LfXLRD/tW8sS91lH91O0X+S29Ek6CGV62C XD8+o8C8MP0cnpk+PzU/geYBX60XFceFw67GuIOBHgC14urj1ITriW0FuRE/ e4/Zb62zbDsZJf+nbl+OrGkwl9Scklb51/+j1pH8q/3XzxBoHtSsql9Rw2se 8VDnd/ALyxku+sZ6qxPR9+O7vQfHVCeurPj/TY3/9b7w/1vlH2ejP5b8m+vS xDN3Aw/Pc1DDLw9M9ofay4UH1x8g70+X9CbbZVY9X6MdM+CGE/r3zEXRv2Te S9PAv1G/0Cr/agHUNEb8H+hmFPnHj1X58aZAXb8+l1b5j/xfIPCI/Jt7YCZS 06BWWU93q/wH/x8IPCL/epjVQTcNJf/XKv/iwVKzFfIf6FYU+ZcbbWL+z5wS 8y5a5V/NpnxQyH+gm1Hkv7X+tymQu+mN/zMPqMx1CfkPdCuaLv9mXfaW/w/+ LxBovvz3Vf8T8h8IpDzPyOyjpsp/X/xfyH8gkHJNo7lnTZV/9X/mvoT8BwKP BfnAjzVV/vvi/0P+A4GH/WP20ex35/g0DSH/gUDfcCaG+R9mITsvqmko8h/z vwKBx8J5BeZ/sY9Nln85AGeXFIT8BwKPzP9tav9vkX/n4OoFKAj5DwRSWrBg QZ6P23T+T39DzP8MBB6Ncv5X0+VfD6A5bQUh/4FASqeffnqWj0033TRdcskl o305ww7rW3311bP/7yz7gqr8O7/RmYeBQLfhxBNPzPwffrw6H7cpKPV/7L/z zAuq8u88Y2e+BQLdhsL/m1/c2v9vVprz85xnZMZZHVH4jf7if2eD3XHHHaN4 lYHA6MB8PP6x808vvvjinp+bYWhGNvuph+7666/PMXLdzoZ3pvG66677mPkm Vfk3/9dZ7oFAt0FMvM466zyG/2Pvzc5zrqGzAfbZZ5/cS0dunA1al/OizTQf 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 "], {{0, 161.}, { 256., 0}}, {0, 255}, ColorFunction->RGBColor, ImageResolution->72], BoxForm`ImageTag["Byte", ColorSpace -> "RGB", Interleaving -> True], Selectable->False], DefaultBaseStyle->"ImageGraphics", ImageSize->{60.703125, Automatic}, ImageSizeRaw->{256., 161.}, PlotRange->{{0, 256.}, {0, 161.}}]\), \!\(\* GraphicsBox[ TagBox[RasterBox[CompressedData[" 1:eJzt3Qnc5WP5P/CxDYMaKlmSopJSoexNRAijaFCaUo0YScY0QzUZTIORJYwR UilKNWSyJHtE0jYyEaN916Z90fr9ed+v1z3/2/mfZ5s5Z875nnN9Xq/DM89z nvOc5Xt/7uv6XJ/rujc+5OgJk1ccNWrU9NUe+8+ESe/eZdq0STP2X+uxfxw4 ZfoRh0857NC9phxz2OGHTdv+kJUe++bdj93WW2HUqJUf+38VCAQCgUAgEAgE AoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFA IBAIBAKBQCAQCAQCgUAgUFP873//q/7973+nm68DgUCgVfjLX/5S3XvvvdWi RYvS14FAINAqPPTQQ9X06dOrww47rPra174WMUwgEGgZFi9eXB1wwAHVBhts UF1wwQXV3//+904/pUAg0CP4zW9+U02ePLladdVVUwzz/e9/v9NPKRAI9Aj+ 8Y9/VLNnz67WXnvtaty4cdUtt9zS6acUCAR6BPSW+fPnVy984Qurddddt7ro oouq//znP51+WoFAoEfwzW9+sxo/fnw1evToasaMGdUjjzzS6acUCAR6BA8/ /HB1xBFHJA1m4sSJ1QMPPNDppxQIBHoE//rXv6q5c+dWT3va06qXvvSl1c03 3xx16kAg0DLgFPruhhtumDSYf/7zn51+SoFAoEfwwx/+sDr44IOrMWPGVNOm TUs5UyAQCLQC6tSzZs2q1lprrWqfffapvv71r3f6KQUCgR7CJz7xieq5z31u 9fznP7+64oorqv/+97+dfkqBQKBHoP/ola98ZfXEJz6xOuOMM6JXIBAItAy/ //3vq6OOOirVqY855pjUOxAIBAKtgJr0Bz7wgWqdddZJPY/mNgQCgUCrcOml l1abbrpp9aIXvai66qqrwgcTCARahi996UvVy1/+8hTDnHvuuamuFAgEAq3A T3/602rSpEnJB/OOd7yj+slPftLppxQIBHoE4pX3v//91VOf+tRq7733rr76 1a92+ikFAoEeAb2F7vKSl7ykes5znlNdfvnlocEEAoGWYeHChdWrXvWqavXV V69OO+200GACgUDLwPdy9NFHV2ussUaamfmjH/2o008pEAj0CJyFZNb3M5/5 zGqXXXZJNaVAIBBoFcxrMAsGx3zsYx9LM2ICgUCgFXCOwOtf//qkwegV+OUv f9nppxQIBHoENN0TTjihGjt2bNJ6zegNBAKBVkGvgHkNzhZYsGBBzGsIBAIt w+233556BcycOv300+N86kAg0DKYmfnGN76xWmWVVdL5AtErEAgEWgXzpWgw 5k1Fr0AgEGg1PvKRj1Qbb7xx0mHmzZtX/eAHP6h++9vfVn/961+TTyYQCASW FjfddFPywein3nbbbaspU6ZUH/zgB5Pe++Uvf7l68MEHq5///OfVn//85zhX NhAIjAjmNbz5zW+uVlxxxXR+rPOR1JO23nrrarfddktnmpx00kmpD/IrX/lK tXjx4uSVkVvpi4zeyEAgMBD4YI477rjUiySG2WabbVJNafPNN095kzMfN9lk k2qrrbaqdt999+otb3lLmu/w+c9/Pnlm8M2vfvWr6m9/+1vKp4JvAoFABs/L mWeemebZbbTRRqmf+otf/GI6y+Tkk09OHl+xzDOe8YxqvfXWq9Zff/3q2c9+ duKhvfbaqzr00EPTWQRmPtx5552Jb+g3+CbyqUCgv/HII49UM2fOrJ785Cen GEVcIg6ht9BdzAC/+uqrE+8ceeSR1X777Zdmx4htNthggxTfmCPje7vuumv1 tre9rTrvvPOqa665Jp3h9t3vfndJPhUIBPoHziv59Kc/Xb3sZS9LuRHu+MY3 vvH/5ThyKBwhNnGG0pVXXlmdddZZSQvWWyC+edaznpVm4olxzA/ffvvtq/Hj x1eTJ09O+dR1112Xfv9nP/tZ4rQ4/zoQ6E3gD9zymc98Jmkqa665ZupznDBh QvXZz362WrRoUfXjH/843aexr9rvyn1+/etfp9gE31x77bXV+eefn7gEVzkf 8ulPf3r1lKc8pVp33XWTfrPjjjumub8nnnhi9eEPf7i65ZZbUm0Kb/3xj39M fBPaTSBQb1jD4gdxC25Ze+21U+yCX3CCGrU45j3veU+a26BGjUcefvjhpp4Y j/foo49Wv/vd7xJf3HbbbdUnP/nJ5Ns76KCD0nyZLbfcMmk2ZkHIq/DPDjvs kLRieZc+KL/n98U3eC34JhCoF6xXs+suu+yyVHum6dJceHfVjF7wghckjRfP iDnUqf1M74D+JLENj6++AhzVzH9H06Xd6DWg3dxxxx1L8qlDDjmkGjduXPW8 5z0v6Tb+llzK33nFK16Rfi6+wWtmXsmnxDaBQKD7gRM+/vGPJy6hze68884p r7n77rtT/HDJJZdUp5xySjq3xHoXc/DDuPn6xS9+cfXqV7+6mj59evL9qhc9 8MADyfM7EN/gNNqufOr+++9Pc60uvvjixCNvetObEt/Qh3GNGpX4Rm0c/6lN yb3ETYHehOtDrCrnjhln9YTPUBwwf/78lK/ol3bOvX9b934u7nAfNaOHHnqo uuGGG1LMoWZEp3Xeo/wm84CYAwe84Q1vqKZOnVp96EMfSnzjd+VSerGb1adx kL/D1/ftb387+YcvvPDCasaMGanXkpdY7EQrxoFmX8V84N4EXvnFL36Rrhv+ BvscL1XwTL3wpz/9KX1+eILeIicSf9A5BoKakc9ajuJzl1PxyagZ4SaaipqR 2EauQ1PBXW9961tTLnXFFVek+jS+oakMxDeuJbEPDqEr33jjjdU555yTciXP V68CP02gd5D3O7n2qaeemnJw/obXvOY1aU/jE7fvBc90N3yOtBCeFpqtmEDc 4Yx7ccpw9dP8OOISWq/rghaj7qy3QM1os802S7GN2APX5OtFjiMXwjdq33hk sPq079OI5FL4CTeFT693INc1m/VTn/pU8m66XvTvq2E+6UlPSrmy6+bss89O +5prJT7/7gRO4Ds54IADki/Fmhcb0F6XtTYjX1Zbvu+++1KtWX40a9asdN7J HnvskTQU8Y2cKvcX0G7kOxdddNGSepHH8Dxjr+pt+Hx91q5H1wB/FP+CHJgG t//++yfNz/XC64lnDjzwwKTVfe9734szuroMcqLrr78+cYvP0fp2nv1I4pbh gqZin6Gp0Hvl0zwuatziG94Xuq26FO0m51K5l0mt3Cw9+RHuw11Rm+4NiD1c G3xS8maeCD0m8nS+TNcIznHmn76UOXPmpGvDfohn7Inu42fi59iHOg/1mi98 4QtpT+BvUwO2jtvBLc3gmqLtyIVouGpAcjJ1qT333DNxnXkz4htcoy6llrXv vvtW733ve1M+h2fiWqovXGf2OHvGRz/60ZQLiUl4Iuw18nU+BLXHHJvYp1yj +lGmTZuWtH48I++m0dD/8FTkTJ2Bz1R+K35Qi/HZWMuzZ89OOm2nYoKsFdN6 XR/4Q57GV7PPPvskT5/6Ny4U34h39DDx7AXqB35LvMEfTu9XexRDy33win5Y vig80eyazBoN3xRPOF8WXrInTZw4MfGVONn9Is5dfvjDH/6Q6r3yDjEoLdc6 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 NM73cXaK/V7vQB35RW/VwoULl5yRZw7APffc8zgPU6Cz6Hd+KeOXE0444XEe Vp5dvdPOXqzzfMxyfl0z/25d59eJU84888zUg+pzsgeEB7m7UPLLnnvu+bjz SfoBpf4iVyhnLM2fPz+dS63H0ZmKdcRg81/qzC9iF+eG2hOdzeV1lN7kQHeg 5Jd+9FiV/KJ/uuzxK/27vdB/xJ/drD5dR37Ry6Anc5111knzBS+77LKIXboQ /X5+QMkv6ps0iYxe89fJA2+//fYlPyvPV6sTv9ClzftyTvFaa61VTZky5XFz hQPdg5JfGuuzwKskZ+Bf6kXdrOQXPsNyxnWv8cs222xTXX/99Ut+5kxHczHV p+vEL2bwibVxC850Bl546roTvALZXydW5rcroZ/6kksuqa688sran2XfDCW/ WGulN8tr3nLLLVNvdV3rR3QKc23WWGON9DrvvPPOJT8r52PWxf/CP3D22Wen nnazS33Ngx7oTlhPzq3I9ctyPitYY7vuumuq4cp3b7jhhrTHl3XcOqPkF7P0 S2+W2pIzc/3c664rzCZ3tjgvXdkjXfYHyJO6Pccwm8dnQkd6whOekPbFe++9 t2fOQu9F4H4eiIH6G2n01hgPCC8IrnGOBx6ihdb9sy35pfH8DtwrduOzq7Pn XF+Rsyh9lrSLjFLfNcOw27V9s8+OPfbY1M++2WabJc29fD2B7gNdJfdPN8bP IEd3bZoPsummm6ac1//t9c4cu//++xPP1FGbwY36Vnbaaacla8zryTALxtr0 HpRzYeoGr1OffLkWfY/eUs5evvvuu7v2daoN8QtsvfXWKXZxzdZFL+pn4Jfp 06cnjY/HWp2vnHEN/s33edZZZ6UZrvJemoRzgSZPnpz82XSbOmkzYm0xybnn npv2QmtMbHbNNdf0RFw2GGih6oT2h3z2tvfgtNNOS3o/Huqm1++58OWaU2QO mP2AptsrOXovw2c0b968asMNN0yxiTPQL7/88hSLlp+ffU1/rfrm8ccfX+24 445prj7/wXbbbZe0GbGAmmc5w7bb4LmJSfhAeD/pSrRPa0wOKEfCsXXjy+GC PmrG94knnpi4xWfutetB4iNR67366quTDlXO2uok8J3PSi87Xff000+PWZ41 grVmBi8fmTXmutOLI1eyx5e1P1+rM6jdil1ck+q3Pnf6sP4yjyen6KacKecI 1tZ5552XciG+/7Fjx6bXzafLZ77++uunGJyXl16BU7uZL4cDr11+gTN9bnJb n5e9wfmU22+/fbXFFlukPcYaxrli2muvvTZpNJ18/fa1u+66K+Vv8qKJEyem nqNuurYCg0OOJC7hX3Vt6XPfZJNNEl+ImWn21lmOZ1yvfodWYW6kPX/zzTdP a9OatXbVcx988MG0B3Y61ra27MfydzG2nmhrC6/wT8yYMaO69NJLUx3Xv70O 60+/sX2zG/lyuLA+xaJ8L2YYyGm9PjyiH4lG6rP33tBO8+fvvdl5552Tlq9n xD7TiXzE33VdZp+unK5b4qrA8GENqk+qR/PZ2c9oLPrG1I9oLzQYvJL5wv/V n6w/c31yTCAG4ksTa9MzrO1OeLfFWvbfG2+8McUjO+ywQ+qzVX/IvKJ2Kx4T 2/AW0rI9b140r8PrwZ8XX3zxEr6sA3CB127eLo6gLYlPcEf2GuAVPYI+RzkI vXTBggXJZ7jVVlstef0+fzyrZuh9Wl77hfdavMWnu+aaa6bn1ejPCtQL+EOd UvxhXdnr6Sz0Pz4Z2gzPXVmLyJqG+sMZZ5yR+iTtjznWdn6gNU6bWR71CX9D vGHftbbEIZ4LvrQHqsfjPXzayHv0iewp5BHFr/Zy2jfekTPw/3RrzmTt81v7 LMSeehrV+3yG8iA9EIN5Jb1+cSk+Vbv2fvld14FZd/rI8dCjjz7a9teBz+RD 9gR631VXXdX2vxtoP+QB1qe9T31lv/32W7I+xQDibPu8uWGlNmPN5XjB/uh6 dm3KNXAOr6UYqJ31XnxhfWR+xA/0IToDfjST7r777hvUN5HXKG9MXqPyRfv/ LrvsUp166qlJE9Cr1E05k/3e/u415lhSLiR3NftTboE7yxi0GfLnr2ZjRqj+ ERzl9ftMzeGizXn97eJZ77/3Pu9T9q2yNyxQf7h26PS33XZbikFwi/jajQZs Xoqf0WZKvsi5Fk3DHijXkj+7RukfznLmY2ulNuOx8B1u4/O371pbNFvxC26z XuQDw+UE3Cn/zzUzcTq+xFk4x9rrBo3Jni63u+6661J8QmOxF4g5cKznKRbI udBwkf0/8l+6Pd8sb4LXj3M8rp9Z963cL+R2N998c/J7yovCp9vbcP3ii5yb yxVcv+IS1xxtxvXbeJ3ZgxYtWpTORZTDu7+c3toXA1kPtI9liXn9rnyFHwIH 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 A1Df "], {{0, 199.}, {280., 0}}, {0, 255}, ColorFunction->RGBColor, ImageResolution->72], BoxForm`ImageTag["Byte", ColorSpace -> "RGB", Interleaving -> True], Selectable->False], DefaultBaseStyle->"ImageGraphics", ImageSize->Automatic, ImageSizeRaw->{280., 199.}, PlotRange->{{0, 280.}, {0, 199.}}]\), \!\(\* GraphicsBox[ TagBox[RasterBox[CompressedData[" 1:eJztnQusbGdZ97lpiMZIjEai0bQNTdsUAxiVTwwoBCJEI0k/BJGQCLblolBD SwuFll7Ooff7/UZbCrQFwqUWhCIXobRQrhIUxYDFAu2BAsX7fT5+K/mt7z/v WbNn5uw9c2bOfv7J2jN7Zq0173rXev/v8zzvc9n/hUcdduRDHvSgBx398B/8 OewFxz35Fa94wav/7yN+8M/vvvzol7zo5Ucc/oyXH3PEi454xf954UN/8OH3 f7A9+sEPetDDfvA6KhQKhUKhUCgUCoVCoVAoFAqFQqFQKBQKhUKhUCgUCoXC QvA///M/o//+7/8e+59N/O///u+Gm+AcfvZf//VfY+echv/4j//otmzDpPYN 7V8oFLYf4IDkhlk45z//8z97rtoTDP2GHAXvAc5N2/itPf2dQqGw/vjXf/3X /n0rV80COSWPc8vzTUL+TnsuAEcllP9mPX+hUNh3oHyUXAEX/Pu///vc52rP Mw+fID/927/929i5bEd7HvmqUChsT8AVe8JRyjvwFNyX3DKLPunxeRzc9c// /M9jNiraxm9oH2t/q1Ao7Pv4x3/8x14mYvz/y7/8S//drHzQ8g3v4ZfUNTc6 NnU+jss2KP8l+L+4qlDYnki5Cq7wf3lhow3ke+QfzjHP+l3y1QMPPNDret/+ 9rfHeAkZUJ2Rff7pn/5pD6+4UCisI+CW888/f/TSl750dMYZZ4x27tw5Ovnk k0dnn3326KSTThqdeuqpG26nnXba6IQTThideOKJo9e//vXdsa997WtHF154 4ejd7373TG1o+RJ873vfG1111VUjUuK4PfKRjxyde+65o+9///u7HVcoFLYH khMe/vCHd68PechDxj7faHvYwx42euhDHzr6sR/7se7/Bz/4wd3xfM7/v/3b vz360Ic+1Ot12KZA68OV4POzzjqrO5ftYYNbC4VVArqEeoBzqPqFvjh872et XrLRlnqK9hU+Yz7P32vtL2lTybUsxqDjL8+X52p/d5WA7QpO+KEf+qExDpqV r374h3+4f8855CmP53v3efaznz26/fbbx+xkrgPSDu328trll19efFVYaQzN t9g3Lrjggm7+Zkyw+d5x4fM8z/h6xCMe0f2PHoNu853vfKf/TbhHHlT/aNsG HzF+fvzHf7yXJWgXbW39hiZd2ypATkhZKftp2ka/c93JLcpp9A2vP/IjP9LL b3fdddeY7wKwb3i176688sriq8JagOeWZ9q5FnvIpPGi/jHL2GIstp8xhhin P/VTPzU67rjjxtakUq5StktZ6dJLL+3Oye//6I/+aHc+2go4B9ewqjwFuFZ5 nH7wGrJvN9rsT/ug5TllrZ/7uZ8bmy/uuOOOXv5sfT+181988cXFV4WVxpA/ DoAXkId4/nnmlWfmkQPSbsvYZM5XDthvv/3GzvfZz362k6scU6xFpd7JOOc7 xlSOWdpIW2e5plWBvGT/wFlXXHHFTOuD6sD0xXXXXTe67LLLRrfcckuny8lR 2rWYD9JGBuhH+D91b/kd3i++Kqw6GCe59sPzzDpU6h/KU44Bx5nfTdocK2mz +Ymf+Ind9EX2+9znPteNydRdtLMIuIljUragra2v4zzxv8sE1+L12jds8/CC Mmer46Ffv/zlL+/6Wn3QPqLPzznnnH5f+zV919Gri68K6wBtr3ID8728IM/w /o1vfOPozW9+8+jaa68dvelNb+r+32h7znOeM/rJn/zJnrOc+9l+5md+ptdh HLusawHGHmMy4014z/p6ax+jrUPXsKqwL5UT4ZaLLrqo9yffaDM2WY5BToKf 0//8iU98YtfPysRyF7+nbVDkuc4777ziq8JKo31+Bc9pq7fAWynHzGIncgwx LvBN/MxnPjP6gz/4g06PS1sW5+Yzxpq29zy/chc6C8cw9hzvk8bUpGvbm+Ca htb50HNnkQntk9ZXAcB3/k8fc251RH/zU5/6VOcX6nmS24uvCusAbe25xnbJ JZf0cpXrgjzLyjCz+gsoDxCHAtQ7n/nMZ/ZrWcoB/v+JT3xibBxlu9AH0zZN 22hr7rvqNvfkBK/FNYPNwn6De1qbI/x+5pln9lznPVSvhDOVxX76p3+6O/51 r3td9136PaS+bWxhC/1VvBetrFwo7AlyXKc/4aT1waF9pyHlBtf/4C98vF1r VFaCs04//fRunxwH/h7clOtovIfDGAuOnRyH6ljZDm35bW46f4/9F2n/WiRf yQ/f+ta3drMRwj/PetazevnVa/S6kaVomzZK7gk+Dn6fa7Xcx/e85z3d+u7x xx8/OuWUU0YvfvGLx+KLPM74xkJhs1g0XzF+Wn9Un3lsVK7ra9difkdmct/2 91q+Yl9sWsJjUheEn3JdzN/3NdcikyMXpU8ukq+yf9PHIddIzBMoX8nd2Ntb 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 Ozc2o4wjnKedxVebR/FVYZ0x