<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel rdf:about="https://community.wolfram.com">
    <title>Community RSS Feed</title>
    <link>https://community.wolfram.com</link>
    <description>RSS Feed for Wolfram Community showing ideas tagged with Packages sorted by most likes.</description>
    <items>
      <rdf:Seq>
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/1931315" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/560469" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/2445356" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/3062832" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/1170226" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/963158" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/3062403" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/849709" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/1311342" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/2864162" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/2330900" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/787142" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/2328597" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/762950" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/3467978" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/1646303" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/1273720" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/1421180" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/866748" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/2434669" />
      </rdf:Seq>
    </items>
  </channel>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/1931315">
    <title>CodeParser and CodeInspector</title>
    <link>https://community.wolfram.com/groups/-/m/t/1931315</link>
    <description>[![enter image description here][2]][1]&#xD;
&#xD;
&amp;amp;[Wolfram Notebook][3]&#xD;
&#xD;
  [1]: https://youtu.be/rOa5IntICFA&#xD;
  [2]: https://community.wolfram.com//c/portal/getImageAttachment?filename=ScreenShot2020-04-09at12.54.33PM.png&amp;amp;userId=11733&#xD;
  [3]: https://www.wolframcloud.com/obj/afe2a2fb-ee55-4df5-a6fb-9bc16dd08af7</description>
    <dc:creator>Brenton Bostick</dc:creator>
    <dc:date>2020-04-09T15:04:38Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/560469">
    <title>IGraph/M: graph theory and network analysis with Mathematica</title>
    <link>https://community.wolfram.com/groups/-/m/t/560469</link>
    <description>*WOLFRAM MATERIALS for the ARTICLE:*&#xD;
