Chemical Structures as Mathematica Expressions

Robert B. Nachbar

Information Sciences Research, 
Merck Research Laboratories, 
126 E. Lincoln Ave., 
Rahway, NJ 07065

Abstract

A simple hierarchical data structure (Mathematica expression) has been developed to represent the constitution (topology) of organic chemical structures. This representation supports the notion of chemical valence and stereochemistry. Mathematica expression patterns and built-in functions can be used to perform chemically meaningful transformations. The important aspects of the implementation will be presented, and as well as its strengths and weaknesses. Application of this methodology to chemical constitution optimization, non-rigid molecular symmetry group (automorphism group) construction, isomer counting, and chemical reactivity will be described.

Data Structure

Off[General::spell1]
SetDirectory[
        ToFileName[{$HomeDirectory, "Presentations", "1999", "WRI \
DevConf", "Presentation"}]];
<< Molecules`

Syntax

Molecular Graphs

Molecular Expressions

(Subscript[bond, i, j])[(Subscript[atom, j]),(Subscript[bond, j, k])[(Subscript[atom, k]),…],…]

Rings

Superatoms

({{}, {nitro = Single[NO,  Double[O]]}, { }, {}, {sulfonyl = Single[SO2,  Single[_, ___]]}})

({{superatom, equivalent Sequence}, {NO, Sequence[N, Dative[O]]}, {PO, Sequence[P, Dative[O]]}, {PS, Sequence[P, Dative[S]]}, {SO, Sequence[S, Dative[O]]}, {SO2, Sequence[S, Dative[O], Dative[O]]}, {AsO, Sequence[As, Dative[O]]}})

({{superatom, equivalent Sequence, valence states}, {Me, Sequence[C, Single[H], Single[H], 
              Single[H]], {{Single}}}, {Et, Sequence[C, Single[H], 
              Single[H], 
Single[C, Single[H], Single[H], 
                Single[H]]], {{Single}}}, {COOH, Sequence[C, Double[O], 
              Single[O, Single[H]]], {{Single}}}, {Ph, Sequence[C, Single[H], 
              Double[C, 
                Single[H], 
Single[C, Single[H], 
                  Double[C, 
                    Single[H], 
Single[C, Single[H], 
                      Double[C, Single[H]]]]]]], {{Single}}}, {Ala, Sequence[N, Single[H], 
              Single[C, 
                Single[Me], 
Single[C, 
                  Double[O], □]]], {{Single, Single}}}})

Examples

methane = 
      Molecule[H, Single[Me]] //. 
        Me -> Sequence[C, Single[H], Single[H], Single[H]]

ethane = 
      Molecule[Me, Single[Me]] //. 
        Me -> Sequence[C, Single[H], Single[H], Single[H]]

AlaVal=Molecule[Ala,Single[Val, Single[O, Single[H]]],Single[H]]//.{Single[Ala, n : Single[__]] :> 
            Single[N, Single[H], 
              Single[C, 
                Single[Me], 
Single[C, Double[O], n], 
                Single[H]]], 
          Molecule[Ala, n1 : Single[__], n2 : Single[__]] :> 
            Molecule[N, Single[H], 
              Single[C, 
                Single[Me], 
Single[C, Double[O], n1], 
                Single[H]], n2], 
          Single[Val, n : Single[__]] :> 
            Single[N, Single[H], 
              Single[C, 
                Single[C, Single[Me], Single[Me], 
                  Single[H]], 
Single[C, Double[O], n], 
                Single[H]]], 
          Molecule[Val, n1 : Single[__], n2 : Single[__]] :> 
            Molecule[N, Single[H], 
              Single[C, 
                Single[C, Single[Me], Single[Me], 
                  Single[H]], 
Single[C, Double[O], n1], 
                Single[H]], n2], 
          Me -> 
            Sequence[C, Single[H], Single[H], Single[H]]}

DrawMolecule[AlaVal // DeleteHydrogens, AspectRatio -> 4/3, 
        ImageSize -> 2 72];

notAlaVal=Molecule[Ala,Single[H],Single[Val, Single[O, Single[H]]]]//.{Single[Ala, n : Single[__]] :> 
            Single[N, Single[H], 
              Single[C, 
                Single[Me], 
Single[C, Double[O], n], 
                Single[H]]], 
          Molecule[Ala, n1 : Single[__], n2 : Single[__]] :> 
            Molecule[N, Single[H], 
              Single[C, 
                Single[Me], 
Single[C, Double[O], n1], 
                Single[H]], n2], 
          Single[Val, n : Single[__]] :> 
            Single[N, Single[H], 
              Single[C, 
                Single[C, Single[Me], Single[Me], 
                  Single[H]], 
Single[C, Double[O], n], 
                Single[H]]], 
          Molecule[Val, n1 : Single[__], n2 : Single[__]] :> 
            Molecule[N, Single[H], 
              Single[C, 
                Single[C, Single[Me], Single[Me], 
                  Single[H]], 
Single[C, Double[O], n1], 
                Single[H]], n2], 
          Me -> 
            Sequence[C, Single[H], Single[H], Single[H]]}

DrawMolecule[notAlaVal // DeleteHydrogens, AspectRatio -> 1, 
        ImageSize -> 2 72];

What we can't do (yet)

Semantics

Valence

valence((Subscript[atom, j]))=valence((Subscript[bond, i, j]))+(Underscript[((∑^n)), k = 1])valence((Subscript[bond, j, k]))

Valence[atom]==Plus@@Valence[{bond,branches}]

LonePairCount[atom]≥Count[{branches},Dative[_]]

Multigraphs and Pseudographs

({{, }, {Multigraph with a multiedge, Pseudograph with a loop}})

twoRingFreeQ[mol_Molecule] := 
	FreeQ[mol, 
		_[_, ___, Single[R[x_]], ___, 
			_[_, ___, Single[R[x_]], ___], ___] | 
		_[_, ___, _[_, ___, Single[R[x_]], ___], 
			___, Single[R[x_]], ___]] && 
	FreeQ[Cases[mol, _[_, ___, Single[R[x_]], ___, 
			Single[R[y_]], ___], {0, Infinity}], 
		{___, _[_, ___, Single[R[x_]], ___, Single[R[y_]], ___], ___, 
			_[_, ___, Single[R[x_]], ___, Single[R[y_]], ___], ___} | 
		{___, _[_, ___, Single[R[x_]], ___, Single[R[y_]], ___], ___, 
			_[_, ___, Single[R[y_]], ___, Single[R[x_]], ___], ___}]

oneRingFreeQ[mol_Molecule] := 
	FreeQ[mol, _[_, ___, Single[R[x_]], ___, Single[R[x_]], ___]]

Nonsense

chemicalAtomQ[atom_] := MemberQ[$ValidAtoms, atom] || 
	MatchQ[atom, R[_Integer?Positive]]
chemicalBondQ[bond_] := MemberQ[$ValidBonds, bond]

matchedRingClosuresQ[mol_Molecule] := 
	MatchQ[Split[Sort[Cases[mol, _[R[_]], {-3}]]], {{_, _}...}]

Total validity

MoleculeQ[mol:Molecule[atom_, branches___]]:=
	chemicalAtomQ[atom] && 
	(And @@ MoleculeQ /@ Hold[branches]) &&
	TrueQ[Valence[atom] == 
		Plus @@ Valence[{Molecule, branches}]] &&
	TrueQ[LonePairCount[atom] >= 
		Count[{branches}, Dative[_]]] &&
	matchedRingClosuresQ[mol] && 
	oneRingFreeQ[mol] && 
	twoRingFreeQ[mol]
MoleculeQ[bond_[atom_, branches___]]:=
	chemicalBondQ[bond] && 
	chemicalAtomQ[atom] && 
	(And @@ MoleculeQ /@ Hold[branches]) &&
	TrueQ[Valence[atom] == 
		Plus @@ Valence[{bond, branches}]] &&
	TrueQ[LonePairCount[atom] >= 
		Count[{branches}, Dative[_]]]
MoleculeQ[x___] /; Length[{x}]==1 || 
	Message[MoleculeQ::argx, MoleculeQ, Length[{x}]] := 
	False

Examples

MoleculeQ[Molecule[O, Single[H], Single[H]]]

MoleculeQ[
      Molecule[N, Single[H], Single[H], Single[H], Single[H]]]

MoleculeQ[
      Molecule[N, Double[O], Dative[O], Single[O, Single[H]]]]

MoleculeQ[
      Molecule[N, Double[O], Dative[O], Dative[O], 
        Single[O, Single[H]]]]

MoleculeQ[
      Molecule[C, Single[R[1]], Single[H], Single[H], 
        Single[C, Single[H], Single[H], 
          Single[C, Single[R[1]], Single[H], Single[H]]]]]

MoleculeQ[
      Molecule[C, Single[R[1]], Single[H], Single[H], 
        Single[C, Single[R[1]], Single[H], Single[H]]]]

MoleculeQ /@ {a, Power[x, 2]}

MoleculeQ[]

MoleculeQ[a, b]

OddQ[a, b]

Stereochemistry

3-Dimensional

Molecule[C, Single[H], Single[F], Single[Cl], Single[Br]] // 
      Part[#, {1, 2, 4, 5, 3}] &

Molecule[C, Single[H], Single[F], Single[Cl], Single[Br]] // 
      Part[#, {1, 2, 3, 5, 4}] &

Signature /@ {{1, 2, 4, 5, 3}, {1, 3, 4, 2, 5}, {1, 2, 3, 5, 
          4}}

2-Dimensional

Other Representations

\(\(camphor = 
        Molecule[C, Single[C, Double[O], Single[C, Single[R[1]]]], 

          Single[C], Single[C, Single[C, Single[R[2]]]], 
          Single[C, Single[C], 
Single[C], 
            Single[C, Single[R[1]], Single[R[2]]]]];\)\)

SMILES

ToSMILES[camphor]

menthol = FromSMILES["C1(C(C)C)C(O)CC(C)CC1"]

Adjacency Lists

ToAdjacencyLists[camphor]

acetone = 
      FromAdjacencyLists[
        AdjacencyLists[{C, C, C, 
            O}, {{{Single, 2}}, {{Single, 1}, {Single, 3}, {Double, 
                4}}, {{Single, 2}}, {{Double, 2}}}]]

FromSMILES["S(=O)(=O)(O)O"]

% // FromSuperatoms

sulfuricAcid = % // ToAdjacencyLists

Chemical Constitution Optimization

Genetic Algorithms and Programs

Random Structure Generation

Double[]⟹{({{Double[C]⟹{({{Double[C, Single[], Single[]]}, {Double[C, Double[]]}})}, {Double[N]⟹{Double[N, Single[]]}, {Double[O]⟹{Double[O]}})

Controlling Composition and Valence State

DefineAtomsAndBonds[Initialize -> True]

DefineAtomsAndBonds[
      AtomProbability -> {{_, 0}, {H, 1}, {C, 4}, {N, 1}, {O, 1}, {Cl,  .1}}, 
      BondPatternProbability -> {{C, {{{Double, Double}, 
                0}, {{Single, Triple},  .2}, {{Single, Single, 
                  Double},  .25}}}, {N, {{{Triple}, 
                0}, {{Single, Double},  .15}}}}]

Genetic Operators

Examples

\(\({MVA, MVL} = 
        FromSMILES[{"OCCC(C)(O)CC(=O)O", "O1CCC(C)(O)CC1(=O)"}];\)\)

Molecule mutation

MutateMolecule[parent_Molecule, levelspec_?levelSpecQ] := 
	Module[{ind, depth, bond, new}, 
		ind=RandomElement[Position[parent, 
			_Single|_Double|_Triple, levelspec]] ;
		If[ind===Null, 
			Null, 
		  (* else *)
			depth=Max[2, Random[Integer, 
				(MaxDepthCreated - 1 - Length[ind])/4]+1]  ;
			bond = Extract[parent, Append[ind, 0]] ;
			new=RandomBranch[depth, bond];
			repairRings[parent, new, ind]
			]
		]

MutateMolecule[{MVA}, RandomBranch]

Ring open

RingOpen[parent_Molecule, minDepth_Integer:0] /;
	NonNegative[minDepth] := 
	Module[{closures, ringPos}, 
		closures = Cases[parent, _[R[_]], 
			{minDepth+1, Infinity}] // Union // 
			RandomElement ;
		If[closures===Null, 
			Null, 
		  (* else *)
			RingOpen[parent, First[closures]] // 
				renumberRings
			]
		]

RingOpen[mol_Molecule, tag:R[_Integer]] := 
	Module[{pos, n1, n2, n, prePos, postPos, ringPos, cut, 
			branch, hyds, trunk, branchRootPos, newBranch}, 
		pos=Drop[#,-1]& /@ Position[mol, tag] ;
		{n1, n2}=Length /@ pos ;
		n=1 ;
		While[n<=n1 && n<=n2 && pos[[1,n]]==pos[[2,n]], 
			n++] ;
		n-- ;
		prePos=Take[#, {1, n}]& /@ pos ;
		postPos=Take[#, {n+1, Length[#]}]& /@ pos ;
		ringPos=MapThread[FoldList[Append, #1, #2]&, 
			{prePos, postPos}] ;
		cut=RandomElement[Join @@ Rest /@ ringPos] ;
		branch=Extract[mol, cut] ;
		hyds=Table[Single[H], {Valence[branch]}] ;
		branch=Join[Molecule @@ branch, Molecule @@ hyds] ;
		trunk = Insert[Delete[mol, cut], Hold@@hyds, cut] /. 
			Hold->Sequence;
		branchRootPos=First[Position[branch, tag]] ;
		newBranch=reRootMolecule[branch, branchRootPos] ;
		ReplacePart[trunk, Last[newBranch], 
			First[Position[trunk, _[tag]]]]
		]

RingOpen[closed]

Application: Inverse QSAR

Background

(Underscript[minimize, (OverVector[p])])|(Overscript[(model(structure, 
                  (Overscript[p, ⇀]))),  ⇀])  - 
            (Overscript[activity, ⇀])|

predictedActivity = 
      model(newStructure, (Overscript[p, ⇀]))

predictedStructure = (model^(-1))(
        desiredActivity, (Overscript[p, ⇀]))

Initial QSAR

\(pC = \(-0.476194191257481769`\)\  + \ 
          0.403380754740159108`\ \ \ \(\^0\)\(χ\_p\%v\)\  + \ 
          0.416475420421234687`\ \ \(\^2\)\(χ\_p\%v\)\  - \ 
          1.06330513526590531`\ \ \(\^3\)\(χ\_c\%v\)\)
n = 27, (r^2) = 0.974482, s = 0.141256, F = 210.077

Evolutionary Optimization

{({{2.2-pC, If pC<2.2}, {pC-2.4, If 2.4<pC}, {0, Otherwise}}) + 2×{({{1, If Count[O]==0∨Count[O] > 2∨
	olefinQ∨acidQ∨miscQ}, {0, Otherwise}})

Non-rigid Molecular Symmetry Group

Graph Theory

Examples

({methane, ethane, propane, 
          butane} = {"C", "CC", "CCC", "CCCC"} // 
          FromSMILES)

BalanceMolecule[methane]

BalanceMolecule[ethane]

BalanceMolecule[propane]

BalanceMolecule[butane]

Group Theory

<< GroupTheory`

