public virtual void Paths_anthracene() { int[][] anthracene = Anthracene; RelevantCycles relevant = new RelevantCycles(anthracene); int[][] paths = relevant.GetPaths(); Assert.AreEqual(3, paths.Length); int[][] expected = new int[][] { new[] { 5, 0, 1, 2, 3, 4, 5 }, new[] { 9, 6, 5, 4, 7, 8, 9 }, new[] { 9, 8, 10, 11, 12, 13, 9 } }; Assert.IsTrue(Compares.AreOrderLessDeepEqual(expected, paths)); }
public virtual void Paths_napthalene() { int[][] napthalene = Naphthalene; RelevantCycles relevant = new RelevantCycles(napthalene); int[][] paths = relevant.GetPaths(); Assert.AreEqual(2, paths.Length); int[][] expected = new int[][] { new[] { 5, 0, 1, 2, 3, 4, 5 }, new[] { 5, 4, 7, 8, 9, 6, 5 } }; Assert.IsTrue(Compares.AreOrderLessDeepEqual(expected, paths)); }
public virtual void Paths_bicyclo() { int[][] bicyclo = Bicyclo; RelevantCycles relevant = new RelevantCycles(bicyclo); int[][] paths = relevant.GetPaths(); Assert.AreEqual(3, paths.Length); int[][] expected = new int[][] { new[] { 5, 0, 1, 2, 3, 4, 5 }, new[] { 5, 0, 1, 2, 7, 6, 5 }, new[] { 5, 4, 3, 2, 7, 6, 5 } }; Assert.IsTrue(Compares.AreOrderLessDeepEqual(expected, paths)); }
public virtual void Paths_norbornane() { int[][] norbornane = Norbornane; RelevantCycles relevant = new RelevantCycles(norbornane); int[][] paths = relevant.GetPaths(); Assert.AreEqual(2, paths.Length); int[][] expected = new int[][] { new[] { 5, 6, 2, 1, 0, 5 }, new[] { 5, 6, 2, 3, 4, 5 } }; Assert.IsTrue(Compares.AreOrderLessDeepEqual(expected, paths)); }
public virtual void Paths_cyclophane_even() { int[][] cyclophane_even = CyclophaneEven; RelevantCycles relevant = new RelevantCycles(cyclophane_even); int[][] paths = relevant.GetPaths(); Assert.AreEqual(3, paths.Length); int[][] expected = new int[][] { new int[] { 3, 2, 1, 0, 5, 4, 3 }, new int[] { 3, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3 }, new int[] { 3, 6, 7, 8, 9, 10, 11, 0, 5, 4, 3 } }; Assert.IsTrue(Compares.AreOrderLessDeepEqual(expected, paths)); }
void Main() { { #region // using NCDK.Graphs.GraphUtil; IAtomContainer m = TestMoleculeFactory.MakeAnthracene(); // compute on the whole graph RelevantCycles relevant = new RelevantCycles(ToAdjList(m)); // it is much faster to compute on the separate ring systems of the molecule int[][] graph = ToAdjList(m); RingSearch ringSearch = new RingSearch(m, graph); // all isolated cycles are relevant foreach (int[] isolated in ringSearch.Isolated()) { int[] path = Cycle(graph, isolated); } // compute the relevant cycles for each system foreach (int[] fused in ringSearch.Fused()) { int[][] subgraph = Subgraph(graph, fused); RelevantCycles relevantOfSubgraph = new RelevantCycles(subgraph); foreach (int[] path in relevantOfSubgraph.GetPaths()) { // convert the sub graph vertices back to the super graph indices for (int i = 0; i < path.Length; i++) { path[i] = fused[path[i]]; } } } #endregion } { IAtomContainer mol = null; #region GetPaths RelevantCycles relevant = new RelevantCycles(ToAdjList(mol)); // ensure the number is manageable if (relevant.Count() < 100) { foreach (int[] path in relevant.GetPaths()) { // process the path } } #endregion } }
/// <summary> /// Reconstruct all relevant cycles and group then by length. /// </summary> /// <param name="relevant">precomputed relevant cycles</param> /// <returns>all relevant cycles groped by weight</returns> private IEnumerable <IList <Cycle> > GroupByLength(RelevantCycles relevant) { List <Cycle> cycle_list = new List <Cycle>(); foreach (var path in relevant.GetPaths()) { var last = cycle_list.LastOrDefault(); if (last != null && path.Length > last.Path.Length) { yield return(cycle_list); cycle_list = new List <Cycle>(); } cycle_list.Add(new MyCycle(this, path)); } if (cycle_list.Count > 0) { yield return(cycle_list); } yield break; }