rino 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (87) hide show
  1. data/README +44 -0
  2. data/Rakefile +123 -0
  3. data/ext/extconf.rb +26 -0
  4. data/ext/ruby_inchi_main.so +0 -0
  5. data/ext/src/aux2atom.h +2786 -0
  6. data/ext/src/comdef.h +148 -0
  7. data/ext/src/e_0dstereo.c +3014 -0
  8. data/ext/src/e_0dstereo.h +31 -0
  9. data/ext/src/e_comdef.h +57 -0
  10. data/ext/src/e_ctl_data.h +147 -0
  11. data/ext/src/e_ichi_io.c +498 -0
  12. data/ext/src/e_ichi_io.h +40 -0
  13. data/ext/src/e_ichi_parms.c +37 -0
  14. data/ext/src/e_ichi_parms.h +41 -0
  15. data/ext/src/e_ichicomp.h +50 -0
  16. data/ext/src/e_ichierr.h +40 -0
  17. data/ext/src/e_ichimain.c +593 -0
  18. data/ext/src/e_ichisize.h +43 -0
  19. data/ext/src/e_inchi_atom.c +75 -0
  20. data/ext/src/e_inchi_atom.h +33 -0
  21. data/ext/src/e_inpdef.h +41 -0
  22. data/ext/src/e_mode.h +706 -0
  23. data/ext/src/e_mol2atom.c +649 -0
  24. data/ext/src/e_readinch.c +58 -0
  25. data/ext/src/e_readmol.c +54 -0
  26. data/ext/src/e_readmol.h +180 -0
  27. data/ext/src/e_readstru.c +251 -0
  28. data/ext/src/e_readstru.h +33 -0
  29. data/ext/src/e_util.c +284 -0
  30. data/ext/src/e_util.h +61 -0
  31. data/ext/src/extr_ct.h +251 -0
  32. data/ext/src/ichi.h +206 -0
  33. data/ext/src/ichi_bns.c +7999 -0
  34. data/ext/src/ichi_bns.h +231 -0
  35. data/ext/src/ichican2.c +5000 -0
  36. data/ext/src/ichicano.c +2195 -0
  37. data/ext/src/ichicano.h +49 -0
  38. data/ext/src/ichicans.c +1625 -0
  39. data/ext/src/ichicant.h +379 -0
  40. data/ext/src/ichicomn.h +260 -0
  41. data/ext/src/ichicomp.h +50 -0
  42. data/ext/src/ichidrp.h +119 -0
  43. data/ext/src/ichierr.h +124 -0
  44. data/ext/src/ichiisot.c +101 -0
  45. data/ext/src/ichilnct.c +286 -0
  46. data/ext/src/ichimain.h +132 -0
  47. data/ext/src/ichimak2.c +1189 -0
  48. data/ext/src/ichimake.c +3812 -0
  49. data/ext/src/ichimake.h +205 -0
  50. data/ext/src/ichimap1.c +851 -0
  51. data/ext/src/ichimap2.c +2856 -0
  52. data/ext/src/ichimap4.c +1609 -0
  53. data/ext/src/ichinorm.c +741 -0
  54. data/ext/src/ichinorm.h +67 -0
  55. data/ext/src/ichiparm.c +45 -0
  56. data/ext/src/ichiparm.h +1441 -0
  57. data/ext/src/ichiprt1.c +3612 -0
  58. data/ext/src/ichiprt2.c +1511 -0
  59. data/ext/src/ichiprt3.c +3011 -0
  60. data/ext/src/ichiqueu.c +1003 -0
  61. data/ext/src/ichiring.c +326 -0
  62. data/ext/src/ichiring.h +49 -0
  63. data/ext/src/ichisize.h +35 -0
  64. data/ext/src/ichisort.c +539 -0
  65. data/ext/src/ichister.c +3538 -0
  66. data/ext/src/ichister.h +35 -0
  67. data/ext/src/ichitaut.c +3843 -0
  68. data/ext/src/ichitaut.h +387 -0
  69. data/ext/src/ichitime.h +74 -0
  70. data/ext/src/inchi_api.h +670 -0
  71. data/ext/src/inchi_dll.c +1480 -0
  72. data/ext/src/inchi_dll.h +34 -0
  73. data/ext/src/inchi_dll_main.c +23 -0
  74. data/ext/src/inchi_dll_main.h +31 -0
  75. data/ext/src/inpdef.h +328 -0
  76. data/ext/src/lreadmol.h +1246 -0
  77. data/ext/src/mode.h +706 -0
  78. data/ext/src/ruby_inchi_main.c +558 -0
  79. data/ext/src/runichi.c +4179 -0
  80. data/ext/src/strutil.c +3861 -0
  81. data/ext/src/strutil.h +182 -0
  82. data/ext/src/util.c +1130 -0
  83. data/ext/src/util.h +85 -0
  84. data/lib/clean_tempfile.rb +220 -0
  85. data/lib/rino.rb +111 -0
  86. data/test/test.rb +386 -0
  87. metadata +130 -0