?Group

Permutation Groups

?PermutationQ

?Permute

({{Group, sites, Symbol, Order}, {symmetric group, n, (Subscript[S, n]), n!}, {alternating group, n, (Subscript[A, n]), ((n!)/2)}, {cyclic group, n, (Subscript[C, n]), n}, {dihedral group, n, (Subscript[D, n]), 2  n}, {tetrahedral group, 4, T ≡ (Subscript[A, 4]) ≡ (Subscript[C, 3])⊗(Subscript[D, 2]), 12}})

({{(Subscript[S, 4]), ({{{1, 2, 3, 4}, {4, 3, 1, 2}, {4, 1, 2, 3}, {3, 
                    4, 2, 1}}, {{3, 1, 4, 2}, {2, 4, 1, 3}, {2, 3, 4, 1}, {4, 
                    2, 1, 3}}, {{4, 1, 3, 2}, {3, 2, 4, 1}, {3, 1, 2, 4}, {2, 
                    4, 3, 1}}, {{2, 3, 1, 4}, {1, 4, 2, 3}, {1, 3, 4, 2}, {4, 
                    3, 2, 1}}, {{4, 2, 3, 1}, {3, 4, 1, 2}, {3, 2, 1, 4}, {2, 
                    1, 4, 3}}, {{2, 1, 3, 4}, {1, 4, 3, 2}, {1, 3, 2, 4}, {1, 
                    2, 4, 3}}})}, {(Subscript[A, 4]), ({{{1, 2, 3, 4}, {4, 2, 1, 3}, {4, 1, 3, 2}, {3, 
                    2, 4, 1}}, {{3, 1, 2, 4}, {2, 4, 3, 1}, {2, 3, 1, 4}, {1, 
                    4, 2, 3}}, {{1, 3, 4, 2}, {4, 3, 2, 1}, {3, 4, 1, 2}, {2, 
                    1, 4, 3}}})}, {(Subscript[C, 4]), ({{{1, 2, 3, 4}, {4, 1, 2, 3}, {2, 3, 4, 1}, {3, 
                    4, 1, 2}}})}, {(Subscript[D, 4]), ({{{1, 2, 3, 4}, {4, 1, 2, 3}, {2, 3, 4, 1}, {4, 
                    3, 2, 1}}, {{3, 4, 1, 2}, {3, 2, 1, 4}, {2, 1, 4, 3}, {1, 
                    4, 3, 2}}})}})

