Skip to content

Instantly share code, notes, and snippets.

@kenwebb
Last active November 23, 2019 19:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kenwebb/dbe776b8d7a7c4a992880bc73c6454af to your computer and use it in GitHub Desktop.
Save kenwebb/dbe776b8d7a7c4a992880bc73c6454af to your computer and use it in GitHub Desktop.
Seven Sketches book - Example 1.56 (The tree of life)
<?xml version="1.0" encoding="UTF-8"?>
<!--Xholon Workbook http://www.primordion.com/Xholon/gwt/ MIT License, Copyright (C) Ken Webb, Sat Nov 23 2019 14:36:51 GMT-0500 (Eastern Standard Time)-->
<XholonWorkbook>
<Notes><![CDATA[
Xholon
------
Title: Seven Sketches book - Example 1.56 (The tree of life)
Description:
Url: http://www.primordion.com/Xholon/gwt/
InternalName: dbe776b8d7a7c4a992880bc73c6454af
Keywords:
My Notes
--------
November 20, 2019
see also my notes in my notebook for November 18 "Compositionality and Seven Sketches book", and other related subjects from the same time period
In this workbook, I explore example 1.56 in the Fong and Spivak book.
The example is about animal classifications, an area of biology, here informally called "the tree of life".
The example uses several math concepts: set, order, preorder, monotone map.
This is a simplified example, and almost certainly biologists do not actually think about animal classification as a "tree of life". [see ref 12]
"Taxonomy" seems to be the proper biology term for species classification. [see ref 13]
Note that this is a Mathematics example, and does not intend to be biologically accurate.
My questions, as a software analyst, designer, and developer, and as the developer of the Xholon platform, include:
* How do I build a Xholon application that is true to example 1.56?
* Can I model everything in Xholon?
* If anything is missing in Xholon, what is it, and how can I add it in to my platform?
* In general, how can I use math and applied category theory as concepts, patterns that can help guide software development?
An immediate challenge for Xholon:
- there seem to be two parallel class inheritance hierarchies
An important observation:
- There is a relationship between the concept of Set and the concept of Type/Class.
Something new for me (probably new) is the math concept of a monotone map.
As a software developer, I may find that this is a useful practical concept that might help me develop certain applications.
If I can use it, then it's an example of Applied Category Theory (ACT).
It's a math-inspired idea.
At the end of the day, what will be important in this Xholon application, is whether it can say something about individual animals,
for example my cat Licorice as he interacts with members of my family.
Some key and useful (for me, for Xholon, for my way of understanding things) ideas from example 1.56 and from that whole section in the book:
1. the explicit concept of a preorder, and of a preorder being applied to an existing set
2. the concept of a monotone map between two sets with preorders
3. the basic math approach of systematically building up more and more sophisticated structures, starting with one or more sets
TODO
- work through the math process of building up structure from sets
- formalize this as a Domain Specific Language (DSL)
TODO
This is incomplete, and only partially mathematically correct/rigorous
If this is rigorous, then I should be able to write a parser that will construct a valid Xholon application from the math notation (the DSL)
Constructing the tree of life (as specified in example 1.56)
-----------------------------
Assume two sets A and B.
A = {sapiens, habilis, homo, primate, lion, tiger, panthera, carnivore, mammal}
Set A has a binary operation ≤ that defines how the elements of the set are ordered.
The binary operation defines a set P of ordered pairs, which is a subset of AxA. P = (A, ≤)
P = {(sapiens,homo), (habilis,homo), (lion,panthera), (tiger,panthera), (homo,primate), (panthera,carnivore), (primate,mammal), (carnivore,mammal)}
B = {individual, species, genus, family, order, class, phylum, kingdom}
Set B has a binary operation ≤ that defines how the elements of the set are ordered.
The binary operation defines a set Q of ordered pairs, which is a subset of BxB.
Q = {(individual,species), (species,genus), (genus,family), (family,order), (order,class), (class,phylum), (phylum,kingdom)}
The monotone map M consists of a set of ordered pairs that connect elements of set A with elements of set B. M is a subset of AxB.
M = {(sapiens,species), (habilis,species), (lion,species), (tiger,species), (homo,genus), (panthera,genus), (primate,order), (carnivore,order), (mammal,class)}
OR describe it this way
-----------------------
In mathematics, a Set is a collection of things.
X = {thing1, thing2}
Y = {}
Z = {1,2,3,4,5}
In mathematics, a name is just a convenient label. In this document, "name" and "label" mean the same thing.
Biologists classify animals using a standard set of group names (labels).
Set A provides examples of these.
A = {sapiens, habilis, homo, primate, lion, tiger, panthera, carnivore, mammal}
Biologists have developed a strict system of group levels.
Set B provides all the group level names. I have added the non-standard level name "individual".
B = {individual, species, genus, family, order, class, phylum, kingdom}
Each individual animal has a unique name.
C = {Ken, Andrea, Leo, Rahh, animal123, animal124, animaldbe776b8d7a7c4a992880bc73c6454af}
Biologists combine group names to form a hierarchy, based on how specific the name is.
For example, "sapiens" is more specific than "homo" or "mammal".
In mathematics, one way to specify this is as a set of ordered pairs, generated using the operation ≤, which in this case actually means < (less than, more specific than, less general than).
The preorder relation < (or ≤) on the set A is a binary relation on A. (Definition 1.25)
We call a pair (X,≤) consisting of a set equipped with a preorder relation a preorder. (Definition 1.25)
P is a preorder.
P = (A,<)
P' is a set of ordered pairs.
P' = {(sapiens,homo), (habilis,homo), (lion,panthera), (tiger,panthera), (homo,primate), (panthera,carnivore), (primate,mammal), (carnivore,mammal)}
Note that the details of the binary relation (for the purposes of computer parsing) will only be known once the monotonic map is created.
In the software world, you need a Comparator that can be automatically called to determine if b is < > = to c.
The monotone map M consists of a set of ordered pairs that connect elements of set A with elements of set B. M is a subset of AxB.
M = {(sapiens,species), (habilis,species), (lion,species), (tiger,species), (homo,genus), (panthera,genus), (primate,order), (carnivore,order), (mammal,class)}
Then I can compute:
Q = (B, <)
Q' = {(individual,species), (species,genus), (genus,family), (family,order), (order,class), (class,phylum), (phylum,kingdom)}
end
=====
complete product of AxA
≤ sapiens habilis homo primate lion tiger panthera carnivore mammal
---------- ------- ------- ---- ------- ---- ----- -------- --------- ------
sapiens x
habilis x
homo x
primate x
lion x
tiger x
panthera x
carnivore x
mammal x
TODO add various exports
IH mammal _other,ChapTree
IH mammal MindMap
Preorder Comparator
-------------------
for each pair of elements (x,y) in the product of AxA
if x.m < y.m
then
x < y
add the pair (x,y) to the set P'
Note:
- Java has the concept of a Comparator [ref 7]
- JavaScript Array.prototype.sort provides something similar [ref 8]
once again - the steps in the correct order
----------
Step 1 - specify the group level names; these are not dependant on anything else
B = {individual, species, genus, family, order, class, phylum, kingdom}
Step 2 - specify a preorder on B; the preorder is a subset of BxB
Q = (B, <)
Q' = {(individual,species), (species,genus), (genus,family), (family,order), (order,class), (class,phylum), (phylum,kingdom)}
Step 3 - specify the group names
A = {sapiens, habilis, homo, primate, lion, tiger, panthera, carnivore, mammal}
Step 4 - specify a monotonic map; AxB
M = {(sapiens,species), (habilis,species), (lion,species), (tiger,species), (homo,genus), (panthera,genus), (primate,order), (carnivore,order), (mammal,class)}
Step 5 - specify a preorder on A
P = (A, <)
P' = {(sapiens,homo), (habilis,homo), (lion,panthera), (tiger,panthera), (homo,primate), (panthera,carnivore), (primate,mammal), (carnivore,mammal)}
Plus - I need to write code (the Preorder Comparator) to automatically perform step 5
end
==========
To transform the Math/DSL notation into a JavaScript Object structure and JSON
------------
Math notation -> JavaScript
simple set Array
ordered pair Object
set of ordered pairs ?
Total transformation process
----------------------------
example in the book ->
my Math/DSL notation ->
JavaScript Object structure ->
JSON &
Xholon app
Note: this is a gradual process of moving from Math to executable Code
JavaScript Object structure
---------------------------
// the game here is to specify all the parts as JavaScript arrays or objects, all nested within a single outermost object
const JSON_SPACE = 2; // < 1 means no pretty-printing
var mstruct = {};
// SET: A individual,species,genus,family,order,class,phylum,kingdom
mstruct["A"] = ["individual","species","genus","family","order","class","phylum","kingdom"];
// OPAIR: P A,<
mstruct["P"] = {"A":"<"};
// SETOPAIR: Q (individual,species),(species,genus),(genus,family),(family,order),(order,class),(class,phylum),(phylum,kingdom)
// Q is a subset of AxA
mstruct["Q"] = [{"individual":"species"},{"species":"genus"},{"genus":"family"},{"family":"order"},{"order":"class"},{"class":"phylum"},{"phylum":"kingdom"}];
// maybe mstruct["Q"] = [{"A":"A"},{"individual":"species"}, ...];
// or maybe mstruct["Q"] = [{"A.individual":"A.species"}, ...];
// SET: B sapiens,habilis,homo,primate,lion,tiger,panthera,carnivore,mammal
mstruct["B"] = ["sapiens","habilis","homo","primate","lion","tiger","panthera","carnivore","mammal"];
// SETOPAIR: M (sapiens,species),(habilis,species),(lion,species),(tiger,species),(homo,genus),(panthera,genus),(primate,order),(carnivore,order),(mammal,class)
// M is a subset of BxA
mstruct["M"] = [{"sapiens":"species"},{"habilis":"species"},{"lion":"species"},{"tiger":"species"},{"homo":"genus"},{"panthera":"genus"},{"primate":"order"},{"carnivore":"order"},{"mammal":"class"}];
// mstruct["M"] = [{"B":"A"},{"sapiens":"species"}, ...];
// mstruct["M"] = [{"B.sapiens":"A.species"}, ...];
// OPAIR: R B,<
mstruct["R"] = {"B":"<"};
// SETOPAIR: S (sapiens,homo),(habilis,homo),(lion,panthera),(tiger,panthera),(homo,primate),(panthera,carnivore),(primate,mammal),(carnivore,mammal)
// S is a subset of BxB
mstruct["S"] = [{"sapiens":"homo"},{"habilis":"homo"},{"lion":"panthera"},{"tiger":"panthera"},{"homo":"primate"},{"panthera":"carnivore"},{"primate":"mammal"},{"carnivore":"mammal"}];
console.log(mstruct);
var mstructJSON = JSON.stringify(mstruct, null, JSON_SPACE);
console.log(mstructJSON);
as JSON
-------
{"A":["individual","species","genus","family","order","class","phylum","kingdom"],"P":{"A":"<"},"Q":[{"individual":"species"},{"species":"genus"},{"genus":"family"},{"family":"order"},{"order":"class"},{"class":"phylum"},{"phylum":"kingdom"}],"B":["sapiens","habilis","homo","primate","lion","tiger","panthera","carnivore","mammal"],"M":[{"sapiens":"species"},{"habilis":"species"},{"lion":"species"},{"tiger":"species"},{"homo":"genus"},{"panthera":"genus"},{"primate":"order"},{"carnivore":"order"},{"mammal":"class"}],"R":{"B":"<"},"S":[{"sapiens":"homo"},{"habilis":"homo"},{"lion":"panthera"},{"tiger":"panthera"},{"homo":"primate"},{"panthera":"carnivore"},{"primate":"mammal"},{"carnivore":"mammal"}]}
{
"A": [
"individual",
"species",
"genus",
"family",
"order",
"class",
"phylum",
"kingdom"
],
"P": {
"A": "<"
},
"Q": [
{
"individual": "species"
},
{
"species": "genus"
},
{
"genus": "family"
},
{
"family": "order"
},
{
"order": "class"
},
{
"class": "phylum"
},
{
"phylum": "kingdom"
}
],
"B": [
"sapiens",
"habilis",
"homo",
"primate",
"lion",
"tiger",
"panthera",
"carnivore",
"mammal"
],
"M": [
{
"sapiens": "species"
},
{
"habilis": "species"
},
{
"lion": "species"
},
{
"tiger": "species"
},
{
"homo": "genus"
},
{
"panthera": "genus"
},
{
"primate": "order"
},
{
"carnivore": "order"
},
{
"mammal": "class"
}
],
"R": {
"B": "<"
},
"S": [
{
"sapiens": "homo"
},
{
"habilis": "homo"
},
{
"lion": "panthera"
},
{
"tiger": "panthera"
},
{
"homo": "primate"
},
{
"panthera": "carnivore"
},
{
"primate": "mammal"
},
{
"carnivore": "mammal"
}
]
}
November 23, 2019
In definition 1.54 [ref 1], the preorders are labeled:
(A,≤A) and (B,≤B)
This makes it clear that there are two separate binary operations, ≤A that operates on set A, and ≤B that operates on set B.
Note that A and B should be subscripted in ≤A and ≤B .
An alternative
A is a set of bins. There are 8 bins.
Each element of set B is instead an element of one of the bins in set A.
ex: lion and tiger are subclasses of species
TODO think through the separate IH and CSH hierarchies: types and instances
In software development, these are analysis and design questions.
As we scale-up the number of species (possibly millions) and individuals (possibly billions or trillions), what data structures are practical?
But perhaps, in analysis and design, I can use the helpful organizing concepts of Math, and later write some code that will transform this to a more efficient implementation scheme?
possible CSH (with an implied order)
------------
species
sapiens
habilis
lion
tiger
genus
homo
panthers
family
order
primate
carnivore
class
mammal
phylum
kingdom
Then we use ports to connect from left to right, for example from sapiens to homo.
This is a more classic Xholon formulation.
How do I decide which is better?
Set vs Types approach?
Can one approach be readily converted to the other?
Dealing with "order" is an important thing.
The basic pattern I'm exploring in this workbook, in terms of JavaScript:
- sorting array A using a map from A to an already-sorted array B
- each element in A points to an element in B
- each element in B may point to another element in B (this defines the order)
A -> B -> B
- implicitly, this defines an order from elements in A to other elements in A A -> A
Graphviz
--------
This Graphviz program uses the order of a b c d e, to display one two three four five in a corresponding order.
In this case, it's the Graphviz layout algorithm and program (dot) that lays out the graph in what it considers to be the "best" way.
see: http://www.webgraphviz.com/
digraph G {
d b a e c
a -> b -> c -> d -> e
five four six two one three seven
three -> c
five -> e
four -> d
two -> b
one -> a
}
This undirected cyclic graph does much the same.
graph G {
d b a e c
a -- b -- c -- d -- e -- a
five four two one three
three -- c
five -- e
four -- d
two -- b
one -- a
}
JavaScript arrays
-----------------
Here is the start of the same type of graph in JavaScript, based on two arrays a and b:
var a = [{},{},{},{},{}];
var b = [{},{},{},{},{}];
b[0].next = b[1];
b[1].next = b[2];
b[2].next = b[3];
b[3].next = b[4];
b[4].next = null;
a[0].b = b[1];
References
----------
(1) Fong, Brendan and Spivak, David I. (2019), "An Invitation to Applied Category Theory: Seven Sketches in Compositionality" book
(2) https://github.com/ATALLC/AppliedCategoryTheory
(3) https://forum.azimuthproject.org/discussion/1807/lecture-1-introduction
(4) https://forum.azimuthproject.org/discussion/comment/16314/#Comment_16314
examples of notation
(5) http://cartographer.id/
cartographer - a tool for string diagrammatic reasoning
) http://cartographer.id/cartographer-calco-2019.pdf
(6) https://cranky-goldstine-6a507b.netlify.com/
a tool
(7) https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html
public interface Comparator<T>
A comparison function, which imposes a total ordering on some collection of objects.
Comparators can be passed to a sort method (such as Collections.sort or Arrays.sort) to allow precise control over the sort order.
Comparators can also be used to control the order of certain data structures (such as sorted sets or sorted maps), or to provide an ordering for collections of objects that don't have a natural ordering.
(8) https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
arr.sort([compareFunction])
compareFunction Optional
Specifies a function that defines the sort order. If omitted, the array elements are converted to strings, then sorted according to each character's Unicode code point value.
firstEl
The first element for comparison.
secondEl
The second element for comparison.
(9) https://en.wikipedia.org/wiki/Monotonic_function
In mathematics, a monotonic function (or monotone function) is a function between ordered sets that preserves or reverses the given order.
This concept first arose in calculus, and was later generalized to the more abstract setting of order theory.
(10) https://www.youtube.com/results?search_query=seven+sketches+in+compositionality+_
a playlist of 21 videos with David and Brendan presenting topics from the book
) Seven Sketches in Compositionality, Lecture 1.1 (David)
poset (partially ordered set)
1:13 David gives a good example of a generative effect, and I find that he explains the concept better than it's explained in the book
he draws on the blackboard and describes the example, providing a timeline that may make a good foundation for a Xholon model
cascade effects (generative effects)
2:50 partitions
10:00 join, notion of order
join, meet
poset
18:10 example "tree of life"
) Seven Sketches in Compositionality, Lecture 1.2 (David)
0:00 continuation of "tree of life" example
0:35 join of lion and tiger is panthera; not everything has a meet
graphs -> posets (functors in CT)
(11) https://github.com/DSLsofMath/DSLsofMath
Domain Specific Languages of Mathematics
(12) https://en.wikipedia.org/wiki/Tree_of_life
The tree of life is a widespread myth (mytheme) or archetype in the world's mythologies, related to the concept of sacred tree more generally, and hence in religious and philosophical tradition.
(13) https://en.wikipedia.org/wiki/Taxonomy_(biology)
In biology, taxonomy (from Ancient Greek τάξις (taxis), meaning 'arrangement', and -νομία (-nomia), meaning 'method') is the science of naming,
defining (circumscribing) and classifying groups of biological organisms on the basis of shared characteristics.
Organisms are grouped together into taxa (singular: taxon) and these groups are given a taxonomic rank; groups of a given rank can be aggregated
to form a super-group of higher rank, thus creating a taxonomic hierarchy.
The principal ranks in modern use are domain, kingdom, phylum (division is sometimes used in botany in place of phylum), class, order, family, genus, and species.
The Swedish botanist Carl Linnaeus is regarded as the founder of the current system of taxonomy,
as he developed a system known as Linnaean taxonomy for categorizing organisms and binomial nomenclature for naming organisms.
With the advent of such fields of study as phylogenetics, cladistics, and systematics,
the Linnaean system has progressed to a system of modern biological classification based on the evolutionary relationships between organisms, both living and extinct.
(14) https://gist.github.com/kenwebb/9500085
that pre-existing workbook provides an eexample of using childSuperClass
based on that example, in the present workbook I use:
<TreeLevelNames childSuperClass="TreeLevelName"/>
]]></Notes>
<_-.XholonClass>
<ActSystem/> <!-- Applied Category Theory (ACT) system -->
<!--
Consider the set of all animal classifications, for example "tiger", "mammal", "sapiens", "carnivore", etc.
These are ordered by specificity: since "tiger" is a type of "mammal", we write tiger ≤ mammal.
The result is a preorder, which in fact forms a tree, often called the tree of life.
At the top of the following diagram we see a small part of it:
[ref 1]
In Xholon it's natural to represent this as an a class (type) inheritance hierarchy, for example:
- Tiger is a subclass (subtype) of Mammal
-->
<AnimalClassification>
<mammal>
<primate>
<homo>
<sapiens/>
<habilis/>
</homo>
</primate>
<carnivore>
<panthera>
<lion/>
<tiger/>
</panthera>
</carnivore>
</mammal>
</AnimalClassification>
<!-- the set of all animal classifications -->
<AnimalClassifications/>
<!--
At the bottom we see the hierarchical structure as a preorder. [ref 1]
For lack of a better name, I will call this the set of tree level names.
Each subclass is a singleton.
I don't know yet whether this is a tree (phylum a subclass of kingdom), a directed acyclic graph (DAG) (subclasses have an order), or something else.
- within the Xholon inheritance hierarchy, they are in fact just names, with an order yet to be specified,
although weakly implied by the sequential listing of the names (speciesTRN is listed before genusTRN)
I'm appending TRN to the end of each name, to avoid conflict with other names in Xholon.
Note: Xholon already has a mechanism where I can specify that any item in the CSH that is contained with TreeLevelNames is in fact a subclass of TreeLevelName.
childSuperClass
TODO
- extend this to include individualTRN, so I can represent individual animals
- reverse the order of placement so that kingdomTRN is first and speciesTRN is last, to be consistent with the order under AnimalClassification
- the math concepts of preorder and monotone map, provide strong support for this
- alternatively, both lists could NOT be ordered from most specific to least specific
- this would not work with the AnimalClassification hierarchy, which is a tree structure
- this may not really matter; left and right, and up and down, do not necessarily imply the direction of an order, but only a relative ordering
- ABCDEFG only implies that D is closer to C and E than it is to A or G
-->
<!--
<TreeLevelName>
<speciesTRN/>
<genusTRN/>
<familyTRN/>
<orderTRN/>
<classTRN/>
<phylumTRN/>
<kingdomTRN/>
</TreeLevelName>
-->
<!--
this appears to be the obvious way to order the items, using the math ideas as a guideline
also, I've added individualTRN
-->
<TreeLevelName>
<!-- these subclasses do not need to be explicity specified, because I use <TreeLevelNames childSuperClass="TreeLevelName"/> -->
<!--<kingdomTRN/>
<phylumTRN/>
<classTRN/>
<orderTRN/>
<familyTRN/>
<genusTRN/>
<speciesTRN/>
<individualTRN/>-->
</TreeLevelName>
<!-- the set of all tree level names -->
<TreeLevelNames childSuperClass="TreeLevelName"/>
<!-- a set of individual animals -->
<Animals/>
<MathParser superClass="script"/>
</_-.XholonClass>
<xholonClassDetails>
<!-- this is unnecessary, and is only an example of the use of childSuperClass -->
<!--<TreeLevelNames/>-->
<MathParser><DefaultContent><![CDATA[
var me, spec, beh = {
postConfigure: function() {
me = this.cnode.parent();
me.println("I am " + me.name());
spec = me.first().text().trim();
me.first().remove(); // remove the Attribute_String node
this.parseSpec(spec);
this.cnode.remove(); // remove this BigraphParser node
},
act: function() {
//myHeight.println(this.toString());
},
parseSpec: function(spec) {
const arr = spec.split("\n"); // there must be 2 back-slashes here
//console.log(arr);
for (var i = 0; i < arr.length; i++) {
const line = arr[i].trim();
const larr = line.split("=");
const larr0 = larr[0].trim();
const larr1 = larr[1] ? larr[1].trim() : "";
//me.println("XXX" + (i+1) + " " + larr0 + " = " + larr1);
switch (larr1.charAt(0)) {
case "{":
this.parseSet(larr0, larr1.substring(1, larr1.length - 1).replace(/ /g, ""));
break;
case "(":
this.parseOrderedPair(larr0, larr1.substring(1, larr1.length - 1).replace(/ /g, ""));
break;
default:
//me.println("DEFAULT: " + line);
if (line.length == 0) {
// this is a blank line
}
else if (line.startsWith("#")) {
me.println("COMMENT:" + line.substring(1));
}
break;
}
}
},
// A individual,species,genus,family,order,class,phylum,kingdom
// Q (individual,species),(species,genus),(genus,family),(family,order),(order,class),(class,phylum),(phylum,kingdom)
parseSet: function(setName, str) {
if (str.startsWith("(")) {
this.parseSetOfOrderedPairs(setName, str);
}
else {
me.println("SET: " + setName + " " + str);
}
},
// Q (individual,species),(species,genus),(genus,family),(family,order),(order,class),(class,phylum),(phylum,kingdom)
parseSetOfOrderedPairs: function(setName, str) {
me.println("SETOPAIR: " + setName + " " + str);
},
// P (B,<)
parseOrderedPair: function(opairName, str) {
me.println("OPAIR: " + opairName + " " + str);
}
}
]]></DefaultContent></MathParser>
<Avatar><Color>rgba(200,0,0,1.0)</Color></Avatar>
</xholonClassDetails>
<ActSystem>
<!-- TODO how do I represent the monotone map ? -->
<TreeLevelNames>
<individualTRN/>
<speciesTRN/>
<genusTRN/>
<familyTRN/>
<orderTRN/>
<classTRN/>
<phylumTRN/>
<kingdomTRN/>
<dummyTRN/>
</TreeLevelNames>
<!--
the animals are all individuals (individualTRN ex: "Ken") that are members of specific species (speciesTRN ex: sapiens)
individuals are not ordered in any specific way
individuals are connected to a genus, etc. by following the links up the AnimalClassification tree of life
- the genus of sapiens "Ken" is homo, because the parent of sapiens is homo
- the order of genus "homo" is primate, because the parent of homo is primate
- etc.
-->
<Animals>
<sapiens roleName="Ken"/>
<sapiens roleName="Andrea"/>
<lion roleName="Leo"/>
<tiger roleName="Rahh"/>
</Animals>
<MathStructure><Attribute_String><![CDATA[
# Step 1 - specify the group level names; these are not dependant on anything else
A = {individual, species, genus, family, order, class, phylum, kingdom}
# Step 2 - specify a preorder on A; the preorder is a subset of AxA
P = (A, <)
Q = {(individual,species), (species,genus), (genus,family), (family,order), (order,class), (class,phylum), (phylum,kingdom)}
# Step 3 - specify the group names
B = {sapiens, habilis, homo, primate, lion, tiger, panthera, carnivore, mammal}
# Step 4 - specify a monotonic map; AxB
M = {(sapiens,species), (habilis,species), (lion,species), (tiger,species), (homo,genus), (panthera,genus), (primate,order), (carnivore,order), (mammal,class)}
# Step 5 - specify a preorder on B
R = (B, <)
S = {(sapiens,homo), (habilis,homo), (lion,panthera), (tiger,panthera), (homo,primate), (panthera,carnivore), (primate,mammal), (carnivore,mammal)}
# Plus - I need to write code (the Preorder Comparator) to automatically perform step 5
]]></Attribute_String>
<MathParser/>
</MathStructure>
</ActSystem>
<ActSystembehavior implName="org.primordion.xholon.base.Behavior_gwtjs"><![CDATA[
var a = 123;
var b = 456;
var c = a * b;
if (console) {
console.log(c);
}
//# sourceURL=ActSystembehavior.js
]]></ActSystembehavior>
<SvgClient><Attribute_String roleName="svgUri"><![CDATA[data:image/svg+xml,
<svg width="100" height="50" xmlns="http://www.w3.org/2000/svg">
<g>
<title>Animals</title>
<rect id="ActSystem/Animals" fill="#98FB98" height="50" width="50" x="25" y="0"/>
<g>
<title>sapiens</title>
<rect id="ActSystem/Animals/sapiens" fill="#6AB06A" height="50" width="10" x="80" y="0"/>
</g>
</g>
</svg>
<!-- Mindmap with freemind -->
<svg fill-opacity="1" xmlns:xlink="http://www.w3.org/1999/xlink" color-rendering="auto" color-interpolation="auto" text-rendering="auto" stroke="black" stroke-linecap="square" width="311" stroke-miterlimit="10" shape-rendering="auto" stroke-opacity="1" fill="black" stroke-dasharray="none" font-weight="normal" stroke-width="1" height="85" xmlns="http://www.w3.org/2000/svg" font-family="&apos;Arial&apos;" font-style="normal" stroke-linejoin="miter" font-size="12" stroke-dashoffset="0" image-rendering="auto"
><!--Generated by the Batik Graphics2D SVG Generator--><defs id="genericDefs"
/><g
><defs id="defs1"
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath1"
><path d="M0 0 L4115 0 L4115 1819 L0 1819 L0 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath2"
><path d="M0 0 L0 185 L411 185 L411 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath3"
><path d="M0 0 L0 38 L70 38 L70 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath4"
><path d="M0 0 L0 141 L321 141 L321 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath5"
><path d="M0 0 L0 19 L10 19 L10 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath6"
><path d="M0 0 L0 19 L70 19 L70 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath7"
><path d="M0 0 L0 26 L26 26 L26 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath8"
><path d="M0 0 L0 141 L231 141 L231 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath9"
><path d="M0 0 L0 119 L141 119 L141 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath10"
><path d="M0 0 L0 19 L41 19 L41 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath11"
><path d="M0 0 L0 119 L134 119 L134 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath12"
><path d="M0 0 L0 19 L34 19 L34 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath13"
><path d="M0 0 L0 141 L308 141 L308 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath14"
><path d="M0 0 L0 19 L60 19 L60 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath15"
><path d="M0 0 L0 141 L228 141 L228 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath16"
><path d="M0 0 L0 19 L47 19 L47 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath17"
><path d="M0 0 L0 119 L152 119 L152 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath18"
><path d="M0 0 L0 19 L52 19 L52 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath19"
><path d="M0 0 L0 119 L161 119 L161 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath20"
><path d="M0 0 L0 19 L61 19 L61 0 Z"
/></clipPath
><font horiz-adv-x="60.0" id="font1"
><font-face ascent="92.822266" font-style="normal" descent="23.583984" units-per-em="100" font-family="sans-serif" font-weight="normal"
/><missing-glyph horiz-adv-x="60.0" d="M4.984375 -17.671875 L4.984375 70.515625 L54.984375 70.515625 L54.984375 -17.671875 L4.984375 -17.671875 ZM10.59375 -12.109375 L49.421875 -12.109375 L49.421875 64.890625 L10.59375 64.890625 L10.59375 -12.109375 Z"
/><glyph unicode="l" horiz-adv-x="28.0" d="M9.421875 75.984375 L18.40625 75.984375 L18.40625 0 L9.421875 0 L9.421875 75.984375 Z"
/><glyph unicode="a" horiz-adv-x="61.0" d="M34.28125 27.484375 Q23.390625 27.484375 19.1875 25 Q14.984375 22.515625 14.984375 16.5 Q14.984375 11.71875 18.140625 8.9140625 Q21.296875 6.109375 26.703125 6.109375 Q34.1875 6.109375 38.703125 11.40625 Q43.21875 16.703125 43.21875 25.484375 L43.21875 27.484375 L34.28125 27.484375 ZM52.203125 31.203125 L52.203125 0 L43.21875 0 L43.21875 8.296875 Q40.140625 3.328125 35.546875 0.953125 Q30.953125 -1.421875 24.3125 -1.421875 Q15.921875 -1.421875 10.9609375 3.296875 Q6 8.015625 6 15.921875 Q6 25.140625 12.1796875 29.828125 Q18.359375 34.515625 30.609375 34.515625 L43.21875 34.515625 L43.21875 35.40625 Q43.21875 41.609375 39.140625 45 Q35.0625 48.390625 27.6875 48.390625 Q23 48.390625 18.5546875 47.265625 Q14.109375 46.140625 10.015625 43.890625 L10.015625 52.203125 Q14.9375 54.109375 19.578125 55.0546875 Q24.21875 56 28.609375 56 Q40.484375 56 46.34375 49.8515625 Q52.203125 43.703125 52.203125 31.203125 Z"
/><glyph unicode="m" horiz-adv-x="97.0" d="M52 44.1875 Q55.375 50.25 60.0625 53.125 Q64.75 56 71.09375 56 Q79.640625 56 84.28125 50.0234375 Q88.921875 44.046875 88.921875 33.015625 L88.921875 0 L79.890625 0 L79.890625 32.71875 Q79.890625 40.578125 77.1015625 44.3828125 Q74.3125 48.1875 68.609375 48.1875 Q61.625 48.1875 57.5703125 43.5546875 Q53.515625 38.921875 53.515625 30.90625 L53.515625 0 L44.484375 0 L44.484375 32.71875 Q44.484375 40.625 41.703125 44.40625 Q38.921875 48.1875 33.109375 48.1875 Q26.21875 48.1875 22.1640625 43.53125 Q18.109375 38.875 18.109375 30.90625 L18.109375 0 L9.078125 0 L9.078125 54.6875 L18.109375 54.6875 L18.109375 46.1875 Q21.1875 51.21875 25.484375 53.609375 Q29.78125 56 35.6875 56 Q41.65625 56 45.828125 52.9765625 Q50 49.953125 52 44.1875 Z"
/><glyph unicode="e" horiz-adv-x="62.0" d="M56.203125 29.59375 L56.203125 25.203125 L14.890625 25.203125 Q15.484375 15.921875 20.484375 11.0625 Q25.484375 6.203125 34.421875 6.203125 Q39.59375 6.203125 44.453125 7.46875 Q49.3125 8.734375 54.109375 11.28125 L54.109375 2.78125 Q49.265625 0.734375 44.1875 -0.34375 Q39.109375 -1.421875 33.890625 -1.421875 Q20.796875 -1.421875 13.15625 6.1953125 Q5.515625 13.8125 5.515625 26.8125 Q5.515625 40.234375 12.765625 48.1171875 Q20.015625 56 32.328125 56 Q43.359375 56 49.78125 48.8984375 Q56.203125 41.796875 56.203125 29.59375 ZM47.21875 32.234375 Q47.125 39.59375 43.09375 43.9921875 Q39.0625 48.390625 32.421875 48.390625 Q24.90625 48.390625 20.390625 44.140625 Q15.875 39.890625 15.1875 32.171875 L47.21875 32.234375 Z"
/><glyph unicode="o" horiz-adv-x="61.0" d="M30.609375 48.390625 Q23.390625 48.390625 19.1875 42.75 Q14.984375 37.109375 14.984375 27.296875 Q14.984375 17.484375 19.1640625 11.84375 Q23.34375 6.203125 30.609375 6.203125 Q37.796875 6.203125 41.9921875 11.8671875 Q46.1875 17.53125 46.1875 27.296875 Q46.1875 37.015625 41.9921875 42.703125 Q37.796875 48.390625 30.609375 48.390625 ZM30.609375 56 Q42.328125 56 49.0234375 48.3828125 Q55.71875 40.765625 55.71875 27.296875 Q55.71875 13.875 49.0234375 6.2265625 Q42.328125 -1.421875 30.609375 -1.421875 Q18.84375 -1.421875 12.1796875 6.2265625 Q5.515625 13.875 5.515625 27.296875 Q5.515625 40.765625 12.1796875 48.3828125 Q18.84375 56 30.609375 56 Z"
/><glyph unicode="v" horiz-adv-x="59.0" d="M2.984375 54.6875 L12.5 54.6875 L29.59375 8.796875 L46.6875 54.6875 L56.203125 54.6875 L35.6875 0 L23.484375 0 L2.984375 54.6875 Z"
/><glyph unicode="i" horiz-adv-x="28.0" d="M9.421875 54.6875 L18.40625 54.6875 L18.40625 0 L9.421875 0 L9.421875 54.6875 ZM9.421875 75.984375 L18.40625 75.984375 L18.40625 64.59375 L9.421875 64.59375 L9.421875 75.984375 Z"
/><glyph unicode="n" horiz-adv-x="63.0" d="M54.890625 33.015625 L54.890625 0 L45.90625 0 L45.90625 32.71875 Q45.90625 40.484375 42.875 44.3359375 Q39.84375 48.1875 33.796875 48.1875 Q26.515625 48.1875 22.3125 43.5546875 Q18.109375 38.921875 18.109375 30.90625 L18.109375 0 L9.078125 0 L9.078125 54.6875 L18.109375 54.6875 L18.109375 46.1875 Q21.34375 51.125 25.7109375 53.5625 Q30.078125 56 35.796875 56 Q45.21875 56 50.0546875 50.171875 Q54.890625 44.34375 54.890625 33.015625 Z"
/><glyph unicode="r" horiz-adv-x="41.0" d="M41.109375 46.296875 Q39.59375 47.171875 37.8125 47.5859375 Q36.03125 48 33.890625 48 Q26.265625 48 22.1875 43.046875 Q18.109375 38.09375 18.109375 28.8125 L18.109375 0 L9.078125 0 L9.078125 54.6875 L18.109375 54.6875 L18.109375 46.1875 Q20.953125 51.171875 25.4921875 53.5859375 Q30.03125 56 36.53125 56 Q37.453125 56 38.578125 55.8828125 Q39.703125 55.765625 41.0625 55.515625 L41.109375 46.296875 Z"
/><glyph unicode="c" horiz-adv-x="55.0" d="M48.78125 52.59375 L48.78125 44.1875 Q44.96875 46.296875 41.140625 47.34375 Q37.3125 48.390625 33.40625 48.390625 Q24.65625 48.390625 19.8203125 42.8515625 Q14.984375 37.3125 14.984375 27.296875 Q14.984375 17.28125 19.8203125 11.7421875 Q24.65625 6.203125 33.40625 6.203125 Q37.3125 6.203125 41.140625 7.25 Q44.96875 8.296875 48.78125 10.40625 L48.78125 2.09375 Q45.015625 0.34375 40.9921875 -0.5390625 Q36.96875 -1.421875 32.421875 -1.421875 Q20.0625 -1.421875 12.7890625 6.34375 Q5.515625 14.109375 5.515625 27.296875 Q5.515625 40.671875 12.8671875 48.3359375 Q20.21875 56 33.015625 56 Q37.15625 56 41.109375 55.1484375 Q45.0625 54.296875 48.78125 52.59375 Z"
/><glyph unicode="h" horiz-adv-x="63.0" d="M54.890625 33.015625 L54.890625 0 L45.90625 0 L45.90625 32.71875 Q45.90625 40.484375 42.875 44.3359375 Q39.84375 48.1875 33.796875 48.1875 Q26.515625 48.1875 22.3125 43.5546875 Q18.109375 38.921875 18.109375 30.90625 L18.109375 0 L9.078125 0 L9.078125 75.984375 L18.109375 75.984375 L18.109375 46.1875 Q21.34375 51.125 25.7109375 53.5625 Q30.078125 56 35.796875 56 Q45.21875 56 50.0546875 50.171875 Q54.890625 44.34375 54.890625 33.015625 Z"
/><glyph unicode="t" horiz-adv-x="39.0" d="M18.3125 70.21875 L18.3125 54.6875 L36.8125 54.6875 L36.8125 47.703125 L18.3125 47.703125 L18.3125 18.015625 Q18.3125 11.328125 20.140625 9.421875 Q21.96875 7.515625 27.59375 7.515625 L36.8125 7.515625 L36.8125 0 L27.59375 0 Q17.1875 0 13.234375 3.8828125 Q9.28125 7.765625 9.28125 18.015625 L9.28125 47.703125 L2.6875 47.703125 L2.6875 54.6875 L9.28125 54.6875 L9.28125 70.21875 L18.3125 70.21875 Z"
/><glyph unicode="p" horiz-adv-x="63.0" d="M18.109375 8.203125 L18.109375 -20.796875 L9.078125 -20.796875 L9.078125 54.6875 L18.109375 54.6875 L18.109375 46.390625 Q20.953125 51.265625 25.2734375 53.6328125 Q29.59375 56 35.59375 56 Q45.5625 56 51.7890625 48.09375 Q58.015625 40.1875 58.015625 27.296875 Q58.015625 14.40625 51.7890625 6.4921875 Q45.5625 -1.421875 35.59375 -1.421875 Q29.59375 -1.421875 25.2734375 0.953125 Q20.953125 3.328125 18.109375 8.203125 ZM48.6875 27.296875 Q48.6875 37.203125 44.609375 42.84375 Q40.53125 48.484375 33.40625 48.484375 Q26.265625 48.484375 22.1875 42.84375 Q18.109375 37.203125 18.109375 27.296875 Q18.109375 17.390625 22.1875 11.75 Q26.265625 6.109375 33.40625 6.109375 Q40.53125 6.109375 44.609375 11.75 Q48.6875 17.390625 48.6875 27.296875 Z"
/><glyph unicode="g" horiz-adv-x="63.0" d="M45.40625 27.984375 Q45.40625 37.75 41.3828125 43.1171875 Q37.359375 48.484375 30.078125 48.484375 Q22.859375 48.484375 18.828125 43.1171875 Q14.796875 37.75 14.796875 27.984375 Q14.796875 18.265625 18.828125 12.890625 Q22.859375 7.515625 30.078125 7.515625 Q37.359375 7.515625 41.3828125 12.890625 Q45.40625 18.265625 45.40625 27.984375 ZM54.390625 6.78125 Q54.390625 -7.171875 48.1953125 -13.984375 Q42 -20.796875 29.203125 -20.796875 Q24.46875 -20.796875 20.265625 -20.09375 Q16.0625 -19.390625 12.109375 -17.921875 L12.109375 -9.1875 Q16.0625 -11.328125 19.921875 -12.3515625 Q23.78125 -13.375 27.78125 -13.375 Q36.625 -13.375 41.015625 -8.765625 Q45.40625 -4.15625 45.40625 5.171875 L45.40625 9.625 Q42.625 4.78125 38.28125 2.390625 Q33.9375 0 27.875 0 Q17.828125 0 11.671875 7.6640625 Q5.515625 15.328125 5.515625 27.984375 Q5.515625 40.671875 11.671875 48.3359375 Q17.828125 56 27.875 56 Q33.9375 56 38.28125 53.609375 Q42.625 51.21875 45.40625 46.390625 L45.40625 54.6875 L54.390625 54.6875 L54.390625 6.78125 Z"
/><glyph unicode="s" horiz-adv-x="52.0" d="M44.28125 53.078125 L44.28125 44.578125 Q40.484375 46.53125 36.3828125 47.5078125 Q32.28125 48.484375 27.875 48.484375 Q21.1875 48.484375 17.84375 46.4375 Q14.5 44.390625 14.5 40.28125 Q14.5 37.15625 16.890625 35.375 Q19.28125 33.59375 26.515625 31.984375 L29.59375 31.296875 Q39.15625 29.25 43.1875 25.515625 Q47.21875 21.78125 47.21875 15.09375 Q47.21875 7.46875 41.1875 3.0234375 Q35.15625 -1.421875 24.609375 -1.421875 Q20.21875 -1.421875 15.453125 -0.5625 Q10.6875 0.296875 5.421875 2 L5.421875 11.28125 Q10.40625 8.6875 15.234375 7.3984375 Q20.0625 6.109375 24.8125 6.109375 Q31.15625 6.109375 34.5703125 8.28125 Q37.984375 10.453125 37.984375 14.40625 Q37.984375 18.0625 35.5234375 20.015625 Q33.0625 21.96875 24.703125 23.78125 L21.578125 24.515625 Q13.234375 26.265625 9.5234375 29.90625 Q5.8125 33.546875 5.8125 39.890625 Q5.8125 47.609375 11.28125 51.8046875 Q16.75 56 26.8125 56 Q31.78125 56 36.1796875 55.2734375 Q40.578125 54.546875 44.28125 53.078125 Z"
/><glyph unicode="b" horiz-adv-x="63.0" d="M48.6875 27.296875 Q48.6875 37.203125 44.609375 42.84375 Q40.53125 48.484375 33.40625 48.484375 Q26.265625 48.484375 22.1875 42.84375 Q18.109375 37.203125 18.109375 27.296875 Q18.109375 17.390625 22.1875 11.75 Q26.265625 6.109375 33.40625 6.109375 Q40.53125 6.109375 44.609375 11.75 Q48.6875 17.390625 48.6875 27.296875 ZM18.109375 46.390625 Q20.953125 51.265625 25.2734375 53.6328125 Q29.59375 56 35.59375 56 Q45.5625 56 51.7890625 48.09375 Q58.015625 40.1875 58.015625 27.296875 Q58.015625 14.40625 51.7890625 6.4921875 Q45.5625 -1.421875 35.59375 -1.421875 Q29.59375 -1.421875 25.2734375 0.953125 Q20.953125 3.328125 18.109375 8.203125 L18.109375 0 L9.078125 0 L9.078125 75.984375 L18.109375 75.984375 L18.109375 46.390625 Z"
/></font
></defs
><g font-size="14.666666984558" transform="translate(-1902,-867)" fill="white" text-rendering="optimizeSpeed" font-family="&apos;Ubuntu&apos;" shape-rendering="crispEdges" stroke="white"
><rect x="0" width="4115" height="1819" y="0" clip-path="url(#clipPath1)" stroke="none"
/></g
><g fill="gray" text-rendering="optimizeSpeed" font-size="14.666666984558" font-family="&apos;Ubuntu&apos;" transform="translate(-50,-50)" stroke="gray"
><path fill="none" d="M293 92 C293 92 290 81 270 81" clip-path="url(#clipPath2)"
/><path fill="none" d="M295 104 C295 104 290 125 270 125" clip-path="url(#clipPath2)"
/></g
><g fill="white" text-rendering="optimizeSpeed" font-family="sans-serif" transform="translate(241,27)" stroke="white"
><ellipse rx="34" ry="18" clip-path="url(#clipPath3)" cx="35" cy="19" stroke="none"
/><ellipse clip-path="url(#clipPath3)" fill="none" rx="34.5" cx="34.5" ry="18.5" cy="18.5" stroke="gray"
/></g
><g text-rendering="geometricPrecision" shape-rendering="crispEdges" font-family="sans-serif" transform="translate(241,27)"
><text x="9" xml:space="preserve" y="24" clip-path="url(#clipPath3)" stroke="none"
>mammal</text
></g
><g fill="gray" text-rendering="optimizeSpeed" font-size="14.666666984558" font-family="&apos;Ubuntu&apos;" transform="translate(-50,-6)" stroke="gray"
><path fill="none" d="M201 81 C189 81 200 79 180 79" clip-path="url(#clipPath4)"
/></g
><g fill="gray" text-rendering="optimizeSpeed" font-family="sans-serif" transform="translate(151,57)" stroke="gray"
><line y2="18" fill="none" x1="0" clip-path="url(#clipPath6)" x2="70" y1="18"
/></g
><g text-rendering="geometricPrecision" shape-rendering="crispEdges" font-family="sans-serif" transform="translate(151,57)"
><text x="6" xml:space="preserve" y="14" clip-path="url(#clipPath6)" stroke="none"
>carnivore</text
></g
><g fill="gray" text-rendering="optimizeSpeed" font-size="14.666666984558" font-family="&apos;Ubuntu&apos;" transform="translate(-50,-6)" stroke="gray"
><path fill="none" d="M111 79 C99 79 110 68 90 68" clip-path="url(#clipPath8)"
/><path fill="none" d="M111 79 C99 79 110 90 90 90" clip-path="url(#clipPath8)"
/></g
><g fill="gray" text-rendering="optimizeSpeed" font-family="sans-serif" transform="translate(61,55)" stroke="gray"
><line y2="18" fill="none" x1="0" clip-path="url(#clipPath6)" x2="70" y1="18"
/></g
><g text-rendering="geometricPrecision" shape-rendering="crispEdges" font-family="sans-serif" transform="translate(61,55)"
><text x="6" xml:space="preserve" y="14" clip-path="url(#clipPath6)" stroke="none"
>panthera</text
></g
><g fill="gray" text-rendering="optimizeSpeed" font-family="sans-serif" transform="translate(0,66)" stroke="gray"
><line y2="18" fill="none" x1="0" clip-path="url(#clipPath10)" x2="41" y1="18"
/></g
><g text-rendering="geometricPrecision" shape-rendering="crispEdges" font-family="sans-serif" transform="translate(0,66)"
><text x="6" xml:space="preserve" y="14" clip-path="url(#clipPath10)" stroke="none"
>tiger</text
></g
><g fill="gray" text-rendering="optimizeSpeed" font-family="sans-serif" transform="translate(7,44)" stroke="gray"
><line y2="18" fill="none" x1="0" clip-path="url(#clipPath12)" x2="34" y1="18"
/></g
><g text-rendering="geometricPrecision" shape-rendering="crispEdges" font-family="sans-serif" transform="translate(7,44)"
><text x="6" xml:space="preserve" y="14" clip-path="url(#clipPath12)" stroke="none"
>lion</text
></g
><g fill="gray" text-rendering="optimizeSpeed" font-size="14.666666984558" font-family="&apos;Ubuntu&apos;" transform="translate(-37,-50)" stroke="gray"
><path fill="none" d="M198 81 C186 81 197 79 177 79" clip-path="url(#clipPath13)"
/></g
><g fill="gray" text-rendering="optimizeSpeed" font-family="sans-serif" transform="translate(161,13)" stroke="gray"
><line y2="18" fill="none" x1="0" clip-path="url(#clipPath14)" x2="60" y1="18"
/></g
><g text-rendering="geometricPrecision" shape-rendering="crispEdges" font-family="sans-serif" transform="translate(161,13)"
><text x="6" xml:space="preserve" y="14" clip-path="url(#clipPath14)" stroke="none"
>primate</text
></g
><g fill="gray" text-rendering="optimizeSpeed" font-size="14.666666984558" font-family="&apos;Ubuntu&apos;" transform="translate(-37,-50)" stroke="gray"
><path fill="none" d="M131 79 C119 79 130 68 110 68" clip-path="url(#clipPath15)"
/><path fill="none" d="M131 79 C119 79 130 90 110 90" clip-path="url(#clipPath15)"
/></g
><g fill="gray" text-rendering="optimizeSpeed" font-family="sans-serif" transform="translate(94,11)" stroke="gray"
><line y2="18" fill="none" x1="0" clip-path="url(#clipPath16)" x2="47" y1="18"
/></g
><g text-rendering="geometricPrecision" shape-rendering="crispEdges" font-family="sans-serif" transform="translate(94,11)"
><text x="6" xml:space="preserve" y="14" clip-path="url(#clipPath16)" stroke="none"
>homo</text
></g
><g fill="gray" text-rendering="optimizeSpeed" font-family="sans-serif" transform="translate(22,22)" stroke="gray"
><line y2="18" fill="none" x1="0" clip-path="url(#clipPath18)" x2="52" y1="18"
/></g
><g text-rendering="geometricPrecision" shape-rendering="crispEdges" font-family="sans-serif" transform="translate(22,22)"
><text x="6" xml:space="preserve" y="14" clip-path="url(#clipPath18)" stroke="none"
>habilis</text
></g
><g fill="gray" text-rendering="optimizeSpeed" font-family="sans-serif" transform="translate(13,0)" stroke="gray"
><line y2="18" fill="none" x1="0" clip-path="url(#clipPath20)" x2="61" y1="18"
/></g
><g text-rendering="geometricPrecision" shape-rendering="crispEdges" font-family="sans-serif" transform="translate(13,0)"
><text x="6" xml:space="preserve" y="14" clip-path="url(#clipPath20)" stroke="none"
>sapiens</text
></g
></g
></svg
>
<!-- d3 circle pack -->
<svg width="400" height="400"><g transform="translate(-1.2943640690703262,0.6471820345351489) scale(1)" style="stroke-width: 0.1px;"><g class="d3cpnode mammal" transform="translate(198,198)" id="mammal"><title>mammal</title><circle r="198"></circle><text dy="-190px" style="text-anchor: middle; font-size: 12px;">mammal</text></g><g class="d3cpnode primate" transform="translate(99,198)" id="primate"><title>primate</title><circle r="99" style="fill-opacity: 0;"></circle><text dy="-91px" style="text-anchor: middle; font-size: 12px;">primate</text></g><g class="d3cpdummy primate" transform="translate(18.091655765524123,198)" id="primate"><title>primate</title><circle r="18.091655765524123" style="fill-opacity: 0;"></circle></g><g class="d3cpnode homo" transform="translate(117.09165576552412,198)" id="homo"><title>homo</title><circle r="80.90834423447588"></circle><text dy="-72.90834423447588px" style="text-anchor: middle; font-size: 12px;">homo</text></g><g class="d3cpleaf d3cpnode sapiens" transform="translate(76.63748364828618,198)" id="sapiens"><title>sapiens</title><circle r="40.45417211723794"></circle><text dy=".3em" style="text-anchor: middle; font-size: 12.5857px;">sapiens</text></g><g class="d3cpleaf d3cpnode habilis" transform="translate(157.54582788276207,198)" id="habilis"><title>habilis</title><circle r="40.45417211723794"></circle><text dy=".3em" style="text-anchor: middle; font-size: 12.5857px;">habilis</text></g><g class="d3cpnode carnivore" transform="translate(297,198)" id="carnivore"><title>carnivore</title><circle r="99" style="fill-opacity: 0;"></circle><text dy="-91px" style="text-anchor: middle; font-size: 12px;">carnivore</text></g><g class="d3cpdummy carnivore" transform="translate(216.09165576552414,198)" id="carnivore"><title>carnivore</title><circle r="18.091655765524123" style="fill-opacity: 0;"></circle></g><g class="d3cpnode panthera" transform="translate(315.09165576552414,198)" id="panthera"><title>panthera</title><circle r="80.90834423447588"></circle><text dy="-72.90834423447588px" style="text-anchor: middle; font-size: 12px;">panthera</text></g><g class="d3cpleaf d3cpnode lion" transform="translate(274.6374836482862,198)" id="lion"><title>lion</title><circle r="40.45417211723794"></circle><text dy=".3em" style="text-anchor: middle; font-size: 12.5857px;">lion</text></g><g class="d3cpleaf d3cpnode tiger" transform="translate(355.54582788276207,198)" id="tiger"><title>tiger</title><circle r="40.45417211723794"></circle><text dy=".3em" style="text-anchor: middle; font-size: 12.5857px;">tiger</text></g></g></svg>
<!-- d3 cluster -->
<svg width="100%" height="800"><g transform="translate(20,0)"><path class="d3clslink" d="M0,487C133.33333333333334,487 133.33333333333334,206.975 266.6666666666667,206.975"></path><path class="d3clslink" d="M0,487C133.33333333333334,487 133.33333333333334,620.925 266.6666666666667,620.925"></path><path class="d3clslink" d="M266.6666666666667,206.975C400,206.975 400,170.45 533.3333333333334,170.45"></path><path class="d3clslink" d="M533.3333333333334,170.45C666.6666666666667,170.45 666.6666666666667,89.28333333333333 800,89.28333333333333"></path><path class="d3clslink" d="M533.3333333333334,170.45C666.6666666666667,170.45 666.6666666666667,178.56666666666666 800,178.56666666666666"></path><path class="d3clslink" d="M266.6666666666667,620.925C400,620.925 400,511.34999999999997 533.3333333333334,511.34999999999997"></path><path class="d3clslink" d="M533.3333333333334,511.34999999999997C666.6666666666667,511.34999999999997 666.6666666666667,357.1333333333333 800,357.1333333333333"></path><path class="d3clslink" d="M533.3333333333334,511.34999999999997C666.6666666666667,511.34999999999997 666.6666666666667,446.41666666666674 800,446.41666666666674"></path><g class="d3clsnode" transform="translate(0,487)"><circle r="4.5"></circle><text dx="8" dy="3" style="text-anchor: start;">mammal</text></g><g class="d3clsnode" transform="translate(266.6666666666667,206.975)"><circle r="4.5"></circle><text dx="-8" dy="3" style="text-anchor: end;">primate</text></g><g class="d3clsnode" transform="translate(533.3333333333334,170.45)"><circle r="4.5"></circle><text dx="-8" dy="3" style="text-anchor: end;">homo</text></g><g class="d3clsnode" transform="translate(800,89.28333333333333)"><circle r="4.5"></circle><text dx="8" dy="3" style="text-anchor: start;">sapiens</text></g><g class="d3clsnode" transform="translate(800,178.56666666666666)"><circle r="4.5"></circle><text dx="8" dy="3" style="text-anchor: start;">habilis</text></g><g class="d3clsnode" transform="translate(266.6666666666667,620.925)"><circle r="4.5"></circle><text dx="-8" dy="3" style="text-anchor: end;">carnivore</text></g><g class="d3clsnode" transform="translate(533.3333333333334,511.34999999999997)"><circle r="4.5"></circle><text dx="-8" dy="3" style="text-anchor: end;">panthera</text></g><g class="d3clsnode" transform="translate(800,357.1333333333333)"><circle r="4.5"></circle><text dx="8" dy="3" style="text-anchor: start;">lion</text></g><g class="d3clsnode" transform="translate(800,446.41666666666674)"><circle r="4.5"></circle><text dx="8" dy="3" style="text-anchor: start;">tiger</text></g></g></svg>
]]></Attribute_String><Attribute_String roleName="setup">${MODELNAME_DEFAULT},${SVGURI_DEFAULT}</Attribute_String></SvgClient>
</XholonWorkbook>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment