├── README.md ├── checkpoints ├── checkpoint ├── network.data-00000-of-00001 ├── network.index └── network.meta ├── data ├── aap9112_Data_File_S1.csv └── heterocycles.csv ├── example ├── 1H │ ├── acqu.par │ ├── data.1d │ ├── nmr_fid.dx │ ├── process.par │ └── spectrum.1d ├── nmr.ipynb └── nmr.py └── simulations ├── .ipynb_checkpoints ├── Heterocycles-checkpoint.ipynb └── Suzuki_miyaura-checkpoint.ipynb ├── Heterocycles.ipynb ├── Simulation_stats.csv ├── Suzuki_miyaura.ipynb ├── __pycache__ ├── nn.cpython-36.pyc └── utils.cpython-36.pyc ├── heterocycles.py ├── nn.py ├── suzuki_miyaura.py └── utils.py /README.md: -------------------------------------------------------------------------------- 1 | ## Controlling an organic synthesis robot with machine learning to search for new reactivity 2 | 3 | ##### Jarosław M. Granda, Liva Donina, Vincenza Dragone, De-Liang Long & Leroy Cronin* 4 | 5 | **Abstract:** 6 | 7 | The discovery of chemical reactions is an inherently unpredictable 8 | and time-consuming process. An attractive alternative is to predict 9 | reactivity, although relevant approaches, such as computer-aided 10 | reaction design, are still in their infancy. Reaction prediction 11 | based on high-level quantum chemical methods is complex, even 12 | for simple molecules. In addition, although machine learning 13 | is powerful for data analysis, its applications in chemistry are 14 | still being developed. Inspired by strategies based on chemists’ 15 | intuition, we propose that a reaction system controlled by a 16 | machine learning algorithm may be able to explore the space of 17 | chemical reactions quickly, especially if trained by an expert. Here 18 | we present an organic synthesis robot that can perform chemical 19 | reactions and analysis faster than they can be performed manually, 20 | as well as predict the reactivity of possible reagent combinations 21 | after conducting a small number of experiments, thus effectively 22 | navigating chemical reaction space. By using machine learning 23 | for decision making, enabled by binary encoding of the chemical 24 | inputs, the reactions can be assessed in real time using nuclear 25 | magnetic resonance and infrared spectroscopy. The machine 26 | learning system was able to predict the reactivity of about 1,000 27 | reaction combinations with accuracy greater than 80 per cent after 28 | considering the outcomes of slightly over 10 per cent of the dataset. 29 | This approach was also used to calculate the reactivity of published 30 | datasets. Further, by using real-time data from our robot, these 31 | predictions were followed up manually by a chemist, leading to the 32 | discovery of four reactions. 33 | 34 | **Links:** 35 | 36 | DOI: [https://doi.org/10.1038/s41586-018-0307-8](https://doi.org/10.1038/s41586-018-0307-8) 37 | 38 | The jupyter notebooks in simulation folder contains the code to run simulations and plot the results from Figure 3 and 4. 39 | 40 | -------------------------------------------------------------------------------- /checkpoints/checkpoint: -------------------------------------------------------------------------------- 1 | model_checkpoint_path: "C:\\Users\\Group.Taketsuru\\Desktop\\reaction_learning\\simulations\\..\\checkpoints\\network" 2 | all_model_checkpoint_paths: "C:\\Users\\Group.Taketsuru\\Desktop\\reaction_learning\\simulations\\..\\checkpoints\\network" 3 | -------------------------------------------------------------------------------- /checkpoints/network.data-00000-of-00001: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/croningp/reaction_learning/927ed4379f6e6db1de1d33f85e851a86f0a01a28/checkpoints/network.data-00000-of-00001 -------------------------------------------------------------------------------- /checkpoints/network.index: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/croningp/reaction_learning/927ed4379f6e6db1de1d33f85e851a86f0a01a28/checkpoints/network.index -------------------------------------------------------------------------------- /checkpoints/network.meta: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/croningp/reaction_learning/927ed4379f6e6db1de1d33f85e851a86f0a01a28/checkpoints/network.meta -------------------------------------------------------------------------------- /data/heterocycles.csv: -------------------------------------------------------------------------------- 1 | Index,Reaction,Reactivity 2 | 0,DMAP_DBU_2aminothiazole,1 3 | 1,DBU_2aminothiazole_phenylacetylchloride,1 4 | 2,itaconicanhydride_DBU_2aminothiazole,1 5 | 3,methylimidazole_DBU_2aminothiazole,1 6 | 4,benzoylcyanide_DBU_2aminothiazole,1 7 | 5,DMAP_DBU_phenylacetylchloride,1 8 | 6,dimethylacetylenedicarboxylate_DBU_2aminothiazole,1 9 | 7,propionaldehyde_DBU_2aminothiazole,1 10 | 8,methylpropiolate_DBU_2aminothiazole,1 11 | 9,itaconicanhydride_DMAP_DBU,1 12 | 10,methylimidazole_DMAP_DBU,1 13 | 11,DBU_2aminothiazole,1 14 | 12,malononitrile_DBU_2aminothiazole,1 15 | 13,nitrosobenzene_DBU_2aminothiazole,1 16 | 14,DMAP_2aminothiazole_phenylacetylchloride,1 17 | 15,trichloroacetonitrile_DBU_2aminothiazole,1 18 | 16,cinnamaldehyde_DBU_2aminothiazole,1 19 | 17,itaconicanhydride_DBU_phenylacetylchloride,1 20 | 18,benzoylcyanide_DMAP_DBU,1 21 | 19,methylacetoacetate_DBU_2aminothiazole,1 22 | 20,methylimidazole_DBU_phenylacetylchloride,1 23 | 21,benzofuroxan_DBU_2aminothiazole,1 24 | 22,itaconicanhydride_DMAP_2aminothiazole,1 25 | 23,methylimidazole_DMAP_2aminothiazole,1 26 | 24,dimethylacetylenedicarboxylate_DMAP_DBU,1 27 | 25,nitromethane_DBU_2aminothiazole,1 28 | 26,methylimidazole_itaconicanhydride_DBU,1 29 | 27,propionaldehyde_DMAP_DBU,1 30 | 28,methylpropiolate_DMAP_DBU,1 31 | 29,benzoylcyanide_DBU_phenylacetylchloride,1 32 | 30,DMAP_DBU,1 33 | 31,malononitrile_DMAP_DBU,1 34 | 32,itaconicanhydride_2aminothiazole_phenylacetylchloride,1 35 | 33,benzoylcyanide_DMAP_2aminothiazole,1 36 | 34,nitrosobenzene_DMAP_DBU,1 37 | 35,methylimidazole_2aminothiazole_phenylacetylchloride,1 38 | 36,dimethylacetylenedicarboxylate_DBU_phenylacetylchloride,1 39 | 37,TosMic_DBU_2aminothiazole,1 40 | 38,trichloroacetonitrile_DMAP_DBU,1 41 | 39,dimethylacetylenedicarboxylate_DMAP_2aminothiazole,1 42 | 40,itaconicanhydride_benzoylcyanide_DBU,1 43 | 41,methylimidazole_benzoylcyanide_DBU,1 44 | 42,cinnamaldehyde_DMAP_DBU,1 45 | 43,propionaldehyde_DBU_phenylacetylchloride,1 46 | 44,methylpropiolate_DBU_phenylacetylchloride,1 47 | 45,DMAP_methylacetoacetate_DBU,1 48 | 46,DBU_phenylacetylchloride,1 49 | 47,methylimidazole_itaconicanhydride_2aminothiazole,1 50 | 48,propionaldehyde_DMAP_2aminothiazole,1 51 | 49,dimethylacetylenedicarboxylate_itaconicanhydride_DBU,1 52 | 50,malononitrile_DBU_phenylacetylchloride,1 53 | 51,benzofuroxan_DMAP_DBU,1 54 | 52,methylimidazole_dimethylacetylenedicarboxylate_DBU,1 55 | 53,methylpropiolate_DMAP_2aminothiazole,1 56 | 54,benzoylcyanide_2aminothiazole_phenylacetylchloride,1 57 | 55,nitrosobenzene_DBU_phenylacetylchloride,1 58 | 56,DMAP_2aminothiazole,1 59 | 57,malononitrile_DMAP_2aminothiazole,1 60 | 58,nitromethane_DMAP_DBU,1 61 | 59,trichloroacetonitrile_DBU_phenylacetylchloride,1 62 | 60,nitrosobenzene_DMAP_2aminothiazole,1 63 | 61,itaconicanhydride_propionaldehyde_DBU,1 64 | 62,methylimidazole_propionaldehyde_DBU,1 65 | 63,methylpropiolate_itaconicanhydride_DBU,1 66 | 64,dimethylacetylenedicarboxylate_2aminothiazole_phenylacetylchloride,1 67 | 65,methylpropiolate_methylimidazole_DBU,1 68 | 66,trichloroacetonitrile_DMAP_2aminothiazole,1 69 | 67,cinnamaldehyde_DBU_phenylacetylchloride,1 70 | 68,itaconicanhydride_DBU,1 71 | 69,methylimidazole_DBU,1 72 | 70,malononitrile_itaconicanhydride_DBU,1 73 | 71,malononitrile_methylimidazole_DBU,1 74 | 72,methylacetoacetate_DBU_phenylacetylchloride,1 75 | 73,itaconicanhydride_benzoylcyanide_2aminothiazole,1 76 | 74,itaconicanhydride_nitrosobenzene_DBU,1 77 | 75,methylimidazole_benzoylcyanide_2aminothiazole,1 78 | 76,methylimidazole_nitrosobenzene_DBU,0 79 | 77,propionaldehyde_2aminothiazole_phenylacetylchloride,1 80 | 78,cinnamaldehyde_DMAP_2aminothiazole,1 81 | 79,dimethylacetylenedicarboxylate_benzoylcyanide_DBU,1 82 | 80,benzofuroxan_DBU_phenylacetylchloride,1 83 | 81,methylpropiolate_2aminothiazole_phenylacetylchloride,1 84 | 82,itaconicanhydride_DMAP_phenylacetylchloride,1 85 | 83,DMAP_methylacetoacetate_2aminothiazole,1 86 | 84,trichloroacetonitrile_itaconicanhydride_DBU,1 87 | 85,methylimidazole_DMAP_phenylacetylchloride,1 88 | 86,trichloroacetonitrile_methylimidazole_DBU,1 89 | 87,DMAP_TosMic_DBU,1 90 | 88,2aminothiazole_phenylacetylchloride,1 91 | 89,dimethylacetylenedicarboxylate_itaconicanhydride_2aminothiazole,1 92 | 90,malononitrile_2aminothiazole_phenylacetylchloride,1 93 | 91,nitromethane_DBU_phenylacetylchloride,1 94 | 92,benzofuroxan_DMAP_2aminothiazole,1 95 | 93,methylimidazole_dimethylacetylenedicarboxylate_2aminothiazole,1 96 | 94,nitrosobenzene_2aminothiazole_phenylacetylchloride,1 97 | 95,itaconicanhydride_cinnamaldehyde_DBU,1 98 | 96,benzoylcyanide_propionaldehyde_DBU,1 99 | 97,methylimidazole_cinnamaldehyde_DBU,1 100 | 98,methylpropiolate_benzoylcyanide_DBU,1 101 | 99,nitromethane_DMAP_2aminothiazole,1 102 | 100,itaconicanhydride_methylacetoacetate_DBU,1 103 | 101,methylimidazole_methylacetoacetate_DBU,1 104 | 102,trichloroacetonitrile_2aminothiazole_phenylacetylchloride,1 105 | 103,benzoylcyanide_DBU,1 106 | 104,itaconicanhydride_propionaldehyde_2aminothiazole,1 107 | 105,malononitrile_benzoylcyanide_DBU,1 108 | 106,benzofuroxan_itaconicanhydride_DBU,1 109 | 107,methylimidazole_propionaldehyde_2aminothiazole,1 110 | 108,methylpropiolate_itaconicanhydride_2aminothiazole,1 111 | 109,benzofuroxan_methylimidazole_DBU,1 112 | 110,dimethylacetylenedicarboxylate_propionaldehyde_DBU,1 113 | 111,methylpropiolate_methylimidazole_2aminothiazole,1 114 | 112,methylpropiolate_dimethylacetylenedicarboxylate_DBU,1 115 | 113,benzoylcyanide_nitrosobenzene_DBU,1 116 | 114,methylimidazole_itaconicanhydride_DMAP,1 117 | 115,cinnamaldehyde_2aminothiazole_phenylacetylchloride,1 118 | 116,itaconicanhydride_2aminothiazole,1 119 | 117,methylimidazole_2aminothiazole,1 120 | 118,malononitrile_itaconicanhydride_2aminothiazole,1 121 | 119,itaconicanhydride_nitromethane_DBU,1 122 | 120,dimethylacetylenedicarboxylate_DBU,1 123 | 121,malononitrile_methylimidazole_2aminothiazole,1 124 | 122,methylimidazole_nitromethane_DBU,1 125 | 123,benzoylcyanide_DMAP_phenylacetylchloride,1 126 | 124,methylacetoacetate_2aminothiazole_phenylacetylchloride,1 127 | 125,malononitrile_dimethylacetylenedicarboxylate_DBU,1 128 | 126,trichloroacetonitrile_benzoylcyanide_DBU,1 129 | 127,itaconicanhydride_nitrosobenzene_2aminothiazole,1 130 | 128,TosMic_DBU_phenylacetylchloride,1 131 | 129,methylimidazole_nitrosobenzene_2aminothiazole,1 132 | 130,dimethylacetylenedicarboxylate_benzoylcyanide_2aminothiazole,1 133 | 131,dimethylacetylenedicarboxylate_nitrosobenzene_DBU,1 134 | 132,benzofuroxan_2aminothiazole_phenylacetylchloride,1 135 | 133,methylpropiolate_propionaldehyde_DBU,1 136 | 134,trichloroacetonitrile_itaconicanhydride_2aminothiazole,1 137 | 135,cinnamaldehyde_benzoylcyanide_DBU,1 138 | 136,trichloroacetonitrile_methylimidazole_2aminothiazole,1 139 | 137,dimethylacetylenedicarboxylate_DMAP_phenylacetylchloride,1 140 | 138,DMAP_TosMic_2aminothiazole,1 141 | 139,trichloroacetonitrile_dimethylacetylenedicarboxylate_DBU,1 142 | 140,propionaldehyde_DBU,1 143 | 141,nitromethane_2aminothiazole_phenylacetylchloride,1 144 | 142,benzoylcyanide_methylacetoacetate_DBU,1 145 | 143,malononitrile_propionaldehyde_DBU,1 146 | 144,methylpropiolate_DBU,1 147 | 145,methylpropiolate_malononitrile_DBU,1 148 | 146,itaconicanhydride_cinnamaldehyde_2aminothiazole,1 149 | 147,benzoylcyanide_propionaldehyde_2aminothiazole,1 150 | 148,propionaldehyde_nitrosobenzene_DBU,1 151 | 149,benzofuroxan_benzoylcyanide_DBU,1 152 | 150,methylimidazole_cinnamaldehyde_2aminothiazole,1 153 | 151,methylpropiolate_benzoylcyanide_2aminothiazole,1 154 | 152,methylpropiolate_nitrosobenzene_DBU,1 155 | 153,dimethylacetylenedicarboxylate_cinnamaldehyde_DBU,1 156 | 154,malononitrile_DBU,1 157 | 155,itaconicanhydride_benzoylcyanide_DMAP,1 158 | 156,itaconicanhydride_methylacetoacetate_2aminothiazole,1 159 | 157,methylimidazole_itaconicanhydride_phenylacetylchloride,1 160 | 158,methylimidazole_benzoylcyanide_DMAP,1 161 | 159,methylimidazole_methylacetoacetate_2aminothiazole,1 162 | 160,propionaldehyde_DMAP_phenylacetylchloride,1 163 | 161,itaconicanhydride_TosMic_DBU,1 164 | 162,dimethylacetylenedicarboxylate_methylacetoacetate_DBU,1 165 | 163,trichloroacetonitrile_propionaldehyde_DBU,1 166 | 164,benzoylcyanide_2aminothiazole,1 167 | 165,nitrosobenzene_DBU,1 168 | 166,methylpropiolate_DMAP_phenylacetylchloride,1 169 | 167,methylimidazole_TosMic_DBU,1 170 | 168,malononitrile_benzoylcyanide_2aminothiazole,1 171 | 169,methylpropiolate_trichloroacetonitrile_DBU,1 172 | 170,malononitrile_nitrosobenzene_DBU,1 173 | 171,benzoylcyanide_nitromethane_DBU,1 174 | 172,benzofuroxan_itaconicanhydride_2aminothiazole,1 175 | 173,benzofuroxan_methylimidazole_2aminothiazole,1 176 | 174,dimethylacetylenedicarboxylate_propionaldehyde_2aminothiazole,1 177 | 175,benzofuroxan_dimethylacetylenedicarboxylate_DBU,1 178 | 176,methylpropiolate_dimethylacetylenedicarboxylate_2aminothiazole,1 179 | 177,benzoylcyanide_nitrosobenzene_2aminothiazole,1 180 | 178,DMAP_phenylacetylchloride,1 181 | 179,trichloroacetonitrile_DBU,1 182 | 180,dimethylacetylenedicarboxylate_itaconicanhydride_DMAP,1 183 | 181,malononitrile_DMAP_phenylacetylchloride,1 184 | 182,cinnamaldehyde_propionaldehyde_DBU,1 185 | 183,malononitrile_trichloroacetonitrile_DBU,1 186 | 184,methylimidazole_dimethylacetylenedicarboxylate_DMAP,1 187 | 185,methylpropiolate_cinnamaldehyde_DBU,1 188 | 186,itaconicanhydride_nitromethane_2aminothiazole,1 189 | 187,dimethylacetylenedicarboxylate_2aminothiazole,1 190 | 188,methylimidazole_nitromethane_2aminothiazole,1 191 | 189,nitrosobenzene_DMAP_phenylacetylchloride,1 192 | 190,malononitrile_dimethylacetylenedicarboxylate_2aminothiazole,1 193 | 191,trichloroacetonitrile_benzoylcyanide_2aminothiazole,1 194 | 192,propionaldehyde_methylacetoacetate_DBU,1 195 | 193,dimethylacetylenedicarboxylate_nitromethane_DBU,1 196 | 194,trichloroacetonitrile_nitrosobenzene_DBU,1 197 | 195,methylpropiolate_methylacetoacetate_DBU,1 198 | 196,TosMic_2aminothiazole_phenylacetylchloride,1 199 | 197,cinnamaldehyde_DBU,1 200 | 198,dimethylacetylenedicarboxylate_nitrosobenzene_2aminothiazole,1 201 | 199,malononitrile_cinnamaldehyde_DBU,1 202 | 200,benzofuroxan_propionaldehyde_DBU,1 203 | 201,methylpropiolate_propionaldehyde_2aminothiazole,1 204 | 202,trichloroacetonitrile_DMAP_phenylacetylchloride,1 205 | 203,methylpropiolate_benzofuroxan_DBU,1 206 | 204,methylacetoacetate_DBU,1 207 | 205,itaconicanhydride_propionaldehyde_DMAP,1 208 | 206,cinnamaldehyde_benzoylcyanide_2aminothiazole,1 209 | 207,cinnamaldehyde_nitrosobenzene_DBU,1 210 | 208,malononitrile_methylacetoacetate_DBU,1 211 | 209,methylimidazole_propionaldehyde_DMAP,1 212 | 210,methylpropiolate_itaconicanhydride_DMAP,1 213 | 211,trichloroacetonitrile_dimethylacetylenedicarboxylate_2aminothiazole,1 214 | 212,propionaldehyde_2aminothiazole,1 215 | 213,benzofuroxan_DBU,1 216 | 214,methylpropiolate_methylimidazole_DMAP,1 217 | 215,itaconicanhydride_benzoylcyanide_phenylacetylchloride,1 218 | 216,malononitrile_propionaldehyde_2aminothiazole,1 219 | 217,benzoylcyanide_methylacetoacetate_2aminothiazole,1 220 | 218,nitrosobenzene_methylacetoacetate_DBU,1 221 | 219,methylpropiolate_2aminothiazole,1 222 | 220,nitromethane_propionaldehyde_DBU,1 223 | 221,malononitrile_benzofuroxan_DBU,1 224 | 222,methylimidazole_benzoylcyanide_phenylacetylchloride,1 225 | 223,methylpropiolate_malononitrile_2aminothiazole,1 226 | 224,cinnamaldehyde_DMAP_phenylacetylchloride,1 227 | 225,methylpropiolate_nitromethane_DBU,1 228 | 226,itaconicanhydride_DMAP,1 229 | 227,benzoylcyanide_TosMic_DBU,1 230 | 228,trichloroacetonitrile_cinnamaldehyde_DBU,1 231 | 229,methylimidazole_DMAP,0 232 | 230,malononitrile_itaconicanhydride_DMAP,1 233 | 231,propionaldehyde_nitrosobenzene_2aminothiazole,0 234 | 232,benzofuroxan_benzoylcyanide_2aminothiazole,1 235 | 233,benzofuroxan_nitrosobenzene_DBU,0 236 | 234,malononitrile_methylimidazole_DMAP,1 237 | 235,methylpropiolate_nitrosobenzene_2aminothiazole,1 238 | 236,DMAP_methylacetoacetate_phenylacetylchloride,1 239 | 237,dimethylacetylenedicarboxylate_cinnamaldehyde_2aminothiazole,1 240 | 238,trichloroacetonitrile_methylacetoacetate_DBU,1 241 | 239,malononitrile_2aminothiazole,1 242 | 240,nitromethane_DBU,1 243 | 241,itaconicanhydride_nitrosobenzene_DMAP,1 244 | 242,malononitrile_nitromethane_DBU,1 245 | 243,methylimidazole_nitrosobenzene_DMAP,0 246 | 244,dimethylacetylenedicarboxylate_itaconicanhydride_phenylacetylchloride,0 247 | 245,itaconicanhydride_TosMic_2aminothiazole,1 248 | 246,dimethylacetylenedicarboxylate_benzoylcyanide_DMAP,1 249 | 247,dimethylacetylenedicarboxylate_methylacetoacetate_2aminothiazole,1 250 | 248,trichloroacetonitrile_propionaldehyde_2aminothiazole,1 251 | 249,benzofuroxan_DMAP_phenylacetylchloride,1 252 | 250,nitrosobenzene_2aminothiazole,1 253 | 251,benzofuroxan_trichloroacetonitrile_DBU,1 254 | 252,methylimidazole_dimethylacetylenedicarboxylate_phenylacetylchloride,1 255 | 253,methylimidazole_TosMic_2aminothiazole,0 256 | 254,methylpropiolate_trichloroacetonitrile_2aminothiazole,1 257 | 255,malononitrile_nitrosobenzene_2aminothiazole,1 258 | 256,benzoylcyanide_nitromethane_2aminothiazole,1 259 | 257,nitromethane_nitrosobenzene_DBU,1 260 | 258,dimethylacetylenedicarboxylate_TosMic_DBU,1 261 | 259,trichloroacetonitrile_itaconicanhydride_DMAP,1 262 | 260,cinnamaldehyde_methylacetoacetate_DBU,1 263 | 261,benzofuroxan_dimethylacetylenedicarboxylate_2aminothiazole,1 264 | 262,trichloroacetonitrile_methylimidazole_DMAP,0 265 | 263,trichloroacetonitrile_2aminothiazole,1 266 | 264,cinnamaldehyde_propionaldehyde_2aminothiazole,1 267 | 265,nitromethane_DMAP_phenylacetylchloride,1 268 | 266,malononitrile_trichloroacetonitrile_2aminothiazole,1 269 | 267,trichloroacetonitrile_nitromethane_DBU,1 270 | 268,benzofuroxan_cinnamaldehyde_DBU,1 271 | 269,methylpropiolate_cinnamaldehyde_2aminothiazole,1 272 | 270,methylimidazole_itaconicanhydride_benzoylcyanide,1 273 | 271,itaconicanhydride_cinnamaldehyde_DMAP,1 274 | 272,itaconicanhydride_propionaldehyde_phenylacetylchloride,1 275 | 273,benzoylcyanide_propionaldehyde_DMAP,1 276 | 274,propionaldehyde_methylacetoacetate_2aminothiazole,1 277 | 275,dimethylacetylenedicarboxylate_nitromethane_2aminothiazole,1 278 | 276,trichloroacetonitrile_nitrosobenzene_2aminothiazole,0 279 | 277,benzofuroxan_methylacetoacetate_DBU,1 280 | 278,methylimidazole_cinnamaldehyde_DMAP,0 281 | 279,methylimidazole_propionaldehyde_phenylacetylchloride,1 282 | 280,methylpropiolate_itaconicanhydride_phenylacetylchloride,0 283 | 281,methylpropiolate_benzoylcyanide_DMAP,1 284 | 282,methylpropiolate_methylacetoacetate_2aminothiazole,1 285 | 283,propionaldehyde_TosMic_DBU,1 286 | 284,cinnamaldehyde_2aminothiazole,1 287 | 285,methylpropiolate_methylimidazole_phenylacetylchloride,1 288 | 286,itaconicanhydride_DMAP_methylacetoacetate,1 289 | 287,malononitrile_cinnamaldehyde_2aminothiazole,1 290 | 288,methylpropiolate_TosMic_DBU,1 291 | 289,cinnamaldehyde_nitromethane_DBU,0 292 | 290,benzofuroxan_propionaldehyde_2aminothiazole,1 293 | 291,methylimidazole_DMAP_methylacetoacetate,0 294 | 292,itaconicanhydride_phenylacetylchloride,1 295 | 293,methylpropiolate_benzofuroxan_2aminothiazole,1 296 | 294,benzoylcyanide_DMAP,1 297 | 295,methylacetoacetate_2aminothiazole,1 298 | 296,methylimidazole_phenylacetylchloride,1 299 | 297,malononitrile_itaconicanhydride_phenylacetylchloride,0 300 | 298,malononitrile_benzoylcyanide_DMAP,1 301 | 299,cinnamaldehyde_nitrosobenzene_2aminothiazole,0 302 | 300,malononitrile_methylacetoacetate_2aminothiazole,1 303 | 301,benzofuroxan_itaconicanhydride_DMAP,1 304 | 302,nitromethane_methylacetoacetate_DBU,1 305 | 303,TosMic_DBU,1 306 | 304,methylimidazole_dimethylacetylenedicarboxylate_itaconicanhydride,1 307 | 305,malononitrile_methylimidazole_phenylacetylchloride,1 308 | 306,benzofuroxan_methylimidazole_DMAP,0 309 | 307,dimethylacetylenedicarboxylate_propionaldehyde_DMAP,1 310 | 308,malononitrile_TosMic_DBU,1 311 | 309,benzofuroxan_2aminothiazole,1 312 | 310,methylpropiolate_dimethylacetylenedicarboxylate_DMAP,1 313 | 311,itaconicanhydride_nitrosobenzene_phenylacetylchloride,1 314 | 312,benzoylcyanide_nitrosobenzene_DMAP,1 315 | 313,nitrosobenzene_methylacetoacetate_2aminothiazole,0 316 | 314,nitromethane_propionaldehyde_2aminothiazole,1 317 | 315,malononitrile_benzofuroxan_2aminothiazole,1 318 | 316,benzofuroxan_nitromethane_DBU,1 319 | 317,methylimidazole_nitrosobenzene_phenylacetylchloride,1 320 | 318,methylpropiolate_nitromethane_2aminothiazole,1 321 | 319,dimethylacetylenedicarboxylate_benzoylcyanide_phenylacetylchloride,0 322 | 320,trichloroacetonitrile_cinnamaldehyde_2aminothiazole,1 323 | 321,benzoylcyanide_TosMic_2aminothiazole,1 324 | 322,nitrosobenzene_TosMic_DBU,1 325 | 323,itaconicanhydride_nitromethane_DMAP,1 326 | 324,dimethylacetylenedicarboxylate_DMAP,1 327 | 325,benzofuroxan_nitrosobenzene_2aminothiazole,0 328 | 326,methylimidazole_nitromethane_DMAP,0 329 | 327,trichloroacetonitrile_itaconicanhydride_phenylacetylchloride,0 330 | 328,malononitrile_dimethylacetylenedicarboxylate_DMAP,1 331 | 329,trichloroacetonitrile_benzoylcyanide_DMAP,1 332 | 330,trichloroacetonitrile_methylacetoacetate_2aminothiazole,1 333 | 331,nitromethane_2aminothiazole,1 334 | 332,trichloroacetonitrile_methylimidazole_phenylacetylchloride,1 335 | 333,DMAP_TosMic_phenylacetylchloride,1 336 | 334,malononitrile_nitromethane_2aminothiazole,1 337 | 335,trichloroacetonitrile_TosMic_DBU,1 338 | 336,methylimidazole_itaconicanhydride_propionaldehyde,1 339 | 337,dimethylacetylenedicarboxylate_nitrosobenzene_DMAP,1 340 | 338,benzofuroxan_trichloroacetonitrile_2aminothiazole,1 341 | 339,methylpropiolate_methylimidazole_itaconicanhydride,1 342 | 340,methylpropiolate_propionaldehyde_DMAP,1 343 | 341,nitromethane_nitrosobenzene_2aminothiazole,0 344 | 342,dimethylacetylenedicarboxylate_TosMic_2aminothiazole,1 345 | 343,itaconicanhydride_cinnamaldehyde_phenylacetylchloride,1 346 | 344,cinnamaldehyde_benzoylcyanide_DMAP,1 347 | 345,cinnamaldehyde_methylacetoacetate_2aminothiazole,1 348 | 346,benzoylcyanide_propionaldehyde_phenylacetylchloride,1 349 | 347,methylimidazole_cinnamaldehyde_phenylacetylchloride,0 350 | 348,methylimidazole_itaconicanhydride,1 351 | 349,methylpropiolate_benzoylcyanide_phenylacetylchloride,1 352 | 350,trichloroacetonitrile_dimethylacetylenedicarboxylate_DMAP,1 353 | 351,cinnamaldehyde_TosMic_DBU,1 354 | 352,propionaldehyde_DMAP,0 355 | 353,malononitrile_methylimidazole_itaconicanhydride,1 356 | 354,itaconicanhydride_methylacetoacetate_phenylacetylchloride,0 357 | 355,benzoylcyanide_DMAP_methylacetoacetate,1 358 | 356,malononitrile_propionaldehyde_DMAP,1 359 | 357,methylpropiolate_DMAP,1 360 | 358,trichloroacetonitrile_nitromethane_2aminothiazole,1 361 | 359,benzofuroxan_cinnamaldehyde_2aminothiazole,0 362 | 360,methylimidazole_methylacetoacetate_phenylacetylchloride,1 363 | 361,methylpropiolate_malononitrile_DMAP,1 364 | 362,TosMic_methylacetoacetate_DBU,1 365 | 363,benzoylcyanide_phenylacetylchloride,1 366 | 364,methylimidazole_itaconicanhydride_nitrosobenzene,1 367 | 365,dimethylacetylenedicarboxylate_itaconicanhydride_benzoylcyanide,0 368 | 366,propionaldehyde_nitrosobenzene_DMAP,0 369 | 367,malononitrile_benzoylcyanide_phenylacetylchloride,1 370 | 368,benzofuroxan_itaconicanhydride_phenylacetylchloride,0 371 | 369,benzofuroxan_benzoylcyanide_DMAP,1 372 | 370,benzofuroxan_methylacetoacetate_2aminothiazole,1 373 | 371,methylimidazole_dimethylacetylenedicarboxylate_benzoylcyanide,1 374 | 372,methylpropiolate_nitrosobenzene_DMAP,1 375 | 373,benzofuroxan_methylimidazole_phenylacetylchloride,1 376 | 374,dimethylacetylenedicarboxylate_cinnamaldehyde_DMAP,1 377 | 375,dimethylacetylenedicarboxylate_propionaldehyde_phenylacetylchloride,1 378 | 376,propionaldehyde_TosMic_2aminothiazole,0 379 | 377,malononitrile_DMAP,0 380 | 378,benzofuroxan_TosMic_DBU,1 381 | 379,methylpropiolate_dimethylacetylenedicarboxylate_phenylacetylchloride,0 382 | 380,methylpropiolate_TosMic_2aminothiazole,0 383 | 381,benzoylcyanide_nitrosobenzene_phenylacetylchloride,1 384 | 382,cinnamaldehyde_nitromethane_2aminothiazole,0 385 | 383,trichloroacetonitrile_methylimidazole_itaconicanhydride,1 386 | 384,itaconicanhydride_DMAP_TosMic,1 387 | 385,dimethylacetylenedicarboxylate_DMAP_methylacetoacetate,1 388 | 386,trichloroacetonitrile_propionaldehyde_DMAP,0 389 | 387,nitrosobenzene_DMAP,0 390 | 388,methylimidazole_DMAP_TosMic,0 391 | 389,methylpropiolate_trichloroacetonitrile_DMAP,1 392 | 390,itaconicanhydride_nitromethane_phenylacetylchloride,0 393 | 391,malononitrile_nitrosobenzene_DMAP,0 394 | 392,benzoylcyanide_nitromethane_DMAP,0 395 | 393,nitromethane_methylacetoacetate_2aminothiazole,0 396 | 394,dimethylacetylenedicarboxylate_phenylacetylchloride,0 397 | 395,TosMic_2aminothiazole,0 398 | 396,methylimidazole_nitromethane_phenylacetylchloride,0 399 | 397,malononitrile_dimethylacetylenedicarboxylate_phenylacetylchloride,0 400 | 398,trichloroacetonitrile_benzoylcyanide_phenylacetylchloride,0 401 | 399,malononitrile_TosMic_2aminothiazole,0 402 | 400,nitromethane_TosMic_DBU,1 403 | 401,benzofuroxan_dimethylacetylenedicarboxylate_DMAP,1 404 | 402,itaconicanhydride_benzoylcyanide_propionaldehyde,1 405 | 403,trichloroacetonitrile_DMAP,0 406 | 404,benzofuroxan_nitromethane_2aminothiazole,1 407 | 405,methylimidazole_itaconicanhydride_cinnamaldehyde,1 408 | 406,methylimidazole_benzoylcyanide_propionaldehyde,1 409 | 407,methylpropiolate_itaconicanhydride_benzoylcyanide,0 410 | 408,cinnamaldehyde_propionaldehyde_DMAP,0 411 | 409,dimethylacetylenedicarboxylate_nitrosobenzene_phenylacetylchloride,1 412 | 410,malononitrile_trichloroacetonitrile_DMAP,1 413 | 411,nitrosobenzene_TosMic_2aminothiazole,0 414 | 412,methylpropiolate_methylimidazole_benzoylcyanide,0 415 | 413,methylpropiolate_cinnamaldehyde_DMAP,1 416 | 414,methylpropiolate_propionaldehyde_phenylacetylchloride,1 417 | 415,methylimidazole_itaconicanhydride_methylacetoacetate,1 418 | 416,propionaldehyde_DMAP_methylacetoacetate,1 419 | 417,cinnamaldehyde_benzoylcyanide_phenylacetylchloride,1 420 | 418,dimethylacetylenedicarboxylate_nitromethane_DMAP,1 421 | 419,trichloroacetonitrile_nitrosobenzene_DMAP,0 422 | 420,itaconicanhydride_benzoylcyanide,1 423 | 421,methylpropiolate_DMAP_methylacetoacetate,1 424 | 422,methylimidazole_benzoylcyanide,1 425 | 423,malononitrile_itaconicanhydride_benzoylcyanide,0 426 | 424,trichloroacetonitrile_dimethylacetylenedicarboxylate_phenylacetylchloride,0 427 | 425,cinnamaldehyde_DMAP,0 428 | 426,trichloroacetonitrile_TosMic_2aminothiazole,0 429 | 427,propionaldehyde_phenylacetylchloride,1 430 | 428,malononitrile_methylimidazole_benzoylcyanide,1 431 | 429,benzofuroxan_methylimidazole_itaconicanhydride,1 432 | 430,dimethylacetylenedicarboxylate_itaconicanhydride_propionaldehyde,0 433 | 431,malononitrile_cinnamaldehyde_DMAP,1 434 | 432,malononitrile_propionaldehyde_phenylacetylchloride,1 435 | 433,benzoylcyanide_methylacetoacetate_phenylacetylchloride,0 436 | 434,methylpropiolate_phenylacetylchloride,0 437 | 435,benzofuroxan_propionaldehyde_DMAP,0 438 | 436,methylimidazole_dimethylacetylenedicarboxylate_propionaldehyde,1 439 | 437,methylpropiolate_dimethylacetylenedicarboxylate_itaconicanhydride,0 440 | 438,itaconicanhydride_benzoylcyanide_nitrosobenzene,1 441 | 439,methylpropiolate_malononitrile_phenylacetylchloride,0 442 | 440,methylpropiolate_benzofuroxan_DMAP,1 443 | 441,DMAP_methylacetoacetate,0 444 | 442,methylpropiolate_methylimidazole_dimethylacetylenedicarboxylate,1 445 | 443,methylimidazole_benzoylcyanide_nitrosobenzene,0 446 | 444,malononitrile_DMAP_methylacetoacetate,1 447 | 445,cinnamaldehyde_nitrosobenzene_DMAP,0 448 | 446,propionaldehyde_nitrosobenzene_phenylacetylchloride,1 449 | 447,benzofuroxan_benzoylcyanide_phenylacetylchloride,0 450 | 448,methylpropiolate_nitrosobenzene_phenylacetylchloride,1 451 | 449,dimethylacetylenedicarboxylate_cinnamaldehyde_phenylacetylchloride,0 452 | 450,cinnamaldehyde_TosMic_2aminothiazole,0 453 | 451,dimethylacetylenedicarboxylate_itaconicanhydride,1 454 | 452,malononitrile_phenylacetylchloride,0 455 | 453,benzofuroxan_DMAP,0 456 | 454,methylimidazole_itaconicanhydride_nitromethane,1 457 | 455,methylimidazole_dimethylacetylenedicarboxylate,1 458 | 456,malononitrile_dimethylacetylenedicarboxylate_itaconicanhydride,0 459 | 457,nitrosobenzene_DMAP_methylacetoacetate,0 460 | 458,trichloroacetonitrile_itaconicanhydride_benzoylcyanide,1 461 | 459,nitromethane_propionaldehyde_DMAP,1 462 | 460,malononitrile_benzofuroxan_DMAP,1 463 | 461,malononitrile_methylimidazole_dimethylacetylenedicarboxylate,1 464 | 462,trichloroacetonitrile_methylimidazole_benzoylcyanide,1 465 | 463,methylpropiolate_nitromethane_DMAP,1 466 | 464,itaconicanhydride_TosMic_phenylacetylchloride,0 467 | 465,dimethylacetylenedicarboxylate_methylacetoacetate_phenylacetylchloride,0 468 | 466,trichloroacetonitrile_cinnamaldehyde_DMAP,0 469 | 467,benzoylcyanide_DMAP_TosMic,1 470 | 468,TosMic_methylacetoacetate_2aminothiazole,0 471 | 469,trichloroacetonitrile_propionaldehyde_phenylacetylchloride,1 472 | 470,nitrosobenzene_phenylacetylchloride,1 473 | 471,methylimidazole_TosMic_phenylacetylchloride,0 474 | 472,dimethylacetylenedicarboxylate_itaconicanhydride_nitrosobenzene,1 475 | 473,methylpropiolate_trichloroacetonitrile_phenylacetylchloride,0 476 | 474,malononitrile_nitrosobenzene_phenylacetylchloride,1 477 | 475,benzoylcyanide_nitromethane_phenylacetylchloride,0 478 | 476,benzofuroxan_nitrosobenzene_DMAP,0 479 | 477,methylimidazole_dimethylacetylenedicarboxylate_nitrosobenzene,1 480 | 478,methylpropiolate_itaconicanhydride_propionaldehyde,0 481 | 479,trichloroacetonitrile_DMAP_methylacetoacetate,1 482 | 480,nitromethane_DMAP,0 483 | 481,benzofuroxan_dimethylacetylenedicarboxylate_phenylacetylchloride,0 484 | 482,benzofuroxan_TosMic_2aminothiazole,0 485 | 483,methylpropiolate_methylimidazole_propionaldehyde,0 486 | 484,itaconicanhydride_cinnamaldehyde_benzoylcyanide,0 487 | 485,malononitrile_nitromethane_DMAP,0 488 | 486,trichloroacetonitrile_phenylacetylchloride,1 489 | 487,methylimidazole_cinnamaldehyde_benzoylcyanide,0 490 | 488,cinnamaldehyde_propionaldehyde_phenylacetylchloride,1 491 | 489,trichloroacetonitrile_dimethylacetylenedicarboxylate_itaconicanhydride,0 492 | 490,malononitrile_trichloroacetonitrile_phenylacetylchloride,0 493 | 491,itaconicanhydride_propionaldehyde,1 494 | 492,benzofuroxan_trichloroacetonitrile_DMAP,0 495 | 493,trichloroacetonitrile_methylimidazole_dimethylacetylenedicarboxylate,1 496 | 494,methylpropiolate_cinnamaldehyde_phenylacetylchloride,1 497 | 495,itaconicanhydride_benzoylcyanide_methylacetoacetate,0 498 | 496,methylimidazole_propionaldehyde,1 499 | 497,malononitrile_itaconicanhydride_propionaldehyde,0 500 | 498,methylpropiolate_itaconicanhydride,1 501 | 499,nitromethane_nitrosobenzene_DMAP,0 502 | 500,dimethylacetylenedicarboxylate_DMAP_TosMic,0 503 | 501,methylimidazole_benzoylcyanide_methylacetoacetate,1 504 | 502,malononitrile_methylimidazole_propionaldehyde,1 505 | 503,methylpropiolate_methylimidazole,1 506 | 504,methylpropiolate_malononitrile_itaconicanhydride,0 507 | 505,cinnamaldehyde_DMAP_methylacetoacetate,0 508 | 506,propionaldehyde_methylacetoacetate_phenylacetylchloride,1 509 | 507,dimethylacetylenedicarboxylate_nitromethane_phenylacetylchloride,0 510 | 508,trichloroacetonitrile_nitrosobenzene_phenylacetylchloride,1 511 | 509,nitromethane_TosMic_2aminothiazole,0 512 | 510,methylpropiolate_malononitrile_methylimidazole,0 513 | 511,methylpropiolate_methylacetoacetate_phenylacetylchloride,0 514 | 512,itaconicanhydride_propionaldehyde_nitrosobenzene,1 515 | 513,benzofuroxan_itaconicanhydride_benzoylcyanide,1 516 | 514,cinnamaldehyde_phenylacetylchloride,1 517 | 515,methylimidazole_propionaldehyde_nitrosobenzene,0 518 | 516,methylpropiolate_itaconicanhydride_nitrosobenzene,1 519 | 517,dimethylacetylenedicarboxylate_itaconicanhydride_cinnamaldehyde,0 520 | 518,benzofuroxan_methylimidazole_benzoylcyanide,0 521 | 519,malononitrile_cinnamaldehyde_phenylacetylchloride,1 522 | 520,dimethylacetylenedicarboxylate_benzoylcyanide_propionaldehyde,0 523 | 521,trichloroacetonitrile_nitromethane_DMAP,1 524 | 522,malononitrile_itaconicanhydride,0 525 | 523,benzofuroxan_cinnamaldehyde_DMAP,0 526 | 524,benzofuroxan_propionaldehyde_phenylacetylchloride,0 527 | 525,methylpropiolate_methylimidazole_nitrosobenzene,0 528 | 526,methylimidazole_dimethylacetylenedicarboxylate_cinnamaldehyde,0 529 | 527,methylpropiolate_dimethylacetylenedicarboxylate_benzoylcyanide,1 530 | 528,malononitrile_methylimidazole,1 531 | 529,methylpropiolate_benzofuroxan_phenylacetylchloride,0 532 | 530,methylacetoacetate_phenylacetylchloride,0 533 | 531,dimethylacetylenedicarboxylate_itaconicanhydride_methylacetoacetate,0 534 | 532,malononitrile_methylacetoacetate_phenylacetylchloride,0 535 | 533,cinnamaldehyde_nitrosobenzene_phenylacetylchloride,1 536 | 534,trichloroacetonitrile_itaconicanhydride_propionaldehyde,0 537 | 535,itaconicanhydride_nitrosobenzene,1 538 | 536,benzofuroxan_DMAP_methylacetoacetate,0 539 | 537,methylimidazole_itaconicanhydride_TosMic,0 540 | 538,methylimidazole_dimethylacetylenedicarboxylate_methylacetoacetate,1 541 | 539,trichloroacetonitrile_methylimidazole_propionaldehyde,0 542 | 540,methylpropiolate_trichloroacetonitrile_itaconicanhydride,0 543 | 541,methylimidazole_nitrosobenzene,0 544 | 542,malononitrile_itaconicanhydride_nitrosobenzene,1 545 | 543,itaconicanhydride_benzoylcyanide_nitromethane,0 546 | 544,propionaldehyde_DMAP_TosMic,0 547 | 545,dimethylacetylenedicarboxylate_benzoylcyanide,1 548 | 546,benzofuroxan_phenylacetylchloride,0 549 | 547,methylpropiolate_trichloroacetonitrile_methylimidazole,0 550 | 548,malononitrile_methylimidazole_nitrosobenzene,0 551 | 549,methylimidazole_benzoylcyanide_nitromethane,0 552 | 550,methylpropiolate_DMAP_TosMic,0 553 | 551,cinnamaldehyde_nitromethane_DMAP,0 554 | 552,nitrosobenzene_methylacetoacetate_phenylacetylchloride,1 555 | 553,malononitrile_dimethylacetylenedicarboxylate_benzoylcyanide,0 556 | 554,nitromethane_propionaldehyde_phenylacetylchloride,0 557 | 555,benzofuroxan_dimethylacetylenedicarboxylate_itaconicanhydride,1 558 | 556,malononitrile_benzofuroxan_phenylacetylchloride,0 559 | 557,methylpropiolate_nitromethane_phenylacetylchloride,0 560 | 558,benzofuroxan_methylimidazole_dimethylacetylenedicarboxylate,1 561 | 559,trichloroacetonitrile_cinnamaldehyde_phenylacetylchloride,1 562 | 560,benzoylcyanide_TosMic_phenylacetylchloride,0 563 | 561,trichloroacetonitrile_itaconicanhydride,0 564 | 562,itaconicanhydride_cinnamaldehyde_propionaldehyde,0 565 | 563,trichloroacetonitrile_methylimidazole,0 566 | 564,malononitrile_trichloroacetonitrile_itaconicanhydride,0 567 | 565,nitromethane_DMAP_methylacetoacetate,0 568 | 566,dimethylacetylenedicarboxylate_benzoylcyanide_nitrosobenzene,0 569 | 567,DMAP_TosMic,0 570 | 568,benzofuroxan_nitrosobenzene_phenylacetylchloride,1 571 | 569,methylimidazole_cinnamaldehyde_propionaldehyde,0 572 | 570,methylpropiolate_itaconicanhydride_cinnamaldehyde,0 573 | 571,malononitrile_trichloroacetonitrile_methylimidazole,1 574 | 572,methylpropiolate_benzoylcyanide_propionaldehyde,1 575 | 573,malononitrile_DMAP_TosMic,0 576 | 574,trichloroacetonitrile_methylacetoacetate_phenylacetylchloride,0 577 | 575,nitromethane_phenylacetylchloride,0 578 | 576,methylpropiolate_methylimidazole_cinnamaldehyde,0 579 | 577,itaconicanhydride_propionaldehyde_methylacetoacetate,0 580 | 578,dimethylacetylenedicarboxylate_itaconicanhydride_nitromethane,0 581 | 579,trichloroacetonitrile_itaconicanhydride_nitrosobenzene,0 582 | 580,malononitrile_nitromethane_phenylacetylchloride,0 583 | 581,benzofuroxan_nitromethane_DMAP,0 584 | 582,methylimidazole_propionaldehyde_methylacetoacetate,0 585 | 583,methylimidazole_dimethylacetylenedicarboxylate_nitromethane,1 586 | 584,trichloroacetonitrile_methylimidazole_nitrosobenzene,0 587 | 585,methylpropiolate_itaconicanhydride_methylacetoacetate,0 588 | 586,nitrosobenzene_DMAP_TosMic,0 589 | 587,trichloroacetonitrile_dimethylacetylenedicarboxylate_benzoylcyanide,0 590 | 588,itaconicanhydride_cinnamaldehyde,0 591 | 589,benzoylcyanide_propionaldehyde,0 592 | 590,benzofuroxan_trichloroacetonitrile_phenylacetylchloride,0 593 | 591,methylpropiolate_methylimidazole_methylacetoacetate,0 594 | 592,methylimidazole_cinnamaldehyde,0 595 | 593,malononitrile_itaconicanhydride_cinnamaldehyde,0 596 | 594,malononitrile_benzoylcyanide_propionaldehyde,0 597 | 595,nitromethane_nitrosobenzene_phenylacetylchloride,1 598 | 596,dimethylacetylenedicarboxylate_TosMic_phenylacetylchloride,0 599 | 597,methylpropiolate_benzoylcyanide,1 600 | 598,benzofuroxan_itaconicanhydride_propionaldehyde,0 601 | 599,malononitrile_methylimidazole_cinnamaldehyde,1 602 | 600,methylpropiolate_malononitrile_benzoylcyanide,0 603 | 601,benzofuroxan_methylimidazole_propionaldehyde,0 604 | 602,cinnamaldehyde_methylacetoacetate_phenylacetylchloride,0 605 | 603,methylpropiolate_benzofuroxan_itaconicanhydride,0 606 | 604,itaconicanhydride_methylacetoacetate,0 607 | 605,methylpropiolate_benzofuroxan_methylimidazole,0 608 | 606,methylpropiolate_dimethylacetylenedicarboxylate_propionaldehyde,0 609 | 607,methylimidazole_methylacetoacetate,0 610 | 608,itaconicanhydride_cinnamaldehyde_nitrosobenzene,1 611 | 609,malononitrile_itaconicanhydride_methylacetoacetate,0 612 | 610,benzoylcyanide_propionaldehyde_nitrosobenzene,0 613 | 611,trichloroacetonitrile_DMAP_TosMic,1 614 | 612,methylimidazole_cinnamaldehyde_nitrosobenzene,0 615 | 613,malononitrile_methylimidazole_methylacetoacetate,0 616 | 614,methylpropiolate_benzoylcyanide_nitrosobenzene,0 617 | 615,dimethylacetylenedicarboxylate_cinnamaldehyde_benzoylcyanide,0 618 | 616,trichloroacetonitrile_nitromethane_phenylacetylchloride,0 619 | 617,malononitrile_benzoylcyanide,0 620 | 618,benzofuroxan_cinnamaldehyde_phenylacetylchloride,1 621 | 619,benzofuroxan_itaconicanhydride,0 622 | 620,itaconicanhydride_nitrosobenzene_methylacetoacetate,1 623 | 621,itaconicanhydride_nitromethane_propionaldehyde,0 624 | 622,malononitrile_benzofuroxan_itaconicanhydride,0 625 | 623,benzofuroxan_methylimidazole,0 626 | 624,dimethylacetylenedicarboxylate_propionaldehyde,0 627 | 625,methylimidazole_nitrosobenzene_methylacetoacetate,0 628 | 626,methylimidazole_nitromethane_propionaldehyde,0 629 | 627,methylpropiolate_itaconicanhydride_nitromethane,0 630 | 628,trichloroacetonitrile_itaconicanhydride_cinnamaldehyde,0 631 | 629,itaconicanhydride_benzoylcyanide_TosMic,0 632 | 630,malononitrile_benzofuroxan_methylimidazole,0 633 | 631,dimethylacetylenedicarboxylate_benzoylcyanide_methylacetoacetate,0 634 | 632,malononitrile_dimethylacetylenedicarboxylate_propionaldehyde,0 635 | 633,trichloroacetonitrile_benzoylcyanide_propionaldehyde,0 636 | 634,methylpropiolate_dimethylacetylenedicarboxylate,0 637 | 635,benzoylcyanide_nitrosobenzene,0 638 | 636,benzofuroxan_methylacetoacetate_phenylacetylchloride,0 639 | 637,methylpropiolate_methylimidazole_nitromethane,0 640 | 638,methylimidazole_benzoylcyanide_TosMic,0 641 | 639,trichloroacetonitrile_methylimidazole_cinnamaldehyde,0 642 | 640,methylpropiolate_malononitrile_dimethylacetylenedicarboxylate,0 643 | 641,methylpropiolate_trichloroacetonitrile_benzoylcyanide,0 644 | 642,cinnamaldehyde_DMAP_TosMic,0 645 | 643,malononitrile_benzoylcyanide_nitrosobenzene,0 646 | 644,propionaldehyde_TosMic_phenylacetylchloride,0 647 | 645,benzofuroxan_itaconicanhydride_nitrosobenzene,1 648 | 646,methylpropiolate_TosMic_phenylacetylchloride,0 649 | 647,trichloroacetonitrile_itaconicanhydride_methylacetoacetate,0 650 | 648,benzofuroxan_methylimidazole_nitrosobenzene,0 651 | 649,dimethylacetylenedicarboxylate_propionaldehyde_nitrosobenzene,0 652 | 650,cinnamaldehyde_nitromethane_phenylacetylchloride,1 653 | 651,itaconicanhydride_nitromethane,0 654 | 652,benzofuroxan_dimethylacetylenedicarboxylate_benzoylcyanide,0 655 | 653,trichloroacetonitrile_methylimidazole_methylacetoacetate,0 656 | 654,methylpropiolate_dimethylacetylenedicarboxylate_nitrosobenzene,0 657 | 655,methylimidazole_nitromethane,0 658 | 656,malononitrile_itaconicanhydride_nitromethane,0 659 | 657,DMAP_TosMic_methylacetoacetate,0 660 | 658,malononitrile_dimethylacetylenedicarboxylate,0 661 | 659,trichloroacetonitrile_benzoylcyanide,0 662 | 660,malononitrile_methylimidazole_nitromethane,0 663 | 661,cinnamaldehyde_benzoylcyanide_propionaldehyde,0 664 | 662,nitromethane_methylacetoacetate_phenylacetylchloride,0 665 | 663,malononitrile_trichloroacetonitrile_benzoylcyanide,0 666 | 664,benzofuroxan_trichloroacetonitrile_itaconicanhydride,0 667 | 665,TosMic_phenylacetylchloride,0 668 | 666,methylpropiolate_cinnamaldehyde_benzoylcyanide,0 669 | 667,itaconicanhydride_nitromethane_nitrosobenzene,1 670 | 668,dimethylacetylenedicarboxylate_itaconicanhydride_TosMic,0 671 | 669,benzofuroxan_trichloroacetonitrile_methylimidazole,0 672 | 670,malononitrile_TosMic_phenylacetylchloride,0 673 | 671,trichloroacetonitrile_dimethylacetylenedicarboxylate_propionaldehyde,0 674 | 672,dimethylacetylenedicarboxylate_nitrosobenzene,0 675 | 673,benzofuroxan_DMAP_TosMic,0 676 | 674,methylimidazole_nitromethane_nitrosobenzene,0 677 | 675,methylimidazole_dimethylacetylenedicarboxylate_TosMic,0 678 | 676,itaconicanhydride_cinnamaldehyde_methylacetoacetate,0 679 | 677,methylpropiolate_trichloroacetonitrile_dimethylacetylenedicarboxylate,0 680 | 678,benzoylcyanide_propionaldehyde_methylacetoacetate,0 681 | 679,malononitrile_dimethylacetylenedicarboxylate_nitrosobenzene,0 682 | 680,dimethylacetylenedicarboxylate_benzoylcyanide_nitromethane,0 683 | 681,trichloroacetonitrile_benzoylcyanide_nitrosobenzene,0 684 | 682,methylpropiolate_propionaldehyde,0 685 | 683,benzofuroxan_nitromethane_phenylacetylchloride,0 686 | 684,methylimidazole_cinnamaldehyde_methylacetoacetate,0 687 | 685,methylpropiolate_benzoylcyanide_methylacetoacetate,0 688 | 686,methylpropiolate_malononitrile_propionaldehyde,0 689 | 687,nitrosobenzene_TosMic_phenylacetylchloride,0 690 | 688,cinnamaldehyde_benzoylcyanide,0 691 | 689,malononitrile_cinnamaldehyde_benzoylcyanide,0 692 | 690,trichloroacetonitrile_itaconicanhydride_nitromethane,0 693 | 691,benzofuroxan_itaconicanhydride_cinnamaldehyde,0 694 | 692,benzofuroxan_benzoylcyanide_propionaldehyde,0 695 | 693,trichloroacetonitrile_dimethylacetylenedicarboxylate,0 696 | 694,trichloroacetonitrile_methylimidazole_nitromethane,0 697 | 695,methylpropiolate_propionaldehyde_nitrosobenzene,0 698 | 696,dimethylacetylenedicarboxylate_cinnamaldehyde_propionaldehyde,0 699 | 697,benzofuroxan_methylimidazole_cinnamaldehyde,0 700 | 698,nitromethane_DMAP_TosMic,0 701 | 699,malononitrile_trichloroacetonitrile_dimethylacetylenedicarboxylate,0 702 | 700,methylpropiolate_benzofuroxan_benzoylcyanide,0 703 | 701,malononitrile_propionaldehyde,0 704 | 702,benzoylcyanide_methylacetoacetate,0 705 | 703,methylpropiolate_dimethylacetylenedicarboxylate_cinnamaldehyde,0 706 | 704,malononitrile_benzoylcyanide_methylacetoacetate,0 707 | 705,cinnamaldehyde_benzoylcyanide_nitrosobenzene,0 708 | 706,trichloroacetonitrile_TosMic_phenylacetylchloride,0 709 | 707,methylpropiolate_malononitrile,0 710 | 708,benzofuroxan_itaconicanhydride_methylacetoacetate,0 711 | 709,itaconicanhydride_propionaldehyde_TosMic,0 712 | 710,benzofuroxan_methylimidazole_methylacetoacetate,0 713 | 711,dimethylacetylenedicarboxylate_propionaldehyde_methylacetoacetate,0 714 | 712,trichloroacetonitrile_dimethylacetylenedicarboxylate_nitrosobenzene,0 715 | 713,propionaldehyde_nitrosobenzene,0 716 | 714,benzofuroxan_benzoylcyanide,0 717 | 715,methylimidazole_propionaldehyde_TosMic,0 718 | 716,methylpropiolate_itaconicanhydride_TosMic,0 719 | 717,methylpropiolate_dimethylacetylenedicarboxylate_methylacetoacetate,0 720 | 718,itaconicanhydride_cinnamaldehyde_nitromethane,0 721 | 719,methylpropiolate_trichloroacetonitrile_propionaldehyde,0 722 | 720,malononitrile_propionaldehyde_nitrosobenzene,0 723 | 721,benzoylcyanide_nitrosobenzene_methylacetoacetate,0 724 | 722,benzoylcyanide_nitromethane_propionaldehyde,0 725 | 723,methylpropiolate_nitrosobenzene,0 726 | 724,dimethylacetylenedicarboxylate_cinnamaldehyde,0 727 | 725,malononitrile_benzofuroxan_benzoylcyanide,0 728 | 726,methylpropiolate_methylimidazole_TosMic,0 729 | 727,methylimidazole_cinnamaldehyde_nitromethane,0 730 | 728,methylpropiolate_malononitrile_nitrosobenzene,0 731 | 729,methylpropiolate_benzoylcyanide_nitromethane,0 732 | 730,malononitrile_dimethylacetylenedicarboxylate_cinnamaldehyde,0 733 | 731,trichloroacetonitrile_cinnamaldehyde_benzoylcyanide,0 734 | 732,benzofuroxan_dimethylacetylenedicarboxylate_propionaldehyde,0 735 | 733,itaconicanhydride_nitromethane_methylacetoacetate,0 736 | 734,cinnamaldehyde_TosMic_phenylacetylchloride,0 737 | 735,methylpropiolate_benzofuroxan_dimethylacetylenedicarboxylate,0 738 | 736,itaconicanhydride_TosMic,0 739 | 737,dimethylacetylenedicarboxylate_methylacetoacetate,0 740 | 738,trichloroacetonitrile_propionaldehyde,0 741 | 739,benzofuroxan_benzoylcyanide_nitrosobenzene,0 742 | 740,methylimidazole_nitromethane_methylacetoacetate,0 743 | 741,methylimidazole_TosMic,0 744 | 742,malononitrile_itaconicanhydride_TosMic,0 745 | 743,malononitrile_dimethylacetylenedicarboxylate_methylacetoacetate,0 746 | 744,dimethylacetylenedicarboxylate_cinnamaldehyde_nitrosobenzene,0 747 | 745,trichloroacetonitrile_benzoylcyanide_methylacetoacetate,0 748 | 746,malononitrile_trichloroacetonitrile_propionaldehyde,0 749 | 747,methylpropiolate_trichloroacetonitrile,0 750 | 748,malononitrile_nitrosobenzene,0 751 | 749,benzoylcyanide_nitromethane,0 752 | 750,malononitrile_methylimidazole_TosMic,0 753 | 751,methylpropiolate_cinnamaldehyde_propionaldehyde,0 754 | 752,methylpropiolate_malononitrile_trichloroacetonitrile,0 755 | 753,TosMic_methylacetoacetate_phenylacetylchloride,0 756 | 754,malononitrile_benzoylcyanide_nitromethane,0 757 | 755,benzofuroxan_itaconicanhydride_nitromethane,0 758 | 756,benzofuroxan_dimethylacetylenedicarboxylate,0 759 | 757,itaconicanhydride_nitrosobenzene_TosMic,0 760 | 758,dimethylacetylenedicarboxylate_nitrosobenzene_methylacetoacetate,0 761 | 759,benzofuroxan_methylimidazole_nitromethane,0 762 | 760,trichloroacetonitrile_propionaldehyde_nitrosobenzene,0 763 | 761,dimethylacetylenedicarboxylate_nitromethane_propionaldehyde,0 764 | 762,malononitrile_benzofuroxan_dimethylacetylenedicarboxylate,0 765 | 763,benzofuroxan_trichloroacetonitrile_benzoylcyanide,0 766 | 764,methylimidazole_nitrosobenzene_TosMic,0 767 | 765,methylpropiolate_propionaldehyde_methylacetoacetate,0 768 | 766,methylpropiolate_dimethylacetylenedicarboxylate_nitromethane,0 769 | 767,methylpropiolate_trichloroacetonitrile_nitrosobenzene,0 770 | 768,trichloroacetonitrile_dimethylacetylenedicarboxylate_cinnamaldehyde,0 771 | 769,dimethylacetylenedicarboxylate_benzoylcyanide_TosMic,0 772 | 770,benzoylcyanide_nitromethane_nitrosobenzene,0 773 | 771,cinnamaldehyde_propionaldehyde,0 774 | 772,malononitrile_trichloroacetonitrile,0 775 | 773,benzofuroxan_TosMic_phenylacetylchloride,0 776 | 774,cinnamaldehyde_benzoylcyanide_methylacetoacetate,0 777 | 775,malononitrile_cinnamaldehyde_propionaldehyde,0 778 | 776,methylpropiolate_cinnamaldehyde,0 779 | 777,benzofuroxan_dimethylacetylenedicarboxylate_nitrosobenzene,0 780 | 778,methylpropiolate_malononitrile_cinnamaldehyde,0 781 | 779,trichloroacetonitrile_itaconicanhydride_TosMic,0 782 | 780,trichloroacetonitrile_dimethylacetylenedicarboxylate_methylacetoacetate,0 783 | 781,methylpropiolate_benzofuroxan_propionaldehyde,0 784 | 782,propionaldehyde_methylacetoacetate,0 785 | 783,trichloroacetonitrile_nitrosobenzene,0 786 | 784,dimethylacetylenedicarboxylate_nitromethane,0 787 | 785,trichloroacetonitrile_methylimidazole_TosMic,1 788 | 786,malononitrile_propionaldehyde_methylacetoacetate,0 789 | 787,cinnamaldehyde_propionaldehyde_nitrosobenzene,0 790 | 788,malononitrile_dimethylacetylenedicarboxylate_nitromethane,0 791 | 789,methylpropiolate_methylacetoacetate,0 792 | 790,malononitrile_trichloroacetonitrile_nitrosobenzene,0 793 | 791,trichloroacetonitrile_benzoylcyanide_nitromethane,0 794 | 792,benzofuroxan_cinnamaldehyde_benzoylcyanide,0 795 | 793,methylpropiolate_cinnamaldehyde_nitrosobenzene,0 796 | 794,methylpropiolate_malononitrile_methylacetoacetate,0 797 | 795,nitromethane_TosMic_phenylacetylchloride,0 798 | 796,malononitrile_cinnamaldehyde,0 799 | 797,benzofuroxan_trichloroacetonitrile_dimethylacetylenedicarboxylate,0 800 | 798,benzofuroxan_propionaldehyde,0 801 | 799,propionaldehyde_nitrosobenzene_methylacetoacetate,0 802 | 800,dimethylacetylenedicarboxylate_nitromethane_nitrosobenzene,0 803 | 801,malononitrile_benzofuroxan_propionaldehyde,0 804 | 802,benzofuroxan_benzoylcyanide_methylacetoacetate,0 805 | 803,methylpropiolate_benzofuroxan,0 806 | 804,methylpropiolate_nitrosobenzene_methylacetoacetate,0 807 | 805,methylpropiolate_nitromethane_propionaldehyde,0 808 | 806,itaconicanhydride_cinnamaldehyde_TosMic,0 809 | 807,dimethylacetylenedicarboxylate_cinnamaldehyde_methylacetoacetate,0 810 | 808,trichloroacetonitrile_cinnamaldehyde_propionaldehyde,0 811 | 809,benzoylcyanide_propionaldehyde_TosMic,0 812 | 810,methylpropiolate_malononitrile_benzofuroxan,0 813 | 811,malononitrile_methylacetoacetate,0 814 | 812,cinnamaldehyde_nitrosobenzene,0 815 | 813,methylimidazole_cinnamaldehyde_TosMic,0 816 | 814,methylpropiolate_trichloroacetonitrile_cinnamaldehyde,0 817 | 815,methylpropiolate_benzoylcyanide_TosMic,0 818 | 816,malononitrile_cinnamaldehyde_nitrosobenzene,0 819 | 817,cinnamaldehyde_benzoylcyanide_nitromethane,0 820 | 818,benzofuroxan_propionaldehyde_nitrosobenzene,0 821 | 819,itaconicanhydride_TosMic_methylacetoacetate,0 822 | 820,trichloroacetonitrile_propionaldehyde_methylacetoacetate,0 823 | 821,trichloroacetonitrile_dimethylacetylenedicarboxylate_nitromethane,0 824 | 822,methylpropiolate_benzofuroxan_nitrosobenzene,0 825 | 823,nitrosobenzene_methylacetoacetate,0 826 | 824,nitromethane_propionaldehyde,0 827 | 825,benzofuroxan_dimethylacetylenedicarboxylate_cinnamaldehyde,0 828 | 826,malononitrile_benzofuroxan,0 829 | 827,methylimidazole_TosMic_methylacetoacetate,0 830 | 828,methylpropiolate_trichloroacetonitrile_methylacetoacetate,0 831 | 829,malononitrile_nitrosobenzene_methylacetoacetate,0 832 | 830,malononitrile_nitromethane_propionaldehyde,0 833 | 831,benzoylcyanide_nitromethane_methylacetoacetate,0 834 | 832,methylpropiolate_nitromethane,0 835 | 833,trichloroacetonitrile_cinnamaldehyde,0 836 | 834,benzoylcyanide_TosMic,0 837 | 835,methylpropiolate_malononitrile_nitromethane,0 838 | 836,malononitrile_trichloroacetonitrile_cinnamaldehyde,0 839 | 837,malononitrile_benzoylcyanide_TosMic,0 840 | 838,benzofuroxan_itaconicanhydride_TosMic,0 841 | 839,benzofuroxan_dimethylacetylenedicarboxylate_methylacetoacetate,0 842 | 840,benzofuroxan_trichloroacetonitrile_propionaldehyde,0 843 | 841,benzofuroxan_nitrosobenzene,0 844 | 842,benzofuroxan_methylimidazole_TosMic,0 845 | 843,nitromethane_propionaldehyde_nitrosobenzene,0 846 | 844,dimethylacetylenedicarboxylate_propionaldehyde_TosMic,0 847 | 845,trichloroacetonitrile_methylacetoacetate,0 848 | 846,methylpropiolate_benzofuroxan_trichloroacetonitrile,0 849 | 847,malononitrile_benzofuroxan_nitrosobenzene,0 850 | 848,benzofuroxan_benzoylcyanide_nitromethane,0 851 | 849,methylpropiolate_nitromethane_nitrosobenzene,0 852 | 850,methylpropiolate_dimethylacetylenedicarboxylate_TosMic,0 853 | 851,cinnamaldehyde_propionaldehyde_methylacetoacetate,0 854 | 852,dimethylacetylenedicarboxylate_cinnamaldehyde_nitromethane,0 855 | 853,trichloroacetonitrile_cinnamaldehyde_nitrosobenzene,0 856 | 854,malononitrile_trichloroacetonitrile_methylacetoacetate,0 857 | 855,benzoylcyanide_nitrosobenzene_TosMic,0 858 | 856,malononitrile_nitromethane,0 859 | 857,methylpropiolate_cinnamaldehyde_methylacetoacetate,0 860 | 858,benzofuroxan_trichloroacetonitrile,0 861 | 859,itaconicanhydride_nitromethane_TosMic,0 862 | 860,trichloroacetonitrile_nitrosobenzene_methylacetoacetate,0 863 | 861,dimethylacetylenedicarboxylate_nitromethane_methylacetoacetate,0 864 | 862,trichloroacetonitrile_nitromethane_propionaldehyde,0 865 | 863,benzofuroxan_cinnamaldehyde_propionaldehyde,0 866 | 864,nitromethane_nitrosobenzene,0 867 | 865,dimethylacetylenedicarboxylate_TosMic,0 868 | 866,malononitrile_benzofuroxan_trichloroacetonitrile,0 869 | 867,methylimidazole_nitromethane_TosMic,0 870 | 868,methylpropiolate_trichloroacetonitrile_nitromethane,0 871 | 869,malononitrile_nitromethane_nitrosobenzene,0 872 | 870,malononitrile_dimethylacetylenedicarboxylate_TosMic,0 873 | 871,trichloroacetonitrile_benzoylcyanide_TosMic,0 874 | 872,methylpropiolate_benzofuroxan_cinnamaldehyde,0 875 | 873,cinnamaldehyde_methylacetoacetate,0 876 | 874,malononitrile_cinnamaldehyde_methylacetoacetate,0 877 | 875,benzofuroxan_propionaldehyde_methylacetoacetate,0 878 | 876,benzofuroxan_dimethylacetylenedicarboxylate_nitromethane,0 879 | 877,benzofuroxan_trichloroacetonitrile_nitrosobenzene,0 880 | 878,dimethylacetylenedicarboxylate_nitrosobenzene_TosMic,0 881 | 879,methylpropiolate_benzofuroxan_methylacetoacetate,0 882 | 880,trichloroacetonitrile_nitromethane,0 883 | 881,benzofuroxan_cinnamaldehyde,0 884 | 882,methylpropiolate_propionaldehyde_TosMic,0 885 | 883,cinnamaldehyde_nitrosobenzene_methylacetoacetate,0 886 | 884,cinnamaldehyde_nitromethane_propionaldehyde,0 887 | 885,malononitrile_trichloroacetonitrile_nitromethane,0 888 | 886,malononitrile_benzofuroxan_cinnamaldehyde,0 889 | 887,methylpropiolate_cinnamaldehyde_nitromethane,0 890 | 888,cinnamaldehyde_benzoylcyanide_TosMic,0 891 | 889,benzofuroxan_methylacetoacetate,0 892 | 890,nitromethane_propionaldehyde_methylacetoacetate,0 893 | 891,trichloroacetonitrile_nitromethane_nitrosobenzene,0 894 | 892,trichloroacetonitrile_dimethylacetylenedicarboxylate_TosMic,0 895 | 893,benzofuroxan_cinnamaldehyde_nitrosobenzene,0 896 | 894,propionaldehyde_TosMic,0 897 | 895,malononitrile_benzofuroxan_methylacetoacetate,0 898 | 896,methylpropiolate_nitromethane_methylacetoacetate,0 899 | 897,trichloroacetonitrile_cinnamaldehyde_methylacetoacetate,0 900 | 898,malononitrile_propionaldehyde_TosMic,0 901 | 899,benzoylcyanide_TosMic_methylacetoacetate,0 902 | 900,methylpropiolate_TosMic,0 903 | 901,cinnamaldehyde_nitromethane,0 904 | 902,methylpropiolate_malononitrile_TosMic,0 905 | 903,malononitrile_cinnamaldehyde_nitromethane,0 906 | 904,benzofuroxan_nitrosobenzene_methylacetoacetate,0 907 | 905,benzofuroxan_nitromethane_propionaldehyde,0 908 | 906,propionaldehyde_nitrosobenzene_TosMic,0 909 | 907,methylpropiolate_benzofuroxan_nitromethane,0 910 | 908,nitromethane_methylacetoacetate,0 911 | 909,benzofuroxan_trichloroacetonitrile_cinnamaldehyde,0 912 | 910,benzofuroxan_benzoylcyanide_TosMic,0 913 | 911,methylpropiolate_nitrosobenzene_TosMic,0 914 | 912,malononitrile_nitromethane_methylacetoacetate,0 915 | 913,dimethylacetylenedicarboxylate_cinnamaldehyde_TosMic,0 916 | 914,cinnamaldehyde_nitromethane_nitrosobenzene,0 917 | 915,malononitrile_TosMic,0 918 | 916,benzofuroxan_trichloroacetonitrile_methylacetoacetate,0 919 | 917,benzofuroxan_nitromethane,0 920 | 918,nitromethane_nitrosobenzene_methylacetoacetate,0 921 | 919,dimethylacetylenedicarboxylate_TosMic_methylacetoacetate,0 922 | 920,trichloroacetonitrile_propionaldehyde_TosMic,0 923 | 921,nitrosobenzene_TosMic,0 924 | 922,malononitrile_benzofuroxan_nitromethane,0 925 | 923,methylpropiolate_trichloroacetonitrile_TosMic,0 926 | 924,malononitrile_nitrosobenzene_TosMic,0 927 | 925,trichloroacetonitrile_cinnamaldehyde_nitromethane,0 928 | 926,benzoylcyanide_nitromethane_TosMic,0 929 | 927,benzofuroxan_nitromethane_nitrosobenzene,0 930 | 928,benzofuroxan_dimethylacetylenedicarboxylate_TosMic,0 931 | 929,trichloroacetonitrile_nitromethane_methylacetoacetate,0 932 | 930,benzofuroxan_cinnamaldehyde_methylacetoacetate,0 933 | 931,trichloroacetonitrile_TosMic,0 934 | 932,cinnamaldehyde_propionaldehyde_TosMic,0 935 | 933,malononitrile_trichloroacetonitrile_TosMic,0 936 | 934,methylpropiolate_cinnamaldehyde_TosMic,0 937 | 935,benzofuroxan_trichloroacetonitrile_nitromethane,0 938 | 936,propionaldehyde_TosMic_methylacetoacetate,0 939 | 937,dimethylacetylenedicarboxylate_nitromethane_TosMic,0 940 | 938,trichloroacetonitrile_nitrosobenzene_TosMic,0 941 | 939,methylpropiolate_TosMic_methylacetoacetate,0 942 | 940,cinnamaldehyde_nitromethane_methylacetoacetate,0 943 | 941,cinnamaldehyde_TosMic,0 944 | 942,malononitrile_cinnamaldehyde_TosMic,0 945 | 943,benzofuroxan_propionaldehyde_TosMic,0 946 | 944,methylpropiolate_benzofuroxan_TosMic,0 947 | 945,TosMic_methylacetoacetate,0 948 | 946,benzofuroxan_cinnamaldehyde_nitromethane,0 949 | 947,malononitrile_TosMic_methylacetoacetate,0 950 | 948,cinnamaldehyde_nitrosobenzene_TosMic,0 951 | 949,benzofuroxan_nitromethane_methylacetoacetate,0 952 | 950,benzofuroxan_TosMic,0 953 | 951,nitrosobenzene_TosMic_methylacetoacetate,0 954 | 952,nitromethane_propionaldehyde_TosMic,0 955 | 953,malononitrile_benzofuroxan_TosMic,0 956 | 954,methylpropiolate_nitromethane_TosMic,0 957 | 955,trichloroacetonitrile_cinnamaldehyde_TosMic,0 958 | 956,benzofuroxan_nitrosobenzene_TosMic,0 959 | 957,trichloroacetonitrile_TosMic_methylacetoacetate,0 960 | 958,nitromethane_TosMic,0 961 | 959,malononitrile_nitromethane_TosMic,0 962 | 960,benzofuroxan_trichloroacetonitrile_TosMic,0 963 | 961,nitromethane_nitrosobenzene_TosMic,0 964 | 962,cinnamaldehyde_TosMic_methylacetoacetate,0 965 | 963,trichloroacetonitrile_nitromethane_TosMic,0 966 | 964,benzofuroxan_cinnamaldehyde_TosMic,0 967 | 965,benzofuroxan_TosMic_methylacetoacetate,0 968 | 966,cinnamaldehyde_nitromethane_TosMic,0 969 | 967,nitromethane_TosMic_methylacetoacetate,0 970 | 968,benzofuroxan_nitromethane_TosMic,0 971 | -------------------------------------------------------------------------------- /example/1H/acqu.par: -------------------------------------------------------------------------------- 1 | 90Amplitude = 0 2 | acqDelay = 20 3 | b1Freq = 43.4352980865543 4 | bandwidth = 5 5 | dwellTime = 200 6 | experiment = "1D" 7 | expName = "1D" 8 | nrPnts = 32768 9 | nrScans = 1 10 | pulseLength = 11.5 11 | repTime = 15000 12 | rxChannel = "1H" 13 | rxGain = 28 14 | totalAcquisitionTime = 15 15 | lowestFrequency = -2293.49650944386 16 | graphTitle = "1D-1H-QuickScan" 17 | graphText = "" 18 | manualPhasePivot = 0 19 | manualPhaseP0 = 0 20 | manualPhaseP1 = 0 21 | -------------------------------------------------------------------------------- /example/1H/data.1d: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/croningp/reaction_learning/927ed4379f6e6db1de1d33f85e851a86f0a01a28/example/1H/data.1d -------------------------------------------------------------------------------- /example/1H/process.par: -------------------------------------------------------------------------------- 1 | Phase0 = -200 2 | Phase1 = 360 3 | -------------------------------------------------------------------------------- /example/1H/spectrum.1d: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/croningp/reaction_learning/927ed4379f6e6db1de1d33f85e851a86f0a01a28/example/1H/spectrum.1d -------------------------------------------------------------------------------- /example/nmr.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "from nmr import NMRSpectrum" 10 | ] 11 | }, 12 | { 13 | "cell_type": "code", 14 | "execution_count": 2, 15 | "metadata": {}, 16 | "outputs": [], 17 | "source": [ 18 | "spectrum = NMRSpectrum('1H')" 19 | ] 20 | }, 21 | { 22 | "cell_type": "code", 23 | "execution_count": 4, 24 | "metadata": {}, 25 | "outputs": [], 26 | "source": [ 27 | "spectrum.fft()" 28 | ] 29 | }, 30 | { 31 | "cell_type": "code", 32 | "execution_count": 6, 33 | "metadata": {}, 34 | "outputs": [], 35 | "source": [ 36 | "spectrum.gen_x_scale()" 37 | ] 38 | }, 39 | { 40 | "cell_type": "code", 41 | "execution_count": 8, 42 | "metadata": {}, 43 | "outputs": [], 44 | "source": [ 45 | "spectrum.phase(30, 0)" 46 | ] 47 | }, 48 | { 49 | "cell_type": "code", 50 | "execution_count": 10, 51 | "metadata": {}, 52 | "outputs": [], 53 | "source": [ 54 | "spectrum.reference(1.96)" 55 | ] 56 | }, 57 | { 58 | "cell_type": "code", 59 | "execution_count": 12, 60 | "metadata": {}, 61 | "outputs": [], 62 | "source": [ 63 | "spectrum.normalize()" 64 | ] 65 | }, 66 | { 67 | "cell_type": "code", 68 | "execution_count": 13, 69 | "metadata": {}, 70 | "outputs": [], 71 | "source": [ 72 | "spectrum.cut(2.5, 12)" 73 | ] 74 | }, 75 | { 76 | "cell_type": "code", 77 | "execution_count": 15, 78 | "metadata": {}, 79 | "outputs": [ 80 | { 81 | "data": { 82 | "image/png": "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\n", 83 | "text/plain": [ 84 | "
" 85 | ] 86 | }, 87 | "metadata": { 88 | "needs_background": "light" 89 | }, 90 | "output_type": "display_data" 91 | } 92 | ], 93 | "source": [ 94 | "spectrum.show()" 95 | ] 96 | } 97 | ], 98 | "metadata": { 99 | "kernelspec": { 100 | "display_name": "Python 3", 101 | "language": "python", 102 | "name": "python3" 103 | }, 104 | "language_info": { 105 | "codemirror_mode": { 106 | "name": "ipython", 107 | "version": 3 108 | }, 109 | "file_extension": ".py", 110 | "mimetype": "text/x-python", 111 | "name": "python", 112 | "nbconvert_exporter": "python", 113 | "pygments_lexer": "ipython3", 114 | "version": "3.6.8" 115 | } 116 | }, 117 | "nbformat": 4, 118 | "nbformat_minor": 2 119 | } 120 | -------------------------------------------------------------------------------- /example/nmr.py: -------------------------------------------------------------------------------- 1 | from os.path import join, isdir 2 | from os import listdir 3 | import os 4 | import struct 5 | import numpy as np 6 | from scipy import sparse, signal 7 | import matplotlib.pyplot as plt 8 | from scipy.optimize import fmin, curve_fit 9 | import socket 10 | import time 11 | import datetime 12 | import shutil 13 | 14 | 15 | def default_processing(s, solvent = 'MeCN'): 16 | s.fft() 17 | s.gen_x_scale() 18 | #s.autophase() 19 | s.phase(30, 0) 20 | if solvent.lower() == 'mecn': 21 | s.reference(1.96) 22 | elif solvent.lower() == 'dmso': 23 | s.reference(2.50) 24 | elif solvent.lower() == "cdcl3": 25 | s.reference(7.26) 26 | elif solvent.lower() == "dioxane": 27 | s.reference(3.60) 28 | elif solvent.lower() == 'methanol': 29 | s.reference(3.34) 30 | s.normalize() 31 | s.cut(2.5, 12) 32 | # 33 | 34 | class NMRSpectrum(): 35 | def __init__(self, path=None, verbose=False, X_scale=[], spectrum=[]): 36 | # self.nmr_dir = nmr_dir 37 | self.verbose = verbose 38 | self.spectrum = spectrum 39 | self.X_scale = X_scale 40 | self.nmr_folder = path 41 | 42 | if path != None: 43 | # read spectrum parameters 44 | spectrum_parameters = open(join(path, 'acqu.par'), 'r') 45 | parameters = spectrum_parameters.readlines() 46 | self.param_dict = {} 47 | for param in parameters: 48 | self.param_dict[param.split('= ')[0].strip(' ')] = \ 49 | param.split('= ')[1].strip('\n') 50 | if self.verbose: 51 | print(self.param_dict) 52 | 53 | # open file with nmr data 54 | spectrum_path = join(path, 'data.1d') 55 | # open binary file with spectrum 56 | nmr_data = open(spectrum_path, mode='rb') 57 | # read first eight bytes 58 | spectrum = [] 59 | # unpack the data 60 | while True: 61 | data = nmr_data.read(4) 62 | if not data: 63 | break 64 | spectrum.append(struct.unpack(' low_ppm and v < high_ppm)] 113 | return np.trapz(peak) 114 | 115 | def gen_x_scale(self): 116 | self.X_scale = [] 117 | for (i, point) in enumerate(self.spectrum): 118 | x = (i * 5000. / self.spectrum_length + 119 | float(self.param_dict['lowestFrequency'])) / \ 120 | float(self.param_dict['b1Freq']) 121 | self.X_scale.append(x) 122 | 123 | def cut(self, low_ppm=5, high_ppm=12): 124 | self.spectrum = [self.spectrum[i] for (i, p) in 125 | enumerate(self.X_scale) if (p > low_ppm) and (p < high_ppm)] 126 | self.X_scale = [i for i in self.X_scale if (i > low_ppm) and (i < high_ppm)] 127 | 128 | def autophase(self): 129 | def entropy(phase): 130 | def penalty_function(Ri): 131 | if Ri >= 0: 132 | return 0 133 | else: 134 | return np.square(Ri) 135 | 136 | phase0_rad = np.pi * phase[0] / 180 137 | phase1_rad = np.pi * phase[1] / 180 138 | real_spectrum = [i.real for i in self.spectrum] 139 | p_real_spectrum = [] 140 | for (i, ri) in enumerate(self.spectrum): 141 | correction = phase0_rad + i * phase1_rad / self.spectrum_length 142 | ci = ri.real * np.cos(correction) - ri.imag * np.sin(correction) 143 | p_real_spectrum.append(ci) 144 | 145 | penalty = 1e-14 * np.sum([penalty_function(i) for i in p_real_spectrum]) 146 | first_derivative = np.gradient(p_real_spectrum) 147 | ssum = np.sum(np.absolute(first_derivative)) 148 | prob = [np.absolute(i) / ssum for i in first_derivative] 149 | entropy = np.sum([-p * np.log(p) for p in prob]) 150 | 151 | # print entropy, penalty 152 | return entropy + penalty 153 | 154 | new_phase = fmin(entropy, [0, 0], ) 155 | self.phase(new_phase[0], new_phase[1]) 156 | 157 | def baseline_als(self, lam, p, niter=10): 158 | self.spectrum = [i.real for i in self.spectrum] 159 | L = len(self.spectrum) 160 | D = sparse.csc_matrix(np.diff(np.eye(L), 2)) 161 | w = np.ones(L) 162 | for i in range(niter): 163 | W = sparse.spdiags(w, 0, L, L) 164 | Z = W + lam * D.dot(D.transpose()) 165 | z = sparse.linalg.spsolve(Z, w * self.spectrum) 166 | w = p * (self.spectrum > z) + (1 - p) * (self.spectrum < z) 167 | self.spectrum = self.spectrum - z 168 | 169 | def smooth(self, lam, p, niter=10): 170 | self.spectrum = [i.real for i in self.spectrum] 171 | L = len(self.spectrum) 172 | D = sparse.csc_matrix(np.diff(np.eye(L), 2)) 173 | w = np.ones(L) 174 | for i in range(niter): 175 | W = sparse.spdiags(w, 0, L, L) 176 | Z = W + lam * D.dot(D.transpose()) 177 | z = sparse.linalg.spsolve(Z, w * self.spectrum) 178 | w = p * (self.spectrum > z) + (1 - p) * (self.spectrum < z) 179 | self.spectrum = z 180 | plt.plot(self.X_scale, self.spectrum) 181 | plt.plot(self.X_scale, z) 182 | plt.show() 183 | self.spectrum = z 184 | 185 | 186 | def find_peaks(self, thresh=0.3, min_dist=0.5): 187 | thresh *= (np.max(self.spectrum) - np.min(self.spectrum)) 188 | smooth = signal.savgol_filter(self.spectrum, 3, 2) 189 | dy = np.diff(smooth) 190 | 191 | peaks = np.where((np.hstack([dy, 0.]) < 0) & 192 | (np.hstack([0., dy]) > 0) & 193 | (self.spectrum > thresh))[0] 194 | 195 | # peaks = signal.find_peaks_cwt(self.spectrum, 196 | # np.arange(70,90), noise_perc = 20) 197 | self.spectrum = np.real(self.spectrum) 198 | 199 | self.peaks = [[self.X_scale[i], self.spectrum[i]] for i in peaks] 200 | # print self.peaks 201 | # remove peaks to close to each other 202 | idx_to_remove = [] 203 | for i, p in enumerate(self.peaks): 204 | if i not in idx_to_remove: 205 | for j in range(i + 1, len(self.peaks)): 206 | if abs(self.peaks[i][0] - self.peaks[j][0]) < min_dist: 207 | if self.peaks[j][1] - self.peaks[i][1] > 0: 208 | if i not in idx_to_remove: 209 | idx_to_remove.append(i) 210 | else: 211 | if j not in idx_to_remove: 212 | idx_to_remove.append(j) 213 | 214 | sorted_peaks = [] 215 | for i, p in enumerate(self.peaks): 216 | if i not in idx_to_remove: 217 | sorted_peaks.append(self.peaks[i]) 218 | self.peaks = sorted_peaks 219 | 220 | # plt.plot(self.X_scale, self.spectrum) 221 | # for p in self.peaks: 222 | # params = self.fit_lorentzian(p[0], p[1]) 223 | # fitted = [self.lorentzian(i, params[0], 224 | # params[1], params[2]) for i in self.X_scale] 225 | # plt.plot(self.X_scale, fitted) 226 | # plt.show() 227 | return self.peaks 228 | 229 | def lorentzian(self, p, p0, ampl, w): 230 | x = (p0 - p) / (w / 2) 231 | return ampl / (1 + x * x) 232 | 233 | def fit_lorentzian(self, x, y): 234 | initial = [x, y, 0.07] 235 | params, pcov = curve_fit(self.lorentzian, self.X_scale, 236 | self.spectrum, initial, maxfev=5000) 237 | return params 238 | 239 | def autointegrate(self, lowb, highb, show=False): 240 | spectrum = self.spectrum[:] 241 | X_scale = self.X_scale[:] 242 | self.cut(lowb, highb) 243 | # self.smooth(1e1, .9) 244 | # find peak having the highest intensity 245 | peak = sorted(self.find_peaks(thresh=0.2), key=lambda x: x[1], reverse=True)[0] 246 | fit_params = self.fit_lorentzian(peak[0], peak[1]) 247 | fitted = [self.lorentzian(i, fit_params[0], fit_params[1], fit_params[2]) for i in self.X_scale] 248 | area = np.trapz(fitted) 249 | # if peak has a half width larger then 0.2 ppm return 0 250 | # fitting process probably failed 251 | if show == True: 252 | plt.plot(self.X_scale, self.spectrum) 253 | plt.plot(self.X_scale, fitted) 254 | plt.show() 255 | 256 | self.spectrum = spectrum[:] 257 | self.X_scale = X_scale[:] 258 | 259 | if fit_params[2] > 0.2: 260 | return 0 261 | else: 262 | return area 263 | 264 | def normalize(self): 265 | self.spectrum = [i.real for i in self.spectrum] 266 | max_intensity = sorted(self.spectrum)[-1] 267 | self.spectrum = [i / max_intensity for i in self.spectrum] 268 | 269 | def __sub__(self, other): 270 | from operator import sub 271 | new_spectrum = map(sub, self.spectrum, other.spectrum) 272 | return nmr_spectrum(X_scale=self.X_scale, spectrum=new_spectrum) 273 | 274 | def __add__(self, other): 275 | from operator import add 276 | new_spectrum = map(add, self.spectrum, other.spectrum) 277 | return nmr_spectrum(X_scale=self.X_scale, spectrum=new_spectrum) 278 | 279 | def __mul__(self, other): 280 | new_spectrum = [i * other for i in self.spectrum] 281 | return nmr_spectrum(X_scale=self.X_scale, spectrum=new_spectrum) 282 | 283 | def __rmul__(self, other): 284 | new_spectrum = [i * other for i in self.spectrum] 285 | return nmr_spectrum(X_scale=self.X_scale, spectrum=new_spectrum) 286 | 287 | def reference(self, solvent_shift): 288 | diff = solvent_shift - self.find_peaks(thresh=0.5)[0][0] 289 | self.X_scale = [i + diff for i in self.X_scale] 290 | 291 | 292 | if __name__ == '__main__': 293 | 294 | spectrum = NMRSpectrum('1H') 295 | default_processing(spectrum) 296 | spectrum.show() 297 | 298 | 299 | -------------------------------------------------------------------------------- /simulations/Simulation_stats.csv: -------------------------------------------------------------------------------- 1 | ,rxn,avg_real_yield,std 2 | 0,288.0,39.60661458333334,27.854962139552416 3 | 1,626.0,87.02860000000001,10.683154872976429 4 | 2,726.0,81.31020000000001,16.037414940070608 5 | 3,826.0,87.28699999999999,8.556007772319985 6 | 4,926.0,82.41760000000001,12.198377688856826 7 | 5,1026.0,81.4778,12.05293346700296 8 | 6,1126.0,77.4585,13.895736135592097 9 | 7,1226.0,80.6767,13.859470556626611 10 | 8,1326.0,73.46039999999999,16.205541454699993 11 | 9,1426.0,68.57669999999999,19.699839799094814 12 | 10,1526.0,72.92039999999999,14.510127630038271 13 | 11,1626.0,67.5724,13.952739596222672 14 | 12,1726.0,63.7173,16.31642092218756 15 | 13,1826.0,64.07829999999998,15.660028675261104 16 | 14,1926.0,59.2571,13.615140417564556 17 | 15,2026.0,55.7856,16.3573321981306 18 | 16,2126.0,58.23969999999999,16.281043729134815 19 | 17,2226.0,53.9891,18.197091146389305 20 | 18,2326.0,55.512,15.69470503067834 21 | 19,2426.0,45.961299999999994,17.60054872184387 22 | 20,2526.0,45.23120000000001,16.70788390431296 23 | 21,2626.0,43.923199999999994,16.954163198459547 24 | 22,2726.0,41.265699999999995,14.151941722251404 25 | 23,2826.0,34.17359999999999,19.862095182532983 26 | 24,2926.0,39.0661,16.867193951277137 27 | 25,3026.0,37.6067,15.13644304683237 28 | 26,3126.0,33.9153,12.603662281654488 29 | 27,3226.0,34.4935,13.342976082943416 30 | 28,3326.0,28.248800000000006,15.748300942006411 31 | 29,3426.0,28.651400000000002,15.429281902927304 32 | 30,3526.0,30.832600000000003,14.365856091441263 33 | 31,3626.0,26.2209,14.518762143860613 34 | 32,3726.0,29.029399999999995,15.12853091479804 35 | 33,3826.0,24.610699999999998,12.701408918305086 36 | 34,3926.0,24.222300000000004,10.747668477860675 37 | 35,4026.0,19.2254,11.784452250316939 38 | 36,4126.0,20.4467,11.155292739771557 39 | 37,4226.0,19.5118,10.56234504075681 40 | 38,4326.0,18.175300000000004,9.58385052627596 41 | 39,4426.0,17.9412,9.636250337138403 42 | 40,4526.0,17.507600000000004,10.351590710610617 43 | 41,4626.0,16.014100000000003,8.827656324869018 44 | 42,4726.0,17.716399999999997,7.6274539028433335 45 | 43,4826.0,14.042799999999998,6.382910163867261 46 | 44,4926.0,16.964000000000002,6.536123774837805 47 | 45,5026.0,13.8178,6.877323837075 48 | 46,5126.0,14.6106,6.108580165635874 49 | 47,5226.0,15.135400000000004,4.4971712042127105 50 | 48,5326.0,11.975599999999996,6.4860439899834175 51 | 49,5426.0,13.4526,4.357129242976389 52 | 50,5526.0,9.412799999999999,5.156700704908129 53 | 51,5626.0,5.2548,6.865767324924433 54 | 52,5710.0,3.2702380952380956,5.8403018872132675 55 | -------------------------------------------------------------------------------- /simulations/__pycache__/nn.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/croningp/reaction_learning/927ed4379f6e6db1de1d33f85e851a86f0a01a28/simulations/__pycache__/nn.cpython-36.pyc -------------------------------------------------------------------------------- /simulations/__pycache__/utils.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/croningp/reaction_learning/927ed4379f6e6db1de1d33f85e851a86f0a01a28/simulations/__pycache__/utils.cpython-36.pyc -------------------------------------------------------------------------------- /simulations/heterocycles.py: -------------------------------------------------------------------------------- 1 | import pandas as pd 2 | import os 3 | import sys 4 | import random 5 | from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA 6 | import numpy as np 7 | import seaborn as sns 8 | import matplotlib.pyplot as plt 9 | from tqdm import tqdm 10 | import seaborn as sns 11 | 12 | # Adjusts plots 13 | sns.set_style('white') 14 | sns.set_context("poster") 15 | sns.set_context("notebook", font_scale=1.0, rc={"lines.linewidth": 2.5}) 16 | plt.figure(figsize=(10,8)) 17 | plt.subplots_adjust( bottom=0.15, right=0.9, top=0.85, left = 0.30, wspace=.4) 18 | 19 | 20 | 21 | def rxn_tovect(rxn, reagents): 22 | '''Function to convert reaction into its vector representation''' 23 | r_vect = [0]*len(reagents) 24 | for r in rxn: 25 | r_vect[reagents.index(r)] = 1 26 | return r_vect 27 | 28 | def vect_to_rxn(vect, reagents): 29 | ''' Function to convert vector representation into reaction ''' 30 | 31 | rxn = [] 32 | for idx, val in enumerate(vect): 33 | if val==1: 34 | rxn.append(reagents[idx]) 35 | 36 | return rxn 37 | 38 | def plot_lda(df): 39 | ''' Plots lda projection of reaction space ''' 40 | 41 | 42 | # set graph formatting 43 | sns.set_style('white') 44 | sns.set_context("poster") 45 | sns.set_context("notebook", font_scale=1.8, rc={"lines.linewidth": 2.5}) 46 | plt.figure(figsize=(10,8)) 47 | plt.subplots_adjust( bottom=0.15, right=0.9, top=0.9, left = 0.15, wspace=.4) 48 | # get variables 49 | X = list(df['X']) 50 | y = list(df['Reactivity']) 51 | clf = LDA() 52 | clf.fit(X, y) 53 | transformed = clf.transform(X) 54 | colors = [] 55 | for i in y: 56 | if i ==0: 57 | colors.append('b') 58 | else: 59 | colors.append('r') 60 | 61 | plt.title('LDA projection of reaction space',)# fontsize=30) 62 | plt.xlabel('LDA score',)# fontsize=25) 63 | plt.ylabel('LDA score')# fontsize=25) 64 | #for idx, t in enumerate(transformed): 65 | # plt.annotate(str(idx), (t,t)) 66 | plt.scatter(transformed, transformed, s=80, c=colors, ) 67 | path = os.path.join(root_path, 'figures', 'lda.pdf') 68 | plt.savefig(path, dpi=300, alpha=0.3) 69 | plt.show() 70 | plt.close() 71 | df['LDA_Reactivity'] = transformed 72 | ldadf = df.sort_values(by=['LDA_Reactivity'], ascending=False) 73 | 74 | 75 | return ldadf 76 | 77 | 78 | class ChemicalSpace(): 79 | ''' An abstract class alowing to simulate exploration of chemical space 80 | using algorhitms''' 81 | 82 | def __init__(self, dataframe, seed=None): 83 | 84 | self.dataframe = dataframe 85 | self.size = len(dataframe) 86 | self.explored_space_indexs = [] 87 | self.index = list(range(self.size)) 88 | # makes things random 89 | random.shuffle(self.index, random=seed) 90 | 91 | def random_guess(self, num_of_rxns): 92 | '''Returns a dataframe with random rxns from chemical space''' 93 | 94 | 95 | random_rxns_idxs = [] 96 | 97 | for idx in self.index: 98 | if idx not in self.explored_space_indexs: 99 | self.explored_space_indexs.append(idx) 100 | random_rxns_idxs.append(idx) 101 | 102 | if len(random_rxns_idxs) == num_of_rxns: 103 | break 104 | random_df = self.dataframe.loc[random_rxns_idxs] 105 | 106 | return random_df 107 | 108 | def get_unused(self): 109 | ''' Return a dataframe of all reactions which has not been explored so far''' 110 | 111 | unused_rxn_idxs = [] 112 | for idx in self.index: 113 | if idx not in self.explored_space_indexs: 114 | unused_rxn_idxs.append(idx) 115 | 116 | unused_rxns = self.dataframe.loc[unused_rxn_idxs] 117 | return unused_rxns 118 | 119 | def get_explored(self): 120 | ''' Return a dataframe with indexes of reactions which have been chosen''' 121 | 122 | return self.dataframe.loc[self.explored_space_indexs] 123 | 124 | def update_explored_rxns(self, rxn_idxs): 125 | ''' Add rxn_idxs to the list of explored reactions''' 126 | self.explored_space_indexs += rxn_idxs 127 | 128 | def is_empty(self): 129 | ''' Return True if the whole chemical space has been explored''' 130 | if len(self.explored_space_indexs) == self.size: 131 | return True 132 | else: 133 | return False 134 | 135 | def percent_explored(self): 136 | ''' Return the percent of exploration of chemical space''' 137 | return len(self.explored_space_indexs)/self.size 138 | 139 | 140 | class Simulation(): 141 | ''' A class simulating exploration of chemical space using machine learning''' 142 | 143 | def __init__(self, dataframe, clf): 144 | self.dataframe = dataframe 145 | self.clf = clf 146 | 147 | def single_run(self, random_guess=0.1): 148 | 149 | chemspace = ChemicalSpace(self.dataframe) 150 | clf = self.clf() 151 | num_random_rxns = int(chemspace.size * random_guess) 152 | 153 | time_step = [] 154 | num_reactive = [] 155 | num_unreactive = [] 156 | accuracy = [] 157 | 158 | # random exploration of chemical space 159 | for r in range(num_random_rxns): 160 | chemspace.random_guess(1) 161 | 162 | data = chemspace.get_explored() 163 | time_step.append(chemspace.percent_explored()*100) 164 | 165 | 166 | 167 | num_reactive.append(sum(data['Reactivity'])) 168 | num_unreactive.append(len(data) - sum(data['Reactivity'])) 169 | 170 | 171 | unexplored_rxns = chemspace.get_unused() 172 | reactvity_random_guess = np.random.randint(2, size=len(unexplored_rxns)) 173 | 174 | accuracy_ = 100*np.sum(np.equal(unexplored_rxns['Reactivity'], 175 | reactvity_random_guess)) / len(unexplored_rxns) 176 | accuracy.append(accuracy_) 177 | # Machine learning part 178 | for i in range(chemspace.size-num_random_rxns): 179 | 180 | # Get all reaction selected so fat 181 | explored_rxns = chemspace.get_explored() 182 | # Train machine learning model 183 | clf.fit(list(explored_rxns['X']), 184 | list(explored_rxns['Reactivity'])) 185 | 186 | # Get unexplored reactions 187 | unexplored_rxns = chemspace.get_unused() 188 | # Score them using ML 189 | scores = clf.predict_proba(list(unexplored_rxns['X'])) 190 | # Add scores of being reactive to dataframe 191 | # and sort it by probabilty 192 | unexplored_rxns['Reaction_proba'] = scores[:,1] 193 | 194 | sorted_rxns = unexplored_rxns.sort_values(by=['Reaction_proba'], 195 | ascending=False) 196 | 197 | # Get results with highest proba 198 | candiate_rxn = sorted_rxns.head(1) 199 | #print (candiate_rxn['Reaction'], candiate_rxn['Reaction_proba']) 200 | #print (list(candiate_rxn.index)) 201 | # Get its index 202 | candidate_idx = list(candiate_rxn.index) 203 | 204 | chemspace.update_explored_rxns(candidate_idx) 205 | 206 | # update statistics 207 | if not chemspace.is_empty(): 208 | explored_rxsn = chemspace.get_explored() 209 | 210 | time_step.append(chemspace.percent_explored()*100) 211 | num_reactive.append(sum(explored_rxsn['Reactivity'])) 212 | num_unreactive.append(len(explored_rxsn) - sum(explored_rxsn['Reactivity'])) 213 | 214 | clf.fit(list(explored_rxsn['X']), list(explored_rxsn['Reactivity'])) 215 | unexplored_rxns = chemspace.get_unused() 216 | predictions = clf.predict(list(unexplored_rxns['X'])) 217 | 218 | accuracy_ = np.mean(np.equal(predictions, list(unexplored_rxns['Reactivity']))) *100 219 | accuracy.append(accuracy_) 220 | 221 | return time_step, num_unreactive, num_reactive, accuracy 222 | 223 | def run(self, random_guess=0.1, num_iter=3): 224 | ''' Perform simulation exploring chemical space num_iter''' 225 | 226 | # Statistics 227 | time_step = [] 228 | num_unreactive = [] 229 | num_reactive = [] 230 | accuracy = [] 231 | 232 | for i in tqdm(range(num_iter)): 233 | 234 | i_time_step, i_num_unreactive, i_num_reactive, i_accuracy =\ 235 | self.single_run(random_guess=random_guess) 236 | 237 | 238 | time_step.append(i_time_step) 239 | num_unreactive.append(i_num_unreactive) 240 | num_reactive.append(i_num_reactive) 241 | accuracy.append(i_accuracy) 242 | 243 | min_accuracy = np.min(accuracy, axis=0) 244 | max_accuracy = np.max(accuracy, axis=0) 245 | mean_accuracy = np.mean(accuracy,axis=0) 246 | 247 | 248 | 249 | # random statistics 250 | r_time_step = [] 251 | r_num_unreactive = [] 252 | r_num_reactive = [] 253 | r_accuracy = [] 254 | 255 | # Perform simulation wiht random guess 256 | for i in tqdm(range(num_iter)): 257 | # randomly keep guessing the whole space 258 | i_time_step, i_num_unreactive, i_num_reactive, i_accuracy =\ 259 | self.single_run(random_guess=1.0) 260 | 261 | 262 | r_time_step.append(i_time_step) 263 | r_num_unreactive.append(i_num_unreactive) 264 | r_num_reactive.append(i_num_reactive) 265 | r_accuracy.append(i_accuracy) 266 | 267 | r_min_accuracy = np.min(r_accuracy, axis=0) 268 | r_max_accuracy = np.max(r_accuracy, axis=0) 269 | r_mean_accuracy = np.mean(r_accuracy, axis=0) 270 | 271 | 272 | 273 | plt.plot(time_step[0], mean_accuracy, color='red') 274 | plt.fill_between(time_step[0], max_accuracy, min_accuracy, alpha=0.25, color='red') 275 | plt.plot(r_time_step[0], r_mean_accuracy, color='blue') 276 | plt.fill_between(r_time_step[0], r_max_accuracy, r_min_accuracy, alpha=0.25, color='blue') 277 | plt.xlabel('% of space explored')#, fontsize=16) 278 | plt.xlim(0, 110) 279 | plt.ylabel('prediction accuracy [%]')# fontsize=16) 280 | plt.ylim(40, 105) 281 | plt.title('Reactvity prediction accuracy for\n unexplored reaction space')#, fontsize=17) 282 | #plt.legend(loc = 2)# fontsize=17) 283 | 284 | path = os.path.join(root_path, 'figures', 'accuracy.pdf') 285 | plt.savefig(path) 286 | plt.show() 287 | plt.close() 288 | 289 | # Prepeare bar graph comparing reactive and unreactive 290 | avg_num_unreactive = np.mean(num_unreactive, axis=0) 291 | avg_num_reactive = np.mean(num_reactive, axis=0) 292 | 293 | 294 | num_idxs = len(time_step[0]) 295 | idxs = [] 296 | for i in range(1,11): 297 | fraction = float(i)/10 298 | idx = int(num_idxs*fraction)-1 299 | idxs.append(idx) 300 | width = [9 for i in range(len(idxs))] 301 | 302 | bar_space = [time_step[0][i]-5 for i in idxs] 303 | bar_reactive = [avg_num_reactive[i] for i in idxs] 304 | bar_unreactive = [avg_num_unreactive[i] for i in idxs] 305 | scale = [1,2] 306 | 307 | plt.xlabel('% of space explored') 308 | plt.ylabel('total number of mixtures') 309 | plt.title('Statistics of Reactivity') 310 | plt.xlim(0,105) 311 | plt.xticks([10, 20, 30, 40, 50, 60, 70, 80, 90, 100]) 312 | plt.ylim(0, 1000) 313 | p1 = plt.bar(bar_space, bar_unreactive, color = 'b', width=width) 314 | p2 = plt.bar(bar_space, bar_reactive, bottom=bar_unreactive, width=width, color='r') 315 | plt.legend((p1[0], p2[0]), ('Unreactive', 'Reactive'), loc='upper left') 316 | plt.show() 317 | path = os.path.join(root_path, 'figures', 'reactvity_stats.pdf') 318 | plt.savefig(path) 319 | plt.close() 320 | 321 | # 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | HERE_PATH = os.path.dirname(__file__) 330 | root_path = os.path.join(HERE_PATH, '..') 331 | sys.path.append(root_path) 332 | 333 | # open the data as pandas data frame 334 | data_path = os.path.join(root_path, 'data//heterocycles.csv') 335 | dataframe = pd.DataFrame.from_csv(data_path) 336 | 337 | # get unique chemicals 338 | allrxns = [rxn.split('_') for rxn in list(dataframe['Reaction'])] 339 | reagents = list(set([item for sublist in allrxns for item in sublist])) 340 | # Number of chemicals in chemical space 341 | space_len = len(reagents) 342 | 343 | X = [rxn_tovect(rxn, reagents) for rxn in allrxns ] 344 | dataframe['X'] = X 345 | 346 | #chemcial_space = ChemicalSpace(dataframe) 347 | s = Simulation(dataframe, LDA) 348 | t = s.run() -------------------------------------------------------------------------------- /simulations/nn.py: -------------------------------------------------------------------------------- 1 | import tensorflow as tf 2 | import numpy as np 3 | from tqdm import tqdm 4 | import time 5 | import matplotlib.pyplot as plt 6 | import os 7 | import sys 8 | 9 | HERE_PATH = os.path.dirname(__file__) 10 | root_path = os.path.join(HERE_PATH, '..') 11 | sys.path.append(root_path) 12 | 13 | class NeuralRegressor(): 14 | def __init__(self): 15 | self.build_model() 16 | self.checkpoint_path = os.path.join(root_path, 'checkpoints', 'network') 17 | NUM_THREADS = 4 18 | self.config=tf.ConfigProto(intra_op_parallelism_threads=NUM_THREADS) 19 | self.session = tf.Session(config=self.config) 20 | 21 | def build_model(self): 22 | tf.reset_default_graph() 23 | 24 | # build computation graph 25 | # data placeholders 26 | self.X= tf.placeholder(tf.float32, shape=[None, 37], name='X') 27 | self.Y= tf.placeholder(tf.float32, shape=[None, 1], name='Y') 28 | self.keep_prob = tf.placeholder(tf.float32) 29 | 30 | # layer 1 31 | W_init = tf.truncated_normal(shape=[37, 50], stddev=0.01,mean=0.0, name='W_init') 32 | W = tf.Variable(W_init, dtype=tf.float32, name='W') 33 | bias_init = tf.zeros([50], dtype=tf.float32) 34 | bias = tf.Variable(bias_init, dtype=tf.float32) 35 | layer_1 = tf.nn.dropout(tf.sigmoid(tf.matmul(self.X, W) + bias), 36 | keep_prob=self.keep_prob) 37 | 38 | # layer 2 39 | W2_init = tf.random_normal(shape=[50, 7], stddev=0.01, name='W2_init') 40 | W2 = tf.Variable(W2_init, dtype=tf.float32, name='W2') 41 | bias2_init = tf.zeros([7], dtype=tf.float32) 42 | bias2 = tf.Variable(bias2_init, dtype=tf.float32) 43 | layer2 = tf.nn.sigmoid(tf.matmul(layer_1, W2) + bias2) 44 | 45 | #layer 3 and linear regression 46 | W3_init = tf.random_normal(shape=[7, 1], stddev=0.01, name='W3_init') 47 | W3 = tf.Variable(W3_init, dtype=tf.float32, name='W3') 48 | bias3_init = tf.zeros([1], dtype=tf.float32) 49 | bias3 = tf.Variable(bias3_init, dtype=tf.float32) 50 | self.y_pred = (tf.matmul(layer2,W3) + bias3) 51 | # loss function 52 | self.loss = tf.reduce_mean(tf.square(self.Y- self.y_pred)) 53 | # optimizer 54 | self.step = tf.train.AdamOptimizer(learning_rate=.005).minimize(self.loss) 55 | 56 | def reset(self): 57 | init = tf.global_variables_initializer() 58 | self.session.run(init) 59 | 60 | 61 | def train_model(self, train, validation): 62 | 63 | batch_size = 100 64 | epochs = 300 65 | 66 | saver = tf.train.Saver() 67 | iterations_per_epoch = len(train.X) // batch_size 68 | best_loss = np.infty 69 | self.epoch = [] 70 | self.training_loss = [] 71 | self.validation_loss = [] 72 | 73 | 74 | self.session.run(tf.global_variables_initializer()) 75 | for epcoch in tqdm(range(epochs)): 76 | self.epoch.append(epcoch) 77 | for i in range(iterations_per_epoch): 78 | train_losses =[] 79 | batchx, batchy = train.next_batch(batch_size) 80 | batchy = batchy.reshape(-1, 1) 81 | 82 | _, batch_loss = self.session.run([self.step, self.loss], 83 | feed_dict = {self.X:batchx, self.Y:batchy, self.keep_prob:0.8}) 84 | train_losses.append(batch_loss) 85 | 86 | self.training_loss.append(np.mean(train_losses)) 87 | 88 | yp, val_loss = self.session.run([self.y_pred, self.loss], 89 | feed_dict={self.X:validation.X, 90 | self.Y:validation.Y.reshape(-1, 1), 91 | self.keep_prob:1.0}) 92 | self.validation_loss.append(val_loss) 93 | 94 | 95 | if val_loss< best_loss and epcoch%20==0: 96 | print('New best validation loss {}'.format(val_loss)) 97 | best_loss = val_loss 98 | saver.save(self.session, self.checkpoint_path) 99 | time.sleep(0.1) 100 | 101 | saver.restore(self.session, self.checkpoint_path) 102 | 103 | print ('Finised with validation loss {}'.format(val_loss)) 104 | print ('Best validation loss {}'.format(best_loss)) 105 | 106 | def test_model(self, test): 107 | 108 | yp, test_loss = self.session.run([self.y_pred, self.loss], 109 | feed_dict={self.X:test.X, 110 | self.Y:test.Y.reshape(-1, 1), 111 | self.keep_prob:1.0}) 112 | 113 | print ('Test Loss (MSE) {}'.format(test_loss)) 114 | print ('Test RMSE {}'.format(np.sqrt(test_loss))) 115 | 116 | plt.scatter(test.Y, yp, alpha=0.3, c='g') 117 | plt.title('Prediction of yield from test set') 118 | plt.xlabel('True Yield') 119 | plt.ylabel('Predicted Yield') 120 | plt.show() 121 | path = os.path.join(root_path,'figures', 'Testset.pdf') 122 | plt.savefig(path) 123 | plt.close() 124 | 125 | return yp, test_loss 126 | 127 | 128 | def predict(self, data): 129 | 130 | 131 | 132 | yp, loss = self.session.run([self.y_pred, self.loss], 133 | feed_dict={self.X:data.X, 134 | self.Y:data.Y.reshape(-1, 1), 135 | self.keep_prob:1.0}) 136 | 137 | print ('Prediction Mean Squared Error Loss = {}'.format(loss)) 138 | print ('Prediction Standard Deviation = {}'.format(np.std(yp))) 139 | 140 | return yp, loss 141 | 142 | def training_stats(self): 143 | plt.plot(self.epoch, self.training_loss, c='b', label='Training loss') 144 | plt.plot(self.epoch, self.validation_loss, c='g', label='Talidations loss') 145 | plt.title('Training of NN') 146 | plt.xlabel('Training epoch') 147 | plt.ylabel('Loss') 148 | plt.legend() 149 | plt.show() 150 | plt.savefig('Training.pdf') 151 | 152 | -------------------------------------------------------------------------------- /simulations/suzuki_miyaura.py: -------------------------------------------------------------------------------- 1 | import pandas as pd 2 | import os 3 | import sys 4 | import random 5 | import numpy as np 6 | 7 | from utils import train_validation_test_split, DataManager 8 | from nn import NeuralRegressor 9 | 10 | 11 | HERE_PATH = os.path.dirname(__file__) 12 | root_path = os.path.join(HERE_PATH, '..') 13 | sys.path.append(root_path) 14 | 15 | data_path = os.path.join(root_path, 'data//aap9112_Data_File_S1.csv') 16 | dataframe = pd.DataFrame.from_csv(data_path) 17 | 18 | # fields for one-hot encoding 19 | data_fields = ['Reactant_1_Name', 'Reactant_2_Name', 'Ligand_Short_Hand', 20 | 'Reagent_1_Short_Hand', 'Solvent_1_Short_Hand'] 21 | # get uniqe names for each field 22 | unique_fields_list = [list(set(dataframe[field])) for field in data_fields] 23 | 24 | 25 | class ChemicalSpace(): 26 | ''' Abstract class of chemical space for simulating navigation of 27 | reaction space using machine learning''' 28 | def __init__(self, df, seed=None): 29 | # seed for reproduciibity 30 | random.seed(seed) 31 | self.df = df 32 | self.index = list(dataframe.index) 33 | self.explored_space_index = [] 34 | self.space_len = len(self.index) 35 | # randomize the indexes 36 | random.shuffle(self.index) 37 | 38 | 39 | 40 | def random_guess(self, percent): 41 | '''Returns the dataframe with random rxns from chemical space''' 42 | 43 | num_of_rxns = int(self.space_len * percent) 44 | 45 | random_rxns_idxs = [] 46 | 47 | for idx in self.index: 48 | if idx not in self.explored_space_index: 49 | self.explored_space_index.append(idx) 50 | random_rxns_idxs.append(idx) 51 | if len(random_rxns_idxs) == num_of_rxns: 52 | break 53 | random_df = self.df.loc[random_rxns_idxs] 54 | return random_df 55 | 56 | 57 | 58 | 59 | def get_unused(self): 60 | ''' Return a dataframe of all reactions which has not been explored so far''' 61 | 62 | unused_rxn_idxs = [] 63 | 64 | for idx in self.index: 65 | if idx not in self.explored_space_index: 66 | unused_rxn_idxs.append(idx) 67 | 68 | unused_rxns = self.df.loc[unused_rxn_idxs] 69 | return unused_rxns 70 | 71 | def get_explored(self): 72 | ''' Return a dataframe with indexes of reactions which have been chosen''' 73 | 74 | return self.df.loc[self.explored_space_index] 75 | 76 | def update_explored_rxns(self, rxn_idxs): 77 | ''' Add rxn_idxs to the list of explored reactions''' 78 | self.explored_space_index += rxn_idxs 79 | 80 | def is_empty(self): 81 | ''' Return True if the whole chemical space has been explored''' 82 | if len(self.explored_space_index) == self.space_len: 83 | return True 84 | else: 85 | return False 86 | 87 | def percent_explored(self): 88 | ''' Return the percent of exploration of chemical space''' 89 | return len(self.explored_space_index)/self.space_len 90 | 91 | 92 | class Simulation(): 93 | def __init__(self, data): 94 | self.data = data 95 | self.chemspace = ChemicalSpace(data, seed=555) 96 | self.random_percent = 0.1 97 | 98 | def explore_space(self): 99 | # defines the batch size for exploration of chemical space 100 | screen_size = 100 101 | neural_regressor = NeuralRegressor() 102 | # randomly guess select 10 % of chemical space 103 | random_guess = self.chemspace.random_guess(self.random_percent) 104 | 105 | # keep statistics for plotting 106 | rxn = [0.5 * len(random_guess)] 107 | width = [0.95*len(random_guess)] 108 | 109 | # Evaluate average yield of selected reactions 110 | avg_real_yield = [np.mean(random_guess['Product_Yield_PCT_Area_UV'])] 111 | # Evaluate standard deviation 112 | stds = [np.std(random_guess['Product_Yield_PCT_Area_UV'])] 113 | prediction_loss = [] 114 | 115 | 116 | iteration = 0 117 | while not self.chemspace.is_empty(): 118 | # Add data to plot 119 | if iteration == 0: 120 | rxn.append(2*rxn[-1]+0.5 *screen_size) 121 | else: 122 | if len(self.chemspace.get_unused()) < screen_size: 123 | screen_size = len(self.chemspace.get_unused()) 124 | rxn.append(rxn[-1]+screen_size) 125 | 126 | width.append(0.95*screen_size) 127 | 128 | 129 | # split data into training and validation set for reactions explored so far 130 | train, validation, _ = train_validation_test_split(self.chemspace.get_explored(), 131 | train_size=0.8, 132 | validation_size=0.2, 133 | seed=123) 134 | # train the neural network on this data 135 | neural_regressor.train_model(DataManager(train, data_fields, unique_fields_list), 136 | DataManager(validation, data_fields, unique_fields_list)) 137 | 138 | # Get a dataframe with all reaction which han't been performed 139 | unseen = self.chemspace.get_unused() 140 | # Make make predictions for them and evaluate loss 141 | yp, loss = neural_regressor.predict(DataManager(unseen, data_fields, unique_fields_list)) 142 | # collect data for statistics 143 | prediction_loss.append(loss) 144 | # Add predcited yields to the dataframe 145 | unseen['Predicted yield'] = yp 146 | # Sort the dataframe by predicted yield 147 | sorted_by_prediction = unseen.sort_values(by=['Predicted yield'], 148 | ascending=False) 149 | # Get a dataframe with best candidates from prediction 150 | best_results = sorted_by_prediction.head(screen_size) 151 | # Get idxs of best candidates 152 | best_results_idxs = list(best_results.index) 153 | # Evaluate real yiled of selected batch of reactions 154 | avg_real_yield.append(np.mean(best_results['Product_Yield_PCT_Area_UV'])) 155 | print ('Selected average yield', np.mean(best_results['Product_Yield_PCT_Area_UV'])) 156 | # Calcuate and print the standard deviation for current batch of reactions 157 | stds.append(np.std(best_results['Product_Yield_PCT_Area_UV'])) 158 | print ('Selected yield std', np.std(best_results['Product_Yield_PCT_Area_UV'])) 159 | # Add the current batch of reactions to explored reactions so in 160 | # the next iteration neural network can be trained on updated data 161 | self.chemspace.update_explored_rxns(best_results_idxs) 162 | iteration += 1 163 | # Print some statistics 164 | print ('Iteration {}'.format(iteration)) 165 | print ('Percent explored {:.2f}'.format(self.chemspace.percent_explored()*100)) 166 | 167 | #plt.plot(rxn, avg_real_yield) 168 | #plt.show() 169 | 170 | # Create a plot with MSE values during exploration of chemical space 171 | plt.xlabel('Reaction') 172 | plt.ylabel('Mean squared error') 173 | plt.title('Mean squared error for prediction of new reactivity') 174 | plt.plot(rxn[1:], prediction_loss) 175 | plt.show() 176 | 177 | # Create a data frame 178 | stat_dataframe = pd.DataFrame() 179 | stat_dataframe['rxn'] = rxn 180 | stat_dataframe['avg_real_yield'] = avg_real_yield 181 | stat_dataframe['std'] = stds 182 | stat_dataframe.to_csv('Simulation_stats.csv') 183 | 184 | # Create histogram 185 | colors = ['g' for i in rxn] 186 | colors[0] = 'orange' 187 | plt.bar(rxn, avg_real_yield, yerr=stds, width=width, color=colors, ) 188 | plt.title('Average yield per batch for Pd coupling') 189 | plt.xlabel('Reaction Number') 190 | plt.ylabel('Average Yield [%]') 191 | 192 | plt.show() 193 | 194 | #return unseen, best_results_idxs 195 | 196 | 197 | 198 | def test_regressor(self): 199 | '''Perform split of the data into training, validation, and test set 200 | and then trains neural network using training and validation sets 201 | Evaluates performance of the neural network using test set''' 202 | 203 | train_set, validation_set, test_set = train_validation_test_split(self.data, 204 | train_size=0.6, validation_size=0.1, 205 | seed=555) 206 | train = DataManager(train_set, data_fields, unique_fields_list) 207 | validation = DataManager(validation_set, data_fields, unique_fields_list) 208 | test = DataManager(test_set, data_fields, unique_fields_list) 209 | 210 | neural_regressor = NeuralRegressor() 211 | neural_regressor.train_model(train, validation) 212 | yp, loss = neural_regressor.test_model(test) 213 | mse = np.mean(np.square(yp.reshape([-1])-test.Y)) 214 | mse = np.mean(np.square(yp.reshape([-1])-test.Y)) 215 | print('MSE {}'.format(mse)) 216 | print('RMSE {}'.format(np.sqrt(mse))) 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | simulation = Simulation(dataframe) 234 | 235 | 236 | #training_data, validation_data, test_data = train_validation_test_split(dataframe) 237 | # 238 | #training = DataManager(training_data, data_fields, unique_fields_list) 239 | #validation = DataManager(validation_data, data_fields, unique_fields_list) 240 | #test = DataManager(test_data, data_fields, unique_fields_list) 241 | # 242 | # 243 | #regressor = NeuralRegressor() 244 | #regressor.train_model(training, validation) 245 | #regressor.test_model(test) 246 | 247 | 248 | 249 | 250 | -------------------------------------------------------------------------------- /simulations/utils.py: -------------------------------------------------------------------------------- 1 | import random 2 | import numpy as np 3 | 4 | def train_validation_test_split(df, train_size=0.6, 5 | validation_size=.1, seed=None): 6 | """ Split data into train, validation, and test set """ 7 | 8 | random.seed(seed) 9 | index = list(df.index) 10 | random.shuffle(index) 11 | #print(index[0:10]) 12 | df = df.loc[index] 13 | df = df.reset_index() 14 | data_len = len(index) 15 | train_idx = int(data_len*train_size) 16 | validation_idx = int(data_len*validation_size) + train_idx 17 | #print (train_idx,validation_idx) 18 | train_data_set = df.loc[range(train_idx)] 19 | validation_set = df.loc[range(train_idx,validation_idx)] 20 | test_set = df.loc[range(validation_idx, data_len)] 21 | 22 | return train_data_set, validation_set, test_set 23 | 24 | 25 | class DataManager(): 26 | ''' A class for one-hot encoding of the data and generating batches 27 | for tensorflow''' 28 | 29 | def __init__(self, df, data_fields, unique_fields_list): 30 | self.df = df 31 | self.X = self.encode(self.df, data_fields, unique_fields_list) 32 | self.Y = self.df['Product_Yield_PCT_Area_UV'].as_matrix() 33 | # create numpy array and scale to range 0.0 to 1.0 34 | self.Y = np.array(self.Y) / 100 35 | self.curr_idx= 0 36 | 37 | 38 | 39 | def next_batch(self, batch_size): 40 | x = self.X[self.curr_idx: self.curr_idx+batch_size] 41 | y = self.Y[self.curr_idx: self.curr_idx+batch_size] 42 | 43 | self.curr_idx = (self.curr_idx + batch_size) % len(self.X) 44 | if x.shape[1] !=37: 45 | raise ValueError("Wrong shape") 46 | return x, y 47 | 48 | def encode(self, df, data_fields, unique_fields_list): 49 | def one_hot_encode(data, labels): 50 | #print (labels) 51 | #print (data[0:10]) 52 | n = len(data) 53 | n_labels = len(labels) 54 | idxs = [labels.index(l) for l in data] 55 | one_hot_encoded = np.zeros([n, n_labels]) 56 | one_hot_encoded[range(n), idxs] = 1 57 | return one_hot_encoded 58 | 59 | X = [df[field].as_matrix() for field in data_fields] 60 | X_one_hot = list(map(one_hot_encode, X, unique_fields_list)) 61 | return np.concatenate(X_one_hot, axis=1) --------------------------------------------------------------------------------