CircleTimes[a___, b_CircleTimes, c___] := 
	Flatten[Unevaluated[CircleTimes[a, b, c]], 1, CircleTimes]
CircleTimes[a_] := a

Wreath Products

WreathProduct[mol_Molecule, space_] := 
	wreath[BalanceMolecule[mol], space]

wreath[Molecule[l:_[__], r:_[__]], Flat] := 
	With[{orbits = Map[wreath[#, Flat]&, Split[{l, r}], {2}]}, 
		Apply[Sn[##]&, orbits, 1] /. List->CircleTimes]
wreath[_[a_Symbol, lig:(_[__]...)], Flat] := 
	With[{orbits = Map[wreath[#, Flat]&, Split[{lig}], {2}]}, 
		Apply[Sn[a][##]&, orbits, 1] /. List->CircleTimes]
wreath[_[a_Symbol], Flat] := Sn[a]

Sn[a_Sn] := a
Sn[a_CircleTimes] := a

Example

<< WreathProduct`

({{}, {\(C\_2[\(C\_3\) C\_2[C\_3]] ≡ 
              C\_\(2  v\)⊗\((C\_3⊗C\_2⊗\((C\_3⊗C\_3)\)⊗C\_3⊗C\_2⊗\((C\_3⊗C\_3)\))\)\)}, {\(|C\_\(2  v\)[\(C\_3\) 
                    C\_2[C\_3]]| = \(2 \((3×2 \((3)\)\^2)\)\^2 = 5832\)\)}})

mol = "C(N(C)C)(C)(N(C)C)C" // FromSMILES

wp = WreathProduct[mol, Chiral]

SimplifyWreathProduct[wp]

permutationGroupFactors[mol_Molecule, space_Symbol, sites:{__Symbol}] := 
	Module[{n = 0, wp, g}, 
		wp = Switch[space, 
			Flat, 
				WreathProduct[mol, Flat] /. (#1 :> ++n & ) /@ 
					sites /. Sn[_Symbol] -> Sequence[], 
			Achiral, 
				WreathProduct[mol, Achiral] /. (#1 :> ++n & ) /@ 
					sites /. {(g_)[_Symbol] :> g, 
						Cn[_Symbol] -> Sequence[]}, 
			Chiral, 
				WreathProduct[mol, Chiral] /. (#1 :> ++n & ) /@ 
					sites /. {(g_)[_Symbol] :> g, 
						Cn[_Symbol] -> Sequence[]}, 
			]; 
		DeleteCases[(ToFactorGroup[#1, n]&) /@ 
			Cases[wp, (Td|Dnh|Cnv|C2v|Cs|T|Dn|C2|Cn|Sn)[__], 
				{0, Infinity}], 
			{Range[n]}]]

NRMSG[mol_Molecule, space_Symbol] := 
	NRMSG[mol, space, {H}]
NRMSG[mol_Molecule, space_Symbol, sites:{__Symbol}] := 
	With[{gen=permutationGroupFactors[mol, space, sites]}, 
		Flatten[Outer[Permute, Sequence@@gen, 1], Length[gen]-1]
		]

<< WreathProduct`
(Subscript[G, 5832]) = NRMSG[mol, Chiral, {H}];
Length[(Subscript[G, 5832])]

CycleIndex[(Subscript[G, 5832]), f]

Isomer Counting

(Subscript[D, 6]) = 
        MakeGroup[{{2, 3, 4, 5, 6, 1}, {1, 6, 5, 4, 3, 2}}, 
          Permute];
elems = Elements /. (Subscript[D, 6])

ToCycles /@ elems // ColumnForm

ci = CycleIndex[elems, f]

This is Equation 1 in Pólya.

GeneratingFunction[cycleIndex_, weights_] := 
	With[{x = First[Cases[cycleIndex, _Symbol, -1]]}, 
		Expand[cycleIndex /. 
			{Subscript[x, i_] :> (#1^i & ) /@ weights}]
		]

GeneratingFunction[ci, 1 + x]

This is Equation 6 in Pólya.

GeneratingFunction[ci, H + X]

CountIsomers[g_, labels_, pattern_Times] := 
	CountIsomers[g, labels, {pattern}]
CountIsomers[g_Group, labels_, patterns_] := 
	CountIsomers[Elements/.g, labels, patterns]
CountIsomers[g:{__?PermutationQ}, labels:{__Symbol}, 
	patterns:{Times__}] := 
	Module[{ci, x, gf}, 
		ci = CycleIndex[g, x]; 
		gf = GeneratingFunction[ci, Plus @@ labels]; 
		Plus @@ Thread[Coefficient[gf, 
			patterns /. Subscript -> Power]]
		]

CountIsomers[(Subscript[D, 6]), {H, X}, (Subscript[H, 4]) (Subscript[X, 2])]

Chemical Reactivity

Example

LiAlH4 = {Single[C, a___Single, Double[O], b___Single] :> 
            Single[C, a, Single[O, Single[H]], Single[H], b]};

acetal = {Single[C, a___Single, Single[O, Single[H]], b___Single, 
              Single[O, Single[H]], c___Single] :> 
            Single[C, a, Double[O], b, c]};

NaBH4 = {h_[a : C | H, b___, 
              Single[C, c : Single[C | H, __] ... , Double[O], 
                d : Single[C | H, __] ... ], e___] :> 
            h[a, b, Single[C, c, Single[O, Single[H]], Single[H], d], 
              e]};

startingMaterial = "CC(=O)CCC(=O)O" // FromSMILES

DrawMolecule[startingMaterial, ImageSize -> 4 72];

firstProduct = startingMaterial //. Join[LiAlH4, acetal]

DrawMolecule[firstProduct, ImageSize -> 4 72];

secondProduct = startingMaterial //. Join[NaBH4, acetal]

DrawMolecule[secondProduct, ImageSize -> 4 72];

References

[Bal76] Balaban, A. T. Chemical Applications of Graph Theory, Academic Press, New York, 1976.

[Bal80] Balasubramanian, K. “The Symmetry Groups of Nonrigid Molecules as Generalized Wreath Products and Their Representations.” J. Chem. Phys., 1980, 72, 665-677.

[Gol80] Goldberg, D. E. Genetic Algorithms in Search, Optimizations, and Machine Learning, Addison-Wesley, Reading, MA, 1989.

[Har69] Harary, F. Graph Theory, Addison-Wesley, Reading, MA, 1969.

[KH93a] Kier, L. B. and Hall, L. H. “Design Of Molecules >From Quantitative Structure Activity Relationship Models. 1. Information-Transfer Between Path and Vertex Degree Counts.” J. Chem. Inf. Comput. Sci., 1993, 33, 143-147.

[KH93b] Kier, L. B. and Hall, L. H. “The Generation Of Molecular-Structures From a Graph-Based Qsar Equation.” Quantitative Structure-Activity Relationships, 1993, 12, 383-388.

[Koz92] Koza, J. R. Genetic Programming: On the Programming of Computers by Means of Natural Selection, The MIT Press, Cambridge, MA, 1992.

[Lon62] Longuet-Higgins, H. C. “The Symmetry Groups of Non-rigid Molecules” Mol. Phys., 1962, 6, 445-460.

[Nac95] Nachbar, R. B. “Genetic Programming” Mathematica J., 1995, 5, 36-47.

[Nac98] Nachbar, R. B.  “Molecular Evolution: A Hierarchical Representation for Chemical Topology and Its Automated Manipulation” Proc. Third Ann. Gen. Prog. Conf., Madison, WI, 1998, pp. 246-253.

[Nac00] Nachbar, R. B. “Molecular Evolution: Automated Manipulation of Hierarchical Chemical Topology and Its Application to Average Molecular Structures” Genet. Prog. Evolv. Mach., 2000, 1, in press.

[Pól36] Pólya, G. “Algebraische Berechnung der Anzahl der Isomeren einiger organischer Verbindung” Zeitschr. f. Kristallographie, 1936, 93, 415-443.

[Wei88] Weininger, D. “SMILES, a Chemical Language and Information system. 1. Introduction to Methodology and Encoding Rules” J. Chem. Inf. Comput. Sci., 1988, 28, 31-36.