&amp;gt; Szabolcs Horvát, Jakub Podkalicki, Gábor Csárdi, Tamás Nepusz, Vincent Traag, Fabio Zanini, Daniel Noom, (2022).&#xD;
&#xD;
&amp;gt; *IGraph/M: graph theory and network analysis for Mathematica*.&#xD;
&#xD;
&amp;gt; arXiv:2209.09145 **[physics.soc-ph]**.&#xD;
&#xD;
&amp;gt; https://doi.org/10.48550/arXiv.2209.09145&#xD;
&#xD;
&#xD;
[![Discourse topics](https://img.shields.io/discourse/topics?color=limegreen&amp;amp;server=https%3A%2F%2Figraph.discourse.group)](https://igraph.discourse.group)&#xD;
[![GitHub (pre-)release](https://img.shields.io/github/release/szhorvat/IGraphM/all.svg)](https://github.com/szhorvat/IGraphM/releases)&#xD;
[![Contributions welcome](https://img.shields.io/badge/contributions-welcome-brightgreen.svg)](https://github.com/szhorvat/IGraphM#contributions)&#xD;
[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.1134932.svg)](https://doi.org/10.5281/zenodo.1134932)&#xD;
&#xD;
----&#xD;
&#xD;
##Article abstract&#xD;
&#xD;
IGraph/M is an efficient general purpose graph theory and network analysis package for Mathematica. IGraph/M serves as the Wolfram Language interfaces to the igraph C library, and also provides several unique pieces of functionality not yet present in igraph, but made possible by combining its capabilities with Mathematica&amp;#039;s. The package is designed to support both graph theoretical research as well as the analysis of large-scale empirical networks.&#xD;
&#xD;
----&#xD;
&#xD;
##Introduction&#xD;
&#xD;
The post below was written for the original release of IGraph/M. The package has come a long way since then and now contains ~300 functions. See http://szhorvat.net/mathematica/IGraphM for more details on the current release.&#xD;
&#xD;
Compatibility: 64-it Windows/macOS/Linux or Raspberry Pi; Mathematica &amp;lt;del&amp;gt;10.0&amp;lt;/del&amp;gt; 11.0 or later.&#xD;
&#xD;
&amp;lt;a href=&amp;#034;http://szhorvat.net/mathematica/IGraphM&amp;#034;&amp;gt;&amp;lt;img src=&amp;#034;https://community.wolfram.com//c/portal/getImageAttachment?filename=IGraphM-ad-3.png&amp;amp;userId=38370&amp;#034; width=&amp;#034;300&amp;#034;&amp;gt;&amp;lt;/a&amp;gt;&#xD;
&#xD;
----&#xD;
&#xD;
I would like to announce IGraph/M, a new igraph interface for Mathematica: http://szhorvat.net/mathematica/IGraphM&#xD;
&#xD;
[igraph](http://igraph.org/) is a graph manipulation and analysis package.  IGraph/M makes its functionality available from Mathematica.&#xD;
&#xD;
This initial release, version 0.1, covers only some igraph functions, as I focused on the things that I need personally.  However the main framework is complete, and new functions can be added quickly.  If anyone would like to contribute, please contact me.&#xD;
&#xD;
Binary packages for OS X (10.9 or later) and Linux can be downloaded [from GitHub](https://github.com/szhorvat/IGraphM/releases).  Unfortunately, I was unable to compile the development version of igraph for Windows, so I cannot provide a Windows version. If you can help with compiling igraph itself (not IGraph/M) on Windows, please let me know!&#xD;
&#xD;
Functionality in this release that is not built into Mathematica:&#xD;
&#xD;
 * Vertex betweenness centrality for weighted graphs&#xD;
 * Estimates of vertex betweenness, edge betweenness and closeness centrality; for large graphs&#xD;
 * Minimum feedback arc set for weighted and unweighted graphs&#xD;
 * Find all cliques (not just maximal ones)&#xD;
 * Count 3- and 4-motifs&#xD;
 * Rewire edges, keeping either the density or the degree sequence&#xD;
 * Alternative algorithms for isomorphism testing: Bliss, VF2&#xD;
 * Subgraph isomorphism&#xD;
 * Test if a degree sequence is graphical&#xD;
 * Alternative algorithms for generating random graphs with given degree sequence&#xD;
 * Layout algorithms that take weights into account&#xD;
&#xD;
Note that IGraph/M is *not a replacement* for Mathematica&amp;#039;s graphs and networks functionality.  It is meant to complement what is already available in Mathematica, thus it primarily focuses on adding functionality that is not already present.&#xD;
&#xD;
Why did I release the package before covering most of the igraph functionality?  I do not have time to work on things I do not personally need or use, so I am unlikely to extend it further unless the need comes up.  I do think that the functions that are included in v0.1 can already be useful to others too.  I would also like to give the opportunity for people to contribute to the project if they wish to.  The groundwork has been laid, so further extensions should be quick and relatively easy.&#xD;
&#xD;
Also check out a related project, [IGraphR](https://github.com/szhorvat/IGraphR), which makes igraph available for Mathematica users through RLink.  I wrote IGraph/M because I needed higher performance and greater reliability (especially for parallel computing) than what RLink could provide.&#xD;
&#xD;
----&#xD;
&#xD;
**A request:** If any of you have used IGraphR in the past to access igraph from Mathematica, please post a response to this thread and let me know which specific functions you were using.&#xD;
&#xD;
&amp;amp;[Wolfram Notebook][1]&#xD;
&#xD;
&#xD;
  [1]: https://www.wolframcloud.com/obj/94639221-60b4-47e3-8862-d996caa40388</description>
    <dc:creator>Szabolcs Horvát</dc:creator>
    <dc:date>2015-09-06T12:55:14Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/2445356">
    <title>A Wolfram Language facsimile of Wordle</title>
    <link>https://community.wolfram.com/groups/-/m/t/2445356</link>
    <description>![enter image description here][1]&#xD;
&#xD;
The popular game Wordle can take up a lot of your time.  The author designed it so that it you can only play it once a day, thus saving us from ourselves :-).&#xD;
&#xD;
[Wordle][2]&#xD;
&#xD;
[NYTimes article on Wordle][3]&#xD;
&#xD;
But I couldn&amp;#039;t resist the challenge to create a version of it in Mathematica, just for fun and because I was bored this past weekend. &#xD;
&#xD;
See the attached notebook and enjoy.  Alas, since you can run it any number of times you are only to blame for yourself it you spend too much time on it. &#xD;
&#xD;
After executing the notebook just execute &#xD;
&#xD;
    MWordle[Deploy]&#xD;
&#xD;
to bring up the game.&#xD;
&#xD;
A few additional comments.  The notebook MWordle.nb has the option&#xD;
&#xD;
AutoGeneratedPackage -&amp;gt; Automatic&#xD;
&#xD;
which causes it, when saved, to create an MWordle.m package file in its same directory. &#xD;
&#xD;
The code in MWordle.nb is set up as a package with the context MWordle`Mwordle`&#xD;
&#xD;
If you want to set things up so that the package gets loaded and the MWordle game is automatically launched, do the following.&#xD;
&#xD;
Create a directory MWordleGame on your disk  (The name MWordleGame can actually be whatever you wish.)  And in the MWordleGame directory create a new directory called MWordle.  (This name must be exactly that so that the MWordle`Mwordle` Context is property respected.)  Put the MWordle.nb notebook in the MWordle dierectory, open it in Mathematica and save it so that the MWordle.m file is created in the MWordle directory.  Then you can close the MWordle.nb notebook.&#xD;
&#xD;
Now in your MWordleGame directory save a new notebook -- you can call it whatever you wish, but something like LaunchMwordle.nb is a sensible choice.&#xD;
&#xD;
In that notebook create a button with the following command:&#xD;
&#xD;
&#xD;
    CellPrint[TextCell[Button[&amp;#034;Launch MWordle&amp;#034;,&#xD;
       Monitor[&#xD;
        If[! MemberQ[$Path, NotebookDirectory[]], &#xD;
         AppendTo[$Path, NotebookDirectory[]]];&#xD;
        Needs[&amp;#034;MWordle`MWordle`&amp;#034;]; MWordle`MWordle`MWordle[Deploy],&#xD;
        Row[{ProgressIndicator[Appearance -&amp;gt; &amp;#034;Necklace&amp;#034;, &#xD;
           ImageSize -&amp;gt; Small], Spacer[5], &#xD;
          Style[&amp;#034;Launching MWordle...&amp;#034;, 12, Blue, &#xD;
           FontFamily -&amp;gt; &amp;#034;Arial&amp;#034;]}]],&#xD;
       Method -&amp;gt; &amp;#034;Queued&amp;#034;], &amp;#034;Text&amp;#034;, GeneratedCell -&amp;gt; False, &#xD;
      CellAutoOverwrite -&amp;gt; False]]&#xD;
&#xD;
You now have a button in your LaunchMwordle.nb notebook which you can use any time you want to launch MWordle without having to execute the cells in the MWordle.nb notebook.&#xD;
&#xD;
Download the actual notebook from the link at the end of this post. The following is a version here to read.&#xD;
&#xD;
&amp;amp;[Wolfram Notebook][4]&#xD;
&#xD;
&#xD;
  [1]: https://community.wolfram.com//c/portal/getImageAttachment?filename=Wordle.gif&amp;amp;userId=20103&#xD;
  [2]: https://www.powerlanguage.co.uk/wordle/&#xD;
  [3]: https://www.nytimes.com/2022/01/03/technology/wordle-word-game-creator.html&#xD;
  [4]: https://www.wolframcloud.com/obj/08c015e2-0d65-4634-bf54-4b73e518f6d5</description>
    <dc:creator>David Reiss</dc:creator>
    <dc:date>2022-01-13T21:47:44Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/3062832">
    <title>The Telephone Game - next level with GPT</title>
    <link>https://community.wolfram.com/groups/-/m/t/3062832</link>
    <description>![enter image description here][1]&#xD;
&#xD;
&amp;amp;[Wolfram Notebook][2]&#xD;
&#xD;
&#xD;
  [1]: https://community.wolfram.com//c/portal/getImageAttachment?filename=w5qgsdf.jpg&amp;amp;userId=11733&#xD;
  [2]: https://www.wolframcloud.com/obj/04458d24-aacf-4cd7-8a5d-46efde37e927</description>
    <dc:creator>Marco Thiel</dc:creator>
    <dc:date>2023-11-09T22:51:38Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/1170226">
    <title>Package development: How to spend less time creating a polished interface?</title>
    <link>https://community.wolfram.com/groups/-/m/t/1170226</link>
    <description>One of the great things about Mathematica is that it makes it so easy to do so much in so little code.  It is partly because of this that I am so frustrated with the amount of time I need to spend developing the *interface* of package functions compared to their *functionality*.&#xD;
&#xD;
Suppose you wrote a Wolfram Language function that does something useful and interesting.  Now you want to wrap it up into a package, and make it usable by everyone.  A polished package is expected to have functions that:&#xD;
&#xD;
 - Will check their input for errors&#xD;
 - Will report errors in an informative way&#xD;
 - Will use messages appropriately (i.e. associate them with the correct symbol name)&#xD;
 - Will adhere to the de-facto Mathematica interface conventions: proper use of optional arguments, options, option inheritance (as in Graphics -&amp;gt; Plot), default option value handling, use of `Automatic`, etc.&#xD;
 - Have SyntaxInformation&#xD;
&#xD;
I find that not infrequently I spend more time on making the function user-friendly than developing its functionality.&#xD;
&#xD;
**How do people generally deal with this task?  How do you implement error checking and reporting in your packages?**&#xD;
&#xD;
To give an example, take a function as simple a moving average calculator.  It is really easy to implement:&#xD;
&#xD;
    movingAverage[vec_, n_] := Mean /@ Partition[vec, n, 1]&#xD;
&#xD;
But to bring it to the quality of the built-in `MovingAverage`, it should at least:&#xD;
&#xD;
 - check the number of arguments (precisely 2)&#xD;
 - check the types of arguments (a list and an integer)&#xD;
 - check the values of arguments for correctness (non-empty list and positive integer)&#xD;
 - make sure that all these checks don&amp;#039;t introduce severe performance degradation (such as array unpacking, which can even be triggered by an inefficient argument pattern)&#xD;
&#xD;
This also involves the introduction of multiple messages (for each type of error) associated to `movingAverage`. If we now want to add a `movingMedian`, we will find that we will mostly need to carry out the same checks and report the same messages. There will be small differences though, e.g. average calculations are feasible for symbolic lists like `{1,x}`, but not median calculations.  So the checks won&amp;#039;t quite be identical.  The messages will be mostly identical, but each function must associate messages to its own symbol, which means a lot of duplication.&#xD;
&#xD;
So if we care about a high-quality interface and high-quality error reporting, we will end up writing considerably more code for this than for the function&amp;#039;s core task. We will also end up with a lot of code duplication, which is frustrating and a maintenance burden.  The whole thing ends up being a lot of work and not a lot of fun (which is not very Mathematica-like :-) )&#xD;
&#xD;
Are there good ways to simplify these tasks?  Option handling also used to be error-prone and frustrating, but the introduction of `OptionsPattern[]` and `OptionValue[]` made it much easier.&#xD;
&#xD;
----&#xD;
&#xD;
I can see that there are some built-in tool to ease these tasks, though they are mostly undocumented.  One example is `ArgumentCountQ`, another is ``Developer`CheckArgumentCount``, or some tools in ``GeneralUtilities` ``.  I would love to hear from others about how they deal with the tasks I described, which such internal functions they make use of, etc.</description>
    <dc:creator>Szabolcs Horvát</dc:creator>
    <dc:date>2017-08-25T11:15:29Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/963158">
    <title>Draw: vector drawing &amp;amp; technical illustration application</title>
    <link>https://community.wolfram.com/groups/-/m/t/963158</link>
    <description>Recently John Fultz [announced][1] GitLink as open source on GitHub. He also mentioned the desire to offer more Wolfram related open source to the community. Draw was not mentioned by John but readers of his post followed the GitHub [link][2] and discovered the Draw repository. Naturally questions followed so here we are with an introduction of Draw, the latest open source contribution to the community.&#xD;
&#xD;
Draw is a vector drawing application. Many of the technical illustrations found in the Wolfram Language documentation were created using it. The release of Draw is to promote the advantages of using the Wolfram Language for software development.&#xD;
&#xD;
Draw was a personal project that grew from an idea to develop a simple tool to automate the drawing of flowcharts. This simple tool expanded in response to the need of functionality for solving specific challenges required by various illustrations. The Wolfram Language was very instrumental in helping Draw evolve during this process.&#xD;
&#xD;
Some of the more prominent features of Draw include:&#xD;
&#xD;
 - Orthographic 3D drawing&#xD;
 - Circuit, Mechanical and 3D library presets&#xD;
 - Adjustable shapes such as gears or spirals&#xD;
 - Shape arrays&#xD;
 - Image autotrace&#xD;
&#xD;
The gallery of examples below demonstrate the capabilities of Draw:&#xD;
&#xD;
![gallery][3]&#xD;
&#xD;
A look inside the application reveals an interface divided into four distinct sections:&#xD;
&#xD;
![interface sections][4]&#xD;
&#xD;
An example of Draw being used to work on a flowchart:&#xD;
&#xD;
![interface][5]&#xD;
&#xD;
The Circuit, Mechanical and 3D libraries:&#xD;
&#xD;
![libraries][6]&#xD;
&#xD;
The adjustable gear shape:&#xD;
&#xD;
![gear][7]&#xD;
&#xD;
The shape array:&#xD;
&#xD;
![shape array][8]&#xD;
&#xD;
Hope this brief introduction is enough to inspire you to download the Draw notebook from [this GitHub link][9]. Start creating illustrations or explore the Wolfram Language code to discover how the application works. Support is available by clicking the blue help button for topics such as the basics, features, interaction, tools, examples and tips. Tooltips appear for all buttons detailing their behavior. Remember this is open source software and comes with no guarantee. That being said, feel free to kick the tires and take it for a spin.&#xD;
&#xD;
Draw works best when used in Mathematica 11 but most functionality is supported by Mathematica 10.4.1.&#xD;
&#xD;
&#xD;
  [1]: http://community.wolfram.com/groups/-/m/t/960333&#xD;
  [2]: https://github.com/WolframResearch&#xD;
  [3]: http://community.wolfram.com//c/portal/getImageAttachment?filename=examples.png&amp;amp;userId=28355&#xD;
  [4]: http://community.wolfram.com//c/portal/getImageAttachment?filename=interfaceSections.png&amp;amp;userId=28355&#xD;
  [5]: http://community.wolfram.com//c/portal/getImageAttachment?filename=interface.png&amp;amp;userId=28355&#xD;
  [6]: http://community.wolfram.com//c/portal/getImageAttachment?filename=libraries.png&amp;amp;userId=28355&#xD;
  [7]: http://community.wolfram.com//c/portal/getImageAttachment?filename=gear.png&amp;amp;userId=28355&#xD;
  [8]: http://community.wolfram.com//c/portal/getImageAttachment?filename=shapearray.png&amp;amp;userId=28355&#xD;
  [9]: https://github.com/shdlbwr/draw</description>
    <dc:creator>Tim Shedelbower</dc:creator>
    <dc:date>2016-11-14T20:15:12Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/3062403">
    <title>Direct API access to new features of GPT-4 (including vision, DALL-E, and TTS)</title>
    <link>https://community.wolfram.com/groups/-/m/t/3062403</link>
    <description>![enter image description here][1]&#xD;
&#xD;
&amp;amp;[Wolfram Notebook][2]&#xD;
&#xD;
&#xD;
  [1]: https://community.wolfram.com//c/portal/getImageAttachment?filename=fg45qw.jpg&amp;amp;userId=11733&#xD;
  [2]: https://www.wolframcloud.com/obj/34ac42c4-10de-4201-a158-6af47eda2bd8</description>
    <dc:creator>Marco Thiel</dc:creator>
    <dc:date>2023-11-08T21:48:25Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/849709">
    <title>Suggestion: Better support for package development</title>
    <link>https://community.wolfram.com/groups/-/m/t/849709</link>
    <description>This is in the spirit of the &amp;#034;New Functions I would like to see in future...&amp;#034; post.&#xD;
&#xD;
I think that one area where Mathematica could improve considerably is supporting and encouraging third-party package development.  Mathematica is great for end-users, but it feels like WRI isn&amp;#039;t really thinking about making it truly extensible.&#xD;
&#xD;
A few concrete problems I noticed:&#xD;
&#xD;
 - Recent versions add new symbols to the ``System` `` namespace indiscriminately, and prioritize always-present built-in functions over user-loadable standard packages.  At 6000 built-in symbols this is just not sustainable and it&amp;#039;s hostile to third-party packages: at this rate of adding new symbols each new release is virtually guaranteed to break some package through symbol name conflict.&#xD;
&#xD;
    Previous versions used to ship with a few new standard packages bundled with Mathematica. Packages felt like a first-class citizen of the Mathematica ecosystem as WRI was using them too. Recent versions never add anything that is clearly a separate package from the user&amp;#039;s perspective and needs to be loaded.  Instead everything is crammed into the default namespace.  Technically, new packages are added in each release, but these are now always auto-loaded and appear as built-in from the user&amp;#039;s perspective.&#xD;
&#xD;
    *With the amount of functionality Mathematica has, better namespace management is sorely needed!*&#xD;
&#xD;
    Even MATLAB, long without namespace support, is now adopting namespaces.  Mathematica had them from the beginning but doesn&amp;#039;t use them anymore, which seems like a step backwards.&#xD;
&#xD;
    A particularly awful thing about cramming everything into the ``System` `` context is that naming conflicts actually *break* packages, not just cause shadowing.  If two packages use the same symbol names, one will simply shadow the other one, but won&amp;#039;t break it.  If there&amp;#039;s a conflict with a ``System` `` symbol, the package will need fixes to work again.&#xD;
&#xD;
 * Features that would typically be used by package developers are not well documented or completely undocumented.  There are many symbols in the ``Internal` `` context that are very useful, such as `InheritedBlock`, `WithLocalSettings`, `PositiveMachineIntegerQ`, etc. There are also many in the semi-documented ``Developer` `` context.&#xD;
&#xD;
 * Formerly many features of Mathematica were designed to be extensible and came with some documentation on how to extend them.  `NDSolve` and `NIntegrate` are good examples.  Recent additions tend to be less extensible and more opaque in their working.  Is there a way to extend machine learning functions with new algorithms?  Or can I add new graph layouts?  Can I re-use the built in packing methods for graph layouts in my own layout computation?  These don&amp;#039;t seem to be possible.&#xD;
&#xD;
    A good example of how strongly the focus has shifted to the highest level use case while ignoring more sophisticated use cases is the recently added `Dendrogram`: it goes directly from data to plot, and supports only the most superficial use.  The old HierarchicalClustering package has a special data structure for dendrograms which can be manipulated separately from their plot.  We had separate functions for *computing* or *plotting* a dendrogram, thus we could add our own, separate computation or plotting methods (and I did in the IGraph/M package which does produce dendrograms in this format).&#xD;
&#xD;
 * There are some things that would be really useful or even necessary for package development, but they are missing. For example, how can we clean up temporary files created by packages, on kernel exit?  There&amp;#039;s no robust solution for this, even though the need must have come up internally (`Compile`-generated shared libraries do get cleaned up on exit).&#xD;
&#xD;
 * Wolfram Workbench, *the only tool for creating proper documentation*, is stagnating and the released version (2.0) is not compatible with the latest Mathematica.  I am aware that we can request 3.0 beta but it seems to take forever until it gets released.  Also, Workbench is only for Premiere Support members, thus difficult to get.&#xD;
&#xD;
 * The licensing that Wolfram offers does not make it easy to create multiplatform packages.  One license is for one computer.  If a package needs to special case different operating systems (which is always the case for LibraryLink/MathLink stuff) then the only realistic way for most of us to develop a package is to have access to an academic site license, so we can install three copies on OS X/Windows/Linux.&#xD;
&#xD;
    A company that makes and sells commercial packages can afford multiple licenses.  But for a healthy package ecosystem we need lots of free and open source packages, which are not easy with Mathematica at the moment.&#xD;
&#xD;
&#xD;
To be fair, recent versions have also added very useful developer-oriented tools.  LibraryLink seems to be evolving nicely: it got the very necessary &amp;#034;managed library expressions&amp;#034; feature.  Associations are not purely developer-oriented, but they are extremely useful in this scenario.  10.4 added support for RawArrays in LibraryLink.  I appreciate all these features very much.  `MUnit`, a unit testing package was updated finally added to Mathematica in v10 (and doesn&amp;#039;t require the separate Workbench), but unfortunately this update also brought quality and usability problems so in the end I don&amp;#039;t use this tool ... the old Workbench version seemed more practically useful.&#xD;
&#xD;
The point I am trying to make with this post is that I have the impression that *overall* Mathematica encourages third-party package development less than it used to.  This is a bit surprising because there has been a big push to market Mathematica outside its traditional academic niche, to programmers (all the Wolfram Language rebranding, Wolfram Development Platform, etc.).  In 2016 a healthy package ecosystem is critical for a software like Mathematica to survive.  I am hoping that in the future there will be more emphasis on supporting and encouraging third-party package development.</description>
    <dc:creator>Szabolcs Horvát</dc:creator>
    <dc:date>2016-05-02T16:04:03Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/1311342">
    <title>(Plea for a) Free package repository</title>
    <link>https://community.wolfram.com/groups/-/m/t/1311342</link>
    <description>Around 22:15 in [this talk](https://www.wolfram.com/broadcast/video.php?v=2057)  a paclet repository is mentioned.&#xD;
&#xD;
To my mind, this is far-and-away the best repository Wolfram could make, seeing as Mathematica&amp;#039;s got no effective way to share packages like [python](https://pypi.python.org/pypi), [R](https://cran.r-project.org/), [JavaScript](https://www.npmjs.com/), or other modern languages.&#xD;
&#xD;
I think its introduction would make working with Mathematica exponentially better, and so I&amp;#039;m really hoping WRI puts some effort into getting it off the ground sooner rather than later (especially because I would like to contribute my paclets before I drift away from using Mathematica seriously on a daily basis).&#xD;
&#xD;
For this to work effectively, though, I think it really has to be a free system. That&amp;#039;s not to say that people shouldn&amp;#039;t be able to charge money for their packages--it&amp;#039;s their prerogative if they don&amp;#039;t want anyone to use their code. What I mean is that if it costs money to distribute packages/contribute them to the repository, people will be significantly less likely to share their code, which will keep the Mathematica dev community small and in turn decrease the amount to which Mathematica can penetrate into the broader programming community.</description>
    <dc:creator>b3m2a1 ​ </dc:creator>
    <dc:date>2018-03-29T18:09:21Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/2864162">
    <title>OpenAIMode: paclet for interaction w/ OpenAI&amp;#039;s GPT &amp;amp; DALL-E via OpenAILink</title>
    <link>https://community.wolfram.com/groups/-/m/t/2864162</link>
    <description>&amp;amp;[Wolfram Notebook][1]&#xD;
&#xD;
&#xD;
  [1]: https://www.wolframcloud.com/obj/04e935d4-d928-4868-adb8-ae6f84fae1f8</description>
    <dc:creator>Anton Antonov</dc:creator>
    <dc:date>2023-04-02T19:01:27Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/2330900">
    <title>[WSG21] Daily Study Group: programming tutorials</title>
    <link>https://community.wolfram.com/groups/-/m/t/2330900</link>
    <description>Daily Study Groups are back, now providing expertise on practical programming! After a short break, we&amp;#039;re starting up with a series that picks up where Wolfram Language Basics sessions ended. This 3-week series will take you from basic programming concepts to package development. &#xD;
&#xD;
Need tips on improving your code’s speed or functionality? Programming Tutorials offer a great opportunity to level-up your skills while interacting with software development professionals. See hands-on examples and get questions answered by Wolfram Language experts. Plus: participants who pass weekly quizzes are awarded a program completion certificate. Level 1 certification is available for those who pass manually graded exercises. &#xD;
&#xD;
Join us any time between August 2 and August 20! Check out our [registration page][1] for more details.&#xD;
&#xD;
&#xD;
&#xD;
 [1]: https://wolfr.am/Study_Group15</description>
    <dc:creator>Wolfram U</dc:creator>
    <dc:date>2021-07-30T15:24:02Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/787142">
    <title>Crystallica: A package to plot crystal structures</title>
    <link>https://community.wolfram.com/groups/-/m/t/787142</link>
    <description>## General information and download links ##&#xD;
&#xD;
If you&amp;#039;re interested in crystal structures, you can now download the Crystallica application from the Wolfram Library Archive, and then you can do things like this:&#xD;
&#xD;
    Needs[&amp;#034;Crystallica`&amp;#034;];&#xD;
    CrystalPlot[&#xD;
    {{5.4,0,0},{0,5.4,0},{0,0,5.4}},&#xD;
    {{0,0,0},{0,0,.5},{0,.5,0},{.5,0,0},{.24,.24,.24},{.24,.76,.76},{.76,.24,.76},{.76,.76,.24}},&#xD;
    {1,2,2,2,3,3,3,3},&#xD;
    AtomCol-&amp;gt;{&amp;#034;Firebrick&amp;#034;,&amp;#034;YellowGreen&amp;#034;,White},AtomRad-&amp;gt;.4,&#xD;
    BondStyle-&amp;gt;2,BondDist-&amp;gt;3,&#xD;
    CellLineStyle-&amp;gt;False,AddQ-&amp;gt;True,Lighting-&amp;gt;{{&amp;#034;Directional&amp;#034;,White,ImageScaled[{0,0,1}]}},Background-&amp;gt;Black]&#xD;
&#xD;
![enter image description here][1]&#xD;
&#xD;
Here are the download links for Crystallica and two other packages you may need:&#xD;
&#xD;
[Crystallica][2] - contains the functions `CrystalPlot` and `CrystalChange`&#xD;
&#xD;
[CifImport][3] - contains an import function for CIF files&#xD;
&#xD;
[VaspImport][4] - contains an import function for files related to [VASP][5]&#xD;
&#xD;
Once you&amp;#039;ve installed Crystallica (by saving the entire Crystallica folder - not the zip archive - to `$USerBaseDirectory/Applications` and re-starting the Kernel), you can enter Crystallica into the Documentation Center and you&amp;#039;ll find lots of useful examples. Most of the examples in this post are taken from the Documentation. For the other two packages, just install them and evaluate this:&#xD;
&#xD;
    ?CifImport&#xD;
    ?VaspImport&#xD;
&#xD;
I&amp;#039;ll first show you a few things the `CrystalPlot` function can do when you already have crystal structure data inside Mathematica, wherever it may have come from. Then we&amp;#039;ll take a look at how to get the data into Mathematica in the first place, which is where `CifImport` and `VaspImport` will come into play - but we&amp;#039;ll get data from other sources as well. I&amp;#039;ll cover the different import solutions in separate replies to this thread, because I have a feeling that I&amp;#039;ll be rambling on and on and on...&#xD;
&#xD;
## Simple plot ##&#xD;
&#xD;
Traditional ball-and-stick plots are usually just fine, so the simplest thing you can do is this:&#xD;
&#xD;
    CrystalPlot[&#xD;
    {{4.5,0,0},{0,4.5,0},{0,0,3}},&#xD;
    {{0,0,0},{.5,.5,.5},{.2,.8,.5},{.3,.3,0},{.7,.7,0},{.8,.2,.5}},&#xD;
    {1,1,2,2,2,2}]&#xD;
&#xD;
![enter image description here][6]&#xD;
&#xD;
As you can see, `CrystalPlot` expects three arguments. The first one contains the lattice vectors, which are simply the three vectors that create the parallelepiped that constitutes the cell. The second argument contains the atomic coordinates, but they&amp;#039;re given in the basis of the lattice vectors (which is quite useful in crystallography). The third argument is a list of integers that gives the atom types, with one entry for each atom. If you want to plot a molecule instead, you can call `CrystalPlot` with just two arguments: A list of atom coordinates in cartesian space, and a list of atom types. Everything else you see in the plot - the atoms, bonds, colours, arrows etc. - represents the default settings of various layout options.&#xD;
&#xD;
## Advanced atoms and bonds ##&#xD;
&#xD;
Let&amp;#039;s take a look at some more advanced options just for fun. For instance, atoms and bonds can look any way you need them to, because you can specify your own functions for them. You can also fine-tune where to put bonds and what to do with their thickness and colour in a physically (or chemically) meaningful way, but I won&amp;#039;t show that here. So here are some customized atoms and bonds:&#xD;
&#xD;
    Row[Table[&#xD;
    CrystalPlot[{{4,0,0},{0,4,0},{0,0,4}},{{0,0,0},{.4,.4,.4},{.8,.8,.8}},{1,2,3},&#xD;
    AtomRad-&amp;gt;{.4,1.2,.7},AtomFunction-&amp;gt;style,ImageSize-&amp;gt;400],&#xD;
    {style,{&#xD;
    (Ball[#1,#2]&amp;amp;),&#xD;
    (Scale[Sphere[#1,#2],{1,1,.5}]&amp;amp;),&#xD;
    ({EdgeForm[Thick],Opacity[.7],Cuboid[#1-.5*#2,#1+.5*#2]}&amp;amp;)&#xD;
    }}]]&#xD;
&#xD;
![enter image description here][7]&#xD;
&#xD;
    Row[Table[&#xD;
    CrystalPlot[{{0,0,0},{5,0,0},{2.5,4,0}},{1,2,3},BondDist-&amp;gt;6,BondStyle-&amp;gt;style,ImageSize-&amp;gt;400],&#xD;
    {style,{&#xD;
    1,&#xD;
    Function[{bonds,partcol},Table[{If[ii&amp;lt;.5,partcol[#,1],partcol[#,2]],Sphere[bonds[[#,1]]+ii*(bonds[[#,2]]-bonds[[#,1]]),.15]},{ii,0,1,1/9}]&amp;amp;/@Range[Length[bonds]]],&#xD;
    Function[{bonds,partcol},Module[{spiral,points,rad=.05},&#xD;
    spiral[atoms_]:=Module[{scale=.5,dist=atoms[[2]]-atoms[[1]],curls=60,normal,rot,scaled},&#xD;
    normal=Table[{scale*Cos[ii],scale*Sin[ii],.1*ii},{ii,0,curls,\[Pi]/10}];&#xD;
    scaled={#[[1]],#[[2]],10*Norm[dist]/curls*#[[3]]}&amp;amp;/@normal;&#xD;
    rot=scaled.Quiet[RotationMatrix[{dist,{0,0,1}}]];&#xD;
    Join[{atoms[[1]]},#+atoms[[1]]&amp;amp;/@(rot[[25;;-25]]),{atoms[[2]]}]];&#xD;
    points=spiral/@bonds;&#xD;
    {partcol[#,1],Tube[BSplineCurve[points[[#,;;Round[Length[points[[#]]]/2]]],rad]],partcol[#,2],Tube[BSplineCurve[points[[#,Round[Length[points[[#]]]/2];;]],rad]]}&amp;amp;/@Range[Length[bonds]]&#xD;
    ]]&#xD;
    }}]]&#xD;
&#xD;
![enter image description here][8]&#xD;
&#xD;
## Lattice planes ##&#xD;
&#xD;
Crystallica can also add lattice planes to the plot. You can specify them using [h,k,l] Miller indices and distance to the origin.&#xD;
&#xD;
    CrystalPlot[{{3,0,0},{0,3,0},{0,0,3}},{{0,0,0}},{1},&#xD;
    AddQ-&amp;gt;True,AtomRad-&amp;gt;.3,AtomCol-&amp;gt;&amp;#034;CadmiumYellow&amp;#034;,Sysdim-&amp;gt;2,CellLineStyle-&amp;gt;2,&#xD;
    LatticePlanes-&amp;gt;Table[{{1,1,1},dist},{dist,1,5}],ContourStyle-&amp;gt;{&amp;#034;TerreVerte&amp;#034;,Opacity[.7]},BoundaryStyle-&amp;gt;Thick]&#xD;
&#xD;
![enter image description here][9]&#xD;
&#xD;
## Coordination polyhedra ##&#xD;
&#xD;
You can automatically search for and plot coordination polyhedra. This is not limited to the commonly occurring tetrahedra and octahedra - you can actually look for polyhedra with arbitrary numbers of corners. There are also options to fine-tune both the searching and the rendering.&#xD;
&#xD;
    plot[corners_,mixed_]:=CrystalPlot[{{0,0,0},{0,0,1.8},{-.9,-1.5,-.6},{-.9,1.5,-.6},{1.7,0,-.6},{.8,.8,.8}},{1,2,2,2,2,3},&#xD;
    BondStyle-&amp;gt;False,ImageSize-&amp;gt;250,&#xD;
    PolyMode[corners]-&amp;gt;{&amp;#034;Show&amp;#034;-&amp;gt;All,&amp;#034;AllowMixed&amp;#034;-&amp;gt;mixed},PolyStyle[corners]-&amp;gt;Directive[Opacity[.5],EdgeForm[Thick]]];&#xD;
    Grid[{{&#xD;
    &amp;#034;&amp;#034;,&#xD;
    &amp;#034;Search for polyhedra with \n4 corners&amp;#034;,&#xD;
    &amp;#034;Search for polyhedra with \n5 corners&amp;#034;&#xD;
    },{&#xD;
    &amp;#034;Allow \nmixed corners&amp;#034;,&#xD;
    plot[4,True],&#xD;
    plot[5,True]&#xD;
    },{&#xD;
    &amp;#034;Don&amp;#039;t allow \nmixed corners&amp;#034;,&#xD;
    plot[4,False],&#xD;
    plot[5,False]&#xD;
    }},Dividers-&amp;gt;All]&#xD;
&#xD;
![enter image description here][10]&#xD;
&#xD;
    CrystalPlot[{{2.5,-4.3,0},{2.5,4.3,0},{0,0,5.5}},&#xD;
    {{.5,0,0},{0,.5,.7},{.5,.5,.3},{.2,.4,.5},{.6,.8,.2},{.2,.8,.8},{.8,.6,.5},{.4,.2,.2},{.8,.2,.8}},{1,1,1,2,2,2,2,2,2},&#xD;
    PolyMode[4]-&amp;gt;True,PolyStyle[4]-&amp;gt;EdgeForm[None],AddQ-&amp;gt;True,&#xD;
    Sysdim-&amp;gt;2,AtomRad-&amp;gt;0,CellLineStyle-&amp;gt;False,AtomCol-&amp;gt;{&amp;#034;SlateGray&amp;#034;,&amp;#034;Firebrick&amp;#034;},&#xD;
    ViewAngle-&amp;gt;.4,ViewPoint-&amp;gt;{3.2,0,1.1},ViewVertical-&amp;gt;{.5,0,1.2}]&#xD;
&#xD;
![enter image description here][11]&#xD;
&#xD;
## Other things ##&#xD;
&#xD;
Visualization aside, you can also build supercells, change cell shapes, or add, remove and sort atoms... but that&amp;#039;s a bit boring to read, so I&amp;#039;ll refer you to the Documentation page of the `CrystalChange` function instead.&#xD;
&#xD;
If you&amp;#039;re interested, we can use this thread to talk about any questions you may have, or you can share your use of the package (if you decide to use it). I&amp;#039;m not offering full support here, but I&amp;#039;ll be floating around, and I&amp;#039;d like to hear your feedback. We don&amp;#039;t have any intentions to be involved in further development. But if you have a good idea and some time, then by all means, work on it for yourself, or host it on your favourite code collaboration site.&#xD;
&#xD;
Bianca Eifert and Christian Heiliger&#xD;
&#xD;
&#xD;
  [1]: http://community.wolfram.com//c/portal/getImageAttachment?filename=teaser.png&amp;amp;userId=69107&#xD;
  [2]: http://library.wolfram.com/infocenter/MathSource/9372/&#xD;
  [3]: http://library.wolfram.com/infocenter/MathSource/9373/&#xD;
  [4]: http://library.wolfram.com/infocenter/MathSource/9375/&#xD;
  [5]: http://vasp.at/&#xD;
  [6]: http://community.wolfram.com//c/portal/getImageAttachment?filename=9692simple.png&amp;amp;userId=69107&#xD;
  [7]: http://community.wolfram.com//c/portal/getImageAttachment?filename=atoms.png&amp;amp;userId=69107&#xD;
  [8]: http://community.wolfram.com//c/portal/getImageAttachment?filename=bonds.png&amp;amp;userId=69107&#xD;
  [9]: http://community.wolfram.com//c/portal/getImageAttachment?filename=planes.png&amp;amp;userId=69107&#xD;
  [10]: http://community.wolfram.com//c/portal/getImageAttachment?filename=polys.png&amp;amp;userId=69107&#xD;
  [11]: http://community.wolfram.com//c/portal/getImageAttachment?filename=polys2.png&amp;amp;userId=69107&#xD;
  [12]: http://rruff.geo.arizona.edu/AMS/CIF_text_files/13532_cif.txt&#xD;
  [13]: http://cms.mpi.univie.ac.at/vasp/vasp/POSCAR_file.html&#xD;
  [14]: http://wiki.jmol.org/index.php/File:Caffeine.mol</description>
    <dc:creator>Bianca Eifert</dc:creator>
    <dc:date>2016-02-05T18:43:18Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/2328597">
    <title>Training a recurrent neural network (RNN) to generate piano music</title>
    <link>https://community.wolfram.com/groups/-/m/t/2328597</link>
    <description>&amp;gt; **GitHub Repository:** https://github.com/alecGraves/Howl&#xD;
&#xD;
&#xD;
&#xD;
&amp;amp;[Wolfram Notebook][1]&#xD;
&#xD;
&#xD;
  [1]: https://www.wolframcloud.com/obj/da6d3b76-7bbf-4a55-9fcd-058e7f1e17bf</description>
    <dc:creator>Alec Graves</dc:creator>
    <dc:date>2021-07-27T14:09:12Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/762950">
    <title>Package for Radar Charts</title>
    <link>https://community.wolfram.com/groups/-/m/t/762950</link>
    <description>**RadarChart Mathematica Package**&#xD;
&#xD;
The *RadarChart* mathematica package incorporates Radar Charts (also known as Spider Charts, Web Charts and Star Plots) as a new set of visualization tools into the mathematica environment.&#xD;
&#xD;
A detailed explanation on the use of radar charts can be found in the following [wikipedia page](https://en.wikipedia.org/wiki/Radar_chart).&#xD;
&#xD;
The project is listed at the mathematica package repository ([http://packagedata.net][1]), or can be accessed directly at  [github][2].&#xD;
&#xD;
Thanks to [halirutan](https://github.com/halirutan) for his guidance on setting up this project. Installation Instructions are heavily based on his existing projects.&#xD;
&#xD;
---&#xD;
**Navigation**&#xD;
&#xD;
- [Detailed Usage](#-detailed-usage)&#xD;
- [Examples](#examples)&#xD;
- [Neat Examples](#neat-examples)&#xD;
- [Installation](#installation)&#xD;
	- [Automatic Installation for *Mathematica* 9 and above](#automatic-installation-for-mathematica-9-and-above)&#xD;
	- [Manual Installation](#manual-installation)&#xD;
- [Contact](#-contact) &#xD;
	&#xD;
---&#xD;
&#xD;
##![doc image](http://i.stack.imgur.com/erf8e.png) Detailed Usage&#xD;
    RadarChart[{y1,y2,y3,...}]&#xD;
generates a radar plot (also known as web, star, spider, cobweb or kiviat diagram) corresponding to a list of values. This type of chart is suitable for showing commonality and outliers across different variables. &#xD;
     RadarChart[{list1,list2,...}]&#xD;
generates a radar plot to compare several series. &#xD;
&#xD;
     RadarChart[association]&#xD;
generates a radar plot to view the variable values in an association. &#xD;
&#xD;
     RadarChart[{association1,association2,...}]&#xD;
generates a radar plot to compare several series. &#xD;
&#xD;
     RadarChart[dataset]&#xD;
generates a radar plot to compare several series.&#xD;
&#xD;
Options are listed in the help file, and also in the readme document @ the github site.&#xD;
&#xD;
##Examples&#xD;
    Needs[&amp;#034;RadarChart`&amp;#034;]&#xD;
    RadarChart[{1, 2, 4, 5, 3}, &#xD;
    ChartLegends -&amp;gt; {&amp;#034;Private Label Strawberry Juice&amp;#034;}, &#xD;
    AxesLabel -&amp;gt; {&amp;#034;Ripe&amp;#034;, &amp;#034;Green&amp;#034;, &amp;#034;Candy&amp;#034;, &amp;#034;Juicy&amp;#034;, &amp;#034;Sulphur&amp;#034;}, &#xD;
    PlotLabel -&amp;gt; Style[&amp;#034;Sensory Map Strawberry Juice&amp;#034;, Bold, Large], &#xD;
    ImageSize -&amp;gt; Medium]&#xD;
    &#xD;
![Basic Example](http://i.stack.imgur.com/Opnwp.png)    &#xD;
&#xD;
Multiple Series can be charted.&#xD;
&#xD;
     Needs[&amp;#034;RadarChart`&amp;#034;]&#xD;
     RadarChart[{{1, 4, 3, 5, 2}, {2, 4, 3, 2, 1}}, Filling -&amp;gt; Axis, &#xD;
         AxesLabel -&amp;gt; {&amp;#034;Sweet&amp;#034;, &amp;#034;Sour&amp;#034;, &amp;#034;Salty&amp;#034;, &amp;#034;Bitter&amp;#034;, &amp;#034;Umami&amp;#034;}, &#xD;
         PlotStyle -&amp;gt; {Red, Blue}, ChartLegends -&amp;gt; {&amp;#034;Fernet-Cola&amp;#034;, &amp;#034;Jugo&amp;#034;}]&#xD;
![Mathematica graphics](http://i.stack.imgur.com/zvBVd.png)   &#xD;
&#xD;
Example of a start plot.&#xD;
&#xD;
     Needs[&amp;#034;RadarChart`&amp;#034;];&#xD;
     RadarChart[{{1, 4, 3, 5, 2}, {2, 4, 3, 2, 1}}, AxesType -&amp;gt; &amp;#034;Star&amp;#034;]&#xD;
&#xD;
![Mathematica graphics](http://i.stack.imgur.com/umecs.png)&#xD;
&#xD;
Compare survey results.&#xD;
&#xD;
     Needs[&amp;#034;RadarChart`&amp;#034;];&#xD;
     RadarChart[{{3, 4, 3, 4, 2}, {4, 5, 4, 5, 3}}, &#xD;
         AxesLabel -&amp;gt; {&amp;#034;Assets&amp;#034;, &amp;#034;Reliability&amp;#034;, &amp;#034;Cost Control&amp;#034;, &#xD;
         &amp;#034;Abstenteeism&amp;#034;, &amp;#034;Revenue&amp;#034;}, &#xD;
         ChartLegends -&amp;gt; {&amp;#034;Past Year&amp;#034;, &amp;#034;Current Year&amp;#034;}, Filling -&amp;gt; Axis, &#xD;
         PlotStyle -&amp;gt; {{Gray}, {Black}}, ImageSize -&amp;gt; Medium]&#xD;
     &#xD;
![Mathematica graphics](http://i.stack.imgur.com/WUH8c.png)&#xD;
&#xD;
##Neat Examples&#xD;
&#xD;
Analyze and compare crime statistics across states.&#xD;
&#xD;
     Needs[&amp;#034;RadarChart`&amp;#034;];&#xD;
     states = EntityClass[&amp;#034;AdministrativeDivision&amp;#034;, &amp;#034;AllUSStatesPlusDC&amp;#034;];&#xD;
     stateNames = First@StringSplit[#, &amp;#034;,&amp;#034;] &amp;amp; /@ states[&amp;#034;Name&amp;#034;];&#xD;
     crimeProps = {&amp;#034;AggravatedAssaultRate&amp;#034;, &amp;#034;BurglaryRate&amp;#034;, &#xD;
         &amp;#034;ForcibleRapeRate&amp;#034;, &amp;#034;LarcenyTheftRate&amp;#034;, &#xD;
         &amp;#034;MurderNonnegligentManslaughterRate&amp;#034;, &amp;#034;PropertyCrimeRate&amp;#034;, &#xD;
         &amp;#034;RobberyRate&amp;#034;, &amp;#034;ViolentCrimeRate&amp;#034;};&#xD;
     crimeData = EntityValue[states, &#xD;
         EntityProperty[&amp;#034;AdministrativeDivision&amp;#034;, #] &amp;amp; /@ crimeProps];&#xD;
     crimeRanking = Transpose[&#xD;
         Ordering[crimeData[[All, #]]] &amp;amp; /@ Range@Length@crimeProps];&#xD;
     ds = Dataset[&#xD;
         AssociationThread[stateNames, &#xD;
             AssociationThread[crimeProps, #] &amp;amp; /@ crimeRanking]];&#xD;
     GraphicsRow[{RadarChart[ds[&amp;#034;Georgia&amp;#034;], AxesType -&amp;gt; &amp;#034;Star&amp;#034;, &#xD;
         PlotLabel -&amp;gt; Style[&amp;#034;Georgia&amp;#034;, Bold, Large], &#xD;
         Epilog -&amp;gt; {Dashed, Circle[{0, 0}, 25.5]}, ImageSize -&amp;gt; Large], &#xD;
         GraphicsGrid[&#xD;
             Partition[&#xD;
                 RadarChart[ds[#], PlotLabel -&amp;gt; #, AxesLabel -&amp;gt; None, &#xD;
                 PlotRange -&amp;gt; {0, 50}, AxesType -&amp;gt; &amp;#034;Star&amp;#034;,&#xD;
                 PlotRangePadding -&amp;gt; Full, FrameTicks -&amp;gt; None, &#xD;
                 Epilog -&amp;gt; {Dashed, Circle[{0, 0}, 25.5]}] &amp;amp; /@ stateNames, &#xD;
                 UpTo[6]], ImageSize -&amp;gt; 600]}]]&#xD;
                 &#xD;
![Mathematica graphics](http://i.stack.imgur.com/5Vk7j.png)&#xD;
&#xD;
#Installation&#xD;
&#xD;
This package should work with Mathematica &amp;gt;8 if not using associations or datasets. The package was developed using mathematica 10.&#xD;
The installation is simple: Copy the `RadarChart` package directory into a location where *Mathematica* can find it. Usually this is the `Applications` directory in your `$UserBaseDirectory`. Just evaluate&#xD;
&#xD;
    FileNameJoin[{$UserBaseDirectory, &amp;#034;Applications&amp;#034;}]&#xD;
&#xD;
to see it. If there is an old installation of the `RadarChart`, remove it. Please find detailed steps below.&#xD;
&#xD;
###Automatic Installation for *Mathematica* 9 and above&#xD;
&#xD;
We have set up [an installation script](https://raw.githubusercontent.com/catrasca/RadarChart/master/RadarChart/installer.m) that does all the steps, except deleting old installations, for you. If it finds an old installation, it will prompt you with the location and quit, so that you can remove the old installation. After removing the old files, just start it again and it will proceed through all the steps pointed out in the manual installation section. To start the installation script, simply call&#xD;
&#xD;
    Import[&amp;#034;http://tinyurl.com/ntmhkca&amp;#034;]&#xD;
&#xD;
After this, the package should be available in your mathematica instance.&#xD;
&#xD;
###Manual Installation&#xD;
&#xD;
####Removing old Installations&#xD;
&#xD;
Old installation packages can be found by simply searching directories in your `$Path`. &#xD;
&#xD;
    FileNames[&amp;#034;RadarChart&amp;#034;, $Path]&#xD;
&#xD;
Please remove old installation directories that appear after evaluating the commands above. You can use &#xD;
&#xD;
    DeleteDirectory[dir, DeleteContents -&amp;gt; True]&#xD;
&#xD;
for that, but note that on Windows this might fail, because there, some files are locked when *Mathematica* is running. In this case, close *Mathematica* and do it manually using an explorer.&#xD;
&#xD;
###Downloading, Extracting and Copying the New Version&#xD;
&#xD;
The easiest way is, to download the whole repository as zip file. Use [this master.zip](https://github.com/catrasca/RadarChart/archive/master.zip) or click the *Download ZIP* on the right side on this page.&#xD;
&#xD;
After you have downloaded the file extract it. If you have no tool for this on Windows, you could use the [free 7-Zip](http://7-zip.org/). Under Mac OSX and Linux this should work out of the box.&#xD;
&#xD;
Inside the extracted directory, you will find a subdirectory `RadarChart` which has the following structure&#xD;
&#xD;
    RadarChart/&#xD;
    ??? Documentation&#xD;
    ?   ??? English&#xD;
    ?       ??? ReferencePages&#xD;
    ?           ??? Symbols&#xD;
    ?               ??? RadarChart.nb&#xD;
    ??? Kernel&#xD;
    ?   ??? init.m&#xD;
    ??? Installer.m&#xD;
    ??? pacletInfo.m&#xD;
    ??? RadarChart.m&#xD;
&#xD;
Copy the whole `RadarChart` directory with all its content to your `Applications` folder under your `$UserBaseDiretory`. If everything is in place proceed to the next step.&#xD;
&#xD;
###Finishing the Installation&#xD;
&#xD;
To make the package works, you can simply restart *Mathematica*.&#xD;
&#xD;
##![contact team](http://i.stack.imgur.com/tCbmW.png) Contact&#xD;
&#xD;
If you find bugs or have any other questions, please [create a new issue](https://github.com/catrasca/RadarChart/issues) in the bug-tracker. &#xD;
&#xD;
&#xD;
  [1]: http://packagedata.net/&#xD;
  [2]: http://github.com/catrasca/RadarChart</description>
    <dc:creator>Diego Zviovich</dc:creator>
    <dc:date>2015-12-22T20:02:41Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/3467978">
    <title>Collatz conjecture visualizations</title>
    <link>https://community.wolfram.com/groups/-/m/t/3467978</link>
    <description>![Collatz conjecture visualizations][1]&#xD;
&#xD;
&amp;amp;[Wolfram Notebook][2]&#xD;
&#xD;
&#xD;
  [1]: https://community.wolfram.com//c/portal/getImageAttachment?filename=Main227052025.png&amp;amp;userId=20103&#xD;
  [2]: https://www.wolframcloud.com/obj/85fd1874-61c4-4798-8e48-d8ba6d037984</description>
    <dc:creator>Anton Antonov</dc:creator>
    <dc:date>2025-05-27T12:23:54Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/1646303">
    <title>UNET: neural network for 2D &amp;amp; 3D image segmentation w/ medical examples</title>
    <link>https://community.wolfram.com/groups/-/m/t/1646303</link>
    <description># UNET [![DOI](https://zenodo.org/badge/137186334.svg)](https://zenodo.org/badge/latestdoi/137186334) [![contributions welcome](https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat)](https://github.com/dwyl/esta/issues)&#xD;
&#xD;
&#xD;
----------&#xD;
&#xD;
![Automated 3D muscle segmentation using UNET / RESNET using DIXON MRI data][17]&#xD;
&#xD;
&#xD;
A package to generate and train a UNET deep convolutional network for 2D and 3D image segmentation.&#xD;
&#xD;
Some code was based on [work][1] by [@Ali Hashmi][at0], which was also dicussed in [this post][2] &#xD;
The full version of the toolbox can be found on my [github page][3].&#xD;
&#xD;
* [Information](#information)&#xD;
* [Install toolbox](#install-toolbox)&#xD;
* [Using the toolbox](#using-the-toolbox)&#xD;
* [Functionality](#functionality)&#xD;
* [Visualization](#visualization)&#xD;
* [Example](#example)&#xD;
&#xD;
## Information&#xD;
&#xD;
UNET is developed for [Mathematica](https://www.wolfram.com/mathematica/).&#xD;
It contains the following toolboxes:&#xD;
&#xD;
- UnetCore&#xD;
- UnetSupport&#xD;
&#xD;
Documentation of all functions and their options is fully integrated in the Mathematica documentation.&#xD;
The toolbox always works within the latest version of Mathematica and does not support any backward compatibility.&#xD;
&#xD;
All code and documentation is maintained and uploaded to github using [Workbench](https://www.wolfram.com/workbench/).&#xD;
&#xD;
## Install toolbox&#xD;
&#xD;
Install the toolbox in the Mathematica UserBaseDirectory &amp;gt; Applications.&#xD;
&#xD;
	FileNameJoin[{$UserBaseDirectory, &amp;#034;Applications&amp;#034;}]&#xD;
  &#xD;
## Using the toolbox&#xD;
&#xD;
The toolbox can be loaded by using &amp;lt;&amp;lt;UNET`&#xD;
&#xD;
The notbook ``UNET.nb`` shows examples of how to use the toolbox on artificially generated 2D data. &#xD;
There are also examples how to visualize the layer of your trained network and how to visualize the training itself. &#xD;
&#xD;
## Functionality&#xD;
&#xD;
The network supports multi channel inputs and multi class segmentation.&#xD;
&#xD;
* UNET generates a UNET convolutional network.  &#xD;
    * 2D UNET  &#xD;
![UNET 2D][4]&#xD;
    * 3D UNET  &#xD;
![UNET 3D][5]&#xD;
&#xD;
* Loss Layers: Training the data is done using three loss layers: a SoftDiceLossLayer, BrierLossLayer and a CrossEntropyLossLayer.  &#xD;
![SoftDiceLossLayer, BrierLossLayer and a CrossEntropyLossLayer][6]&#xD;
&#xD;
* Convolution Blocks: The toobox contains five different convolution blocks that build up the network: [UNET][7], UResNet, [RestNet][8], UDenseNet, [DensNet][9].  &#xD;
![Convolution blocks][10]&#xD;
&#xD;
* SplitTrainData splits the data and labels into training, validation and test data.  &#xD;
![split train Data][11]&#xD;
&#xD;
* TrainUNET trains the network.  &#xD;
![Train UNET][12]&#xD;
&#xD;
## Visualization&#xD;
&#xD;
* Visualize the network and results.  &#xD;
    * Visualize the features of the layers.  &#xD;
![Visualize layer features][13]&#xD;
    * Visualize the results.  &#xD;
![Visualize the results][14]&#xD;
    * Animate the training process.  &#xD;
![UNET 2D animation][15]  &#xD;
![UNET 3D animation][16]&#xD;
&#xD;
## Example&#xD;
&#xD;
* Example: 3D segmentation of lower legg muscles using MRI data.  &#xD;
&#xD;
![Automated 3D muscle segmentation using UNET / RESNET using DIXON MRI data][17]&#xD;
&#xD;
&#xD;
  [1]: https://github.com/alihashmiii/UNet-Segmentation-Wolfram&#xD;
  [2]: https://community.wolfram.com/groups/-/m/t/1341081?p_p_auth=w8PIeeiA&#xD;
  [3]: https://github.com/mfroeling&#xD;
  [4]: https://community.wolfram.com//c/portal/getImageAttachment?filename=UNET2D.PNG&amp;amp;userId=1332602&#xD;
  [5]: https://community.wolfram.com//c/portal/getImageAttachment?filename=UNET3D.PNG&amp;amp;userId=1332602&#xD;
  [6]: https://community.wolfram.com//c/portal/getImageAttachment?filename=Loss.PNG&amp;amp;userId=1332602&#xD;
  [7]: https://arxiv.org/abs/1505.04597&#xD;
  [8]: https://arxiv.org/abs/1512.03385&#xD;
  [9]: https://arxiv.org/abs/1608.06993&#xD;
  [10]: https://community.wolfram.com//c/portal/getImageAttachment?filename=convblocks.PNG&amp;amp;userId=1332602&#xD;
  [11]: https://community.wolfram.com//c/portal/getImageAttachment?filename=Split.PNG&amp;amp;userId=1332602&#xD;
  [12]: https://community.wolfram.com//c/portal/getImageAttachment?filename=Train.PNG&amp;amp;userId=1332602&#xD;
  [13]: https://community.wolfram.com//c/portal/getImageAttachment?filename=Visualize1.PNG&amp;amp;userId=1332602&#xD;
  [14]: https://community.wolfram.com//c/portal/getImageAttachment?filename=Visualize2.PNG&amp;amp;userId=1332602&#xD;
  [15]: https://community.wolfram.com//c/portal/getImageAttachment?filename=amin0-v2.gif&amp;amp;userId=1332602&#xD;
  [16]: https://community.wolfram.com//c/portal/getImageAttachment?filename=amin4-v2.gif&amp;amp;userId=1332602&#xD;
  [17]: https://community.wolfram.com//c/portal/getImageAttachment?filename=Muscle_Segmentation.jpg&amp;amp;userId=1332602&#xD;
&#xD;
 [at0]: https://community.wolfram.com/web/alihashmi87</description>
    <dc:creator>Martijn Froeling</dc:creator>
    <dc:date>2019-04-03T20:01:26Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/1273720">
    <title>Live code templates</title>
    <link>https://community.wolfram.com/groups/-/m/t/1273720</link>
    <description>## Background&#xD;
&#xD;
I enjoy coding in the FrontEnd (except it crashes and lookup across files does not exist), but I often miss &amp;#039;hands on keyboard&amp;#039;, customizable code templates.&#xD;
&#xD;
E.g. I often forget to wrap an option name with quotes &amp;#034;_&amp;#034; or I&amp;#039;m starting a new function and would like to avoid retyping `Attributes/Options` `Catch/Check` etc. I don&amp;#039;t like palettes for something that I need to do quickly and frequently. The are not &amp;#039;hands on keyboard&amp;#039; either. So I created a little package/stylesheet, should work on Win/MacOs with MMA 10.4+&#xD;
&#xD;
https://github.com/kubaPod/DevTools&#xD;
&#xD;
In case you are interested and/or have any ideas about this / similar features, let me know here or create an Issue in GitHub.&#xD;
&#xD;
Topic cross posted on Mathematica.stackexchange: https://mathematica.stackexchange.com/q/164653/5478&#xD;
&#xD;
&#xD;
&#xD;
[![enter image description here][2]][2]&#xD;
&#xD;
## Index&#xD;
&#xD;
Most up to date examples, setup and other details can be found in [**project&amp;#039;s Readme.MD**](https://github.com/kubaPod/DevTools)&#xD;
&#xD;
- [v0.10.0 (01-12-2018) NotebookActions](https://community.wolfram.com/groups/-/m/t/1273720#lukr_reply)&#xD;
&#xD;
- [v0.8.0 (06-07-2018) VerificationTest template](https://community.wolfram.com/groups/-/m/t/1273720#kxdi_reply)&#xD;
&#xD;
- [v0.7.0 (21-02-2018) support for V10.4](https://community.wolfram.com/groups/-/m/t/1273720#gkow_reply)&#xD;
&#xD;
  [2]: https://i.stack.imgur.com/g96TY.gif</description>
    <dc:creator>Kuba Podkalicki</dc:creator>
    <dc:date>2018-01-28T18:00:23Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/1421180">
    <title>Rubi - The Rule-based Integrator for Mathematica</title>
    <link>https://community.wolfram.com/groups/-/m/t/1421180</link>
    <description>Two months ago, Albert Rich posted [&amp;#034;What&amp;#039;s the hardest integral Mathematica running Rubi can find?&amp;#034;](http://community.wolfram.com/groups/-/m/t/1343015) here on the Wolfram Community.&#xD;
You might have also seen that I responded in detail, and pointed out a few things that could help improve Rubi (Rule-based integrator).&#xD;
While it appears nothing really happened afterward, this is far from reality.&#xD;
Since then, Albert and I have worked closely together to make Rubi more accessible and user-friendly.&#xD;
If you would like to learn how our productive collaboration evolved, let me invite you to read [my latest blog-post](http://halirutan.de/programming/Rubi/).&#xD;
However, here, we want to share an update that should serve as an overview of what we have done to improve Rubi.&#xD;
&#xD;
First of all, Rubi has got a new home under [rulebasedintegration.org](https://rulebasedintegration.org/), and its old website will no longer be updated.&#xD;
On the new website, you will find information, installation instructions, and links to the source-code and test-suites.&#xD;
&#xD;
Secondly, we created a [Rubi Organization](https://github.com/RuleBasedIntegration) on GitHub that serves as the headquarters for all things Rubi.&#xD;
It contains all Rubi&amp;#039;s code, notebooks, and test-suites nicely structured into several repositories.&#xD;
At the moment, we provide repositories for the&#xD;
&#xD;
* loadable package files and notebook source files defining over 6700 integration rules,&#xD;
* PDF files displaying the rules in human-readable mathematical notation alongside the Mathematica code, and&#xD;
* test-suite files containing over 71000 integration problems and their solutions.&#xD;
&#xD;
The integration test files are available in the syntax used by 4 popular computer algebra systems (Mathematica, Maple, Maxima, and Axiom).&#xD;
The test-suite can be used to compare Rubi&amp;#039;s results with other symbolic integrators, including Mathematica&amp;#039;s `Integrate` function.&#xD;
&#xD;
In addition to the transition to GitHub, we recently released version 4.16.0.3 of Rubi which significantly expands the class of expressions the system can integrate.&#xD;
But the most noticeable change for users is the completely reworked display of the rules and intermediate steps Rubi uses to integrate expressions.&#xD;
Although installation, usage, and examples are given on [Rubi&amp;#039;s website](https://rulebasedintegration.org/), let me show you how easy it is to install and run Rubi 4.16.0.3 using Mathematica 11.3:&#xD;
&#xD;
The command&#xD;
&#xD;
    PacletInstall[&amp;#034;https://github.com/RuleBasedIntegration/Rubi/releases/download/4.16.0.3/Rubi-4.16.0.3.paclet&amp;#034;];&#xD;
&#xD;
installs the Rubi-4.16.0.3 paclet on your computer.&#xD;
After that, to load Rubi into Mathematica all you have to do is issue the `Get` command&#xD;
&#xD;
    &amp;lt;&amp;lt; Rubi`&#xD;
&#xD;
Then to integrate an expression with respect to a variable, use Rubi&amp;#039;s `Int` command similar to Mathematica&amp;#039;s `Integrate` command.  For example, evaluating&#xD;
&#xD;
    Int[(Sec[x]^2 + Sec[x]^2*Tan[x])/((2 - Tan[x])*Sqrt[1 + Tan[x]^3]), x]&#xD;
&#xD;
returns the antiderivative (a.k.a. the indefinite integral)&#xD;
&#xD;
![enter image description here][1]&#xD;
&#xD;
Rubi&amp;#039;s unique ability to display the steps it uses to integrate expressions is a great feature of the system.&#xD;
For example, the `Steps` command&#xD;
&#xD;
    Steps@Int[(Sec[x]^2 + Sec[x]^2*Tan[x])/((2 - Tan[x])*Sqrt[1 + Tan[x]^3]), x]&#xD;
&#xD;
displays&#xD;
&#xD;
![enter image description here][2]&#xD;
&#xD;
Here, in red are the rules used to integrate the expression, and in blue are the intermediate results.&#xD;
Each rule can be expanded to show the rule number, which directly corresponds to the index of the rule in `Int`&amp;#039;s list of DownValues.&#xD;
More importantly, you can see the conditions that have to be satisfied so the rule can be applied.&#xD;
&#xD;
![enter image description here][3]&#xD;
&#xD;
Rubi&amp;#039;s `Stats` command provides statistics about the integration. For example,&#xD;
&#xD;
    Stats[Int[(Sec[x]^2 + Sec[x]^2*Tan[x])/((2 - Tan[x])*Sqrt[1 + Tan[x]^3]), x]]&#xD;
&#xD;
displays&#xD;
&#xD;
![enter image description here][4]&#xD;
&#xD;
The leaf-count size of an antiderivative is a crude measure of its complexity.&#xD;
As you can see, Rubi&amp;#039;s antiderivative for this integral has a leaf-count of 25.&#xD;
Now compare Rubi&amp;#039;s antiderivative with that produced by Mathematica 11.3 for the same integral:&#xD;
&#xD;
    Integrate[(Sec[x]^2 + Sec[x]^2*Tan[x])/((2 - Tan[x])*Sqrt[1 + Tan[x]^3]), x]&#xD;
&#xD;
![enter image description here][5]&#xD;
&#xD;
    LeafCount[%]&#xD;
    (*  290 *)&#xD;
&#xD;
Note that not only is Mathematica&amp;#039;s result more than 11 times the size of Rubi&amp;#039;s, it unnecessarily involves elliptic integral functions *and* the imaginary unit.&#xD;
&#xD;
Skeptics might be inclined to ask if Rubi&amp;#039;s dramatically simpler result is actually a valid antiderivative.&#xD;
Since symbolic differentiation is much easier than integration, antiderivatives can be verified correct by seeing if its derivative equals the original integrand as follows:&#xD;
&#xD;
    expr = (Sec[x]^2 + Sec[x]^2*Tan[x])/((2 - Tan[x])*Sqrt[1 + Tan[x]^3]);&#xD;
    FullSimplify[D[Int[expr, x], x] == expr]&#xD;
    FullSimplify[D[Integrate[expr, x], x] == expr]&#xD;
&#xD;
![enter image description here][6]&#xD;
&#xD;
As you can see Mathematica easily verifies Rubi&amp;#039;s antiderivative correct, but has a hard time verifying its own antiderivative correct...&#xD;
&#xD;
Albert and I are working on publishing the program used to thoroughly test each new version of Rubi before being released.&#xD;
The test program ensures Rubi&amp;#039;s result equals the optimal antiderivative for the over 71000 problems in the test-suite.&#xD;
And yes, the optimal antiderivatives have all been verified correct by differentiation.&#xD;
&#xD;
Of course, the optimal antiderivatives stored in the test-suite are actually just the simplest ones found so far.&#xD;
If you should find a substantially simpler antiderivative than the one in the test-suite, please report it so the test-suite can be made even harder on Rubi!&#xD;
&#xD;
If all that has got you interested in joining Rubi&amp;#039;s community of users, check out its website or talk to us in our [Gitter chatroom](https://gitter.im/Rule-Based-Integration/Lobby).&#xD;
&#xD;
&#xD;
  [1]: https://community.wolfram.com//c/portal/getImageAttachment?filename=10564sSs5M.png&amp;amp;userId=11733&#xD;
  [2]: https://community.wolfram.com//c/portal/getImageAttachment?filename=qDtIH.png&amp;amp;userId=11733&#xD;
  [3]: https://community.wolfram.com//c/portal/getImageAttachment?filename=vQ4GR.png&amp;amp;userId=11733&#xD;
  [4]: https://community.wolfram.com//c/portal/getImageAttachment?filename=43t8e.png&amp;amp;userId=11733&#xD;
  [5]: https://community.wolfram.com//c/portal/getImageAttachment?filename=xjKTJ.png&amp;amp;userId=11733&#xD;
  [6]: https://community.wolfram.com//c/portal/getImageAttachment?filename=eCoWB.png&amp;amp;userId=11733</description>
    <dc:creator>Patrick Scheibe</dc:creator>
    <dc:date>2018-08-24T02:50:37Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/866748">
    <title>Facing your data with Chernoff faces</title>
    <link>https://community.wolfram.com/groups/-/m/t/866748</link>
    <description>## Introduction&#xD;
&#xD;
This post describes the use of face-like diagrams to visualize multidimensional data introduced by Herman Chernoff in 1973, see [1].&#xD;
&#xD;
The idea to use human faces in order to understand, evaluate, or easily discern (the records of) multidimensional data is very creative and inspirational. As Chernoff says in [1], the object of the idea is to &amp;#034;represent multivariate data, subject to strong but possibly complex relationships, in such a way that an investigator can quickly comprehend relevant information and then apply appropriate statistical analysis.&amp;#034; It is an interesting question how useful this approach is and it seems that there at least several articles discussing that; see for example [2].&#xD;
&#xD;
I personally find the use of Chernoff faces useful in a small number of cases, but that is probably true for many &amp;#034;creative&amp;#034; data visualization methods.&#xD;
&#xD;
Below are given both simple and more advanced examples of constructing Chernoff faces for data records using the *Mathematica* package [3]. The considered data is categorized as:&#xD;
&#xD;
1. a small number of records, each with small number of elements;&#xD;
2. a large number of records, each with less elements than Chernoff face parts;&#xD;
3. a list of long records, each record with much more elements than Chernoff face parts;&#xD;
4. a list of nearest neighbors or recommendations.&#xD;
&#xD;
For several of the visualizing scenarios the records of two &amp;#034;real life&amp;#034; data sets are used: Fisher Iris flower dataset [7], and &amp;#034;Vinho Verde&amp;#034; wine quality dataset [8]. For the rest of the scenarios the data is generated.&#xD;
&#xD;
A fundamental restriction of using Chernoff faces is the necessity to properly transform the data variables into the ranges of the Chernoff face diagram parameters. Therefore, proper data transformation (standadizing and rescaling) is an inherent part of the application of Chernoff faces, and this document describes such data transformation procedures (also using [3]).&#xD;
&#xD;
### Package load&#xD;
&#xD;
The packages [3,4] are used to produce the diagrams in this post. The following two commands load them.&#xD;
&#xD;
    Import[&amp;#034;https://raw.githubusercontent.com/antononcube/\&#xD;
    MathematicaForPrediction/master/ChernoffFaces.m&amp;#034;]&#xD;
&#xD;
    Import[&amp;#034;https://raw.githubusercontent.com/antononcube/\&#xD;
    MathematicaForPrediction/master/MathematicaForPredictionUtilities.m&amp;#034;]&#xD;
&#xD;
### Mirror&#xD;
This Community post mirrors the blog post [&amp;#034;Making Chernoff faces for data visualization&amp;#034;](https://mathematicaforprediction.wordpress.com/2016/06/03/making-chernoff-faces-for-data-visualization/).&#xD;
&#xD;
## Making faces&#xD;
&#xD;
### Just a face&#xD;
&#xD;
Here is a face produced by the function `ChernoffFace` of [3] with its simplest signature:&#xD;
&#xD;
    SeedRandom[152092]&#xD;
    ChernoffFace[]&#xD;
&#xD;
[![JustAFace](http://i.imgur.com/PIcrIcKm.gif)](http://i.imgur.com/PIcrIcK.gif)&#xD;
&#xD;
Here is a list of faces:&#xD;
&#xD;
    SeedRandom[152092]&#xD;
    Table[ChernoffFace[ImageSize -&amp;gt; Tiny], {7}]&#xD;
&#xD;
[![ ](http://i.imgur.com/SPWgX0r.gif)](http://i.imgur.com/SPWgX0r.gif)&#xD;
&#xD;
### Proper face making&#xD;
&#xD;
The &amp;#034;proper&amp;#034; way to call ChernoffFace is to use an association for the facial parts placement, size, rotation, and color. The options are passed to Graphics.&#xD;
&#xD;
    SeedRandom[2331];&#xD;
    ChernoffFace[ AssociationThread[&#xD;
        Keys[ChernoffFace[&amp;#034;FacePartsProperties&amp;#034;]] -&amp;gt; &#xD;
       RandomReal[1, Length[ChernoffFace[&amp;#034;FacePartsProperties&amp;#034;]]]],&#xD;
       ImageSize -&amp;gt; Small , Background -&amp;gt; GrayLevel[0.85]]&#xD;
&#xD;
[![ ](http://i.imgur.com/wY3bgKCm.gif)](http://i.imgur.com/wY3bgKC.gif)&#xD;
&#xD;
The Chernoff face drawn with the function `ChernoffFace` can be parameterized to be asymmetric.&#xD;
&#xD;
The parameters argument mixes (1) face parts placement, sizes, and rotation, with (2) face parts colors and (3) a parameter should it be attempted to make the face symmetric. All facial parts parameters have the range [0,1]&#xD;
&#xD;
Here is the facial parameter list:&#xD;
&#xD;
    Keys[ChernoffFace[&amp;#034;FacePartsProperties&amp;#034;]]&#xD;
&#xD;
    (* {&amp;#034;FaceLength&amp;#034;, &amp;#034;ForheadShape&amp;#034;, &amp;#034;EyesVerticalPosition&amp;#034;, &amp;#034;EyeSize&amp;#034;, \&#xD;
		&amp;#034;EyeSlant&amp;#034;, &amp;#034;LeftEyebrowSlant&amp;#034;, &amp;#034;LeftIris&amp;#034;, &amp;#034;NoseLength&amp;#034;, \&#xD;
		&amp;#034;MouthSmile&amp;#034;, &amp;#034;LeftEyebrowTrim&amp;#034;, &amp;#034;LeftEyebrowRaising&amp;#034;, &amp;#034;MouthTwist&amp;#034;, \&#xD;
		&amp;#034;MouthWidth&amp;#034;, &amp;#034;RightEyebrowTrim&amp;#034;, &amp;#034;RightEyebrowRaising&amp;#034;, \&#xD;
		&amp;#034;RightEyebrowSlant&amp;#034;, &amp;#034;RightIris&amp;#034;} *)&#xD;
&#xD;
The order of the parameters is chosen to favor making symmetric faces when a list of random numbers is given as an argument, and to make it easier to discern the faces when multiple records are visualized. For experiments and discussion about which facial features bring better discern-ability see [2]. One of the conclusions of [2] is that eye size and eye brow slant are most decisive, followed by face size and shape.&#xD;
&#xD;
Here are the rest of the parameters (colors and symmetricity):&#xD;
&#xD;
    Complement[Keys[ChernoffFace[&amp;#034;Properties&amp;#034;]], &#xD;
     Keys[ChernoffFace[&amp;#034;FacePartsProperties&amp;#034;]]]&#xD;
&#xD;
    (* {&amp;#034;EyeBallColor&amp;#034;, &amp;#034;FaceColor&amp;#034;, &amp;#034;IrisColor&amp;#034;, &amp;#034;MakeSymmetric&amp;#034;, \&#xD;
		&amp;#034;MouthColor&amp;#034;, &amp;#034;NoseColor&amp;#034;} *)&#xD;
&#xD;
### Face coloring&#xD;
&#xD;
The following code make a row of faces by generating seven sequences of random numbers in $[0,1]$, each sequence with length the number of facial parameters. The face color is assigned randomly and the face color or a darker version of it is used as a nose color. If the nose color is the same as the face color the nose is going to be shown &amp;#034;in profile&amp;#034;, otherwise as a filled polygon. The colors of the irises are random blend between light brown and light blue. The color of the mouth is randomly selected to be black or red.&#xD;
&#xD;
    SeedRandom[201894];&#xD;
    Block[{pars = Keys[ChernoffFace[&amp;#034;FacePartsProperties&amp;#034;]]},&#xD;
     Grid[{#}] &amp;amp;@&#xD;
      Table[ChernoffFace[Join[&#xD;
         AssociationThread[pars -&amp;gt; RandomReal[1, Length[pars]]],&#xD;
         &amp;lt;|&amp;#034;FaceColor&amp;#034; -&amp;gt; (rc = &#xD;
             ColorData[&amp;#034;BeachColors&amp;#034;][RandomReal[1]]),&#xD;
          &amp;#034;NoseColor&amp;#034; -&amp;gt; RandomChoice[{Identity, Darker}][rc],&#xD;
          &amp;#034;IrisColor&amp;#034; -&amp;gt; Lighter[Blend[{Brown, Blue}, RandomReal[1]]],&#xD;
          &amp;#034;MouthColor&amp;#034; -&amp;gt; RandomChoice[{Black, Red}]|&amp;gt;], &#xD;
        ImageSize -&amp;gt; 100], {7}]&#xD;
     ]&#xD;
&#xD;
[![ ](http://i.imgur.com/QN5Rhvfl.png)](http://i.imgur.com/QN5Rhvf.png)&#xD;
&#xD;
### Symmetric faces&#xD;
&#xD;
The parameter &amp;#034;MakeSymmetric&amp;#034; is by default `True`. Setting &amp;#034;MakeSymmetric&amp;#034; to true turns an incomplete face specification into a complete specification with the missing paired parameters filled in. In other words, the symmetricity is not enforced on the specified paired parameters, only on the ones for which specifications are missing.&#xD;
&#xD;
The following faces are made symmetric by removing the facial parts parameters that start with &amp;#034;R&amp;#034; (for &amp;#034;Right&amp;#034;) and the parameter &amp;#034;MouthTwist&amp;#034;. &#xD;
&#xD;
    SeedRandom[201894];&#xD;
    Block[{pars = Keys[ChernoffFace[&amp;#034;FacePartsProperties&amp;#034;]]},&#xD;
     Grid[{#}] &amp;amp;@Table[(&#xD;
        asc = &#xD;
         Join[AssociationThread[&#xD;
           pars -&amp;gt; RandomReal[1, Length[pars]]],&#xD;
          &amp;lt;|&amp;#034;FaceColor&amp;#034; -&amp;gt; (rc = &#xD;
              ColorData[&amp;#034;BeachColors&amp;#034;][RandomReal[1]]),&#xD;
           &amp;#034;NoseColor&amp;#034; -&amp;gt; RandomChoice[{Identity, Darker}][rc],&#xD;
           &amp;#034;IrisColor&amp;#034; -&amp;gt; &#xD;
            Lighter[Blend[{Brown, Blue}, RandomReal[1]]],&#xD;
           &amp;#034;MouthColor&amp;#034; -&amp;gt; RandomChoice[{Black, Red}]|&amp;gt;];&#xD;
        asc = &#xD;
         Pick[asc, &#xD;
          StringMatchQ[Keys[asc], &#xD;
           x : (StartOfString ~~ Except[&amp;#034;R&amp;#034;] ~~ __) /; &#xD;
            x != &amp;#034;MouthTwist&amp;#034;]];&#xD;
        ChernoffFace[asc, ImageSize -&amp;gt; 100]), {7}]]&#xD;
&#xD;
[![ ](http://i.imgur.com/7J7vl12l.png)](http://i.imgur.com/7J7vl12.png)&#xD;
&#xD;
Note that for the irises we have two possibilities of synchronization:&#xD;
&#xD;
    pars = &amp;lt;|&amp;#034;LeftIris&amp;#034; -&amp;gt; 0.8, &amp;#034;IrisColor&amp;#034; -&amp;gt; Green|&amp;gt;;&#xD;
    {ChernoffFace[Join[pars, &amp;lt;|&amp;#034;RightIris&amp;#034; -&amp;gt; pars[&amp;#034;LeftIris&amp;#034;]|&amp;gt;], &#xD;
      ImageSize -&amp;gt; 100], &#xD;
     ChernoffFace[&#xD;
      Join[pars, &amp;lt;|&amp;#034;RightIris&amp;#034; -&amp;gt; 1 - pars[&amp;#034;LeftIris&amp;#034;]|&amp;gt;], &#xD;
      ImageSize -&amp;gt; 100]}&#xD;
&#xD;
[![ ](http://i.imgur.com/8i16NUgl.gif)](http://i.imgur.com/8i16NUg.gif)&#xD;
&#xD;
## Visualizing records (first round)&#xD;
&#xD;
The conceptually straightforward application of Chernoff faces is to visualize (&amp;#034;give a face&amp;#034; to) each record in a dataset. Because the parameters of the faces have the same ranges for the different records, proper rescaling of the records have to be done first. Of course standardizing the data can be done before rescaling.&#xD;
&#xD;
First let us generate some random data using different distributions:&#xD;
&#xD;
    SeedRandom[3424]&#xD;
    {dists, data} = Transpose@Table[(&#xD;
         rdist = &#xD;
          RandomChoice[{NormalDistribution[RandomReal[10], &#xD;
             RandomReal[10]], PoissonDistribution[RandomReal[4]], &#xD;
            GammaDistribution[RandomReal[{2, 6}], 2]}];&#xD;
         {rdist, RandomVariate[rdist, 12]}), {10}];&#xD;
    data = Transpose[data];&#xD;
&#xD;
The data is generated in such a way that each column comes from a certain probability distribution. Hence, each record can be seen as an observation of the variables corresponding to the columns.&#xD;
&#xD;
This is how the **columns** of the generated data look like using `DistributionChart`:&#xD;
&#xD;
    DistributionChart[Transpose[data], &#xD;
     ChartLabels -&amp;gt; &#xD;
      Placed[MapIndexed[&#xD;
        Grid[List /@ {Style[#2[[1]], Bold, Red, Larger]}] &amp;amp;, dists], Above], &#xD;
     ChartElementFunction -&amp;gt; &amp;#034;PointDensity&amp;#034;, &#xD;
     ChartStyle -&amp;gt; &amp;#034;SandyTerrain&amp;#034;, ChartLegends -&amp;gt; dists, &#xD;
     BarOrigin -&amp;gt; Bottom, GridLines -&amp;gt; Automatic, &#xD;
     ImageSize -&amp;gt; 900]&#xD;
&#xD;
[![ ](http://i.imgur.com/iXQfzZGl.gif)](http://i.imgur.com/iXQfzZG.gif)&#xD;
&#xD;
At this point we can make a face for each **record** of the rescaled data:&#xD;
&#xD;
    faces = Map[ChernoffFace, Transpose[Rescale /@ Transpose[data]]];&#xD;
&#xD;
and visualize the obtained faces in a grid.&#xD;
&#xD;
    Row[{Grid[&#xD;
       Partition[#, 4] &amp;amp;@Map[Append[#, ImageSize -&amp;gt; 100] &amp;amp;, faces]],&#xD;
      &amp;#034;   &amp;#034;, Magnify[#, 0.85] &amp;amp;@&#xD;
       GridTableForm[&#xD;
        List /@ Take[Keys[ChernoffFace[&amp;#034;FacePartsProperties&amp;#034;]], &#xD;
          Dimensions[data][[2]]], &#xD;
        TableHeadings -&amp;gt; {&amp;#034;Face part&amp;#034;}]&#xD;
      }]&#xD;
&#xD;
[![ ](http://i.imgur.com/LMTsbCfl.gif)](http://i.imgur.com/LMTsbCf.gif)&#xD;
&#xD;
(The table on the right shows which facial parts are used for which data columns.)&#xD;
&#xD;
## Some questions to consider&#xD;
&#xD;
Several questions and observations arise from the example in the previous section. &#xD;
&#xD;
#### 1. What should we do if the data records have more elements than facial parts parameters of the Chernoff face diagram?&#xD;
&#xD;
This is another fundamental restriction of Chernoff faces -- the number of data columns is limiter by the number of facial features.&#xD;
&#xD;
One way to resolve this is to select important variables (columns) of the data; another is to represent the records with a vector of statistics. The latter is shown in the section &amp;#034;Chernoff faces for lists of long lists&amp;#034;.&#xD;
&#xD;
#### 2. Are there Chernoff face parts that are easier to perceive or judge than others and provide better discern-ability for large collections of records?&#xD;
&#xD;
Research of the [pre-attentiveness](https://en.wikipedia.org/wiki/Pre-attentive_processing) and effectiveness with Chernoff faces, [2], shows that eye size and eyebrow slant are the features that provide best discern-ability. Below this is used to select some of the variable-to-face-part correspondences. &#xD;
&#xD;
#### 3. How should we deal with outliers?&#xD;
&#xD;
Since we cannot just remove the outliers from a record -- we have to have complete records -- we can simply replace the outliers with the minimum or maximum values allowed for the corresponding Chernoff face feature. (All facial features of `ChernoffFace` have the range $[0,1]$.) See the next section for an example.&#xD;
&#xD;
## Data standardizing and rescaling&#xD;
&#xD;
Given a full array of records, we most likely have to standardize and rescale the columns in order to use the function `ChernoffFace`. To help with that the package [3] provides the function `VariablesRescale` which has the options &amp;#034;StandardizingFunction&amp;#034; and &amp;#034;RescaleRangeFunction&amp;#034;.&#xD;
&#xD;
Consider the following example of `VariableRescale` invocation in which:&#xD;
1. each column is centered around its median and then divided by the inter-quartile half-distance (quartile deviation),&#xD;
2. followed by clipping of the outliers that are outside of the disk with radius 3 times the quartile deviation, and&#xD;
3. rescaling to the unit interval.&#xD;
&#xD;
    rdata = VariablesRescale[N@data,&#xD;
       &amp;#034;StandardizingFunction&amp;#034; -&amp;gt; (Standardize[#, Median, QuartileDeviation] &amp;amp;),&#xD;
       &amp;#034;RescaleRangeFunction&amp;#034; -&amp;gt; ({-3, 3} QuartileDeviation[#] &amp;amp;)];&#xD;
    TableForm[rdata /. {0 -&amp;gt; Style[0, Bold, Red], 1 -&amp;gt; Style[1, Bold, Red]}]&#xD;
&#xD;
[![ ](http://i.imgur.com/LdhvQJMl.png)](http://i.imgur.com/LdhvQJM.png)&#xD;
&#xD;
**Remark:** The bottom outliers are replaced with 0 and the top outliers with 1 using `Clip`.&#xD;
&#xD;
## Chernoff faces for a small number of short records&#xD;
&#xD;
In this section we are going use the Fisher Iris flower data set [7]. By &amp;#034;small number of records&amp;#034; we mean few hundred or less.&#xD;
&#xD;
### Getting the data&#xD;
&#xD;
These commands get the Fisher Iris flower data set shipped with *Mathematica*:&#xD;
&#xD;
    irisDataSet = &#xD;
      Map[Flatten, &#xD;
       List @@@ ExampleData[{&amp;#034;MachineLearning&amp;#034;, &amp;#034;FisherIris&amp;#034;}, &amp;#034;Data&amp;#034;]];&#xD;
    irisColumnNames = &#xD;
      Most@Flatten[&#xD;
        List @@ ExampleData[{&amp;#034;MachineLearning&amp;#034;, &amp;#034;FisherIris&amp;#034;}, &#xD;
          &amp;#034;VariableDescriptions&amp;#034;]];&#xD;
    Dimensions[irisDataSet]&#xD;
&#xD;
    (* {150, 5} *)&#xD;
&#xD;
Here is a summary of the data:&#xD;
&#xD;
    Grid[{RecordsSummary[irisDataSet, irisColumnNames]}, &#xD;
     Dividers -&amp;gt; All, Alignment -&amp;gt; Top]&#xD;
&#xD;
[![ ](http://i.imgur.com/upxeRHvl.png)](http://i.imgur.com/upxeRHv.png)&#xD;
&#xD;
### Simple variable dependency analysis&#xD;
&#xD;
Using the function `VariableDependenceGrid` of the package [4] we can plot a grid of variable cross-dependencies. We can see from the last row and column that &amp;#034;Petal length&amp;#034; and &amp;#034;Petal width&amp;#034; separate setosa from versicolor and virginica with a pretty large gap.&#xD;
&#xD;
    Magnify[#, 1] &amp;amp;@&#xD;
     VariableDependenceGrid[irisDataSet, irisColumnNames, &#xD;
      &amp;#034;IgnoreCategoricalVariables&amp;#034; -&amp;gt; False]&#xD;
&#xD;
[![ ](http://i.imgur.com/vJA6kthl.png)](http://i.imgur.com/vJA6kth.png)&#xD;
&#xD;
### Chernoff faces for Iris flower records&#xD;
&#xD;
Since we want to evaluate the usefulness of Chernoff faces for discerning data records groups or clusters, we are going to do the following steps.&#xD;
&#xD;
1. Data transformation. This includes standardizing and rescaling and selection of colors.&#xD;
2. Make a Chernoff face for each record **without** the label class &amp;#034;Species of iris&amp;#034;.&#xD;
3. Plot shuffled Chernoff faces and attempt to visually cluster them or find patterns.&#xD;
4. Make a Chernoff face for each record using the label class &amp;#034;Specie of iris&amp;#034; to color the faces. (Records of the same class get faces of the same color.)&#xD;
5. Compare the plots and conclusions of step 2 and 4.&#xD;
&#xD;
#### 1. Data transformation&#xD;
&#xD;
First we standardize and rescale the data:&#xD;
&#xD;
    chernoffData = VariablesRescale[irisDataSet[[All, 1 ;; 4]]];&#xD;
&#xD;
These are the colors used for the different species of iris:&#xD;
&#xD;
    faceColorRules = &#xD;
     Thread[Union[ irisDataSet[[All, -1]]] \&#xD;
     -&amp;gt; Map[Lighter[#, 0.5] &amp;amp;, {Purple, Blue, Green}]]&#xD;
&#xD;
    (* {&amp;#034;setosa&amp;#034; -&amp;gt; RGBColor[0.75, 0.5, 0.75], &#xD;
        &amp;#034;versicolor&amp;#034; -&amp;gt; RGBColor[0.5, 0.5, 1.], &#xD;
        &amp;#034;virginica&amp;#034; -&amp;gt; RGBColor[0.5, 1., 0.5]} *)&#xD;
&#xD;
Add the colors to the data for the faces:&#xD;
&#xD;
    chernoffData = MapThread[&#xD;
       Append, {chernoffData, irisDataSet[[All, -1]] /. faceColorRules}];&#xD;
&#xD;
Plot the distributions of the rescaled variables:&#xD;
&#xD;
    DistributionChart[&#xD;
     Transpose@chernoffData[[All, 1 ;; 4]], &#xD;
     GridLines -&amp;gt; Automatic, &#xD;
     ChartElementFunction -&amp;gt; &amp;#034;PointDensity&amp;#034;, &#xD;
     ChartStyle -&amp;gt; &amp;#034;SandyTerrain&amp;#034;, &#xD;
     ChartLegends -&amp;gt; irisColumnNames, ImageSize -&amp;gt; Large]&#xD;
&#xD;
[![ ](http://i.imgur.com/rwm71tnm.gif)](http://i.imgur.com/rwm71tn.gif)&#xD;
&#xD;
#### 2. Black-and-white Chernoff faces&#xD;
&#xD;
Make a black-and-white Chernoff face for each record without using the species class:&#xD;
&#xD;
    chfacesBW = &#xD;
      ChernoffFace[&#xD;
         AssociationThread[{&amp;#034;NoseLength&amp;#034;, &amp;#034;LeftEyebrowTrim&amp;#034;, &amp;#034;EyeSize&amp;#034;, &#xD;
            &amp;#034;LeftEyebrowSlant&amp;#034;} -&amp;gt; Most[#]], &#xD;
         ImageSize -&amp;gt; 100] &amp;amp; /@ chernoffData;&#xD;
&#xD;
Since &amp;#034;Petal length&amp;#034; and &amp;#034;Petal width&amp;#034; separate the classes well for those columns we have selected the parameters &amp;#034;EyeSize&amp;#034; and &amp;#034;LeftEyebrowSlant&amp;#034; based on [2].&#xD;
&#xD;
#### 3. Finding patterns in a collection of faces&#xD;
&#xD;
Combine the faces into a image collage:&#xD;
&#xD;
    ImageCollage[RandomSample[chfacesBW], Background -&amp;gt; White]&#xD;
&#xD;
[![ ](http://i.imgur.com/zmBSQZRl.gif)](http://i.imgur.com/zmBSQZR.gif)&#xD;
&#xD;
We can see that faces with small eyes tend have middle-lowered eyebrows, and that faces with large eyes tend to have middle raised eyebrows and large noses.&#xD;
&#xD;
#### 4. Chernoff faces colored by the species&#xD;
&#xD;
Make a Chernoff face for each record using the colors added to the rescaled data:&#xD;
&#xD;
    chfaces = &#xD;
      ChernoffFace[&#xD;
         AssociationThread[{&amp;#034;NoseLength&amp;#034;, &amp;#034;LeftEyebrowTrim&amp;#034;, &amp;#034;EyeSize&amp;#034;, &#xD;
            &amp;#034;LeftEyebrowSlant&amp;#034;, &amp;#034;FaceColor&amp;#034;} -&amp;gt; #], &#xD;
         ImageSize -&amp;gt; 100] &amp;amp; /@ chernoffData;&#xD;
&#xD;
Make an image collage with the obtained faces:&#xD;
&#xD;
    ImageCollage[chfaces, Background -&amp;gt; White]&#xD;
&#xD;
[![ ](http://i.imgur.com/uPBZJufl.gif)](http://i.imgur.com/uPBZJuf.gif)&#xD;
&#xD;
#### 5. Comparison&#xD;
&#xD;
We can see that the collage with colored faces completely explains the patterns found in the black-and-white faces: setosa have smaller petals (both length and width), and virginica have larger petals.&#xD;
&#xD;
## Browsing a large number of records with Chernoff faces&#xD;
&#xD;
If we have a large number of records each comprised of a relative small number of numerical values we can use Chernoff faces to browse the data by taking small subsets of records.&#xD;
&#xD;
Here is an example using &amp;#034;Vinho Verde&amp;#034; wine quality dataset [8].&#xD;
&#xD;
[![ ](http://i.imgur.com/jDwXgfTl.png)](http://i.imgur.com/jDwXgfT.png)&#xD;
&#xD;
[![ ](http://i.imgur.com/ZOqwuFTl.png)](http://i.imgur.com/ZOqwuFT.png)&#xD;
&#xD;
## Chernoff faces for lists of long lists&#xD;
&#xD;
In this section we consider data that is a list of lists. Each of the lists (or rows) is fairly long and represents values of the same variable or process. If the data is a full array, then we can say that in this section we deal with transposed versions of the data in the previous sections.&#xD;
&#xD;
Since each row is a list of many elements visualizing the rows directly with Chernoff faces would mean using a small fraction of the data. A natural approach in those situations is to summarize each row with a set of descriptive statistics and use Chernoff faces for the row summaries. &#xD;
&#xD;
The process is fairly straightforward; the rest of the section gives concrete code steps of executing it.&#xD;
&#xD;
### Data generation&#xD;
&#xD;
Here we create 12 rows of 200 elements by selecting a probability distribution for each row.&#xD;
&#xD;
    SeedRandom[1425]&#xD;
    {dists, data} = Transpose@Table[(&#xD;
         rdist = &#xD;
          RandomChoice[{NormalDistribution[RandomReal[10], &#xD;
             RandomReal[10]], PoissonDistribution[RandomReal[4]], &#xD;
            GammaDistribution[RandomReal[{2, 6}], 2]}];&#xD;
         {rdist, RandomVariate[rdist, 200]}), {12}];&#xD;
    Dimensions[data]&#xD;
&#xD;
    (* {12, 200} *)&#xD;
&#xD;
We have the following 12 &amp;#034;records&amp;#034; each with 200 &amp;#034;fields&amp;#034;:&#xD;
&#xD;
    DistributionChart[data, &#xD;
     ChartLabels -&amp;gt; &#xD;
      MapIndexed[&#xD;
       Row[{Style[#2[[1]], Red, Larger],&#xD;
	        &amp;#034;  &amp;#034;, Style[#1, Larger]}] &amp;amp;, dists], &#xD;
     ChartElementFunction -&amp;gt; &#xD;
      ChartElementData[&amp;#034;PointDensity&amp;#034;, &#xD;
       &amp;#034;ColorScheme&amp;#034; -&amp;gt; &amp;#034;SouthwestColors&amp;#034;], BarOrigin -&amp;gt; Left, &#xD;
     GridLines -&amp;gt; Automatic, ImageSize -&amp;gt; 1000]&#xD;
&#xD;
[![ ](http://i.imgur.com/HJWZo6Tl.gif)](http://i.imgur.com/HJWZo6T.gif)&#xD;
&#xD;
Here is the summary of the records:&#xD;
&#xD;
    Grid[ArrayReshape[RecordsSummary[Transpose@N@data], {3, 4}], &#xD;
     Dividers -&amp;gt; All, Alignment -&amp;gt; {Left}]&#xD;
&#xD;
[![ ](http://i.imgur.com/HmIUX0dl.png)](http://i.imgur.com/HmIUX0d.png)&#xD;
&#xD;
### Data transformation&#xD;
&#xD;
Here we &amp;#034;transform&amp;#034; each row into a vector of descriptive statistics:&#xD;
&#xD;
    statFuncs = {Mean, StandardDeviation, Kurtosis, Median, &#xD;
       QuartileDeviation, PearsonChiSquareTest};&#xD;
    sdata = Map[Through[statFuncs[#]] &amp;amp;, data];&#xD;
    Dimensions[sdata]&#xD;
&#xD;
    (* {12, 6} *)&#xD;
&#xD;
&#xD;
Next we rescale the descriptive statistics data:&#xD;
&#xD;
    sdata = VariablesRescale[sdata, &#xD;
       &amp;#034;StandardizingFunction&amp;#034; -&amp;gt; (Standardize[#, Median, QuartileDeviation] &amp;amp;)];&#xD;
&#xD;
For kurtosis we have to do special rescaling if we want to utilize the property that Gaussian processes have kurtosis 3:&#xD;
&#xD;
    sdata[[All, 3]] = &#xD;
      Rescale[#, {3, Max[#]}, {0.5, 1}] &amp;amp;@Map[Kurtosis, N[data]];&#xD;
&#xD;
Here is the summary of the columns of the rescaled descriptive statistics array:&#xD;
&#xD;
    Grid[{RecordsSummary[sdata, ToString /@ statFuncs]}, Dividers -&amp;gt; All]&#xD;
&#xD;
[![ ](http://i.imgur.com/SHbLThql.png)](http://i.imgur.com/SHbLThq.png)&#xD;
&#xD;
### Visualization&#xD;
&#xD;
First we define a function that computes and tabulates (descriptive) statistics over a record.&#xD;
&#xD;
    Clear[TipTable]&#xD;
    TipTable[vec_, statFuncs_, faceParts_] :=&#xD;
      Block[{},&#xD;
        GridTableForm[&#xD;
         Transpose@{faceParts, statFuncs, &#xD;
           NumberForm[Chop[#], 2] &amp;amp; /@ Through[statFuncs[vec]]}, &#xD;
         TableHeadings -&amp;gt; {&amp;#034;FacePart&amp;#034;, &amp;#034;Statistic&amp;#034;, &amp;#034;Value&amp;#034;}]] /; &#xD;
       Length[statFuncs] == Length[faceParts];&#xD;
&#xD;
To visualize the descriptive statistics of the records using Chernoff faces we have to select appropriate facial features.&#xD;
&#xD;
    faceParts = {&amp;#034;NoseLength&amp;#034;, &amp;#034;EyeSize&amp;#034;, &amp;#034;EyeSlant&amp;#034;, &#xD;
       &amp;#034;EyesVerticalPosition&amp;#034;, &amp;#034;FaceLength&amp;#034;, &amp;#034;MouthSmile&amp;#034;};&#xD;
    TipTable[First@sdata, statFuncs, faceParts]&#xD;
&#xD;
[![ ](http://i.imgur.com/bEOFgXHl.png)](http://i.imgur.com/bEOFgXH.png)&#xD;
&#xD;
One possible visualization of all records is with the following commands. Note the addition of the parameter &amp;#034;FaceColor&amp;#034; to also represent how close a standardized row is to a sample from Normal Distribution.&#xD;
&#xD;
    {odFaceColor, ndFaceColor} = {White,  ColorData[7, &amp;#034;ColorList&amp;#034;][[8]]};&#xD;
    Grid[ArrayReshape[Flatten@#, {4, 3}, &amp;#034;&amp;#034;], Dividers -&amp;gt; All, &#xD;
       Alignment -&amp;gt; {Left, Top}] &amp;amp;@&#xD;
     MapThread[&#xD;
      (asc = AssociationThread[faceParts -&amp;gt; #2];&#xD;
        chFace = &#xD;
         ChernoffFace[&#xD;
          Join[asc, &amp;lt;|&#xD;
            &amp;#034;FaceColor&amp;#034; -&amp;gt; Blend[{odFaceColor, ndFaceColor}, #2[[-1]]], &#xD;
            &amp;#034;IrisColor&amp;#034; -&amp;gt; GrayLevel[0.8], &#xD;
            &amp;#034;NoseColor&amp;#034; -&amp;gt; ndFaceColor|&amp;gt;], ImageSize -&amp;gt; 120, &#xD;
          AspectRatio -&amp;gt; Automatic];&#xD;
        tt = TipTable[N@#3, Join[statFuncs, {Last@statFuncs}], &#xD;
          Join[faceParts, {&amp;#034;FaceColor&amp;#034;}]];&#xD;
        Column[{Style[#1, Red], &#xD;
          Grid[{{Magnify[#4, 0.8], &#xD;
             Tooltip[chFace, tt]}, {Magnify[tt, 0.7], SpanFromAbove}}, &#xD;
           Alignment -&amp;gt; {Left, Top}]}]) &amp;amp;&#xD;
      , {Range[Length[sdata]], sdata, data, dists}]&#xD;
&#xD;
[![ ](http://i.imgur.com/CGVbZck.png)](http://i.imgur.com/CGVbZck.png)&#xD;
&#xD;
## Visualizing similarity with nearest neighbors or recommendations &#xD;
&#xD;
### General idea&#xD;
&#xD;
Assume the following scenario: &#xD;
1. we have a set of items (movies, flowers, etc.), &#xD;
2. we have picked one item,&#xD;
3. we have computed the Nearest Neighbors (NNs) of that item, and&#xD;
4. we want to visualize how much of a good fit the NNs are to the picked item.&#xD;
&#xD;
Conceptually we can translate the phrase &amp;#034;how good the found NNs (or&#xD;
recommendations) are&amp;#034; to:&#xD;
&#xD;
* &amp;#034;how similar the NNs are to the selected item&amp;#034;, or&#xD;
&#xD;
* &amp;#034;how different the NNs are to the selected item.&amp;#034;&#xD;
&#xD;
If we consider the picked item as the prototype of the most normal or central item then we can use Chernoff faces to visualize item&amp;#039;s NNs deviations. &#xD;
&#xD;
**Remark:** Note that Chernoff faces provide similarity visualization most linked to Euclidean distance that to other distances.&#xD;
&#xD;
### Concrete example&#xD;
&#xD;
The code in this section demonstrates how to visualize nearest neighbors by Chernoff faces variations.&#xD;
&#xD;
First we create a nearest neighbors finding function over the Fisher Iris data set (without the species class label):&#xD;
&#xD;
    irisNNFunc = &#xD;
     Nearest[irisDataSet[[All, 1 ;; -2]] -&amp;gt; Automatic, &#xD;
      DistanceFunction -&amp;gt; EuclideanDistance]&#xD;
&#xD;
Here are nearest neighbors of some random row from the data.&#xD;
&#xD;
    itemInd = 67;&#xD;
    nnInds = irisNNFunc[irisDataSet[[itemInd, 1 ;; -2]], 20];&#xD;
&#xD;
We can visualize the distances with of the obtained NNs with the prototype:&#xD;
&#xD;
    ListPlot[Map[&#xD;
      EuclideanDistance[#, irisDataSet[[itemInd, 1 ;; -2]]] &amp;amp;, &#xD;
      irisDataSet[[nnInds, 1 ;; -2]]]]&#xD;
&#xD;
[![ ](http://i.imgur.com/dnUlWSDm.gif)](http://i.imgur.com/dnUlWSD.gif)&#xD;
&#xD;
Next we subtract the prototype row from the NNs data rows, we&#xD;
standardize, and we rescale the interval $[ 0, 3 \sigma ]$ to $[ 0.5, 1 ]$:&#xD;
&#xD;
    snns = Transpose@Map[&#xD;
        Clip[Rescale[&#xD;
           Standardize[#, 0 &amp;amp;, StandardDeviation], {0, 3}, {0.5, 1}], {0, &#xD;
           1}] &amp;amp;,&#xD;
        Transpose@&#xD;
         Map[# - irisDataSet[[itemInd, 1 ;; -2]] &amp;amp;, &#xD;
          irisDataSet[[nnInds, 1 ;; -2]]]];&#xD;
&#xD;
Here is how the original NNs data row look like:&#xD;
&#xD;
    GridTableForm[&#xD;
     Take[irisDataSet[[nnInds]], 12], TableHeadings -&amp;gt; irisColumnNames]&#xD;
&#xD;
[![ ](http://i.imgur.com/7r6habkl.png)](http://i.imgur.com/7r6habk.png)&#xD;
&#xD;
And here is how the rescaled NNs data rows look like:&#xD;
&#xD;
    GridTableForm[Take[snns, 12], &#xD;
     TableHeadings -&amp;gt; Most[irisColumnNames]]&#xD;
&#xD;
[![ ](http://i.imgur.com/P7xnwR5l.png)](http://i.imgur.com/P7xnwR5.png)&#xD;
&#xD;
Next we make Chernoff faces for the rescaled rows and present them in a easier to grasp way. &#xD;
&#xD;
We use the face parts:&#xD;
&#xD;
    Take[Keys[ChernoffFace[&amp;#034;FacePartsProperties&amp;#034;]], 4]&#xD;
&#xD;
    (* {&amp;#034;FaceLength&amp;#034;, &amp;#034;ForheadShape&amp;#034;, &amp;#034;EyesVerticalPosition&amp;#034;, &amp;#034;EyeSize&amp;#034;} *)&#xD;
&#xD;
To make the face comparison easier, the first face is the one of the prototype, each Chernoff face is drawn within the same rectangular frame, and the NNs indices are added on top of the faces.&#xD;
&#xD;
    chfaces = &#xD;
      ChernoffFace[#, Frame -&amp;gt; True, &#xD;
         PlotRange -&amp;gt; {{-1, 1}, {-2, 1.5}}, FrameTicks -&amp;gt; False, &#xD;
         ImageSize -&amp;gt; 100] &amp;amp; /@ snns;&#xD;
    chfaces = &#xD;
      MapThread[&#xD;
       ReplacePart[#1, &#xD;
         1 -&amp;gt; &#xD;
          Append[#1[[1]], &#xD;
           Text[Style[#2, Bold, Red], {0, 1.4}]]] &amp;amp;, {chfaces, nnInds}];&#xD;
    ImageCollage[chfaces, Background -&amp;gt; GrayLevel[0.95]]&#xD;
&#xD;
[![ ](http://i.imgur.com/EKpJ7mjm.gif)](http://i.imgur.com/EKpJ7mj.gif)&#xD;
&#xD;
We can see that the first few - i.e. closest -- NNs have fairly normal looking faces.&#xD;
&#xD;
Note that using a large number of NNs would change the rescaled values and in that way the first NNs would appear more similar.&#xD;
&#xD;
## References&#xD;
&#xD;
\[1\] Herman Chernoff (1973). &amp;#034;The Use of Faces to Represent Points in K-Dimensional Space Graphically&amp;#034; (PDF). Journal of the American Statistical Association (American Statistical Association) 68 (342): 361-368. doi:10.2307/2284077. JSTOR 2284077. URL: [http://lya.fciencias.unam.mx/rfuentes/faces-chernoff.pdf](http://lya.fciencias.unam.mx/rfuentes/faces-chernoff.pdf) .&#xD;
&#xD;
\[2\] Christopher J. Morris; David S. Ebert; Penny L. Rheingans, &amp;#034;Experimental analysis of the effectiveness of features in Chernoff faces&amp;#034;, Proc. SPIE 3905, 28th AIPR Workshop: 3D Visualization for Data Exploration and Decision Making, (5 May 2000); doi: 10.1117/12.384865. URL: [http://www.research.ibm.com/people/c/cjmorris/publications/Chernoff_990402.pdf](http://www.research.ibm.com/people/c/cjmorris/publications/Chernoff_990402.pdf) .&#xD;
&#xD;
\[3\] Anton Antonov, [Chernoff Faces implementation in Mathematica](https://github.com/antononcube/MathematicaForPrediction/blob/master/ChernoffFaces.m), (2016), source code at [MathematicaForPrediction at GitHub](https://github.com/antononcube/MathematicaForPrediction), package [ChernofFacess.m](https://raw.githubusercontent.com/antononcube/MathematicaForPrediction/master/ChernoffFaces.m) .&#xD;
&#xD;
\[4\] Anton Antonov, [MathematicaForPrediction utilities](https://github.com/antononcube/MathematicaForPrediction/blob/master/MathematicaForPredictionUtilities.m), (2014), source code [MathematicaForPrediction at GitHub](https://github.com/antononcube/MathematicaForPrediction), package [MathematicaForPredictionUtilities.m](https://raw.githubusercontent.com/antononcube/MathematicaForPrediction/master/MathematicaForPredictionUtilities.m).&#xD;
&#xD;
\[5\] Anton Antonov, [Variable importance determination by classifiers implementation in Mathematica](https://github.com/antononcube/MathematicaForPrediction/blob/master/VariableImportanceByClassifiers.m)[, ](https://github.com/antononcube/MathematicaForPrediction/blob/master/IndependentComponentAnalysis.m)(2015), source code at [MathematicaForPrediction at GitHub](https://github.com/antononcube/MathematicaForPrediction), package [VariableImportanceByClassifiers.m](https://raw.githubusercontent.com/antononcube/MathematicaForPrediction/master/VariableImportanceByClassifiers.m).&#xD;
&#xD;
\[6\] Anton Antonov, [&amp;#034;Importance of variables investigation guide&amp;#034;](https://github.com/antononcube/MathematicaForPrediction/blob/master/Documentation/Importance-of-variables-investigation-guide.pdf), (2016),  [MathematicaForPrediction at GitHub](https://github.com/antononcube/MathematicaForPrediction), [https://github.com/antononcube/MathematicaForPrediction](https://github.com/antononcube/MathematicaForPrediction), folder [Documentation](https://github.com/antononcube/MathematicaForPrediction/tree/master/Documentation).&#xD;
&#xD;
\[7\] Wikipedia entry, Iris flower data set, [https://en.wikipedia.org/wiki/Iris_flower_data _set](https://en.wikipedia.org/wiki/Iris_flower_data_set) .&#xD;
&#xD;
\[8\] P. Cortez, A. Cerdeira, F. Almeida, T. Matos and J. Reis. Modeling wine preferences by data mining from physicochemical properties. In Decision Support Systems, Elsevier, 47(4):547-553, 2009. URL [https://archive.ics.uci.edu/ml/datasets/Wine+Quality](https://archive.ics.uci.edu/ml/datasets/Wine+Quality) .</description>
    <dc:creator>Anton Antonov</dc:creator>
    <dc:date>2016-06-03T02:17:45Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/2434669">
    <title>Date-related functions: revision and performance comparison</title>
    <link>https://community.wolfram.com/groups/-/m/t/2434669</link>
    <description>&amp;gt; *GitHub repository:* https://github.com/ben-izd/cDateFunctions&#xD;
&#xD;
&#xD;
Recently, I was working on an [infographic](https://mathematica.meta.stackexchange.com/a/2608/77079) which heavily involves working with dates and times. After using `DateObject` and some date-related functions, it surprises me how slow they are (in the context of tens of thousands of samples). So I decided to rewrite the main one (`DateDifference`) in Wolfram language. But after seeing the performance boost gained by rewriting, I decided to write some other functions too.  After a couple of months, I end up rewriting 19 functions in wolfram language and 9 in kernel-level (with Rust), in this post you&amp;#039;ll see the result and interesting points I discovered in this journey.&#xD;
&#xD;
&#xD;
&#xD;
Before we start, remember these notes:&#xD;
&#xD;
- Most of the implementations were done with minimum options, many of them do not support options that their built-in ones support (like `TimeZone`, `TimeSystem`, ...) and functions in the first section written in pure Wolfram language without using `Compile` or related functions&#xD;
&#xD;
- Default calendar is `&amp;#034;Gregorian&amp;#034;`, which doesn&amp;#039;t have year `0` (is also true for `&amp;#034;ArithmeticPersian&amp;#034;` calendar) unless it specified&#xD;
&#xD;
- In the &amp;#039;Possible Issues/Bugs + Suggestions&amp;#039; section order is not important, some of them relate to the design decisions that developers decided (it would be awesome to shed some light on them)&#xD;
&#xD;
- All the implementations have the same name with &amp;#039;c&amp;#039; added to start (`DayName` is `cDayName`, which has nothing to do with `C` language)&#xD;
&#xD;
- Some built-in functions were not `Listable`, which is understandable because of date formats like `DateList`, but some of my implementations are `Listable`&#xD;
&#xD;
- All the functions were tested with a wide range of random dates and numbers - Except some cases which will be discussed. The result of the functions with their built-in ones are equal. If you find any case with a wrong result, please comment it &#xD;
&#xD;
- Platform is Mathematica 13.0.0 for Microsoft Windows 10 20H2 (64-bit) on AMD Ryzen 1700 with 16 GB RAM with time-zone offset: +3.5&#xD;
&#xD;
- You can access the code in [GitHub](https://github.com/ben-izd/cDateFunctions) which also include the `LibraryLink` section (`DLL` files and their source code)&#xD;
&#xD;
&#xD;
# Performance Comparison&#xD;
&#xD;
Here are the result of comparing c* functions with their built-in ones in terms of timing (`RepeatedTiming` were used). Tested on different input formats and the number shown here is the floored average of the result.&#xD;
&#xD;
## LeapYearQ&#xD;
![LeapYearQ Comparison](https://i.imgur.com/aE13iXu.jpg)&#xD;
&#xD;
## DayName&#xD;
![DayName Comparison](https://i.imgur.com/o0zBlBI.jpg)&#xD;
&#xD;
## BusinessDayQ&#xD;
![BusinessDayQ Comparison](https://i.imgur.com/UL6Bu4n.jpg)&#xD;
&#xD;
## DayMatchQ&#xD;
![DayMatchQ Comparison](https://i.imgur.com/a4ttizZ.jpg)&#xD;
&#xD;
## DayRound&#xD;
![DayRound Comparison](https://i.imgur.com/F3pF3Uf.jpg)&#xD;
&#xD;
## DateBounds&#xD;
![DateBounds Comparison](https://i.imgur.com/1jhLjzx.jpg)&#xD;
&#xD;
## DateOverlapQ&#xD;
![DateOverlapQ Comparison](https://i.imgur.com/wgRiX8Q.jpg)&#xD;
&#xD;
## DateWithinQ&#xD;
![DateWithinQ Comparison](https://i.imgur.com/3EXUM7C.jpg)&#xD;
&#xD;
## DayCount&#xD;
![DayCount Comparison](https://i.imgur.com/yxec7yo.jpg)&#xD;
&#xD;
## CurrentDate&#xD;
![CurrentDate Comparison](https://i.imgur.com/Z0bfRwr.jpg)&#xD;
&#xD;
## NextDate&#xD;
![NextDate Comparison](https://i.imgur.com/vzFyzqC.jpg)&#xD;
&#xD;
## PreviousDate&#xD;
![PreviousDate Comparison](https://i.imgur.com/DGgCKhR.jpg)&#xD;
&#xD;
## DateDifference&#xD;
![DateDifference Comparison](https://i.imgur.com/JK3d1vW.jpg)&#xD;
&#xD;
## DayPlus&#xD;
![DayPlus Comparison](https://i.imgur.com/XSN1wMi.jpg)&#xD;
&#xD;
## DatePlus&#xD;
![DayPlus Comparison](https://i.imgur.com/TFL1xIt.jpg)&#xD;
![DayPlus Comparison](https://i.imgur.com/hycM3m8.jpg)&#xD;
&#xD;
## DayRangee&#xD;
![DayRange Comparison](https://i.imgur.com/rxGTFGR.jpg)&#xD;
&#xD;
## DateRange&#xD;
![DateRange Comparison](https://i.imgur.com/XaxUcDs.jpg)&#xD;
&#xD;
&#xD;
# Possible Issues/Bugs + Suggestions&#xD;
During testing and developing the code, I notice some strange/unexpected cases + some ideas which I&amp;#039;ll discuss for each function.&#xD;
&#xD;
## LeapYearQ&#xD;
&#xD;
&#xD;
### 1. `&amp;#034;ArithmeticPersian&amp;#034;` uses `&amp;#034;Gregorian&amp;#034;` formula&#xD;
&#xD;
With  `CalendarType -&amp;gt; &amp;#034;ArithmeticPersian&amp;#034;` input will be converted to `&amp;#034;Gregorian&amp;#034;` calendar and the result will be calculated like `CalendarType -&amp;gt; &amp;#034;Gregorian&amp;#034;` (note that they have different formulas):&#xD;
&#xD;
```&#xD;
LeapYearQ[{1403, 1, 1}, CalendarType -&amp;gt; &amp;#034;ArithmeticPersian&amp;#034;]&#xD;
(* Out: True *)&#xD;
&#xD;
LeapYearQ[{1403, 12, 1}, CalendarType -&amp;gt; &amp;#034;ArithmeticPersian&amp;#034;]&#xD;
(* Out: False *)&#xD;
```&#xD;
The reason for above results is that date `{1403, 1, 1}` in `&amp;#034;ArithmeticPersian&amp;#034;` is `{2024, 3, 20}` in `&amp;#034;Gregorian&amp;#034;` which is a leap year in `&amp;#034;Gregorian&amp;#034;` but `{1403, 12, 1}` fall into `{2025, 2, 19}` which is not a leap year, according to `&amp;#034;Gregorian&amp;#034;` calendar.&#xD;
&#xD;
More comprehensive test:&#xD;
&#xD;
```&#xD;
And @@ (&#xD;
  LeapYearQ[{#}, CalendarType -&amp;gt; &amp;#034;ArithmeticPersian&amp;#034;] ===&#xD;
     LeapYearQ[&#xD;
      CalendarConvert[&#xD;
       DateObject[{#}, CalendarType -&amp;gt; &amp;#034;ArithmeticPersian&amp;#034;], &#xD;
       &amp;#034;Gregorian&amp;#034;], CalendarType -&amp;gt; &amp;#034;Gregorian&amp;#034;] &amp;amp; /@ Range[1, 5000])&#xD;
&#xD;
(* Out: True *)&#xD;
```&#xD;
&#xD;
Note that in `&amp;#034;ArithmeticPersian&amp;#034;` leap year gap (which has different methods to calculate, Mathematica uses 2820 period) is 4 and sometimes 5 years which is different than `&amp;#034;Gregorian&amp;#034;`.&#xD;
&#xD;
## BusinessDayQ&#xD;
&#xD;
### 1. Handling `TimeObject` without raising any message (related to AbsoluteTime-1 problem)&#xD;
&#xD;
When using `TimeObject` in `BusinessDayQ`, it will be converted to a date and return a result! instead of raising an error:&#xD;
&#xD;
```&#xD;
DayName[]&#xD;
(* Out: Thursday *)&#xD;
&#xD;
BusinessDayQ[TimeObject[]]&#xD;
(* Out: True *)&#xD;
```&#xD;
&#xD;
## DayMatchQ&#xD;
&#xD;
### 1. Missing/displace Veterans Day&#xD;
&#xD;
Veterans Day which starts in 1938, on YYYY-11-11 except 1971-1978, which was on Oct 4th Monday [\[Source\]](https://www.timeanddate.com/holidays/us/veterans-day). Considering observed holidays (holiday fall on Saturday/Sunday the day before/after will be observed day), a holiday could be either the specified day or a day before or after.&#xD;
&#xD;
```&#xD;
Select[Range[1938, 2050], Not@Or[DayMatchQ[{#, 11, 10}, &amp;#034;Holiday&amp;#034;],&#xD;
    DayMatchQ[{#, 11, 11}, &amp;#034;Holiday&amp;#034;],&#xD;
    DayMatchQ[{#, 11, 12}, &amp;#034;Holiday&amp;#034;]] &amp;amp;]&#xD;
```&#xD;
&#xD;
Result:&#xD;
&#xD;
```&#xD;
{1939, 1940, 1944, 1950, 1961, 1967, 1972, 1978, 1989, 1995, 2000, 2006, 2017, 2023, 2028, 2034, 2045}&#xD;
```&#xD;
&#xD;
which if you apply `Differences`, we&amp;#039;ll get a pattern:&#xD;
&#xD;
```&#xD;
{1, 4, 6, 11, 6, 5, 6, 11, 6, 5, 6, 11, 6, 5, 6, 11}&#xD;
```&#xD;
&#xD;
Some years are missing the holiday and in the range of 1971-1978 it should not be on YYYY-11-11, but for some years it is.&#xD;
&#xD;
Correct result (use `cDayMatchQ` instead of `DayMatchQ`):&#xD;
&#xD;
```&#xD;
{1971, 1972, 1973, 1974, 1975, 1976, 1977}&#xD;
```&#xD;
&#xD;
Also, it misses some dates in the future [\[Source\]](https://www.timeanddate.com/calendar/?year=2045&amp;amp;country=1):&#xD;
&#xD;
```&#xD;
DayMatchQ[{2045, 11, 10}, &amp;#034;Holiday&amp;#034;]&#xD;
(* Out: False *)&#xD;
&#xD;
(* 1 day before/after also is not a holiday*)&#xD;
DayMatchQ[{2045, 11, 9}, &amp;#034;Holiday&amp;#034;]&#xD;
(* Out: False *)&#xD;
&#xD;
DayMatchQ[{2045, 11, 11}, &amp;#034;Holiday&amp;#034;]&#xD;
(* Out: False *)&#xD;
```&#xD;
&#xD;
### 2. Handling `TimeObject` (related to AbsoluteTime-1 problem)&#xD;
&#xD;
When using `TimeObject` in `DayMatchQ`, it will convert it to a date and return the result ! instead of raising an error:&#xD;
&#xD;
```&#xD;
DayName[]&#xD;
(* Out: Thursday *)&#xD;
&#xD;
DayMatchQ[TimeObject[], Thursday]&#xD;
(* Out: True*)&#xD;
```&#xD;
&#xD;
&#xD;
### 3. Documentation typo&#xD;
&#xD;
Based on [`DayMatchQ`](http://reference.wolfram.com/language/ref/DayMatchQ.html) documentation, default value for `DayMatchQ` is `All` while giving error to a single argument:&#xD;
&#xD;
```&#xD;
DayMatchQ[{2021, 11, 12}]&#xD;
```&#xD;
&#xD;
![Error image](https://i.imgur.com/WCp2Ijm.jpg)&#xD;
&#xD;
&#xD;
## DateWithinQ&#xD;
&#xD;
### 1. Does not support `DateList` format for input:&#xD;
&#xD;
The documentation notes that input should be `DateObject` of any calendar, it&amp;#039;s a good feature to support different calendars but what about `DateList` format? What&amp;#039;s the reason behind it? Is it much different from `DateDifference` which supports this format?&#xD;
&#xD;
```&#xD;
DateWithinQ[{2021}, {2021, 1}]&#xD;
```&#xD;
&#xD;
Also, it should be noted that a *Q function in this example returned an `Unevaluated` expression instead of a Boolean, is this a normal behavior?&#xD;
&#xD;
### 2. Returning `Unevaluated` expression without raising any message:&#xD;
&#xD;
```&#xD;
DateWithinQ[DateObject@{2020, 1, 1, 1, 1, 1}, DateObject@{2020, 1, 1}]&#xD;
```&#xD;
![ERROR IMAGE](https://i.imgur.com/FpfGpFr.jpg)&#xD;
&#xD;
## DayCount&#xD;
&#xD;
### 1. Round results&#xD;
&#xD;
If it&amp;#039;s a day and more than half, it adds one day, otherwise, it doesn&amp;#039;t (opposite of what documentation in `Properties &amp;amp; Relations` says, equal to the length of `DayRange` with some options).&#xD;
&#xD;
```&#xD;
DayCount[{2020, 1, 1}, {2020, 1, 1, 11}, All]&#xD;
(* Out: 0 *)&#xD;
&#xD;
DayCount[{2020, 1, 1}, {2020, 1, 1, 13}, All]&#xD;
(* Out: 1 *)&#xD;
```&#xD;
&#xD;
`cDayCount` returns 0 for both of the above cases.&#xD;
&#xD;
### 2. Wrong result in year 1&#xD;
&#xD;
```&#xD;
DayCount[{1, 12, 23}, {2, 3, 25}, &amp;#034;BeginningOfMonth&amp;#034;]&#xD;
(* Out: 13 *)&#xD;
```&#xD;
&#xD;
## NextDate&#xD;
&#xD;
### 1. Inconsistent behavior&#xD;
&#xD;
When using a granularity with an input that doesn&amp;#039;t have enough precision, on most of the types, the upper-bound will be used as a start date to find the next occurrences but not for weekdays (not exactly the upper-bound is used).&#xD;
&#xD;
```&#xD;
NextDate[{2020, 1}, &amp;#034;Day&amp;#034;]&#xD;
(* Out: DateObject[{2020,2,1}, &amp;#034;Day&amp;#034;, &amp;#034;Gregorian&amp;#034;, 3.5`] *)&#xD;
&#xD;
NextDate[{2020, 1}, Sunday]&#xD;
(* Out: DateObject[{2020,1,5}, &amp;#034;Day&amp;#034;, &amp;#034;Gregorian&amp;#034;, 3.5`] *)&#xD;
```&#xD;
Also, note that calendar type and time-zone offset was added to the output (input argument does not have those).&#xD;
&#xD;
&#xD;
### 2. Handling `TimeObject`&#xD;
&#xD;
`NextDate` support `TimeObject`. It can even give us the next `Day` of a `TimeObject`:&#xD;
&#xD;
```&#xD;
First@TimeObject[]&#xD;
(* Out: {15, 38, 31.} *)&#xD;
&#xD;
First@NextDate[TimeObject[], &amp;#034;Hour&amp;#034;]&#xD;
(* Out: {2021, 11, 14, 16} *)&#xD;
&#xD;
First@NextDate[TimeObject[], &amp;#034;Day&amp;#034;]&#xD;
(* Out: {2021, 11, 15} *)&#xD;
```&#xD;
&#xD;
`cNextDate` result:&#xD;
&#xD;
```&#xD;
{16}&#xD;
```&#xD;
&#xD;
### 3. Wrong result in year 1 or -1&#xD;
&#xD;
```&#xD;
DateList@NextDate[{1, 12, 1}, &amp;#034;BeginningOfMonth&amp;#034;]&#xD;
(* Out: {1, 2, 1, 0, 0, 0.} *)&#xD;
&#xD;
DateList@NextDate[{-1, 12, 1, 0, 0, 0}, &amp;#034;Quarter&amp;#034;]&#xD;
(* Out: {-1, 1, 1, 0, 0, 0.} *)&#xD;
```&#xD;
&#xD;
Correct result (`cNextDate`):&#xD;
&#xD;
```&#xD;
{2, 1, 1, 0, 0, 0.}&#xD;
&#xD;
{1, 1, 1, 0, 0, 0.}&#xD;
```&#xD;
&#xD;
### 4. Inconsistent keyword in documentation&#xD;
&#xD;
[`NextDate`](http://reference.wolfram.com/language/ref/NextDate.html) documentation uses `&amp;#034;MonthFirstDay&amp;#034;` and `&amp;#034;MonthLastDay&amp;#034;` instead of `&amp;#034;BeginningOfMonth&amp;#034;` and `&amp;#034;EndOfMonth&amp;#034;`.&#xD;
&#xD;
## DateDifference&#xD;
&#xD;
### 1. Type &amp;#034;quarter&amp;#034;/&amp;#034;Year&amp;#034; includes year 0&#xD;
&#xD;
As noted in the beginning, the `&amp;#034;Gregorian&amp;#034;` calendar in Mathematica doesn&amp;#039;t have year 0 but in these cases it does!&#xD;
&#xD;
```&#xD;
DateDifference[{-1, 9, 1}, {1, 9, 1}, &amp;#034;Quarter&amp;#034;]&#xD;
&#xD;
(* Out: Quantity[9.96739, &amp;#034;QuarterYears&amp;#034;] *)&#xD;
```&#xD;
&#xD;
Correct Result (using `cDateDifference`):&#xD;
&#xD;
```&#xD;
Quantity[4., &amp;#034;QuarterYears&amp;#034;]&#xD;
```&#xD;
&#xD;
How many quarters do you see in this picture?&#xD;
&#xD;
![ERROR IMAGE](https://i.imgur.com/eUXzNry.jpg)&#xD;
&#xD;
Another example:&#xD;
&#xD;
```&#xD;
DateDifference[{-1, 10, 1, 0, 0, 0}, {1, 1, 1, 0, 0, 0}, &amp;#034;Year&amp;#034;]&#xD;
&#xD;
(* Out: Quantity[1.74795, &amp;#034;Years&amp;#034;] *)&#xD;
```&#xD;
&#xD;
### 2. Slightly different result&#xD;
&#xD;
```&#xD;
DateDifference[{2020, 3, 5, 15}, {2020, 7, 15, 5}, &amp;#034;Week&amp;#034;]&#xD;
DateDifference[AbsoluteTime@{2020, 3, 5, 15}, AbsoluteTime@{2020, 7, 15, 5}, &amp;#034;Week&amp;#034;]&#xD;
```&#xD;
&#xD;
Result (see the last digits):&#xD;
&#xD;
```&#xD;
Quantity[18.797619047619047, &amp;#034;Weeks&amp;#034;]&#xD;
Quantity[18.797619047619044, &amp;#034;Weeks&amp;#034;]&#xD;
```&#xD;
&#xD;
`cDateDifference` returns the first result.&#xD;
The real decimal can be calculated manually, which is `67/84` or:&#xD;
&#xD;
```&#xD;
0.7976190476190476&#xD;
```&#xD;
&#xD;
### 3. Raise error for multiple units including `Decade` /`Century` / `Millennium`&#xD;
&#xD;
```&#xD;
DateDifference[{2020, 1, 5}, {2120, 1, 4}, &amp;#034;Decade&amp;#034;]&#xD;
DateDifference[{2020, 1, 5}, {2120, 1, 4}, {&amp;#034;Decade&amp;#034;, &amp;#034;Year&amp;#034;}]&#xD;
cDateDifference[{2020, 1, 5}, {2120, 1, 4}, {&amp;#034;Decade&amp;#034;, &amp;#034;Year&amp;#034;}]&#xD;
```&#xD;
![ERROR IMAGE](https://i.imgur.com/6dINWVa.jpg)&#xD;
&#xD;
## DayPlus&#xD;
&#xD;
### 1. Does not support `Week`&#xD;
&#xD;
It supports `&amp;#034;BeginningOfMonth&amp;#034;` and `&amp;#034;EndOfMonth&amp;#034;` but not `&amp;#034;Week&amp;#034;`:&#xD;
&#xD;
```&#xD;
DayPlus[{2020, 1, 1}, 1, &amp;#034;Week&amp;#034;]&#xD;
```&#xD;
&#xD;
![ERROR IMAGE](https://i.imgur.com/YLkmzPd.jpg)&#xD;
&#xD;
Possible with `cDayPlus`:&#xD;
&#xD;
```&#xD;
{2020, 1, 8}&#xD;
```&#xD;
&#xD;
## DatePlus&#xD;
&#xD;
### 1. Different results with Quantity and List&#xD;
&#xD;
```&#xD;
DatePlus[{2020, 1, 1}, {1, &amp;#034;Quarter&amp;#034;}]&#xD;
(* Out: {2020, 4, 1} *)&#xD;
&#xD;
DatePlus[{2020, 1, 1}, Quantity[1, &amp;#034;QuarterYears&amp;#034;]]&#xD;
(* Out: {2020, 4, 1, 12} *)&#xD;
```&#xD;
&#xD;
### 2. Odd Behavior with year 1&#xD;
&#xD;
```&#xD;
DatePlus[{1, 8, 15}, {3, &amp;#034;EndOfMonth&amp;#034;}]&#xD;
(* Out: {1, 3, 31} *)&#xD;
```&#xD;
&#xD;
Correct result (with `cDatePlus`):&#xD;
&#xD;
```&#xD;
{1, 10, 31}&#xD;
```&#xD;
&#xD;
Another example:&#xD;
&#xD;
```&#xD;
DatePlus[{1, 10, 5}, {2, &amp;#034;BeginningOfMonth&amp;#034;}]&#xD;
(* Out: {1, 3, 1} *)&#xD;
```&#xD;
&#xD;
Correct result:&#xD;
&#xD;
```&#xD;
{1, 12, 1}&#xD;
```&#xD;
&#xD;
### 3. Strange result with an empty list&#xD;
&#xD;
When we use an empty list (`{}`) as offset, it uses the first argument as day offset from now:&#xD;
&#xD;
```&#xD;
First@DatePlus[0, {}]&#xD;
(* Out: {2021, 11, 13, 15, 7, 0.} *)&#xD;
&#xD;
First@DatePlus[1, {}]&#xD;
(* Out: {2021, 11, 14, 15, 7, 0.} *)&#xD;
&#xD;
DatePlus[0, {1, &amp;#034;Day&amp;#034;}]&#xD;
(* Out: 86400 *)&#xD;
```&#xD;
&#xD;
## DayRange&#xD;
&#xD;
### 1. Odd behavior with year 1 or -1&#xD;
&#xD;
It starts from `1-1-31`, just to avoid clutter, you&amp;#039;ll see the length:&#xD;
&#xD;
```&#xD;
Length@DayRange[{1, 7, 9}, {2, 2, 15}, &amp;#034;EndOfMonth&amp;#034;]&#xD;
(* Out: 13 *)&#xD;
&#xD;
Length@DayRange[{-1, 7, 9}, {1, 2, 15}, &amp;#034;EndOfMonth&amp;#034;]&#xD;
(* Out: 12 *)&#xD;
```&#xD;
&#xD;
Proper result (with `cDayRange`):&#xD;
&#xD;
```&#xD;
7&#xD;
&#xD;
7&#xD;
```&#xD;
&#xD;
## DateRange&#xD;
&#xD;
### 1. The backward calculation is done using the forward formula&#xD;
&#xD;
When the end date is larger than the start date, we add the granularity (should be positive) to the start until we reach the end, but if the start is bigger than the end and granularity is negative, we should subtract it from the start until we reach the end. It&amp;#039;s true for all the types except `&amp;#034;BeginningOfMonth&amp;#034;` and `&amp;#034;EndOfMonth&amp;#034;`.&#xD;
&#xD;
```&#xD;
DateRange[{2019, 12, 5}, {2019, 7, 1}, {-3, &amp;#034;BeginningOfMonth&amp;#034;}]&#xD;
(* Out: {{2019, 10, 1, 0, 0, 0.}, {2019, 7, 1, 0, 0, 0.}} *)&#xD;
```&#xD;
&#xD;
Which should be (using `cDateRange`):&#xD;
&#xD;
```&#xD;
{{2019, 12, 1, 0, 0, 0.}, {2019, 9, 1, 0, 0, 0.}}&#xD;
```&#xD;
&#xD;
Pay attention to hour element:&#xD;
&#xD;
```&#xD;
(* Normal *)&#xD;
DateRange[{2019, 12, 5, 12}, {2019, 7, 1}, {-3, &amp;#034;Month&amp;#034;}]&#xD;
(* Out: {{2019, 12, 5, 12, 0, 0.}, {2019, 9, 5, 12, 0, 0.}} *)&#xD;
&#xD;
(* Odd *)&#xD;
DateRange[{2019, 12, 5, 12}, {2019, 7, 1}, {-3, &amp;#034;EndOfMonth&amp;#034;}]&#xD;
(* Out: {{2019, 10, 31, 0, 0, 0.}, {2019, 7, 31, 0, 0, 0.}} *)&#xD;
&#xD;
(* Odd *)&#xD;
DateRange[{2019, 12, 5, 12}, {2019, 7, 1}, {-3, &amp;#034;BeginningOfMonth&amp;#034;}]&#xD;
(* Out: {{2019, 10, 1, 0, 0, 0.}, {2019, 7, 1, 0, 0, 0.}} *)&#xD;
```&#xD;
&#xD;
In other terms, the result of the examples below are equal except in different ordering:&#xD;
&#xD;
```&#xD;
DateRange[{2019, 12, 5}, {2019, 7, 1}, {-3, &amp;#034;BeginningOfMonth&amp;#034;}]&#xD;
(* Out: {{2019, 10, 1, 0, 0, 0.}, {2019, 7, 1, 0, 0, 0.}} *)&#xD;
&#xD;
DateRange[{2019, 7, 1}, {2019, 12, 5}, {3, &amp;#034;BeginningOfMonth&amp;#034;}]&#xD;
(* Out: {{2019, 7, 1, 0, 0, 0.}, {2019, 10, 1, 0, 0, 0.}} *)&#xD;
```&#xD;
&#xD;
## AbsoluteTime&#xD;
&#xD;
### 1. Handling `TimeObject`&#xD;
&#xD;
`AbsoluteTime` convert `TimeObject` by adding `Today` value, which I think could be counterintuitive when somebody wants to compare `AbsoluteTime` of two `TimeObject` which was applied in different days, should use `Mod[,86400]` first.&#xD;
&#xD;
```&#xD;
DateList@AbsoluteTime@TimeObject[]&#xD;
(* Out: {2021, 11, 13, 15, 42, 56.} *)&#xD;
```&#xD;
&#xD;
Why not return this result ( `cAbsoluteTime`):&#xD;
&#xD;
```&#xD;
{1, 1, 1, 15, 42, 56.}&#xD;
```&#xD;
&#xD;
## UnixTime&#xD;
&#xD;
### 1. Truncating sub-second precision:&#xD;
&#xD;
Why `UnixTime` does not have floating numbers to handle more accurate dates?&#xD;
&#xD;
```&#xD;
DecimalForm[UnixTime[{2021, 11, 12, 12, 30, 30.35}], 30]&#xD;
(* Out: 1636700430 *)&#xD;
```&#xD;
&#xD;
What it could be: `1636707630.35`.&#xD;
&#xD;
## DateObject&#xD;
&#xD;
### 1. Raise overlapping message for non-overlap inputs&#xD;
&#xD;
For years, before `812` and after `2989` equality of two consecutive days raise `Message` while `DateOverlapsQ` returning `False`:&#xD;
&#xD;
```&#xD;
DateObject[{-1, 1, 1}] == DateObject[{-1, 1, 2}]&#xD;
&#xD;
DateOverlapsQ[DateObject[{-1, 1, 1}], DateObject[{-1, 1, 2}]]&#xD;
(* Out: False *)&#xD;
&#xD;
DateOverlapsQ[DateObject[{-1, 1, 2}], DateObject[{-1, 1, 1}]]&#xD;
(* Out: False *)&#xD;
```&#xD;
&#xD;
![ERROR IMAGE](https://i.imgur.com/DMuEk69.jpg)&#xD;
&#xD;
Far future example:&#xD;
&#xD;
```&#xD;
DateObject[{2988, 10, 12}] == DateObject[{2988, 10, 13}]&#xD;
(* No Message, Out: False*)&#xD;
&#xD;
(* But *)&#xD;
DateObject[{2989, 10, 12}] == DateObject[{2989, 10, 13}]&#xD;
```&#xD;
&#xD;
![ERROR IMAGE](https://i.imgur.com/xLoEP5W.jpg)&#xD;
&#xD;
### 2. Suggestion - Round &amp;#039;Second&amp;#039; in `Second` granularity&#xD;
&#xD;
Is this considered `Second` granularity or `Sub-Second`/`Instant` granularity ?&#xD;
&#xD;
```&#xD;
DateObject[{2020, 1, 1, 30, 45, 12.25}, &amp;#034;Second&amp;#034;]&#xD;
(* Out: DateObject[List[2020,1,2,6,45,12.25`],&amp;#034;Second&amp;#034;,&amp;#034;Gregorian&amp;#034;,3.5`] *)&#xD;
```&#xD;
&#xD;
### 3. Incorrect result with AbsoluteTime values with custom granularity&#xD;
&#xD;
Consider date `{2020, 12, 10}` which is `Thursday` and every week starts on Monday (default option):&#xD;
&#xD;
```&#xD;
DateList@DateObject[3816547200, &amp;#034;Week&amp;#034;]&#xD;
(* Out: {2020, 12, 10, 0, 0, 0.} *)&#xD;
&#xD;
DateList@DateObject[DateList@3816547200, &amp;#034;Week&amp;#034;]&#xD;
(* Out: {2020, 12, 7, 0, 0, 0.} *)&#xD;
&#xD;
DateList@DateObject[FromAbsoluteTime@3816547200, &amp;#034;Week&amp;#034;]&#xD;
(* Out: {2020, 12, 7, 0, 0, 0.} *)&#xD;
```&#xD;
&#xD;
This also applies to `WeekBeginningSunday`, `Century`, `CenturyBeginning01`, `Millennium`, `MillenniumBeginning01`. &#xD;
&#xD;
&#xD;
## TimeObject&#xD;
&#xD;
### 1. Suggestion - Embed TimeZone offset to TimeObject like DateObject&#xD;
&#xD;
Since `DateObject` uses `$TimeZone` and can be manipulated in a session while `TimeObject` uses system clock, why not use the time-zone offset from the system ? (My system time-zone offset is +3.5)&#xD;
&#xD;
```&#xD;
First@TimeObject[]&#xD;
(* Out: {14, 4, 3.} *)&#xD;
&#xD;
First@TimeZoneConvert[TimeObject[], &amp;#034;GMT&amp;#034;]&#xD;
(* Out: {14, 4, 3.} *)&#xD;
&#xD;
First@TimeZoneConvert[TimeObject[TimeZone -&amp;gt; 3.5], &amp;#034;GMT&amp;#034;]&#xD;
(* Out: {10, 34, 3.} *)&#xD;
&#xD;
(* Real answer *)&#xD;
TimeZoneConvert[DateObject[], &amp;#034;GMT&amp;#034;][[1, -3 ;;]]&#xD;
(* Out: {10, 34, 3.} *)&#xD;
```&#xD;
&#xD;
## CalendarConvert&#xD;
&#xD;
### 1. Negative/Zero in the month!&#xD;
&#xD;
For far future years, conversion to `&amp;#034;AstronomicalPersian&amp;#034;` will give negative/zero months&#xD;
&#xD;
```&#xD;
First@CalendarConvert[DateObject@{9999997, 9, 24}, &amp;#034;AstronomicalPersian&amp;#034;]&#xD;
(* Out: {9999386, -15, 5} *)&#xD;
```&#xD;
&#xD;
Another example (wrong output probably starts from this year):&#xD;
&#xD;
```&#xD;
First@CalendarConvert[DateObject@{82380, 7, 4}, &amp;#034;AstronomicalPersian&amp;#034;]&#xD;
(* Out: {81758, 12, 29} *)&#xD;
&#xD;
First@CalendarConvert[DateObject@{82380, 7, 5}, &amp;#034;AstronomicalPersian&amp;#034;]&#xD;
(* Out: {81759, 0, 26} *)&#xD;
```&#xD;
&#xD;
If we don&amp;#039;t apply `First` to the `CalendarConvert` you&amp;#039;ll see:&#xD;
&#xD;
![ERROR IMAGE](https://i.imgur.com/MIe5Dmx.jpg)&#xD;
&#xD;
### 2. Two consecutive leap years in the Persian calendar&#xD;
&#xD;
Persian Calendar has a little complex leap year system, that&amp;#039;s why it has an `&amp;#034;ArithmeticPersian&amp;#034;` and `&amp;#034;AstronomicalPersian&amp;#034;` option in calendar conversion. `&amp;#034;AstronomicalPersian&amp;#034;` type is the more accurate system. I don&amp;#039;t think two consecutive leap years is correct.&#xD;
Also, I should mention, leap month in the `Persian` calendar is the 12th month which in normal years has 29 days, and leap years have 30 days.&#xD;
&#xD;
```&#xD;
First@CalendarConvert[DateObject@{622, 3, 21}, &amp;#034;AstronomicalPersian&amp;#034;]&#xD;
First@CalendarConvert[DateObject@{621, 3, 21}, &amp;#034;AstronomicalPersian&amp;#034;]&#xD;
```&#xD;
&#xD;
If we calculate with `cCalendarConvert`:&#xD;
&#xD;
```&#xD;
{-1, 12, 30, 0, 0, 0.}&#xD;
&#xD;
{-1, 1, 1, 0, 0, 0.}&#xD;
```&#xD;
&#xD;
## TimeZoneConvert&#xD;
&#xD;
### 1. Wrong result&#xD;
&#xD;
For version 13 live stream, I want to schedule to watch it live, but I live in a different time-zone, so I notice this strange case:&#xD;
&#xD;
First to show the real offset from my place to `New_York`:&#xD;
&#xD;
```&#xD;
TimeZoneOffset[&amp;#034;America/New_York&amp;#034;, &amp;#034;Asia/Tehran&amp;#034;, &#xD;
 DateObject[{2021, 12, 13, 15, 30}, TimeZone -&amp;gt; &amp;#034;America/New_York&amp;#034;]]&#xD;
(* Out: -8.5 *)&#xD;
```&#xD;
&#xD;
Now, with `8.5` hour offset, convert the date to the Persian calendar, then convert time zones:&#xD;
&#xD;
```&#xD;
First@TimeZoneConvert[&#xD;
  CalendarConvert[&#xD;
   DateObject[{2021, 12, 13, 15, 30}, TimeZone -&amp;gt; &amp;#034;America/New_York&amp;#034;],&#xD;
    &amp;#034;AstronomicalPersian&amp;#034;], &amp;#034;Asia/Tehran&amp;#034;]&#xD;
&#xD;
(* Out: {1400, 9, 22, 23, 51} *)&#xD;
```&#xD;
&#xD;
We get `8h 21m` offset!&#xD;
&#xD;
Further investigation, shows that the offset used in the calculation may differ from the real one:&#xD;
&#xD;
```&#xD;
First@TimeZoneConvert[&#xD;
  DateObject[{1400, 9, 22, 3, 31, 15}, &#xD;
   CalendarType -&amp;gt; &amp;#034;AstronomicalPersian&amp;#034;], &amp;#034;Europe/London&amp;#034;]&#xD;
&#xD;
(* Out: {1400, 9, 22, 0, 0, 0.} *)&#xD;
```&#xD;
&#xD;
If we change the destination to `GMT` the correct result shows up:&#xD;
&#xD;
```&#xD;
First@TimeZoneConvert[&#xD;
  DateObject[{1400, 9, 22, 3, 30, 0}, &#xD;
   CalendarType -&amp;gt; &amp;#034;AstronomicalPersian&amp;#034;], &amp;#034;GMT&amp;#034;]&#xD;
&#xD;
(* Out: {1400, 9, 22, 0, 0, 0.} *)&#xD;
```&#xD;
&#xD;
# Bonus&#xD;
&#xD;
If you have read this far, congratulations. These functions were absent in wolfram but are useful to have, so here you are:&#xD;
&#xD;
## cHolidayName&#xD;
&#xD;
For getting the name of a holiday:&#xD;
&#xD;
```&#xD;
cHolidayName[{2021, 11, 25}]&#xD;
(* Out: &amp;#034;Thanksgiving Day&amp;#034; *)&#xD;
```&#xD;
&#xD;
Observed Holidays, the original day is not considered a holiday:&#xD;
&#xD;
```&#xD;
cHolidayName[{2021, 7, 5}]&#xD;
(* Out: &amp;#034;Independence Day&amp;#039; day off&amp;#034; *)&#xD;
&#xD;
cHolidayName[{2021, 7, 4}]&#xD;
(* Out: Missing[&amp;#034;Holiday&amp;#034;] *)&#xD;
```&#xD;
&#xD;
Also if you&amp;#039;re more interested in holidays, there are two related internal functions for getting next/previous holiday:&#xD;
&#xD;
```&#xD;
DateList@cDateFunctions`Private`cNextHoliday[{2021, 11, 12}]&#xD;
(* Out: {2021, 11, 25, 0, 0, 0.} *)&#xD;
&#xD;
DateList@cDateFunctions`Private`cPreviousHoliday[{2021, 11, 12}]&#xD;
(* Out: {2021, 11, 11, 0, 0, 0.} *)&#xD;
```&#xD;
&#xD;
Also for getting the previous holiday, there is a lower limit:&#xD;
&#xD;
```&#xD;
cDateFunctions`Private`cPreviousHoliday[{1500, 11, 11}]&#xD;
&#xD;
(* Message: &amp;#034;No official holiday exists before 1863-11-26.&amp;#034; *)&#xD;
```&#xD;
&#xD;
## cCalendarView&#xD;
&#xD;
For getting a month/multiple month/custom range calendar views with `Grid` which supports highlighting and is only for `&amp;#034;Gregorian&amp;#034;` calendar (See Advance section for other calendars):&#xD;
&#xD;
### View a month at a glance:&#xD;
&#xD;
```&#xD;
cCalendarView[{2021, 11}]&#xD;
```&#xD;
&#xD;
![CALENDAR VIEW](https://i.imgur.com/8HKZmzl.jpg)&#xD;
&#xD;
```&#xD;
cCalendarView[{2021, 11}, {2021, 11, 12} -&amp;gt; Red]&#xD;
```&#xD;
&#xD;
![CALENDAR VIEW](https://i.imgur.com/eUnjfHW.jpg)&#xD;
&#xD;
```&#xD;
cCalendarView[{2021, 11}, 12 ;; 15]&#xD;
```&#xD;
&#xD;
![CALENDAR VIEW](https://i.imgur.com/6ST9RCA.jpg)&#xD;
&#xD;
```&#xD;
cCalendarView[{2021, 11}, {6, 7} ;; ;; 7]&#xD;
```&#xD;
&#xD;
![CALENDAR VIEW](https://i.imgur.com/cQEquZR.jpg)&#xD;
&#xD;
```&#xD;
cCalendarView[{2021, 11}, &amp;#034;Holiday&amp;#034;]&#xD;
```&#xD;
&#xD;
![CALENDAR VIEW](https://i.imgur.com/blCVoeA.jpg)&#xD;
&#xD;
Use `cCalendarMultipleView` to view multiple months in a row. Could be positive or negative:&#xD;
&#xD;
```&#xD;
(* show 2021-11 and 1 month after that with highlighting *)&#xD;
cCalendarMultipleView[{2021, 11}, 1, 6 ;; ;; 6]&#xD;
```&#xD;
&#xD;
![CALENDAR VIEW](https://i.imgur.com/15Ud7MH.jpg)&#xD;
&#xD;
Use `cCalendarRangeView` to view a range:&#xD;
&#xD;
```&#xD;
cCalendarRangeView[{2021, 11}, {2021,12},&#xD;
   {{{2021, 11, 14}, {2021, 11, 15}, {2021, 11, 16}} -&amp;gt; Gray,&#xD;
    {2021, 11, 13} -&amp;gt; Green}]&#xD;
```&#xD;
&#xD;
![CALENDAR VIEW](https://i.imgur.com/d9aHHeh.jpg)&#xD;
&#xD;
Note that `cCalendarMultipleView` and `cCalendarRangeView` automatically highlight the first day of each month.&#xD;
&#xD;
## Suggestion - N-th Weekday&#xD;
&#xD;
How should we program to express 4th Thursday (for Thanksgiving ) / last Monday (for Memorial Day) ?&#xD;
Here is my proposal inspired by the `C++ Chrono` library, implemented via `UpValues` (minimum viable product):&#xD;
&#xD;
```&#xD;
(Unprotect[#];&#xD;
    UpValues[#] = {};&#xD;
    # /: {year_Integer, month_Integer, #[n_Integer?Positive]} := DatePlus[{year, month, 0}, {n, #}];&#xD;
    # /: {year_Integer, month_Integer, #[n_Integer?Negative]} := DatePlus[{year, month + 1, 1}, {n, #}];&#xD;
    # /: {year_Integer, month_Integer, #[First]} := DatePlus[{year, month, 0}, {1, #}];&#xD;
    # /: {year_Integer, month_Integer, #[Last]} := DatePlus[{year, month + 1, 1}, {-1, #}];&#xD;
    Protected[#];) &amp;amp; /@ {Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday};&#xD;
```&#xD;
&#xD;
Now, we can use it anywhere (should be fixed):&#xD;
&#xD;
```&#xD;
{2021, 11, Thursday[4]}&#xD;
(* Out: {2021, 11, 25} *)&#xD;
&#xD;
{2021, 5, Monday[Last]}&#xD;
(* Out: {2021, 5, 31} *)&#xD;
&#xD;
AbsoluteTime[{2021, 5, Monday[Last]}]&#xD;
(* Out: 3831408000 *)&#xD;
&#xD;
(* Second to last friday *)&#xD;
{2021, 12, Friday[-2]}&#xD;
(* Out: {2021, 12, 24} *)&#xD;
```&#xD;
&#xD;
Limiting UpValues to date functions only and supporting month names, would greatly improve functionality and readability.&#xD;
&#xD;
# For Advanced Users&#xD;
&#xD;
This journey of rewriting date functions in wolfram as joyful and teachable as it was, was ending and after looking at my code, I notice in many places, `DateList` and `AbsoluteTime` were used many times, I thought, if I could make them faster, the whole package could benefit this speed up. In many parts, I reached my goal but I didn&amp;#039;t test the performance gained from switching.&#xD;
&#xD;
Since these functions are Kernel-Level functions (probably written in `C` language), Wolfram Language is not the right tool to compete, so I choose Rust. You could read about its benefits and guarantees over `C` on other sites. Here you&amp;#039;ll see the comparison. `C` language is still used as the interface for Rust functions. (If you have a better solution, I&amp;#039;m more than happy to hear about Rust integration.)&#xD;
&#xD;
This journey just like the previous one doesn&amp;#039;t end with `DateList` and `AbsoluteTime`, but it also came with writing 3 calendars (`&amp;#034;Greogiran&amp;#034;`, `&amp;#034;ArithmeticPersian&amp;#034;` with 5 method, `AstronomicalPersian`, `&amp;#034;Islamic&amp;#034;` which is a civil arithmetic calendar, with 4 method). For additional options they support, visit the [Github Page](https://github.com/ben-izd/cDateFunctions).&#xD;
&#xD;
## Installation&#xD;
&#xD;
For testing this section, you need to follow the [Github](https://github.com/ben-izd/cDateFunctions) instructions.&#xD;
&#xD;
## `AbsoluteTime` / `FromAbsoluteTime`&#xD;
&#xD;
`cAbsoluteTime` is on average **0.9 times slower** than `AbsoluteTime` over 1,000,000 random `DateList`.&#xD;
&#xD;
`cAbsoluteTime` is on average the **2 times faster** as `AbsoluteTime` over 100,000 random `DateObject`.&#xD;
&#xD;
If we call `AbsoluteTime` to get the current value without any argument,&#xD;
`cAbsoluteTime` is on average **42 times faster** than `AbsoluteTime` while having **6 times lower** memory usage.&#xD;
&#xD;
`cFromAbsoluteTime` on the other hand is **1.5 times faster** than `FromAbsoluteTime` over 100,000 random real, which could be faster considering creating a `DateObject` overhead (see Comparing Internals section).&#xD;
&#xD;
&#xD;
Also unlike Mathematica, `cAbsoluteTime` does support other calendars:&#xD;
&#xD;
```&#xD;
cDateList@cAbsoluteTime[{1400, 7, 20}, CalendarType -&amp;gt; &amp;#034;ArithmeticPersian&amp;#034;]&#xD;
(* Out: {2021, 10, 12, 0, 0, 0} *)&#xD;
&#xD;
cDateList@cAbsoluteTime[{1443, 3, 5}, CalendarType -&amp;gt; &amp;#034;Islamic&amp;#034;]&#xD;
(* Out: {2021, 10, 12, 0, 0, 0} *)&#xD;
```&#xD;
&#xD;
&#xD;
## `DateList`&#xD;
&#xD;
`cDateList` is on average **~1.7 times faster** than `DateList` over 1,000,000 random numbers (`Real`/`Integer`).&#xD;
&#xD;
`cDateList` is on average **~1.9 times faster** than `DateList` over 1,000,000 random un-normal `DateList`.&#xD;
&#xD;
## `CalendarConvert`&#xD;
&#xD;
All the numbers come from testing 10,000 random samples.&#xD;
&#xD;
In `&amp;#034;Gregorian&amp;#034;` to `&amp;#034;ArithmeticPersian&amp;#034;`\&#xD;
`cCalendarConvert` is on average **16 times faster** than `CalendarConvert`.&#xD;
&#xD;
In `&amp;#034;Gregorian&amp;#034;` to `&amp;#034;AstronomicalPersian&amp;#034;`\&#xD;
`cCalendarConvert` is on average **140 times faster** than `CalendarConvert`.&#xD;
&#xD;
In `&amp;#034;Gregorian&amp;#034;` to `&amp;#034;Islamic&amp;#034;`\&#xD;
`cCalendarConvert` is on average **9 times faster** than `CalendarConvert`.&#xD;
&#xD;
In `&amp;#034;Islamic&amp;#034;` to `&amp;#034;ArithmeticPersian&amp;#034;`\&#xD;
`cCalendarConvert` is on average **19 times faster** than `CalendarConvert`.&#xD;
&#xD;
`&amp;#034;AstronomicalPersian&amp;#034;` uses an algorithm introduced by Edward M. Reingold, Nachum Dershowitz in their book, &amp;#034;Calendrical Calculations: The Ultimate Edition&amp;#034;. It was implemented to perform the test but because of its license, it&amp;#039;s not included in the source code until I get approval from the author (the source is commented in the interface code).&#xD;
&#xD;
Since both `&amp;#034;Islamic&amp;#034;` and `&amp;#034;ArithmeticPersian&amp;#034;` have methods to use, converting one to another while using `Method` option, input `Method` will be used for the output format and input will be converted using the default method, if you want more control, first convert it to `&amp;#034;Gregorian&amp;#034;`, then convert it to your specified calendar.&#xD;
&#xD;
## `LeapYearQ`&#xD;
&#xD;
Because of different methods of calculations, this `LeapYearQ` uses kernel-level functions (instead of pure wolfram language shown earlier, which will be overridden) to handle 3 calendars. Tests were done on over 100,000 random samples.&#xD;
&#xD;
`&amp;#034;Gregorian&amp;#034;`\&#xD;
`cLeapYearQ` is on average **8 times faster** than `LeapYearQ`.&#xD;
&#xD;
`&amp;#034;ArithmeticPersian&amp;#034;`\&#xD;
`cLeapYearQ` is on average **9 times faster** than `LeapYearQ` (as discussed earlier, `LeapYearQ` gives the wrong result for this type of calendar).&#xD;
&#xD;
`&amp;#034;AstronomicalPersian&amp;#034;`\&#xD;
`cLeapYearQ` is on average **102 times faster** than `LeapYearQ`.&#xD;
&#xD;
`&amp;#034;Islamic&amp;#034;`\&#xD;
`cLeapYearQ` is on average **6 times faster** than `LeapYearQ`.&#xD;
&#xD;
And remember in `cLeapYearQ`  with `&amp;#034;ArithmeticPersian&amp;#034;` and `&amp;#034;Islamic&amp;#034;`, you can choose different methods of leap-year calculation, visit [Github](https://github.com/ben-izd/cDateFunctions) for more information.&#xD;
&#xD;
&#xD;
## `JulianDate` / `FromJulianDate`&#xD;
&#xD;
`cJulianDate` is on average **3 times faster** than `JulianDate` over 10,000 random `DateList`.&#xD;
&#xD;
`cFromJulianDate` is on average **1.8 times faster** than `FromJulianDate` over 100,000 real, actually, it&amp;#039;s faster than stated, creating a `DateObject` takes most of the time.&#xD;
&#xD;
## `UnixTime` / `FromUnixTime`&#xD;
&#xD;
`cUnixTime` is on average **7 times faster** than `UnixTime` over 100,000 random `DateList` samples.&#xD;
&#xD;
`cFromUnixTime` is on average **2 times faster** than `FromUnixTime` but it shares the same problem as `cFromJulianDate`. &#xD;
&#xD;
&#xD;
## `cMonthView` / `cPartialView`&#xD;
&#xD;
With access to these calendars and different methods of calculation, it was the best opportunity to create a function that prints month/year view.&#xD;
&#xD;
See 2021 calendar at a glance:&#xD;
&#xD;
![YEAR_IMAGE](https://i.imgur.com/XeCgSNQ.jpg)&#xD;
&#xD;
or other calendars (use `CalendarType`)&#xD;
&#xD;
![OTHER_YEAR_IMAEG](https://i.imgur.com/nUHgbi5.jpg)&#xD;
&#xD;
Unlike earlier `cMonthView` it does not support highlighting yet.&#xD;
For printing a range/month continuously use `cPartialView` which accepts a start and end date.&#xD;
&#xD;
Wolfram technology conference  at a glance (with manually highlighting):&#xD;
&#xD;
```&#xD;
MapAt[Highlighted, &#xD;
 cPartialView[{2021, 11, 7}, {2021, 11, 20}], {{1, 1, 1, 6 ;; 7}, {1, &#xD;
   1, 2, 1 ;; 2}}]&#xD;
```&#xD;
&#xD;
![cPartialView_IMAGE](https://i.imgur.com/gGkO3qH.jpg)&#xD;
&#xD;
# Limitations&#xD;
&#xD;
Since all these functions are written in low-level and should support `C` types, not arbitrary precision that Wolfram-Language has (although Wolfram has its own limitation, like rounding error).&#xD;
&#xD;
## `cAbsoluteTime`:&#xD;
&#xD;
 `cAbsoluteTime` has a limit, going further will not raise any error but cause overflow (wrap around).&#xD;
&#xD;
```&#xD;
(* max date - second is not important *)&#xD;
cAbsoluteTime[{292277026526, 12, 5, 15, 30}]&#xD;
(* Out: 9223372036854720000 *)&#xD;
&#xD;
(* going further lead to overflow *)&#xD;
cAbsoluteTime[{292277026526, 12, 5, 15, 31}]&#xD;
(* Out: -9223372036854775756 *)&#xD;
&#xD;
(* min date*)&#xD;
cAbsoluteTime[{-292277022728, 1, 27, 0, 0, 0}]&#xD;
(* Out: -9223372036854720000 *)&#xD;
&#xD;
(* going further lead to overflow *)&#xD;
cAbsoluteTime[{-292277022728, 1, 26, 0, 0, 0}]&#xD;
(* Out: 9223372036854745216 *)&#xD;
```&#xD;
&#xD;
## `cDateList`:&#xD;
&#xD;
Unlike `cAbsoluteTime` which crossing the limit will not raise any error, here Mathematica will raise an error because it can not convert numbers greater than `2^63-1` to machine size 64-bit integers. But because of some internal design decisions, the safe range is shifted towards the negative side. So there is also a range before `2^63-1`, which doesn&amp;#039;t raise any error but leads to overflow. (We&amp;#039;re discussing around year `292,277,024,627`, which if you&amp;#039;re interested, I&amp;#039;ll add more details.) &#xD;
&#xD;
This pattern also applies to other kernel-level functions.&#xD;
&#xD;
# Comparing `Internal`s&#xD;
&#xD;
In the built-in `Internal` context, there are three functions that do the `DateList` functionalities separately:&#xD;
&#xD;
- `DateListToDateList`&#xD;
&#xD;
- `DateListToSeconds`&#xD;
&#xD;
- `SecondsToDateList`&#xD;
&#xD;
Like Mathematica, c\* functions also have kernel-level functions to call but there is a caveat. Since passing arrays to/from `C` language (interface), should be a single type, I couldn&amp;#039;t find an easy way to handle `DateList` mix-type arrays beside `WSTP` (second could be Real, `LibraryLink` developers, if you&amp;#039;re reading, I&amp;#039;m waiting for integration of `TypeProduct` to use structs), so these kernel functions only support maximum 5 elements as input/output (`{Y,M,D,H,M}`, second will be calculated in the interface, not in the kernel part).&#xD;
&#xD;
Comparing Mathematica `Internal` with `cDateFunctions` &amp;gt; `LibraryLink` over random 1,000,000 samples without considering second (`Internal` support second but not `cDatefunctions Kernel`):&#xD;
&#xD;
`DateListToSecond` (`AbsoluteTime`):&#xD;
`LibraryLink` is on average **0.7 times slower** than `Internal`.&#xD;
&#xD;
`SecondToDateList` (`DateList`):&#xD;
`LibraryLink` is on average **0.8 times faster** than `Internal`.&#xD;
&#xD;
`DateListToDateList`:&#xD;
`LibraryLink` is on average **1.12 times faster** than `Internal`.&#xD;
&#xD;
Calling raw `LibraryLink` outperforms the internals but input/output doesn&amp;#039;t include second, the result shown above came from calling the simplest interface. (For those curious people, calling raw interface is on average **8, 7, 9 times faster** respectively).&#xD;
&#xD;
As discussed, `cDateFunctions`\``LibraryLink` is fast but the reason that their interface is not as fast as their kernel, is mainly because of the pattern matching (to support `CalendarType` and `Method`) and second calculation.&#xD;
&#xD;
&#xD;
# Final note &#xD;
&#xD;
For those who are interested in calendars and their implementations, I recommend &amp;#034;Calendrical Calculation&amp;#034; by Edward M. Reingold, Nachum Dershowitz which I think the Wolfram/Microsoft team has seen this book because of some similarities I noticed in their sources. Both book&amp;#039;s authors and developer teams did a great job which is appreciated (Microsoft: .Net). The book also comes with a source file in `Lisp` language. The implementation of `cCalendarConvert` `&amp;#034;AstronomicalPersian&amp;#034;` is ported from this book.&#xD;
&#xD;
&#xD;
Because of my limited time, I did cover 4 calendars and introduced different methods of calculation to cover different needs and you should know both `&amp;#034;Persian&amp;#034;` and `&amp;#034;Islamic&amp;#034;` in some countries use observation not algorithms to determine leap year/month length.&#xD;
&#xD;
The Rust code has a framework within, to support other calendars with similar characteristics as Gregorian and ... , with providing months length and two functions for checking and counting leap years and some little details, you&amp;#039;ll have `AbsoluteTime` and `DateList` engine + `Month/YearView` (currently for 12 months calendars) for your calendar for free.&#xD;
&#xD;
`&amp;#034;ArithmeticPersian&amp;#034;` and `&amp;#034;Islamic&amp;#034;` also use frameworks, so for any future changes in their leap year calculations that follow the old structure, you can add them as a new method under 20 lines of code.&#xD;
&#xD;
Improving is a never-ending process. For me, I reached beyond the main goal I set for myself, of course, there were a lot of moments which I was so close to abandoning the project, especially when I was figuring out how `LibraryLink` works and build the project without compiling errors but looking back, it&amp;#039;s worth it and I feel more powerful than before. I hope you learn something and if you had any questions/comments/suggestions, feel free to add them.</description>
    <dc:creator>Benjamin Izadpanah</dc:creator>
    <dc:date>2022-01-01T06:44:51Z</dc:date>
  </item>
</rdf:RDF>