@@ -0,0 +1,379 @@
1
+ /*
2
+ * International Union of Pure and Applied Chemistry (IUPAC)
3
+ * International Chemical Identifier (InChI)
4
+ * Version 1
5
+ * Software version 1.00
6
+ * April 13, 2005
7
+ * Developed at NIST
8
+ */
9
+
10
+ #ifndef __INCHICANT_H__
11
+ #define __INCHICANT_H__
12
+
13
+ /******************************************************/
14
+ /* */
15
+ /* Canonicalization definitions */
16
+ /* */
17
+ /******************************************************/
18
+ #include "ichisize.h"
19
+
20
+
21
+ #ifndef INCHI_US_SHORT_DEF
22
+ typedef signed short S_SHORT;
23
+ typedef unsigned short U_SHORT;
24
+ #define INCHI_US_SHORT_DEF
25
+ #endif
26
+
27
+ /*typedef unsigned long INCHI_MODE;*/
28
+
29
+ typedef union tagSplitLong {
30
+ unsigned long ul;
31
+ U_SHORT us[2];
32
+ }SU_LONG;
33
+
34
+ #define _HI 1 /* Intel platform */
35
+ #define _LO 0
36
+
37
+ #define NEIGH_LIST_LEN 4
38
+ #define U_LONG_LEN 2
39
+
40
+ #ifndef defined_NEIGH_LIST
41
+ typedef AT_RANK *NEIGH_LIST;
42
+ #define defined_NEIGH_LIST
43
+ #endif
44
+
45
+ typedef struct tagEQUIV_INFO {
46
+ int nNumSets;
47
+ int *nCutVertexAtom; /* cut-vertex atom for the set of equivalent atoms */
48
+ int *nFirstInSet; /* first of equivalent atoms in the connected to the cut-vertex atom parts of the structure */
49
+ int *nNumInSet; /* number of the equivalent atoms connected to the cut-vertex atom */
50
+ int *nAtomNo; /* eqivalent atom number */
51
+ int *nAddToRank; /* number to add to the rank to normalize */
52
+ } EQUIV_INFO;
53
+
54
+ #define MOL_PART_MASK (~0x0U ^ 0x07U)
55
+
56
+
57
+ typedef struct tagAtData_dch {
58
+ char element[3];
59
+ int valence;
60
+ }AT_DATA;
61
+
62
+
63
+ #define MAXVAL 20 /* maximum valence */
64
+
65
+ #define ATOM_EL_LEN 6
66
+
67
+ typedef struct tagAtomInvariantBytes {
68
+ S_CHAR cNotExactlyHillOrderNumber;
69
+ S_CHAR cNumberOfConnections;
70
+ /* S_CHAR cNumberOfNonHydrogenBonds; */
71
+ S_CHAR cAtomicNumber;
72
+ #if( HYDROGENS_IN_INIT_RANKS == 1 )
73
+ S_CHAR cNumberOfAttachedHydrogens;
74
+ #endif
75
+ } ATOM_INVARIANT_BYTES;
76
+
77
+ typedef struct tagAtomInvariant {
78
+ /* non-isotopic part */
79
+ #if( USE_DISTANCES_FOR_RANKING == 1 )
80
+ AT_RANK nDistanceFromTerminal;
81
+ #endif
82
+ ATOM_INVARIANT_BYTES b;
83
+ AT_RANK cNum_tautomer; /* 0 or for tautomer endpoint: number of endpoints in the group */
84
+ AT_RANK cNum_tautomer_num[T_NUM_NO_ISOTOPIC]; /* 0 or numbers from t_gtroup */
85
+ /* isotopic part */
86
+ AT_ISO_SORT_KEY iso_sort_key;
87
+ AT_RANK cNum_tautomer_iso[T_NUM_ISOTOPIC]; /* 0 or numbers from t_group */
88
+ } ATOM_INVARIANT;
89
+ /**********************************/
90
+ typedef enum tagAtInvariantIndexes {
91
+ AT_INV_HILL_ORDER,
92
+ AT_INV_NUM_CONNECTIONS,
93
+ AT_INV_NUM_H,
94
+ /* for endpoint + undirected graph, otherwise 0 */
95
+ AT_INV_NUM_TG_ENDPOINTS,
96
+ AT_INV_TG_NUMBERS, /* num H, num (-) */
97
+ AT_INV_NUM_H_FIX = AT_INV_TG_NUMBERS+T_NUM_NO_ISOTOPIC,
98
+ AT_INV_BREAK1,
99
+ /* here compare iso sort key */
100
+ AT_INV_TAUT_ISO = AT_INV_BREAK1,
101
+ AT_INV_LENGTH = AT_INV_TAUT_ISO + T_NUM_ISOTOPIC
102
+ } AT_INV_INDEXES;
103
+
104
+ typedef struct tagAtomInvariant2 {
105
+ AT_NUMB val[AT_INV_LENGTH];
106
+ AT_ISO_SORT_KEY iso_sort_key;
107
+ S_CHAR iso_aux_key;
108
+ } ATOM_INVARIANT2;
109
+
110
+ /******************* Partition **********************************/
111
+ typedef struct tagPartition {
112
+ AT_RANK *Rank;
113
+ AT_NUMB *AtNumber;
114
+ } Partition;
115
+
116
+ /********************* BFCN *************************************/
117
+ typedef struct tagFixHOrTautCanonNumbering {
118
+
119
+ int num_at_tg; /* = num_atoms for non-taut */
120
+ int num_atoms;
121
+ int nCanonFlags;
122
+ NEIGH_LIST *NeighList; /* length = num_at_tg */
123
+ /****************************/
124
+ /* base structure */
125
+ /****************************/
126
+ AT_RANK *LinearCt; /* connection table atoms (+taut. groups, directed graph)*/
127
+ int nLenLinearCtAtOnly;
128
+ int nLenLinearCt;
129
+ int nMaxLenLinearCt;
130
+
131
+ Partition PartitionCt; /* canonical numbering */
132
+ AT_RANK *nSymmRankCt; /* orbits */
133
+
134
+ /* orig. fixed by tautomerism H positions */
135
+ NUM_H *nNumHOrig; /* original H atoms positions + taut. info, excluding tautomeric H */
136
+ NUM_H *nNumH; /* canonical H atoms positions + taut. info, excluding tautomeric H */
137
+ int nLenNumH; /* length = num_atoms + 2*num_taut_groups */
138
+
139
+ /* fixed H: original positions of tautomeric H; exists obly for tautomeric structures */
140
+ NUM_H *nNumHOrigFixH; /* original fixed positions of tautomeric H */
141
+ NUM_H *nNumHFixH; /* canonical fixed positions of tautomeric H */
142
+ int nLenNumHFixH; /* length = num_atoms */
143
+
144
+ /*******************************************************************************/
145
+ /* the following exists only if isotopic and isotopic results requested */
146
+ /*******************************************************************************/
147
+ Partition PartitionCtIso; /* canonical numbering of isotopic base structure, defined later */
148
+ AT_RANK *nSymmRankCtIso; /* orbits of isotopic structure */
149
+ AT_ISO_SORT_KEY *iso_sort_keys; /* original isotopic sort keys for atoms and taut groups */
150
+ AT_ISO_SORT_KEY *iso_sort_keysOrig; /* canonical isotopic sort keys for atoms and taut groups */
151
+ int len_iso_sort_keys;
152
+ S_CHAR *iso_exchg_atnos; /* canonical: 0=> tautomeric or may have isotopic H exchanged */
153
+ S_CHAR *iso_exchg_atnosOrig; /* original: 0=> tautomeric or may have isotopic H exchanged */
154
+
155
+ } FTCN;
156
+
157
+ /******************** BCN *************************************/
158
+ typedef struct tagBaseCanonNumbering {
159
+
160
+ AT_RANK **pRankStack;
161
+ int nMaxLenRankStack;
162
+ int num_max; /* allocated nRank[] arrays lengths in pRankStack */
163
+ int num_at_tg; /* all of the following arrays have this length */
164
+ int num_atoms;
165
+ struct tagInchiTime *ulTimeOutTime;
166
+ FTCN ftcn[TAUT_NUM];
167
+
168
+ } BCN;
169
+
170
+ /***********************************
171
+ *
172
+ * CANON_STAT
173
+ */
174
+ typedef struct tagCanonStat {
175
+ /* statistics */
176
+ long lNumBreakTies;
177
+ long lNumNeighListIter;
178
+ long lNumTotCT;
179
+ long lNumDecreasedCT;
180
+ long lNumRejectedCT;
181
+ long lNumEqualCT;
182
+ struct tagInchiTime *ulTimeOutTime;
183
+ long lTotalTime;
184
+
185
+ /* control */
186
+ int bFirstCT;
187
+ int bKeepSymmRank;
188
+ int bStereoIsBetter;
189
+
190
+ int nCanonFlags;
191
+
192
+ /* data : */
193
+
194
+ AT_NUMB *LinearCT; /* connection table only */
195
+ AT_ISOTOPIC *LinearCTIsotopic;
196
+ AT_ISO_TGROUP *LinearCTIsotopicTautomer;
197
+ AT_STEREO_DBLE *LinearCTStereoDble;
198
+ AT_STEREO_CARB *LinearCTStereoCarb;
199
+ AT_STEREO_DBLE *LinearCTStereoDbleInv;
200
+ AT_STEREO_CARB *LinearCTStereoCarbInv;
201
+ AT_STEREO_DBLE *LinearCTIsotopicStereoDble;
202
+ AT_STEREO_CARB *LinearCTIsotopicStereoCarb;
203
+ AT_STEREO_DBLE *LinearCTIsotopicStereoDbleInv;
204
+ AT_STEREO_CARB *LinearCTIsotopicStereoCarbInv;
205
+ AT_TAUTOMER *LinearCTTautomer; /* minimal */
206
+
207
+ /* second copies of line notation arrays */
208
+
209
+ AT_NUMB *LinearCT2; /* to save non-isotopic CT */
210
+
211
+ int nLenLinearCTStereoDble;
212
+ int nLenLinearCTStereoDbleInv;
213
+ int nMaxLenLinearCTStereoDble; /* new */
214
+
215
+ int bCmpStereo; /* 0 => no stereo to invert;
216
+ 1 => StereoCtInv < StereoCt;
217
+ 2 => StereoCtInv = StereoCt;
218
+ 3 => StereoCtInv > StereoCt;
219
+ */
220
+ int nLenLinearCTStereoCarb;
221
+ int nLenLinearCTStereoCarbInv;
222
+ int nMaxLenLinearCTStereoCarb; /* new */
223
+
224
+ int nLenLinearCTIsotopic;
225
+ int nMaxLenLinearCTIsotopic;
226
+
227
+ int nLenLinearCTIsotopicTautomer;
228
+ int nMaxLenLinearCTIsotopicTautomer;
229
+
230
+ int nLenLinearCT; /* connection table only */
231
+ int nLenLinearCT2; /* connection table only, non-isotopic result */
232
+ int nLenLinearCTAtOnly; /* connection table only without tautomeric pseudoatoms */
233
+ int nLenLinearCTAtOnly2; /* connection table only, non-isotopic result without tautomeric pseudoatoms */
234
+ int nMaxLenLinearCT; /* connection table only */
235
+
236
+ int nLenLinearCTTautomer;
237
+ int nMaxLenLinearCTTautomer;
238
+
239
+ int bCmpIsotopicStereo; /* 0 => no stereo to invert;
240
+ 1 => StereoCtInv < StereoCt;
241
+ 2 => StereoCtInv = StereoCt;
242
+ 3 => StereoCtInv > StereoCt;
243
+ */
244
+ int nLenLinearCTIsotopicStereoDble;
245
+ int nLenLinearCTIsotopicStereoDbleInv;
246
+ int nMaxLenLinearCTIsotopicStereoDble;
247
+
248
+ int nLenLinearCTIsotopicStereoCarb; /* new */
249
+ int nLenLinearCTIsotopicStereoCarbInv; /* new */
250
+ int nMaxLenLinearCTIsotopicStereoCarb;
251
+ S_CHAR *bRankUsedForStereo; /* canon. rank used for stereo mapping */
252
+ S_CHAR *bAtomUsedForStereo; /* 0 if not a stereo atom or during a canon. rank being mapped on this atom; */
253
+ /* STEREO_AT_MARK if an unpapped stereogenic atom */
254
+ /* or a number of stereogenic bonds adjacent to an atom */
255
+
256
+ AT_RANK *nPrevAtomNumber;
257
+
258
+ AT_RANK *nCanonOrd; /* atom numbers in order of increasing canon. ranks */
259
+ AT_RANK *nSymmRank; /* symmetry numbers in order of atoms */
260
+ AT_RANK *nCanonOrdTaut; /* t-group numbers numbers in order of increasing canon. ranks */
261
+ AT_RANK *nSymmRankTaut; /* t-group symmetry numbers in order of t-groups */
262
+
263
+ AT_RANK *nCanonOrdStereo; /* atom numbers in order of increasing canon. ranks */
264
+ AT_RANK *nCanonOrdStereoInv; /* atom numbers in order of increasing canon. ranks */
265
+ AT_RANK *nCanonOrdStereoTaut; /* t-group numbers in order of increasing canon. ranks */
266
+
267
+ AT_RANK *nSymmRankIsotopic;
268
+ AT_RANK *nCanonOrdIsotopic; /* atom numbers in order of increasing canon. ranks */
269
+ AT_RANK *nSymmRankIsotopicTaut; /* !!! */
270
+ AT_RANK *nCanonOrdIsotopicTaut; /*/ t-group numbers in order of increasing canon. ranks */
271
+
272
+ AT_RANK *nCanonOrdIsotopicStereo;
273
+ AT_RANK *nCanonOrdIsotopicStereoInv;
274
+ AT_RANK *nCanonOrdIsotopicStereoTaut; /* !!! */
275
+
276
+ /* actual lengths if successfully calculated */
277
+
278
+ int nLenCanonOrd; /* Superceded by any of the following > 0 */
279
+ int nLenCanonOrdTaut; /* !!! Superceded by any of the following > 0 */
280
+ int nLenCanonOrdIsotopic;
281
+ int nLenCanonOrdIsotopicTaut; /* !!! */
282
+ int nLenCanonOrdStereo;
283
+ int nLenCanonOrdStereoTaut; /* !!! */
284
+ int nLenCanonOrdIsotopicStereo;
285
+ int nLenCanonOrdIsotopicStereoTaut; /* !!! */
286
+
287
+ /* other */
288
+
289
+ int bHasIsotopicInTautomerGroups;
290
+ T_GROUP_INFO *t_group_info;
291
+ int bIgnoreIsotopic;
292
+ int bDoubleBondSquare; /* 0 or 2 */
293
+ INCHI_MODE nMode;
294
+ #if( bRELEASE_VERSION == 0 )
295
+ int bExtract; /* for debug only */
296
+ #endif
297
+ NEIGH_LIST *NeighList;
298
+ BCN *pBCN;
299
+ S_CHAR *nNum_H; /* number of terminal hydrogen atoms on each atom except tautomeric [num_atoms], in order of canonical numbers */
300
+ S_CHAR *nNum_H_fixed;/* number of terminal hydrogen atoms on tautomeric atoms (for non-atautomeric representation) [num_atoms] */
301
+ S_CHAR *nExchgIsoH;
302
+ } CANON_STAT;
303
+
304
+ /**************************************************/
305
+ typedef struct tagCanonData {
306
+
307
+ /* same names/types as in ConTable; here the order is from original numbering */
308
+
309
+ AT_NUMB *LinearCT; /* output ?? */
310
+
311
+ int nMaxLenLinearCT;
312
+ int nLenLinearCT;
313
+ int nLenCTAtOnly;
314
+ int nCanonFlags;
315
+ /* hydrogen atoms fixed in tautomeric representation:
316
+ compare before diff sign inversion: (+) <=> Ct1->() > Ct2->() */
317
+ NUM_H *NumH;
318
+ int lenNumH; /* used length */
319
+ int maxlenNumH; /* n + T_NUM_NO_ISOTOPIC*(n_tg-n) + 1 */
320
+
321
+ /* hydrogen atoms fixed in non-tautomeric representation only:
322
+ compare before diff sign inversion: (+) <=> Ct1->() > Ct2->() */
323
+ NUM_H *NumHfixed;
324
+ int lenNumHfixed; /* used length */
325
+ int maxlenNumHfixed; /* max length = n+1 */
326
+
327
+ /* isotopic atoms (without tautomeric H) and isotopic tautomeric groups */
328
+ /* note: AT_ISO_SORT_KEY and T_GROUP_ISOWT are identical types: long */
329
+ AT_ISO_SORT_KEY *iso_sort_key;
330
+ int len_iso_sort_key; /* used length */
331
+ int maxlen_iso_sort_key; /* max length = n_tg+1 */
332
+ S_CHAR *iso_exchg_atnos;
333
+ int len_iso_exchg_atnos; /* used length */
334
+ int maxlen_iso_exchg_atnos;
335
+
336
+ /* isotopic hydrogen atoms fixed in non-tautomeric representation only */
337
+ #if ( USE_ISO_SORT_KEY_HFIXED == 1 )
338
+ AT_ISO_SORT_KEY *iso_sort_key_Hfixed;
339
+ int len_iso_sort_key_Hfixed; /* used length */
340
+ int maxlen_iso_sort_key_Hfixed; /* max length = n+1 */
341
+ #endif
342
+ /* auxiliary ranking */
343
+
344
+ AT_RANK *nAuxRank;
345
+
346
+ struct tagInchiTime *ulTimeOutTime; /* timeout */
347
+
348
+ } CANON_DATA;
349
+ /**************************************************/
350
+
351
+ typedef struct tagCanonCounts {
352
+ long lNumBreakTies;
353
+ long lNumDecreasedCT;
354
+ long lNumRejectedCT;
355
+ long lNumEqualCT;
356
+ long lNumTotCT;
357
+ double dGroupSize;
358
+ long lNumGenerators;
359
+ long lNumStoredIsomorphisms;
360
+
361
+ } CANON_COUNTS;
362
+ /***********************************************
363
+ tree structure: one segment
364
+
365
+ canon. rank
366
+ at.no orig. atom numbers on which the canon. rank has been successfully mapped
367
+ ...
368
+ at.no except the last at.no: it is not known if it has been mapped until all atoms are mapped
369
+ num.at+1 number of atoms in this segment
370
+ */
371
+
372
+ typedef struct tagCurTree {
373
+ AT_NUMB *tree;
374
+ int max_len; /* allocated length of tree in sizeof(tree[0]) units */
375
+ int cur_len; /* currently used length */
376
+ int incr_len; /* reallocation increment */
377
+ } CUR_TREE;
378
+
379
+ #endif /* __INCHICANT_H__ */
@@ -0,0 +1,260 @@
1
+ /*
2
+ * International Union of Pure and Applied Chemistry (IUPAC)
3
+ * International Chemical Identifier (InChI)
4
+ * Version 1
5
+ * Software version 1.00
6
+ * April 13, 2005
7
+ * Developed at NIST
8
+ */
9
+
10
+ #ifndef __INCHICOMN_H__
11
+ #define __INCHICOMN_H__
12
+
13
+ #include "ichierr.h"
14
+
15
+
16
+ /********************************
17
+ *
18
+ * Globals for sorting
19
+ */
20
+
21
+ extern const NEIGH_LIST *pNeighList_RankForSort;
22
+ extern const ATOM_INVARIANT2 *pAtomInvariant2ForSort;
23
+ extern const AT_NUMB *pNeighborsForSort;
24
+ extern const AT_RANK *pn_RankForSort;
25
+
26
+ extern AT_RANK nMaxAtNeighRankForSort;
27
+
28
+ extern int nNumCompNeighborsRanksCountEql;
29
+
30
+
31
+ #define tsort insertions_sort
32
+
33
+ typedef struct tagEquNeigh {
34
+ int num_to; /* number of neighbors with equal mapping ranks; one of them has min. canon. number */
35
+ AT_RANK to_at[4]; /* to_atom neighbors #s with equal mapping ranks */
36
+ AT_RANK from_at; /* from_at neighbor # which has min. canon. number and can be mapped on any of the above to_at[] */
37
+ AT_RANK rank; /* equal mapping rank value */
38
+ AT_RANK canon_rank; /* min. canon. number */
39
+ } EQ_NEIGH;
40
+
41
+ #ifndef INCHI_ALL_CPP
42
+ #ifdef __cplusplus
43
+ extern "C" {
44
+ #endif
45
+ #endif
46
+
47
+ /*******************************************************************/
48
+ /* ichiisot.c */
49
+ int unpack_iso_sort_key( AT_ISO_SORT_KEY iso_sort_key, S_CHAR *num_1H, S_CHAR *num_2H, S_CHAR *num_3H, S_CHAR *iso_atw_diff );
50
+ AT_ISO_SORT_KEY make_iso_sort_key( int iso_atw_diff, int num_1H, int num_2H, int num_3H);
51
+ int set_atom_iso_sort_keys( int num_at, sp_ATOM *at, T_GROUP_INFO* t_group_info, int *bHasIsotopicInTautomerGroups );
52
+ /***********************************************************************/
53
+ /* ichisort.c */
54
+
55
+ void insertions_sort_NeighList_AT_NUMBERS( NEIGH_LIST base, AT_RANK *nRank );
56
+ int insertions_sort_NeighList_AT_NUMBERS3( NEIGH_LIST base, AT_RANK *nRank );
57
+ int insertions_sort_AT_RANK( AT_RANK *base, int num );
58
+ void insertions_sort_NeighListBySymmAndCanonRank( NEIGH_LIST base, const AT_RANK *nSymmRank, const AT_RANK *nCanonRank );
59
+ int CompareNeighListLex( NEIGH_LIST pp1, NEIGH_LIST pp2, const AT_RANK *nRank);
60
+ int CompareNeighListLexUpToMaxRank( NEIGH_LIST pp1, NEIGH_LIST pp2, const AT_RANK *nRank, AT_RANK nMaxAtNeighRank );
61
+ int compare_NeighLists( const NEIGH_LIST *op1, const NEIGH_LIST *op2 );
62
+ int CompNeighborsAT_NUMBER( const void* a1, const void* a2);
63
+ int comp_AT_RANK( const void* a1, const void* a2);
64
+ int CompRank(const void* a1, const void* a2 );
65
+ int CompRanksOrd( const void* a1, const void* a2 );
66
+
67
+ int CompAtomInvariants2Only( const void* a1, const void* a2 );
68
+ int CompAtomInvariants2( const void* a1, const void* a2 );
69
+
70
+ int CompNeighListRanks( const void* a1, const void* a2 );
71
+ int CompNeighListRanksOrd( const void* a1, const void* a2 );
72
+ int CompNeighLists( const void* a1, const void* a2 );
73
+ int CompNeighListsUpToMaxRank( const void* a1, const void* a2 );
74
+ int CompNeighborsRanksCountEql( const void* a1, const void* a2 );
75
+ int CompRanksInvOrd( const void* a1, const void* a2 );
76
+ int CompChemElemLex( const void *a1, const void *a2 );
77
+
78
+
79
+
80
+ NEIGH_LIST *CreateNeighList( int num_atoms, int num_at_tg, sp_ATOM* at, int bDoubleBondSquare, T_GROUP_INFO *t_group_info );
81
+ NEIGH_LIST *CreateNeighListFromLinearCT( AT_NUMB *LinearCT, int nLenCT, int num_atoms );
82
+
83
+ void FreeNeighList( NEIGH_LIST *pp );
84
+ int BreakAllTies( int num_atoms, int num_max, AT_RANK **pRankStack,
85
+ NEIGH_LIST *NeighList, AT_RANK *nTempRank, CANON_STAT *pCS);
86
+
87
+ /******************************************************************************/
88
+ /* ichimap.c */
89
+ void switch_ptrs( AT_RANK **p1, AT_RANK **p2 );
90
+
91
+ int SortedEquInfoToRanks( const AT_RANK* nSymmRank, AT_RANK* nRank, const AT_RANK* nAtomNumber, int num_atoms, int *bChanged );
92
+ int SortedRanksToEquInfo( AT_RANK* nSymmRank, const AT_RANK* nRank, const AT_RANK* nAtomNumber, int num_atoms );
93
+
94
+ int SetNewRanksFromNeighLists( int num_atoms, NEIGH_LIST *NeighList, AT_RANK *nRank, AT_RANK *nNewRank,
95
+ AT_RANK *nAtomNumber, int bUseAltSort, int ( *comp )(const void *, const void *) );
96
+ int SetNewRanksFromNeighLists3( int num_atoms, NEIGH_LIST *NeighList, AT_RANK *nRank, AT_RANK *nNewRank,
97
+ AT_RANK *nAtomNumber );
98
+ int SetNewRanksFromNeighLists4( int num_atoms, NEIGH_LIST *NeighList, AT_RANK *nRank, AT_RANK *nNewRank,
99
+ AT_RANK *nAtomNumber, AT_RANK nMaxAtRank );
100
+ void SortNeighListsBySymmAndCanonRank( int num_atoms, NEIGH_LIST *NeighList, const AT_RANK *nSymmRank, const AT_RANK *nCanonRank );
101
+ int SortNeighLists2( int num_atoms, AT_RANK *nRank, NEIGH_LIST *NeighList, AT_RANK *nAtomNumber );
102
+ int DifferentiateRanks2( int num_atoms, NEIGH_LIST *NeighList,
103
+ int nNumCurrRanks, AT_RANK *pnCurrRank, AT_RANK *pnPrevRank,
104
+ AT_RANK *nAtomNumber, long *lNumIter, int bUseAltSort );
105
+
106
+ int DifferentiateRanks3( int num_atoms, NEIGH_LIST *NeighList,
107
+ int nNumCurrRanks, AT_RANK *pnCurrRank, AT_RANK *pnPrevRank,
108
+ AT_RANK *nAtomNumber, long *lNumIter );
109
+ int DifferentiateRanks4( int num_atoms, NEIGH_LIST *NeighList,
110
+ int nNumCurrRanks, AT_RANK *pnCurrRank, AT_RANK *pnPrevRank,
111
+ AT_RANK *nAtomNumber, AT_RANK nMaxAtRank, long *lNumIter );
112
+ int DifferentiateRanksBasic( int num_atoms, NEIGH_LIST *NeighList,
113
+ int nNumCurrRanks, AT_RANK *pnCurrRank, AT_RANK *pnPrevRank,
114
+ AT_RANK *nAtomNumber, long *lNumIter, int bUseAltSort );
115
+
116
+ int parity_of_mapped_atom2( int from_at, int to_at, const sp_ATOM *at, EQ_NEIGH *pEN,
117
+ const AT_RANK *nCanonRankFrom, const AT_RANK *nRankFrom, const AT_RANK *nRankTo );
118
+
119
+ int parity_of_mapped_half_bond( int from_at, int to_at, int from_neigh, int to_neigh,
120
+ sp_ATOM *at, EQ_NEIGH *pEN,
121
+ const AT_RANK *nCanonRankFrom, const AT_RANK *nRankFrom, const AT_RANK *nRankTo );
122
+
123
+ int HalfStereoBondParity( sp_ATOM *at, int at_no1, int i_sb_neigh, const AT_RANK *nRank );
124
+
125
+ int NumberOfTies( AT_RANK **pRankStack1, AT_RANK **pRankStack2, int length, int at_no1, int at_no2, AT_RANK *nNewRank, int *bAddStack, int *bMapped1 );
126
+
127
+ int map_an_atom2( int num_atoms, int num_max, int at_no1/*from*/, int at_no2/*to*/,
128
+ AT_RANK *nTempRank,
129
+ int nNumMappedRanks, int *pnNewNumMappedRanks,
130
+ CANON_STAT *pCS,
131
+ NEIGH_LIST *NeighList,
132
+ AT_RANK **pRankStack1, AT_RANK **pRankStack2, int *bAddStack );
133
+ int ClearPreviousMappings( AT_RANK **pRankStack1 );
134
+
135
+ int SetOneStereoBondIllDefParity( sp_ATOM *at, int jc, /* atom number*/ int k /* stereo bond ord. number*/, int new_parity );
136
+ int RemoveOneStereoBond( sp_ATOM *at, int jc, /* atom number*/ int k /* stereo bond number*/ );
137
+ int RemoveOneStereoCenter( sp_ATOM *at, int jc /* atom number*/ );
138
+ int RemoveCalculatedNonStereo( sp_ATOM *at, int num_atoms, int num_at_tg,
139
+ AT_RANK **pRankStack1, AT_RANK **pRankStack2, AT_RANK *nTempRank, NEIGH_LIST *NeighList,
140
+ const AT_RANK *nSymmRank, AT_RANK *nCanonRank, AT_RANK *nAtomNumberCanon, CANON_STAT *pCS );
141
+
142
+
143
+ int might_change_other_atom_parity( sp_ATOM *at, int num_atoms, int at_no, AT_RANK *nRank2, AT_RANK *nRank1 );
144
+
145
+ int map_stereo_bonds4 (
146
+ sp_ATOM *at, int num_atoms, int num_at_tg, int num_max, int bAllene,
147
+ const AT_RANK *nCanonRankFrom, const AT_RANK *nAtomNumberCanonFrom, /* non-stereo canon ranking */
148
+ AT_RANK *nCanonRankTo, /* output canonical numbering*/
149
+ const AT_RANK *nSymmRank, AT_RANK **pRankStack1/*from*/, AT_RANK **pRankStack2/*to*/,
150
+ AT_RANK *nTempRank, int nNumMappedRanksInput,
151
+ AT_RANK *nSymmStereo, NEIGH_LIST *NeighList,
152
+ CANON_STAT *pCS, CUR_TREE *cur_tree, int nNumMappedBonds );
153
+
154
+ int map_stereo_atoms4 (
155
+ sp_ATOM *at, int num_atoms, int num_at_tg, int num_max,
156
+ const AT_RANK *nCanonRankFrom, const AT_RANK *nAtomNumberCanonFrom, AT_RANK *nCanonRankTo, /* canonical numbering to be mapped */
157
+ const AT_RANK *nSymmRank, AT_RANK **pRankStack1/*from*/, AT_RANK **pRankStack2/*to*/,
158
+ AT_RANK *nTempRank, int nNumMappedRanksInput,
159
+ AT_RANK *nSymmStereo, NEIGH_LIST *NeighList,
160
+ CANON_STAT *pCS, CUR_TREE *cur_tree, int nNumMappedAtoms );
161
+
162
+
163
+ int CurTreeAlloc( CUR_TREE *cur_tree, int num_atoms );
164
+ int CurTreeReAlloc( CUR_TREE *cur_tree );
165
+ void CurTreeFree( CUR_TREE *cur_tree );
166
+ int CurTreeAddRank( CUR_TREE *cur_tree, AT_NUMB rank );
167
+ int CurTreeRemoveLastRank( CUR_TREE *cur_tree );
168
+ int CurTreeReplaceLastRank( CUR_TREE *cur_tree, AT_NUMB rank );
169
+ int CurTreeFindTheRankPos( CUR_TREE *cur_tree, AT_NUMB rank );
170
+ int CurTreeGetPos( CUR_TREE *cur_tree );
171
+ int CurTreeSetPos( CUR_TREE *cur_tree, int len );
172
+ int CurTreeAddAtom( CUR_TREE *cur_tree, int at_no );
173
+ int CurTreeRemoveLastAtom( CUR_TREE *cur_tree );
174
+ int CurTreeIsLastRank( CUR_TREE *cur_tree, AT_NUMB rank );
175
+ int CurTreeIsLastAtomEqu( CUR_TREE *cur_tree, int at_no, AT_NUMB *nSymmStereo );
176
+ int CurTreeRemoveIfLastAtom( CUR_TREE *cur_tree, int at_no );
177
+ int CurTreeRemoveLastRankIfNoAtoms( CUR_TREE *cur_tree );
178
+ void CurTreeKeepLastAtomsOnly( CUR_TREE *cur_tree, int tpos, int shift );
179
+
180
+
181
+ void SetUseAtomForStereo( S_CHAR *bAtomUsedForStereo, sp_ATOM *at, int num_atoms );
182
+
183
+ int nJoin2Mcrs( AT_RANK *nEqArray, AT_RANK n1, AT_RANK n2 );
184
+ AT_RANK nGetMcr( AT_RANK *nEqArray, AT_RANK n );
185
+ int bUniqueAtNbrFromMappingRank( AT_RANK **pRankStack, AT_RANK nAtRank, AT_NUMB *nAtNumber );
186
+
187
+ int Next_SB_At_CanonRanks2( AT_RANK *canon_rank1, AT_RANK *canon_rank2, /* canonical numbers */
188
+ AT_RANK *canon_rank1_min, AT_RANK *canon_rank2_min,
189
+ int *bFirstTime, S_CHAR *bAtomUsedForStereo,
190
+ const ppAT_RANK pRankStack1, const ppAT_RANK pRankStack2,
191
+ const AT_RANK *nCanonRankFrom, const AT_RANK *nAtomNumberCanonFrom,
192
+ const sp_ATOM *at, int num_atoms, int bAllene );
193
+
194
+ int Next_SC_At_CanonRank2( AT_RANK *canon_rank1, /* 1st call input: largest canon number mapped so far or 0 */
195
+ /* output: suggested canon. rank > than input if success */
196
+ AT_RANK *canon_rank1_min, /* 1st call:0 next calls: first tried canon. number */
197
+ int *bFirstTime, /* 1 at the time of the 1st call */
198
+ S_CHAR *bAtomUsedForStereo, /* STEREO_AT_MARK if the atom has not been mapped yet */
199
+ const ppAT_RANK pRankStack1, /* mapping ranks/sort order of atoms with canon. numbers (from) */
200
+ const ppAT_RANK pRankStack2, /* mapping ranks/sort order of atoms with stereo (to) */
201
+ const AT_RANK *nAtomNumberCanonFrom, /* sorted order of the canon. numbers */
202
+ int num_atoms );
203
+
204
+ int NextStereoParity2Test( int *stereo_bond_parity, int *sb_parity_calc,
205
+ int nNumBest, int nNumWorse, int nNumUnkn, int nNumUndf, int nNumCalc);
206
+
207
+ int All_SB_Same( AT_RANK canon_rank1, AT_RANK canon_rank2, /* canonical numbers */
208
+ const ppAT_RANK pRankStack1, const ppAT_RANK pRankStack2,
209
+ const AT_RANK *nAtomNumberCanonFrom,
210
+ sp_ATOM *at );
211
+
212
+ int All_SC_Same( AT_RANK canon_rank1, /* canonical number */
213
+ const ppAT_RANK pRankStack1, const ppAT_RANK pRankStack2,
214
+ const AT_RANK *nAtomNumberCanonFrom,
215
+ const sp_ATOM *at );
216
+
217
+
218
+ int CompareLinCtStereoDoubleToValues( AT_STEREO_DBLE *LinearCTStereoDble,
219
+ AT_RANK at_rank_canon1, AT_RANK at_rank_canon2, U_CHAR bond_parity );
220
+
221
+ int CompareLinCtStereoAtomToValues( AT_STEREO_CARB *LinearCTStereoCarb,
222
+ AT_RANK at_rank_canon1, U_CHAR parity );
223
+ int CompareLinCtStereoDble ( AT_STEREO_DBLE *LinearCTStereoDble1, int nLenLinearCTStereoDble1,
224
+ AT_STEREO_DBLE *LinearCTStereoDble2, int nLenLinearCTStereoDble2 );
225
+ int CompareLinCtStereoCarb ( AT_STEREO_CARB *LinearCTStereoCarb1, int nLenLinearCTStereoCarb1,
226
+ AT_STEREO_CARB *LinearCTStereoCarb2, int nLenLinearCTStereoCarb2 );
227
+ int CompareLinCtStereo ( AT_STEREO_DBLE *LinearCTStereoDble1, int nLenLinearCTStereoDble1,
228
+ AT_STEREO_CARB *LinearCTStereoCarb1, int nLenLinearCTStereoCarb1,
229
+ AT_STEREO_DBLE *LinearCTStereoDble2, int nLenLinearCTStereoDble2,
230
+ AT_STEREO_CARB *LinearCTStereoCarb2, int nLenLinearCTStereoCarb2 );
231
+ /***************************************************************************/
232
+ /* ichicans.c */
233
+ int UnmarkNonStereo( sp_ATOM *at, int num_atoms, const AT_RANK *nRank, const AT_RANK *nAtomNumber, int bIsotopic );
234
+ int FillSingleStereoDescriptors(sp_ATOM *at, int i, int num_trans, const AT_RANK *nRank
235
+ , AT_STEREO_CARB *LinearCTStereoCarb, int *nStereoCarbLen, int nMaxStereoCarbLen
236
+ , AT_STEREO_DBLE *LinearCTStereoDble, int *nStereoDbleLen, int nMaxStereoDbleLen
237
+ , int bAllene );
238
+ void SwitchAtomStereoAndIsotopicStereo( sp_ATOM *at, int num_atoms, int *bSwitched );
239
+ void SetCtToIsotopicStereo( CANON_STAT *pCS, CANON_STAT *pCS2 );
240
+ void SetCtToNonIsotopicStereo( CANON_STAT *pCS, CANON_STAT *pCS2 );
241
+ int FillAllStereoDescriptors( sp_ATOM *at, int num_atoms, const AT_RANK *nCanonRank, const AT_RANK *nAtomNumberCanon, CANON_STAT *pCS );
242
+ int FillOutStereoParities( sp_ATOM *at, int num_atoms, const AT_RANK *nCanonRank, const AT_RANK *nAtomNumberCanon,
243
+ const AT_RANK *nRank, const AT_RANK *nAtomNumber, CANON_STAT *pCS, int bIsotopic );
244
+ int InvertStereo( sp_ATOM *at, int num_at_tg,
245
+ AT_RANK *nCanonRank, AT_RANK *nAtomNumberCanon,
246
+ CANON_STAT *pCS, int bInvertLinearCTStereo );
247
+ int find_atoms_with_parity( sp_ATOM *at, S_CHAR *visited, int from_atom, int cur_atom );
248
+ int GetStereoNeighborPos( sp_ATOM *at, int iAt1, int iAt2 );
249
+ int GetStereoBondParity(sp_ATOM *at, int i, int n, AT_RANK *nRank );
250
+ int GetStereoCenterParity(sp_ATOM *at, int i, AT_RANK *nRank );
251
+ int GetPermutationParity( sp_ATOM *at, AT_RANK nAvoidNeighbor, AT_RANK *nCanonRank );
252
+
253
+ #ifndef INCHI_ALL_CPP
254
+ #ifdef __cplusplus
255
+ }
256
+ #endif
257
+ #endif
258
+
259
+
260
+ #endif /* __INCHICOMN_H__ */