During NaNoWriMo, authors are typically categorized into two distinct types: pantsers, who “write by the seat of their pants,” and plotters, who are meticulous in their planning. While plotters are likely writing from preplanned outlines, pantsers may need some inspiration.
That’s where WolframAlpha comes in handy.
WolframAlpha can help you name your characters. By typing in “name” plus the name itself, you can find out all sorts of info: when the name was most popular, how common it is and more. If you place a comma between two names, you can compare the two.
For example, let’s say you’re writing a roadtrip story featuring two women named “Sarah” and “Sara.” You type in “name sarah, sara” and see the following:
WolframAlpha shows that both names were common around the same time, but one is more likely for a woman who’s just slightly older. You can make Sara the older of the two by a hair, and her age can be a point of characterization. The extra year makes her extra wise—or extra bossy.
What if you want to write about a male character? Let’s explore two possibilities, Kevin and Alan.
By viewing the charts in WolframAlpha, we can see that one name is much more common, but both skew older. What if you try searching for another name, like Dominic?
Additionally, we can see that “Dominic” is a name with a history, with WolframAlpha showing tidbits such as the fact that it was often used for boys born on Sundays. If you’re a pantser, this information is something to file away for later.
Of course, you can always look for popular names if you’re setting your work in the modern day:
So, Sarah and Sara are on their trip. Let’s say that they’re smalltown southern girls who happened to meet because of their shared first name, but you’re not sure what town fits the bill. You can look for cities in North Carolina with a population of under 2,000 people:
From there, you can calculate the price of gas and other costs of living. The small details you uncover can help with worldbuilding, particularly if the story is set slightly in the past. You can also compare facts about different cities:
If spontaneous Sarah didn’t plan for her trip as a well as staid Sara, then you can calculate just how off the mark she was—particularly with an international journey.
WolframAlpha provides currency conversions, so if the ladies’ trip somehow takes them to the UK, then you can determine just how much their trip savings are currently worth:
Even beyond finances or travel planning, WolframAlpha can help ground a plot in reality. Let’s say Sarah and Sara end up at a pub. How many bottles of hard cider can Sarah enjoy before things go pearshaped?
The process of figuring out the physical details of your characters can help you visualize them better too!
Beyond providing reallife calculations that are useful in everyday situations, WolframAlpha can help to add a touch of realism to genre fiction. For example, going back to our friend Dominic… well, he’s a vampire. He was born in 1703, on a Sunday to tie in with his name. But on what date, exactly? We can view our 1703 calendar with a query of “January 1703”:
From this screen, we can also see his age relative to today, putting him at well over three centuries old. We can also see that there was a full Moon on January 3. Could you use this as a plot point? Perhaps he’s stronger against sunlight than the average vampire due to the full Moon reflecting more of the Sun’s rays.
If you’re a pantser, these sorts of searches can be extra helpful for inspiring new plot or character developments. While you may not have initially set out to create a full Moon–enhanced vampire, name searches and looking up past events lit that spark of inspiration.
Realistic physical properties can be especially helpful for scifi writers, particularly those writing hard scifi. While there are some example WolframAlpha searches for scifi “entertainment” on this page, many of which relate to preexisting genre media, you can also use astronomy searches to enhance your scifi setting.
In a previous search, “Emma” came up as a popular name. Maybe it’s still popular when, decades in the future, we’ve colonized Mars.
In this scifi future, we’ve normalized lightspeed travel. To figure out Emma’s commute, you can use formulas to measure the amount of time it would take to travel from place to place. If Emma works at a Martian university, then you can see how long it would take for a lightspeed bus to shuttle her to the office:
She would hardly have time to read through her newsfeed on her holoheadset before the bus dropped her off at work!
For science fiction plots set in a time period closer to today’s tech, you can calculate totals using WolframAlpha’s many included formulas. For example, you can figure out volts and amps for a maker using Ohm’s law, or even run through a linear regression or two for a fictional AI assistant.
Because WolframAlpha is a “computation engine,” it also provides general facts that can help you come up with ideas for characters—and monsters.
For horror writers, the bare facts can provide a perfect starting point for tweaking reality ever so slightly into the uncanny valley.
For example, let’s say you have werewolves in your story. These aren’t friendly werewolves, though: they’re the eldritch kind that give passersby the heebiejeebies. Going by the “one small tweak” rule, you can compare the number of teeth in a dog’s mouth to the amount in a human’s mouth:
What if your werewolves have tootoothy smiles because they have a few too many incisors, matching up with the amount found in a wolf’s mouth? Are dentists hunted down if they discover the truth?
Mystery writers can also discover interesting things on WolframAlpha, from chemical compositions to ciphers. With the latter, there are several wordpuzzle tools you can use to create clues for a crime scene. For example, by using underscores in your searches, you can build Hangmanlike messages from blanks and letters:
WolframAlpha also has a texttoMorse converter, allowing you to convert normal text to dots and dashes. Perhaps a sidekick is attempting to get in touch with a wily detective without kidnappers noticing what’s going on:
For a mystery set in the past, you can use a date search to determine the sunrise, sunset and weather patterns of any given day. While this data is invaluable for historic writers—the books they write are all about historical accuracy, after all—it can also help you determine how an oldtimey crime might have gone down. For example, the witness couldn’t have seen the Sun peeking through the blinds at 5:35am because sunrise hadn’t happened yet:
If you’re trying to come up with ideas on the fly, having an allinone spot to search for facts and figures can be invaluable. For more topic suggestions, check out this page to see other example search ideas separated into categories.
Hopefully these ideas have sparked your interest, whether for your own personal NaNo journey or for a library or classroombased NaNoWriMo project. Feel free to share this post with other writers or educators if you’ve found it to be useful. And even after November draws to a close, continue mining WolframAlpha for story ideas. Write on!
]]>Join Wolfram U for Wolfram Technology in Action: Applications & New Developments, a threepart web series showcasing innovative applications in the Wolfram Language.
Newcomers to Wolfram technology are welcome, as are longtime users wanting to see the latest functionality in the language.
The series is modeled after the three different tracks offered at our recent Wolfram Technology Conference, covering data science and AI (November 14), engineering and modeling (November 28) and mathematics and science (December 12). Each webinar will feature presentations shared at the Wolfram Technology Conference, so if you weren’t able to attend this year, you can still take part in some of the highlights.
Additional presentations will be given live during each webinar by Wolfram staff scientists, application developers, software engineers and Wolfram Language users who apply the technology every day to their business operations and research.
At the Data Science and AI webinar on November 14, learn how to build applications using models from the Wolfram Neural Net Repository, including an overview of some of the newest models available for classification, feature extraction, image processing, speech, audio and more. We will also show some applications built by students from the Wolfram Summer Programs, and we’ll perform realtime examples of model training with data.
The Data Science and AI webinar will conclude with a realworld example applying computer vision tasks to digital pathology for the purposes of cancer diagnosis. Get a preview of the webinar content and learn more about Summer School projects by visiting the Wolfram Community posts on Rooftop Recognition for Solar Energy Potential and Using Machine Learning to Diagnose Pneumonia from Chest XRays.
You can join any or all of the webinars to benefit from the series. You only need to sign up once to save your seat for this webinar and the sessions that follow. When you sign up, you’ll receive an email confirming your registration, as well as reminders for upcoming sessions.
Don’t miss this opportunity to engage with other users and experts of the Wolfram Language!
This year I had the honor of composing the competition questions, in addition to serving as live commentator alongside trusty cocommentator (and Wolfram’s lead communications strategist) Swede White. You can view the entire recorded livestream of the event here—popcorn not included.
Right: Swede White and the author commentating. Left: Stephen Wolfram and the author.
This year’s competition started with a brief introduction by competition room emcee (and Wolfram’s director of outreach and communications) Danielle Rommel and Wolfram Research founder and CEO Stephen Wolfram. Stephen discussed his own history with (noncompetitive) livecoding and opined on the Wolfram Language’s unique advantages for livecoding. He concluded with some advice for the contestants: “Read the question!”
After a short delay, the contestants started work on the first question, which happened to relate to Stephen Wolfram’s 2002 book A New Kind of Science. Stephen dropped by the commentators’ table to offer his input on the question and its interesting answer, an obscure tome from 1692 with a 334character title (Miscellaneous Discourses Concerning the Dissolution and Changes of the World Wherein the Primitive Chaos and Creation, the General Deluge, Fountains, Formed Stones, SeaShells found in the Earth, Subterraneous Trees, Mountains, Earthquakes, Vulcanoes, the Universal Conflagration and Future State, are Largely Discussed and Examined):
The second question turned out to be quite challenging for our contestants—knowledge of a certain function, DiscretizeGraphics, was essential to solving the question, and many contestants had to spend precious time tracking down this function in the Wolfram Language documentation.
The contestants stumbled a bit in interpreting the third question, but they figured it out relatively quickly. However, some technical issues led to some exciting drama as the judges deliberated on who to hand the thirdplace point to. Stephen made a surprise return to the commentators’ table to talk about astronaut Michael Foale’s unique connection to Wolfram Research and Mathematica. I highly recommend reading Michael’s fascinating keynote address, Navigating on Mir, given at the 10thanniversary Mathematica Conference.
Wolfram Algorithms R&D department researcher José MartínGarcía joined the commentators’ table for the fourth question. José worked on the geographic computation functionality in the Wolfram Language, and helped explain to our audience some of the technical aspects of this question, such as the mathematical concept of a geometric centroid. Solving this question involved the same DiscretizeGraphics function that tripped up contestants on question 2, but it seems that this time they were prepared, and produced their solutions much more quickly.
The fifth question was, lengthwise, the most verbose in this year’s competition. For every question, the goal is to provide as much clarity as possible regarding the expected format of the answer (as well as its content), which this question demonstrates well. The last sentence is particularly important, as it specifies that the pie “slices” are expected to be in ascending order by size, which ensures that the pie chart looks the same as the expected result. This aspect took our contestants a few tries to pin down, but they eventually got it.
The sixth question makes use of not only the Wolfram Language’s unique symbolic support for neural networks, but also the recently launched Wolfram Neural Net Repository. You can read more about the repository in its introductory blog post.
This particular neural network, the Wolfram English CharacterLevel Language Model V1, is trained to generate English text by predicting the most probable next character in a string. The results here might be improbable to hear from President Lincoln’s mouth, but they do reflect the fact that part of this model’s training data consists of old news articles!
For the seventh and last question of the night, our judges decided to skip ahead to the tenth question on their list! We hadn’t expected to get to this question in the competition and so hadn’t lined up an expert commentator. But as it turns out, José MartínGarcía knows a fair bit about eclipses, and he kindly joined the commentators’ table on short notice to briefly explain eclipse cycles and the difference between partial and total solar eclipses. Check out Stephen’s blog post about the August 2017 solar eclipse for an indepth explanation with excellent visualizations.
(The highlighted regions here show the “partial phase” of each eclipse, which is the region in which the eclipse is visible as a partial eclipse. The Wolfram Language does not yet have information on the total phases of these eclipses.)
At the end of the competition, the thirdplace contestant, going under the alias “AieAieAie,” was unmasked as Etienne Bernard, lead architect in Wolfram’s Advanced Research Group (which is the group responsible for the machine learning functionality of the Wolfram Language, among other wonderful features).
Etienne Bernard and Carlo Barbieri
The contestant going by the name “Total Annihilation” (Carlo Barbieri, consultant in the Advanced Research Group) and the 2015 Wolfram Innovator Award recipient Philip Maymin tied for second place, and both won limitededition Tech CEO minifigures!
Left: Philip Maymin. Right: Tech CEO minifigure.
The firstplace title of champion and the championship belt (as well as a Tech CEO minifigure) went to the contestant going as “RiemannXi,” Chip Hurst!
I wanted to specifically address potential confusion regarding question 3, Astronaut Timelines. This is the text of the question:
Highly skilled programmer Philip Maymin was one of our contestants this year, and he was dissatisfied with the outcome of this round. Here’s a solution to the question that produces the expected “correct” result:
✕
counts = Counts@Flatten[EntityValue["MannedSpaceMission", "Crew"]]; TimelinePlot[ EntityValue[Keys@TakeLargest[counts, 6], EntityProperty["Person", "BirthDate"], "EntityAssociation"]] 
And here’s Philip’s solution:
✕
TimelinePlot@ EntityValue[ Keys[Reverse[ SortBy[EntityValue[ Flatten@Keys@ Flatten[EntityClass["MannedSpaceMission", "MannedSpaceMission"][ EntityProperty["MannedSpaceMission", "PrimaryCrew"]]], "MannedSpaceMissions", "EntityAssociation"], Length]][[;; 6]]], "BirthDate", "EntityAssociation"] 
Note the slightly different approaches—the first solution gets the "Crew" property (a list) of every "MannedSpaceMission" entity, flattens the resulting list and counts the occurrences of each "Person" entity within that, while Philip’s solution takes the aforementioned list and checks the length of the "MannedSpaceMission" property for each "Person" entity in it. These are both perfectly valid techniques (although Philip’s didn’t even occur to me as a possibility when I wrote this question), and in theory should both produce the exact same result, as they’re both accessing the same conceptual information, just through slightly different means. But they don’t, and it turns out Philip’s result is actually the correct one! Why is this?
The primary reason for this discontinuity boils down to a bug in the Wolfram Knowledgebase representation of the STS27 mission of Space Shuttle Atlantis. Let’s look at the "Crew" property for STS27:
✕
Entity["MannedSpaceMission", "STS27"]["Crew"] 
Well, that’s clearly wrong! There’s a "Person" entity for Jerry Lynn Ross in there, but it doesn’t match the entity that canonically represents him within the Knowledgebase. I’ve reported this inaccuracy, along with a few other issues, to our data curation team, and I expect it will be addressed soon. Thanks to Philip for bringing this to our attention!
The inaugural Wolfram Language Livecoding Competition took place at the 2016 Wolfram Technology Conference, and the following year’s competition in 2017 was the first to be livestreamed. We held something of a testrun for this year’s competition at the Wolfram Summer School in June, for which I also composed questions and piloted an experimental second, concurrent livestream for behindthescenes commentary. At this year’s Technology Conference we merged these two streams into one, physically separating the contestants from the commentators to avoid “contaminating” the contestant pool with our commentary. We also debuted a new semiautomated grading system, which eased the judges’ workload considerably. Each time we’ve made some mistakes, but we’re slowly improving, and I think we’ve finally hit upon a format that’s both technically feasible and entertaining for a live audience. We’re all looking forward to the next competition!
]]>David’s submission takes first place in the category of creepiness—and was timely, given the upcoming Halloween holiday. The judges were impressed by its visual impact:
✕
c=Flatten@DeleteCases[WebImageSearch["eye iris","Images",MaxItems>120],$Failed];ImageCollage[ConformImages[c[[1;;Length[c]]]]] 
David had a character to spare with this submission, so he had no reason to shorten it. But he could have saved 20 characters by eliminating code that was left over from his exploration process. I’ll leave it as an exercise for the interested reader to figure out which characters those are.
Abby’s submission recreates an image by assembling lowresolution flag images. In order to squeak in at the 128character limit, she cleverly uses UN flags. Over half of the code is grabbing the flag and dress images; the heart of the rendering work is a compact 60character application of ImagePartition, Nearest and ImageAssemble:
✕
f=ImageResize[#,{4,4}]&/@CountryData["UN","Flag"];{i=Entity["Word", "dress"][image],ImageAssemble@Map[Nearest[f,#][[1]]&,ImagePartition[i,4],{2}]} 
This OneLiner derives from an activity in Abby’s computational thinking group at Torrey Pines High School. You can download a notebook that describes the activity by clicking the Flag Macaw link on this page.
Take a second to consider what this OneLiner does: gets the list of 164,599 city entities in the Wolfram Language, searches the web for an image of each one, applies the ResNet neural network to each image to guess where it was taken and compares that location with the geotagging information in the image to see how precise the neural network’s prediction is. This may well be an honorable mention… but we’d have to wait 14 hours for the code to evaluate in order to find out:
✕
Mean[GeoDistance[NetModel["ResNet101 Trained on YFCC100m Geotagged Data"]@WebImageSearch[#[[1]]][1,1],#]&/@EntityList["City"]] 
I suspect David was fishing for a dishonorable mention with this submission that creates what one judge called “the cruelest game of Where’s Waldo ever invented.” Your task is to find the black disk among the randomly colored random polygons:
✕
Graphics[{Table[{RandomColor[],Translate[RandomPolygon["Convex"],{i,j}+RandomReal[{E,E},2]]},{i,99},{j,99}],Disk[{9E,9E},1/E]}] 
What? You can’t find the disk?? Here’s the output again with the disk enlarged:
✕
Graphics[{Table[{RandomColor[],Translate[RandomPolygon["Convex"],{i,j}+RandomReal[{E,E},2]]},{i,99},{j,99}],Disk[{9E,9E},5/E]}] 
Note David’s extensive use of the oneletter E to save characters in numeric quantities.
The uniqueness and creativity of this idea moved the judges to award third place to this OneLiner that makes a table of words that are pronounced like letters. It’s fun, and it opens the door to further explorations, such as finding words (like “season”) whose pronunciations begin with a letter name:
✕
w = # > WordData[#, "PhoneticForm"] &; a = w /@ Alphabet[]; p = w /@ WordList[]; Grid@ Table[{a[[n]], If[a[[n, 2]] === #[[2]], #, Nothing] & /@ p}, {n, 26}] 
Like Abby’s Flag Mosaic submission, this OneLiner also derives from an activity in Abby’s computational thinking group at Torrey Pines High School. You can download a notebook that describes the activity by clicking the Alpha Words link on this page.
This was one of the most timely and shortest OneLiners we’ve yet seen. It answers a question that arose just hours before the end of the competition.
Every Wolfram Technology Conference includes a conference dinner at which Stephen Wolfram hosts an “ask me anything” session. One of the questions at this year’s dinner was “What is the age and gender distribution of conference attendees?”
To answer the age part of that question, Isaac took photos of all of the tables at the dinner, used FacialFeatures to estimate the ages of the people in the photos and made a histogram of the result. We can’t vouch for the accuracy of the result, but it seems plausible:
✕
FacialFeatures["Age"]/@Values[Databin@"ytgvoXyH"]//Flatten//Histogram 
Here are the first three photos in the Databin:
✕
Take[Values[Databin@"ytgvoXyH"],3] 
Congratulations, Isaac, on a brilliant demonstration of computational thinking with Wolfram technology.
Our firstplace winner encapsulated an homage to Joseph Weizenbaum’s natural language conversation program, ELIZA, in a single tweet. Philip’s Eliza often responds with offthewall phrases that make it seem either a few cards short of a full deck or deeply profound. But it was the judges’ first conversation with Eliza, which eerily references current world events, that clinched first place:
✕
While[StringQ[x=InputString@HELP],Echo@NestWhile[#<>y&,x<>" ",StringFreeQ[",.\" ",y=(e=NetModel)[e[][[7]]][#,"RandomSample"]]&]] 
Weizenbaum was aghast that people suggested that ELIZA could substitute for human psychotherapists. The program could not and was never intended to heal patients with psychological illnesses. Philip’s Eliza, however, could well drive you crazy.
There were 14 submissions to this year’s competition, all of which you can see in this notebook. Thank you, participants, for showing us once again the power and economy of the Wolfram Language.
]]>Last week, Wolfram hosted individuals from across the globe at our annual Wolfram Technology Conference. This year we had a packed program of talks, training, and networking and dining events, while attendees got to see firsthand what’s new and what’s coming in the Wolfram tech stack from developers, our power users and Stephen Wolfram himself.
The conference kicked off with Stephen’s keynote speech, which rang in at three and a half hours of live demonstrations of upcoming functions and features in Version 12 of the Wolfram Language. Before getting started, Stephen fired up Version 1 of Mathematica on a Macintosh SE/30—it’s remarkable that running code written in Version 1 still works in the newest versions of the Wolfram Language. Stephen also shared with us the latest developments in WolframAlpha Enterprise, introduced WolframAlpha Notebooks, new cloud functionalities, the Wolfram Notebook Archive and the local Wolfram Engine, a way for developers to easily access the Wolfram Language without barriers of entry.
Most exciting during Stephen’s keynote was the litany of new features coming in Version 12 of the Wolfram Language. Stephen ticked through them starting alphabetically—a is for anatomy, b is for blockchain, c is for compiler and so forth. A few of the many highlights included:
The upcoming release of Version 12 will bring with it not only new functions, but also improvements to interfaces, interoperability with other programming languages and core language efficiencies. If you’re interested in seeing Version 12 being designed and built firsthand, be sure to watch Stephen’s “Live CEOing” series of livestreams.
For the second year, Wolfram hosted and livestreamed a livecoding championship where our internal experts and conference guests competed to see who had the best Wolfram Language chops. To be hosted annually, the competition is a fun way to unwind after a day full of talks and an evening of networking. Each contestant is given a coding challenge, and the first to accurately solve the problem is awarded points. Challenges utilize the full range of capabilities in the Wolfram Language, including builtin data, geometric computations and even data science. It was impressive to see how quickly a complicated problem could be solved.
This year, our winner was Chip Hurst, a Wolfram expert who is currently involved in cuttingedge developments in 3D printing in biotech applications. Congratulations, Chip!
Each year at the Technology Conference, Wolfram recognizes outstanding individuals whose work exemplifies excellence in their fields. Stephen recognized eight individuals this year, from educators to engineers to computational mathematicians. This year, Wolfram honored:
We’ll be back with a post about the winners of our annual oneliner competition. This year’s conference was another success for the books, and we look forward to seeing everyone back next year!
]]>Join us Wednesday, October 17, 2018, from 9:30–11:30pm CT for an exciting adventure in livecoding! During our annual Wolfram Technology Conference, we put our internal experts and guests to the test. Coding questions ranging from physics to pop culture, image processing to visualizations, and all other things challenging will be posed to participants live.
Who will take home the trophy belt this year? A senior developer from our Machine Learning group? A highschool kid with serious coding chops? You? Now in its third year, the Wolfram Livecoding Championship promises to be bigger and better than ever. The event is concurrently livestreamed on Twitch and YouTube Live, so if you’re not able to be here in person, we’d love to see you on the stream. The livestream will also be available on Stephen Wolfram’s Twitch channel, with a special livestreamed introduction from Stephen himself. See last year’s competition and get a taste of what the event has to offer:
New this year will be running commentary on competitors’ progress as they each take their own unique approach to problem solving, highlighting the depth and breadth of possibilities in the Wolfram Language.
Stay tuned for more competitions, and we hope to see you there!
]]>Between October 1787 and April 1788, a series of essays was published under the pseudonym of “Publius.” Altogether, 77 appeared in four New York City periodicals, and a collection containing these and eight more appeared in book form as The Federalist soon after. As of the twentieth century, these are known collectively as The Federalist Papers. The aim of these essays, in brief, was to explain the proposed Constitution and influence the citizens of the day in favor of ratification thereof. The authors were Alexander Hamilton, James Madison and John Jay.
On July 11, 1804, Alexander Hamilton was mortally wounded by Aaron Burr, in a duel beneath the New Jersey Palisades in Weehawken (a town better known in modern times for its tunnels to Manhattan and Alameda). Hamilton died the next day. Soon after, a list he had drafted became public, claiming authorship of more than sixty essays. James Madison publicized his claims to authorship only after his term as president had come to an end, many years after Hamilton’s death. Their lists overlapped, in that essays 49–58 and 62–63 were claimed by both men. Three essays were claimed by each to have been collaborative works, and essays 2–5 and 64 were written by Jay (intervening illness being the cause of the gap). Herein we refer to the 12 claimed by both men as “the disputed essays.”
Debate over this authorship, among historians and others, ensued for well over a century. In 1944 Douglass Adair published “The Authorship of the Disputed Federalist Papers,” wherein he proposed that Madison had been the author of all 12. It was not until 1963, however, that a statistical analysis was performed. In “Inference in an Authorship Problem,” Frederick Mosteller and David Wallace concurred that Madison had indeed been the author of all of them. An excellent account of their work, written much later, is Mosteller’s “Who Wrote the Disputed Federalist Papers, Hamilton or Madison?.” His work on this had its beginnings also in the 1940s, but it was not until the era of “modern” computers that the statistical computations needed could realistically be carried out.
Since that time, numerous analyses have appeared, and most tend to corroborate this finding. Indeed, it has become something of a standard for testing authorship attribution methodologies. I recently had occasion to delve into it myself. Using this technology, developed in the Wolfram Language, I will show results for the disputed essays that are mostly in agreement with this consensus opinion. Not entirely so, however—there is always room for surprise. Brief background: in early 2017 I convinced Catalin Stoean, a coauthor from a different project, to work with me in developing an authorship attribution method based on the Frequency Chaos Game Representation (FGCR) and machine learning. Our paper “Text Documents Encoding through Images for Authorship Attribution” was recently published, and will be presented at SLSP 2018. The method outlined in this blog comes from this recent work.
The idea that rigorous, statistical analysis of text might be brought to bear on determination of authorship goes back at least to Thomas Mendenhall’s “The Characteristic Curves of Composition” in 1887 (earlier work along these lines had been done, but it tended to be less formal in nature). The methods originally used mostly involved comparisons of various statistics, such as frequencies for sentence or word length (that latter in both character and syllable counts), frequency of usage of certain words and the like. Such measures can be used because different authors tend to show distinct characteristics when assessed over many such statistics. The difficulty encountered with the disputed essays was that, by measures then in use, the authors were in agreement to a remarkable extent. More refined measures were needed.
Modern approaches to authorship attribution are collectively known as “stylometry.” Most approaches fall into one or more of the following categories: lexical characteristics (e.g. word frequencies, character attributes such as ngram frequencies, usage of white space), syntax (e.g. structure of sentences, usage of punctuation) and semantic features (e.g. use of certain uncommon words, relative frequencies of members of synonym families).
Among advantages enjoyed by modern approaches, there is the ready availability on the internet of large corpora, and the increasing availability (and improvement) of powerful machine learning capabilities. In terms of corpora, one can find all manner of texts, newspaper and magazine articles, technical articles and more. As for machine learning, recent breakthroughs in image recognition, speech translation, virtual assistant technology and the like all showcase some of the capabilities in this realm. The past two decades have seen an explosion in the use of machine learning (dating to before that term came into vogue) in the area of authorship attribution.
A typical workflow will involve reading in a corpus, programmatically preprocessing to group by words or sentences, then gathering various statistics. These are converted into a format, such as numeric vectors, that can be used to train a machine learning classifier. One then takes text of known or unknown authorship (for purposes of validation or testing, respectively) and performs similar preprocessing. The resulting vectors are classified by the result of the training step.
We will return to this after a brief foray to describe a method for visualizing DNA sequences.
Nearly thirty years ago, H. J. Jeffrey introduced a method of visualizing long DNA sequences in “Chaos Game Representation of Gene Structure.” In brief, one labels the four corners of a square with the four DNA nucleotide bases. Given a sequence of nucleotides, one starts at the center of this square and places a dot halfway from the current spot to the corner labeled with the next nucleotide in the sequence. One continues placing dots in this manner until the end of a sequence of nucleotides is reached. This in effect makes nucleotide strings into instruction sets, akin to punched cards in mechanized looms.
One common computational approach is slightly different. It is convenient to select a level of pixelation, such that the final result is a rasterized image. The actual details go by the name of the Frequency Chaos Game Representation, or FCGR for short. In brief, a square image space is divided into discrete boxes. The gray level in the resulting image of each such pixelized box is based on how many points from chaos game representation (CGR) land in it.
Following are images thus created from nucleotide sequences of six different species (cribbed from the author’s “Linking Fourier and PCA Methods for Image Look‐Up”). This has also appeared on Wolfram Community.
It turns out that such images do not tend to vary much from others created from the same nucleotide sequence. For example, the previous images were created from the initial subsequences of length 150,000 from their respective chromosomes. Corresponding images from the final subsequences of corresponding chromosomes are shown here:
As is noted in the referenced article, dimensionreduction methods can now be used on such images, for the purpose of creating a “nearest image” lookup capability. This can be useful, say, for quick identification of the approximate biological family a given nucleotide sequence belongs to. More refined methods can then be brought to bear to obtain a full classification. (It is not known whether image lookup based on FCGR images is alone sufficient for full identification—to the best of my knowledge, it has not been attempted on large sets containing closer neighbor species than the six shown in this section). It perhaps should go without saying (but I’ll note anyway) that even without any processing, the Wolfram Language function Nearest will readily determine which images from the second set correspond to similar images from the first.
A key aspect to CGR is that it uses an alphabet of length four. This is responsible for a certain fractal effect in that blocks from each quadrant tend to be approximately repeated in nested subblocks in corresponding nested subquadrants. In order to obtain an alphabet of length four, it was convenient to use multiple digits from a power of four. Some experiments indicated that an alphabet of length 16 would work well. Since there are 26 characters in the English version of the Latin alphabet, as well as punctuation, numeric characters, white space and more, some amount of merging was done, with the general idea that “similar” characters could go into the same overall class. For example, we have one class comprised of {c,k,q,x,z}, another of {b,d,p} and so on. This brought the modified alphabet to 16 characters. Written in base 4, the 16 possibilities give all possible pairs of digits in base 4. The string of base 4 digits thus produced is then used to produce an image from text.
For relatively short texts, up to a few thousand characters, say, we simply create one image. Longer texts we break into chunks of some specified size (typically in the range of 2,000–10,000 characters) and make an image for each such chunk. Using ExampleData["Text"] from the Wolfram Language, we show the result for the first and last chunks from Alice in Wonderland and Pride and Prejudice, respectively:
While there is not so much for the human eye to discern between these pairs, machine learning does quite well in this area.
The paper with Stoean provides details for a methodology that has proven to be best from among variations we have tried. We use it to create onedimensional vectors from the twodimensional image arrays; use a common dimension reduction via the singularvalue decomposition to make the sizes manageable; and feed the training data, thus vectorized, into a simple neural network. The result is a classifier that can then be applied to images from text of unknown authorship.
While there are several moving parts, so to speak, the breadth of the Wolfram Language make this actually fairly straightforward. The main tools are indicated as follows:
1. Import to read in data.
2. StringDrop, StringReplace and similar string manipulation functions, used for removing initial sections (as they often contain identifying information) and to do other basic preprocessing.
3. Simple replacement rules to go from text to base 4 strings.
4. Simple code to implement FCGR, such as can be found in the Community forum.
5. Dimension reduction using SingularValueDecomposition. Code for this is straightforward, and one version can be found in “Linking Fourier and PCA Methods for Image Look‐Up.”
6. Machine learning functionality, at a fairly basic level (which is the limit of what I can handle). The functions I use are NetChain and NetTrain, and both work with a simple neural net.
7. Basic statistics functions such as Total, Sort and Tally are useful for assessing results.
Common practice in this area is to show results of a methodology on one or more sets of standard benchmarks. We used three such sets in the referenced paper. Two come from Reuters articles in the realm of corporate/industrial news. One is known as Reuters_50_50 (also called CCAT50). It has fifty authors represented, each with 50 articles for training and 50 for testing. Another is a subset of this, comprised of 50 training and 50 testing articles from ten of the fifty authors. One might think that using both sets entails a certain level of redundancy, but, perhaps surprisingly, past methods that perform very well on either of these tend not to do quite so well on the other. We also used a more recent set of articles, this time in Portuguese, from Brazilian newspapers. The only change to the methodology that this necessitated involved character substitutions to handle e.g. the “c‐with‐cedilla” character ç.
Results of this approach were quite strong. As best we could find in prior literature, scores equaled or exceeded past top scores on all three datasets. Since that time, we have applied the method to two other commonly used examples. One is a corpus comprised of IMDb reviews from 62 prolific reviewers. This time we were not the top performer, but came in close behind two other methods. Each was actually a “hybrid” comprised of weighted scores from some submethods. (Anecdotally, our method seems to make different mistakes from others, at least in examples we have investigated closely. This makes it a sound candidate for adoption in hybridized approaches.) As for the other new test, well, that takes us to the next section.
We now return to The Federalist Papers. The first step, of course, is to convert the text to images. We show a few here, created from first and last chunks from two essays. The ones on the top are from Federalist No. 33 (Hamilton) while those on the bottom are from Federalist No. 44 (Madison). Not surprisingly, they are not different in the obvious ways that the genome‐based images were different:
Before attempting to classify the disputed essays, it is important to ascertain that the methodology is sound. This requires a validation step. We proceeded as follows: We begin with those essays known to have been written by either Hamilton or Madison (we discard the three they coauthored, because there is not sufficient data therein to use). We hold back three entire essays from those written by Madison, and eight from the set by Hamilton (this is in approximate proportion to the relative number each penned). These withheld essays will be our first validation set. We also withhold the final chunk from each of the 54 essays that remain, to be used as a second validation set. (This two‐pronged validation appears to be more than is used elsewhere in the literature. We like to think we have been diligent.)
The results for the first validation set are perfect. Every one of the 70 chunks from the withheld essays are ascribed to their correct author. For the second set, two were erroneously ascribed. The scores for most chunks have the winner around four to seven times higher than the loser. For the two that were mistaken, these ratios dropped considerably, in one case to a factor of three and in the other to around 1.5. Overall, even with the two misses, these are extremely good results as compared to methods reported in past literature. I will remark that all processing, from importing the essays through classifying all chunks, takes less than half a minute on my desktop machine (with the bulk of that occupied in multiple training runs of the neural network classifier).
In order to avail ourselves of the full corpus of training data, we next merge the validation chunks into the training set and retrain. When we run the classifier on chunks from the disputed essays, things are mostly in accordance with prior conclusions. Except…
The first ten essays go strongly to Madison. Indeed, every chunk therein is ascribed to him. The last two go to Hamilton, albeit far less convincingly. A typical aggregated score for one of the convincing outcomes might be approximately 35:5 favoring Madison, whereas for the last two that go to Hamilton the scores are 34:16 and 42:27, respectively. A look at the chunk level suggests a perhaps more interesting interpretation. Essay 62, the next‐to‐last, has the fivechunk score pairs shown here (first is Hamilton’s score, then Madison’s):
Three are fairly strongly in favor of Hamilton as author (one of which could be classified as overwhelmingly so). The second and fourth are quite close, suggesting that despite the ability to do solid validation, these might be too close to call (or might be written by one and edited by the other).
The results from the final disputed essay are even more stark:
The first four chunks go strongly to Hamilton. The next two go strongly to Madison. The last also favors Madison, albeit weakly. This would suggest again a collaborative effort, with Hamilton writing the first part, Madison roughly a third and perhaps both working on the final paragraphs.
The reader will be reminded that this result comes from but one method. In its favor is that it performs extremely well on established benchmarks, and also in the validation step for the corpus at hand. On the counter side, many other approaches, over a span of decades, all point to a different outcome. That stated, we can mention that most (or perhaps all) prior work has not been at the level of chunks, and that granularity can give a better outcome in cases where different authors work on different sections. While these discrepancies with established consensus are of course not definitive, they might serve to prod new work on this very old topic. At the least, other methods might be deployed at the granularity of the chunk level we used (or similar, perhaps based on paragraphs), to see if parts of those essays 62 and 63 then show indications of Hamilton authorship.
To two daughters of Weehawken. My wonderful mother‐in‐law, Marie Wynne, was a library clerk during her working years. My cousin Sharon Perlman (1953–2016) was a physician and advocate for children, highly regarded by peers and patients in her field of pediatric nephrology. Her memory is a blessing.
]]>Take a look at some of the posts making Wolfram Community so popular. We’d love to see you posting your Wolfram technology–based projects too!
How does a neural network “see the world” if it has only been trained on beautiful images? Marco Thiel, a professor from the University of Aberdeen, UK, shows how easy it is to answer this notsoeasy question with the Wolfram Language. The diversity of models in the Wolfram Neural Net Repository and elegant architecture of the Wolfram Language across various domains makes this usually laborious project a breeze.
When processing natural language (as with automatic speech recognition), the generated text is often not punctuated. This can lead to problems during further analysis. Mengyi Shan, a Wolfram Summer School student, works with the Wolfram Language in training ten neural networks to recognize where commas and periods should appear. This post received attention from news outlets around the world.
In August 2018, an exceptionally strong storm caused a large suspension bridge in Genoa, Italy, to collapse, killing at least 43 people. Professor Marco Thiel comes back to explore a computational approach to understanding infrastructural issues, using Germany as an example. With just a few lines of Wolfram Language code, you can determine where unsafe bridges are grouped, the correlation between a bridge’s age and its safety level, and how much infrastructure spending has changed within a given period of time.
The ambiguous circle illusion left people with lots of questions. Erik Mahieu uses the Wolfram Language to create an educational analysis for 3Dprinted models that produces the illusion in the physical world. His demonstration walks you through the steps from the initial Manipulate to the finished, printed product.
It’s inspiring to see Wolfram artificial intelligence technology empowering realworld research on stem cells, such as at the Developmental Biology Institute of Marseille. Doctoral student Ali Hashmi shares his research advances and neural network design, and expresses appreciation for the Wolfram development team for the efficiency of the Wolfram machine learning framework.
Recently, a paper was published that discusses a fascinating hashing algorithm based on fluid mechanics, and that mentions that all calculations were carried out using the Wolfram Language. As no notebook supplement was given, Wolfram’s Michael Trott reproduced some of the computations from the paper. This post is of particular interest to fans of stunning graphics and captivating computational storytelling.
During the Wolfram High School Summer Camp, Paolo Lammens developed a tool to identify chord sequences in music to create a corresponding graph. This represents all unique chords as vertices and connects all pairs of chronologically subsequent chords with a directed edge. Using MIDI files, Paolo shows every step of the visualization process.
If you haven’t yet signed up to be a member of Wolfram Community, please do so! You can join in on similar discussions, post your own work in groups of your interest and browse the complete list of Staff Picks.
]]>In past blog posts, we’ve talked about the Wolfram Language’s builtin, highlevel functionality for 3D printing. Today we’re excited to share an example of how some more general functionality in the language is being used to push the boundaries of this technology. Specifically, we’ll look at how computation enables 3D printing of very intricate sugar structures, which can be used to artificially create physiological channel networks like blood vessels.
Let’s think about how 3D printing takes a virtual design and brings it into the physical world. You start with some digital or analytical representation of a 3D volume. Then you slice it into discrete layers, and approximate the volume within each layer in a way that maps to a physical printing process. For example, some processes use a digital light projector to selectively polymerize material. Because the projector is a 2D array of pixels that are either on or off, each slice is represented by a binary bitmap. For other processes, each layer is drawn by a nozzle or a laser, so each slice is represented by a vector image, typically with a fixed line width.
In each case, the volume is represented as a stack of images, which, again, is usually an approximation of the desired design. Greater fidelity can be achieved by increasing the resolution of the printer—that is, the smallest pixel or thinnest line it can create. However, there is a practical limit, and sometimes a physical limit to the resolution. For example, in digital light projection a pixel cannot be made much smaller than the wavelength of the light used. Therefore, for some kinds of designs, it’s actually easier to achieve higher fidelity by modifying the process itself. Suppose, for example, you want to make a connected network of cylindrical rods with arbitrary orientation (there is a good reason to do this—we’ll get to that). Any process based on layers or pixels will produce some approximation of the cylinders. You might instead devise a process that is better suited to making this shape.
One type of 3D printing, termed fused deposition modeling, deposits material through a cylindrical nozzle. This is usually done layer by layer, but it doesn’t have to be. If the nozzle is translated in 3D, and the material can be made to stiffen very quickly upon exiting, then you have an elegant way of making arbitrarily oriented cylinders. If you can get new cylinders to stick to existing cylinders, then you can make very interesting things indeed. This nonplanar deposition process is called directwrite assembly, wireframe printing or freeform 3D printing.
Things that you would make using freeform 3D printing are best represented not as solid volumes, but as structural frames. The data structure is actually a graph, where the nodes of the graph are the joints, and the edges of the graph are the beams in the frame. In the following image, you’ll see the conversion of a model to a graph object. Directed edges indicate the corresponding beam can only be drawn in one direction. An interesting computational question is, given such a frame, how do you print it? More precisely, given a machine that can “draw” 3D beams, what sequence of operations do you command the machine to perform?
First, we can distinguish between motions where we are drawing a beam and motions where we are moving the nozzle without drawing a beam. For most designs, it will be necessary to sometimes move the nozzle without drawing a beam. In this discussion, we won’t think too hard about these nonprinting motions. They take time, but, at least in this example, the time it takes to print is not nearly as important as whether the print actually succeeds or fails catastrophically.
We can further define the problem as follows. We have a set of beams to be printed, and each beam is defined by two joints, . Give a sequence of beams and a printing direction for each beam (i.e. ) that is consistent with the following constraints:
1) Directionality: for each beam, we need to choose a direction so that the nozzle doesn’t collide with that beam as it’s printed.
2) Collision: we have to make sure that as we print each beam, we don’t hit a previously printed beam with the nozzle.
3) Connection: we have to start each beam from a physical surface, whether that be the printing substrate or an existing joint.
Let’s pause there for a moment. If these are the only three constraints, and there are only three axes of motion, then finding a sequence that is consistent with the constraints is straightforward. To determine whether printing beam B would cause a collision with beam A, we first generate a volume by sweeping the nozzle shape along the path coincident with beam B to form the 3D region . If RegionDisjoint[R, A] is False, then printing beam B would cause a collision with beam A. This means that beam A has to be printed first.
Here’s an example from the RegionDisjoint reference page to help illustrate this. Red walls collide with the cow and green walls do not:
✕
cow=ExampleData[{\"Geometry3D\",\"Cow\"},\"MeshRegion\"]; 
✕
w1=Hyperplane[{1,0,0},0.39]; w2=Hyperplane[{1,0,0},0.45]; 
✕
wallColor[reg_,wall_]:=If[RegionDisjoint[reg,wall],Green,Red] 
✕
Show[cow,Graphics3D[{{wallColor[cow,w1],w1},{wallColor[cow,w2],w2}}],PlotRangePadding>.04] 
Mimicking the logic from this example, we can make a function that takes a swept nozzle and finds the beams that it collides with. Following is a Wolfram Language command that visualizes nozzlebeam collisions. The red beams must be drawn after the green one to avoid contact with the blue nozzle as it draws the green beam:
✕
HighlightNozzleCollisions[,{{28,0,10},{23,0,10}}] 
For a printer with three axes of motion, it isn’t particularly difficult to compute collision constraints between all the pairs of beams. We can actually represent the constraints as a directed graph, with the nodes representing the beams, or as an adjacency matrix, where a 1 in element (, ) indicates that beam must precede beam . Here’s the collision matrix for the bridge:
A feasible sequence exists, provided this precedence graph is acyclic. At first glance, it may seem that a topological sort will give such a feasible sequence; however, this does not take the connection constraint into consideration, and therefore nonanchored beams might be sequenced. Somewhat surprisingly, TopologicalSort can often yield a sequence with very few connection violations. For example, in the topological sort, only the 12th and 13th beams violate the connection constraint:
✕
ordering=TopologicalSort[AdjacencyGraph[SparseArray[Specified elements: 2832 Dimensions: {135,135}]]] 
Instead, to consider all three aforementioned constraints, you can build a sequence in the following greedy manner. At each step, print any beam such that: (a) the beam can be printed starting from either the substrate or an existing joint; and (b) all of the beam’s predecessors have already been printed. There’s actually a clever way to speed this up: go backward. Instead of starting at the beginning, with no beams printed, figure out the last beam you’d print. Remove that last beam, then repeat the process. You don’t have to compute collision constraints for a beam that’s been removed. Keep going until all the beams are gone, then just print in the reverse removal order. This can save a lot of time, because this way you never have to worry about whether printing one beam will make it impossible to print a later beam due to collision. For a threeaxis printer this isn’t a big deal, but for a four or fiveaxis robot arm it is.
So the assembly problem under collision, connection and directionality constraints isn’t that hard. However, for printing processes where the material is melted and solidifies by cooling, there is an additional constraint. This is shown in the following video:
See what happened? The nozzle is hot, and it melts the existing joint. Some degree of melting is unfortunately necessary to fuse new beams to existing joints. We could add scaffolding or try to find some physical solution, but we can circumvent it in many cases by computation alone. Specifically, we can find a sequence that is not only consistent with collision, connection and directionality constraints, but that also never requires a joint to simultaneously support two cantilevered beams. Obviously some things, like the tree we tried to print previously, are impossible to print under this constraint. However, it turns out that some very intimidatinglooking designs are in fact feasible.
We approach the problem by considering the assembly states. A state is just the set of beams that has been assembled, and contains no information about the order in which they were assembled. Our goal is to find a path from the start state to the end state. Because adjacent states differ by the presence of a single beam, each path corresponds to a unique assembly sequence. For small designs, we can actually generate the whole graph. However, for large designs, exhaustively enumerating the states would take forever. For illustrative purposes, here’s a structure where the full assembly state is small enough to enumerate. Note that some states are unreachable or are a dead end:
Note that, whether you start at the beginning and go forward or start at the end and work backward, you can find yourself in a dead end. These dead ends are labeled G and H in the figure. There might be any number of dead ends, and you may have to visit all of them before you find a sequence that works. You might never find a sequence that works! This problem is actually NP complete—that is, you can’t know if there is a feasible sequence without potentially trying all of them. The addition of the cantilever constraint is what makes the problem hard. You can’t say for sure if printing a beam is going to make it impossible to assemble another beam later. What’s more, going backward doesn’t solve that problem: you can’t say for sure if removing a beam is going to make it impossible to remove a beam later due to the cantilever constraint.
The key word there is “potentially.” Usually you can find a sequence without trying everything. The algorithm we developed searches the assembly graph for states that don’t contain cantilevers. If you get to one of these states, it doesn’t mean a full sequence exists. However, it does mean that if a sequence exists, you can find one without backtracking past this particular cantileverfree state. This essentially divides the problem into a series of much smaller NPcomplete graph search problems. Except in contrived cases, these can be solved quickly, enabling construction of very intricate models:
✕FindFreeformPath[,Monitor>Full]

So that mostly solves the problem. However, further complicating matters is that these slender beams are about as strong as you might expect. Gravity can deform the construct, but there is actually a much larger force attributable to the flow of material out of the nozzle. This force can produce catastrophic failure, such as the instability shown here:
However, it turns out that intelligent sequencing can solve this problem as well. Using models developed for civil engineering, it is possible to compute at every potential step the probability that you’re going to break your design. The problem then becomes not one of finding the shortest path to the goal, but of finding the safest path to the goal. This step requires inversion of large matrices and is computationally intensive, but with the Wolfram Language’s fast builtin solvers, it becomes feasible to perform this process hundreds of thousands of times in order to find an optimal sequence.
So that’s the how. The next question is, “Why?” Well, the problem is simple enough. Multicellular organisms require a lot of energy. This energy can only be supplied by aerobic respiration, a fancy term for a cascade of chemical reactions. These reactions use oxygen to produce the energy required to power all higher forms of life. Nature has devised an ingenious solution: a complex plumbing system and an indefatigable pump delivering oxygenrich blood to all of your body’s cells, 24/7. If your heart doesn’t beat at least once every couple seconds, your brain doesn’t receive enough oxygenrich blood to maintain consciousness.
We don’t really understand superhighlevel biological phenomena like consciousness. We can’t, as far as we can tell, engineer a conscious array of cells, or even of transistors. But we understand pretty well the plumbing that supports consciousness. And it may be that if we can make the plumbing and deliver oxygen to a sufficiently thick slab of cells, we will see some emergent phenomena. A conscious brain is a long shot, a functional piece of liver or kidney decidedly less so. Even a small piece of vascularized breast or prostate tissue would be enormously useful for understanding how tumors metastasize.
The problem is, making the plumbing is hard. Cells in a dish do selforganize to an extent, but we don't understand such systems well enough to tell a bunch of cells to grow into a brain. Plus, as noted, growing a brain sort of requires attaching it to a heart. Perhaps if we understand the rules that govern the generation of biological forms, we can generate them at will. We know that with some simple mathematical rules, one can generate very complex, interesting structures—the stripes on a zebra, the venation of a leaf. But going backward, reverseengineering the rule from the form, is hard, to say the least. We have mastered the genome and can program single cells, but we are novices at best when it comes to predicting or programming the behavior of cellular ensembles.
An alternative means of generating biological forms like vasculature is a bit cruder—just draw the form you want, then physically place all the cells and the plumbing according to your blueprint. This is bioprinting. Bioprinting is exciting because it reduces the generation of biological forms into a set of engineering problems. How do we make a robot put all these cells in the right place? These days, any sentence that starts with “How do we make a robot...” probably has an answer. In this case, however, the problem is complicated by the fact that, while the robot or printer is working, the cells that have already been assembled are slowly dying. For really big, complex tissues, either you need to supply oxygen to the tissue as you assemble it or you need to assemble it really fast.
One approach of the really fast variety was demonstrated in 2009. Researchers at Cornell used a cotton candy machine to meltspin a pile of sugar fibers. They cast the sugar fibers in a polymer, dissolved them out with water and made a vascular network in minutes, albeit with little control over the geometry. A few years later, researchers at University of Pennsylvania used a hacked desktop 3D printer to draw molten sugar fibers into a lattice and show that the vascular casting approach was compatible with a variety of cellladen gels. This was more precise, but not quite freeform. The next step, undertaken in a collaboration between researchers at the University of Illinois at Urbana–Champaign and Wolfram Research, was to overcome the physical and computational barriers to making really complex designs—in other words, to take sugar printing and make it truly freeform.
We’ve described the computational aspects of freeform 3D printing in the first half of this post. The physical side is important too.
First, you need to make a choice of material. Prior work has used glucose or sucrose—things that are known to be compatible with cells. The problem with these materials is twofold: One, they tend to burn. Two, they tend to crystallize while you’re trying to print. If you’ve ever left a jar of honey or maple syrup out for a long time, you can see crystallization in action. Crystals will clog your nozzle, and your print will fail. Instead of conventional sugars, this printer uses isomalt, a lowcalorie sugar substitute. Isomalt is less prone to burning or crystallizing than other sugarlike materials, and it turns out that cells are just as OK with isomalt as they are with real sugar.
Next, you need to heat the isomalt and push it out of a tiny nozzle under high pressure. You have to draw pretty slowly—the nozzle moves about half a millimeter per second—but the filament that is formed coincides almost exactly with the path taken by the nozzle. Right now it’s possible to be anywhere from 50 to 500 micrometers, a very nice range for blood vessels.
So the problems of turning a design into a set of printer instructions, and of having a printer that is sufficiently precise to execute them, are more or less solved. This doesn’t mean that 3Dprinted organs are just around the corner. There are still problems to be solved in introducing cells in and around these vascular molds. Depending on the ability of the cells to selforganize, dumping them around the mold or flowing them through the finished channels might not be good enough. In order to guide development of the cellular ensemble into a functional tissue, more precise patterning may be required from the outset; direct cell printing would be one way to do this. However, our understanding of selforganizing systems increases every day. For example, last year researchers reproduced the first week of mouse embryonic development in a petri dish. This shows that in the right environment, with the right mix of chemical signals, cells will do a lot of the work for us. Vascular networks deliver oxygen, but they can also deliver things like drugs and hormones, which can be used to poke and prod the development of cells. In this way, bioprinting might enable not just spatial but also temporal control of the cells’ environment. It may be that we use the vascular network itself to guide the development of the tissue deposited around it. Cardiologists shouldn’t expect a 3Dprinted heart for their next patients, but scientists might reasonably ask for a 3Dprinted sugar scaffold for their next experiments.
So to summarize, isomalt printing offers a route to making interesting physiological structures. Making it work requires a certain amount of mechanical and materials engineering, as one might expect, but also a surprising amount of computational engineering. The Wolfram Language provides a powerful tool for working with geometry and physical models, making it possible to extend freeform bioprinting to arbitrarily large and complex designs.
To learn more about our work, check out our papers: a preprint regarding the algorithm (to appear in IEEE Transactions on Automation Science and Engineering), and another preprint regarding the printer itself (published in Additive Manufacturing).
This work was performed in the Chemical Imaging and Structures Laboratory under the principal investigator Rohit Bhargava at the University of Illinois at Urbana–Champaign.
Matt Gelber was supported by fellowships from the Roy J. Carver Charitable Trust and the Arnold and Mabel Beckman Foundation. We gratefully acknowledge the gift of isomalt and advice on its processing provided by Oliver Luhn of Südzucker AG/BENEOPalatinit GmbH. The development of the printer was supported by the Beckman Institute for Advanced Science and Technology via its seed grant program.
We also would like to acknowledge Travis Ross of the Beckman Institute Visualization Laboratory for help with macrophotography of the printed constructs. We also thank the contributors of the CAD files on which we based our designs: GrabCAD user M. G. Fouché, 3D Warehouse user Damo and Bibliocas user limazkan (Javier Mdz). Finally, we acknowledge Seth Kenkel for valuable feedback throughout this project.
Today I am proud to announce a free interactive course, Introduction to Calculus, hosted on Wolfram’s learning hub, Wolfram U! The course is designed to give a comprehensive introduction to fundamental concepts in calculus such as limits, derivatives and integrals. It includes 38 video lessons along with interactive notebooks that offer examples in the Wolfram Cloud—all for free. This is the second of Wolfram U’s fully interactive free online courses, powered by our cloud and notebook technology.
This introduction to the profound ideas that underlie calculus will help students and learners of all ages anywhere in the world to master the subject. While the course requires no prior knowledge of the Wolfram Language, the concepts illustrated by the language are geared toward easy reader comprehension due to its humanreadable nature. Studying calculus through this course is a good way for highschool students to prepare for AP Calculus AB.
As a former classroom teacher with more than ten years of experience in teaching calculus, I was very excited to have the opportunity to develop this course. My philosophy in teaching calculus is to introduce the basic concepts in a geometrical and intuitive way, and then focus on solving problems that illustrate the applications of these concepts in physics, economics and other fields. The Wolfram Language is ideally suited for this approach, since it has excellent capabilities for graphing functions, as well as for all types of computation.
To create this course, I worked alongside John Clark, a brilliant young mathematician who did his undergraduate studies at Caltech and produced the superb notebooks that constitute the text for the course.
The heart of the course is a set of 38 lessons, beginning with “What is Calculus?”. This introductory lesson includes a discussion of the problems that motivated the early development of calculus, a brief history of the subject and an outline of the course. The following is a short excerpt from the video for this lesson.
Further lessons begin with an overview of the topic (for example, optimization), followed by a discussion of the main concepts and a few examples that illustrate the ideas using Wolfram Language functions for symbolic computation, visualization and dynamic interactivity.
The videos range from 8 to 17 minutes in length, and each video is accompanied by a transcript notebook displayed on the righthand side of the screen. You can copy and paste Wolfram Language input directly from the transcript notebook to the scratch notebook to try the examples for yourself. If you want to pursue any topic in greater depth, the full text notebooks prepared by John Clark are also provided for further selfstudy. In this way, the course allows for a variety of learning styles, and I recommend that you combine the different resources (videos, transcripts and full text) for the best results.
Each lesson is accompanied by a small set of (usually five) exercises to reinforce the concepts covered during the lesson. Since this course is designed for independent study, a detailed solution is given for all exercises. In my experience, such solutions often serve as models when students try to write their own for similar problems.
The following shows an exercise from the lesson on volumes of solids:
Like the rest of the course, the notebooks with the exercises are interactive, so students can try variations of each problem in the Wolfram Cloud, and also rotate graphics such as the bowl in the problem shown (in order to view it from all angles).
The calculus course includes 10 problem sessions that are designed to review, clarify and extend the concepts covered during the previous lessons. There is one session at the end of every 3 or 4 lessons, and each session includes around 14 problems.
As in the case of exercises, complete solutions are presented for each problem. Since the Wolfram Language automates the algebraic and numerical calculations, and instantly produces illuminating plots, problems are discussed in rapid succession during the video presentations. The following is an excerpt of the video for Problem Session 1: Limits and Functions:
The problem sessions are similar in spirit to the recitations in a typical college calculus course, and allow the student to focus on applying the facts learned in the lessons.
Each problem session is followed by a short, multiplechoice quiz with five problems. The quiz problems are roughly at the same level as those discussed in the lessons and problem sessions, and a student who reviews this material carefully should have no difficulty in doing well on the quiz.
Students will receive instant feedback about their responses to the quiz questions, and they are encouraged to try any method (hand calculations or computer) to solve them.
The final two sections of the course are devoted to a discussion of sample problems based on the AP Calculus AB exam. The problems increase in difficulty as the sample exam progresses, and some of them require a careful application of algebraic techniques. Complete solutions are provided for each exam problem, and the text for the solutions often includes the steps for hand calculation. The following is an excerpt of the video for part one of the sample calculus exam:
The sample exam serves as a final review of the course, and will also help students to gain confidence in tackling the AP exam or similar exams for calculus courses at the highschool or college level.
I strongly urge students to watch all the lessons and problem sessions and attempt the quizzes in the recommended sequence, since each topic in the course builds on earlier concepts and techniques. You can request a certificate of completion, pictured here, at the end of the course. A course certificate is achieved after watching all the videos and passing all the quizzes. It represents real proficiency in the subject, and teachers and students will find this a useful resource to signify readiness for the AP Calculus AB exam:
The mastery of the fundamental concepts of calculus is a major milestone in a student’s academic career. I hope that Introduction to Calculus will help you to achieve this milestone. I have enjoyed teaching the course, and welcome any comments regarding the current content as well suggestions for the future.
]]>