$darkmode
DENOPTIM
DGraphTest.java
Go to the documentation of this file.
1/*
2 * DENOPTIM
3 * Copyright (C) 2022 Marco Foscato <marco.foscato@uib.no>
4 *
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU Affero General Public License as published
7 * by the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU Affero General Public License for more details.
14 *
15 * You should have received a copy of the GNU Affero General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 */
18
19package denoptim.graph;
20
21import static org.junit.Assert.assertNotNull;
22import static org.junit.jupiter.api.Assertions.assertEquals;
23import static org.junit.jupiter.api.Assertions.assertFalse;
24import static org.junit.jupiter.api.Assertions.assertNotEquals;
25import static org.junit.jupiter.api.Assertions.assertNull;
26import static org.junit.jupiter.api.Assertions.assertTrue;
27
28import java.util.ArrayList;
29import java.util.Arrays;
30import java.util.HashMap;
31import java.util.HashSet;
32import java.util.Iterator;
33import java.util.LinkedHashMap;
34import java.util.List;
35import java.util.Map;
36import java.util.Set;
37import java.util.concurrent.atomic.AtomicInteger;
38import java.util.logging.Logger;
39import java.util.stream.Collectors;
40
41import javax.vecmath.Point3d;
42
43import org.junit.jupiter.api.Test;
44import org.openscience.cdk.Atom;
45import org.openscience.cdk.Bond;
46import org.openscience.cdk.PseudoAtom;
47import org.openscience.cdk.interfaces.IAtom;
48import org.openscience.cdk.interfaces.IAtomContainer;
49import org.openscience.cdk.interfaces.IBond;
50import org.openscience.cdk.interfaces.IChemObjectBuilder;
51import org.openscience.cdk.silent.SilentChemObjectBuilder;
52
53import denoptim.constants.DENOPTIMConstants;
54import denoptim.exception.DENOPTIMException;
55import denoptim.fragspace.FragmentSpace;
56import denoptim.fragspace.FragmentSpaceParameters;
57import denoptim.graph.Edge.BondType;
58import denoptim.graph.Template.ContractLevel;
59import denoptim.graph.Vertex.BBType;
60import denoptim.graph.Vertex.VertexType;
61import denoptim.graph.rings.PathSubGraph;
62import denoptim.utils.MutationType;
63
64
71public class DGraphTest
72{
73
74 private static APClass APCA, APCB, APCC, APCD, CAPP;
75 private static String a="A", b="B", c="C", d="D", cap="cap";
76
77//------------------------------------------------------------------------------
78
80 {
81 APCA = APClass.make(a, 0);
82 APCB = APClass.make(b, 0);
83 APCC = APClass.make(c, 0);
84 APCD = APClass.make(d, 99);
85 CAPP = APClass.make(cap, 1);
86
87 HashMap<APClass,ArrayList<APClass>> cpMap =
88 new HashMap<APClass,ArrayList<APClass>>();
89 ArrayList<APClass> lstA = new ArrayList<APClass>();
90 lstA.add(APCA);
91 cpMap.put(APCA, lstA);
92 ArrayList<APClass> lstB = new ArrayList<APClass>();
93 lstB.add(APCB);
94 lstB.add(APCC);
95 cpMap.put(APCB, lstB);
96 ArrayList<APClass> lstC = new ArrayList<APClass>();
97 lstC.add(APCB);
98 lstC.add(APCC);
99 cpMap.put(APCC, lstC);
100 ArrayList<APClass> lstD = new ArrayList<APClass>();
101 lstD.add(APCD);
102 cpMap.put(APCD, lstD);
103
104
105 /* Compatibility matrix
106 *
107 * | A | B | C | D |
108 * -------------------------
109 * A | T | | | |
110 * -------------------------
111 * B | | T | T | |
112 * -------------------------
113 * C | | T | T | |
114 * -------------------------
115 * D | | | | T |
116 */
117
118 HashMap<APClass,APClass> capMap = new HashMap<APClass,APClass>();
119 HashSet<APClass> forbEnds = new HashSet<APClass>();
121 FragmentSpace fs = new FragmentSpace(fsp,
122 new ArrayList<Vertex>(),
123 new ArrayList<Vertex>(),
124 new ArrayList<Vertex>(),
125 cpMap, capMap, forbEnds, cpMap);
127
128 EmptyVertex s0 = new EmptyVertex();
130 s0.addAP(APCA);
131 s0.addAP(APCA);
133
134 EmptyVertex s1 = new EmptyVertex();
136 s1.addAP(APCA);
137 s1.addAP(APCA);
138 s1.addAP(APCD);
140
141 EmptyVertex s2 = new EmptyVertex();
143 s2.addAP(APCA);
144 s2.addAP(APCB);
145 s2.addAP(APCA);
146 s2.addAP(APCC);
148
149 EmptyVertex v0 = new EmptyVertex();
151 v0.addAP(APCA);
152 v0.addAP(APCB);
153 v0.addAP(APCA);
155
156 EmptyVertex v1 = new EmptyVertex();
158 v1.addAP(APCA);
159 v1.addAP(APCB);
160 v1.addAP(APCA);
161 v1.addAP(APCB);
162 v1.addAP(APCC);
164
165 EmptyVertex v2 = new EmptyVertex();
167 v2.addAP(APCB);
169
170 EmptyVertex v3 = new EmptyVertex();
172 v3.addAP(APCD);
173 v3.addAP(APCD);
175
176 EmptyVertex v4 = new EmptyVertex();
178 v4.addAP(APCC);
179 v4.addAP(APCB);
180 v4.addAP(APCB);
181 v4.addAP(APCA);
182 v4.addAP(APCA);
184
185 EmptyVertex v5 = new EmptyVertex();
187 v5.addAP(APCB);
188 v5.addAP(APCD);
190
191 EmptyVertex v6 = new EmptyVertex();
193 v6.addAP(APCC);
194 v6.addAP(APCD);
196
197 EmptyVertex v7 = new EmptyVertex();
199 v7.setAsRCV(true);
200 v7.addAP(APClass.make("ATneutral:0", BondType.ANY));
202
203 EmptyVertex c0 = new EmptyVertex();
205 c0.addAP(CAPP);
207
208 return fs;
209 }
210
211//------------------------------------------------------------------------------
212
240 throws DENOPTIMException
241 {
242 DGraph graph = new DGraph();
244 BBType.SCAFFOLD, fs);
245 graph.addVertex(s);
247 BBType.FRAGMENT, fs);
248 graph.addVertex(v1a);
250 BBType.FRAGMENT, fs);
251 graph.addVertex(v2a);
253 BBType.FRAGMENT, fs);
254 graph.addVertex(v2a_bis);
256 BBType.FRAGMENT, fs);
257 graph.addVertex(v3a);
259 BBType.FRAGMENT, fs);
260 graph.addVertex(v1b);
262 BBType.FRAGMENT, fs);
263 graph.addVertex(v2b);
265 BBType.FRAGMENT, fs);
266 graph.addVertex(v2b_bis);
268 BBType.FRAGMENT, fs);
269 graph.addVertex(v3b);
270 graph.addEdge(new Edge(s.getAP(0), v1a.getAP(0)));
271 graph.addEdge(new Edge(v1a.getAP(1), v2a.getAP(0)));
272 graph.addEdge(new Edge(v1a.getAP(3), v2a_bis.getAP(0)));
273 graph.addEdge(new Edge(v1a.getAP(4), v3a.getAP(0)));
274 graph.addEdge(new Edge(s.getAP(1), v1b.getAP(0)));
275 graph.addEdge(new Edge(v1b.getAP(1), v2b.getAP(0)));
276 graph.addEdge(new Edge(v1b.getAP(3), v2b_bis.getAP(0)));
277 graph.addEdge(new Edge(v1b.getAP(4), v3b.getAP(0)));
278
279 List<Vertex> symA = new ArrayList<Vertex>();
280 symA.add(v1a);
281 symA.add(v1b);
283
284 List<Vertex> symB = new ArrayList<Vertex>();
285 symB.add(v2a);
286 symB.add(v2a_bis);
287 symB.add(v2b);
288 symB.add(v2b_bis);
290
291 graph.renumberGraphVertices();
292 return graph;
293 }
294
295//------------------------------------------------------------------------------
296
318 throws DENOPTIMException
319 {
320 DGraph graph = new DGraph();
322 BBType.SCAFFOLD, fs);
323 graph.addVertex(s);
325 BBType.FRAGMENT, fs);
326 graph.appendVertexOnAP(s.getAP(0), v1a.getAP(2));
328 BBType.FRAGMENT, fs);
329 graph.appendVertexOnAP(v1a.getAP(3), v2a.getAP(1));
331 BBType.FRAGMENT, fs);
332 graph.appendVertexOnAP(v2a.getAP(3), v3a.getAP(1));
334 BBType.FRAGMENT, fs);
335 graph.appendVertexOnAP(v3a.getAP(3), v4a.getAP(1));
337 BBType.FRAGMENT, fs);
338 graph.appendVertexOnAP(v2a.getAP(2), v5a.getAP(0));
339
341 BBType.FRAGMENT, fs);
342 graph.appendVertexOnAP(s.getAP(1), v1b.getAP(2));
344 BBType.FRAGMENT, fs);
345 graph.appendVertexOnAP(v1b.getAP(3), v2b.getAP(1));
347 BBType.FRAGMENT, fs);
348 graph.appendVertexOnAP(v2b.getAP(3), v3b.getAP(1));
350 BBType.FRAGMENT, fs);
351 graph.appendVertexOnAP(v3b.getAP(3), v4b.getAP(1));
353 BBType.FRAGMENT, fs);
354 graph.appendVertexOnAP(v2b.getAP(2), v5b.getAP(0));
355
356 List<Vertex> sym1 = new ArrayList<Vertex>();
357 sym1.add(v1a);
358 sym1.add(v1b);
360 List<Vertex> sym2 = new ArrayList<Vertex>();
361 sym2.add(v2a);
362 sym2.add(v2b);
364 List<Vertex> sym3 = new ArrayList<Vertex>();
365 sym3.add(v3a);
366 sym3.add(v3b);
368 List<Vertex> sym4 = new ArrayList<Vertex>();
369 sym4.add(v4a);
370 sym4.add(v4b);
372
373 graph.renumberGraphVertices();
374 return graph;
375 }
376
377//------------------------------------------------------------------------------
378
414 throws DENOPTIMException
415 {
416 DGraph graph = new DGraph();
418 BBType.SCAFFOLD, fs);
419 graph.addVertex(s);
421 BBType.FRAGMENT, fs);
422 graph.addVertex(v1a);
424 BBType.FRAGMENT, fs);
425 graph.addVertex(v6a);
427 BBType.FRAGMENT, fs);
428 graph.addVertex(v6a_bis);
430 BBType.FRAGMENT, fs);
431 graph.addVertex(v6a_tris);
433 BBType.FRAGMENT, fs);
434 graph.addVertex(v7a);
436 BBType.FRAGMENT, fs);
437 graph.addVertex(v7a_bis);
439 BBType.FRAGMENT, fs);
440 graph.addVertex(v7a_tris);
441
443 BBType.FRAGMENT, fs);
444 graph.addVertex(v7a_quat);
445
447 BBType.FRAGMENT, fs);
448 graph.addVertex(v1c);
449
451 BBType.FRAGMENT, fs);
452 graph.addVertex(v1b);
454 BBType.FRAGMENT, fs);
455 graph.addVertex(v2b);
457 BBType.FRAGMENT, fs);
458 graph.addVertex(v2b_bis);
460 BBType.FRAGMENT, fs);
461 graph.addVertex(v3b);
462 graph.addEdge(new Edge(s.getAP(0), v1a.getAP(0)));
463 graph.addEdge(new Edge(v1a.getAP(1), v6a.getAP(0)));
464 graph.addEdge(new Edge(v1a.getAP(3), v6a_bis.getAP(0)));
465 graph.addEdge(new Edge(v1a.getAP(4), v6a_tris.getAP(0)));
466 graph.addEdge(new Edge(v6a.getAP(1), v7a.getAP(0)));
467 graph.addEdge(new Edge(v6a_bis.getAP(1), v7a_bis.getAP(0)));
468 graph.addEdge(new Edge(v6a_tris.getAP(1), v7a_tris.getAP(0)));
469 graph.addEdge(new Edge(s.getAP(2), v7a_quat.getAP(0)));
470 graph.addEdge(new Edge(s.getAP(1), v1c.getAP(0)));
471 graph.addEdge(new Edge(v1c.getAP(2), v1b.getAP(0)));
472 graph.addEdge(new Edge(v1b.getAP(1), v2b.getAP(0)));
473 graph.addEdge(new Edge(v1b.getAP(3), v2b_bis.getAP(0)));
474 graph.addEdge(new Edge(v1b.getAP(4), v3b.getAP(0)));
475
476 graph.addRing(v7a, v7a_quat);
477 graph.addRing(v7a_bis, v7a_tris);
478
479 List<Vertex> symA = new ArrayList<Vertex>();
480 symA.add(v1a);
481 symA.add(v1c);
483
484 List<Vertex> symB = new ArrayList<Vertex>();
485 symB.add(v2b);
486 symB.add(v2b_bis);
488
489 graph.renumberGraphVertices();
490 return graph;
491 }
492
493//------------------------------------------------------------------------------
494
510 throws DENOPTIMException
511 {
512 DGraph graph = new DGraph();
514 BBType.FRAGMENT, fs);
515 graph.addVertex(v1a);
517 BBType.FRAGMENT, fs);
518 graph.addVertex(v6a);
520 BBType.FRAGMENT, fs);
521 graph.addVertex(v6a_bis);
523 BBType.FRAGMENT, fs);
524 graph.addVertex(v6a_tris);
526 BBType.FRAGMENT, fs);
527 graph.addVertex(v7a);
529 BBType.FRAGMENT, fs);
530 graph.addVertex(v7a_bis);
532 BBType.FRAGMENT, fs);
533 graph.addVertex(v7a_tris);
534
535 graph.addEdge(new Edge(v1a.getAP(1), v6a.getAP(0)));
536 graph.addEdge(new Edge(v1a.getAP(3), v6a_bis.getAP(0)));
537 graph.addEdge(new Edge(v1a.getAP(4), v6a_tris.getAP(0)));
538 graph.addEdge(new Edge(v6a.getAP(1), v7a.getAP(0)));
539 graph.addEdge(new Edge(v6a_bis.getAP(1), v7a_bis.getAP(0)));
540 graph.addEdge(new Edge(v6a_tris.getAP(1), v7a_tris.getAP(0)));
541
542 graph.addRing(v7a_bis, v7a_tris);
543
544 graph.renumberGraphVertices();
545 return graph;
546 }
547
548//------------------------------------------------------------------------------
549
565 throws DENOPTIMException
566 {
567 DGraph graph = new DGraph();
569 BBType.FRAGMENT, fs);
570 graph.addVertex(v1b);
572 BBType.FRAGMENT, fs);
573 graph.addVertex(v2b);
575 BBType.FRAGMENT, fs);
576 graph.addVertex(v2b_bis);
578 BBType.FRAGMENT, fs);
579 graph.addVertex(v3b);
580 graph.addEdge(new Edge(v1b.getAP(1), v2b.getAP(0)));
581 graph.addEdge(new Edge(v1b.getAP(3), v2b_bis.getAP(0)));
582 graph.addEdge(new Edge(v1b.getAP(4), v3b.getAP(0)));
583
584 List<Vertex> symB = new ArrayList<Vertex>();
585 symB.add(v2b);
586 symB.add(v2b_bis);
588
589 graph.renumberGraphVertices();
590 return graph;
591 }
592
593//------------------------------------------------------------------------------
594
614 throws DENOPTIMException
615 {
616 DGraph graph = new DGraph();
618 BBType.FRAGMENT, fs);
619 graph.addVertex(v1b);
620 //First layer
622 BBType.FRAGMENT, fs);
623 graph.addVertex(v2b);
625 BBType.FRAGMENT, fs);
626 graph.addVertex(v2b_bis);
628 BBType.FRAGMENT, fs);
629 graph.addVertex(v2b_tris);
630 graph.addEdge(new Edge(v1b.getAP(1), v2b.getAP(2)));
631 graph.addEdge(new Edge(v1b.getAP(3), v2b_bis.getAP(2)));
632 graph.addEdge(new Edge(v1b.getAP(4), v2b_tris.getAP(2)));
633 //Second layer
635 BBType.FRAGMENT, fs);
636 graph.addVertex(v3b_1);
638 BBType.FRAGMENT, fs);
639 graph.addVertex(v3b_2);
641 BBType.FRAGMENT, fs);
642 graph.addVertex(v3b_3);
644 BBType.FRAGMENT, fs);
645 graph.addVertex(v3b_4);
646 graph.addEdge(new Edge(v2b.getAP(1), v3b_1.getAP(2)));
647 graph.addEdge(new Edge(v2b.getAP(3), v3b_2.getAP(2)));
648 graph.addEdge(new Edge(v2b_bis.getAP(1), v3b_3.getAP(2)));
649 graph.addEdge(new Edge(v2b_bis.getAP(3), v3b_4.getAP(2)));
650
651 List<Vertex> symFirstLayer = new ArrayList<Vertex>();
652 symFirstLayer.add(v2b);
653 symFirstLayer.add(v2b_bis);
654 graph.addSymmetricSetOfVertices(new SymmetricVertexes(symFirstLayer));
655
656 List<Vertex> symSecondLayer = new ArrayList<Vertex>();
657 symSecondLayer.add(v3b_1);
658 symSecondLayer.add(v3b_2);
659 graph.addSymmetricSetOfVertices(new SymmetricVertexes(symSecondLayer));
660
661 graph.renumberGraphVertices();
662 return graph;
663 }
664
665//------------------------------------------------------------------------------
666
692 throws DENOPTIMException
693 {
694 DGraph graph = new DGraph();
696 BBType.FRAGMENT, fs);
697 graph.addVertex(v1a);
699 BBType.FRAGMENT, fs);
700 graph.addVertex(v6a);
702 BBType.FRAGMENT, fs);
703 graph.addVertex(v6a_bis);
705 BBType.FRAGMENT, fs);
706 graph.addVertex(v7a);
708 BBType.FRAGMENT, fs);
709 graph.addVertex(v7a_bis);
710
712 BBType.FRAGMENT, fs);
713 graph.addVertex(v1b);
715 BBType.FRAGMENT, fs);
716 graph.addVertex(v1c);
718 BBType.FRAGMENT, fs);
719 graph.addVertex(v6a_tris);
720 graph.addEdge(new Edge(v1a.getAP(1), v6a.getAP(0)));
721 graph.addEdge(new Edge(v1a.getAP(4), v6a_bis.getAP(0)));
722 graph.addEdge(new Edge(v6a.getAP(1), v7a.getAP(0)));
723 graph.addEdge(new Edge(v6a_bis.getAP(1), v7a_bis.getAP(0)));
724 graph.addEdge(new Edge(v1a.getAP(3), v1b.getAP(1)));
725 graph.addEdge(new Edge(v1b.getAP(2), v1c.getAP(0)));
726 graph.addEdge(new Edge(v1b.getAP(4), v6a_tris.getAP(0)));
727
728 graph.addRing(v7a, v7a_bis);
729
730 List<Vertex> symA = new ArrayList<Vertex>();
731 symA.add(v6a);
732 symA.add(v6a_bis);
734
735 List<Vertex> symB = new ArrayList<Vertex>();
736 symB.add(v7a);
737 symB.add(v7a_bis);
739
740 graph.renumberGraphVertices();
741 return graph;
742 }
743
744//------------------------------------------------------------------------------
745
789 throws DENOPTIMException
790 {
791 DGraph graph = new DGraph();
793 BBType.FRAGMENT, fs);
794 graph.addVertex(v1a);
796 BBType.FRAGMENT, fs);
797 graph.addVertex(v6a);
799 BBType.FRAGMENT, fs);
800 graph.addVertex(v6a_bis);
802 BBType.FRAGMENT, fs);
803 graph.addVertex(v7a);
805 BBType.FRAGMENT, fs);
806 graph.addVertex(v7a_bis);
807
809 BBType.FRAGMENT, fs);
810 graph.addVertex(v1b);
812 BBType.FRAGMENT, fs);
813 graph.addVertex(v1c);
815 BBType.FRAGMENT, fs);
816 graph.addVertex(v6a_tris);
817
818 graph.addEdge(new Edge(v1a.getAP(1), v6a.getAP(0)));
819 graph.addEdge(new Edge(v1a.getAP(4), v6a_bis.getAP(0)));
820 graph.addEdge(new Edge(v6a.getAP(1), v7a.getAP(0)));
821 graph.addEdge(new Edge(v6a_bis.getAP(1), v7a_bis.getAP(0)));
822 graph.addEdge(new Edge(v1a.getAP(3), v1b.getAP(1)));
823 graph.addEdge(new Edge(v1b.getAP(2), v1c.getAP(0)));
824 graph.addEdge(new Edge(v1b.getAP(4), v6a_tris.getAP(0)));
825
826 graph.addRing(v7a, v7a_bis);
827
828 List<Vertex> symA = new ArrayList<Vertex>();
829 symA.add(v6a);
830 symA.add(v6a_bis);
832
833 List<Vertex> symB = new ArrayList<Vertex>();
834 symB.add(v7a);
835 symB.add(v7a_bis);
837
838 // up to here it is graph F. Now come the pieces of graph D
839
841 BBType.FRAGMENT, fs);
842 graph.addVertex(v6a_d);
843 Vertex v6a_d_bis = Vertex.newVertexFromLibrary(6,
844 BBType.FRAGMENT, fs);
845 graph.addVertex(v6a_d_bis);
846 Vertex v6a_d_tris = Vertex.newVertexFromLibrary(6,
847 BBType.FRAGMENT, fs);
848 graph.addVertex(v6a_d_tris);
850 BBType.FRAGMENT, fs);
851 graph.addVertex(v7a_d);
852 Vertex v7a_d_bis = Vertex.newVertexFromLibrary(7,
853 BBType.FRAGMENT, fs);
854 graph.addVertex(v7a_d_bis);
855 Vertex v7a_d_tris = Vertex.newVertexFromLibrary(7,
856 BBType.FRAGMENT, fs);
857 graph.addVertex(v7a_d_tris);
858
859 Vertex v7a_d_quat = Vertex.newVertexFromLibrary(7,
860 BBType.FRAGMENT, fs);
861 graph.addVertex(v7a_d_quat);
862
864 BBType.FRAGMENT, fs);
865 graph.addVertex(v1c_d);
866
868 BBType.FRAGMENT, fs);
869 graph.addVertex(v1b_d);
871 BBType.FRAGMENT, fs);
872 graph.addVertex(v2b_d);
873 Vertex v2b_d_bis = Vertex.newVertexFromLibrary(2,
874 BBType.FRAGMENT, fs);
875 graph.addVertex(v2b_d_bis);
877 BBType.FRAGMENT, fs);
878 graph.addVertex(v3b_d);
879 graph.addEdge(new Edge(v1c.getAP(2), v6a_d.getAP(0)));
880 graph.addEdge(new Edge(v1b.getAP(3), v6a_d_bis.getAP(0)));
881 graph.addEdge(new Edge(v1c.getAP(4), v6a_d_tris.getAP(0)));
882 graph.addEdge(new Edge(v6a_d.getAP(1), v7a_d.getAP(0)));
883 graph.addEdge(new Edge(v6a_d_bis.getAP(1), v7a_d_bis.getAP(0)));
884 graph.addEdge(new Edge(v6a_d_tris.getAP(1), v7a_d_tris.getAP(0)));
885 graph.addEdge(new Edge(v6a_tris.getAP(1), v7a_d_quat.getAP(0)));
886 graph.addEdge(new Edge(v1a.getAP(2), v1c_d.getAP(0)));
887 graph.addEdge(new Edge(v1c_d.getAP(2), v1b_d.getAP(0)));
888 graph.addEdge(new Edge(v1b_d.getAP(1), v2b_d.getAP(0)));
889 graph.addEdge(new Edge(v1b_d.getAP(3), v2b_d_bis.getAP(0)));
890 graph.addEdge(new Edge(v1b_d.getAP(4), v3b_d.getAP(0)));
891
892 graph.addRing(v7a_d, v7a_d_quat);
893 graph.addRing(v7a_d_bis, v7a_d_tris);
894
895 List<Vertex> symC = new ArrayList<Vertex>();
896 symC.add(v2b_d);
897 symC.add(v2b_d_bis);
898
900 return graph;
901 }
902
903//------------------------------------------------------------------------------
904
922 throws DENOPTIMException
923 {
924 DGraph graph = new DGraph();
926 BBType.FRAGMENT, fs);
927 graph.addVertex(v1a);
929 BBType.FRAGMENT, fs);
930 graph.addVertex(v6a_bis);
932 BBType.FRAGMENT, fs);
933 graph.addVertex(v6a_tris);
935 BBType.FRAGMENT, fs);
936 graph.addVertex(v7a_bis);
938 BBType.FRAGMENT, fs);
939 graph.addVertex(v7a_tris);
940
941 graph.addEdge(new Edge(v1a.getAP(3), v6a_bis.getAP(0)));
942 graph.addEdge(new Edge(v1a.getAP(4), v6a_tris.getAP(0)));
943 graph.addEdge(new Edge(v6a_bis.getAP(1), v7a_bis.getAP(0)));
944 graph.addEdge(new Edge(v6a_tris.getAP(1), v7a_tris.getAP(0)));
945
946 graph.addRing(v7a_bis, v7a_tris);
947
948 graph.renumberGraphVertices();
949 return graph;
950 }
951
952//------------------------------------------------------------------------------
953
969 throws Exception
970 {
971 DGraph innerGraph = makeTestGraphH(fs);
972 Template tmpl = new Template(BBType.FRAGMENT);
973 tmpl.setInnerGraph(innerGraph);
974
975 DGraph graph = new DGraph();
976 graph.addVertex(tmpl);
978 BBType.FRAGMENT, fs);
979 graph.addVertex(v6);
981 BBType.FRAGMENT, fs);
982 graph.addVertex(v7);
984 BBType.FRAGMENT, fs);
985 graph.addVertex(v6a);
987 BBType.FRAGMENT, fs);
988 graph.addVertex(v7a);
989
990 graph.addEdge(new Edge(tmpl.getAP(0), v6.getAP(0)));
991 graph.addEdge(new Edge(v6.getAP(1), v7.getAP(0)));
992 graph.addEdge(new Edge(tmpl.getAP(1), v6a.getAP(0)));
993 graph.addEdge(new Edge(v6a.getAP(1), v7a.getAP(0)));
994
995 graph.addRing(v7, v7a);
996
997 graph.renumberGraphVertices();
998 return graph;
999 }
1000
1001//------------------------------------------------------------------------------
1002
1020 throws DENOPTIMException
1021 {
1022 DGraph graph = new DGraph();
1024 BBType.FRAGMENT, fs);
1025 graph.addVertex(v1);
1027 BBType.FRAGMENT, fs);
1028 graph.addVertex(v1b);
1029
1031 BBType.FRAGMENT, fs);
1032 graph.addVertex(v2);
1034 BBType.FRAGMENT, fs);
1035 graph.addVertex(v2b);
1036
1037 graph.addEdge(new Edge(v1.getAP(0), v1b.getAP(2)));
1038 graph.addEdge(new Edge(v1.getAP(1), v2.getAP(0)));
1039 graph.addEdge(new Edge(v1b.getAP(4), v2b.getAP(0)));
1040 graph.renumberGraphVertices();
1041 return graph;
1042 }
1043
1044//------------------------------------------------------------------------------
1045
1061 throws DENOPTIMException
1062 {
1063 DGraph graph = new DGraph();
1065 BBType.FRAGMENT, fs);
1066 graph.addVertex(v1a);
1068 BBType.FRAGMENT, fs);
1069 graph.addVertex(v6a);
1071 BBType.FRAGMENT, fs);
1072 graph.addVertex(v6a_bis);
1073 Vertex v6a_tris = Vertex.newVertexFromLibrary(6,
1074 BBType.FRAGMENT, fs);
1075 graph.addVertex(v6a_tris);
1076
1078 BBType.FRAGMENT, fs);
1079 graph.addVertex(v1a_2);
1080 Vertex v1a_2_bis = Vertex.newVertexFromLibrary(1,
1081 BBType.FRAGMENT, fs);
1082 graph.addVertex(v1a_2_bis);
1083 Vertex v1a_2_tris = Vertex.newVertexFromLibrary(1,
1084 BBType.FRAGMENT, fs);
1085 graph.addVertex(v1a_2_tris);
1086
1087 List<Vertex> vToCap = new ArrayList<Vertex>();
1088 vToCap.add(v1a);
1089 vToCap.add(v1a_2);
1090 vToCap.add(v1a_2_bis);
1091 vToCap.add(v1a_2_tris);
1092 for (Vertex v : vToCap)
1093 {
1094 for (AttachmentPoint ap : v.getAttachmentPoints())
1095 {
1096 if (ap.isAvailable())
1097 {
1099 BBType.CAP, fs);
1100 graph.appendVertexOnAP(ap, cap.getAP(0));
1101 }
1102 }
1103 }
1104
1105 graph.addEdge(new Edge(v1a.getAP(1), v6a.getAP(0)));
1106 graph.addEdge(new Edge(v1a.getAP(3), v6a_bis.getAP(0)));
1107 graph.addEdge(new Edge(v1a.getAP(4), v6a_tris.getAP(0)));
1108 graph.addEdge(new Edge(v6a.getAP(1), v1a_2.getAP(1)));
1109 graph.addEdge(new Edge(v6a_bis.getAP(1), v1a_2_bis.getAP(1)));
1110 graph.addEdge(new Edge(v6a_tris.getAP(1), v1a_2_tris.getAP(1)));
1111
1112 List<Vertex> symA = new ArrayList<Vertex>();
1113 symA.add(v6a);
1114 symA.add(v6a_bis);
1116
1117 List<Vertex> symB = new ArrayList<Vertex>();
1118 symB.add(v1a_2);
1119 symB.add(v1a_2_bis);
1121
1122 graph.renumberGraphVertices();
1123 return graph;
1124 }
1125
1126//------------------------------------------------------------------------------
1127
1169 throws DENOPTIMException
1170 {
1171 DGraph graph = new DGraph();
1173 BBType.SCAFFOLD, fs);
1174 graph.addVertex(s);
1176 BBType.FRAGMENT, fs);
1177 graph.addVertex(v1a);
1179 BBType.FRAGMENT, fs);
1180 graph.addVertex(v6a);
1182 BBType.FRAGMENT, fs);
1183 graph.addVertex(v6a_bis);
1184 Vertex v6a_tris = Vertex.newVertexFromLibrary(6,
1185 BBType.FRAGMENT, fs);
1186 graph.addVertex(v6a_tris);
1188 BBType.FRAGMENT, fs);
1189 graph.addVertex(v7a);
1191 BBType.FRAGMENT, fs);
1192 graph.addVertex(v7a_bis);
1193 Vertex v7a_tris = Vertex.newVertexFromLibrary(7,
1194 BBType.FRAGMENT, fs);
1195 graph.addVertex(v7a_tris);
1196
1197 Vertex v7a_quat = Vertex.newVertexFromLibrary(7,
1198 BBType.FRAGMENT, fs);
1199 graph.addVertex(v7a_quat);
1200
1202 BBType.FRAGMENT, fs);
1203 graph.addVertex(v1d);
1204
1206 BBType.FRAGMENT, fs);
1207 graph.addVertex(v1c);
1208
1210 BBType.FRAGMENT, fs);
1211 graph.addVertex(v1b);
1213 BBType.FRAGMENT, fs);
1214 graph.addVertex(v2b);
1216 BBType.FRAGMENT, fs);
1217 graph.addVertex(v2b_bis);
1219 BBType.FRAGMENT, fs);
1220 graph.addVertex(v3b);
1221 graph.addEdge(new Edge(s.getAP(0), v1d.getAP(0)));
1222 graph.addEdge(new Edge(v1d.getAP(2), v1a.getAP(0)));
1223 graph.addEdge(new Edge(v1d.getAP(1), v6a.getAP(0)));
1224 graph.addEdge(new Edge(v1a.getAP(3), v6a_bis.getAP(0)));
1225 graph.addEdge(new Edge(v1a.getAP(4), v6a_tris.getAP(0)));
1226 graph.addEdge(new Edge(v6a.getAP(1), v7a.getAP(0)));
1227 graph.addEdge(new Edge(v6a_bis.getAP(1), v7a_bis.getAP(0)));
1228 graph.addEdge(new Edge(v6a_tris.getAP(1), v7a_tris.getAP(0)));
1229 graph.addEdge(new Edge(s.getAP(2), v7a_quat.getAP(0)));
1230 graph.addEdge(new Edge(s.getAP(1), v1c.getAP(0)));
1231 graph.addEdge(new Edge(v1c.getAP(2), v1b.getAP(0)));
1232 graph.addEdge(new Edge(v1b.getAP(1), v2b.getAP(0)));
1233 graph.addEdge(new Edge(v1b.getAP(3), v2b_bis.getAP(0)));
1234 graph.addEdge(new Edge(v1b.getAP(4), v3b.getAP(0)));
1235
1236 graph.addRing(v7a, v7a_quat);
1237 graph.addRing(v7a_bis, v7a_tris);
1238
1239 List<Vertex> symA = new ArrayList<Vertex>();
1240 symA.add(v6a_bis);
1241 symA.add(v6a_tris);
1243
1244 List<Vertex> symB = new ArrayList<Vertex>();
1245 symB.add(v7a_bis);
1246 symB.add(v7a_tris);
1248
1249 graph.renumberGraphVertices();
1250 return graph;
1251 }
1252
1253//------------------------------------------------------------------------------
1254
1267 throws DENOPTIMException
1268 {
1269 DGraph graph = new DGraph();
1271 BBType.FRAGMENT, fs);
1272 graph.addVertex(v1);
1274 BBType.FRAGMENT, fs);
1275 graph.addVertex(v2);
1277 BBType.FRAGMENT, fs);
1278 graph.addVertex(v3);
1280 BBType.FRAGMENT, fs);
1281 graph.addVertex(v4);
1283 BBType.FRAGMENT, fs);
1284 graph.addVertex(v5);
1285
1286 graph.addEdge(new Edge(v4.getAP(0), v1.getAP(0)));
1287 graph.addEdge(new Edge(v3.getAP(1), v4.getAP(1)));
1288 graph.addEdge(new Edge(v5.getAP(0), v3.getAP(0)));
1289 graph.addEdge(new Edge(v1.getAP(1), v2.getAP(0)));
1290 return graph;
1291 }
1292
1293//------------------------------------------------------------------------------
1294
1301 {
1302 EmptyVertex vOut = new EmptyVertex(0);
1303 vOut.addAP(APCA);
1304
1305 DGraph gOut = new DGraph();
1306 gOut.addVertex(vOut);
1307
1308 DGraph refToPrevGraph = gOut;
1309 Vertex refToPRevVrtx = vOut;
1310 for (int embeddingLevel=0; embeddingLevel<10; embeddingLevel++)
1311 {
1312 EmptyVertex v0 = new EmptyVertex(1+100*embeddingLevel);
1313 v0.addAP(APCA);
1314 v0.addAP(APCB);
1315 v0.addAP(APCC);
1316 EmptyVertex v1 = new EmptyVertex(2+100*embeddingLevel);
1317 v1.addAP(APCB);
1318 v1.addAP(APCA);
1319 v1.addAP(APCD);
1320 EmptyVertex v2 = new EmptyVertex(3+100*embeddingLevel);
1321 v2.addAP(APCB);
1322 DGraph g = new DGraph();
1323 g.addVertex(v0);
1324 g.appendVertexOnAP(v0.getAP(1), v1.getAP(0));
1325 g.appendVertexOnAP(v1.getAP(1), v2.getAP(0));
1327 t.setVertexId(5+100*embeddingLevel);
1328 t.setInnerGraph(g);
1329
1330 refToPrevGraph.appendVertexOnAP(refToPRevVrtx.getAP(0), t.getAP(1));
1331
1332 refToPrevGraph = g;
1333 refToPRevVrtx = v0;
1334 }
1335 return gOut;
1336 }
1337
1338//------------------------------------------------------------------------------
1339
1340 @Test
1341 public void testRemoveUnusedRCVs() throws Exception
1342 {
1343 APClass a0 = APClass.make("a",0,BondType.SINGLE);
1344 APClass b0 = APClass.make("b",0,BondType.SINGLE);
1345 APClass h0 = APClass.make("h",0,BondType.SINGLE);
1348
1349 HashMap<APClass,ArrayList<APClass>> cpMap =
1350 new HashMap<APClass,ArrayList<APClass>>();
1351 cpMap.put(a0, new ArrayList<APClass>(Arrays.asList(a0, b0)));
1352 HashMap<APClass,APClass> capMap = new HashMap<APClass,APClass>();
1353 capMap.put(a0, h0);
1354 HashSet<APClass> forbEnds = new HashSet<APClass>();
1355 forbEnds.add(b0);
1356
1357 Fragment frg1 = new Fragment();
1358 IAtom a1 = new Atom("C", new Point3d(new double[]{0.0, 0.0, 0.0}));
1359 IAtom a2 = new Atom("C", new Point3d(new double[]{1.0, 0.0, 0.0}));
1360 frg1.addAtom(a1);
1361 frg1.addAtom(a2);
1362 frg1.addBond(new Bond(a1, a2));
1363 frg1.addAP(0, a0, new Point3d(new double[]{0.0, 0.0, 1.0}));
1364 frg1.addAP(1, a0, new Point3d(new double[]{1.0, 1.0, 1.0}));
1365 frg1.projectAPsToProperties();
1366
1367 Fragment frg2 = new Fragment();
1368 IAtom a3 = new Atom("C", new Point3d(new double[]{0.0, 0.0, 0.0}));
1369 frg2.addAtom(a3);
1370 frg2.addAP(0, a0, new Point3d(new double[]{0.0, 1.0, 1.0}));
1371 frg2.addAP(0, b0, new Point3d(new double[]{0.0, 1.0, -1.0}));
1372 frg2.projectAPsToProperties();
1373
1374 Fragment rca1 = new Fragment();
1375 IAtom a4 = new PseudoAtom("ATP", new Point3d(
1376 new double[]{0.0, 0.0, 0.0}));
1377 rca1.addAtom(a4);
1378 rca1.addAP(0, ap0, new Point3d(new double[]{0.0, 1.0, 1.0}));
1379 rca1.projectAPsToProperties();
1380
1381 Fragment rca2 = new Fragment();
1382 IAtom a5 = new PseudoAtom("ATM", new Point3d(
1383 new double[]{1.0, 0.0, 0.0}));
1384 rca2.addAtom(a5);
1385 rca2.addAP(0, am0, new Point3d(new double[]{0.0, 1.0, 1.0}));
1386 rca2.projectAPsToProperties();
1387
1388 Fragment cap = new Fragment();
1389 IAtom a6 = new Atom("H", new Point3d(new double[]{0.0, 0.0, 0.0}));
1390 cap.addAtom(a6);
1391 cap.addAP(0, h0, new Point3d(new double[]{0.0, 1.0, 1.0}));
1392 cap.projectAPsToProperties();
1393
1394 ArrayList<Vertex> scaff = new ArrayList<Vertex>();
1395 scaff.add(frg1);
1396 ArrayList<Vertex> frags = new ArrayList<Vertex>();
1397 frags.add(frg2);
1398 frags.add(rca1);
1399 frags.add(rca2);
1400 ArrayList<Vertex> caps = new ArrayList<Vertex>();
1401 caps.add(cap);
1402
1404 FragmentSpace fs = new FragmentSpace(fsp, scaff, frags, caps,
1405 cpMap, capMap, forbEnds, cpMap);
1406 fs.setAPclassBasedApproach(true);
1407
1408 DGraph dg = new DGraph();
1413 dg.addVertex(v1);
1414 dg.addVertex(v2);
1415 dg.addVertex(v3);
1416 dg.addVertex(v4);
1417
1418 Edge e1 = new Edge(v1.getAP(1), v2.getAP(0), BondType.SINGLE);
1419 Edge e2 = new Edge(v2.getAP(1), v3.getAP(0), BondType.SINGLE);
1420 Edge e3 = new Edge(v1.getAP(0), v4.getAP(0), BondType.SINGLE);
1421 dg.addEdge(e1);
1422 dg.addEdge(e2);
1423 dg.addEdge(e3);
1424
1425 dg.addRing(v3, v4);
1426
1428
1429 assertEquals(4, dg.getVertexCount(),
1430 "Number of vertexes after removal of 0 unused RCVs.");
1431 assertEquals(3, dg.getEdgeCount(),
1432 "Number of edges after removal of 0 unused RCVs.");
1433
1434 DGraph acyclicGraph = new DGraph();
1439 acyclicGraph.addVertex(v1b);
1440 acyclicGraph.addVertex(v2b);
1441 acyclicGraph.addVertex(v3b);
1442 acyclicGraph.addVertex(v4b);
1443
1444 Edge e1b = new Edge(v1b.getAP(1), v2b.getAP(0), BondType.SINGLE);
1445 Edge e2b = new Edge(v2b.getAP(1), v3b.getAP(0), BondType.SINGLE);
1446 Edge e3b = new Edge(v1b.getAP(0), v4b.getAP(0), BondType.SINGLE);
1447 acyclicGraph.addEdge(e1b);
1448 acyclicGraph.addEdge(e2b);
1449 acyclicGraph.addEdge(e3b);
1450
1451 acyclicGraph.replaceUnusedRCVsWithCapps(fs);
1452
1453 assertEquals(0, acyclicGraph.getRCVertices().size(),
1454 "Number of RCVs after removal of 2 unused RCVs.");
1455 assertEquals(3, acyclicGraph.getVertexCount(),
1456 "Number of vertexes after removal of 2 unused RCVs.");
1457 assertEquals(2, acyclicGraph.getEdgeCount(),
1458 "Number of edges after removal of 2 unused RCVs.");
1459 }
1460
1461//------------------------------------------------------------------------------
1462
1463 @Test
1464 public void testGetEmbeddingPath() throws Exception
1465 {
1466 prepare();
1468
1469 List<Template> expected = new ArrayList<Template>();
1470 DGraph refToThisLayerGraph = gOut;
1471 Template refToThisLayerVrtx = null;
1472 for (int embeddingLevel=0; embeddingLevel<10; embeddingLevel++)
1473 {
1474 refToThisLayerVrtx = (Template) refToThisLayerGraph
1475 .getVertexList().stream()
1476 .filter(v -> v instanceof Template)
1477 .findAny()
1478 .orElse(null);
1479 expected.add(refToThisLayerVrtx);
1480 refToThisLayerGraph = refToThisLayerVrtx.getInnerGraph();
1481 }
1482
1483 assertEquals(new ArrayList<Template>(),gOut.getEmbeddingPath(),
1484 "Embedding path of graph that is not embedded");
1485 List<Template> path = refToThisLayerGraph.getEmbeddingPath();
1486 assertEquals(expected, path, "Path of deepest embedded graph");
1487 }
1488
1489//------------------------------------------------------------------------------
1490
1491 @Test
1492 public void testGetEmbeddedGraphInClone() throws Exception
1493 {
1494 prepare();
1496 DGraph gB = gA.clone();
1497
1498 // This works only because we know that the graphs have only one
1499 // template per level
1500 List<Template> expectedPathA = new ArrayList<Template>();
1501 List<Template> expectedPathB = new ArrayList<Template>();
1502 DGraph refToThisLayerGraphB = gB;
1503 Template refToThisLayerVrtxB = null;
1504 DGraph refToThisLayerGraphA = gA;
1505 Template refToThisLayerVrtxA = null;
1506 for (int embeddingLevel=0; embeddingLevel<9; embeddingLevel++)
1507 {
1508 refToThisLayerVrtxA = (Template) refToThisLayerGraphA
1509 .getVertexList().stream()
1510 .filter(v -> v instanceof Template)
1511 .findAny()
1512 .orElse(null);
1513 expectedPathA.add(refToThisLayerVrtxA);
1514 refToThisLayerGraphA = refToThisLayerVrtxA.getInnerGraph();
1515
1516 refToThisLayerVrtxB = (Template) refToThisLayerGraphB
1517 .getVertexList().stream()
1518 .filter(v -> v instanceof Template)
1519 .findAny()
1520 .orElse(null);
1521 expectedPathB.add(refToThisLayerVrtxB);
1522 refToThisLayerGraphB = refToThisLayerVrtxB.getInnerGraph();
1523 }
1524
1525 DGraph expectedEmbeddedA = expectedPathA.get(8).getInnerGraph();
1526 DGraph expectedEmbeddedB = expectedPathB.get(8).getInnerGraph();
1527
1528 DGraph embeddedFoundB = DGraph.getEmbeddedGraphInClone(gB,
1529 gA, expectedPathA);
1530
1531 assertEquals(expectedEmbeddedB,embeddedFoundB);
1532
1533 List<Template> pathFoundB = embeddedFoundB.getEmbeddingPath();
1534 assertEquals(expectedPathB,pathFoundB);
1535
1536 DGraph embeddedFoundA = DGraph.getEmbeddedGraphInClone(gA,
1537 gB, expectedPathB);
1538 assertEquals(expectedEmbeddedA,embeddedFoundA);
1539
1540 List<Template> pathFoundA = embeddedFoundA.getEmbeddingPath();
1541 assertEquals(expectedPathA,pathFoundA);
1542 }
1543
1544//------------------------------------------------------------------------------
1545
1546 @Test
1547 public void testGetSourceVertex() throws Exception
1548 {
1549 FragmentSpace fs = prepare();
1551 Vertex src = g.getSourceVertex();
1552 assertEquals(g.getVertexAtPosition(4),src,
1553 "Inconsistent source vertex");
1554
1555 DGraph g2 = makeTestGraphC(fs);
1556 Vertex src2 = g2.getSourceVertex();
1557 assertEquals(g2.getVertexAtPosition(0),src2,
1558 "Inconsistent source vertex");
1559 }
1560
1561//------------------------------------------------------------------------------
1562
1563 @Test
1564 public void testGetLevel() throws Exception
1565 {
1566 FragmentSpace fs = prepare();
1568 int[] expected = new int[] {2,3,0,1,-1};
1569 for (int i=0; i<g.getVertexCount(); i++)
1570 {
1571 assertEquals(expected[i],g.getLevel(g.getVertexAtPosition(i)),
1572 "Wrong level for vertex at position "+i);
1573 }
1574
1575 DGraph g2 = makeTestGraphC(fs);
1576 expected = new int[] {-1,0,1,2,3,2,0,1,2,3,2};
1577 for (int i=0; i<g2.getVertexCount(); i++)
1578 {
1579 assertEquals(expected[i],g2.getLevel(g2.getVertexAtPosition(i)),
1580 "Bis: Wrong level for vertex at position "+i);
1581 }
1582 }
1583
1584//------------------------------------------------------------------------------
1585
1586 @Test
1587 public void testReplaceVertex() throws Exception
1588 {
1589 FragmentSpace fs = prepare();
1590 DGraph g = makeTestGraphB(fs);
1591
1592 Vertex v1 = g.getVertexAtPosition(1);
1593
1594 LinkedHashMap<Integer, Integer> apMap =
1595 new LinkedHashMap<Integer,Integer>();
1596 apMap.put(0, 4);
1597 apMap.put(1, 1);
1598 apMap.put(3, 2);
1599 apMap.put(4, 0);
1600
1601 int chosenBBId = 4;
1602 BBType choosenBBTyp = BBType.FRAGMENT;
1603
1604 boolean res = g.replaceVertex(v1, chosenBBId, choosenBBTyp, apMap, fs);
1605
1606 assertTrue(res,"ReplaceVertex return value.");
1607 assertFalse(g.containsVertex(v1),"v1 is still part of graph");
1608 int numVertexesWithGoodBBId = 0;
1609 int numEdgesWithS = 0;
1610 int numEdgesWith2 = 0;
1611 int numEdgesWith3 = 0;
1612 for (Vertex v : g.gVertices)
1613 {
1614 if (v.getBuildingBlockType() == choosenBBTyp
1615 && v.getBuildingBlockId() == chosenBBId)
1616 {
1617 numVertexesWithGoodBBId++;
1618
1620 {
1621 if (!ap.isAvailable())
1622 {
1623 Vertex nextVrtx = ap.getLinkedAP().getOwner();
1624 if (nextVrtx.getBuildingBlockType() == BBType.SCAFFOLD)
1625 {
1626 numEdgesWithS++;
1627 } else {
1628 switch (nextVrtx.getBuildingBlockId())
1629 {
1630 case 2:
1631 numEdgesWith2++;
1632 break;
1633 case 3:
1634 numEdgesWith3++;
1635 break;
1636 }
1637 }
1638 }
1639 }
1640 }
1641 }
1642 assertEquals(2,numVertexesWithGoodBBId,"Number of new links.");
1643 assertEquals(2,numEdgesWithS,"Number of new edges with scaffold.");
1644 assertEquals(4,numEdgesWith2,"Number of new edges with v2a/b.");
1645 assertEquals(2,numEdgesWith3,"Number of new edges with v3a/b.");
1646
1647 //
1648 //
1649 //
1650 DGraph g2 = makeTestGraphB(fs);
1651
1652 Vertex v2 = g2.getVertexAtPosition(2);
1653
1654 SymmetricVertexes origSS = new SymmetricVertexes();
1655 for (Vertex v : g2.getSymSetForVertex(v2))
1656 {
1657 origSS.add(v);
1658 }
1659 Set<Long> oldVertexIds = new HashSet<Long>();
1660 for (Vertex v : g2.getVertexList())
1661 oldVertexIds.add(v.getVertexId());
1662
1663 LinkedHashMap<Integer,Integer> apMap2 =
1664 new LinkedHashMap<Integer,Integer>();
1665 apMap2.put(0, 1);
1666
1667 int chosenBBId2 = 5;
1668 BBType choosenBBTyp2 = BBType.FRAGMENT;
1669
1670 boolean res2 = g2.replaceVertex(v2, chosenBBId2, choosenBBTyp2, apMap2,
1671 fs);
1672
1673 assertTrue(res2,"ReplaceVertex return value (2).");
1674 assertFalse(g2.containsVertex(v2),"v2 is still part of graph");
1675 int numVertexesWithGoodBBId2 = 0;
1676 int numEdgesWith1 = 0;
1677 for (Vertex v : g2.gVertices)
1678 {
1679 if (v.getBuildingBlockType() == choosenBBTyp2
1680 && v.getBuildingBlockId() == chosenBBId2)
1681 {
1682 numVertexesWithGoodBBId2++;
1683
1685 {
1686 if (!ap.isAvailable())
1687 {
1688 Vertex nextVrtx = ap.getLinkedAP().getOwner();
1689 if (nextVrtx.getBuildingBlockId() == 1)
1690 numEdgesWith1++;
1691 }
1692 }
1693 }
1694 }
1695 assertEquals(4,numVertexesWithGoodBBId2,"Number of new links.");
1696 assertEquals(4,numEdgesWith1,"Number of new edges with scaffold.");
1697 assertEquals(2,g2.getSymmetricSetCount(),"Number of symmetric sets.");
1698 boolean found = false;
1699 boolean foundOldVertexId = false;
1700 Iterator<SymmetricVertexes> iterSS = g2.getSymSetsIterator();
1701 while (iterSS.hasNext())
1702 {
1703 SymmetricVertexes ss = iterSS.next();
1704 if (ss.size() == origSS.size())
1705 {
1706 found = true;
1707 for (Vertex v : ss)
1708 {
1709 if (oldVertexIds.contains(v.getVertexId()))
1710 foundOldVertexId = true;
1711 }
1712 }
1713 }
1714 assertTrue(found,"could not find old symmetric set");
1715 assertFalse(foundOldVertexId,"found old vertex id in new symmetric set");
1716 }
1717
1718//------------------------------------------------------------------------------
1719
1720 @Test
1721 public void testReplaceVertex_inRing() throws Exception
1722 {
1723 FragmentSpace fs = prepare();
1724 DGraph g = makeTestGraphD(fs);
1725
1726 Vertex v = g.getVertexAtPosition(1);
1727
1728 LinkedHashMap<Integer, Integer> apMap =
1729 new LinkedHashMap<Integer,Integer>();
1730 apMap.put(0, 0);
1731 apMap.put(1, 1);
1732 apMap.put(2, 2);
1733 apMap.put(3, 3);
1734 apMap.put(4, 4);
1735
1736 boolean res = g.replaceVertex(v, 1, BBType.FRAGMENT, apMap, fs);
1737 assertTrue(res);
1738
1739 DGraph g2 = makeTestGraphD(fs);
1740 assertTrue(g.isIsomorphicTo(g2));
1741 }
1742
1743//------------------------------------------------------------------------------
1744
1745 @Test
1746 public void testReplaceSingleSubGraph() throws Exception, DENOPTIMException
1747 {
1748 FragmentSpace fs = prepare();
1749 DGraph g = makeTestGraphD(fs);
1750 DGraph incomingSubGraph = makeTestGraphF(fs);
1751
1752 APMapping apMap = new APMapping();
1753 apMap.put(g.getVertexAtPosition(0).getAP(1), //A:0
1754 incomingSubGraph.getVertexAtPosition(0).getAP(2)); //A:0 free 3rd AP
1755 apMap.put(g.getVertexAtPosition(0).getAP(2), //D:0
1756 incomingSubGraph.getVertexAtPosition(7).getAP(1)); //D:99
1757 apMap.put(g.getVertexAtPosition(1).getAP(1), //B:0
1758 incomingSubGraph.getVertexAtPosition(6).getAP(2)); //A:0
1759 apMap.put(g.getVertexAtPosition(1).getAP(4), //C:0
1760 incomingSubGraph.getVertexAtPosition(6).getAP(4)); //C:0
1761 apMap.put(g.getVertexAtPosition(1).getAP(3), //B:0
1762 incomingSubGraph.getVertexAtPosition(5).getAP(3)); //B:0
1763
1764 incomingSubGraph.reassignSymmetricLabels();
1765
1766 boolean res = DGraph.replaceSingleSubGraph(apMap, fs);
1767 assertTrue(res);
1768
1770
1771 assertEquals(3,g.getRingCount(),"number of rings");
1772 assertEquals(3,g.getSymmetricSetCount(),"number of symmetric sets");
1773 assertEquals(incomingSubGraph.getVertexAtPosition(0),g.getSourceVertex(),
1774 "graph's surce vertex");
1775 //NB: the position of the vertexes has changes by -2. so vertex 3 is now at 1
1777 g.getVertexAtPosition(2)); // length was 2
1778 assertEquals(3,pathA.getEdgesPath().size(),"path within a ring (A)");
1780 g.getVertexAtPosition(6)); // length was 4
1781 assertEquals(5,pathB.getEdgesPath().size(),"path within a ring (B)");
1783 g.getVertexAtPosition(6)); // length was 2
1784 assertEquals(4,pathC.getEdgesPath().size(),"path within a ring (C)");
1785
1786 DGraph expected = makeTestGraphG(fs);
1787 assertTrue(g.isIsomorphicTo(expected),"isomorphic to expected");
1788 }
1789
1790//------------------------------------------------------------------------------
1791
1792 @Test
1793 public void testReplaceSingleSubGraph_inTemplate() throws Exception
1794 {
1795 FragmentSpace fs = prepare();
1796 DGraph g = makeTestGraphI(fs);
1797
1798 DGraph innerGraph = ((Template) g.getVertexAtPosition(0))
1799 .getInnerGraph();
1800
1801 DGraph incomingSubGraph = makeTestGraphJ(fs);
1802
1803 APMapping apMap = new APMapping();
1804 // first two are those needed within the template
1805 apMap.put(innerGraph.getVertexAtPosition(0).getAP(3), //B:0
1806 incomingSubGraph.getVertexAtPosition(0).getAP(1)); //B:0
1807 apMap.put(innerGraph.getVertexAtPosition(0).getAP(4), //C:0
1808 incomingSubGraph.getVertexAtPosition(1).getAP(4)); //C:0
1809 // second two are those projected and used outside template
1810 apMap.put(innerGraph.getVertexAtPosition(0).getAP(0), //A:0
1811 incomingSubGraph.getVertexAtPosition(0).getAP(2)); //A:0
1812 apMap.put(innerGraph.getVertexAtPosition(0).getAP(1), //B:0
1813 incomingSubGraph.getVertexAtPosition(0).getAP(3)); //B:0
1814
1815 boolean res = DGraph.replaceSingleSubGraph(apMap, fs);
1816
1817 assertTrue(res);
1818
1819 assertEquals(5,g.getVertexCount(),"Vertex in outer graph");
1820 assertEquals(1,g.getRingCount(),"Rings in outer graph");
1821 assertEquals(4,g.getAvailableAPs().size(),"Free APs outer graph");
1822 Ring r = g.getRings().get(0);
1823 assertEquals(4,r.getDistance(r.getHeadVertex(),r.getTailVertex()),
1824 "Distance Head-Tail in ring of outer graph");
1825
1826 DGraph innerGraphAfter =
1827 ((Template) g.getVertexAtPosition(0)).getInnerGraph();
1828 assertEquals(6,innerGraphAfter.getVertexCount(),
1829 "Vertex in inner graph");
1830 assertEquals(1,innerGraphAfter.getRingCount(),
1831 "Rings in inner graph");
1832 assertEquals(6,innerGraphAfter.getAvailableAPs().size(),
1833 "Free APs inner graph");
1834 Ring ri = innerGraphAfter.getRings().get(0);
1835 assertEquals(5,ri.getDistance(ri.getHeadVertex(),ri.getTailVertex()),
1836 "Distance Head-Tail in ring of inner graph");
1837 }
1838
1839//------------------------------------------------------------------------------
1840
1841 @Test
1843 {
1844 FragmentSpace fs = prepare();
1845 DGraph graph = makeTestGraphO_A(fs);
1846 DGraph incomingGraph = makeTestGraphO_B(fs);
1847
1848 Vertex vOnGraph = graph.getVertexAtPosition(0); // is s2
1849 Vertex vOnInGraph = incomingGraph.getVertexAtPosition(0); // is s1
1850
1851 APMapping apMapping = new APMapping();
1852 apMapping.put(vOnGraph.getAP(0).getLinkedAP(), vOnInGraph.getAP(0).getLinkedAP());
1853 apMapping.put(vOnGraph.getAP(2).getLinkedAP(), vOnInGraph.getAP(1).getLinkedAP());
1854
1855 incomingGraph.reassignSymmetricLabels();
1856 DGraph.replaceSingleSubGraph(apMapping, fs);
1858
1859 assertEquals(graph.getVertexCount(), 12);
1860 assertEquals(graph.getEdgeCount(), 11);
1861 assertEquals(graph.getRingCount(), 2);
1862 assertEquals(graph.getSymmetricSetCount(), 2);
1863
1864 // inverting roles of graphs and ussing the complementary APMapping should lead to
1865 // the same results as the original graph because of consistent edge directions
1866 DGraph graphB = makeTestGraphO_B(fs);
1867 DGraph incomingGraphB = makeTestGraphO_A(fs);
1868
1869 Vertex vOnGraphB = graphB.getVertexAtPosition(0); // is s1
1870 Vertex vOnInGraphB = incomingGraphB.getVertexAtPosition(0); // is s2
1871
1872 APMapping apMappingB = new APMapping();
1873 apMappingB.put(vOnGraphB.getAP(0), vOnInGraphB.getAP(0));
1874 apMappingB.put(vOnGraphB.getAP(1), vOnInGraphB.getAP(2));
1875
1876 incomingGraphB.reassignSymmetricLabels();
1877 DGraph.replaceSingleSubGraph(apMappingB, fs);
1879
1880 assertEquals(graphB.getVertexCount(), 12);
1881 assertEquals(graphB.getEdgeCount(), 11);
1882 assertEquals(graphB.getRingCount(), 2);
1883 assertEquals(graphB.getSymmetricSetCount(), 2);
1884
1885 assertTrue(graph.isIsomorphicTo(graphB));
1886 assertTrue(graphB.isIsomorphicTo(graph));
1887 }
1888
1889//------------------------------------------------------------------------------
1890
1891 @Test
1893 {
1894 FragmentSpace fs = prepare();
1895 DGraph graph = makeTestGraphO_A(fs);
1896 DGraph incomingGraph = makeTestGraphO_B(fs);
1897
1898 APMapping apMapping = new APMapping();
1899 apMapping.put(graph.getVertexAtPosition(3).getAP(0),
1900 incomingGraph.getVertexAtPosition(1).getAP(0));
1901 apMapping.put(graph.getVertexAtPosition(3).getAP(1),
1902 incomingGraph.getVertexAtPosition(5).getAP(1));
1903
1904 incomingGraph.reassignSymmetricLabels();
1905 DGraph.replaceSingleSubGraph(apMapping, fs);
1907
1908 assertEquals(graph.getVertexCount(), 11); // 4+7 becaue of remuval of redudnat RCV pair
1909 assertEquals(graph.getEdgeCount(), 10);
1910 assertEquals(graph.getRingCount(), 1); // 2-1 because of removal of redundant RCV pair
1911 assertEquals(graph.getSymmetricSetCount(), 1);
1912
1913 // inverting roles of graphs and using the complementary APMapping does not lead to
1914 // the same results because of the different RCV pair that survives the filtering
1915 DGraph graphB = makeTestGraphO_B(fs);
1916 DGraph incomingGraphB = makeTestGraphO_A(fs);
1917
1918 APMapping apMappingB = new APMapping();
1919 apMappingB.put(graphB.getVertexAtPosition(1).getAP(0).getLinkedAP(),
1920 incomingGraphB.getVertexAtPosition(3).getAP(0).getLinkedAP());
1921 apMappingB.put(graphB.getVertexAtPosition(5).getAP(1).getLinkedAP(),
1922 incomingGraphB.getVertexAtPosition(3).getAP(1).getLinkedAP());
1923
1924 incomingGraphB.reassignSymmetricLabels();
1925 DGraph.replaceSingleSubGraph(apMappingB, fs);
1927
1928 assertEquals(graphB.getVertexCount(), 11);
1929 assertEquals(graphB.getEdgeCount(), 10);
1930 assertEquals(graphB.getRingCount(), 1);
1931 assertEquals(graphB.getSymmetricSetCount(), 1);
1932 }
1933
1934
1935//------------------------------------------------------------------------------
1936
1952 {
1953 DGraph graph = new DGraph();
1955 BBType.FRAGMENT, fs);
1956 graph.addVertex(v0);
1958 BBType.FRAGMENT, fs);
1959 graph.addVertex(v1);
1961 BBType.FRAGMENT, fs);
1962 graph.addVertex(v2);
1964 BBType.FRAGMENT, fs);
1965 graph.addVertex(v3);
1967 BBType.FRAGMENT, fs);
1968 graph.addVertex(v4);
1969
1970 graph.addEdge(new Edge(v0.getAP(0), v1.getAP(2)));
1971 graph.addEdge(new Edge(v1.getAP(1), v2.getAP(0)));
1972 graph.addEdge(new Edge(v0.getAP(4), v3.getAP(1)));
1973 graph.addEdge(new Edge(v3.getAP(0), v4.getAP(1)));
1974
1975 graph.renumberGraphVertices();
1976 return graph;
1977 }
1978
1979//------------------------------------------------------------------------------
1980
1981 @Test
1982 public void testReplaceSingleSubGraph_ringFormation() throws Exception
1983 {
1984 FragmentSpace fs = prepare();
1985 DGraph graph = makeTestGraphO_A(fs);
1986 DGraph incomingGraph = makeTestGraph_treeWithOutScaffold(fs);
1987
1988 APMapping apMapping = new APMapping();
1989 apMapping.put(graph.getVertexAtPosition(1).getAP(0),
1990 incomingGraph.getVertexAtPosition(1).getAP(4));
1991 apMapping.put(graph.getVertexAtPosition(6).getAP(0),
1992 incomingGraph.getVertexAtPosition(4).getAP(3));
1993
1994 DGraph.replaceSingleSubGraph(apMapping, fs);
1995
1996 assertEquals(graph.getVertexCount(), 12);
1997 assertEquals(graph.getEdgeCount(), 11);
1998 assertEquals(graph.getRingCount(), 2);
1999 }
2000
2001//------------------------------------------------------------------------------
2002
2003 @Test
2004 public void testRemoveVertex() throws Exception
2005 {
2006 DGraph graph = new DGraph();
2007 EmptyVertex v0 = new EmptyVertex(0);
2008 buildVertexAndConnectToGraph(v0, 3, graph);
2009
2010 EmptyVertex v1 = new EmptyVertex(1);
2011 buildVertexAndConnectToGraph(v1, 2, graph);
2012 graph.addEdge(new Edge(v0.getAP(0), v1.getAP(0)));
2013
2014 EmptyVertex v2 = new EmptyVertex(2);
2015 buildVertexAndConnectToGraph(v2, 2, graph);
2016 graph.addEdge(new Edge(v1.getAP(1), v2.getAP(0)));
2017
2018 EmptyVertex v3 = new EmptyVertex(3);
2019 buildVertexAndConnectToGraph(v3, 1, graph);
2020 graph.addEdge(new Edge(v2.getAP(1), v3.getAP(0)));
2021
2022 EmptyVertex v4 = new EmptyVertex(4);
2023 buildVertexAndConnectToGraph(v4, 3, graph);
2024 graph.addEdge(new Edge(v0.getAP(1), v4.getAP(0)));
2025
2026 EmptyVertex v5 = new EmptyVertex(5);
2027 buildVertexAndConnectToGraph(v5, 1, graph);
2028 graph.addEdge(new Edge(v4.getAP(1), v5.getAP(0)));
2029
2030 EmptyVertex v6 = new EmptyVertex(6);
2031 buildVertexAndConnectToGraph(v6, 1, graph);
2032 graph.addEdge(new Edge(v0.getAP(2), v6.getAP(0)));
2033
2034 EmptyVertex v7 = new EmptyVertex(7);
2035 buildVertexAndConnectToGraph(v7, 1, graph);
2036 graph.addEdge(new Edge(v4.getAP(2), v7.getAP(0)));
2037
2038 graph.addRing(new Ring(new ArrayList<>(
2039 Arrays.asList(v5, v4, v0, v1, v2, v3))));
2040
2041 graph.addRing(new Ring(new ArrayList<>(
2042 Arrays.asList(v6, v0, v4, v7))));
2043
2045 ss.add(v3);
2046 ss.add(v5);
2047 graph.addSymmetricSetOfVertices(ss);
2048
2050 ss2.add(v6);
2051 ss2.add(v7);
2052 graph.addSymmetricSetOfVertices(ss2);
2053
2054 // Current string encoding this graph is
2055// "0 0_1_0_0,1_1_1_0,2_1_1_0,3_1_1_0,4_1_1_0,5_1_1_0,"
2056// + "6_1_1_0,7_1_1_0, 0_0_1_0_1,1_1_2_0_1,2_1_3_0_1,0_1_4_0_1,"
2057// + "4_1_5_0_1,0_2_6_0_1,4_2_7_0_1, "
2058// + "DENOPTIMRing [verteces=[5_1_1_0, 4_1_1_0, 0_1_0_0, 1_1_1_0,"
2059// + " 2_1_1_0, 3_1_1_0]] DENOPTIMRing [verteces=[6_1_1_0,"
2060// + " 0_1_0_0, 4_1_1_0, 7_1_1_0]] "
2061// + "SymmetricSet [symVrtxIds=[3, 5]] "
2062// + "SymmetricSet [symVrtxIds=[6, 7]]";
2063
2064 int numV = graph.getVertexCount();
2065 int numE = graph.getEdgeCount();
2066 int numS = graph.getSymmetricSetCount();
2067 int numR = graph.getRingCount();
2068
2069 graph.removeVertex(v5);
2070
2071 int numVa = graph.getVertexCount();
2072 int numEa = graph.getEdgeCount();
2073 int numSa = graph.getSymmetricSetCount();
2074 int numRa = graph.getRingCount();
2075
2076 assertEquals(numVa, numV - 1);
2077 assertEquals(numEa, numE - 1);
2078 assertEquals(numSa, numS - 1);
2079 assertEquals(numRa, numR - 1);
2080
2081 graph.removeVertex(v3);
2082
2083 int numVb = graph.getVertexCount();
2084 int numEb = graph.getEdgeCount();
2085 int numSb = graph.getSymmetricSetCount();
2086 int numRb = graph.getRingCount();
2087
2088 assertEquals(numVb, numVa - 1);
2089 assertEquals(numEb, numEa - 1);
2090 assertEquals(numSb, numSa);
2091 assertEquals(numRb, numRa);
2092
2093 graph.removeVertex(v4); // non terminal vertex
2094
2095 int numVc = graph.getVertexCount();
2096 int numEc = graph.getEdgeCount();
2097 int numSc = graph.getSymmetricSetCount();
2098 int numRc = graph.getRingCount();
2099
2100 assertEquals(numVc, numVb - 1);
2101 assertEquals(numEc, numEb - 2);
2102 assertEquals(numSc, numSb);
2103 assertEquals(numRc, numRb - 1);
2104 }
2105
2106//------------------------------------------------------------------------------
2107
2108 @Test
2110 {
2111 DGraph graphA = new DGraph();
2112 EmptyVertex v0 = new EmptyVertex(0);
2113 buildVertexAndConnectToGraph(v0, 3, graphA);
2114
2115 EmptyVertex v1 = new EmptyVertex(1);
2116 buildVertexAndConnectToGraph(v1, 2, graphA);
2117 graphA.addEdge(new Edge(v0.getAP(0), v1.getAP(0)));
2118
2119 EmptyVertex v2 = new EmptyVertex(2);
2120 buildVertexAndConnectToGraph(v2, 2, graphA);
2121 graphA.addEdge(new Edge(v1.getAP(1), v2.getAP(0)));
2122
2123 // Other graph, but is the same graph
2124
2125 DGraph graphB = new DGraph();
2126 EmptyVertex v90 = new EmptyVertex(90);
2127 buildVertexAndConnectToGraph(v90, 3, graphB);
2128
2129 EmptyVertex v91 = new EmptyVertex(91);
2130 buildVertexAndConnectToGraph(v91, 2, graphB);
2131 graphB.addEdge(new Edge(v90.getAP(0), v91.getAP(0)));
2132
2133 EmptyVertex v92 = new EmptyVertex(92);
2134 buildVertexAndConnectToGraph(v92, 2, graphB);
2135 graphB.addEdge(new Edge(v91.getAP(1), v92.getAP(0)));
2136
2137 StringBuilder reason = new StringBuilder();
2138 assertTrue(graphA.sameAs(graphB, reason), reason.toString());
2139 }
2140
2141//------------------------------------------------------------------------------
2142
2143 @Test
2145 {
2146 DGraph graphA = new DGraph();
2147 EmptyVertex v0 = new EmptyVertex(0);
2148 buildVertexAndConnectToGraph(v0, 3, graphA);
2149
2150 EmptyVertex v1 = new EmptyVertex(1);
2151 buildVertexAndConnectToGraph(v1, 2, graphA);
2152 graphA.addEdge(new Edge(v0.getAP(0), v1.getAP(0)));
2153
2154 EmptyVertex v2 = new EmptyVertex(2);
2155 buildVertexAndConnectToGraph(v2, 2, graphA);
2156 graphA.addEdge(new Edge(v1.getAP(1), v2.getAP(0)));
2157
2158 // Other graph
2159
2160 DGraph graphB = new DGraph();
2161 EmptyVertex v90 = new EmptyVertex(90);
2162 buildVertexAndConnectToGraph(v90, 3, graphB);
2163
2164 EmptyVertex v91 = new EmptyVertex(91);
2165 buildVertexAndConnectToGraph(v91, 2, graphB);
2166 graphB.addEdge(new Edge(v90.getAP(0), v91.getAP(0)));
2167
2168 EmptyVertex v92 = new EmptyVertex(92);
2169 buildVertexAndConnectToGraph(v92, 3, graphB);
2170 graphB.addEdge(new Edge(v91.getAP(1), v92.getAP(0)));
2171
2172 StringBuilder reason = new StringBuilder();
2173 assertFalse(graphA.sameAs(graphB, reason));
2174 }
2175
2176//------------------------------------------------------------------------------
2177
2178 @Test
2179 public void testSameAs_SameSymmSet() throws Exception {
2180 DGraph graphA = new DGraph();
2181 EmptyVertex v0 = new EmptyVertex(0);
2182 buildVertexAndConnectToGraph(v0, 4, graphA);
2183
2184 EmptyVertex v1 = new EmptyVertex(1);
2185 buildVertexAndConnectToGraph(v1, 2, graphA);
2186 graphA.addEdge(new Edge(v0.getAP(0), v1.getAP(0)));
2187
2188 EmptyVertex v2 = new EmptyVertex(2);
2189 buildVertexAndConnectToGraph(v2, 2, graphA);
2190 graphA.addEdge(new Edge(v0.getAP(1), v2.getAP(0)));
2191
2192 EmptyVertex v3 = new EmptyVertex(3);
2193 buildVertexAndConnectToGraph(v3, 2, graphA);
2194 graphA.addEdge(new Edge(v0.getAP(2), v3.getAP(0)));
2195
2196 EmptyVertex v4 = new EmptyVertex(4);
2197 buildVertexAndConnectToGraph(v4, 2, graphA);
2198 graphA.addEdge(new Edge(v0.getAP(3), v4.getAP(0)));
2199
2201 ssA.add(v1);
2202 ssA.add(v2);
2203 graphA.addSymmetricSetOfVertices(ssA);
2205 ssA2.add(v3);
2206 ssA2.add(v4);
2207 graphA.addSymmetricSetOfVertices(ssA2);
2208
2209 // Other
2210
2211 DGraph graphB = new DGraph();
2212 EmptyVertex v90 = new EmptyVertex(90);
2213 buildVertexAndConnectToGraph(v90, 4, graphB);
2214
2215 EmptyVertex v91 = new EmptyVertex(91);
2216 buildVertexAndConnectToGraph(v91, 2, graphB);
2217 graphB.addEdge(new Edge(v90.getAP(0), v91.getAP(0)));
2218
2219 EmptyVertex v92 = new EmptyVertex(92);
2220 buildVertexAndConnectToGraph(v92, 2, graphB);
2221 graphB.addEdge(new Edge(v90.getAP(1), v92.getAP(0)));
2222
2223 EmptyVertex v93 = new EmptyVertex(93);
2224 buildVertexAndConnectToGraph(v93, 2, graphB);
2225 graphB.addEdge(new Edge(v90.getAP(2), v93.getAP(0)));
2226
2227 EmptyVertex v94 = new EmptyVertex(94);
2228 buildVertexAndConnectToGraph(v94, 2, graphB);
2229 graphB.addEdge(new Edge(v90.getAP(3), v94.getAP(0)));
2230
2232 ssB2.add(v93);
2233 ssB2.add(v94);
2234 graphB.addSymmetricSetOfVertices(ssB2);
2236 ssB.add(v91);
2237 ssB.add(v92);
2238 graphB.addSymmetricSetOfVertices(ssB);
2239
2240 StringBuilder reason = new StringBuilder();
2241 assertTrue(graphA.sameAs(graphB, reason));
2242 }
2243
2244//------------------------------------------------------------------------------
2245
2246 @Test
2247 public void testSameAs_DiffSymmSet() throws Exception {
2248 DGraph graphA = new DGraph();
2249 EmptyVertex v0 = new EmptyVertex(0);
2250 buildVertexAndConnectToGraph(v0, 4, graphA);
2251
2252 EmptyVertex v1 = new EmptyVertex(1);
2253 buildVertexAndConnectToGraph(v1, 2, graphA);
2254 graphA.addEdge(new Edge(v0.getAP(0), v1.getAP(0)));
2255
2256 EmptyVertex v2 = new EmptyVertex(2);
2257 buildVertexAndConnectToGraph(v2, 2, graphA);
2258 graphA.addEdge(new Edge(v0.getAP(1), v2.getAP(0)));
2259
2260 EmptyVertex v3 = new EmptyVertex(3);
2261 buildVertexAndConnectToGraph(v3, 2, graphA);
2262 graphA.addEdge(new Edge(v0.getAP(2), v3.getAP(0)));
2263
2264 EmptyVertex v4 = new EmptyVertex(4);
2265 buildVertexAndConnectToGraph(v4, 2, graphA);
2266 graphA.addEdge(new Edge(v0.getAP(3), v4.getAP(0)));
2267
2269 ssA.add(v1); //difference
2270 ssA.add(v2); //difference
2271 graphA.addSymmetricSetOfVertices(ssA);
2273 ssA2.add(v3); //difference
2274 ssA2.add(v4); //difference
2275 graphA.addSymmetricSetOfVertices(ssA2);
2276
2277 // Other
2278
2279 DGraph graphB = new DGraph();
2280 EmptyVertex v90 = new EmptyVertex(90);
2281 buildVertexAndConnectToGraph(v90, 4, graphB);
2282
2283 EmptyVertex v91 = new EmptyVertex(91);
2284 buildVertexAndConnectToGraph(v91, 2, graphB);
2285 graphB.addEdge(new Edge(v90.getAP(0), v1.getAP(0)));
2286
2287 EmptyVertex v92 = new EmptyVertex(92);
2288 buildVertexAndConnectToGraph(v92, 2, graphB);
2289 graphB.addEdge(new Edge(v0.getAP(1), v2.getAP(0)));
2290
2291 EmptyVertex v93 = new EmptyVertex(93);
2292 buildVertexAndConnectToGraph(v93, 2, graphB);
2293 graphB.addEdge(new Edge(v0.getAP(2), v3.getAP(0)));
2294
2295 EmptyVertex v94 = new EmptyVertex(94);
2296 buildVertexAndConnectToGraph(v94, 2, graphB);
2297 graphB.addEdge(new Edge(v0.getAP(3), v4.getAP(0)));
2298
2300 ssB.add(v1); //difference
2301 ssB.add(v3); //difference
2302 graphB.addSymmetricSetOfVertices(ssB);
2304 ssB2.add(v2); //difference
2305 ssB2.add(v4); //difference
2306 graphB.addSymmetricSetOfVertices(ssB2);
2307
2308 StringBuilder reason = new StringBuilder();
2309 assertFalse(graphA.sameAs(graphB, reason));
2310 }
2311
2312//------------------------------------------------------------------------------
2313
2314 @Test
2316 {
2317 DGraph graphA = new DGraph();
2318 EmptyVertex v0 = new EmptyVertex(0);
2319 buildVertexAndConnectToGraph(v0, 4, graphA);
2320
2321 EmptyVertex v1 = new EmptyVertex(1);
2322 buildVertexAndConnectToGraph(v1, 2, graphA);
2323 graphA.addEdge(new Edge(v0.getAP(0), v1.getAP(0)));
2324
2325 EmptyVertex v2 = new EmptyVertex(2);
2326 buildVertexAndConnectToGraph(v2, 2, graphA);
2327 graphA.addEdge(new Edge(v0.getAP(1), v2.getAP(0)));
2328
2329 EmptyVertex v3 = new EmptyVertex(3);
2330 buildVertexAndConnectToGraph(v3, 2, graphA);
2331 graphA.addEdge(new Edge(v0.getAP(2), v3.getAP(0)));
2332
2333 EmptyVertex v4 = new EmptyVertex(4);
2334 buildVertexAndConnectToGraph(v4, 2, graphA);
2335 graphA.addEdge(new Edge(v0.getAP(3), v4.getAP(0)));
2336
2337 ArrayList<Vertex> vrA = new ArrayList<Vertex>();
2338 vrA.add(v1);
2339 vrA.add(v0);
2340 vrA.add(v2);
2341 Ring rA = new Ring(vrA);
2342 graphA.addRing(rA);
2343 ArrayList<Vertex> vrA2 = new ArrayList<Vertex>();
2344 vrA2.add(v3);
2345 vrA2.add(v0);
2346 vrA2.add(v4);
2347 Ring rA2 = new Ring(vrA2);
2348 graphA.addRing(rA2);
2349
2350 // Other
2351
2352 DGraph graphB = new DGraph();
2353 EmptyVertex v90 = new EmptyVertex(90);
2354 buildVertexAndConnectToGraph(v90, 4, graphB);
2355
2356 EmptyVertex v91 = new EmptyVertex(91);
2357 buildVertexAndConnectToGraph(v91, 2, graphB);
2358 graphB.addEdge(new Edge(v90.getAP(0), v91.getAP(0)));
2359
2360 EmptyVertex v92 = new EmptyVertex(92);
2361 buildVertexAndConnectToGraph(v92, 2, graphB);
2362 graphB.addEdge(new Edge(v90.getAP(1), v92.getAP(0)));
2363
2364 EmptyVertex v93 = new EmptyVertex(93);
2365 buildVertexAndConnectToGraph(v93, 2, graphB);
2366 graphB.addEdge(new Edge(v90.getAP(2), v93.getAP(0)));
2367
2368 EmptyVertex v94 = new EmptyVertex(94);
2369 buildVertexAndConnectToGraph(v94, 2, graphB);
2370 graphB.addEdge(new Edge(v90.getAP(3), v94.getAP(0)));
2371
2372 ArrayList<Vertex> vrB = new ArrayList<Vertex>();
2373 vrB.add(v91);
2374 vrB.add(v90);
2375 vrB.add(v92);
2376 Ring rB = new Ring(vrB);
2377 graphB.addRing(rB);
2378 ArrayList<Vertex> vrB2 = new ArrayList<Vertex>();
2379 vrB2.add(v93);
2380 vrB2.add(v90);
2381 vrB2.add(v94);
2382 Ring rB2 = new Ring(vrB2);
2383 graphB.addRing(rB2);
2384
2385 StringBuilder reason = new StringBuilder();
2386 assertTrue(graphA.sameAs(graphB, reason));
2387 }
2388
2389//------------------------------------------------------------------------------
2390
2391 @Test
2392 public void testSameAs_DisorderRings() throws Exception
2393 {
2394 DGraph graphA = new DGraph();
2395 EmptyVertex v0 = new EmptyVertex(0);
2396 buildVertexAndConnectToGraph(v0, 4, graphA);
2397
2398 EmptyVertex v1 = new EmptyVertex(1);
2399 buildVertexAndConnectToGraph(v1, 2, graphA);
2400 graphA.addEdge(new Edge(v0.getAP(0), v1.getAP(0)));
2401
2402 EmptyVertex v2 = new EmptyVertex(2);
2403 buildVertexAndConnectToGraph(v2, 2, graphA);
2404 graphA.addEdge(new Edge(v0.getAP(1), v2.getAP(0)));
2405
2406 EmptyVertex v3 = new EmptyVertex(3);
2407 buildVertexAndConnectToGraph(v3, 2, graphA);
2408 graphA.addEdge(new Edge(v0.getAP(2), v3.getAP(0)));
2409
2410 EmptyVertex v4 = new EmptyVertex(4);
2411 buildVertexAndConnectToGraph(v4, 2, graphA);
2412 graphA.addEdge(new Edge(v0.getAP(3), v4.getAP(0)));
2413
2414 ArrayList<Vertex> vrA = new ArrayList<>();
2415 vrA.add(v1);
2416 vrA.add(v0);
2417 vrA.add(v2);
2418 Ring rA = new Ring(vrA);
2419 graphA.addRing(rA);
2420 ArrayList<Vertex> vrA2 = new ArrayList<>();
2421 vrA2.add(v3);
2422 vrA2.add(v0);
2423 vrA2.add(v4);
2424 Ring rA2 = new Ring(vrA2);
2425 graphA.addRing(rA2);
2426
2427 // Other
2428
2429 DGraph graphB = new DGraph();
2430 EmptyVertex v90 = new EmptyVertex(90);
2431 buildVertexAndConnectToGraph(v90, 4, graphB);
2432
2433 EmptyVertex v91 = new EmptyVertex(91);
2434 buildVertexAndConnectToGraph(v91, 2, graphB);
2435 graphB.addEdge(new Edge(v90.getAP(0), v91.getAP(0)));
2436
2437 EmptyVertex v92 = new EmptyVertex(92);
2438 buildVertexAndConnectToGraph(v92, 2, graphB);
2439 graphB.addEdge(new Edge(v90.getAP(1), v92.getAP(0)));
2440
2441 EmptyVertex v93 = new EmptyVertex(93);
2442 buildVertexAndConnectToGraph(v93, 2, graphB);
2443 graphB.addEdge(new Edge(v90.getAP(2), v93.getAP(0)));
2444
2445 EmptyVertex v94 = new EmptyVertex(94);
2446 buildVertexAndConnectToGraph(v94, 2, graphB);
2447 graphB.addEdge(new Edge(v90.getAP(3), v94.getAP(0)));
2448
2449 ArrayList<Vertex> vrB = new ArrayList<>();
2450 vrB.add(v91);
2451 vrB.add(v90);
2452 vrB.add(v92);
2453 Ring rB = new Ring(vrB);
2454 graphB.addRing(rB);
2455 ArrayList<Vertex> vrB2 = new ArrayList<>();
2456 vrB2.add(v94);
2457 vrB2.add(v90);
2458 vrB2.add(v93);
2459 Ring rB2 = new Ring(vrB2);
2460 graphB.addRing(rB2);
2461
2462 StringBuilder reason = new StringBuilder();
2463 assertTrue(graphA.sameAs(graphB, reason));
2464 }
2465
2466//------------------------------------------------------------------------------
2467
2468 @Test
2470 {
2471 DGraph graphA = new DGraph();
2472 EmptyVertex v0 = new EmptyVertex(0);
2473 buildVertexAndConnectToGraph(v0, 4, graphA);
2474
2475 EmptyVertex v1 = new EmptyVertex(1);
2476 buildVertexAndConnectToGraph(v1, 2, graphA);
2477 graphA.addEdge(new Edge(v0.getAP(0), v1.getAP(0)));
2478
2479 EmptyVertex v2 = new EmptyVertex(2);
2480 buildVertexAndConnectToGraph(v2, 2, graphA);
2481 graphA.addEdge(new Edge(v0.getAP(1), v2.getAP(0)));
2482
2483 EmptyVertex v3 = new EmptyVertex(3);
2484 buildVertexAndConnectToGraph(v3, 2, graphA);
2485 graphA.addEdge(new Edge(v0.getAP(2), v3.getAP(0)));
2486
2487 EmptyVertex v4 = new EmptyVertex(4);
2488 buildVertexAndConnectToGraph(v4, 2, graphA);
2489 graphA.addEdge(new Edge(v0.getAP(3), v4.getAP(0)));
2490
2491 ArrayList<Vertex> vrA = new ArrayList<>();
2492 vrA.add(v1);
2493 vrA.add(v0);
2494 vrA.add(v2);
2495 Ring rA = new Ring(vrA);
2496 graphA.addRing(rA);
2497 ArrayList<Vertex> vrA2 = new ArrayList<>();
2498 vrA2.add(v3);
2499 vrA2.add(v0);
2500 vrA2.add(v4);
2501 Ring rA2 = new Ring(vrA2);
2502 graphA.addRing(rA2);
2503
2504 // Other
2505 DGraph graphB = new DGraph();
2506 EmptyVertex v90 = new EmptyVertex(90);
2507 buildVertexAndConnectToGraph(v90, 4, graphB);
2508
2509 EmptyVertex v91 = new EmptyVertex(91);
2510 buildVertexAndConnectToGraph(v91, 2, graphB);
2511 graphB.addEdge(new Edge(v90.getAP(0), v91.getAP(0)));
2512
2513 EmptyVertex v92 = new EmptyVertex(92);
2514 buildVertexAndConnectToGraph(v92, 2, graphB);
2515 graphB.addEdge(new Edge(v90.getAP(1), v92.getAP(0)));
2516
2517 EmptyVertex v93 = new EmptyVertex(93);
2518 buildVertexAndConnectToGraph(v93, 2, graphB);
2519 graphB.addEdge(new Edge(v90.getAP(2), v93.getAP(0)));
2520
2521 EmptyVertex v94 = new EmptyVertex(94);
2522 buildVertexAndConnectToGraph(v94, 2, graphB);
2523 graphB.addEdge(new Edge(v90.getAP(3), v94.getAP(0)));
2524
2525 ArrayList<Vertex> vrB = new ArrayList<>();
2526 vrB.add(v91);
2527 vrB.add(v90);
2528 vrB.add(v94);
2529 Ring rB = new Ring(vrB);
2530 graphB.addRing(rB);
2531 ArrayList<Vertex> vrB2 = new ArrayList<>();
2532 vrB2.add(v92);
2533 vrB2.add(v90);
2534 vrB2.add(v93);
2535 Ring rB2 = new Ring(vrB2);
2536 graphB.addRing(rB2);
2537
2538 StringBuilder reason = new StringBuilder();
2539 assertFalse(graphA.sameAs(graphB, reason));
2540 }
2541
2542//------------------------------------------------------------------------------
2543
2544 @Test
2546 throws DENOPTIMException
2547 {
2548 EmptyVertex vertex0 = new EmptyVertex(0);
2549 EmptyVertex vertex1 = new EmptyVertex(1);
2550
2551 vertex0.addAP();
2552 vertex0.addAP();
2553 vertex1.addAP();
2554
2555 Edge edge0 = new Edge(vertex0.getAP(0),
2556 vertex1.getAP(0));
2557
2558 DGraph graph = new DGraph();
2559 graph.addVertex(vertex0);
2560 graph.addVertex(vertex1);
2561 graph.addEdge(edge0);
2562
2563 List<AttachmentPoint> lst = graph.getAvailableAPs();
2564 assertEquals(1,lst.size(), "Size of list");
2565 assertEquals(vertex0.getVertexId(),lst.get(0).getOwner().getVertexId(),
2566 "ID of the vertex holding the available AP.");
2567 }
2568
2569//------------------------------------------------------------------------------
2570
2571 @Test
2572 public void testClone() throws DENOPTIMException {
2573 DGraph graph = new DGraph();
2574 EmptyVertex v0 = new EmptyVertex(0);
2575 buildVertexAndConnectToGraph(v0, 3, graph);
2576
2577 EmptyVertex v1 = new EmptyVertex(1);
2578 buildVertexAndConnectToGraph(v1, 2, graph);
2579 graph.addEdge(new Edge(v0.getAP(0), v1.getAP(0)));
2580
2581 EmptyVertex v2 = new EmptyVertex(2);
2582 buildVertexAndConnectToGraph(v2, 2, graph);
2583 graph.addEdge(new Edge(v1.getAP(1), v2.getAP(0)));
2584
2585 EmptyVertex v3 = new EmptyVertex(3);
2586 buildVertexAndConnectToGraph(v3, 1, graph);
2587 graph.addEdge(new Edge(v2.getAP(1), v3.getAP(0)));
2588
2589 EmptyVertex v4 = new EmptyVertex(4);
2590 buildVertexAndConnectToGraph(v4, 3, graph);
2591 graph.addEdge(new Edge(v0.getAP(1), v4.getAP(0)));
2592
2593 EmptyVertex v5 = new EmptyVertex(5);
2594 buildVertexAndConnectToGraph(v5, 1, graph);
2595 graph.addEdge(new Edge(v4.getAP(1), v5.getAP(0)));
2596
2597 EmptyVertex v6 = new EmptyVertex(6);
2598 buildVertexAndConnectToGraph(v6, 1, graph);
2599 graph.addEdge(new Edge(v0.getAP(2), v6.getAP(0)));
2600
2601 EmptyVertex v7 = new EmptyVertex(7);
2602 buildVertexAndConnectToGraph(v7, 1, graph);
2603 graph.addEdge(new Edge(v4.getAP(2), v7.getAP(0)));
2604
2605 graph.addRing(new Ring(new ArrayList<>(
2606 Arrays.asList(v5, v4, v0, v1, v2, v3))));
2607
2608 graph.addRing(new Ring(new ArrayList<>(
2609 Arrays.asList(v6, v0, v4, v7))));
2610
2612 ss1.add(v3);
2613 ss1.add(v5);
2614 graph.addSymmetricSetOfVertices(ss1);
2615
2617 ss2.add(v6);
2618 ss2.add(v7);
2619 graph.addSymmetricSetOfVertices(ss2);
2620
2621 DGraph clone = graph.clone();
2622
2623 assertEquals(graph.gVertices.size(), clone.gVertices.size(),
2624 "Number of vertices");
2625 assertEquals(graph.gEdges.size(), clone.gEdges.size(),
2626 "Number of Edges");
2627 assertEquals(graph.gRings.size(), clone.gRings.size(),
2628 "Number of Rings");
2629 assertEquals(graph.getSymmetricSetCount(), clone.getSymmetricSetCount(),
2630 "Number of symmetric sets");
2631 assertEquals(graph.closableChains.size(), clone.closableChains.size(),
2632 "Number of closable chains");
2633 assertEquals(graph.localMsg, clone.localMsg,
2634 "Local msg");
2635 assertEquals(graph.graphId, clone.graphId,
2636 "Graph ID");
2637
2638 for (int iv=0; iv<graph.getVertexCount(); iv++)
2639 {
2640 Vertex vg = graph.getVertexAtPosition(iv);
2641 Vertex vc = clone.getVertexAtPosition(iv);
2642 int hashVG = vg.hashCode();
2643 int hashVC = vc.hashCode();
2644
2645 for (int iap = 0; iap<vg.getNumberOfAPs(); iap++)
2646 {
2647 assertEquals(vg.getAP(iap).getOwner().hashCode(), hashVG,
2648 "Reference to vertex owner in ap " + iap + " vertex "
2649 + iv + "(G)");
2650 assertEquals(vc.getAP(iap).getOwner().hashCode(), hashVC,
2651 "Reference to vertex owner in ap " + iap + " vertex "
2652 + iv + " (C)");
2653 assertNotEquals(vc.getAP(iap).getOwner().hashCode(),
2654 vg.getAP(iap).getOwner().hashCode(),
2655 "Owner of AP "+iap+" in vertex "+iv);
2656 }
2657 }
2658 }
2659
2660//------------------------------------------------------------------------------
2661
2662 @Test
2664 {
2665 DGraph graph = new DGraph();
2668 graph.addVertex(tmpl);
2669
2670 assertEquals(1, graph.getMutableSites().size(),
2671 "Size of mutation list in case of frozen template");
2672
2673 graph = new DGraph();
2675 graph.addVertex(tmpl);
2676
2677 assertEquals(2, graph.getMutableSites().size(),
2678 "Size of mutation list in case of free template");
2679
2680 assertEquals(0, graph.getMutableSites(new ArrayList<>(
2681 Arrays.asList(MutationType.values()))).size(),
2682 "No sites if all is ignored");
2683 }
2684
2685//------------------------------------------------------------------------------
2686
2693 throws Exception
2694 {
2695 DGraph graph = new DGraph();
2697 BBType.SCAFFOLD, fs);
2698 graph.addVertex(s);
2699 return graph;
2700 }
2701
2702//------------------------------------------------------------------------------
2703
2710 throws Exception
2711 {
2712 DGraph graph = new DGraph();
2714 BBType.SCAFFOLD, fs);
2715 graph.addVertex(s);
2717 BBType.FRAGMENT, fs);
2718 graph.addVertex(v1a);
2719
2720 graph.addEdge(new Edge(s.getAP(0), v1a.getAP(0)));
2721
2722 return graph;
2723 }
2724
2725//------------------------------------------------------------------------------
2726
2742 public static DGraph makeTestGraphA()
2743 {
2744 DGraph graph = new DGraph();
2745
2746 // If we cannot make the test graph, something is deeeeeply wrong and
2747 // a bugfix is needed.
2748 try {
2749 IChemObjectBuilder builder = SilentChemObjectBuilder.getInstance();
2750 IAtomContainer iac1 = builder.newAtomContainer();
2751 IAtom ia1 = new Atom("C");
2752 IAtom ia2 = new Atom("C");
2753 iac1.addAtom(ia1);
2754 iac1.addAtom(ia2);
2755 iac1.addBond(new Bond(ia1, ia2, IBond.Order.SINGLE));
2756
2757 Fragment v1 = new Fragment(1, iac1, BBType.SCAFFOLD);
2758 v1.addAP(0);
2759 v1.addAP(0);
2760 v1.addAP(0);
2761 v1.addAP(1);
2762
2763 IAtomContainer iac2 = builder.newAtomContainer();
2764 iac2.addAtom(new Atom("O"));
2765 Fragment v2 = new Fragment(2, iac2, BBType.FRAGMENT);
2766 v2.addAP(0);
2767 v2.addAP(0);
2768
2769 IAtomContainer iac3 = builder.newAtomContainer();
2770 iac3.addAtom(new Atom("H"));
2771 Fragment v3 = new Fragment(3, iac3,
2772 BBType.CAP);
2773 v3.addAP(0);
2774
2775 IAtomContainer iac4 = builder.newAtomContainer();
2776 iac4.addAtom(new Atom("H"));
2777 Fragment v4 = new Fragment(4, iac4,
2778 BBType.CAP);
2779 v4.addAP(0);
2780
2781 graph.addVertex(v1);
2782 graph.addVertex(v2);
2783 graph.addVertex(v3);
2784 graph.addVertex(v4);
2785 graph.addEdge(new Edge(v1.getAP(0), v2.getAP(0)));
2786 graph.addEdge(new Edge(v1.getAP(1), v3.getAP(0)));
2787 graph.addEdge(new Edge(v2.getAP(1), v4.getAP(0)));
2788
2789 // Use this just to verify identify of the graph
2790 /*
2791 System.out.println("WRITING TEST GRAPH A");
2792 DenoptimIO.writeGraphsToFile(new File("/tmp/test_graph_A"),
2793 FileFormat.GRAPHJSON,
2794 new ArrayList<DENOPTIMGraph>(Arrays.asList(graph)));
2795 */
2796 } catch (Throwable t)
2797 {
2798 t.printStackTrace();
2799 System.err.println("FATAL ERROR! Could not make test graph (A). "
2800 + "Please, report this to the development team.");
2801 System.exit(-1);
2802 }
2803
2804 return graph;
2805 }
2806
2807//------------------------------------------------------------------------------
2808
2831 public static DGraph makeTestGraphA2()
2832 {
2833 DGraph graph = new DGraph();
2834
2835 // If we cannot make the test graph, something is deeeeeply wrong and
2836 // a bugfix is needed.
2837 try {
2838 IChemObjectBuilder builder = SilentChemObjectBuilder.getInstance();
2839 IAtomContainer iac1 = builder.newAtomContainer();
2840 IAtom ia1 = new Atom("C");
2841 IAtom ia2 = new Atom("C");
2842 iac1.addAtom(ia1);
2843 iac1.addAtom(ia2);
2844 iac1.addBond(new Bond(ia1, ia2, IBond.Order.SINGLE));
2845
2846 Fragment v1 = new Fragment(1, iac1, BBType.SCAFFOLD);
2847 v1.addAP(0, APClass.make(a,0));
2848 v1.addAP(0, APClass.make(b,1));
2849 v1.addAP(0, APClass.make(b,1));
2850 v1.addAP(1, APClass.make(a,0));
2851 v1.setBuildingBlockId(0);
2852
2853 IAtomContainer iac2 = builder.newAtomContainer();
2854 iac2.addAtom(new Atom("O"));
2855 Fragment v2 = new Fragment(2, iac2, BBType.FRAGMENT);
2856 v2.addAP(0, APClass.make(b,1));
2857 v2.addAP(0, APClass.make(b,1));
2858 v2.setBuildingBlockId(1);
2859
2860 IAtomContainer iac3 = builder.newAtomContainer();
2861 iac3.addAtom(new Atom("H"));
2862 Fragment v3 = new Fragment(3, iac3, BBType.CAP);
2863 v3.addAP(0, APClass.make(c,1));
2864 v3.setBuildingBlockId(2);
2865
2866 IAtomContainer iac4 = builder.newAtomContainer();
2867 iac4.addAtom(new Atom("H"));
2868 Fragment v4 = new Fragment(4, iac4, BBType.CAP);
2869 v4.addAP(0, APClass.make(c,1));
2870 v4.setBuildingBlockId(3);
2871
2872 EmptyVertex ev1 = new EmptyVertex();
2873 ev1.addAP(APClass.make(d,0));
2874 ev1.addAP(APClass.make(d,0));
2875
2876 EmptyVertex ev2 = new EmptyVertex();
2877 ev2.addAP(APClass.make(d,0));
2878 ev2.addAP(APClass.make(d,0));
2879
2880 EmptyVertex ev3 = new EmptyVertex();
2881 ev3.addAP(APClass.make(a,1));
2882 ev3.addAP(APClass.make(a,1));
2883
2884 graph.addVertex(v1);
2885 graph.addVertex(v2);
2886 graph.addVertex(v3);
2887 graph.addVertex(v4);
2888 graph.addVertex(ev3); //These are disordered on purpose
2889 graph.addVertex(ev2);
2890 graph.addVertex(ev1);
2891 graph.addEdge(new Edge(v1.getAP(0), v2.getAP(0),
2892 BondType.TRIPLE));
2893 graph.addEdge(new Edge(v1.getAP(1), v3.getAP(0),
2894 BondType.SINGLE));
2895 graph.addEdge(new Edge(v2.getAP(1), v4.getAP(0)));
2896 graph.addEdge(new Edge(v1.getAP(2), ev1.getAP(1),
2897 BondType.SINGLE));
2898 graph.addEdge(new Edge(v1.getAP(3), ev3.getAP(0),
2899 BondType.NONE));
2900 graph.addEdge(new Edge(ev1.getAP(0), ev2.getAP(0),
2901 BondType.TRIPLE));
2902
2903 // Use this just to verify identify of the graph
2904 /*
2905 System.out.println("WRITING TEST GRAPH A2 in /tmp/test_graph_A2.json");
2906 DenoptimIO.writeGraphToJSON(new File("/tmp/test_graph_A2.json"),
2907 graph);
2908 */
2909 } catch (Throwable t)
2910 {
2911 t.printStackTrace();
2912 System.err.println("FATAL ERROR! Could not make test graph (A). "
2913 + "Please, report this to the development team.");
2914 System.exit(-1);
2915 }
2916
2917 return graph;
2918 }
2919
2920//------------------------------------------------------------------------------
2921
2922 @Test
2923 public void testRemoveCapping() throws Exception
2924 {
2925 DGraph graph = new DGraph();
2926
2927 IChemObjectBuilder builder = SilentChemObjectBuilder.getInstance();
2928 IAtomContainer iac1 = builder.newAtomContainer();
2929 iac1.addAtom(new Atom("C"));
2930 Fragment v1 = new Fragment(1, iac1, BBType.SCAFFOLD);
2931 v1.addAP(0);
2932 v1.addAP(0);
2933
2934 IAtomContainer iac2 = builder.newAtomContainer();
2935 iac2.addAtom(new Atom("O"));
2936 Fragment v2 = new Fragment(2, iac2, BBType.FRAGMENT);
2937 v2.addAP(0);
2938 v2.addAP(0);
2939
2940 IAtomContainer iac3 = builder.newAtomContainer();
2941 iac3.addAtom(new Atom("H"));
2942 Fragment v3 = new Fragment(3, iac3, BBType.CAP);
2943 v3.addAP(0);
2944
2945 IAtomContainer iac4 = builder.newAtomContainer();
2946 iac4.addAtom(new Atom("H"));
2947 Fragment v4 = new Fragment(4, iac4, BBType.CAP);
2948 v4.addAP(0);
2949
2950 graph.addVertex(v1);
2951 graph.addVertex(v2);
2952 graph.addVertex(v3);
2953 graph.addVertex(v4);
2954 graph.addEdge(new Edge(v1.getAP(0), v2.getAP(0)));
2955 graph.addEdge(new Edge(v1.getAP(1), v3.getAP(0)));
2956 graph.addEdge(new Edge(v2.getAP(1), v4.getAP(0)));
2957
2958 assertEquals(4, graph.getVertexCount(),
2959 "#vertices in graph before removal");
2960 assertTrue(graph == v4.getGraphOwner());
2961
2962 graph.removeCappingGroupsOn(v2);
2963
2964 assertEquals(3, graph.getVertexCount(),
2965 "#vertices in graph before removal");
2966 assertFalse(graph.containsVertex(v4),
2967 "Capping is still contained");
2968 assertTrue(null == v4.getGraphOwner(),
2969 "Owner of removed capping group is null");
2970
2971 DGraph graph2 = new DGraph();
2972
2973 IAtomContainer iac12 = builder.newAtomContainer();
2974 iac12.addAtom(new Atom("C"));
2975 Fragment v21 = new Fragment(21, iac12, BBType.SCAFFOLD);
2976 v21.addAP(0);
2977 v21.addAP(0);
2978
2979 IAtomContainer iac22 = builder.newAtomContainer();
2980 iac22.addAtom(new Atom("O"));
2981 Fragment v22 = new Fragment(22, iac22, BBType.FRAGMENT);
2982 v22.addAP(0);
2983 v22.addAP(0);
2984
2985 IAtomContainer iac23 = builder.newAtomContainer();
2986 iac23.addAtom(new Atom("H"));
2987 Fragment v23 = new Fragment(23, iac23, BBType.CAP);
2988 v23.addAP(0);
2989
2990 IAtomContainer iac24 = builder.newAtomContainer();
2991 iac24.addAtom(new Atom("H"));
2992 Fragment v24 = new Fragment(24, iac24, BBType.CAP);
2993 v24.addAP(0);
2994
2995 graph2.addVertex(v21);
2996 graph2.addVertex(v22);
2997 graph2.addVertex(v23);
2998 graph2.addVertex(v24);
2999 graph2.addEdge(new Edge(v21.getAP(0), v22.getAP(0)));
3000 graph2.addEdge(new Edge(v21.getAP(1), v23.getAP(0)));
3001 graph2.addEdge(new Edge(v22.getAP(1), v24.getAP(0)));
3002
3003 assertEquals(4, graph2.getVertexCount(),
3004 "#vertices in graph before removal (B)");
3005 assertTrue(graph2 == v23.getGraphOwner());
3006 assertTrue(graph2 == v24.getGraphOwner());
3007
3008 graph2.removeCappingGroups();
3009
3010 assertEquals(2, graph2.getVertexCount(),
3011 "#vertices in graph before removal (B)");
3012 assertFalse(graph.containsVertex(v24),
3013 "Capping is still contained (B)");
3014 assertFalse(graph.containsVertex(v23),
3015 "Capping is still contained (C)");
3016 assertTrue(null == v24.getGraphOwner(),
3017 "Owner of removed capping group is null (B)");
3018 assertTrue(null == v23.getGraphOwner(),
3019 "Owner of removed capping group is null (C)");
3020 }
3021
3022//------------------------------------------------------------------------------
3023
3024 private void buildVertexAndConnectToGraph(EmptyVertex v, int apCount,
3025 DGraph graph) throws DENOPTIMException
3026 {
3027 for (int atomPos = 0; atomPos < apCount; atomPos++) {
3028 v.addAP();
3029 }
3030 graph.addVertex(v);
3031 }
3032
3033//------------------------------------------------------------------------------
3034
3035 @Test
3036 public void testFromToJSON() throws Exception
3037 {
3038 DGraph graph = new DGraph();
3039
3040 EmptyVertex v0 = new EmptyVertex(0);
3041 buildVertexAndConnectToGraph(v0, 3, graph);
3042
3043 EmptyVertex v1 = new EmptyVertex(1);
3044 buildVertexAndConnectToGraph(v1, 2, graph);
3045 graph.addEdge(new Edge(v0.getAP(0), v1.getAP(0)));
3046
3047 EmptyVertex v2 = new EmptyVertex(2);
3048 buildVertexAndConnectToGraph(v2, 2, graph);
3049 graph.addEdge(new Edge(v1.getAP(1), v2.getAP(0)));
3050
3051 EmptyVertex v3 = new EmptyVertex(3);
3052 buildVertexAndConnectToGraph(v3, 1, graph);
3053 graph.addEdge(new Edge(v2.getAP(1), v3.getAP(0)));
3054
3055 EmptyVertex v4 = new EmptyVertex(4);
3056 buildVertexAndConnectToGraph(v4, 3, graph);
3057 graph.addEdge(new Edge(v0.getAP(1), v4.getAP(0)));
3058
3059 EmptyVertex v5 = new EmptyVertex(5);
3060 buildVertexAndConnectToGraph(v5, 1, graph);
3061 graph.addEdge(new Edge(v4.getAP(1), v5.getAP(0)));
3062
3063 EmptyVertex v6 = new EmptyVertex(6);
3064 buildVertexAndConnectToGraph(v6, 1, graph);
3065 graph.addEdge(new Edge(v0.getAP(2), v6.getAP(0)));
3066
3067 EmptyVertex v7 = new EmptyVertex(7);
3068 buildVertexAndConnectToGraph(v7, 1, graph);
3069 graph.addEdge(new Edge(v4.getAP(2), v7.getAP(0)));
3070
3071 graph.addRing(new Ring(new ArrayList<>(
3072 Arrays.asList(v5, v4, v0, v1, v2, v3))));
3073
3074 graph.addRing(new Ring(new ArrayList<>(
3075 Arrays.asList(v6, v0, v4, v7))));
3076
3078 ss1.add(v3);
3079 ss1.add(v5);
3080 graph.addSymmetricSetOfVertices(ss1);
3081
3083 ss2.add(v6);
3084 ss2.add(v7);
3085 graph.addSymmetricSetOfVertices(ss2);
3086
3087 String json1 = graph.toJson();
3088
3089 DGraph g2 = DGraph.fromJson(json1);
3090 String json2 = g2.toJson();
3091
3092 assertTrue(json1.equals(json2), "Round-trip via JSON is successful");
3093 }
3094
3095//-----------------------------------------------------------------------------
3096
3097 @Test
3098 public void testGraphIsomorphism() throws Exception
3099 {
3100 FragmentSpace fs = prepare();
3101
3102 DGraph gAempty = new DGraph();
3103 DGraph gBempty = new DGraph();
3104
3105 assertTrue(gAempty.isIsomorphicTo(gAempty),
3106 "self isomorphism on empty graph");
3107 assertTrue(gAempty.isIsomorphicTo(gBempty),
3108 "isomorphism on empty graphs");
3109
3110 DGraph g01 = makeTestGraph0(fs);
3111 DGraph g02 = makeTestGraph0(fs);
3112 assertTrue(g01.isIsomorphicTo(g02),
3113 "single-vertex graph");
3114 assertTrue(g01.isIsomorphicTo(g01.clone()),
3115 "single-vertex graph vs clone");
3116
3117 DGraph g03 = new DGraph();
3118 EmptyVertex v1 = new EmptyVertex();
3119 v1.addAP();
3120 v1.addAP();
3121 String k ="MyKey";
3123 v1.setProperty(k, 123);
3124 g03.addVertex(v1);
3125 EmptyVertex v2 = new EmptyVertex();
3126 v2.addAP();
3127 v2.addAP();
3129 v2.setProperty(k, 456);
3130 g03.appendVertexOnAP(v1.getAP(0), v2.getAP(0));
3131
3132 DGraph g04 = g03.clone();
3133 assertTrue(g03.isIsomorphicTo(g04),
3134 "graph with empty vertexes and same properties");
3135
3136 v2.setProperty(k, 999);
3137 assertFalse(g03.isIsomorphicTo(g04),
3138 "graph with empty vertexes and different properties");
3139
3140 DGraph g11 = makeTestGraph1(fs);
3141 DGraph g12 = makeTestGraph1(fs);
3142 assertTrue(g11.isIsomorphicTo(g12),"two-vertex graph");
3143 assertTrue(g11.isIsomorphicTo(g11.clone()),"two-vertex graph vs clone");
3144
3145 DGraph gD1 = makeTestGraphD(fs);
3146 DGraph gD2 = makeTestGraphD(fs);
3147 assertTrue(gD1.isIsomorphicTo(gD2),"two of same graph D");
3148 assertFalse(gD1.isIsomorphicTo(gAempty),"graph D vs empty graph");
3149 assertFalse(gAempty.isIsomorphicTo(gD1),"empty graph vs graph D");
3150
3151 DGraph gB1 = makeTestGraphB(fs);
3152 assertFalse(gD1.isIsomorphicTo(gB1),"graph D vs graph B");
3153
3154 DGraph gB2 = gB1.clone();
3155 assertTrue(gB1.isIsomorphicTo(gB2),"graph B vs its clone");
3156 }
3157
3158//-----------------------------------------------------------------------------
3159
3160 @Test
3161 public void testExtractSubgraph() throws Exception
3162 {
3163 FragmentSpace fs = prepare();
3164 DGraph graph = makeTestGraphD(fs);
3165 DGraph graphOriginal = makeTestGraphD(fs);
3166
3167 // This takes all graph
3168 DGraph subGraph = graph.extractSubgraph(
3169 graph.getVertexAtPosition(0));
3170 assertTrue(subGraph.isIsomorphicTo(graph), "complete subgraph");
3171 assertTrue(graph.isIsomorphicTo(graphOriginal),
3172 "Original stays the same");
3173
3174 // This takes a subgraph with a ring
3175 DGraph subGraph1 = graph.extractSubgraph(
3176 graph.getVertexAtPosition(1));
3177 DGraph expected1 = makeTestGraphDSub1(fs);
3178
3179 assertTrue(subGraph1.isIsomorphicTo(expected1), "Subgraph1");
3180 assertEquals(0,subGraph1.getSymmetricSetCount(),
3181 "SymmetricSets in subGraph1");
3182 assertEquals(1,subGraph1.getRingCount(),"Rings in subGraph1");
3183 assertTrue(graph.isIsomorphicTo(graphOriginal),
3184 "Original stays the same");
3185
3186 // This takes a subgraph with symmetric set, but no rings
3187 DGraph subGraph2 = graph.extractSubgraph(
3188 graph.getVertexAtPosition(10));
3189 DGraph expected2 = makeTestGraphDSub2(fs);
3190
3191 assertTrue(subGraph2.isIsomorphicTo(expected2), "Subgraph2");
3192 assertEquals(1,subGraph2.getSymmetricSetCount(),
3193 "SymmetricSets in subGraph2");
3194 assertEquals(0,subGraph2.getRingCount(),"Rings in subGraph2");
3195 assertTrue(graph.isIsomorphicTo(graphOriginal),
3196 "Original stays the same");
3197 }
3198
3199//-----------------------------------------------------------------------------
3200
3201 @Test
3202 public void testExtractSubgraphFromCollection() throws Exception
3203 {
3204 FragmentSpace fs = prepare();
3205 DGraph graph = makeTestGraphD(fs);
3206
3207 Set<Vertex> targetVertexes = new HashSet<>();
3208 targetVertexes.add(graph.getVertexAtPosition(1));
3209 targetVertexes.add(graph.getVertexAtPosition(3));
3210
3211 DGraph subGraph = graph.extractSubgraph(targetVertexes);
3212
3213 assertEquals(targetVertexes.size(), subGraph.getVertexCount());
3214 for (Vertex vInTarget : targetVertexes)
3215 {
3216 assertNotNull(subGraph.getVertexWithId(vInTarget.getVertexId()));
3217 }
3218
3219 Set<Edge> connectionToSubgraph = new HashSet<Edge>();
3220 Set<Edge> connectionFromSubgraph = new HashSet<Edge>();
3221 subGraph = graph.extractSubgraph(targetVertexes,
3222 connectionToSubgraph, connectionFromSubgraph);
3223
3224 assertEquals(1, connectionToSubgraph.size());
3225 assertEquals(3, connectionFromSubgraph.size());
3226
3227 // NB: the subgraph contains clones, but the lists of edges contain
3228 // references to the original graph
3229
3230 boolean found0 = false;
3231 for (Edge e : connectionToSubgraph)
3232 {
3233 Vertex inResults = e.getSrcAP().getOwner();
3234 if (graph.getVertexAtPosition(0) == inResults)
3235 found0 = true;
3236 }
3237 assertTrue(found0);
3238
3239 boolean found2 = false;
3240 boolean found4 = false;
3241 boolean found6 = false;
3242 for (Edge e : connectionFromSubgraph)
3243 {
3244 Vertex inResults = e.getTrgAP().getOwner();
3245 if (graph.getVertexAtPosition(2) == inResults)
3246 found2 = true;
3247 if (graph.getVertexAtPosition(4) == inResults)
3248 found4 = true;
3249 if (graph.getVertexAtPosition(6) == inResults)
3250 found6 = true;
3251 }
3252 assertTrue(found2);
3253 assertTrue(found4);
3254 assertTrue(found6);
3255 }
3256
3257//-----------------------------------------------------------------------------
3258
3259 @Test
3260 public void testFindVertex() throws Exception
3261 {
3262 DGraph g = makeTestGraphA2();
3263
3264 List<VertexQuery> allQueries = new ArrayList<VertexQuery>();
3265 List<List<Vertex>> allExpected =
3266 new ArrayList<List<Vertex>>();
3267
3268 VertexQuery q0 = new VertexQuery();
3269 List<Vertex> e0 = new ArrayList<Vertex>();
3270 e0.addAll(g.getVertexList());
3271 allQueries.add(q0);
3272 allExpected.add(e0);
3273
3274 VertexQuery q1 = new VertexQuery(
3276 null, null, null, null, null, null, null);
3277 List<Vertex> e1 = new ArrayList<Vertex>();
3278 e1.add(g.getVertexAtPosition(5));
3279 allQueries.add(q1);
3280 allExpected.add(e1);
3281
3282 VertexQuery q2 = new VertexQuery(
3284 null, null, null, null, null, null, null);
3285 List<Vertex> e2 = new ArrayList<Vertex>();
3286 e2.add(g.getVertexAtPosition(2));
3287 allQueries.add(q2);
3288 allExpected.add(e2);
3289
3291 null, null, null, null, null, null);
3292 List<Vertex> e3 = new ArrayList<Vertex>();
3293 e3.add(g.getVertexAtPosition(4));
3294 e3.add(g.getVertexAtPosition(5));
3295 e3.add(g.getVertexAtPosition(6));
3296 allQueries.add(q3);
3297 allExpected.add(e3);
3298
3299 VertexQuery q4 = new VertexQuery(null, null, BBType.CAP,
3300 null, null, null, null, null);
3301 List<Vertex> e4 = new ArrayList<Vertex>();
3302 e4.add(g.getVertexAtPosition(2));
3303 e4.add(g.getVertexAtPosition(3));
3304 allQueries.add(q4);
3305 allExpected.add(e4);
3306
3307 VertexQuery q5 = new VertexQuery(null, null, null, 2,
3308 null, null, null, null);
3309 List<Vertex> e5 = new ArrayList<Vertex>();
3310 e5.add(g.getVertexAtPosition(2));
3311 allQueries.add(q5);
3312 allExpected.add(e5);
3313
3314 VertexQuery q6 = new VertexQuery(null, null, null, null, 1,
3315 null, null, null);
3316 List<Vertex> e6 = new ArrayList<Vertex>();
3317 e6.add(g.getVertexAtPosition(3));
3318 e6.add(g.getVertexAtPosition(5));
3319 allQueries.add(q6);
3320 allExpected.add(e6);
3321
3322 //
3323 // From here: test filters acting on incoming edge
3324 //
3325
3326 EdgeQuery eq7 = new EdgeQuery();
3327 VertexQuery q7 = new VertexQuery(null, null, null, null, null,
3328 null, eq7, eq7);
3329 List<Vertex> e7 = new ArrayList<Vertex>();
3330 e7.add(g.getVertexAtPosition(1));
3331 e7.add(g.getVertexAtPosition(6));
3332 allQueries.add(q7);
3333 allExpected.add(e7);
3334
3335 EdgeQuery eq8 = new EdgeQuery(
3336 new VertexQuery(g.getVertexAtPosition(1).getVertexId(), null, null, null, null, null, null, null),
3337 null, null, null, null);
3338 VertexQuery q8 = new VertexQuery(null, null, null, null, null, null,
3339 eq8, null);
3340 List<Vertex> e8 = new ArrayList<Vertex>();
3341 e8.add(g.getVertexAtPosition(3));
3342 allQueries.add(q8);
3343 allExpected.add(e8);
3344
3345 EdgeQuery eq9 = new EdgeQuery(null,
3346 new VertexQuery(g.getVertexAtPosition(5).getVertexId(), null, null, null, null, null, null, null),
3347 null, null, null);
3348 VertexQuery q9 = new VertexQuery(null, null, null, null, null, null,
3349 eq9, null);
3350 List<Vertex> e9 = new ArrayList<Vertex>();
3351 e9.add(g.getVertexAtPosition(5));
3352 allQueries.add(q9);
3353 allExpected.add(e9); // trg vertex id is ignored on incoming edges
3354
3355 EdgeQuery eq10 = new EdgeQuery(null, null,
3356 new AttachmentPointQuery(null, 1, null, null, null, null),
3357 null, null);
3358 VertexQuery q10 = new VertexQuery(null, null, null, null, null,
3359 null, eq10, null);
3360 List<Vertex> e10 = new ArrayList<Vertex>();
3361 e10.add(g.getVertexAtPosition(2));
3362 e10.add(g.getVertexAtPosition(3));
3363 allQueries.add(q10);
3364 allExpected.add(e10);
3365
3366 EdgeQuery eq11 = new EdgeQuery(null, null, null,
3367 new AttachmentPointQuery(null, 0, null, null, null, null),
3368 null);
3369 VertexQuery q11 = new VertexQuery(null, null, null, null, null,
3370 null, eq11, null);
3371 List<Vertex> e11 = new ArrayList<Vertex>();
3372 e11.add(g.getVertexAtPosition(1));
3373 e11.add(g.getVertexAtPosition(2));
3374 e11.add(g.getVertexAtPosition(3));
3375 e11.add(g.getVertexAtPosition(4));
3376 e11.add(g.getVertexAtPosition(5));
3377 allQueries.add(q11);
3378 allExpected.add(e11);
3379
3380 EdgeQuery eq12 = new EdgeQuery(null, null, null, null, BondType.TRIPLE);
3381 VertexQuery q12 = new VertexQuery(null, null, null, null, null,null,
3382 eq12, null);
3383 List<Vertex> e12 = new ArrayList<Vertex>();
3384 e12.add(g.getVertexAtPosition(1));
3385 e12.add(g.getVertexAtPosition(5));
3386 allQueries.add(q12);
3387 allExpected.add(e12);
3388
3389 EdgeQuery eq13 = new EdgeQuery(null, null,
3390 new AttachmentPointQuery(null, null, APClass.make(b,1), null, null, null),
3391 null, null);
3392 VertexQuery q13 = new VertexQuery(null, null, null, null, null, null,
3393 eq13, null);
3394 List<Vertex> e13 = new ArrayList<Vertex>();
3395 e13.add(g.getVertexAtPosition(2));
3396 e13.add(g.getVertexAtPosition(3));
3397 e13.add(g.getVertexAtPosition(6));
3398 allQueries.add(q13);
3399 allExpected.add(e13);
3400
3401 EdgeQuery eq14 = new EdgeQuery(null, null, null,
3402 new AttachmentPointQuery(null, null, APClass.make(c,1), null, null, null),
3403 null);
3404 VertexQuery q14 = new VertexQuery(null, null, null, null, null, null,
3405 eq14, null);
3406 List<Vertex> e14 = new ArrayList<Vertex>();
3407 e14.add(g.getVertexAtPosition(2));
3408 e14.add(g.getVertexAtPosition(3));
3409 allQueries.add(q14);
3410 allExpected.add(e14);
3411
3412 //
3413 // From here: test filters acting on outgoing edge
3414 //
3415
3416 EdgeQuery eq15 = new EdgeQuery(
3417 new VertexQuery(g.getVertexAtPosition(1).getVertexId(), null, null, null, null, null, null, null),
3418 null, null, null, null);
3419 VertexQuery q15 = new VertexQuery(null, null, null, null, null, null, null,
3420 eq15);
3421 List<Vertex> e15 = new ArrayList<Vertex>();
3422 e15.add(g.getVertexAtPosition(1));
3423 allQueries.add(q15);
3424 allExpected.add(e15);
3425
3426 EdgeQuery eq16 = new EdgeQuery(null,
3427 new VertexQuery(g.getVertexAtPosition(3).getVertexId(), null, null, null, null, null, null, null),
3428 null, null, null);
3429 VertexQuery q16 = new VertexQuery(null, null, null, null, null, null, null,
3430 eq16);
3431 List<Vertex> e16 = new ArrayList<Vertex>();
3432 e16.add(g.getVertexAtPosition(1));
3433 allQueries.add(q16);
3434 allExpected.add(e16);
3435
3436 EdgeQuery eq17 = new EdgeQuery(null, null,
3437 new AttachmentPointQuery(null, 1, null, null, null, null),
3438 null, null);
3439 VertexQuery q17 = new VertexQuery(null, null, null, null, null, null, null,
3440 eq17);
3441 List<Vertex> e17 = new ArrayList<Vertex>();
3442 e17.add(g.getVertexAtPosition(0));
3443 e17.add(g.getVertexAtPosition(1));
3444 allQueries.add(q17);
3445 allExpected.add(e17);
3446
3447 EdgeQuery eq18 = new EdgeQuery(null, null, null,
3448 new AttachmentPointQuery(null, 0, null, null, null, null),
3449 null);
3450 VertexQuery q18 = new VertexQuery(null, null, null, null, null, null, null,
3451 eq18);
3452 List<Vertex> e18 = new ArrayList<Vertex>();
3453 e18.add(g.getVertexAtPosition(0));
3454 e18.add(g.getVertexAtPosition(1));
3455 e18.add(g.getVertexAtPosition(6));
3456 allQueries.add(q18);
3457 allExpected.add(e18);
3458
3459 EdgeQuery eq19 = new EdgeQuery(null, null, null, null,
3461 VertexQuery q19 = new VertexQuery(null, null, null, null, null, null, null,
3462 eq19);
3463 List<Vertex> e19 = new ArrayList<Vertex>();
3464 e19.add(g.getVertexAtPosition(0));
3465 e19.add(g.getVertexAtPosition(6));
3466 allQueries.add(q19);
3467 allExpected.add(e19);
3468
3469 EdgeQuery eq20 = new EdgeQuery(null, null,
3470 new AttachmentPointQuery(null, null, APClass.make(b,1), null, null, null),
3471 null, null);
3472 VertexQuery q20 = new VertexQuery(null, null, null, null, null, null, null,
3473 eq20);
3474 List<Vertex> e20 = new ArrayList<Vertex>();
3475 e20.add(g.getVertexAtPosition(0));
3476 e20.add(g.getVertexAtPosition(1));
3477 allQueries.add(q20);
3478 allExpected.add(e20);
3479
3480 EdgeQuery eq21 = new EdgeQuery(null, null, null,
3481 new AttachmentPointQuery(null, null, APClass.make(d,0), null, null, null),
3482 null);
3483 VertexQuery q21 = new VertexQuery(null, null, null, null, null, null, null,
3484 eq21);
3485 List<Vertex> e21 = new ArrayList<Vertex>();
3486 e21.add(g.getVertexAtPosition(0));
3487 e21.add(g.getVertexAtPosition(6));
3488 allQueries.add(q21);
3489 allExpected.add(e21);
3490
3491 //
3492 // From here: test combinations
3493 //
3494
3495 EdgeQuery eq22in = new EdgeQuery(null, null, null,
3496 new AttachmentPointQuery(null, 0, null, null, null, null),
3497 null);
3498 EdgeQuery eq22out = new EdgeQuery(null, null,
3499 new AttachmentPointQuery(null, 1, null, null, null, null),
3500 null, null);
3501 VertexQuery q22 = new VertexQuery(null, null, null, null, null, null,
3502 eq22in, eq22out);
3503 List<Vertex> e22 = new ArrayList<Vertex>();
3504 e22.add(g.getVertexAtPosition(1));
3505 allQueries.add(q22);
3506 allExpected.add(e22);
3507
3508 EdgeQuery eq23 = new EdgeQuery(null, null, null, null, BondType.TRIPLE);
3510 null, null, null, null, eq23, null);
3511 List<Vertex> e23 = new ArrayList<Vertex>();
3512 e23.add(g.getVertexAtPosition(1));
3513 allQueries.add(q23);
3514 allExpected.add(e23);
3515
3516 for (int i=0; i<allQueries.size(); i++)
3517 {
3518 List<Vertex> matches = g.findVertices(allQueries.get(i),
3519 Logger.getLogger("DummyLogger"));
3520 assertEquals(allExpected.get(i).size(),matches.size(),
3521 "Different number of matched vertexes ("+i+")");
3522 assertTrue(allExpected.get(i).containsAll(matches),
3523 "Inconsistent matches ("+i+")");
3524 }
3525 }
3526
3527//------------------------------------------------------------------------------
3528
3529
3530 @Test
3531 public void testSymmetricSetLabels() throws Exception
3532 {
3533 FragmentSpace fs = prepare();
3534 DGraph g = makeTestGraphB(fs);
3535
3537
3538 Map<Object,Integer> countsPerLabel = new HashMap<Object,Integer>();
3539 for (Vertex v : g.getVertexList())
3540 {
3541 Object label = v.getProperty(DENOPTIMConstants.VRTSYMMSETID);
3542 if (countsPerLabel.containsKey(label))
3543 countsPerLabel.put(label,countsPerLabel.get(label)+1);
3544 else
3545 countsPerLabel.put(label,1);
3546 }
3547
3548 assertEquals(1,countsPerLabel.get(g.getVertexAtPosition(0).getProperty(
3550 assertEquals(2,countsPerLabel.get(g.getVertexAtPosition(1).getProperty(
3552 assertEquals(4,countsPerLabel.get(g.getVertexAtPosition(2).getProperty(
3554 assertEquals(4,countsPerLabel.get(g.getVertexAtPosition(3).getProperty(
3556 assertEquals(1,countsPerLabel.get(g.getVertexAtPosition(4).getProperty(
3558 assertEquals(1,countsPerLabel.get(g.getVertexAtPosition(8).getProperty(
3560 }
3561
3562//------------------------------------------------------------------------------
3563
3564 @Test
3565 public void testConvertSymmetricLabelsToSymmetricSets() throws Exception
3566 {
3567 FragmentSpace fs = prepare();
3568 DGraph g = makeTestGraphE(fs);
3570 "1234-ABC");
3572 "1234-ABC");
3574 "1234-ABC");
3575
3577
3578 assertEquals(2,g.getSymmetricSetCount(),"number of sets");
3579 boolean foundA = false;
3580 boolean foundB = false;
3581 Iterator<SymmetricVertexes> iter = g.getSymSetsIterator();
3582 while (iter.hasNext())
3583 {
3584 SymmetricVertexes ss = iter.next();
3585 if (ss.size() == 2)
3586 foundA = true;
3587 if (ss.size() == 4)
3588 foundB = true;
3589 }
3590 assertTrue(foundA,"Found 2-membered set");
3591 assertTrue(foundB,"Found 4-membered set");
3592
3593 DGraph g2 = makeTestGraphE(fs);
3595 "1234-ABC");
3597 "1234-ABC");
3598
3600
3601 assertEquals(3,g2.getSymmetricSetCount(),"number of sets");
3602 Iterator<SymmetricVertexes> iter2 = g2.getSymSetsIterator();
3603 while (iter2.hasNext())
3604 {
3605 SymmetricVertexes ss = iter2.next();
3606 assertEquals(2,ss.size(),"side of each symmetric sets.");
3607 }
3608 }
3609
3610//------------------------------------------------------------------------------
3611
3612 @Test
3613 public void testGetSymmetricSubGraphs() throws Exception
3614 {
3615 FragmentSpace fs = prepare();
3616 DGraph g = makeTestGraphF(fs);
3617 List<Vertex> sg = new ArrayList<Vertex>();
3618 sg.add(g.getVertexAtPosition(1));
3619 sg.add(g.getVertexAtPosition(3));
3620
3621 List<List<Vertex>> symSubGraphs = g.getSymmetricSubGraphs(sg);
3622
3623 assertEquals(2,symSubGraphs.size(),"Number of subgraphs");
3624 assertEquals(g.getVertexAtPosition(1).getVertexId(),
3625 symSubGraphs.get(0).get(0).getVertexId());
3626 assertEquals(g.getVertexAtPosition(3).getVertexId(),
3627 symSubGraphs.get(0).get(1).getVertexId());
3628 assertEquals(g.getVertexAtPosition(2).getVertexId(),
3629 symSubGraphs.get(1).get(0).getVertexId());
3630 assertEquals(g.getVertexAtPosition(4).getVertexId(),
3631 symSubGraphs.get(1).get(1).getVertexId());
3632
3633 DGraph g2 = makeTestGraphK(fs);
3634 List<Vertex> sg2 = new ArrayList<Vertex>();
3635 sg2.add(g2.getVertexAtPosition(1));
3636 sg2.add(g2.getVertexAtPosition(4));
3637 sg2.add(g2.getVertexAtPosition(12));
3638
3639 /*
3640 * In the second part we check that capping groups are not included.
3641 */
3642
3643 boolean exceptionWhenCappingIsIncluded = false;
3644 try
3645 {
3646 symSubGraphs = g2.getSymmetricSubGraphs(sg2);
3647 } catch (DENOPTIMException e)
3648 {
3649 if (e.getMessage().contains("Capping groups must not be part of "
3650 + "symmetric subgraphs"))
3651 exceptionWhenCappingIsIncluded = true;
3652 }
3653 assertTrue(exceptionWhenCappingIsIncluded,
3654 "Capping groups trigger exception");
3655
3656 sg2 = new ArrayList<Vertex>();
3657 sg2.add(g2.getVertexAtPosition(1));
3658 sg2.add(g2.getVertexAtPosition(4));
3659 symSubGraphs = g2.getSymmetricSubGraphs(sg2);
3660 assertEquals(2,symSubGraphs.size());
3661 assertEquals(2,symSubGraphs.get(0).size());
3662 assertEquals(2,symSubGraphs.get(1).size());
3663 }
3664
3665//------------------------------------------------------------------------------
3666
3667 @Test
3668 public void testGetChildrenTree() throws Exception
3669 {
3670 FragmentSpace fs = prepare();
3671 DGraph g = makeTestGraphD(fs);
3672
3673 List<Vertex> childTree = new ArrayList<Vertex>();
3674 g.getChildrenTree(g.getVertexAtPosition(1), childTree);
3675 assertEquals(6,childTree.size());
3676 assertTrue(childTree.contains(g.getVertexAtPosition(2)));
3677 assertTrue(childTree.contains(g.getVertexAtPosition(3)));
3678 assertTrue(childTree.contains(g.getVertexAtPosition(4)));
3679 assertTrue(childTree.contains(g.getVertexAtPosition(5)));
3680 assertTrue(childTree.contains(g.getVertexAtPosition(6)));
3681 assertTrue(childTree.contains(g.getVertexAtPosition(7)));
3682
3683 childTree = new ArrayList<Vertex>();
3684 g.getChildrenTree(g.getVertexAtPosition(9), childTree, 1, false);
3685 assertEquals(1,childTree.size());
3686 assertTrue(childTree.contains(g.getVertexAtPosition(10)));
3687
3688 childTree = new ArrayList<Vertex>();
3689 g.getChildrenTree(g.getVertexAtPosition(9), childTree, 2, false);
3690 assertEquals(4,childTree.size());
3691 assertTrue(childTree.contains(g.getVertexAtPosition(10)));
3692 assertTrue(childTree.contains(g.getVertexAtPosition(11)));
3693 assertTrue(childTree.contains(g.getVertexAtPosition(12)));
3694 assertTrue(childTree.contains(g.getVertexAtPosition(13)));
3695
3696 childTree = new ArrayList<Vertex>();
3697 g.getChildrenTree(g.getVertexAtPosition(1), childTree, Integer.MAX_VALUE,
3698 true);
3699 assertEquals(3,childTree.size());
3700 assertTrue(childTree.contains(g.getVertexAtPosition(2)));
3701 assertTrue(childTree.contains(g.getVertexAtPosition(3)));
3702 assertTrue(childTree.contains(g.getVertexAtPosition(4)));
3703 }
3704
3705//------------------------------------------------------------------------------
3706
3707 @Test
3708 public void testGetChildrenTreeWithBranchIdentifier() throws Exception
3709 {
3710 FragmentSpace fs = prepare();
3711 DGraph g = makeTestGraphD(fs);
3712
3713 assertNull(g.getBranchIdOfVertexAtPosition(0));
3714 assertNull(g.getBranchIdOfVertexAtPosition(1));
3715 assertNull(g.getBranchIdOfVertexAtPosition(3));
3716
3717 List<Vertex> childTree = new ArrayList<Vertex>();
3718 g.getChildrenTree(g.getVertexAtPosition(0), childTree,
3719 new AtomicInteger(0), new ArrayList<Integer>());
3720
3721 assertEquals(g.getBranchIdOfVertexAtPosition(3),
3723 assertEquals(g.getBranchIdOfVertexAtPosition(2),
3725 assertEquals(g.getBranchIdOfVertexAtPosition(3),
3727 assertEquals(g.getBranchIdOfVertexAtPosition(4),
3729 assertNotEquals(g.getBranchIdOfVertexAtPosition(2),
3731 assertNotEquals(g.getBranchIdOfVertexAtPosition(2),
3733 assertNotEquals(g.getBranchIdOfVertexAtPosition(3),
3735
3736 assertTrue(g.directedPathExists(g.getVertexAtPosition(1),
3737 g.getVertexAtPosition(5)));
3738 assertTrue(g.directedPathExists(g.getVertexAtPosition(9),
3739 g.getVertexAtPosition(13)));
3740 assertFalse(g.directedPathExists(g.getVertexAtPosition(8),
3741 g.getVertexAtPosition(9)));
3742 assertFalse(g.directedPathExists(g.getVertexAtPosition(9),
3743 g.getVertexAtPosition(8)));
3744 assertFalse(g.directedPathExists(g.getVertexAtPosition(5),
3745 g.getVertexAtPosition(1)));
3746 assertFalse(g.directedPathExists(g.getVertexAtPosition(13),
3747 g.getVertexAtPosition(9)));
3748 }
3749
3750//------------------------------------------------------------------------------
3751
3752 @Test
3753 public void testGetInterfaceAPs() throws Exception
3754 {
3755 FragmentSpace fs = prepare();
3756 DGraph g = makeTestGraphI(fs);
3757
3758 List<Vertex> subGraph = new ArrayList<Vertex>();
3759 subGraph.add(g.getVertexAtPosition(0));
3760 subGraph.add(g.getVertexAtPosition(1));
3761
3762 List<AttachmentPoint> expected = new ArrayList<AttachmentPoint>();
3763 expected.add(g.getVertexAtPosition(0).getAP(1));
3764 expected.add(g.getVertexAtPosition(1).getAP(1));
3765
3766 List<AttachmentPoint> interfaceAPs = g.getInterfaceAPs(subGraph);
3767
3768 assertEquals(expected,interfaceAPs);
3769
3770 DGraph innerGraph = ((Template) g.getVertexAtPosition(0))
3771 .getInnerGraph();
3772
3773 subGraph = new ArrayList<Vertex>();
3774 subGraph.add(innerGraph.getVertexAtPosition(0));
3775 subGraph.add(innerGraph.getVertexAtPosition(1));
3776
3777 expected = new ArrayList<AttachmentPoint>();
3778 expected.add(innerGraph.getVertexAtPosition(0).getAP(0));
3779 expected.add(innerGraph.getVertexAtPosition(0).getAP(1));
3780 expected.add(innerGraph.getVertexAtPosition(0).getAP(4));
3781 expected.add(innerGraph.getVertexAtPosition(1).getAP(1));
3782
3783 interfaceAPs = innerGraph.getInterfaceAPs(subGraph);
3784
3785 assertEquals(expected,interfaceAPs);
3786 }
3787
3788//------------------------------------------------------------------------------
3789
3790 @Test
3791 public void testGetSubgraphAPs() throws Exception
3792 {
3793 FragmentSpace fs = prepare();
3794 DGraph g = makeTestGraphI(fs);
3795
3796 DGraph innerGraph = ((Template) g.getVertexAtPosition(0))
3797 .getInnerGraph();
3798
3799 List<Vertex> subGraph = new ArrayList<Vertex>();
3800 subGraph.add(innerGraph.getVertexAtPosition(0));
3801 subGraph.add(innerGraph.getVertexAtPosition(1));
3802
3803 List<AttachmentPoint>expected = new ArrayList<AttachmentPoint>();
3804 expected.add(innerGraph.getVertexAtPosition(0).getAP(0));
3805 expected.add(innerGraph.getVertexAtPosition(0).getAP(1));
3806 expected.add(innerGraph.getVertexAtPosition(0).getAP(2));
3807 expected.add(innerGraph.getVertexAtPosition(0).getAP(4));
3808 expected.add(innerGraph.getVertexAtPosition(1).getAP(1));
3809
3810 List<AttachmentPoint> interfaceAPs = innerGraph.getSubgraphAPs(
3811 subGraph);
3812
3813 assertEquals(expected,interfaceAPs);
3814 }
3815
3816//------------------------------------------------------------------------------
3817
3818 public DGraph[] makeIsostructuralGraphs() throws Exception
3819 {
3820 String unqProp = "UNQPROP";
3821 EmptyVertex rcvA1 = new EmptyVertex(11002);
3822 rcvA1.addAP(APCA);
3823 rcvA1.setAsRCV(true);
3824 EmptyVertex rcvA2 = new EmptyVertex(11003);
3825 rcvA2.addAP(APCA);
3826 rcvA2.setAsRCV(true);
3827 EmptyVertex vA0 = new EmptyVertex(10000);
3828 vA0.addAP(APCA);
3829 vA0.addAP(APCA);
3830 vA0.addAP(APCB);
3831 vA0.setUniquefyingProperty(unqProp);
3832 vA0.setProperty(unqProp, 111);
3833 EmptyVertex vA1 = new EmptyVertex(10001);
3834 vA1.addAP(APCA);
3835 vA1.addAP(APCA);
3836 vA1.setUniquefyingProperty(unqProp);
3837 vA1.setProperty(unqProp, 222);
3838 EmptyVertex vA2= new EmptyVertex(10002);
3839 vA2.addAP(APCA);
3840 vA2.addAP(APCA);
3841 EmptyVertex vA3 = new EmptyVertex(10003);
3842 vA3.addAP(APCA);
3843 vA3.addAP(APCA);
3844 vA3.addAP(APCB);
3845 DGraph g3A = new DGraph();
3846 g3A.addVertex(vA0);
3847 g3A.appendVertexOnAP(vA0.getAP(0), vA1.getAP(0));
3848 g3A.appendVertexOnAP(vA1.getAP(1), vA2.getAP(0));
3849 g3A.appendVertexOnAP(vA2.getAP(1), vA3.getAP(0));
3850 g3A.appendVertexOnAP(vA3.getAP(1), rcvA1.getAP(0));
3851 g3A.appendVertexOnAP(vA0.getAP(1), rcvA2.getAP(0));
3852 g3A.addRing(rcvA1, rcvA2);
3853
3854 // now build second
3855 EmptyVertex rcvB1 = new EmptyVertex(21002);
3856 rcvB1.addAP(APCA);
3857 rcvB1.setAsRCV(true);
3858 EmptyVertex rcvB2 = new EmptyVertex(21003);
3859 rcvB2.addAP(APCA);
3860 rcvB2.setAsRCV(true);
3861 EmptyVertex vB0 = new EmptyVertex(20000);
3862 vB0.addAP(APCA);
3863 vB0.addAP(APCA);
3864 vB0.addAP(APCB);
3865 vA0.setUniquefyingProperty(unqProp);
3866 vA0.setProperty(unqProp, 333);
3867 EmptyVertex vB1 = new EmptyVertex(20001);
3868 vB1.addAP(APCA);
3869 vB1.addAP(APCA);
3870 vA0.setUniquefyingProperty(unqProp);
3871 vA0.setProperty(unqProp, 444);
3872 EmptyVertex vB2= new EmptyVertex(20002);
3873 vB2.addAP(APCA);
3874 vB2.addAP(APCA);
3875 EmptyVertex vB3 = new EmptyVertex(20003);
3876 vB3.addAP(APCA);
3877 vB3.addAP(APCA);
3878 vB3.addAP(APCB);
3879 DGraph g3B = new DGraph();
3880 g3B.addVertex(vB1);
3881 g3B.appendVertexOnAP(vB1.getAP(1), vB2.getAP(0));
3882 g3B.appendVertexOnAP(vB2.getAP(1), vB3.getAP(0));
3883 g3B.appendVertexOnAP(vB3.getAP(1), vB0.getAP(1));
3884 g3B.appendVertexOnAP(vB0.getAP(0), rcvB1.getAP(0));
3885 g3B.appendVertexOnAP(vB1.getAP(0), rcvB2.getAP(0));
3886 g3B.addRing(rcvB1, rcvB2);
3887
3888 DGraph[] pair = new DGraph[2];
3889 pair[0] = g3A;
3890 pair[1] = g3B;
3891 return pair;
3892 }
3893
3894//------------------------------------------------------------------------------
3895
3896 @Test
3897 public void testIsIsostructuralTo() throws Exception
3898 {
3899 FragmentSpace fs = prepare();
3900
3901 DGraph gAempty = new DGraph();
3902 DGraph gBempty = new DGraph();
3903
3904 assertTrue(gAempty.isIsostructuralTo(gAempty));
3905 assertTrue(gAempty.isIsostructuralTo(gBempty));
3906
3907 DGraph g01 = makeTestGraph0(fs);
3908 DGraph g02 = makeTestGraph0(fs);
3909 assertTrue(g01.isIsostructuralTo(g02));
3910 assertTrue(g01.isIsostructuralTo(g01.clone()));
3911
3912 DGraph g11 = makeTestGraph1(fs);
3913 DGraph g12 = makeTestGraph1(fs);
3914 assertTrue(g11.isIsostructuralTo(g12));
3915 assertFalse(g11.isIsostructuralTo(g01));
3916 assertFalse(g11.isIsostructuralTo(g02));
3917 assertTrue(g11.isIsostructuralTo(g11.clone()));
3918
3919 DGraph gD1 = makeTestGraphD(fs);
3920 DGraph gD2 = makeTestGraphD(fs);
3921 assertTrue(gD1.isIsostructuralTo(gD2));
3922 assertFalse(gD1.isIsostructuralTo(gAempty));
3923 assertFalse(gAempty.isIsostructuralTo(gD1));
3924
3925 DGraph gB1 = makeTestGraphB(fs);
3926 assertFalse(gD1.isIsostructuralTo(gB1));
3927
3928 DGraph gB2 = gB1.clone();
3929 assertTrue(gB1.isIsostructuralTo(gB2));
3930
3931 // Up to here we checked consistency with isIsomorficTo().
3932 // Now, make a pair of graphs that are not isomorphic by replacing one
3933 // of the vertexes with a new vertex that does not satisfy sameAs()
3934 DGraph g1 = makeTestGraphDSub1(fs);
3935 DGraph g2 = makeTestGraphDSub1(fs);
3936
3937 EmptyVertex v1 = new EmptyVertex(100001);
3938 v1.addAP(APCD);
3939 v1.addAP(APCC);
3940 v1.setUniquefyingProperty("blabla123");
3941 v1.setProperty("blabla123", 123);
3942
3943 DGraph incomingSubGraph = new DGraph();
3944 incomingSubGraph.addVertex(v1);
3945
3946 APMapping apMap = new APMapping();
3947 apMap.put(g2.getVertexAtPosition(1).getAP(0), v1.getAP(1));
3948 apMap.put(g2.getVertexAtPosition(1).getAP(1), v1.getAP(0));
3949
3950 DGraph.replaceSingleSubGraph(apMap, fs);
3951
3952 assertFalse(g1.isIsomorphicTo(g2));
3953 assertTrue(g1.isIsostructuralTo(g2));
3954
3955 // Change structure by adding a bifurcation
3956 EmptyVertex v2 = new EmptyVertex(1000002);
3957 v2.addAP(APCD);
3958 v2.addAP(APCC);
3959 v2.addAP(APCC);
3960 v2.setUniquefyingProperty("blabla456");
3961 v2.setProperty("blabla456", 456);
3962 incomingSubGraph = new DGraph();
3963 incomingSubGraph.addVertex(v2);
3964
3965 apMap = new APMapping();
3966 apMap.put(g2.getVertexAtPosition(2).getAP(0), v2.getAP(1));
3967 apMap.put(g2.getVertexAtPosition(2).getAP(1), v2.getAP(0));
3968
3969 DGraph.replaceSingleSubGraph(apMap, fs);
3970
3971 assertFalse(g1.isIsomorphicTo(g2));
3972 assertFalse(g1.isIsostructuralTo(g2));
3973
3974 // Change graph retaining structure: move ring closure along ring.
3976 DGraph gisA = pair[0];
3977 DGraph gisB = pair[1];
3978 assertFalse(gisA.isIsomorphicTo(gisB));
3979 assertTrue(gisA.isIsostructuralTo(gisB));
3980 }
3981
3982//------------------------------------------------------------------------------
3983
3984 @Test
3985 public void testGetEdgesWithSrcOrTrg() throws Exception
3986 {
3987 FragmentSpace fs = prepare();
3988 DGraph graph = makeTestGraphF(fs);
3989 Vertex v = graph.getVertexAtPosition(5);
3990
3991 List<Edge> egdesFrom = graph.getEdgesWithSrc(v);
3992 assertEquals(2, egdesFrom.size());
3993 assertTrue(graph.getVertexAtPosition(6) ==
3994 egdesFrom.get(0).getTrgAP().getOwner());
3995 assertTrue(graph.getVertexAtPosition(7) ==
3996 egdesFrom.get(1).getTrgAP().getOwner());
3997
3998 List<Edge> egdesTo = graph.getEdgesWithTrg(v);
3999 assertEquals(1, egdesTo.size());
4000 assertTrue(graph.getVertexAtPosition(0) ==
4001 egdesTo.get(0).getSrcAP().getOwner());
4002 }
4003
4004//------------------------------------------------------------------------------
4005
4006 @Test
4007 public void testEmbedPatternsInTemplates() throws Exception
4008 {
4009 FragmentSpace fs = prepare();
4010 DGraph graph = makeTestGraphL(fs);
4011
4012 DGraph graphWithTmpls = graph.embedPatternsInTemplates(
4013 GraphPattern.RING, fs);
4014
4015 assertEquals(7, graphWithTmpls.getVertexCount());
4016 assertEquals(6, graphWithTmpls.getEdgeCount());
4017 assertEquals(0, graphWithTmpls.getRingCount());
4018 List<Vertex> templates = graphWithTmpls.getVertexList()
4019 .stream()
4020 .filter(v -> v instanceof Template)
4021 .collect(Collectors.toList());
4022 assertEquals(2, templates.size());
4023 assertEquals(1, templates.stream()
4024 .filter(t -> t.getBuildingBlockType() == BBType.SCAFFOLD)
4025 .count());
4026 assertEquals(1, templates.stream()
4027 .filter(t -> t.getBuildingBlockType() == BBType.FRAGMENT)
4028 .count());
4029 }
4030
4031//------------------------------------------------------------------------------
4032
4062 {
4063 EmptyVertex v0 = new EmptyVertex(0);
4064 v0.addAP(APCA);
4065 v0.addAP(APCB);
4066 v0.addAP(APCA);
4067 v0.addAP(APCB);
4069 Arrays.asList(v0.getAP(0), v0.getAP(2))));
4071 Arrays.asList(v0.getAP(1), v0.getAP(3))));
4073
4074 EmptyVertex v1 = new EmptyVertex(1);
4075 v1.addAP(APCB);
4076 v1.addAP(APCA);
4077 v1.addAP(APCB);
4078 v1.addAP(APCB);
4080 Arrays.asList(v1.getAP(0), v1.getAP(2), v1.getAP(3))));
4081
4082 EmptyVertex v2 = v1.clone();
4083 v2.setVertexId(2);
4084
4085 EmptyVertex v3 = new EmptyVertex(3);
4086 v3.addAP(APCB);
4087
4088 EmptyVertex v4 = v3.clone();
4089 EmptyVertex v5 = v3.clone();
4090 EmptyVertex v6 = v3.clone();
4091 EmptyVertex v7 = v3.clone();
4092 EmptyVertex v8 = v3.clone();
4093 EmptyVertex v9 = v3.clone();
4094 EmptyVertex v10 = v3.clone();
4095 v4.setVertexId(4);
4096 v5.setVertexId(5);
4097 v6.setVertexId(6);
4098 v7.setVertexId(7);
4099 v8.setVertexId(8);
4100 v9.setVertexId(9);
4101 v10.setVertexId(10);
4102
4103 DGraph g = new DGraph();
4104 g.addVertex(v0);
4105 g.appendVertexOnAP(v0.getAP(0), v1.getAP(1));
4106 g.appendVertexOnAP(v0.getAP(2), v2.getAP(1));
4107 g.appendVertexOnAP(v1.getAP(0), v3.getAP(0));
4108 g.appendVertexOnAP(v1.getAP(2), v4.getAP(0));
4109 g.appendVertexOnAP(v1.getAP(3), v5.getAP(0));
4110 g.appendVertexOnAP(v2.getAP(0), v6.getAP(0));
4111 g.appendVertexOnAP(v2.getAP(2), v7.getAP(0));
4112 g.appendVertexOnAP(v2.getAP(3), v8.getAP(0));
4113 g.appendVertexOnAP(v0.getAP(1), v9.getAP(0));
4114 g.appendVertexOnAP(v0.getAP(3), v10.getAP(0));
4115
4116 return g;
4117 }
4118
4119//------------------------------------------------------------------------------
4120
4150 {
4151 EmptyVertex v0 = new EmptyVertex(0);
4152 v0.addAP(APCB);
4153 v0.addAP(APCB);
4154 v0.addAP(APCB);
4155 v0.addAP(APCB);
4156 v0.addSymmetricAPSet(new SymmetricAPs(Arrays.asList(
4157 v0.getAP(0), v0.getAP(1), v0.getAP(2), v0.getAP(3))));
4158
4159 EmptyVertex v1 = v0.clone();
4160 EmptyVertex v2 = v0.clone();
4161 EmptyVertex v9 = v0.clone();
4162 v1.setVertexId(1);
4163 v2.setVertexId(2);
4164 v9.setVertexId(9);
4165
4170
4171 EmptyVertex v3 = new EmptyVertex(3);
4172 v3.addAP(APCB);
4173
4174 EmptyVertex v4 = v3.clone();
4175 EmptyVertex v5 = v3.clone();
4176 EmptyVertex v6 = v3.clone();
4177 EmptyVertex v7 = v3.clone();
4178 v4.setVertexId(4);
4179 v5.setVertexId(5);
4180 v6.setVertexId(6);
4181 v7.setVertexId(7);;
4182
4183 DGraph g = new DGraph();
4184 g.addVertex(v0);
4185 g.appendVertexOnAP(v0.getAP(0), v1.getAP(1));
4186 g.appendVertexOnAP(v0.getAP(2), v2.getAP(1));
4187 g.appendVertexOnAP(v1.getAP(0), v3.getAP(0));
4188 g.appendVertexOnAP(v1.getAP(2), v4.getAP(0));
4189 g.appendVertexOnAP(v1.getAP(3), v5.getAP(0));
4190 g.appendVertexOnAP(v2.getAP(0), v6.getAP(0));
4191 g.appendVertexOnAP(v2.getAP(2), v7.getAP(0));
4192 // Warning added here just to avoid messing the order of vertexes
4193 g.appendVertexOnAP(v0.getAP(1), v9.getAP(1));
4194
4195 return g;
4196 }
4197
4198//------------------------------------------------------------------------------
4199
4200 @Test
4201 public void testDetectSymVertexSets() throws Exception
4202 {
4203 prepare();
4204 DGraph graph = makeTestGraphM();
4205
4206 assertTrue(graph.detectSymVertexSets());
4207 assertEquals(3, graph.getSymmetricSetCount());
4208
4209 SymmetricVertexes symVrtxs = graph.getSymSetForVertex(
4210 graph.getVertexAtPosition(0));
4211 assertEquals(0, symVrtxs.size());
4212
4213 symVrtxs = graph.getSymSetForVertex(graph.getVertexAtPosition(1));
4214 assertEquals(2, symVrtxs.size());
4215 assertTrue(symVrtxs.contains(graph.getVertexAtPosition(1)));
4216 assertTrue(symVrtxs.contains(graph.getVertexAtPosition(2)));
4217
4218 symVrtxs = graph.getSymSetForVertex(graph.getVertexAtPosition(3));
4219 assertEquals(6, symVrtxs.size());
4220 assertTrue(symVrtxs.contains(graph.getVertexAtPosition(3)));
4221 assertTrue(symVrtxs.contains(graph.getVertexAtPosition(4)));
4222 assertTrue(symVrtxs.contains(graph.getVertexAtPosition(5)));
4223 assertTrue(symVrtxs.contains(graph.getVertexAtPosition(6)));
4224 assertTrue(symVrtxs.contains(graph.getVertexAtPosition(7)));
4225 assertTrue(symVrtxs.contains(graph.getVertexAtPosition(8)));
4226
4227 symVrtxs = graph.getSymSetForVertex(graph.getVertexAtPosition(9));
4228 assertEquals(2, symVrtxs.size());
4229 assertTrue(symVrtxs.contains(graph.getVertexAtPosition(9)));
4230 assertTrue(symVrtxs.contains(graph.getVertexAtPosition(10)));
4231 }
4232
4233//------------------------------------------------------------------------------
4234
4254 {
4255 DGraph graph = new DGraph();
4257 BBType.SCAFFOLD, fs);
4258 graph.addVertex(s2);
4260 BBType.FRAGMENT, fs);
4261 graph.addVertex(v4);
4263 BBType.FRAGMENT, fs);
4264 graph.addVertex(v3a);
4266 BBType.FRAGMENT, fs);
4267 graph.addVertex(v3b);
4269 BBType.FRAGMENT, fs);
4270 graph.addVertex(v7a);
4272 BBType.FRAGMENT, fs);
4273 graph.addVertex(v7b);
4275 BBType.FRAGMENT, fs);
4276 graph.addVertex(v5);
4277
4278 graph.addEdge(new Edge(s2.getAP(0), v4.getAP(0)));
4279 graph.addEdge(new Edge(s2.getAP(1), v3a.getAP(0)));
4280 graph.addEdge(new Edge(s2.getAP(2), v5.getAP(0)));
4281 graph.addEdge(new Edge(s2.getAP(3), v3b.getAP(0)));
4282 graph.addEdge(new Edge(v3a.getAP(1), v7a.getAP(0)));
4283 graph.addEdge(new Edge(v3b.getAP(1), v7b.getAP(0)));
4284
4285 graph.addRing(v7a, v7b);
4286
4287 // Not truly symmetric but flagged as symmetryc to verify symmetry is considered
4288 List<Vertex> symA = new ArrayList<Vertex>();
4289 symA.add(v3a);
4290 symA.add(v3b);
4292
4293 graph.renumberGraphVertices();
4294 return graph;
4295 }
4296
4297//------------------------------------------------------------------------------
4298
4319 {
4320 DGraph graph = new DGraph();
4322 BBType.SCAFFOLD, fs);
4323 graph.addVertex(s1);
4325 BBType.FRAGMENT, fs);
4326 graph.addVertex(v1);
4328 BBType.FRAGMENT, fs);
4329 graph.addVertex(v2a);
4331 BBType.FRAGMENT, fs);
4332 graph.addVertex(v2b);
4334 BBType.FRAGMENT, fs);
4335 graph.addVertex(v3a);
4337 BBType.FRAGMENT, fs);
4338 graph.addVertex(v3b);
4340 BBType.FRAGMENT, fs);
4341 graph.addVertex(v6);
4343 BBType.FRAGMENT, fs);
4344 graph.addVertex(v7a);
4346 BBType.FRAGMENT, fs);
4347 graph.addVertex(v7b);
4348
4349 graph.addEdge(new Edge(s1.getAP(0), v1.getAP(0)));
4350 graph.addEdge(new Edge(v1.getAP(1), v2a.getAP(0)));
4351 graph.addEdge(new Edge(v1.getAP(2), v3a.getAP(0)));
4352 graph.addEdge(new Edge(v1.getAP(3), v2b.getAP(0)));
4353 graph.addEdge(new Edge(v1.getAP(4), v7a.getAP(0)));
4354 graph.addEdge(new Edge(s1.getAP(1), v3b.getAP(1)));
4355 graph.addEdge(new Edge(v3b.getAP(0), v7b.getAP(0)));
4356 graph.addEdge(new Edge(s1.getAP(2), v6.getAP(1)));
4357
4358 graph.addRing(v7a, v7b);
4359
4360 // Not truly symmetric but flagged as symmetryc to verify symmetry is considered
4361 List<Vertex> symA = new ArrayList<Vertex>();
4362 symA.add(v3a);
4363 symA.add(v3b);
4365
4366 graph.renumberGraphVertices();
4367 return graph;
4368 }
4369
4370//------------------------------------------------------------------------------
4371
4372 @Test
4373 public void testExploreGraph_nothingToExplore() throws Exception
4374 {
4375 EmptyVertex v = new EmptyVertex();
4377
4378 Set<Vertex> limits = new HashSet<Vertex>();
4379 Set<Vertex> visited = DGraph.exploreGraph(v, limits);
4380 assertEquals(visited.size(), 1);
4381 assertTrue(visited.contains(v));
4382 }
4383
4384//------------------------------------------------------------------------------
4385
4386 @Test
4387 public void testExploreGraph_simpleGraph() throws Exception
4388 {
4389 FragmentSpace fs = prepare();
4390 DGraph graph = makeTestGraphC(fs);
4391 Set<Vertex> limits = new HashSet<Vertex>();
4392 limits.add(graph.getVertexAtPosition(7));
4393 Set<Vertex> visited = DGraph.exploreGraph(
4394 graph.getVertexAtPosition(2), limits);
4395
4396 Set<Vertex> expected = new HashSet<Vertex>();
4397 expected.add(graph.getVertexAtPosition(0));
4398 expected.add(graph.getVertexAtPosition(1));
4399 expected.add(graph.getVertexAtPosition(2));
4400 expected.add(graph.getVertexAtPosition(3));
4401 expected.add(graph.getVertexAtPosition(4));
4402 expected.add(graph.getVertexAtPosition(5));
4403 expected.add(graph.getVertexAtPosition(6));
4404 assertEquals(visited.size(), expected.size());
4405 for (Vertex v : visited) {
4406 assertTrue(expected.contains(v),"Vertex "+v.getVertexId()+" not found in visited");
4407 }
4408 }
4409
4410//------------------------------------------------------------------------------
4411
4412 @Test
4413 public void testExploreGraph_noCrossingTemplateBoundary() throws Exception
4414 {
4416
4417 // Limitless
4418 Set<Vertex> visited = DGraph.exploreGraph(
4419 graph.getVertexAtPosition(0), new HashSet<Vertex>());
4420 assertEquals(visited.size(), 2);
4421
4422 Vertex v = ((Template) ((Template) graph.getVertexAtPosition(1)).getInnerGraph()
4423 .getVertexAtPosition(3)).getInnerGraph().getVertexAtPosition(0);
4424
4425 visited = DGraph.exploreGraph(v, new HashSet<Vertex>());
4426 assertEquals(visited.size(), 4);
4427 }
4428
4429//------------------------------------------------------------------------------
4430
4431 @Test
4432 public void testIsConnected() throws Exception
4433 {
4434 DGraph empty = new DGraph();
4435 assertTrue(empty.isConnected());
4436
4437 DGraph single = new DGraph();
4438 EmptyVertex lone = new EmptyVertex();
4440 single.addVertex(lone);
4441 assertTrue(single.isConnected());
4442
4443 DGraph disconnected = new DGraph();
4444 EmptyVertex v1 = new EmptyVertex();
4445 v1.addAP();
4446 v1.addAP();
4447 EmptyVertex v2 = new EmptyVertex();
4448 v2.addAP();
4449 v2.addAP();
4450 disconnected.addVertex(v1);
4451 disconnected.addVertex(v2);
4452 assertFalse(disconnected.isConnected());
4453
4454 DGraph connected = new DGraph();
4455 EmptyVertex c1 = new EmptyVertex();
4456 c1.addAP();
4457 c1.addAP();
4458 EmptyVertex c2 = new EmptyVertex();
4459 c2.addAP();
4460 c2.addAP();
4461 connected.addVertex(c1);
4462 connected.addVertex(c2);
4463 connected.addEdge(new Edge(c1.getAP(0), c2.getAP(0)));
4464 assertTrue(connected.isConnected());
4465
4466 FragmentSpace fs = prepare();
4467 assertTrue(makeTestGraphC(fs).isConnected());
4468 }
4469
4470//------------------------------------------------------------------------------
4471}
General set of constants used in DENOPTIM.
static final Object VRTSYMMSETID
Property of Vertex used to keep mark symmetric vertexes during graph operations and before defining t...
Class defining a space of building blocks.
void appendVertexToLibrary(Vertex v, Vertex.BBType bbt, ArrayList< Vertex > library)
Takes a vertex and add it to a given library.
void setAPclassBasedApproach(boolean useAPC)
Set the fragment space to behave according to APClass-based approach.
ArrayList< Vertex > getCappingLibrary()
ArrayList< Vertex > getScaffoldLibrary()
ArrayList< Vertex > getFragmentLibrary()
Parameters defining the fragment space.
static final APClass RCACLASSPLUS
Conventional class of attachment points on ring-closing vertexes.
Definition: APClass.java:85
static final APClass RCACLASSMINUS
Conventional class of attachment points on ring-closing vertexes.
Definition: APClass.java:92
static APClass make(String ruleAndSubclass)
Creates an APClass if it does not exist already, or returns the reference to the existing instance.
Definition: APClass.java:164
Class representing a mapping between attachment points (APs).
Definition: APMapping.java:42
An attachment point (AP) is a possibility to attach a Vertex onto the vertex holding the AP (i....
AttachmentPoint getLinkedAP()
Gets the attachment point (AP) that is connected to this AP via the edge user.
Query for searching AttachmentPoints.
Container for the list of vertices and the edges that connect them.
Definition: DGraph.java:104
String toJson()
Produces a string that represents this graph and that adheres to the JSON format.
Definition: DGraph.java:7306
boolean replaceVertex(Vertex vertex, int bbId, BBType bbt, LinkedHashMap< Integer, Integer > apIdMap, FragmentSpace fragSpace)
Replaced a given vertex belonging to this graph with a new vertex generated specifically for this pur...
Definition: DGraph.java:2884
Vertex getVertexWithId(long vid)
Searches for a vertex with the given identifier.
Definition: DGraph.java:3207
int getSymmetricSetCount()
Returns the number of symmetric sets of vertices.
Definition: DGraph.java:323
Vertex getSourceVertex()
Identifies and return the vertex from which the spanning tree originates.
Definition: DGraph.java:972
DGraph extractSubgraph(int index)
Creates a new graph that corresponds to the subgraph of this graph when exploring the spanning tree f...
Definition: DGraph.java:4884
boolean containsVertex(Vertex v)
Check if this graph contains the specified vertex.
Definition: DGraph.java:3182
List< Vertex > findVertices(VertexQuery vrtxQuery, Logger logger)
Filters a list of vertices according to a query.
Definition: DGraph.java:6784
boolean isIsomorphicTo(DGraph other)
Checks if this graph is "DENOPTIM-isomorphic" to the other one given.
Definition: DGraph.java:4079
ArrayList< AttachmentPoint > getAvailableAPs()
Returns the list of available attachment points contained in this graph.
Definition: DGraph.java:4614
void addVertex(Vertex vertex)
Appends a vertex to this graph without creating any edge.
Definition: DGraph.java:1367
List< ClosableChain > closableChains
The potentially closable chains of vertices.
Definition: DGraph.java:123
DGraph embedPatternsInTemplates(GraphPattern pattern, FragmentSpace fragSpace)
Searches for the given pattern type and generated a new graph where each set of (clones of) vertexes ...
Definition: DGraph.java:5292
void getChildrenTree(Vertex vertex, List< Vertex > children)
Gets all the children of the current vertex recursively.
Definition: DGraph.java:3397
void removeVertex(Vertex vertex)
Remove a vertex from this graph.
Definition: DGraph.java:1389
Iterator< SymmetricVertexes > getSymSetsIterator()
Get an iterator for the sets of symmetrically related vertices.
Definition: DGraph.java:334
ArrayList< Vertex > getRCVertices()
Search for ring closing vertices: vertices that contain only a RingClosingAttractor
Definition: DGraph.java:1212
List< List< Vertex > > getSymmetricSubGraphs(List< Vertex > subGrpVrtxs)
We assume that the subgraph is a continuously connected, directed graph.
Definition: DGraph.java:2113
List< Vertex > gVertices
The vertices belonging to this graph.
Definition: DGraph.java:108
Vertex getVertexAtPosition(int pos)
Returns the vertex that is in the given position of the list of vertices belonging to this graph.
Definition: DGraph.java:3139
List< Edge > getEdgesWithTrg(Vertex v)
Returns the list of edges that arrive from the given vertex, i.e., edges where the trgAP is owned by ...
Definition: DGraph.java:1037
static DGraph getEmbeddedGraphInClone(DGraph graphY, DGraph graphB, List< Template > path)
Searches for a graphs (X) embedded at any level in a graph (Y) by knowing.
Definition: DGraph.java:7731
List< Ring > gRings
The rings defined in this graph.
Definition: DGraph.java:118
static boolean replaceSingleSubGraph(APMapping apMapping, FragmentSpace fragSpace)
Replaced the subgraph defined by a set of Attachment Points that belong to a graph (ie....
Definition: DGraph.java:2275
boolean directedPathExists(Vertex src, Vertex trg)
Uses branch identifiers to define is two vertices are in such a relation that allows the drawing of a...
Definition: DGraph.java:3626
void appendVertexOnAP(AttachmentPoint srcAP, AttachmentPoint trgAP)
Append a vertex to this graph: adds the new vertex to the list of vertices belonging to the graph,...
Definition: DGraph.java:6452
List< Vertex > getVertexList()
Definition: DGraph.java:949
void convertSymmetricLabelsToSymmetricSets()
Looks for any symmetric labels, creates symmetric sets that collect the same information,...
Definition: DGraph.java:1896
List< AttachmentPoint > getInterfaceAPs(List< Vertex > subGraphB)
Searches for all AttachmentPoints that represent the interface between a subgraph,...
Definition: DGraph.java:7759
DGraph clone()
Returns almost "deep-copy" of this graph.
Definition: DGraph.java:3812
void removeCappingGroups(List< Vertex > lstVerts)
Remove capping groups that belong to this graph and are in the given list.
Definition: DGraph.java:4740
void renumberGraphVertices()
Reassign vertex IDs to all vertices of this graph.
Definition: DGraph.java:5959
void reassignSymmetricLabels()
Marks the vertices of this graph with a string that is consistent for all vertices that belong to sym...
Definition: DGraph.java:1864
List< Edge > gEdges
The edges belonging to this graph.
Definition: DGraph.java:113
void replaceUnusedRCVsWithCapps(FragmentSpace fragSpace)
Removes unused ring-closing vertices.
Definition: DGraph.java:1822
boolean sameAs(DGraph other, StringBuilder reason)
Compare this and another graph ignoring the vertex IDs.
Definition: DGraph.java:4291
int getLevel(Vertex v)
Calculates the level of a vertex in this graph.
Definition: DGraph.java:6002
static void exploreGraph(Vertex seed, Set< Vertex > limits, Set< Vertex > visited)
Depth-first exploration of graphs.
Definition: DGraph.java:5033
void removeCappingGroupsOn(Vertex vertex)
Remove capping groups on the given vertex of this graph.
Definition: DGraph.java:4710
static DGraph fromJson(String json)
Reads a JSON string and returns an instance of this class.
Definition: DGraph.java:7331
List< Edge > getEdgesWithSrc(Vertex v)
Returns the list of edges that depart from the given vertex, i.e., edges where the srcAP is owned by ...
Definition: DGraph.java:1016
List< Ring > getRings()
Definition: DGraph.java:1003
void addSymmetricSetOfVertices(SymmetricVertexes symSet)
Adds a symmetric set of vertices to this graph.
Definition: DGraph.java:891
SymmetricVertexes getSymSetForVertex(Vertex v)
Returns the set of vertexes symmetric to the given one.
Definition: DGraph.java:863
List< AttachmentPoint > getSubgraphAPs(List< Vertex > subGraphB)
Searches for all AttachmentPoints that are owned by vertices in a subgraph but either available or us...
Definition: DGraph.java:7794
boolean isConnected()
Check if this graph is connected, i.e., there is at least one path between any two vertices.
Definition: DGraph.java:1136
void addRing(Ring ring)
Definition: DGraph.java:1280
List< Vertex > getMutableSites()
A list of mutation sites from within this graph.
Definition: DGraph.java:7238
String localMsg
A free-format string used to record simple properties in the graph.
Definition: DGraph.java:142
void addEdge(Edge edge)
Adds the edge to the list of edges belonging to this graph.
Definition: DGraph.java:1271
List< Template > getEmbeddingPath()
Find the path that one has to traverse to reach this graph from any template-embedding structure.
Definition: DGraph.java:7611
List< Integer > getBranchIdOfVertexAtPosition(int i)
Returns the branch identifier.
Definition: DGraph.java:3567
boolean isIsostructuralTo(DGraph other)
Checks if this graph is "DENOPTIM-isostructural" to the other one given.
Definition: DGraph.java:4206
boolean detectSymVertexSets()
Detects and groups symmetric sets of Vertexes in the graph based on unique identification and path en...
Definition: DGraph.java:370
Unit test for DENOPTIMGraph.
Definition: DGraphTest.java:72
DGraph makeDisorderedGraph(FragmentSpace fs)
Makes a graph with disordered list of vertexes, i.e., the first vertex is not the source.
static DGraph makeTestGraphM()
Returns a graph with definition of symmetric vertexes and symmetric APs meant for testing purposes.
DGraph makeTestGraphG(FragmentSpace fs)
Creates a test graph that looks like this:
static DGraph makeDeeplyEmbeddedGraph()
Returns a graph that contains a 10-layered recursive structure.
static DGraph makeTestGraphA2()
Build a graph meant to be used in unit tests.
DGraph makeTestGraphDSub2(FragmentSpace fs)
Creates a test graph that looks like this:
void buildVertexAndConnectToGraph(EmptyVertex v, int apCount, DGraph graph)
void testGetAvailableAPs_returnsListOfAvailableAPs()
DGraph makeTestGraphD(FragmentSpace fs)
Creates a test graph that looks like this:
DGraph makeTestGraphE(FragmentSpace fs)
Creates a test graph that looks like this:
static DGraph makeTestGraph0(FragmentSpace fs)
Build a graph meant to be used in unit tests.
DGraph makeTestGraphL(FragmentSpace fs)
Creates a test graph that looks like this:
void testExploreGraph_noCrossingTemplateBoundary()
DGraph makeTestGraphI(FragmentSpace fs)
Creates a test graph that looks like this:
static DGraph makeTestGraphA()
Build a graph meant to be used in unit tests.
DGraph makeTestGraphH(FragmentSpace fs)
Creates a test graph that looks like this:
void testReplaceSingleSubGraph_inTemplate()
DGraph makeTestGraphB(FragmentSpace fs)
Creates a test graph that looks like this:
static DGraph makeTestGraph_treeWithOutScaffold(FragmentSpace fs)
Creates a test graph that intentionally violates APClass compatibility and looks like this:
void testReplaceSingleSubGraph_NonScafToNonScaf_withAPClassViolation()
void testConvertSymmetricLabelsToSymmetricSets()
DGraph makeTestGraphJ(FragmentSpace fs)
Creates a test graph that looks like this:
static FragmentSpace prepare()
Definition: DGraphTest.java:79
DGraph makeTestGraphK(FragmentSpace fs)
Creates a test graph that looks like this:
DGraph makeTestGraphDSub1(FragmentSpace fs)
Creates a test graph that looks like this:
void testGetChildrenTreeWithBranchIdentifier()
void testReplaceSingleSubGraph_ringFormation()
DGraph makeTestGraphF(FragmentSpace fs)
Creates a test graph that looks like this:
static DGraph makeTestGraphO_B(FragmentSpace fs)
Creates a test graph that intentionally violates APClass compatibility and looks like this:
static DGraph makeTestGraphN()
Returns a graph with peculiar definition of symmetric vertexes and symmetric APs meant for testing pu...
DGraph[] makeIsostructuralGraphs()
void testReplaceSingleSubGraph_ScafToScaf_withAPClassViolation()
static DGraph makeTestGraphO_A(FragmentSpace fs)
Creates a test graph that intentionally violates APClass compatibility and looks like this:
DGraph makeTestGraphC(FragmentSpace fs)
Creates a test graph that looks like this:
static DGraph makeTestGraph1(FragmentSpace fs)
Build a graph meant to be used in unit tests.
This class represents the edge between two vertices.
Definition: Edge.java:38
A query for edges: a list of properties that target edges should possess in order to match this query...
Definition: EdgeQuery.java:28
An empty vertex has the behaviors of a vertex, but has no molecular structure.
void addSymmetricAPSet(SymmetricAPs symAPs)
EmptyVertex clone()
Returns a deep-copy of this vertex.
void addAP()
Adds an attachment point with no APClass or other attribute.
Class representing a continuously connected portion of chemical object holding attachment points.
Definition: Fragment.java:61
void addAP(int atomPositionNumber)
Adds an attachment point with a dummy APClass.
Definition: Fragment.java:343
void addBond(IBond bond)
Definition: Fragment.java:871
void addAtom(IAtom atom)
Definition: Fragment.java:836
void projectAPsToProperties()
Finds the DENOPTIMAttachmentPoint objects defined as properties of the atoms in this container,...
Definition: Fragment.java:693
This class represents the closure of a ring in a spanning tree.
Definition: Ring.java:40
Vertex getTailVertex()
Definition: Ring.java:95
int getDistance(Vertex v1, Vertex v2)
Measures how many edges there are between two edges along the sequence of vertices that defined this ...
Definition: Ring.java:325
Vertex getHeadVertex()
Definition: Ring.java:83
A collection of AttachmentPoints that are related by a relation that we call "symmetry",...
boolean add(T item)
Adds an item to this list, if not already present.
A collection of Vertexs that are related by a relation that we call "symmetry", even though this clas...
void setInnerGraph(DGraph innerGraph)
Definition: Template.java:298
static Template getTestTemplate(ContractLevel contractLevel)
Method meant for devel phase only.
Definition: Template.java:172
A vertex is a data structure that has an identity and holds a list of AttachmentPoints.
Definition: Vertex.java:61
int getBuildingBlockId()
Returns the index of the building block that should correspond to the position of the building block ...
Definition: Vertex.java:304
void setVertexId(long vertexId2)
Definition: Vertex.java:281
Vertex.BBType getBuildingBlockType()
Definition: Vertex.java:318
void setAsRCV(boolean isRCV)
Definition: Vertex.java:274
DGraph getGraphOwner()
Returns the graph this vertex belongs to or null.
Definition: Vertex.java:851
abstract List< AttachmentPoint > getAttachmentPoints()
void setBuildingBlockId(int buildingBlockId)
Definition: Vertex.java:311
Object getProperty(Object property)
Definition: Vertex.java:1223
void setUniquefyingProperty(String key)
Add the given key among the properties that are checked for equality when comparing vertices with the...
Definition: Vertex.java:1199
void setBuildingBlockType(Vertex.BBType buildingBlockType)
Definition: Vertex.java:325
void setProperty(Object key, Object property)
Definition: Vertex.java:1235
AttachmentPoint getAP(int i)
Get attachment point i on this vertex.
Definition: Vertex.java:1007
static Vertex newVertexFromLibrary(int bbId, Vertex.BBType bbt, FragmentSpace fragSpace)
Builds a new molecular fragment kind of vertex.
Definition: Vertex.java:214
Query for searching vertices.
This object represents a path in a DGraph.
List< Edge > getEdgesPath()
Returns the list of edges involved, if any.
Possible chemical bond types an edge can represent.
Definition: Edge.java:305
Enum specifying to what extent the template's inner graph can be changed.
Definition: Template.java:104
FREE
Inner graphs are free to change within the confines of the required AttachmentPoints.
Definition: Template.java:109
FIXED
Inner graphs are effectively equivalent to the Fragment class, as no change in the inner structure is...
Definition: Template.java:116
The type of building block.
Definition: Vertex.java:86
Flag declaring the type of Vertex implementation.
Definition: Vertex.java:172
Types of mutation defined in relation to what happens to the target vertex (i.e., the actual mutation...